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=f8de37a57c85384377e59747eaf3538df52d5ec9;hb=5764d0f70d796fdd270c2dedcbedd38161238516;hp=9650deb85fa9abf715ca69ccd31a600b21a3f29e;hpb=c55f8bfc72c8766b1c4ca1d41e559e2cac171a88;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..f8de37a57c 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,15 +1,18 @@ /* - * 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; @@ -20,13 +23,13 @@ import java.util.List; 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,23 @@ 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 Set imports = new HashSet<>(); private final Set augments = new LinkedHashSet<>(); private final List augmentBuilders = new ArrayList<>(); @@ -110,11 +104,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 +121,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, new QName(base.getNamespace(), base.getRevision(), base.getPrefix(), 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(); - - 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()); @@ -162,6 +149,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 +162,56 @@ 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) { - childNodes.put(child.getQName(), child.build()); - } - instance.addChildNodes(childNodes.values()); - - // 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.setSource(source); + instance = new ModuleImpl(name, sourcePath, this); return instance; } @@ -258,18 +220,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 +323,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 +343,15 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public Date getRevision() { - return revision; + return qnameModule.getRevision(); + } + + protected Set getImports() { + return imports; + } + + protected String getSource() { + return source; } public boolean isSubmodule() { @@ -390,7 +372,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,26 +380,19 @@ 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) { + checkNotSealed(); final ModuleImport moduleImport = createModuleImport(moduleName, revision, prefix); return imports.add(moduleImport); } @@ -427,6 +402,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } 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 +414,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 +432,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 +444,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 +455,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 +466,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 +474,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; @@ -526,6 +507,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } 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(); @@ -558,20 +540,15 @@ 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) { + 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 + "'."); @@ -586,7 +563,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 +574,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 +584,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 +623,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 +638,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 +721,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 +737,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; @@ -872,9 +840,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 +850,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 +885,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 +913,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 +946,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 +961,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { raiseYangParserException("'" + child + "'", "notification", childName, lineNum, notification.getLine()); } } - addedChildNodes.add(child); + addChildNode(child); } /** @@ -1365,8 +1008,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 +1031,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 +1056,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 +1066,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; + } }