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=0ca1eb88f62c859efcf31bd24a6aa5706a732cc8;hb=0dab204f1b81c5f0f500bc7f4bc3301b321288c3;hp=36ff7bfe6afae2ee856145a11f892b2d8e8f6764;hpb=9afdf7db8113ce85705e237d9e4cade1bb087561;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 36ff7bfe6a..0ca1eb88f6 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,54 @@ /* - * 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.io.ByteSource; +import java.io.IOException; +import java.io.InputStream; import java.net.URI; -import java.util.*; - +import java.util.ArrayList; +import java.util.Collections; +import java.util.Date; +import java.util.Deque; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.LinkedList; +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.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.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,11 +56,12 @@ 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 final String sourcePath; + private static final SchemaPath SCHEMA_PATH = SchemaPath.create(Collections. emptyList(), true); private URI namespace; private String prefix; private Date revision; @@ -36,20 +70,12 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { 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 Set imports = new HashSet<>(); - 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 +101,58 @@ 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, new QName(base.getNamespace(), base.getRevision(), 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(); + submodule = false; + yangVersion = base.getYangVersion(); + actualPath.push(this);//FIXME: this escapes constructor namespace = base.getNamespace(); prefix = base.getPrefix(); revision = base.getRevision(); - for (DataSchemaNode childNode : base.getChildNodes()) { - childNodes.add(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()); - 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,101 +160,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()); - } - instance.setTypeDefinitions(typedefs); - - // CHILD NODES - for (DataSchemaNodeBuilder child : addedChildNodes) { - childNodes.add(child.build()); - } - instance.addChildNodes(childNodes); - - // GROUPINGS - for (GroupingBuilder gb : addedGroupings) { - groupings.add(gb.build()); + if(instance != null) { + return instance; } - 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) { @@ -237,17 +252,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; } @@ -308,6 +312,10 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return allUnknownNodes; } + public List getAllLists() { + return allLists; + } + public String getName() { return name; } @@ -328,6 +336,14 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return revision; } + protected Set getImports() { + return imports; + } + + protected String getSource() { + return source; + } + public boolean isSubmodule() { return submodule; } @@ -336,7 +352,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return belongsTo; } - public void setBelongsTo(String belongsTo) { + public void setBelongsTo(final String belongsTo) { this.belongsTo = belongsTo; } @@ -354,26 +370,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); } @@ -383,6 +392,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"); @@ -394,13 +404,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(); @@ -411,16 +422,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(); @@ -431,6 +445,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(); @@ -441,6 +456,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(); @@ -448,12 +464,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; @@ -480,8 +496,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); @@ -513,20 +530,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 + "'."); @@ -541,7 +553,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"); @@ -551,6 +564,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"); @@ -560,26 +574,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"); @@ -594,6 +613,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"); @@ -607,32 +627,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); @@ -701,14 +709,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) { @@ -719,12 +727,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; @@ -827,9 +830,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); @@ -837,11 +840,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() + "'"); @@ -872,339 +875,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 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 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() { - return Collections.unmodifiableSet(childNodes); - } - - private void addChildNodes(Set childNodes) { - if (childNodes != null) { - this.childNodes.addAll(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 getChildNode(childNodes, name); - } - - @Override - public DataSchemaNode getDataChildByName(String name) { - return getChildNode(childNodes, name); - } - - @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(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; } /** @@ -1225,6 +903,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. * @@ -1246,7 +936,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()); } @@ -1261,7 +951,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { raiseYangParserException("'" + child + "'", "notification", childName, lineNum, notification.getLine()); } } - addedChildNodes.add(child); + addChildNode(child); } /** @@ -1308,8 +998,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, @@ -1324,7 +1013,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 @@ -1340,7 +1029,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } @Override - public boolean equals(Object obj) { + public boolean equals(final Object obj) { if (this == obj) { return true; } @@ -1382,4 +1071,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return true; } + public List getExtensionInstances() { + return unknownNodes; + } }