X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=opendaylight%2Fsal%2Fyang-prototype%2Fcode-generator%2Fyang-model-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fyang%2Fparser%2Fbuilder%2Fimpl%2FModuleBuilder.java;h=efa3849e90db4423f5ffee79d1d59ca2b1fec80a;hb=57fecc4d1681146cef30525950dd74a7ff657850;hp=0d47d7a5fc5dbd391be57e032dd387b490c8da93;hpb=1e9531138e44cd757ca27b0d86e98eccb22ccd82;p=controller.git diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java index 0d47d7a5fc..efa3849e90 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java @@ -13,6 +13,7 @@ import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.HashSet; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -31,10 +32,11 @@ import org.opendaylight.controller.yang.model.api.NotificationDefinition; import org.opendaylight.controller.yang.model.api.RpcDefinition; import org.opendaylight.controller.yang.model.api.SchemaPath; import org.opendaylight.controller.yang.model.api.TypeDefinition; +import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; import org.opendaylight.controller.yang.model.api.UsesNode; import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.controller.yang.parser.builder.api.Builder; -import org.opendaylight.controller.yang.parser.builder.api.ChildNodeBuilder; +import org.opendaylight.controller.yang.parser.builder.api.DataNodeContainerBuilder; import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder; import org.opendaylight.controller.yang.parser.builder.api.SchemaNodeBuilder; @@ -61,16 +63,11 @@ public class ModuleBuilder implements Builder { private final Set imports = new HashSet(); - /** - * All nodes, that can contain other nodes - */ - private final Map, Builder> moduleNodes = new HashMap, Builder>(); - /** * Holds all child (DataSchemaNode) nodes: anyxml, choice, case, container, * list, leaf, leaf-list. */ - private final Map, DataSchemaNodeBuilder> addedChilds = new HashMap, DataSchemaNodeBuilder>(); + private final Map, DataSchemaNodeBuilder> childNodes = new HashMap, DataSchemaNodeBuilder>(); private final Map, GroupingBuilder> addedGroupings = new HashMap, GroupingBuilder>(); private final List addedAugments = new ArrayList(); @@ -79,13 +76,16 @@ public class ModuleBuilder implements Builder { private final Set addedNotifications = new HashSet(); private final Set addedIdentities = new HashSet(); private final Map, FeatureBuilder> addedFeatures = new HashMap, FeatureBuilder>(); - private final Map addedDeviations = new HashMap(); + private final Map, DeviationBuilder> addedDeviations = new HashMap, DeviationBuilder>(); private final Map, TypeDefinitionBuilder> addedTypedefs = new HashMap, TypeDefinitionBuilder>(); + private final Map, UnionTypeBuilder> addedUnionTypes = new HashMap, UnionTypeBuilder>(); private final List addedExtensions = new ArrayList(); - private final Set addedUnknownNodes = new HashSet(); + private final Map, UnknownSchemaNodeBuilder> addedUnknownNodes = new HashMap, UnknownSchemaNodeBuilder>(); private final Map, TypeAwareBuilder> dirtyNodes = new HashMap, TypeAwareBuilder>(); + private final LinkedList actualPath = new LinkedList(); + public ModuleBuilder(final String name) { this.name = name; instance = new ModuleImpl(name); @@ -106,8 +106,8 @@ public class ModuleBuilder implements Builder { instance.setTypeDefinitions(typedefs); // CHILD NODES - final Map childNodes = buildModuleChildNodes(addedChilds); - instance.setChildNodes(childNodes); + final Map children = buildModuleChildNodes(childNodes); + instance.setChildNodes(children); // GROUPINGS final Set groupings = buildModuleGroupings(addedGroupings); @@ -124,7 +124,7 @@ public class ModuleBuilder implements Builder { // NOTIFICATIONS final Set notifications = new HashSet(); for (NotificationBuilder entry : addedNotifications) { - notifications.add((NotificationDefinition) entry.build()); + notifications.add(entry.build()); } instance.setNotifications(notifications); @@ -141,8 +141,7 @@ public class ModuleBuilder implements Builder { // DEVIATIONS final Set deviations = new HashSet(); - for (Map.Entry entry : addedDeviations - .entrySet()) { + for (Map.Entry, DeviationBuilder> entry : addedDeviations.entrySet()) { deviations.add(entry.getValue().build()); } instance.setDeviations(deviations); @@ -161,6 +160,10 @@ public class ModuleBuilder implements Builder { } instance.setIdentities(identities); + // UNKNOWN NODES + final List unknownNodes = buildModuleUnknownNodes(addedUnknownNodes); + instance.setUnknownSchemaNodes(unknownNodes); + return instance; } @@ -169,47 +172,69 @@ public class ModuleBuilder implements Builder { return 0; } - public Builder getNode(final List path) { - return moduleNodes.get(path); + public void enterNode(final Builder node) { + actualPath.push(node); + } + + public void exitNode() { + actualPath.pop(); + } + + public Builder getActualNode() { + if (actualPath.isEmpty()) { + return null; + } else { + return actualPath.get(0); + } + } + + public Builder getModuleNode(final List path) { + return childNodes.get(path); + } + + public GroupingBuilder getGrouping(final List path) { + return addedGroupings.get(path); + } + + public Builder getModuleTypedef(final List path) { + return addedTypedefs.get(path); } public Set getChildNodes() { - final Set childNodes = new HashSet(); - for (Map.Entry, DataSchemaNodeBuilder> entry : addedChilds - .entrySet()) { - List path = entry.getKey(); - DataSchemaNodeBuilder child = entry.getValue(); + final Set children = new HashSet(); + for (Map.Entry, DataSchemaNodeBuilder> entry : childNodes.entrySet()) { + final List path = entry.getKey(); + final DataSchemaNodeBuilder child = entry.getValue(); if (path.size() == 2) { - childNodes.add(child); + children.add(child); } } - return childNodes; + return children; } public Map, TypeAwareBuilder> getDirtyNodes() { return dirtyNodes; } - public List getAddedAugments() { + public List getAugments() { return addedAugments; } - public Set getAddedIdentities() { + public Set getIdentities() { return addedIdentities; } - public Map, UsesNodeBuilder> getAddedUsesNodes() { + public Map, UsesNodeBuilder> getUsesNodes() { return addedUsesNodes; } - public Set getAddedUnknownNodes() { - return addedUnknownNodes; + public Set getUnknownNodes() { + return new HashSet(addedUnknownNodes.values()); } public Set getModuleTypedefs() { - Set typedefs = new HashSet(); - for (Map.Entry, TypeDefinitionBuilder> entry : addedTypedefs - .entrySet()) { + final Set typedefs = new HashSet(); + for (Map.Entry, TypeDefinitionBuilder> entry : addedTypedefs.entrySet()) { if (entry.getKey().size() == 2) { typedefs.add(entry.getValue()); } @@ -217,6 +242,16 @@ public class ModuleBuilder implements Builder { return typedefs; } + public Set getModuleGroupings() { + final Set groupings = new HashSet(); + for (Map.Entry, GroupingBuilder> entry : addedGroupings.entrySet()) { + if (entry.getKey().size() == 2) { + groupings.add(entry.getValue()); + } + } + return groupings; + } + public String getName() { return name; } @@ -247,8 +282,7 @@ public class ModuleBuilder implements Builder { public void addDirtyNode(final List path) { final List dirtyNodePath = new ArrayList(path); - final TypeAwareBuilder nodeBuilder = (TypeAwareBuilder) moduleNodes - .get(dirtyNodePath); + final TypeAwareBuilder nodeBuilder = (TypeAwareBuilder) actualPath.getFirst(); dirtyNodes.put(dirtyNodePath, nodeBuilder); } @@ -280,10 +314,8 @@ public class ModuleBuilder implements Builder { instance.setContact(contact); } - public boolean addModuleImport(final String moduleName, - final Date revision, final String prefix) { - final ModuleImport moduleImport = createModuleImport(moduleName, - revision, prefix); + public boolean addModuleImport(final String moduleName, final Date revision, final String prefix) { + final ModuleImport moduleImport = createModuleImport(moduleName, revision, prefix); return imports.add(moduleImport); } @@ -297,378 +329,393 @@ public class ModuleBuilder implements Builder { return builder; } - public ContainerSchemaNodeBuilder addContainerNode( - final QName containerName, final List parentPath, + public ContainerSchemaNodeBuilder addContainerNode(final QName containerName, final List parentPath, final int line) { final List pathToNode = new ArrayList(parentPath); - final ContainerSchemaNodeBuilder containerBuilder = new ContainerSchemaNodeBuilder( - containerName, line); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes - .get(pathToNode); - if (parent != null) { - if (parent instanceof AugmentationSchemaBuilder) { - containerBuilder.setAugmenting(true); - } - parent.addChildNode(containerBuilder); - } + final ContainerSchemaNodeBuilder containerBuilder = new ContainerSchemaNodeBuilder(containerName, line); + updateParent(containerBuilder, line, "container"); pathToNode.add(containerName.getLocalName()); - moduleNodes.put(pathToNode, containerBuilder); - addedChilds.put(pathToNode, containerBuilder); + childNodes.put(pathToNode, containerBuilder); return containerBuilder; } - public ListSchemaNodeBuilder addListNode(final QName listName, - final List parentPath, final int line) { + public ListSchemaNodeBuilder addListNode(final QName listName, final List parentPath, final int line) { final List pathToNode = new ArrayList(parentPath); - final ListSchemaNodeBuilder listBuilder = new ListSchemaNodeBuilder( - listName, line); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes - .get(pathToNode); - if (parent != null) { - if (parent instanceof AugmentationSchemaBuilder) { - listBuilder.setAugmenting(true); - } - parent.addChildNode(listBuilder); - } + final ListSchemaNodeBuilder listBuilder = new ListSchemaNodeBuilder(listName, line); + updateParent(listBuilder, line, "list"); pathToNode.add(listName.getLocalName()); - moduleNodes.put(pathToNode, listBuilder); - addedChilds.put(pathToNode, listBuilder); + childNodes.put(pathToNode, listBuilder); return listBuilder; } - public LeafSchemaNodeBuilder addLeafNode(final QName leafName, - final List parentPath, final int line) { + public LeafSchemaNodeBuilder addLeafNode(final QName leafName, final List parentPath, final int line) { final List pathToNode = new ArrayList(parentPath); - final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder( - leafName, line); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes - .get(pathToNode); - if (parent != null) { - if (parent instanceof AugmentationSchemaBuilder) { - leafBuilder.setAugmenting(true); - } - parent.addChildNode(leafBuilder); - } + final LeafSchemaNodeBuilder leafBuilder = new LeafSchemaNodeBuilder(leafName, line); + updateParent(leafBuilder, line, "leaf"); pathToNode.add(leafName.getLocalName()); - addedChilds.put(pathToNode, leafBuilder); - moduleNodes.put(pathToNode, leafBuilder); + childNodes.put(pathToNode, leafBuilder); return leafBuilder; } - public LeafListSchemaNodeBuilder addLeafListNode(final QName leafListName, - final List parentPath, final int line) { + public LeafListSchemaNodeBuilder addLeafListNode(final QName qname, final List parentPath, final int line) { final List pathToNode = new ArrayList(parentPath); - final LeafListSchemaNodeBuilder leafListBuilder = new LeafListSchemaNodeBuilder( - leafListName, line); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes - .get(pathToNode); - if (parent != null) { - if (parent instanceof AugmentationSchemaBuilder) { - leafListBuilder.setAugmenting(true); - } - parent.addChildNode(leafListBuilder); - } + final LeafListSchemaNodeBuilder leafListBuilder = new LeafListSchemaNodeBuilder(qname, line); + updateParent(leafListBuilder, line, "leaf-list"); - pathToNode.add(leafListName.getLocalName()); - addedChilds.put(pathToNode, leafListBuilder); - moduleNodes.put(pathToNode, leafListBuilder); + pathToNode.add(qname.getLocalName()); + childNodes.put(pathToNode, leafListBuilder); return leafListBuilder; } - public GroupingBuilder addGrouping(final QName qname, - final List parentPath, final int line) { + public GroupingBuilder addGrouping(final QName qname, final List parentPath, final int line) { final List pathToGroup = new ArrayList(parentPath); final GroupingBuilder builder = new GroupingBuilderImpl(qname, line); - final ChildNodeBuilder parentNodeBuilder = (ChildNodeBuilder) moduleNodes - .get(pathToGroup); - if (parentNodeBuilder != null) { - parentNodeBuilder.addGrouping(builder); + + if (!(actualPath.isEmpty())) { + final Builder parent = actualPath.getFirst(); + if (parent instanceof DataNodeContainerBuilder) { + ((DataNodeContainerBuilder) parent).addGrouping(builder); + } else { + throw new YangParseException(name, line, "Unresolved parent of grouping " + qname.getLocalName()); + } } - pathToGroup.add("grouping"); pathToGroup.add(qname.getLocalName()); - moduleNodes.put(pathToGroup, builder); addedGroupings.put(pathToGroup, builder); return builder; } - public AugmentationSchemaBuilder addAugment(final String name, - final List parentPath, final int line) { + public AugmentationSchemaBuilder addAugment(final String name, final List parentPath, final int line) { final List pathToAugment = new ArrayList(parentPath); - final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl( - name, line); + final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line); // augment can only be in 'module' or 'uses' statement - final UsesNodeBuilder parent = addedUsesNodes.get(pathToAugment); - if (parent != null) { - parent.addAugment(builder); + if (!(actualPath.isEmpty())) { + final Builder parent = actualPath.getFirst(); + if (parent instanceof UsesNodeBuilder) { + ((UsesNodeBuilder) parent).addAugment(builder); + } else { + throw new YangParseException(this.name, line, "Unresolved parent of augment " + name); + } } pathToAugment.add(name); - moduleNodes.put(pathToAugment, builder); addedAugments.add(builder); return builder; } - public UsesNodeBuilder addUsesNode(final String groupingPathStr, - final List parentPath, final int line) { + public UsesNodeBuilder addUsesNode(final String groupingPathStr, final List parentPath, final int line) { final List pathToUses = new ArrayList(parentPath); - final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl( - groupingPathStr, line); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes - .get(pathToUses); - if (parent != null) { - parent.addUsesNode(usesBuilder); + final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(groupingPathStr, line); + + if (!(actualPath.isEmpty())) { + final Builder parent = actualPath.getFirst(); + if (parent instanceof DataNodeContainerBuilder) { + if (parent instanceof AugmentationSchemaBuilder) { + usesBuilder.setAugmenting(true); + } + ((DataNodeContainerBuilder) parent).addUsesNode(usesBuilder); + } else { + throw new YangParseException(name, line, "Unresolved parent of uses " + groupingPathStr); + } } pathToUses.add(groupingPathStr); addedUsesNodes.put(pathToUses, usesBuilder); - moduleNodes.put(pathToUses, usesBuilder); return usesBuilder; } - public void addRefine(final RefineHolder refine, - final List parentPath) { + public void addRefine(final RefineHolder refine, final List parentPath) { final List path = new ArrayList(parentPath); - final Builder parent = moduleNodes.get(path); - if (!(parent instanceof UsesNodeBuilder)) { - throw new YangParseException("Failed to parse refine " - + refine.getName()); + + if (actualPath.isEmpty()) { + throw new YangParseException(name, refine.getLine(), "refine can be defined only in uses statement"); + } else { + final Builder parent = actualPath.getFirst(); + if (parent instanceof UsesNodeBuilder) { + ((UsesNodeBuilder) parent).addRefine(refine); + } else { + throw new YangParseException(name, refine.getLine(), "refine can be defined only in uses statement"); + } } - UsesNodeBuilder usesBuilder = (UsesNodeBuilder) parent; - usesBuilder.addRefine(refine); + path.add(refine.getName()); - moduleNodes.put(path, refine); } - public RpcDefinitionBuilder addRpc(final QName qname, - final List parentPath, final int line) { + public RpcDefinitionBuilder addRpc(final QName qname, final List parentPath, final int line) { + + if (!(actualPath.isEmpty())) { + throw new YangParseException(name, line, "rpc can be defined only in module or submodule"); + } + final List pathToRpc = new ArrayList(parentPath); - final RpcDefinitionBuilder rpcBuilder = new RpcDefinitionBuilder(qname, - line); + final RpcDefinitionBuilder rpcBuilder = new RpcDefinitionBuilder(qname, line); pathToRpc.add(qname.getLocalName()); addedRpcs.put(pathToRpc, rpcBuilder); - final QName inputQName = new QName(qname.getNamespace(), - qname.getRevision(), qname.getPrefix(), "input"); - final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder( - inputQName, line); - final List pathToInput = new ArrayList(pathToRpc); - pathToInput.add("input"); - moduleNodes.put(pathToInput, inputBuilder); - rpcBuilder.setInput(inputBuilder); - - final QName outputQName = new QName(qname.getNamespace(), - qname.getRevision(), qname.getPrefix(), "output"); - final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder( - outputQName, line); - final List pathToOutput = new ArrayList(pathToRpc); - pathToOutput.add("output"); - moduleNodes.put(pathToOutput, outputBuilder); - rpcBuilder.setOutput(outputBuilder); - return rpcBuilder; } - public NotificationBuilder addNotification(final QName notificationName, - final List parentPath, final int line) { - final List pathToNotification = new ArrayList( - parentPath); + public ContainerSchemaNodeBuilder addRpcInput(final QName inputQName, final int line) { + final Builder parent = actualPath.getFirst(); + if (!(parent instanceof RpcDefinitionBuilder)) { + throw new YangParseException(name, line, "input can be defined only in rpc statement"); + } + final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent; + + final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(inputQName, line); + rpc.setInput(inputBuilder); + return inputBuilder; + } + + public ContainerSchemaNodeBuilder addRpcOutput(final QName outputQName, final int line) { + final Builder parent = actualPath.getFirst(); + if (!(parent instanceof RpcDefinitionBuilder)) { + throw new YangParseException(name, line, "output can be defined only in rpc statement"); + } + final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent; + + final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(outputQName, line); + rpc.setOutput(outputBuilder); + return outputBuilder; + } - NotificationBuilder builder = new NotificationBuilder(notificationName, - line); + public NotificationBuilder addNotification(final QName notificationName, final List parentPath, + final int line) { + if (!(actualPath.isEmpty())) { + throw new YangParseException(name, line, "notification can be defined only in module or submodule"); + } + final NotificationBuilder builder = new NotificationBuilder(notificationName, line); - pathToNotification.add(notificationName.getLocalName()); - moduleNodes.put(pathToNotification, builder); + final List notificationPath = new ArrayList(parentPath); + notificationPath.add(notificationName.getLocalName()); addedNotifications.add(builder); return builder; } - public FeatureBuilder addFeature(final QName featureName, - final List parentPath, final int line) { - List pathToFeature = new ArrayList(parentPath); + public FeatureBuilder addFeature(final QName featureName, final List parentPath, final int line) { + if (!(actualPath.isEmpty())) { + throw new YangParseException(name, line, "feature can be defined only in module or submodule"); + } + + final List pathToFeature = new ArrayList(parentPath); pathToFeature.add(featureName.getLocalName()); - FeatureBuilder builder = new FeatureBuilder(featureName, line); + final FeatureBuilder builder = new FeatureBuilder(featureName, line); addedFeatures.put(pathToFeature, builder); return builder; } - public ChoiceBuilder addChoice(final QName choiceName, - final List parentPath, final int line) { - List pathToChoice = new ArrayList(parentPath); - ChoiceBuilder builder = new ChoiceBuilder(choiceName, line); + public ChoiceBuilder addChoice(final QName choiceName, final List parentPath, final int line) { + final List pathToChoice = new ArrayList(parentPath); + final ChoiceBuilder builder = new ChoiceBuilder(choiceName, line); - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes - .get(pathToChoice); - if (parent != null) { - if (parent instanceof AugmentationSchemaBuilder) { - builder.setAugmenting(true); + if (!(actualPath.isEmpty())) { + final Builder parent = actualPath.getFirst(); + if (parent instanceof DataNodeContainerBuilder) { + if (parent instanceof AugmentationSchemaBuilder) { + builder.setAugmenting(true); + } + ((DataNodeContainerBuilder) parent).addChildNode(builder); + } else { + throw new YangParseException(name, line, "Unresolved parent of choice " + choiceName.getLocalName()); } - parent.addChildNode(builder); } pathToChoice.add(choiceName.getLocalName()); - addedChilds.put(pathToChoice, builder); - moduleNodes.put(pathToChoice, builder); + childNodes.put(pathToChoice, builder); return builder; } - public ChoiceCaseBuilder addCase(final QName caseName, - final List parentPath, final int line) { - List pathToCase = new ArrayList(parentPath); - ChoiceCaseBuilder builder = new ChoiceCaseBuilder(caseName, line); - - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes - .get(pathToCase); - if (parent != null) { - if (parent instanceof AugmentationSchemaBuilder) { + public ChoiceCaseBuilder addCase(final QName caseName, final List parentPath, final int line) { + final List pathToCase = new ArrayList(parentPath); + final ChoiceCaseBuilder builder = new ChoiceCaseBuilder(caseName, line); + + if (actualPath.isEmpty()) { + throw new YangParseException(name, line, "'case' parent not found"); + } else { + final Builder parent = actualPath.getFirst(); + if (parent instanceof ChoiceBuilder) { + ((ChoiceBuilder) parent).addChildNode(builder); + } else if (parent instanceof AugmentationSchemaBuilder) { builder.setAugmenting(true); + ((AugmentationSchemaBuilder) parent).addChildNode(builder); + } else { + throw new YangParseException(name, line, "Unresolved parent of 'case' " + caseName.getLocalName()); } - parent.addChildNode(builder); } pathToCase.add(caseName.getLocalName()); - moduleNodes.put(pathToCase, builder); + childNodes.put(pathToCase, builder); return builder; } - public AnyXmlBuilder addAnyXml(final QName anyXmlName, - final List parentPath, final int line) { - List pathToAnyXml = new ArrayList(parentPath); - AnyXmlBuilder builder = new AnyXmlBuilder(anyXmlName, line); - - final ChildNodeBuilder parent = (ChildNodeBuilder) moduleNodes - .get(pathToAnyXml); - if (parent != null) { - if (parent instanceof AugmentationSchemaBuilder) { - throw new YangParseException( - "An anyxml node cannot be augmented."); - } - parent.addChildNode(builder); - } + public AnyXmlBuilder addAnyXml(final QName anyXmlName, final List parentPath, final int line) { + final List pathToAnyXml = new ArrayList(parentPath); + final AnyXmlBuilder builder = new AnyXmlBuilder(anyXmlName, line); + updateParent(builder, line, "anyxml"); pathToAnyXml.add(anyXmlName.getLocalName()); - addedChilds.put(pathToAnyXml, builder); - moduleNodes.put(pathToAnyXml, builder); + childNodes.put(pathToAnyXml, builder); return builder; } - public TypedefBuilder addTypedef(final QName typeDefName, - final List parentPath, final int line) { - List pathToType = new ArrayList(parentPath); - TypedefBuilder builder = new TypedefBuilder(typeDefName, line); - TypeDefinitionAwareBuilder parent = (TypeDefinitionAwareBuilder) moduleNodes - .get(pathToType); - if (parent != null) { - parent.addTypedef(builder); + public TypeDefinitionBuilderImpl addTypedef(final QName typeDefName, final List parentPath, final int line) { + final List pathToType = new ArrayList(parentPath); + final TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(typeDefName, line); + + if (!(actualPath.isEmpty())) { + final Builder parent = actualPath.getFirst(); + if (parent instanceof TypeDefinitionAwareBuilder) { + ((TypeDefinitionAwareBuilder) parent).addTypedef(builder); + } else { + throw new YangParseException(name, line, "Unresolved parent of typedef " + typeDefName.getLocalName()); + } } + pathToType.add(typeDefName.getLocalName()); addedTypedefs.put(pathToType, builder); - moduleNodes.put(pathToType, builder); return builder; } - public void setType(TypeDefinition type, List parentPath) { - TypeAwareBuilder parent = (TypeAwareBuilder) moduleNodes - .get(parentPath); - if (parent == null) { - throw new YangParseException("Failed to set type '" - + type.getQName().getLocalName() - + "'. Parent node not found."); + public void setType(final TypeDefinition type, final List parentPath) { + if (!(actualPath.isEmpty())) { + final Builder parent = actualPath.getFirst(); + if (parent instanceof TypeAwareBuilder) { + ((TypeAwareBuilder) parent).setType(type); + } else { + throw new YangParseException("Failed to set type '" + type.getQName().getLocalName() + + "'. Unknown parent node: " + parent); + } } - parent.setType(type); } - public UnionTypeBuilder addUnionType(final List actualPath, - final URI namespace, final Date revision, final int line) { - List pathToUnion = new ArrayList(actualPath); - TypeAwareBuilder parent = (TypeAwareBuilder) moduleNodes - .get(pathToUnion); - UnionTypeBuilder union = new UnionTypeBuilder(line); - parent.setType(union); + public UnionTypeBuilder addUnionType(final List currentPath, final URI namespace, final Date revision, + final int line) { + final List pathToUnion = new ArrayList(currentPath); + final UnionTypeBuilder union = new UnionTypeBuilder(line); + + if (actualPath.isEmpty()) { + throw new YangParseException(line, "union error"); + } else { + final Builder parent = actualPath.getFirst(); + if (parent instanceof TypeAwareBuilder) { - List path = new ArrayList(pathToUnion); - path.add("union"); + ((TypeAwareBuilder) parent).setTypedef(union); - moduleNodes.put(path, union); - return union; + final List path = new ArrayList(pathToUnion); + path.add("union"); + + addedUnionTypes.put(path, union); + return union; + } else { + throw new YangParseException(name, line, "Unresolved parent of union type."); + } + } } - public void addIdentityrefType(final String baseString, - final List parentPath, final SchemaPath schemaPath, + public void addIdentityrefType(final String baseString, final List parentPath, final SchemaPath schemaPath, final int line) { - List pathToIdentityref = new ArrayList(parentPath); - TypeAwareBuilder parent = (TypeAwareBuilder) moduleNodes - .get(pathToIdentityref); - IdentityrefTypeBuilder identityref = new IdentityrefTypeBuilder( - baseString, schemaPath, line); - parent.setType(identityref); - dirtyNodes.put(pathToIdentityref, parent); + final List pathToIdentityref = new ArrayList(parentPath); + final IdentityrefTypeBuilder identityref = new IdentityrefTypeBuilder(baseString, schemaPath, line); + + if (actualPath.isEmpty()) { + throw new YangParseException(line, "identityref error"); + } else { + final Builder parent = actualPath.getFirst(); + if (parent instanceof TypeAwareBuilder) { + final TypeAwareBuilder typeParent = (TypeAwareBuilder) parent; + typeParent.setTypedef(identityref); + dirtyNodes.put(pathToIdentityref, typeParent); + } else { + throw new YangParseException(name, line, "Unresolved parent of identityref type."); + } + } } - public DeviationBuilder addDeviation(final String targetPath, - final List parentPath, final int line) { + public DeviationBuilder addDeviation(final String targetPath, final List parentPath, final int line) { + if (!(actualPath.isEmpty())) { + throw new YangParseException(name, line, "deviation can be defined only in module or submodule"); + } + final List pathToDeviation = new ArrayList(parentPath); pathToDeviation.add(targetPath); - DeviationBuilder builder = new DeviationBuilder(targetPath, line); - addedDeviations.put(targetPath, builder); - moduleNodes.put(pathToDeviation, builder); + final DeviationBuilder builder = new DeviationBuilder(targetPath, line); + addedDeviations.put(pathToDeviation, builder); return builder; } - public IdentitySchemaNodeBuilder addIdentity(final QName qname, - final List parentPath, final int line) { + public IdentitySchemaNodeBuilder addIdentity(final QName qname, final List parentPath, final int line) { + if (!(actualPath.isEmpty())) { + throw new YangParseException(name, line, "identity can be defined only in module or submodule"); + } + final List pathToIdentity = new ArrayList(parentPath); - final IdentitySchemaNodeBuilder builder = new IdentitySchemaNodeBuilder( - qname, line); + final IdentitySchemaNodeBuilder builder = new IdentitySchemaNodeBuilder(qname, line); pathToIdentity.add(qname.getLocalName()); - moduleNodes.put(pathToIdentity, builder); addedIdentities.add(builder); return builder; } - public void addConfiguration(boolean configuration, List parentPath) { - Builder builder = moduleNodes.get(parentPath); - // current api did not support adding config to deviate - if (!(builder instanceof DeviationBuilder)) { - if(builder instanceof RefineHolder) { - ((RefineHolder)builder).setConfig(configuration); + public void addConfiguration(final boolean configuration, final List parentPath, final int line) { + if (actualPath.isEmpty()) { + throw new YangParseException(name, line, "Parent node of config statement not found."); + } else { + final Builder parent = actualPath.getFirst(); + if (parent instanceof DataSchemaNodeBuilder) { + ((DataSchemaNodeBuilder) parent).setConfiguration(configuration); + } else if (parent instanceof RefineHolder) { + ((RefineHolder) parent).setConfig(configuration); + } else if (parent instanceof DeviationBuilder) { + // skip: set config to deviation (deviate stmt) not supported by + // current api + return; } else { - ((DataSchemaNodeBuilder)builder).setConfiguration(configuration); + throw new YangParseException(name, line, "Unresolved parent of config statement."); } } } - public UnknownSchemaNodeBuilder addUnknownSchemaNode(final QName qname, - final List parentPath, final int line) { - final List pathToUnknown = new ArrayList(parentPath); - final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder( - qname, line); - final Builder parent = moduleNodes.get(pathToUnknown); - if (parent instanceof RefineHolder) { - ((RefineHolder) parent).addUnknownSchemaNode(builder); - } else if (parent instanceof SchemaNodeBuilder) { - ((SchemaNodeBuilder) parent).addUnknownSchemaNode(builder); + public UnknownSchemaNodeBuilder addUnknownSchemaNode(final QName qname, final List parentPath, + final int line) { + final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(qname, line); + + if (!(actualPath.isEmpty())) { + final Builder parent = actualPath.getFirst(); + if (parent instanceof SchemaNodeBuilder) { + ((SchemaNodeBuilder) parent).addUnknownSchemaNode(builder); + } else if (parent instanceof RefineHolder) { + ((RefineHolder) parent).addUnknownSchemaNode(builder); + } else { + throw new YangParseException(name, line, "Unresolved parent of unknown node '" + qname.getLocalName() + + "'"); + } } - addedUnknownNodes.add(builder); + final List unPath = new ArrayList(parentPath); + unPath.add(qname.getLocalName()); + addedUnknownNodes.put(unPath, builder); return builder; } + @Override + public String toString() { + return ModuleBuilder.class.getSimpleName() + "[" + name + "]"; + } + private final class ModuleImpl implements Module { private URI namespace; private final String name; @@ -682,17 +729,16 @@ public class ModuleBuilder implements Builder { private Set imports = Collections.emptySet(); private Set features = Collections.emptySet(); private Set> typeDefinitions = Collections.emptySet(); - private Set notifications = Collections - .emptySet(); + private Set notifications = Collections.emptySet(); private Set augmentations = Collections.emptySet(); private Set rpcs = Collections.emptySet(); private Set deviations = Collections.emptySet(); private Map childNodes = Collections.emptyMap(); private Set groupings = Collections.emptySet(); private Set uses = Collections.emptySet(); - private List extensionNodes = Collections - .emptyList(); + private List extensionNodes = Collections.emptyList(); private Set identities = Collections.emptySet(); + private List unknownNodes = Collections.emptyList(); private ModuleImpl(String name) { this.name = name; @@ -890,8 +936,7 @@ public class ModuleBuilder implements Builder { return extensionNodes; } - private void setExtensionSchemaNodes( - List extensionNodes) { + private void setExtensionSchemaNodes(final List extensionNodes) { if (extensionNodes != null) { this.extensionNodes = extensionNodes; } @@ -902,12 +947,23 @@ public class ModuleBuilder implements Builder { return identities; } - private void setIdentities(Set identities) { + private void setIdentities(final Set identities) { if (identities != null) { this.identities = identities; } } + @Override + public List getUnknownSchemaNodes() { + return unknownNodes; + } + + private void setUnknownSchemaNodes(final List unknownNodes) { + if (unknownNodes != null) { + this.unknownNodes = unknownNodes; + } + } + @Override public DataSchemaNode getDataChildByName(QName name) { return childNodes.get(name); @@ -929,15 +985,11 @@ public class ModuleBuilder implements Builder { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result - + ((namespace == null) ? 0 : namespace.hashCode()); + result = prime * result + ((namespace == null) ? 0 : namespace.hashCode()); result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result - + ((revision == null) ? 0 : revision.hashCode()); - result = prime * result - + ((prefix == null) ? 0 : prefix.hashCode()); - result = prime * result - + ((yangVersion == null) ? 0 : yangVersion.hashCode()); + result = prime * result + ((revision == null) ? 0 : revision.hashCode()); + result = prime * result + ((prefix == null) ? 0 : prefix.hashCode()); + result = prime * result + ((yangVersion == null) ? 0 : yangVersion.hashCode()); return result; } @@ -993,8 +1045,7 @@ public class ModuleBuilder implements Builder { @Override public String toString() { - StringBuilder sb = new StringBuilder( - ModuleImpl.class.getSimpleName()); + StringBuilder sb = new StringBuilder(ModuleImpl.class.getSimpleName()); sb.append("["); sb.append("name=" + name); sb.append(", namespace=" + namespace); @@ -1006,9 +1057,25 @@ public class ModuleBuilder implements Builder { } } - private ModuleImport createModuleImport(final String moduleName, - final Date revision, final String prefix) { - ModuleImport moduleImport = new ModuleImport() { + private void updateParent(DataSchemaNodeBuilder nodeBuilder, int line, String nodeTypeName) { + if (!(actualPath.isEmpty())) { + final Builder parent = actualPath.getFirst(); + if (parent instanceof DataNodeContainerBuilder) { + if (parent instanceof AugmentationSchemaBuilder) { + nodeBuilder.setAugmenting(true); + } + ((DataNodeContainerBuilder) parent).addChildNode(nodeBuilder); + } else if (parent instanceof ChoiceBuilder) { + ((ChoiceBuilder) parent).addChildNode(nodeBuilder); + } else { + throw new YangParseException(name, line, "Unresolved parent of " + nodeTypeName + " " + + nodeBuilder.getQName().getLocalName()); + } + } + } + + private ModuleImport createModuleImport(final String moduleName, final Date revision, final String prefix) { + final ModuleImport moduleImport = new ModuleImport() { @Override public String getModuleName() { return moduleName; @@ -1028,12 +1095,9 @@ public class ModuleBuilder implements Builder { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result - + ((moduleName == null) ? 0 : moduleName.hashCode()); - result = prime * result - + ((revision == null) ? 0 : revision.hashCode()); - result = prime * result - + ((prefix == null) ? 0 : prefix.hashCode()); + result = prime * result + ((moduleName == null) ? 0 : moduleName.hashCode()); + result = prime * result + ((revision == null) ? 0 : revision.hashCode()); + result = prime * result + ((prefix == null) ? 0 : prefix.hashCode()); return result; } @@ -1075,8 +1139,7 @@ public class ModuleBuilder implements Builder { @Override public String toString() { - return "ModuleImport[moduleName=" + moduleName + ", revision=" - + revision + ", prefix=" + prefix + "]"; + return "ModuleImport[moduleName=" + moduleName + ", revision=" + revision + ", prefix=" + prefix + "]"; } }; return moduleImport; @@ -1090,11 +1153,9 @@ public class ModuleBuilder implements Builder { * @return map of children, where key is child QName and value is child * itself */ - private Map buildModuleChildNodes( - Map, DataSchemaNodeBuilder> addedChilds) { + private Map buildModuleChildNodes(Map, DataSchemaNodeBuilder> addedChilds) { final Map childNodes = new HashMap(); - for (Map.Entry, DataSchemaNodeBuilder> entry : addedChilds - .entrySet()) { + for (Map.Entry, DataSchemaNodeBuilder> entry : addedChilds.entrySet()) { List path = entry.getKey(); DataSchemaNodeBuilder child = entry.getValue(); if (path.size() == 2) { @@ -1114,12 +1175,10 @@ public class ModuleBuilder implements Builder { * @param addedGroupings * @return set of built GroupingDefinition objects */ - private Set buildModuleGroupings( - Map, GroupingBuilder> addedGroupings) { + private Set buildModuleGroupings(Map, GroupingBuilder> addedGroupings) { final Set groupings = new HashSet(); - for (Map.Entry, GroupingBuilder> entry : addedGroupings - .entrySet()) { - if (entry.getKey().size() == 3) { + for (Map.Entry, GroupingBuilder> entry : addedGroupings.entrySet()) { + if (entry.getKey().size() == 2) { groupings.add(entry.getValue().build()); } } @@ -1132,12 +1191,10 @@ public class ModuleBuilder implements Builder { * @param addedRpcs * @return set of built RpcDefinition objects */ - private Set buildModuleRpcs( - Map, RpcDefinitionBuilder> addedRpcs) { + private Set buildModuleRpcs(Map, RpcDefinitionBuilder> addedRpcs) { final Set rpcs = new HashSet(); RpcDefinitionBuilder builder; - for (Map.Entry, RpcDefinitionBuilder> entry : addedRpcs - .entrySet()) { + for (Map.Entry, RpcDefinitionBuilder> entry : addedRpcs.entrySet()) { builder = entry.getValue(); RpcDefinition rpc = builder.build(); rpcs.add(rpc); @@ -1153,16 +1210,13 @@ public class ModuleBuilder implements Builder { * @param addedTypedefs * @return set of built module typedef statements */ - private Set> buildModuleTypedefs( - Map, TypeDefinitionBuilder> addedTypedefs) { + private Set> buildModuleTypedefs(Map, TypeDefinitionBuilder> addedTypedefs) { Set> typedefs = new HashSet>(); - for (Map.Entry, TypeDefinitionBuilder> entry : addedTypedefs - .entrySet()) { + for (Map.Entry, TypeDefinitionBuilder> entry : addedTypedefs.entrySet()) { List key = entry.getKey(); TypeDefinitionBuilder typedefBuilder = entry.getValue(); if (key.size() == 2) { - TypeDefinition> node = typedefBuilder - .build(); + TypeDefinition> node = typedefBuilder.build(); typedefs.add(node); } } @@ -1177,11 +1231,9 @@ public class ModuleBuilder implements Builder { * @param addedUsesNodes * @return set of built module uses nodes */ - private Set buildUsesNodes( - Map, UsesNodeBuilder> addedUsesNodes) { + private Set buildUsesNodes(Map, UsesNodeBuilder> addedUsesNodes) { final Set usesNodeDefs = new HashSet(); - for (Map.Entry, UsesNodeBuilder> entry : addedUsesNodes - .entrySet()) { + for (Map.Entry, UsesNodeBuilder> entry : addedUsesNodes.entrySet()) { if (entry.getKey().size() == 2) { usesNodeDefs.add(entry.getValue().build()); } @@ -1196,11 +1248,9 @@ public class ModuleBuilder implements Builder { * @param addedFeatures * @return set of built module features */ - private Set buildModuleFeatures( - Map, FeatureBuilder> addedFeatures) { + private Set buildModuleFeatures(Map, FeatureBuilder> addedFeatures) { Set features = new HashSet(); - for (Map.Entry, FeatureBuilder> entry : addedFeatures - .entrySet()) { + for (Map.Entry, FeatureBuilder> entry : addedFeatures.entrySet()) { if (entry.getKey().size() == 2) { features.add(entry.getValue().build()); } @@ -1208,4 +1258,18 @@ public class ModuleBuilder implements Builder { return features; } + private List buildModuleUnknownNodes( + final Map, UnknownSchemaNodeBuilder> addedUnknownNodes) { + final List unknownNodes = new ArrayList(); + for (Map.Entry, UnknownSchemaNodeBuilder> entry : addedUnknownNodes.entrySet()) { + final List path = entry.getKey(); + final UnknownSchemaNodeBuilder child = entry.getValue(); + if (path.size() == 2) { + final UnknownSchemaNode node = child.build(); + unknownNodes.add(node); + } + } + return unknownNodes; + } + }