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=aa85be959c313ee999d6e48daeb0104598e77749;hb=774cfc9c95b20bad92b33a6398793c940f1339a2;hp=9650deb85fa9abf715ca69ccd31a600b21a3f29e;hpb=0d123fd7b44c8f857f5b396587c9ca13851213af;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 9650deb85f..aa85be959c 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,32 +1,35 @@ /* - * 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 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.Collection; 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.common.QNameModule; import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; 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.GroupingDefinition; import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; import org.opendaylight.yangtools.yang.model.api.Module; import org.opendaylight.yangtools.yang.model.api.ModuleImport; @@ -35,20 +38,21 @@ 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.api.UsesNode; -import org.opendaylight.yangtools.yang.parser.builder.api.AbstractDataNodeContainerBuilder; +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.util.Comparators; -import org.opendaylight.yangtools.yang.parser.util.ModuleImportImpl; -import org.opendaylight.yangtools.yang.parser.util.RefineHolder; +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; /** @@ -56,33 +60,28 @@ 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 String sourcePath; - private final SchemaPath schemaPath; - private URI namespace; + 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; - @Override - public ModuleBuilder getParent() { - return parent; - } - - public void setParent(final 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<>(); + + final Set addedSubmodules = new HashSet<>(); + final Set submodules = new HashSet<>(); + final Map includedModules = new HashMap<>(); private final Set augments = new LinkedHashSet<>(); private final List augmentBuilders = new ArrayList<>(); @@ -110,11 +109,14 @@ 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(); + private final List allLists = new ArrayList<>(); private String source; + private String yangVersion; + private String organization; + private String contact; public ModuleBuilder(final String name, final String sourcePath) { this(name, false, sourcePath); @@ -124,32 +126,22 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { super(name, 0, null); this.name = name; this.sourcePath = sourcePath; - schemaPath = SchemaPath.create(Collections. emptyList(), true); this.submodule = submodule; - instance = new ModuleImpl(name, sourcePath); - actualPath.push(this); + actualPath.push(this);//FIXME: this escapes constructor } public ModuleBuilder(final Module base) { - super(base.getName(), 0, null); + super(base.getName(), 0, QName.create(base.getQNameModule(), base.getName()), + SCHEMA_PATH, base); this.name = base.getName(); this.sourcePath = base.getModuleSourcePath(); - schemaPath = SchemaPath.create(Collections. emptyList(), true); + submodule = false; - instance = new ModuleImpl(base.getName(), base.getModuleSourcePath()); - instance.setYangVersion(base.getYangVersion()); - actualPath.push(this); - namespace = base.getNamespace(); + yangVersion = base.getYangVersion(); + actualPath.push(this);//FIXME: this escapes constructor prefix = base.getPrefix(); - revision = base.getRevision(); + qnameModule = base.getQNameModule(); - for (DataSchemaNode childNode : base.getChildNodes()) { - childNodes.put(childNode.getQName(), childNode); - } - - typedefs.addAll(base.getTypeDefinitions()); - groupings.addAll(base.getGroupings()); - usesNodes.addAll(base.getUses()); augments.addAll(base.getAugmentations()); rpcs.addAll(base.getRpcs()); notifications.addAll(base.getNotifications()); @@ -162,6 +154,12 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { deviations.addAll(base.getDeviations()); extensions.addAll(base.getExtensionSchemaNodes()); unknownNodes.addAll(base.getUnknownSchemaNodes()); + source = base.getSource(); + } + + @Override + protected String getStatementName() { + return "module"; } /** @@ -169,87 +167,61 @@ 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()); - } - instance.setTypeDefinitions(typedefs); - - // CHILD NODES - for (DataSchemaNodeBuilder child : addedChildNodes) { - childNodes.put(child.getQName(), child.build()); + if(instance != null) { + return instance; } - instance.addChildNodes(childNodes.values()); - // GROUPINGS - for (GroupingBuilder gb : addedGroupings) { - groupings.add(gb.build()); - } - instance.setGroupings(groupings); + buildChildren(); - // USES - for (UsesNodeBuilder unb : addedUsesNodes) { - usesNodes.add(unb.build()); + // SUBMODULES + for (ModuleBuilder submodule : addedSubmodules) { + submodules.add(submodule.build()); } - instance.setUses(usesNodes); // 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.setSource(source); + instance = new ModuleImpl(name, sourcePath, this); return instance; } @@ -258,18 +230,22 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } @Override - public void setParent(final 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) { @@ -357,11 +333,19 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } 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() { @@ -369,7 +353,40 @@ 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); + } + + public Map getIncludedModules() { + return includedModules; + } + + public void addInclude(final String name, final Date revision) { + includedModules.put(name, revision); + } + + public void addSubmodule(final ModuleBuilder submodule) { + addedSubmodules.add(submodule); + } + + protected String getSource() { + return source; } public boolean isSubmodule() { @@ -390,7 +407,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) { @@ -398,35 +415,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"); @@ -438,13 +455,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(); @@ -455,6 +473,7 @@ 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(); @@ -466,6 +485,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } 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(); @@ -476,6 +496,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(); @@ -486,6 +507,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(); @@ -493,12 +515,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; @@ -525,8 +547,11 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return builder; } - public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr, final int order) { - final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr, order); + public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr, + final SchemaPath targetPath, final int order) { + checkNotSealed(); + final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr, + targetPath, order); Builder parent = getActualNode(); builder.setParent(parent); @@ -558,23 +583,18 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return builder; } - @Override - public void addUsesNode(final UsesNodeBuilder usesBuilder) { - addedUsesNodes.add(usesBuilder); - allUsesNodes.add(usesBuilder); - } - - public UsesNodeBuilder addUsesNode(final int line, final String groupingPathStr) { - final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, groupingPathStr); + public UsesNodeBuilder addUsesNode(final int line, final SchemaPath grouping) { + checkNotSealed(); + final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, grouping); 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 + "'."); + throw new YangParseException(name, line, "Unresolved parent of uses '" + grouping + "'."); } ((DataNodeContainerBuilder) parent).addUsesNode(usesBuilder); } @@ -586,7 +606,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"); @@ -596,6 +617,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"); @@ -605,26 +627,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"); @@ -639,6 +666,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"); @@ -653,31 +681,19 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } 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); @@ -748,12 +764,12 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { @Override 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) { @@ -764,12 +780,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; @@ -804,7 +815,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"); @@ -836,7 +847,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } } - public DeviationBuilder addDeviation(final int line, final String targetPath) { + public DeviationBuilder addDeviation(final int line, final SchemaPath targetPath) { Builder parent = getActualNode(); if (!(parent.equals(this))) { throw new YangParseException(name, line, "deviation can be defined only in module or submodule"); @@ -872,9 +883,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); @@ -882,11 +893,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() + "'"); @@ -917,351 +928,14 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return "module " + name; } - public void setSource(final String source) { - this.source = source; - } - - public static final class ModuleImpl implements Module { - private URI namespace; - private final String name; - private final String sourcePath; - 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 Set childNodes = new TreeSet<>(Comparators.SCHEMA_NODE_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 String source; - - private ModuleImpl(final String name, final String sourcePath) { - this.name = name; - this.sourcePath = sourcePath; - } - - @Override - public String getModuleSourcePath() { - return sourcePath; - } - - @Override - public URI getNamespace() { - return namespace; - } - - private void setNamespace(final URI namespace) { - this.namespace = namespace; - } - - @Override - public String getName() { - return name; - } - - @Override - public Date getRevision() { - return revision; - } - - private void setRevision(final Date revision) { - this.revision = revision; - } - - @Override - public String getPrefix() { - return prefix; - } - - private void setPrefix(final String prefix) { - this.prefix = prefix; - } - - @Override - public String getYangVersion() { - return yangVersion; - } - - private void setYangVersion(final String yangVersion) { - this.yangVersion = yangVersion; - } - - @Override - public String getDescription() { - return description; - } - - private void setDescription(final String description) { - this.description = description; - } - - @Override - public String getReference() { - return reference; - } - - private void setReference(final String reference) { - this.reference = reference; - } - - @Override - public String getOrganization() { - return organization; - } - - private void setOrganization(final String organization) { - this.organization = organization; - } - - @Override - public String getContact() { - return contact; - } - - private void setContact(final String contact) { - this.contact = contact; - } - - @Override - public Set getImports() { - return imports; - } - - private void setImports(final Set imports) { - if (imports != null) { - this.imports.addAll(imports); - } - } - - @Override - public Set getFeatures() { - return features; - } - - private void setFeatures(final Set features) { - if (features != null) { - this.features.addAll(features); - } - } - - @Override - public Set> getTypeDefinitions() { - return typeDefinitions; - } - - private void setTypeDefinitions(final Set> typeDefinitions) { - if (typeDefinitions != null) { - this.typeDefinitions.addAll(typeDefinitions); - } - } - - @Override - public Set getNotifications() { - return notifications; - } - - private void setNotifications(final Set notifications) { - if (notifications != null) { - this.notifications.addAll(notifications); - } - } - - @Override - public Set getAugmentations() { - return augmentations; - } - - private void setAugmentations(final Set augmentations) { - if (augmentations != null) { - this.augmentations.addAll(augmentations); - } - } - - @Override - public Set getRpcs() { - return rpcs; - } - - private void setRpcs(final Set rpcs) { - if (rpcs != null) { - this.rpcs.addAll(rpcs); - } - } - - @Override - public Set getDeviations() { - return deviations; - } - - private void setDeviations(final Set deviations) { - if (deviations != null) { - this.deviations.addAll(deviations); - } - } - - @Override - public Set getChildNodes() { - return Collections.unmodifiableSet(childNodes); - } - - private void addChildNodes(final Collection childNodes) { - if (childNodes != null) { - this.childNodes.addAll(childNodes); - } - } - - @Override - public Set getGroupings() { - return groupings; - } - - private void setGroupings(final Set groupings) { - if (groupings != null) { - this.groupings.addAll(groupings); - } - } - - @Override - public Set getUses() { - return uses; - } - - private void setUses(final 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(final QName name) { - return getChildNode(childNodes, name); - } - - @Override - public DataSchemaNode getDataChildByName(final String name) { - return getChildNode(childNodes, name); - } - - void setSource(final String source){ - this.source = source; - } - - public String getSource() { - return source; - } - - @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 + ((yangVersion == null) ? 0 : yangVersion.hashCode()); - return result; - } - - @Override - public boolean equals(final 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 (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; } /** @@ -1282,6 +956,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. * @@ -1303,7 +989,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()); } @@ -1318,7 +1004,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { raiseYangParserException("'" + child + "'", "notification", childName, lineNum, notification.getLine()); } } - addedChildNodes.add(child); + addChildNode(child); } /** @@ -1365,8 +1051,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, @@ -1389,8 +1074,7 @@ 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; @@ -1415,11 +1099,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) { @@ -1429,15 +1109,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; + } }