X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fimpl%2Fleafref%2FLeafRefContextTreeBuilder.java;h=75151eb968f63f04b497446f697a534feb4265c4;hb=20df7021c844ccf06d1378f615c2988fff60edee;hp=be38b2b0ff31ef9abd5fe9804b4c4a9e24cf2229;hpb=6b5d20f6513bc3e6e5db4a2058ee81308edaa9c8;p=yangtools.git diff --git a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java index be38b2b0ff..75151eb968 100644 --- a/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java +++ b/yang/yang-data-impl/src/main/java/org/opendaylight/yangtools/yang/data/impl/leafref/LeafRefContextTreeBuilder.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,14 +7,13 @@ */ package org.opendaylight.yangtools.yang.data.impl.leafref; -import java.io.ByteArrayInputStream; -import java.io.IOException; -import java.nio.charset.StandardCharsets; +import static com.google.common.base.Preconditions.checkNotNull; + import java.util.Collection; import java.util.LinkedList; import java.util.List; import java.util.Set; -import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; +import org.opendaylight.yangtools.yang.model.api.CaseSchemaNode; import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; @@ -23,34 +22,27 @@ import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.SchemaContext; import org.opendaylight.yangtools.yang.model.api.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.TypedDataSchemaNode; import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; -class LeafRefContextTreeBuilder { +final class LeafRefContextTreeBuilder { + private final List leafRefs = new LinkedList<>(); private final SchemaContext schemaContext; - private final List leafRefs; - public LeafRefContextTreeBuilder(final SchemaContext schemaContext) { + LeafRefContextTreeBuilder(final SchemaContext schemaContext) { this.schemaContext = schemaContext; - this.leafRefs = new LinkedList<>(); } - public LeafRefContext buildLeafRefContextTree() throws IOException, - LeafRefYangSyntaxErrorException { - final LeafRefContextBuilder rootBuilder = new LeafRefContextBuilder( - schemaContext.getQName(), schemaContext.getPath(), - schemaContext); + LeafRefContext buildLeafRefContextTree() throws LeafRefYangSyntaxErrorException { + final LeafRefContextBuilder rootBuilder = new LeafRefContextBuilder(schemaContext.getQName(), + schemaContext.getPath(), schemaContext); final Set modules = schemaContext.getModules(); for (final Module module : modules) { - final Collection childNodes = module.getChildNodes(); - for (final DataSchemaNode childNode : childNodes) { - final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree( - childNode, module); - - if (childLeafRefContext.hasReferencingChild() - || childLeafRefContext.isReferencing()) { - rootBuilder.addReferencingChild(childLeafRefContext, - childLeafRefContext.getNodeName()); + for (final DataSchemaNode childNode : module.getChildNodes()) { + final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(childNode, module); + if (childLeafRefContext.hasReferencingChild() || childLeafRefContext.isReferencing()) { + rootBuilder.addReferencingChild(childLeafRefContext, childLeafRefContext.getNodeName()); } } } @@ -58,13 +50,10 @@ class LeafRefContextTreeBuilder { for (final Module module : modules) { final Collection childNodes = module.getChildNodes(); for (final DataSchemaNode childNode : childNodes) { - final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree( - childNode, module); + final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree(childNode, module); - if (childLeafRefContext.hasReferencedChild() - || childLeafRefContext.isReferenced()) { - rootBuilder.addReferencedByChild(childLeafRefContext, - childLeafRefContext.getNodeName()); + if (childLeafRefContext.hasReferencedChild() || childLeafRefContext.isReferenced()) { + rootBuilder.addReferencedByChild(childLeafRefContext, childLeafRefContext.getNodeName()); } } } @@ -75,72 +64,43 @@ class LeafRefContextTreeBuilder { return rootBuilder.build(); } - private LeafRefContext buildLeafRefContextReferencingTree( - final DataSchemaNode node, final Module currentModule) throws IOException, - LeafRefYangSyntaxErrorException { - - final LeafRefContextBuilder currentLeafRefContextBuilder = new LeafRefContextBuilder( - node.getQName(), node.getPath(), schemaContext); + private LeafRefContext buildLeafRefContextReferencingTree(final DataSchemaNode node, final Module currentModule) + throws LeafRefYangSyntaxErrorException { + final LeafRefContextBuilder currentLeafRefContextBuilder = new LeafRefContextBuilder(node.getQName(), + node.getPath(), schemaContext); if (node instanceof DataNodeContainer) { - final DataNodeContainer dataNodeContainer = (DataNodeContainer) node; - final Collection childNodes = dataNodeContainer - .getChildNodes(); - - for (final DataSchemaNode childNode : childNodes) { - final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree( - childNode, currentModule); - - if (childLeafRefContext.hasReferencingChild() - || childLeafRefContext.isReferencing()) { - currentLeafRefContextBuilder.addReferencingChild( - childLeafRefContext, - childLeafRefContext.getNodeName()); + for (final DataSchemaNode childNode : ((DataNodeContainer) node).getChildNodes()) { + final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(childNode, currentModule); + if (childLeafRefContext.hasReferencingChild() || childLeafRefContext.isReferencing()) { + currentLeafRefContextBuilder.addReferencingChild(childLeafRefContext, + childLeafRefContext.getNodeName()); } } } else if (node instanceof ChoiceSchemaNode) { - - final ChoiceSchemaNode choice = (ChoiceSchemaNode) node; - final Set cases = choice.getCases(); // :FIXME choice without case - - for (final ChoiceCaseNode caseNode : cases) { - final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree( - caseNode, currentModule); - - if (childLeafRefContext.hasReferencingChild() - || childLeafRefContext.isReferencing()) { - currentLeafRefContextBuilder.addReferencingChild( - childLeafRefContext, - childLeafRefContext.getNodeName()); + for (final CaseSchemaNode caseNode : ((ChoiceSchemaNode) node).getCases().values()) { + final LeafRefContext childLeafRefContext = buildLeafRefContextReferencingTree(caseNode, currentModule); + if (childLeafRefContext.hasReferencingChild() || childLeafRefContext.isReferencing()) { + currentLeafRefContextBuilder.addReferencingChild(childLeafRefContext, + childLeafRefContext.getNodeName()); } } - } else if (node instanceof LeafSchemaNode - || node instanceof LeafListSchemaNode) { - - TypeDefinition type = null; - - if (node instanceof LeafSchemaNode) { - type = ((LeafSchemaNode) node).getType(); - } else { - type = ((LeafListSchemaNode) node).getType(); - } + } else if (node instanceof TypedDataSchemaNode) { + final TypeDefinition type = ((TypedDataSchemaNode) node).getType(); // FIXME: fix case when type is e.g. typedef -> typedef -> leafref if (type instanceof LeafrefTypeDefinition) { final LeafrefTypeDefinition leafrefType = (LeafrefTypeDefinition) type; final String leafRefPathString = leafrefType.getPathStatement().toString(); + final LeafRefPathParserImpl leafRefPathParser = new LeafRefPathParserImpl(schemaContext, + checkNotNull(getBaseTypeModule(leafrefType), "Unable to find base module for leafref %s", node), + node); + final LeafRefPath leafRefPath = leafRefPathParser.parseLeafRefPath(leafRefPathString); currentLeafRefContextBuilder.setLeafRefTargetPathString(leafRefPathString); currentLeafRefContextBuilder.setReferencing(true); - - final LeafRefPathParserImpl leafRefPathParser = new LeafRefPathParserImpl( - schemaContext, currentModule, node); - - final LeafRefPath leafRefPath = leafRefPathParser.parseLeafRefPathSourceToSchemaPath( - new ByteArrayInputStream(leafRefPathString.getBytes(StandardCharsets.UTF_8))); - currentLeafRefContextBuilder.setLeafRefTargetPath(leafRefPath); final LeafRefContext currentLeafRefContext = currentLeafRefContextBuilder.build(); @@ -152,56 +112,45 @@ class LeafRefContextTreeBuilder { return currentLeafRefContextBuilder.build(); } - private LeafRefContext buildLeafRefContextReferencedByTree( - final DataSchemaNode node, final Module currentModule) throws IOException, - LeafRefYangSyntaxErrorException { - - final LeafRefContextBuilder currentLeafRefContextBuilder = new LeafRefContextBuilder( - node.getQName(), node.getPath(), schemaContext); + private Module getBaseTypeModule(final LeafrefTypeDefinition leafrefType) { + /* + * Find the first definition of supplied leafref type and return the + * module which contains this definition. + */ + LeafrefTypeDefinition baseLeafRefType = leafrefType; + while (baseLeafRefType.getBaseType() != null) { + baseLeafRefType = baseLeafRefType.getBaseType(); + } + return schemaContext.findModule(baseLeafRefType.getQName().getModule()).orElse(null); + } + private LeafRefContext buildLeafRefContextReferencedByTree(final DataSchemaNode node, final Module currentModule) + throws LeafRefYangSyntaxErrorException { + final LeafRefContextBuilder currentLeafRefContextBuilder = new LeafRefContextBuilder(node.getQName(), + node.getPath(), schemaContext); if (node instanceof DataNodeContainer) { - final DataNodeContainer dataNodeContainer = (DataNodeContainer) node; - final Collection childNodes = dataNodeContainer - .getChildNodes(); - - for (final DataSchemaNode childNode : childNodes) { - final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree( - childNode, currentModule); - - if (childLeafRefContext.hasReferencedChild() - || childLeafRefContext.isReferenced()) { - currentLeafRefContextBuilder.addReferencedByChild( - childLeafRefContext, - childLeafRefContext.getNodeName()); + for (final DataSchemaNode childNode : ((DataNodeContainer) node).getChildNodes()) { + final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree(childNode, + currentModule); + if (childLeafRefContext.hasReferencedChild() || childLeafRefContext.isReferenced()) { + currentLeafRefContextBuilder.addReferencedByChild(childLeafRefContext, + childLeafRefContext.getNodeName()); } } } else if (node instanceof ChoiceSchemaNode) { - - final ChoiceSchemaNode choice = (ChoiceSchemaNode) node; - final Set cases = choice.getCases(); - - for (final ChoiceCaseNode caseNode : cases) { - final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree( - caseNode, currentModule); - - if (childLeafRefContext.hasReferencedChild() - || childLeafRefContext.isReferenced()) { - currentLeafRefContextBuilder.addReferencedByChild( - childLeafRefContext, - childLeafRefContext.getNodeName()); + for (final CaseSchemaNode caseNode : ((ChoiceSchemaNode) node).getCases().values()) { + final LeafRefContext childLeafRefContext = buildLeafRefContextReferencedByTree(caseNode, currentModule); + if (childLeafRefContext.hasReferencedChild() || childLeafRefContext.isReferenced()) { + currentLeafRefContextBuilder.addReferencedByChild(childLeafRefContext, + childLeafRefContext.getNodeName()); } } - - } else if (node instanceof LeafSchemaNode - || node instanceof LeafListSchemaNode) { - - final List foundLeafRefs = getLeafRefsFor(node, - currentModule); + } else if (node instanceof LeafSchemaNode || node instanceof LeafListSchemaNode) { + final List foundLeafRefs = getLeafRefsFor(node, currentModule); if (!foundLeafRefs.isEmpty()) { currentLeafRefContextBuilder.setReferencedBy(true); for (final LeafRefContext leafRef : foundLeafRefs) { - currentLeafRefContextBuilder.addReferencedByLeafRefCtx( - leafRef.getNodeName(), leafRef); + currentLeafRefContextBuilder.addReferencedByLeafRefCtx(leafRef.getNodeName(), leafRef); } } } @@ -209,16 +158,11 @@ class LeafRefContextTreeBuilder { return currentLeafRefContextBuilder.build(); } - private List getLeafRefsFor(final DataSchemaNode node, - final Module module) { - final LeafRefPath nodeXPath = LeafRefUtils.schemaPathToLeafRefPath( - node.getPath(), module); - + private List getLeafRefsFor(final DataSchemaNode node, final Module module) { + final LeafRefPath nodeXPath = LeafRefUtils.schemaPathToLeafRefPath(node.getPath(), module); final List foundLeafRefs = new LinkedList<>(); - for (final LeafRefContext leafref : leafRefs) { - final LeafRefPath leafRefTargetPath = leafref - .getAbsoluteLeafRefTargetPath(); + final LeafRefPath leafRefTargetPath = leafref.getAbsoluteLeafRefTargetPath(); if (leafRefTargetPath.equals(nodeXPath)) { foundLeafRefs.add(leafref); } @@ -226,5 +170,4 @@ class LeafRefContextTreeBuilder { return foundLeafRefs; } - }