X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-parser-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fparser%2Fbuilder%2Fimpl%2FModuleBuilder.java;h=db1babd6dc08ef8242c4aa37c81232224ebbc8e8;hb=364e85967bafce41b84ab2ead45295178a8292bc;hp=15969e6677821ad4deb00362787b594a454e148e;hpb=6f5a05159fb2c12717e3d5465b1963e475b320c8;p=yangtools.git diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java index 15969e6677..db1babd6dc 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/builder/impl/ModuleBuilder.java @@ -1,21 +1,60 @@ /* - * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. - * + * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved. * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html */ package org.opendaylight.yangtools.yang.parser.builder.impl; -import java.net.URI; -import java.util.*; +import com.google.common.base.Preconditions; +import com.google.common.io.ByteSource; +import java.io.IOException; +import java.io.InputStream; +import java.net.URI; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.Deque; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import org.apache.commons.io.IOUtils; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.*; -import org.opendaylight.yangtools.yang.parser.builder.api.*; -import org.opendaylight.yangtools.yang.parser.util.Comparators; -import org.opendaylight.yangtools.yang.parser.util.ModuleImportImpl; -import org.opendaylight.yangtools.yang.parser.util.RefineHolder; +import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; +import org.opendaylight.yangtools.yang.model.api.Deviation; +import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; +import org.opendaylight.yangtools.yang.model.api.FeatureDefinition; +import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.model.api.ModuleImport; +import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; +import org.opendaylight.yangtools.yang.model.api.RpcDefinition; +import org.opendaylight.yangtools.yang.model.api.SchemaPath; +import org.opendaylight.yangtools.yang.model.api.TypeDefinition; +import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; +import org.opendaylight.yangtools.yang.model.util.ModuleImportImpl; +import org.opendaylight.yangtools.yang.parser.builder.api.AugmentationSchemaBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.Builder; +import org.opendaylight.yangtools.yang.parser.builder.api.DataNodeContainerBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.DataSchemaNodeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.DocumentedNodeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.ExtensionBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.GroupingBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.SchemaNodeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.TypeAwareBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.TypeDefinitionBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.UnknownSchemaNodeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.api.UsesNodeBuilder; +import org.opendaylight.yangtools.yang.parser.builder.util.AbstractDocumentedDataNodeContainerBuilder; +import org.opendaylight.yangtools.yang.parser.builder.util.Comparators; import org.opendaylight.yangtools.yang.parser.util.YangParseException; /** @@ -23,33 +62,26 @@ import org.opendaylight.yangtools.yang.parser.util.YangParseException; * module/modules, these dependencies must be resolved before module is built, * otherwise result may not be valid. */ -public class ModuleBuilder extends AbstractDataNodeContainerBuilder { +public class ModuleBuilder extends AbstractDocumentedDataNodeContainerBuilder implements DocumentedNodeBuilder { - private final ModuleImpl instance; + private ModuleImpl instance; private final String name; - private final SchemaPath schemaPath; - private URI namespace; + private final String sourcePath; + private static final SchemaPath SCHEMA_PATH = SchemaPath.create(Collections. emptyList(), true); private String prefix; - private Date revision; + private QNameModule qnameModule = QNameModule.create(null, null); private final boolean submodule; private String belongsTo; private ModuleBuilder parent; - public ModuleBuilder getParent() { - return parent; - } - - public void setParent(ModuleBuilder parent) { - this.parent = parent; - } - private final Deque actualPath = new LinkedList<>(); private final Set dirtyNodes = new HashSet<>(); - private final Set imports = new HashSet(); + final Map imports = new HashMap<>(); + final Map importedModules = new HashMap<>(); - private final Set augments = new HashSet<>(); + private final Set augments = new LinkedHashSet<>(); private final List augmentBuilders = new ArrayList<>(); private final List allAugments = new ArrayList<>(); @@ -75,48 +107,57 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { private final List extensions = new ArrayList<>(); private final List addedExtensions = new ArrayList<>(); - private final List allUnknownNodes = new ArrayList(); + private final List allUnknownNodes = new ArrayList<>(); + + private final List allLists = new ArrayList<>(); - public ModuleBuilder(final String name) { - this(name, false); + private String source; + private String yangVersion; + private String organization; + private String contact; + + public ModuleBuilder(final String name, final String sourcePath) { + this(name, false, sourcePath); } - public ModuleBuilder(final String name, final boolean submodule) { + public ModuleBuilder(final String name, final boolean submodule, final String sourcePath) { super(name, 0, null); this.name = name; - schemaPath = new SchemaPath(Collections. emptyList(), true); - instance = new ModuleImpl(name); + this.sourcePath = sourcePath; this.submodule = submodule; - actualPath.push(this); + actualPath.push(this);//FIXME: this escapes constructor } - public ModuleBuilder(Module base) { - super(base.getName(), 0, null); + public ModuleBuilder(final Module base) { + super(base.getName(), 0, QName.create(base.getQNameModule(), base.getPrefix(), base.getName()), + SCHEMA_PATH, base); this.name = base.getName(); - schemaPath = new SchemaPath(Collections. emptyList(), true); - instance = new ModuleImpl(base.getName()); - submodule = false; - actualPath.push(this); + this.sourcePath = base.getModuleSourcePath(); - namespace = base.getNamespace(); + submodule = false; + yangVersion = base.getYangVersion(); + actualPath.push(this);//FIXME: this escapes constructor prefix = base.getPrefix(); - revision = base.getRevision(); - - for (DataSchemaNode childNode : base.getChildNodes()) { - childNodes.put(childNode.getQName(), childNode); - } + qnameModule = base.getQNameModule(); - typedefs.addAll(base.getTypeDefinitions()); - groupings.addAll(base.getGroupings()); - usesNodes.addAll(base.getUses()); augments.addAll(base.getAugmentations()); rpcs.addAll(base.getRpcs()); notifications.addAll(base.getNotifications()); - identities.addAll(base.getIdentities()); + + for (IdentitySchemaNode identityNode : base.getIdentities()) { + addedIdentities.add(new IdentitySchemaNodeBuilder(name, identityNode)); + } + features.addAll(base.getFeatures()); deviations.addAll(base.getDeviations()); extensions.addAll(base.getExtensionSchemaNodes()); unknownNodes.addAll(base.getUnknownSchemaNodes()); + source = base.getSource(); + } + + @Override + protected String getStatementName() { + return "module"; } /** @@ -124,102 +165,80 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { */ @Override public Module build() { - instance.setPrefix(prefix); - instance.setRevision(revision); - instance.setImports(imports); - instance.setNamespace(namespace); - - // TYPEDEFS - for (TypeDefinitionBuilder tdb : addedTypedefs) { - typedefs.add(tdb.build()); + if(instance != null) { + return instance; } - instance.setTypeDefinitions(typedefs); - // CHILD NODES - for (DataSchemaNodeBuilder child : addedChildNodes) { - DataSchemaNode childNode = child.build(); - childNodes.put(childNode.getQName(), childNode); - } - instance.addChildNodes(childNodes); - - // GROUPINGS - for (GroupingBuilder gb : addedGroupings) { - groupings.add(gb.build()); - } - instance.setGroupings(groupings); - - // USES - for (UsesNodeBuilder unb : addedUsesNodes) { - usesNodes.add(unb.build()); - } - instance.setUses(usesNodes); + buildChildren(); // FEATURES for (FeatureBuilder fb : addedFeatures) { features.add(fb.build()); } - instance.setFeatures(features); // NOTIFICATIONS for (NotificationBuilder entry : addedNotifications) { notifications.add(entry.build()); } - instance.setNotifications(notifications); // AUGMENTATIONS for (AugmentationSchemaBuilder builder : augmentBuilders) { augments.add(builder.build()); } - instance.setAugmentations(augments); // RPCs for (RpcDefinitionBuilder rpc : addedRpcs) { rpcs.add(rpc.build()); } - instance.setRpcs(rpcs); // DEVIATIONS for (DeviationBuilder entry : deviationBuilders) { deviations.add(entry.build()); } - instance.setDeviations(deviations); // EXTENSIONS for (ExtensionBuilder eb : addedExtensions) { extensions.add(eb.build()); } Collections.sort(extensions, Comparators.SCHEMA_NODE_COMP); - instance.setExtensionSchemaNodes(extensions); + // IDENTITIES for (IdentitySchemaNodeBuilder id : addedIdentities) { identities.add(id.build()); } - instance.setIdentities(identities); // UNKNOWN NODES for (UnknownSchemaNodeBuilder unb : addedUnknownNodes) { unknownNodes.add(unb.build()); } Collections.sort(unknownNodes, Comparators.SCHEMA_NODE_COMP); - instance.setUnknownSchemaNodes(unknownNodes); + instance = new ModuleImpl(name, sourcePath, this); return instance; } + public String getModuleSourcePath() { + return sourcePath; + } + @Override - public void setParent(Builder parent) { - throw new YangParseException(name, 0, "Can not set parent to module"); + public ModuleBuilder getParent() { + return parent; + } + + public void setParent(final ModuleBuilder parent) { + this.parent = parent; } @Override - public SchemaPath getPath() { - return schemaPath; + public void setParent(final Builder parent) { + throw new YangParseException(name, 0, "Can not set parent to module"); } @Override - public Set getTypeDefinitionBuilders() { - return addedTypedefs; + public SchemaPath getPath() { + return SCHEMA_PATH; } public void enterNode(final Builder node) { @@ -238,17 +257,6 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } } - public Builder getActualParent() { - if (actualPath.size() < 2) { - return null; - } else { - Builder builderChild = actualPath.removeFirst(); - Builder builderParent = actualPath.peekFirst(); - actualPath.addFirst(builderChild); - return builderParent; - } - } - public Set getDirtyNodes() { return dirtyNodes; } @@ -309,16 +317,28 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return allUnknownNodes; } + public List getAllLists() { + return allLists; + } + public String getName() { return name; } public URI getNamespace() { - return namespace; + return qnameModule.getNamespace(); + } + + public QNameModule getQNameModule() { + return qnameModule; + } + + public void setQNameModule(final QNameModule qnameModule) { + this.qnameModule = Preconditions.checkNotNull(qnameModule); } public void setNamespace(final URI namespace) { - this.namespace = namespace; + this.qnameModule = QNameModule.create(namespace, qnameModule.getRevision()); } public String getPrefix() { @@ -326,7 +346,28 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public Date getRevision() { - return revision; + return qnameModule.getRevision(); + } + + public ModuleImport getImport(final String prefix) { + return imports.get(prefix); + } + + public Map getImports() { + return imports; + } + + public ModuleBuilder getImportedModule(final String prefix) { + return importedModules.get(prefix); + } + + public void addImportedModule(final String prefix, final ModuleBuilder module) { + checkPrefix(prefix); + importedModules.put(prefix, module); + } + + protected String getSource() { + return source; } public boolean isSubmodule() { @@ -337,7 +378,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return belongsTo; } - public void setBelongsTo(String belongsTo) { + public void setBelongsTo(final String belongsTo) { this.belongsTo = belongsTo; } @@ -347,7 +388,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public void setRevision(final Date revision) { - this.revision = revision; + this.qnameModule = QNameModule.create(qnameModule.getNamespace(), revision); } public void setPrefix(final String prefix) { @@ -355,35 +396,35 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public void setYangVersion(final String yangVersion) { - instance.setYangVersion(yangVersion); - } - - public void setDescription(final String description) { - instance.setDescription(description); - } - - public void setReference(final String reference) { - instance.setReference(reference); + this.yangVersion = yangVersion; } public void setOrganization(final String organization) { - instance.setOrganization(organization); + this.organization = organization; } public void setContact(final String contact) { - instance.setContact(contact); + this.contact = contact; } - public boolean addModuleImport(final String moduleName, final Date revision, final String prefix) { + public void addModuleImport(final String moduleName, final Date revision, final String prefix) { + checkPrefix(prefix); + checkNotSealed(); final ModuleImport moduleImport = createModuleImport(moduleName, revision, prefix); - return imports.add(moduleImport); + imports.put(prefix, moduleImport); } - public Set getModuleImports() { - return imports; + private void checkPrefix(final String prefix) { + if (prefix == null || prefix.isEmpty()) { + throw new IllegalArgumentException("Cannot add imported module with undefined prefix"); + } + if (prefix.equals(this.prefix)) { + throw new IllegalArgumentException("Cannot add imported module with prefix equals to module prefix"); + } } public ExtensionBuilder addExtension(final QName qname, final int line, final SchemaPath path) { + checkNotSealed(); Builder parent = getActualNode(); if (!(parent.equals(this))) { throw new YangParseException(name, line, "extension can be defined only in module or submodule"); @@ -395,13 +436,14 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { raiseYangParserException("extension", "node", extName, line, addedExtension.getLine()); } } - final ExtensionBuilder builder = new ExtensionBuilder(name, line, qname, path); + final ExtensionBuilder builder = new ExtensionBuilderImpl(name, line, qname, path); builder.setParent(parent); addedExtensions.add(builder); return builder; } public ContainerSchemaNodeBuilder addContainerNode(final int line, final QName qname, final SchemaPath schemaPath) { + checkNotSealed(); final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); @@ -412,16 +454,19 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public ListSchemaNodeBuilder addListNode(final int line, final QName qname, final SchemaPath schemaPath) { + checkNotSealed(); final ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); builder.setParent(parent); addChildToParent(parent, builder, qname.getLocalName()); + allLists.add(builder); return builder; } public LeafSchemaNodeBuilder addLeafNode(final int line, final QName qname, final SchemaPath schemaPath) { + checkNotSealed(); final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); @@ -432,6 +477,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public LeafListSchemaNodeBuilder addLeafListNode(final int line, final QName qname, final SchemaPath schemaPath) { + checkNotSealed(); final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); @@ -442,6 +488,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public GroupingBuilder addGrouping(final int line, final QName qname, final SchemaPath path) { + checkNotSealed(); final GroupingBuilder builder = new GroupingBuilderImpl(name, line, qname, path); Builder parent = getActualNode(); @@ -449,12 +496,12 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { String groupingName = qname.getLocalName(); if (parent.equals(this)) { - for (GroupingBuilder addedGrouping : addedGroupings) { + for (GroupingBuilder addedGrouping : getGroupingBuilders()) { if (addedGrouping.getQName().getLocalName().equals(groupingName)) { raiseYangParserException("", "Grouping", groupingName, line, addedGrouping.getLine()); } } - addedGroupings.add(builder); + addGrouping(builder); } else { if (parent instanceof DataNodeContainerBuilder) { DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent; @@ -481,8 +528,9 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return builder; } - public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr) { - final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr); + public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr, final int order) { + checkNotSealed(); + final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr, order); Builder parent = getActualNode(); builder.setParent(parent); @@ -514,20 +562,15 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return builder; } - @Override - public void addUsesNode(UsesNodeBuilder usesBuilder) { - addedUsesNodes.add(usesBuilder); - allUsesNodes.add(usesBuilder); - } - public UsesNodeBuilder addUsesNode(final int line, final String groupingPathStr) { + checkNotSealed(); final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, groupingPathStr); Builder parent = getActualNode(); usesBuilder.setParent(parent); if (parent.equals(this)) { - addedUsesNodes.add(usesBuilder); + addUsesNode(usesBuilder); } else { if (!(parent instanceof DataNodeContainerBuilder)) { throw new YangParseException(name, line, "Unresolved parent of uses '" + groupingPathStr + "'."); @@ -542,7 +585,8 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return usesBuilder; } - public void addRefine(final RefineHolder refine) { + public void addRefine(final RefineHolderImpl refine) { + checkNotSealed(); final Builder parent = getActualNode(); if (!(parent instanceof UsesNodeBuilder)) { throw new YangParseException(name, refine.getLine(), "refine can be defined only in uses statement"); @@ -552,6 +596,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public RpcDefinitionBuilder addRpc(final int line, final QName qname, final SchemaPath path) { + checkNotSealed(); Builder parent = getActualNode(); if (!(parent.equals(this))) { throw new YangParseException(name, line, "rpc can be defined only in module or submodule"); @@ -561,26 +606,31 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { rpcBuilder.setParent(parent); String rpcName = qname.getLocalName(); + checkNotConflictingInDataNamespace(rpcName, line); + addedRpcs.add(rpcBuilder); + return rpcBuilder; + } + + private void checkNotConflictingInDataNamespace(final String rpcName, final int line) { + for (DataSchemaNodeBuilder addedChild : getChildNodeBuilders()) { + if (addedChild.getQName().getLocalName().equals(rpcName)) { + raiseYangParserException("rpc", "node", rpcName, line, addedChild.getLine()); + } + } for (RpcDefinitionBuilder rpc : addedRpcs) { if (rpc.getQName().getLocalName().equals(rpcName)) { raiseYangParserException("", "rpc", rpcName, line, rpc.getLine()); } } - for (DataSchemaNodeBuilder addedChild : addedChildNodes) { - if (addedChild.getQName().getLocalName().equals(rpcName)) { - raiseYangParserException("rpc", "node", rpcName, line, addedChild.getLine()); - } - } for (NotificationBuilder addedNotification : addedNotifications) { if (addedNotification.getQName().getLocalName().equals(rpcName)) { raiseYangParserException("rpc", "notification", rpcName, line, addedNotification.getLine()); } } - addedRpcs.add(rpcBuilder); - return rpcBuilder; } public ContainerSchemaNodeBuilder addRpcInput(final int line, final QName qname, final SchemaPath schemaPath) { + checkNotSealed(); final Builder parent = getActualNode(); if (!(parent instanceof RpcDefinitionBuilder)) { throw new YangParseException(name, line, "input can be defined only in rpc statement"); @@ -595,6 +645,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public ContainerSchemaNodeBuilder addRpcOutput(final SchemaPath schemaPath, final QName qname, final int line) { + checkNotSealed(); final Builder parent = getActualNode(); if (!(parent instanceof RpcDefinitionBuilder)) { throw new YangParseException(name, line, "output can be defined only in rpc statement"); @@ -608,32 +659,20 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return outputBuilder; } - public void addNotification(NotificationDefinition notification) { + public void addNotification(final NotificationDefinition notification) { + checkNotSealed(); notifications.add(notification); } public NotificationBuilder addNotification(final int line, final QName qname, final SchemaPath path) { + checkNotSealed(); final Builder parent = getActualNode(); if (!(parent.equals(this))) { throw new YangParseException(name, line, "notification can be defined only in module or submodule"); } String notificationName = qname.getLocalName(); - for (NotificationBuilder nb : addedNotifications) { - if (nb.getQName().equals(qname)) { - raiseYangParserException("", "notification", notificationName, line, nb.getLine()); - } - } - for (RpcDefinitionBuilder rpc : addedRpcs) { - if (rpc.getQName().getLocalName().equals(notificationName)) { - raiseYangParserException("notification", "rpc", notificationName, line, rpc.getLine()); - } - } - for (DataSchemaNodeBuilder addedChild : addedChildNodes) { - if (addedChild.getQName().getLocalName().equals(notificationName)) { - raiseYangParserException("notification", "node", notificationName, line, addedChild.getLine()); - } - } + checkNotConflictingInDataNamespace(notificationName, line); final NotificationBuilder builder = new NotificationBuilder(name, line, qname, path); builder.setParent(parent); @@ -702,14 +741,14 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } @Override - public void addTypedef(TypeDefinitionBuilder typedefBuilder) { + public void addTypedef(final TypeDefinitionBuilder typedefBuilder) { String nodeName = typedefBuilder.getQName().getLocalName(); - for (TypeDefinitionBuilder tdb : addedTypedefs) { + for (TypeDefinitionBuilder tdb : getTypeDefinitionBuilders()) { if (tdb.getQName().getLocalName().equals(nodeName)) { raiseYangParserException("", "typedef", nodeName, typedefBuilder.getLine(), tdb.getLine()); } } - addedTypedefs.add(typedefBuilder); + super.addTypedef(typedefBuilder); } public TypeDefinitionBuilderImpl addTypedef(final int line, final QName qname, final SchemaPath path) { @@ -720,12 +759,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { String typedefName = qname.getLocalName(); if (parent.equals(this)) { - for (TypeDefinitionBuilder tdb : addedTypedefs) { - if (tdb.getQName().getLocalName().equals(typedefName)) { - raiseYangParserException("", "typedef", typedefName, line, tdb.getLine()); - } - } - addedTypedefs.add(builder); + addTypedef(builder); } else { if (parent instanceof DataNodeContainerBuilder) { DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent; @@ -760,7 +794,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { ((TypeAwareBuilder) parent).setType(type); } - public UnionTypeBuilder addUnionType(final int line, final URI namespace, final Date revision) { + public UnionTypeBuilder addUnionType(final int line, final QNameModule module) { final Builder parent = getActualNode(); if (parent == null) { throw new YangParseException(name, line, "Unresolved parent of union type"); @@ -828,9 +862,9 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { allUnknownNodes.add(builder); } - public UnknownSchemaNodeBuilder addUnknownSchemaNode(final int line, final QName qname, final SchemaPath path) { + public UnknownSchemaNodeBuilderImpl addUnknownSchemaNode(final int line, final QName qname, final SchemaPath path) { final Builder parent = getActualNode(); - final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(name, line, qname, path); + final UnknownSchemaNodeBuilderImpl builder = new UnknownSchemaNodeBuilderImpl(name, line, qname, path); builder.setParent(parent); allUnknownNodes.add(builder); @@ -838,11 +872,11 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { addedUnknownNodes.add(builder); } else { if (parent instanceof SchemaNodeBuilder) { - ((SchemaNodeBuilder) parent).addUnknownNodeBuilder(builder); + parent.addUnknownNodeBuilder(builder); } else if (parent instanceof DataNodeContainerBuilder) { - ((DataNodeContainerBuilder) parent).addUnknownNodeBuilder(builder); - } else if (parent instanceof RefineHolder) { - ((RefineHolder) parent).addUnknownNodeBuilder(builder); + parent.addUnknownNodeBuilder(builder); + } else if (parent instanceof RefineHolderImpl) { + parent.addUnknownNodeBuilder(builder); } else { throw new YangParseException(name, line, "Unresolved parent of unknown node '" + qname.getLocalName() + "'"); @@ -873,348 +907,14 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return "module " + name; } - private final class ModuleImpl implements Module { - private URI namespace; - private final String name; - private Date revision; - private String prefix; - private String yangVersion; - private String description; - private String reference; - private String organization; - private String contact; - private final Set imports = new HashSet<>(); - private final Set features = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set> typeDefinitions = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set notifications = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set augmentations = new HashSet<>(); - private final Set rpcs = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set deviations = new HashSet<>(); - private final Map childNodes = new TreeMap<>(Comparators.QNAME_COMP); - private final Set groupings = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final Set uses = new HashSet<>(); - private final List extensionNodes = new ArrayList<>(); - private final Set identities = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - private final List unknownNodes = new ArrayList<>(); - - private ModuleImpl(String name) { - this.name = name; - } - - @Override - public URI getNamespace() { - return namespace; - } - - private void setNamespace(URI namespace) { - this.namespace = namespace; - } - - @Override - public String getName() { - return name; - } - - @Override - public Date getRevision() { - return revision; - } - - private void setRevision(Date revision) { - this.revision = revision; - } - - @Override - public String getPrefix() { - return prefix; - } - - private void setPrefix(String prefix) { - this.prefix = prefix; - } - - @Override - public String getYangVersion() { - return yangVersion; - } - - private void setYangVersion(String yangVersion) { - this.yangVersion = yangVersion; - } - - @Override - public String getDescription() { - return description; - } - - private void setDescription(String description) { - this.description = description; - } - - @Override - public String getReference() { - return reference; - } - - private void setReference(String reference) { - this.reference = reference; - } - - @Override - public String getOrganization() { - return organization; - } - - private void setOrganization(String organization) { - this.organization = organization; - } - - @Override - public String getContact() { - return contact; - } - - private void setContact(String contact) { - this.contact = contact; - } - - @Override - public Set getImports() { - return imports; - } - - private void setImports(Set imports) { - if (imports != null) { - this.imports.addAll(imports); - } - } - - @Override - public Set getFeatures() { - return features; - } - - private void setFeatures(Set features) { - if (features != null) { - this.features.addAll(features); - } - } - - @Override - public Set> getTypeDefinitions() { - return typeDefinitions; - } - - private void setTypeDefinitions(Set> typeDefinitions) { - if (typeDefinitions != null) { - this.typeDefinitions.addAll(typeDefinitions); - } - } - - @Override - public Set getNotifications() { - return notifications; - } - - private void setNotifications(Set notifications) { - if (notifications != null) { - this.notifications.addAll(notifications); - } - } - - @Override - public Set getAugmentations() { - return augmentations; - } - - private void setAugmentations(Set augmentations) { - if (augmentations != null) { - this.augmentations.addAll(augmentations); - } - } - - @Override - public Set getRpcs() { - return rpcs; - } - - private void setRpcs(Set rpcs) { - if (rpcs != null) { - this.rpcs.addAll(rpcs); - } - } - - @Override - public Set getDeviations() { - return deviations; - } - - private void setDeviations(Set deviations) { - if (deviations != null) { - this.deviations.addAll(deviations); - } - } - - @Override - public Set getChildNodes() { - final Set result = new TreeSet<>(Comparators.SCHEMA_NODE_COMP); - result.addAll(childNodes.values()); - return Collections.unmodifiableSet(result); - } - - private void addChildNodes(Map childNodes) { - if (childNodes != null) { - this.childNodes.putAll(childNodes); - } - } - - @Override - public Set getGroupings() { - return groupings; - } - - private void setGroupings(Set groupings) { - if (groupings != null) { - this.groupings.addAll(groupings); - } - } - - @Override - public Set getUses() { - return uses; - } - - private void setUses(Set uses) { - if (uses != null) { - this.uses.addAll(uses); - } - } - - @Override - public List getExtensionSchemaNodes() { - Collections.sort(extensionNodes, Comparators.SCHEMA_NODE_COMP); - return extensionNodes; - } - - private void setExtensionSchemaNodes(final List extensionNodes) { - if (extensionNodes != null) { - this.extensionNodes.addAll(extensionNodes); - } - } - - @Override - public Set getIdentities() { - return identities; - } - - private void setIdentities(final Set identities) { - if (identities != null) { - this.identities.addAll(identities); - } - } - - @Override - public List getUnknownSchemaNodes() { - return unknownNodes; - } - - private void setUnknownSchemaNodes(final List unknownNodes) { - if (unknownNodes != null) { - this.unknownNodes.addAll(unknownNodes); - } - } - - @Override - public DataSchemaNode getDataChildByName(QName name) { - return childNodes.get(name); - } - - @Override - public DataSchemaNode getDataChildByName(String name) { - DataSchemaNode result = null; - for (Map.Entry entry : childNodes.entrySet()) { - if (entry.getKey().getLocalName().equals(name)) { - result = entry.getValue(); - break; - } - } - return result; - } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - 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()); - return result; - } - - @Override - public boolean equals(Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - ModuleImpl other = (ModuleImpl) obj; - if (namespace == null) { - if (other.namespace != null) { - return false; - } - } else if (!namespace.equals(other.namespace)) { - return false; - } - if (name == null) { - if (other.name != null) { - return false; - } - } else if (!name.equals(other.name)) { - return false; - } - if (revision == null) { - if (other.revision != null) { - return false; - } - } else if (!revision.equals(other.revision)) { - return false; - } - if (prefix == null) { - if (other.prefix != null) { - return false; - } - } else if (!prefix.equals(other.prefix)) { - return false; - } - if (yangVersion == null) { - if (other.yangVersion != null) { - return false; - } - } else if (!yangVersion.equals(other.yangVersion)) { - return false; - } - return true; + public void setSource(final ByteSource byteSource) throws IOException { + try (InputStream stream = byteSource.openStream()) { + setSource(IOUtils.toString(stream)); } + } - @Override - public String toString() { - StringBuilder sb = new StringBuilder(ModuleImpl.class.getSimpleName()); - sb.append("["); - sb.append("name=" + name); - sb.append(", namespace=" + namespace); - sb.append(", revision=" + revision); - sb.append(", prefix=" + prefix); - sb.append(", yangVersion=" + yangVersion); - sb.append("]"); - return sb.toString(); - } + public void setSource(final String source) { + this.source = source; } /** @@ -1235,6 +935,18 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } } + public String getYangVersion() { + return yangVersion; + } + + public String getContact() { + return contact; + } + + public String getOrganization() { + return organization; + } + /** * Adds child node child to the set of nodes child nodes. * @@ -1256,7 +968,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { // notifications, and anyxmls defined within a parent node or at the // top level of the module or its submodules share the same // identifier namespace. - for (DataSchemaNodeBuilder childNode : addedChildNodes) { + for (DataSchemaNodeBuilder childNode : getChildNodeBuilders()) { if (childNode.getQName().getLocalName().equals(childName)) { raiseYangParserException("'" + child + "'", "node", childName, lineNum, childNode.getLine()); } @@ -1271,7 +983,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { raiseYangParserException("'" + child + "'", "notification", childName, lineNum, notification.getLine()); } } - addedChildNodes.add(child); + addChildNode(child); } /** @@ -1318,8 +1030,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } private ModuleImport createModuleImport(final String moduleName, final Date revision, final String prefix) { - final ModuleImport moduleImport = new ModuleImportImpl(moduleName, revision, prefix); - return moduleImport; + return new ModuleImportImpl(moduleName, revision, prefix); } private void raiseYangParserException(final String cantAddType, final String type, final String name, @@ -1334,7 +1045,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { String msg = String.format("%s%s with same name '%s' already declared at line %d.", msgPrefix, type, name, duplicateLine); - throw new YangParseException(moduleName, currentLine, msg); + throw new YangParseException(getModuleName(), currentLine, msg); } @Override @@ -1342,15 +1053,14 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); - result = prime * result + ((namespace == null) ? 0 : namespace.hashCode()); - result = prime * result + ((revision == null) ? 0 : revision.hashCode()); + result = prime * result + qnameModule.hashCode(); result = prime * result + ((prefix == null) ? 0 : prefix.hashCode()); return result; } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } @@ -1368,11 +1078,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } else if (!name.equals(other.name)) { return false; } - if (namespace == null) { - if (other.namespace != null) { - return false; - } - } else if (!namespace.equals(other.namespace)) { + if (!qnameModule.equals(other.qnameModule)) { return false; } if (prefix == null) { @@ -1382,14 +1088,10 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } else if (!prefix.equals(other.prefix)) { return false; } - if (revision == null) { - if (other.revision != null) { - return false; - } - } else if (!revision.equals(other.revision)) { - return false; - } return true; } + public List getExtensionInstances() { + return unknownNodes; + } }