From ac39de5a9b96438d30df745895454c02e15e51e3 Mon Sep 17 00:00:00 2001 From: Martin Vitez Date: Tue, 16 Jul 2013 10:48:18 +0200 Subject: [PATCH] Added more descriptive parsing exceptions. Added module name to all builders to help create detailed exception messages. Added new abstract class AbstracBuilder as base implementation of Builder interface. Added more tests. Signed-off-by: Martin Vitez --- .../parser/builder/api/AbstractBuilder.java | 71 +++++ .../api/AbstractDataNodeContainerBuilder.java | 66 ++--- .../api/AbstractSchemaNodeBuilder.java | 36 +-- .../builder/api/AbstractTypeAwareBuilder.java | 44 +-- .../yang/parser/builder/api/Builder.java | 14 + .../parser/builder/impl/AnyXmlBuilder.java | 8 +- .../impl/AugmentationSchemaBuilderImpl.java | 8 +- .../parser/builder/impl/ChoiceBuilder.java | 52 +++- .../builder/impl/ChoiceCaseBuilder.java | 10 +- .../builder/impl/ConstraintsBuilder.java | 28 +- .../impl/ContainerSchemaNodeBuilder.java | 17 +- .../parser/builder/impl/DeviationBuilder.java | 61 +---- .../parser/builder/impl/ExtensionBuilder.java | 4 +- .../parser/builder/impl/FeatureBuilder.java | 4 +- .../builder/impl/GroupingBuilderImpl.java | 117 +------- .../impl/IdentitySchemaNodeBuilder.java | 4 +- .../builder/impl/IdentityrefTypeBuilder.java | 32 +-- .../impl/LeafListSchemaNodeBuilder.java | 9 +- .../builder/impl/LeafSchemaNodeBuilder.java | 8 +- .../builder/impl/ListSchemaNodeBuilder.java | 16 +- .../parser/builder/impl/ModuleBuilder.java | 256 +++++++++++------- .../builder/impl/NotificationBuilder.java | 4 +- .../builder/impl/RpcDefinitionBuilder.java | 4 +- .../impl/TypeDefinitionBuilderImpl.java | 6 +- .../parser/builder/impl/UnionTypeBuilder.java | 25 +- .../impl/UnknownSchemaNodeBuilder.java | 6 +- .../builder/impl/UsesNodeBuilderImpl.java | 28 +- .../yang/parser/impl/YangParserImpl.java | 28 +- .../parser/impl/YangParserListenerImpl.java | 14 +- .../yang/parser/util/ParserListenerUtils.java | 107 ++++---- .../yang/parser/util/ParserUtils.java | 48 ++-- .../yang/parser/util/RefineHolder.java | 42 +-- .../yang/parser/util/RefineUtils.java | 110 ++++---- .../yang/parser/util/TypeConstraints.java | 8 +- .../yang/parser/util/YangParseException.java | 14 +- .../parser/impl/YangParserNegativeTest.java | 51 +++- .../yang/parser/impl/YangParserTest.java | 2 +- .../src/test/resources/model/types.yang | 31 ++- .../negative-scenario/duplicity/augment0.yang | 25 ++ .../negative-scenario/duplicity/augment1.yang | 16 ++ .../negative-scenario/duplicity/augment2.yang | 14 + 41 files changed, 716 insertions(+), 732 deletions(-) create mode 100644 opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractBuilder.java create mode 100644 opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment0.yang create mode 100644 opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment1.yang create mode 100644 opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment2.yang diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractBuilder.java new file mode 100644 index 0000000000..786a7ec245 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractBuilder.java @@ -0,0 +1,71 @@ +/* + * 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.controller.yang.parser.builder.api; + +import java.util.ArrayList; +import java.util.List; + +import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; +import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder; + +/** + * Basic implementation of Builder. + */ +public abstract class AbstractBuilder implements Builder { + protected String moduleName; + protected final int line; + protected Builder parent; + + protected List unknownNodes; + protected final List addedUnknownNodes = new ArrayList(); + + protected AbstractBuilder(final String moduleName, final int line) { + this.moduleName = moduleName; + this.line = line; + } + + @Override + public String getModuleName() { + return moduleName; + } + + @Override + public void setModuleName(final String moduleName) { + this.moduleName = moduleName; + } + + @Override + public int getLine() { + return line; + } + + @Override + public Builder getParent() { + return parent; + } + + @Override + public void setParent(final Builder parent) { + this.parent = parent; + } + + @Override + public List getUnknownNodeBuilders() { + return addedUnknownNodes; + } + + @Override + public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { + addedUnknownNodes.add(unknownNode); + } + + public void setUnknownNodes(List unknownNodes) { + this.unknownNodes = unknownNodes; + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java index df85c5cbf0..d6867ce735 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractDataNodeContainerBuilder.java @@ -7,26 +7,20 @@ */ package org.opendaylight.controller.yang.parser.builder.api; -import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; -import java.util.List; import java.util.Set; import org.opendaylight.controller.yang.common.QName; import org.opendaylight.controller.yang.model.api.DataSchemaNode; import org.opendaylight.controller.yang.model.api.GroupingDefinition; -import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; -import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder; import org.opendaylight.controller.yang.parser.util.YangParseException; /** * Basic implementation of DataNodeContainerBuilder. */ -public abstract class AbstractDataNodeContainerBuilder implements DataNodeContainerBuilder { - protected final int line; +public abstract class AbstractDataNodeContainerBuilder extends AbstractBuilder implements DataNodeContainerBuilder { protected final QName qname; - protected Builder parent; protected Set childNodes; protected final Set addedChildNodes = new HashSet(); @@ -34,29 +28,11 @@ public abstract class AbstractDataNodeContainerBuilder implements DataNodeContai protected Set groupings; protected final Set addedGroupings = new HashSet(); - protected List unknownNodes; - protected final List addedUnknownNodes = new ArrayList(); - - protected AbstractDataNodeContainerBuilder(final int line, final QName qname) { - this.line = line; + protected AbstractDataNodeContainerBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line); this.qname = qname; } - @Override - public int getLine() { - return line; - } - - @Override - public Builder getParent() { - return parent; - } - - @Override - public void setParent(final Builder parent) { - this.parent = parent; - } - @Override public QName getQName() { return qname; @@ -91,9 +67,12 @@ public abstract class AbstractDataNodeContainerBuilder implements DataNodeContai @Override public void addChildNode(DataSchemaNodeBuilder child) { - for (DataSchemaNodeBuilder childNode : addedChildNodes) { - if (childNode.getQName().getLocalName().equals(child.getQName().getLocalName())) { - throw new YangParseException(child.getLine(), "Duplicate node found at line " + childNode.getLine()); + String childName = child.getQName().getLocalName(); + for (DataSchemaNodeBuilder addedChildNode : addedChildNodes) { + if (addedChildNode.getQName().getLocalName().equals(childName)) { + throw new YangParseException(child.getModuleName(), child.getLine(), "Can not add '" + child + + "' to node '" + qname.getLocalName() + "' in module '" + moduleName + + "': node with same name already declared at line " + addedChildNode.getLine()); } } addedChildNodes.add(child); @@ -116,27 +95,16 @@ public abstract class AbstractDataNodeContainerBuilder implements DataNodeContai } @Override - public void addGrouping(GroupingBuilder groupingBuilder) { - for (GroupingBuilder gb : addedGroupings) { - if (gb.getQName().getLocalName().equals(groupingBuilder.getQName().getLocalName())) { - throw new YangParseException(groupingBuilder.getLine(), "Duplicate node found at line " + gb.getLine()); + public void addGrouping(GroupingBuilder grouping) { + String groupingName = grouping.getQName().getLocalName(); + for (GroupingBuilder addedGrouping : addedGroupings) { + if (addedGrouping.getQName().getLocalName().equals(groupingName)) { + throw new YangParseException(grouping.getModuleName(), grouping.getLine(), "Can not add '" + grouping + + "': grouping with same name already declared in module '" + moduleName + "' at line " + + addedGrouping.getLine()); } } - addedGroupings.add(groupingBuilder); - } - - @Override - public List getUnknownNodeBuilders() { - return addedUnknownNodes; - } - - @Override - public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { - addedUnknownNodes.add(unknownNode); - } - - public void setUnknownNodes(List unknownNodes) { - this.unknownNodes = unknownNodes; + addedGroupings.add(grouping); } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractSchemaNodeBuilder.java index a786cd9ad7..2727bc9533 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractSchemaNodeBuilder.java @@ -7,53 +7,33 @@ */ package org.opendaylight.controller.yang.parser.builder.api; -import java.util.ArrayList; import java.util.List; import org.opendaylight.controller.yang.common.QName; import org.opendaylight.controller.yang.model.api.SchemaPath; import org.opendaylight.controller.yang.model.api.Status; import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; -import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder; /** * Basic implementation of SchemaNodeBuilder. */ -public abstract class AbstractSchemaNodeBuilder implements SchemaNodeBuilder { - protected final int line; +public abstract class AbstractSchemaNodeBuilder extends AbstractBuilder implements SchemaNodeBuilder { protected final QName qname; - protected Builder parent; protected SchemaPath schemaPath; protected String description; protected String reference; protected Status status = Status.CURRENT; protected List unknownNodes; - protected final List addedUnknownNodes = new ArrayList(); - protected AbstractSchemaNodeBuilder(final int line, final QName qname) { - this.line = line; + protected AbstractSchemaNodeBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line); this.qname = qname; } - @Override - public int getLine() { - return line; - } - public QName getQName() { return qname; } - @Override - public Builder getParent() { - return parent; - } - - @Override - public void setParent(final Builder parent) { - this.parent = parent; - } - @Override public SchemaPath getPath() { return schemaPath; @@ -96,16 +76,6 @@ public abstract class AbstractSchemaNodeBuilder implements SchemaNodeBuilder { } } - @Override - public List getUnknownNodeBuilders() { - return addedUnknownNodes; - } - - @Override - public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { - addedUnknownNodes.add(unknownNode); - } - public void setUnknownNodes(List unknownNodes) { this.unknownNodes = unknownNodes; } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractTypeAwareBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractTypeAwareBuilder.java index 3e8dc6c8b0..23ded94c40 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractTypeAwareBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/AbstractTypeAwareBuilder.java @@ -7,46 +7,22 @@ */ package org.opendaylight.controller.yang.parser.builder.api; -import java.util.ArrayList; -import java.util.List; - import org.opendaylight.controller.yang.common.QName; import org.opendaylight.controller.yang.model.api.TypeDefinition; -import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; -import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder; /** * Basic implementation for TypeAwareBuilder builders. */ -public abstract class AbstractTypeAwareBuilder implements TypeAwareBuilder { - protected final int line; +public abstract class AbstractTypeAwareBuilder extends AbstractBuilder implements TypeAwareBuilder { protected final QName qname; - protected Builder parent; protected TypeDefinition type; protected TypeDefinitionBuilder typedef; - protected List unknownNodes; - protected final List addedUnknownNodes = new ArrayList(); - public AbstractTypeAwareBuilder(final int line, final QName qname) { - this.line = line; + public AbstractTypeAwareBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line); this.qname = qname; } - @Override - public int getLine() { - return line; - } - - @Override - public Builder getParent() { - return parent; - } - - @Override - public void setParent(final Builder parent) { - this.parent = parent; - } - @Override public QName getQName() { return qname; @@ -74,18 +50,4 @@ public abstract class AbstractTypeAwareBuilder implements TypeAwareBuilder { this.type = null; } - @Override - public List getUnknownNodeBuilders() { - return addedUnknownNodes; - } - - @Override - public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { - addedUnknownNodes.add(unknownNode); - } - - public void setUnknownNodes(List unknownNodes) { - this.unknownNodes = unknownNodes; - } - } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java index eb23eaba10..b849f20d2f 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/api/Builder.java @@ -16,6 +16,20 @@ import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBui */ public interface Builder { + /** + * Get name of module in which this node is declared. + * + * @return module name + */ + String getModuleName(); + + /** + * Set name of module in which this node is declared. + * + * @param moduleName + */ + void setModuleName(String moduleName); + /** * Get current line in yang file. * diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java index 42f714b8fc..6b6063cc95 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AnyXmlBuilder.java @@ -31,15 +31,15 @@ public final class AnyXmlBuilder extends AbstractSchemaNodeBuilder implements Da private boolean augmenting; private boolean addedByUses; - public AnyXmlBuilder(final int line, final QName qname, final SchemaPath schemaPath) { - super(line, qname); + public AnyXmlBuilder(final String moduleName, final int line, final QName qname, final SchemaPath schemaPath) { + super(moduleName, line, qname); this.schemaPath = schemaPath; instance = new AnyXmlSchemaNodeImpl(qname); - constraints = new ConstraintsBuilder(line); + constraints = new ConstraintsBuilder(moduleName, line); } public AnyXmlBuilder(final AnyXmlBuilder builder) { - super(builder.getLine(), builder.getQName()); + super(builder.getModuleName(), builder.getLine(), builder.getQName()); parent = builder.getParent(); instance = new AnyXmlSchemaNodeImpl(qname); constraints = builder.getConstraints(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java index 6d8b78919b..cdb751f81b 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/AugmentationSchemaBuilderImpl.java @@ -54,8 +54,8 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain private final Set usesNodes = new HashSet(); private boolean resolved; - AugmentationSchemaBuilderImpl(final int line, final String augmentTargetStr) { - super(line, null); + AugmentationSchemaBuilderImpl(final String moduleName, final int line, final String augmentTargetStr) { + super(moduleName, line, null); this.augmentTargetStr = augmentTargetStr; final SchemaPath targetPath = ParserListenerUtils.parseAugmentPath(augmentTargetStr); dirtyAugmentTarget = targetPath; @@ -74,7 +74,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain @Override public void addGrouping(GroupingBuilder grouping) { - throw new YangParseException(line, "augment can not contains grouping statement"); + throw new YangParseException(moduleName, line, "augment can not contains grouping statement"); } @Override @@ -158,7 +158,7 @@ public final class AugmentationSchemaBuilderImpl extends AbstractDataNodeContain @Override public void addTypedef(TypeDefinitionBuilder type) { - throw new YangParseException(line, "Augmentation can not contains typedef statement."); + throw new YangParseException(moduleName, line, "Augmentation can not contains typedef statement."); } @Override diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java index 0fcfd339a5..1cd54cae62 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceBuilder.java @@ -29,6 +29,7 @@ import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder import org.opendaylight.controller.yang.parser.builder.api.GroupingMember; import org.opendaylight.controller.yang.parser.util.Comparators; import org.opendaylight.controller.yang.parser.util.ParserUtils; +import org.opendaylight.controller.yang.parser.util.YangParseException; public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements DataSchemaNodeBuilder, AugmentationTargetBuilder, GroupingMember { @@ -46,14 +47,14 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da private final Set addedCases = new HashSet(); private String defaultCase; - public ChoiceBuilder(final int line, final QName qname) { - super(line, qname); + public ChoiceBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); instance = new ChoiceNodeImpl(qname); - constraints = new ConstraintsBuilder(line); + constraints = new ConstraintsBuilder(moduleName, line); } public ChoiceBuilder(ChoiceBuilder b) { - super(b.getLine(), b.getQName()); + super(b.getModuleName(), b.getLine(), b.getQName()); parent = b.getParent(); instance = new ChoiceNodeImpl(qname); constraints = b.getConstraints(); @@ -126,20 +127,41 @@ public final class ChoiceBuilder extends AbstractSchemaNodeBuilder implements Da return addedCases; } - public void addChildNode(DataSchemaNodeBuilder childNode) { - if (!(childNode instanceof ChoiceCaseBuilder)) { - ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(childNode.getLine(), childNode.getQName()); - if (childNode.isAugmenting()) { + /** + * Add case node to this choice. + * + * If node is not declared with 'case' keyword, create new case builder and + * make this node child of newly created case. + * + * @param caseNode + * case node + */ + public void addCase(DataSchemaNodeBuilder caseNode) { + String newCaseName = caseNode.getQName().getLocalName(); + for (ChoiceCaseBuilder addedCase : addedCases) { + if (addedCase.getQName().getLocalName().equals(newCaseName)) { + throw new YangParseException(caseNode.getModuleName(), caseNode.getLine(), "Can not add '" + caseNode + + "' to node '" + qname.getLocalName() + "' in module '" + moduleName + + "': case with same name already declared at line " + addedCase.getLine()); + } + } + + if (caseNode instanceof ChoiceCaseBuilder) { + addedCases.add((ChoiceCaseBuilder) caseNode); + } else { + ChoiceCaseBuilder caseBuilder = new ChoiceCaseBuilder(caseNode.getModuleName(), caseNode.getLine(), + caseNode.getQName()); + if (caseNode.isAugmenting()) { + // if node is added by augmentation, set case builder augmenting + // as true and node augmenting as false caseBuilder.setAugmenting(true); - childNode.setAugmenting(false); + caseNode.setAugmenting(false); } - caseBuilder.setPath(childNode.getPath()); - SchemaPath newPath = ParserUtils.createSchemaPath(childNode.getPath(), childNode.getQName().getLocalName()); - childNode.setPath(newPath); - caseBuilder.addChildNode(childNode); + caseBuilder.setPath(caseNode.getPath()); + SchemaPath newPath = ParserUtils.createSchemaPath(caseNode.getPath(), caseNode.getQName().getLocalName()); + caseNode.setPath(newPath); + caseBuilder.addChildNode(caseNode); addedCases.add(caseBuilder); - } else { - addedCases.add((ChoiceCaseBuilder) childNode); } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java index 46821b2e10..c5282bc0ea 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ChoiceCaseBuilder.java @@ -45,10 +45,10 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im // AugmentationTarget args private final Set addedAugmentations = new HashSet(); - ChoiceCaseBuilder(final int line, final QName qname) { - super(line, qname); + ChoiceCaseBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); instance = new ChoiceCaseNodeImpl(qname); - constraints = new ConstraintsBuilder(line); + constraints = new ConstraintsBuilder(moduleName, line); } @Override @@ -165,7 +165,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im @Override public void addTypedef(TypeDefinitionBuilder typedefBuilder) { - throw new YangParseException(line, "Can not add type definition to choice case."); + throw new YangParseException(moduleName, line, "Can not add type definition to choice case."); } @Override @@ -175,7 +175,7 @@ public final class ChoiceCaseBuilder extends AbstractDataNodeContainerBuilder im @Override public void setConfiguration(final Boolean configuration) { - throw new YangParseException(line, "Can not add config statement to choice case."); + throw new YangParseException(moduleName, line, "Can not add config statement to choice case."); } @Override diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java index 5ec825b382..b2f1dff3a5 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ConstraintsBuilder.java @@ -16,21 +16,19 @@ import org.opendaylight.controller.yang.model.api.ConstraintDefinition; import org.opendaylight.controller.yang.model.api.MustDefinition; import org.opendaylight.controller.yang.model.api.RevisionAwareXPath; import org.opendaylight.controller.yang.model.util.RevisionAwareXPathImpl; -import org.opendaylight.controller.yang.parser.builder.api.Builder; +import org.opendaylight.controller.yang.parser.builder.api.AbstractBuilder; import org.opendaylight.controller.yang.parser.util.YangParseException; -public final class ConstraintsBuilder implements Builder { +public final class ConstraintsBuilder extends AbstractBuilder { private final ConstraintDefinitionImpl instance; - private final int line; - private Builder parent; private final Set mustDefinitions; private String whenCondition; private boolean mandatory; private Integer min; private Integer max; - ConstraintsBuilder(final int line) { - this.line = line; + ConstraintsBuilder(final String moduleName, final int line) { + super(moduleName, line); instance = new ConstraintDefinitionImpl(); mustDefinitions = new HashSet(); } @@ -51,24 +49,9 @@ public final class ConstraintsBuilder implements Builder { return instance; } - @Override - public int getLine() { - return line; - } - - @Override - public Builder getParent() { - return parent; - } - - @Override - public void setParent(final Builder parent) { - this.parent = parent; - } - @Override public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { - throw new YangParseException(line, "Can not add unknown node to constraints."); + throw new YangParseException(moduleName, line, "Can not add unknown node to constraints."); } @Override @@ -116,7 +99,6 @@ public final class ConstraintsBuilder implements Builder { this.mandatory = mandatory; } - private final class ConstraintDefinitionImpl implements ConstraintDefinition { private RevisionAwareXPath whenCondition; private Set mustConstraints; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java index c85c12fcd5..0bc56d430a 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ContainerSchemaNodeBuilder.java @@ -36,6 +36,7 @@ import org.opendaylight.controller.yang.parser.builder.api.GroupingMember; import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.controller.yang.parser.util.Comparators; +import org.opendaylight.controller.yang.parser.util.YangParseException; public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements AugmentationTargetBuilder, DataSchemaNodeBuilder, GroupingMember { @@ -63,15 +64,16 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB // ContainerSchemaNode args private boolean presence; - public ContainerSchemaNodeBuilder(final int line, final QName qname, final SchemaPath schemaPath) { - super(line, qname); + public ContainerSchemaNodeBuilder(final String moduleName, final int line, final QName qname, + final SchemaPath schemaPath) { + super(moduleName, line, qname); this.schemaPath = schemaPath; instance = new ContainerSchemaNodeImpl(qname); - constraints = new ConstraintsBuilder(line); + constraints = new ConstraintsBuilder(moduleName, line); } public ContainerSchemaNodeBuilder(final ContainerSchemaNodeBuilder b) { - super(b.getLine(), b.getQName()); + super(b.getModuleName(), b.getLine(), b.getQName()); instance = new ContainerSchemaNodeImpl(b.getQName()); constraints = b.getConstraints(); schemaPath = b.getPath(); @@ -116,7 +118,7 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB // CHILD NODES final Map childs = new TreeMap(Comparators.QNAME_COMP); - if (childNodes == null) { + if (childNodes == null || childNodes.isEmpty()) { for (DataSchemaNodeBuilder node : addedChildNodes) { childs.put(node.getQName(), node.build()); } @@ -194,6 +196,11 @@ public final class ContainerSchemaNodeBuilder extends AbstractDataNodeContainerB @Override public void addTypedef(final TypeDefinitionBuilder type) { + String typeName = type.getQName().getLocalName(); + for (TypeDefinitionBuilder addedTypedef : addedTypedefs) { + throw new YangParseException(moduleName, type.getLine(), "Can not add typedef '" + typeName + + "': typedef with same name already declared at line " + addedTypedef.getLine()); + } addedTypedefs.add(type); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java index 42347cbba3..3bc9879de7 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/DeviationBuilder.java @@ -15,15 +15,13 @@ import org.opendaylight.controller.yang.model.api.Deviation; import org.opendaylight.controller.yang.model.api.Deviation.Deviate; import org.opendaylight.controller.yang.model.api.SchemaPath; import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; -import org.opendaylight.controller.yang.parser.builder.api.Builder; +import org.opendaylight.controller.yang.parser.builder.api.AbstractBuilder; import org.opendaylight.controller.yang.parser.util.Comparators; import org.opendaylight.controller.yang.parser.util.ParserListenerUtils; import org.opendaylight.controller.yang.parser.util.YangParseException; -public final class DeviationBuilder implements Builder { - private final int line; +public final class DeviationBuilder extends AbstractBuilder { private final String targetPathStr; - private Builder parent; private boolean isBuilt; private final DeviationImpl instance; @@ -31,11 +29,12 @@ public final class DeviationBuilder implements Builder { private String reference; private final List addedUnknownNodes = new ArrayList(); - DeviationBuilder(final int line, final String targetPathStr) { - if(!targetPathStr.startsWith("/")) { - throw new YangParseException(line, "Deviation argument string must be an absolute schema node identifier."); + DeviationBuilder(final String moduleName, final int line, final String targetPathStr) { + super(moduleName, line); + if (!targetPathStr.startsWith("/")) { + throw new YangParseException(moduleName, line, + "Deviation argument string must be an absolute schema node identifier."); } - this.line = line; this.targetPathStr = targetPathStr; this.targetPath = ParserListenerUtils.parseAugmentPath(targetPathStr); instance = new DeviationImpl(); @@ -43,11 +42,11 @@ public final class DeviationBuilder implements Builder { @Override public Deviation build() { - if(targetPath == null) { - throw new YangParseException(line, "Unresolved deviation target"); + if (targetPath == null) { + throw new YangParseException(moduleName, line, "Unresolved deviation target"); } - if(!isBuilt) { + if (!isBuilt) { instance.setTargetPath(targetPath); instance.setReference(reference); @@ -65,31 +64,6 @@ public final class DeviationBuilder implements Builder { return instance; } - @Override - public int getLine() { - return line; - } - - @Override - public Builder getParent() { - return parent; - } - - @Override - public void setParent(final Builder parent) { - this.parent = parent; - } - - @Override - public List getUnknownNodeBuilders() { - return addedUnknownNodes; - } - - @Override - public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { - addedUnknownNodes.add(unknownNode); - } - public SchemaPath getTargetPath() { return targetPath; } @@ -108,8 +82,7 @@ public final class DeviationBuilder implements Builder { } else if ("delete".equals(deviate)) { instance.setDeviate(Deviate.DELETE); } else { - throw new YangParseException(line, - "Unsupported type of 'deviate' statement: " + deviate); + throw new YangParseException(moduleName, line, "Unsupported type of 'deviate' statement: " + deviate); } } @@ -173,12 +146,9 @@ public final class DeviationBuilder implements Builder { public int hashCode() { final int prime = 31; int result = 1; - result = prime * result - + ((targetPath == null) ? 0 : targetPath.hashCode()); - result = prime * result - + ((deviate == null) ? 0 : deviate.hashCode()); - result = prime * result - + ((reference == null) ? 0 : reference.hashCode()); + result = prime * result + ((targetPath == null) ? 0 : targetPath.hashCode()); + result = prime * result + ((deviate == null) ? 0 : deviate.hashCode()); + result = prime * result + ((reference == null) ? 0 : reference.hashCode()); return result; } @@ -220,8 +190,7 @@ public final class DeviationBuilder implements Builder { @Override public String toString() { - StringBuilder sb = new StringBuilder( - DeviationImpl.class.getSimpleName()); + StringBuilder sb = new StringBuilder(DeviationImpl.class.getSimpleName()); sb.append("["); sb.append("targetPath=" + targetPath); sb.append(", deviate=" + deviate); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java index fbd55ab7d9..93a34e1050 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ExtensionBuilder.java @@ -23,8 +23,8 @@ public final class ExtensionBuilder extends AbstractSchemaNodeBuilder { private boolean isBuilt; private final ExtensionDefinitionImpl instance; - ExtensionBuilder(final int line, final QName qname) { - super(line, qname); + ExtensionBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); instance = new ExtensionDefinitionImpl(qname); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java index 53129f100b..dd3fd11e92 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/FeatureBuilder.java @@ -23,8 +23,8 @@ public final class FeatureBuilder extends AbstractSchemaNodeBuilder { private boolean isBuilt; private final FeatureDefinitionImpl instance; - FeatureBuilder(final int line, final QName qname) { - super(line, qname); + FeatureBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); instance = new FeatureDefinitionImpl(qname); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java index 20503488ce..8a8f1211cb 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/GroupingBuilderImpl.java @@ -9,11 +9,11 @@ package org.opendaylight.controller.yang.parser.builder.impl; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.TreeMap; import java.util.TreeSet; import org.opendaylight.controller.yang.common.QName; @@ -24,51 +24,38 @@ import org.opendaylight.controller.yang.model.api.Status; import org.opendaylight.controller.yang.model.api.TypeDefinition; import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; import org.opendaylight.controller.yang.model.api.UsesNode; -import org.opendaylight.controller.yang.parser.builder.api.Builder; +import org.opendaylight.controller.yang.parser.builder.api.AbstractDataNodeContainerBuilder; import org.opendaylight.controller.yang.parser.builder.api.DataSchemaNodeBuilder; import org.opendaylight.controller.yang.parser.builder.api.GroupingBuilder; import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.controller.yang.parser.util.Comparators; +import org.opendaylight.controller.yang.parser.util.YangParseException; -public final class GroupingBuilderImpl implements GroupingBuilder { - private Builder parent; +public final class GroupingBuilderImpl extends AbstractDataNodeContainerBuilder implements GroupingBuilder { private boolean isBuilt; private final GroupingDefinitionImpl instance; - private final int line; - private final QName qname; private SchemaPath schemaPath; private String description; private String reference; private Status status = Status.CURRENT; private boolean addedByUses; - private Set childNodes; - private final Set addedChildNodes = new HashSet(); - - private Set groupings; - private final Set addedGroupings = new HashSet(); - private Set> typedefs; private final Set addedTypedefs = new HashSet(); private Set usesNodes; private final Set addedUsesNodes = new HashSet(); - private List unknownNodes; - private final List addedUnknownNodes = new ArrayList(); - - public GroupingBuilderImpl(final QName qname, final int line) { - this.qname = qname; + public GroupingBuilderImpl(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); instance = new GroupingDefinitionImpl(qname); - this.line = line; } public GroupingBuilderImpl(GroupingBuilder builder) { - qname = builder.getQName(); + super(builder.getModuleName(), builder.getLine(), builder.getQName()); parent = builder.getParent(); instance = new GroupingDefinitionImpl(qname); - line = builder.getLine(); schemaPath = builder.getPath(); description = builder.getDescription(); reference = builder.getReference(); @@ -92,8 +79,8 @@ public final class GroupingBuilderImpl implements GroupingBuilder { instance.setAddedByUses(addedByUses); // CHILD NODES - final Map childs = new HashMap(); - if (childNodes == null) { + final Map childs = new TreeMap(Comparators.QNAME_COMP); + if (childNodes == null || childNodes.isEmpty()) { for (DataSchemaNodeBuilder node : addedChildNodes) { childs.put(node.getQName(), node.build()); } @@ -147,25 +134,6 @@ public final class GroupingBuilderImpl implements GroupingBuilder { return instance; } - @Override - public int getLine() { - return line; - } - - @Override - public Builder getParent() { - return parent; - } - - @Override - public void setParent(final Builder parent) { - this.parent = parent; - } - - @Override - public QName getQName() { - return qname; - } @Override public Set getTypeDefinitionBuilders() { @@ -174,6 +142,11 @@ public final class GroupingBuilderImpl implements GroupingBuilder { @Override public void addTypedef(final TypeDefinitionBuilder type) { + String typeName = type.getQName().getLocalName(); + for (TypeDefinitionBuilder addedTypedef : addedTypedefs) { + throw new YangParseException(moduleName, type.getLine(), "Can not add typedef '" + typeName + + "': typedef with same name already declared at line " + addedTypedef.getLine()); + } addedTypedefs.add(type); } @@ -231,54 +204,6 @@ public final class GroupingBuilderImpl implements GroupingBuilder { this.addedByUses = addedByUses; } - @Override - public Set getChildNodes() { - return childNodes; - } - - @Override - public void addChildNode(final DataSchemaNodeBuilder childNode) { - addedChildNodes.add(childNode); - } - - @Override - public Set getChildNodeBuilders() { - return addedChildNodes; - } - - @Override - public DataSchemaNodeBuilder getDataChildByName(final String name) { - for(DataSchemaNodeBuilder child : addedChildNodes) { - if(child.getQName().getLocalName().equals(name)) { - return child; - } - } - return null; - } - - public void setChildNodes(final Set childNodes) { - this.childNodes = childNodes; - } - - @Override - public Set getGroupings() { - return Collections.emptySet(); - } - - @Override - public Set getGroupingBuilders() { - return addedGroupings; - } - - @Override - public void addGrouping(final GroupingBuilder grouping) { - addedGroupings.add(grouping); - } - - public void setGroupings(final Set groupings) { - this.groupings = groupings; - } - @Override public Set getUses() { return addedUsesNodes; @@ -293,20 +218,6 @@ public final class GroupingBuilderImpl implements GroupingBuilder { this.usesNodes = usesNodes; } - @Override - public List getUnknownNodeBuilders() { - return addedUnknownNodes; - } - - @Override - public void addUnknownNodeBuilder(final UnknownSchemaNodeBuilder unknownNode) { - addedUnknownNodes.add(unknownNode); - } - - public void setUnknownNodes(List unknownNodes) { - this.unknownNodes = unknownNodes; - } - @Override public String toString() { return "grouping " + qname.getLocalName(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java index 61ad3a74dd..2e7c495d9e 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentitySchemaNodeBuilder.java @@ -26,8 +26,8 @@ public final class IdentitySchemaNodeBuilder extends AbstractSchemaNodeBuilder { private IdentitySchemaNode baseIdentity; private String baseIdentityName; - IdentitySchemaNodeBuilder(final int line, final QName qname) { - super(line, qname); + IdentitySchemaNodeBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); instance = new IdentitySchemaNodeImpl(qname); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java index 43922fa71e..ca6002930e 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/IdentityrefTypeBuilder.java @@ -36,8 +36,8 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple private final SchemaPath schemaPath; private QName baseQName; - IdentityrefTypeBuilder(final String baseString, final SchemaPath schemaPath, final int line) { - super(line, null); + IdentityrefTypeBuilder(final String moduleName, final int line, final String baseString, final SchemaPath schemaPath) { + super(moduleName, line, null); this.baseString = baseString; this.schemaPath = schemaPath; } @@ -67,32 +67,32 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void setType(final TypeDefinition type) { - throw new YangParseException(line, "Can not set type to " + NAME); + throw new YangParseException(moduleName, line, "Can not set type to " + NAME); } @Override public void setTypedef(final TypeDefinitionBuilder tdb) { - throw new YangParseException(line, "Can not set type to " + NAME); + throw new YangParseException(moduleName, line, "Can not set type to " + NAME); } @Override public void setPath(final SchemaPath schemaPath) { - throw new YangParseException(line, "Can not set path to " + NAME); + throw new YangParseException(moduleName, line, "Can not set path to " + NAME); } @Override public void setDescription(final String description) { - throw new YangParseException(line, "Can not set description to " + NAME); + throw new YangParseException(moduleName, line, "Can not set description to " + NAME); } @Override public void setReference(final String reference) { - throw new YangParseException(line, "Can not set reference to " + NAME); + throw new YangParseException(moduleName, line, "Can not set reference to " + NAME); } @Override public void setStatus(final Status status) { - throw new YangParseException(line, "Can not set status to " + NAME); + throw new YangParseException(moduleName, line, "Can not set status to " + NAME); } @Override @@ -102,7 +102,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void setAddedByUses(final boolean addedByUses) { - throw new YangParseException(line, "Identityref type can not be added by uses."); + throw new YangParseException(moduleName, line, "Identityref type can not be added by uses."); } @Override @@ -112,7 +112,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void addUnknownNodeBuilder(final UnknownSchemaNodeBuilder unknownNode) { - throw new YangParseException(line, "Can not add unknown node to " + NAME); + throw new YangParseException(moduleName, line, "Can not add unknown node to " + NAME); } @Override @@ -147,7 +147,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void setRanges(List ranges) { - throw new YangParseException(line, "Can not set ranges to " + NAME); + throw new YangParseException(moduleName, line, "Can not set ranges to " + NAME); } @Override @@ -157,7 +157,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void setLengths(List lengths) { - throw new YangParseException(line, "Can not set lengths to " + NAME); + throw new YangParseException(moduleName, line, "Can not set lengths to " + NAME); } @Override @@ -167,7 +167,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void setPatterns(List patterns) { - throw new YangParseException(line, "Can not set patterns to " + NAME); + throw new YangParseException(moduleName, line, "Can not set patterns to " + NAME); } @Override @@ -177,7 +177,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void setFractionDigits(Integer fractionDigits) { - throw new YangParseException(line, "Can not set fraction digits to " + NAME); + throw new YangParseException(moduleName, line, "Can not set fraction digits to " + NAME); } @Override @@ -192,7 +192,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void setDefaultValue(Object defaultValue) { - throw new YangParseException(line, "Can not set default value to " + NAME); + throw new YangParseException(moduleName, line, "Can not set default value to " + NAME); } @Override @@ -202,7 +202,7 @@ public final class IdentityrefTypeBuilder extends AbstractTypeAwareBuilder imple @Override public void setUnits(String units) { - throw new YangParseException(line, "Can not set units to " + NAME); + throw new YangParseException(moduleName, line, "Can not set units to " + NAME); } @Override diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java index dcbe1dd432..8e11ad2217 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafListSchemaNodeBuilder.java @@ -40,15 +40,16 @@ public final class LeafListSchemaNodeBuilder extends AbstractTypeAwareBuilder im // LeafListSchemaNode args private boolean userOrdered; - public LeafListSchemaNodeBuilder(final int line, final QName qname, final SchemaPath schemaPath) { - super(line, qname); + public LeafListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, + final SchemaPath schemaPath) { + super(moduleName, line, qname); this.schemaPath = schemaPath; instance = new LeafListSchemaNodeImpl(qname); - constraints = new ConstraintsBuilder(line); + constraints = new ConstraintsBuilder(moduleName, line); } public LeafListSchemaNodeBuilder(final LeafListSchemaNodeBuilder b) { - super(b.getLine(), b.getQName()); + super(b.getModuleName(), b.getLine(), b.getQName()); instance = new LeafListSchemaNodeImpl(qname); type = b.getType(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java index 2ab6407f25..5c1da11afa 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/LeafSchemaNodeBuilder.java @@ -41,15 +41,15 @@ public final class LeafSchemaNodeBuilder extends AbstractTypeAwareBuilder implem private String defaultStr; private String unitsStr; - public LeafSchemaNodeBuilder(final QName qname, final SchemaPath schemaPath, final int line) { - super(line, qname); + public LeafSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath schemaPath) { + super(moduleName, line, qname); this.schemaPath = schemaPath; instance = new LeafSchemaNodeImpl(qname); - constraints = new ConstraintsBuilder(line); + constraints = new ConstraintsBuilder(moduleName, line); } public LeafSchemaNodeBuilder(final LeafSchemaNodeBuilder b) { - super(b.getLine(), b.getQName()); + super(b.getModuleName(), b.getLine(), b.getQName()); instance = new LeafSchemaNodeImpl(qname); constraints = b.getConstraints(); schemaPath = b.getPath(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java index 9fc297e2ba..5e369d0826 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ListSchemaNodeBuilder.java @@ -36,6 +36,7 @@ import org.opendaylight.controller.yang.parser.builder.api.GroupingMember; import org.opendaylight.controller.yang.parser.builder.api.TypeDefinitionBuilder; import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.controller.yang.parser.util.Comparators; +import org.opendaylight.controller.yang.parser.util.YangParseException; public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilder implements DataSchemaNodeBuilder, AugmentationTargetBuilder, GroupingMember { @@ -63,15 +64,15 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde private List keyDefinition = Collections.emptyList(); private boolean userOrdered; - public ListSchemaNodeBuilder(final int line, final QName qname, final SchemaPath schemaPath) { - super(line, qname); + public ListSchemaNodeBuilder(final String moduleName, final int line, final QName qname, final SchemaPath schemaPath) { + super(moduleName, line, qname); this.schemaPath = schemaPath; instance = new ListSchemaNodeImpl(qname); - constraints = new ConstraintsBuilder(line); + constraints = new ConstraintsBuilder(moduleName, line); } public ListSchemaNodeBuilder(final ListSchemaNodeBuilder b) { - super(b.getLine(), b.getQName()); + super(b.getModuleName(), b.getLine(), b.getQName()); instance = new ListSchemaNodeImpl(b.getQName()); constraints = b.getConstraints(); schemaPath = b.getPath(); @@ -112,7 +113,7 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde // CHILD NODES final Map childs = new TreeMap(Comparators.QNAME_COMP); - if (childNodes == null) { + if (childNodes == null || childNodes.isEmpty()) { for (DataSchemaNodeBuilder node : addedChildNodes) { childs.put(node.getQName(), node.build()); } @@ -190,6 +191,11 @@ public final class ListSchemaNodeBuilder extends AbstractDataNodeContainerBuilde @Override public void addTypedef(final TypeDefinitionBuilder type) { + String typeName = type.getQName().getLocalName(); + for (TypeDefinitionBuilder addedTypedef : addedTypedefs) { + throw new YangParseException(moduleName, type.getLine(), "Can not add typedef '" + typeName + + "': typedef with same name already declared at line " + addedTypedef.getLine()); + } addedTypedefs.add(type); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java index a3409c5b77..f424bcfdf9 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/ModuleBuilder.java @@ -82,7 +82,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { private final List allUnknownNodes = new ArrayList(); public ModuleBuilder(final String name) { - super(0, null); + super(name, 0, null); this.name = name; instance = new ModuleImpl(name); } @@ -320,85 +320,94 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public ExtensionBuilder addExtension(final QName qname, final int line) { - final ExtensionBuilder builder = new ExtensionBuilder(line, qname); + final String extName = qname.getLocalName(); + for (ExtensionBuilder addedExtension : addedExtensions) { + if (addedExtension.getQName().getLocalName().equals(extName)) { + throw new YangParseException(moduleName, line, "Can not add extension '" + extName + + "': extension with same name already declared at line " + addedExtension.getLine()); + } + } + final ExtensionBuilder builder = new ExtensionBuilder(name, line, qname); addedExtensions.add(builder); return builder; } - public ContainerSchemaNodeBuilder addContainerNode(final int line, final QName containerName, - final SchemaPath schemaPath) { - final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(line, containerName, schemaPath); + public ContainerSchemaNodeBuilder addContainerNode(final int line, final QName qname, final SchemaPath schemaPath) { + final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); builder.setParent(parent); - addChildToParent(parent, builder, containerName.getLocalName()); + addChildToParent(parent, builder, qname.getLocalName()); return builder; } - public ListSchemaNodeBuilder addListNode(final int line, final QName listName, final SchemaPath schemaPath) { - final ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(line, listName, schemaPath); + public ListSchemaNodeBuilder addListNode(final int line, final QName qname, final SchemaPath schemaPath) { + final ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); builder.setParent(parent); - addChildToParent(parent, builder, listName.getLocalName()); + addChildToParent(parent, builder, qname.getLocalName()); return builder; } - public LeafSchemaNodeBuilder addLeafNode(final int line, final QName leafName, final SchemaPath schemaPath) { - final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(leafName, schemaPath, line); + public LeafSchemaNodeBuilder addLeafNode(final int line, final QName qname, final SchemaPath schemaPath) { + final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); builder.setParent(parent); - addChildToParent(parent, builder, leafName.getLocalName()); + addChildToParent(parent, builder, qname.getLocalName()); return builder; } - public LeafListSchemaNodeBuilder addLeafListNode(final int line, final QName leafListName, - final SchemaPath schemaPath) { - final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(line, leafListName, schemaPath); + public LeafListSchemaNodeBuilder addLeafListNode(final int line, final QName qname, final SchemaPath schemaPath) { + final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); builder.setParent(parent); - addChildToParent(parent, builder, leafListName.getLocalName()); + addChildToParent(parent, builder, qname.getLocalName()); return builder; } public GroupingBuilder addGrouping(final int line, final QName qname) { - final GroupingBuilder builder = new GroupingBuilderImpl(qname, line); + final GroupingBuilder builder = new GroupingBuilderImpl(name, line, qname); Builder parent = getActualNode(); builder.setParent(parent); + String groupingName = qname.getLocalName(); if (parent == null) { - for (GroupingBuilder child : addedGroupings) { - if (child.getQName().getLocalName().equals(qname.getLocalName())) { - throw new YangParseException(name, line, "Duplicate node found at line " + child.getLine()); + for (GroupingBuilder addedGrouping : addedGroupings) { + if (addedGrouping.getQName().getLocalName().equals(groupingName)) { + throw new YangParseException(name, line, "grouping with same name '" + groupingName + + "' already declared at line " + addedGrouping.getLine()); } } addedGroupings.add(builder); } else { if (parent instanceof DataNodeContainerBuilder) { DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent; - for (DataSchemaNodeBuilder child : parentNode.getChildNodeBuilders()) { - if (child.getQName().getLocalName().equals(qname.getLocalName())) { - throw new YangParseException(name, line, "Duplicate node found at line " + child.getLine()); + for (GroupingBuilder addedGrouping : parentNode.getGroupingBuilders()) { + if (addedGrouping.getQName().getLocalName().equals(groupingName)) { + throw new YangParseException(name, line, "grouping with same name '" + groupingName + + "' already declared at line " + addedGrouping.getLine()); } } parentNode.addGrouping(builder); } else if (parent instanceof RpcDefinitionBuilder) { RpcDefinitionBuilder parentNode = (RpcDefinitionBuilder) parent; for (GroupingBuilder child : parentNode.getGroupings()) { - if (child.getQName().getLocalName().equals(qname.getLocalName())) { - throw new YangParseException(name, line, "Duplicate node found at line " + child.getLine()); + if (child.getQName().getLocalName().equals(groupingName)) { + throw new YangParseException(name, line, "grouping with same name '" + groupingName + + "' already declared at line " + child.getLine()); } } parentNode.addGrouping(builder); } else { - throw new YangParseException(name, line, "Unresolved parent of grouping " + qname.getLocalName()); + throw new YangParseException(name, line, "Unresolved parent of grouping " + groupingName); } } @@ -406,19 +415,20 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public AugmentationSchemaBuilder addAugment(final int line, final String augmentTargetStr) { - final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(line, augmentTargetStr); + final AugmentationSchemaBuilder builder = new AugmentationSchemaBuilderImpl(name, line, augmentTargetStr); Builder parent = getActualNode(); builder.setParent(parent); if (parent == null) { + // augment can be declared only under 'module' ... addedAugments.add(builder); } else { - // augment can only be in 'module' or 'uses' statement + // ... or 'uses' statement if (parent instanceof UsesNodeBuilder) { ((UsesNodeBuilder) parent).addAugment(builder); } else { - throw new YangParseException(name, line, "Augment can be declared only under module or uses."); + throw new YangParseException(name, line, "Augment can be declared only under module or uses statement."); } } allAugments.add(builder); @@ -433,7 +443,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public UsesNodeBuilder addUsesNode(final int line, final String groupingPathStr) { - final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(line, groupingPathStr); + final UsesNodeBuilder usesBuilder = new UsesNodeBuilderImpl(name, line, groupingPathStr); Builder parent = getActualNode(); usesBuilder.setParent(parent); @@ -453,13 +463,11 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { return usesBuilder; } - public void addRefine(final RefineHolder refine, final List parentPath) { - final List path = new ArrayList(parentPath); - - if (actualPath.isEmpty()) { + public void addRefine(final RefineHolder refine) { + final Builder parent = getActualNode(); + if (parent == null) { throw new YangParseException(name, refine.getLine(), "refine can be defined only in uses statement"); } else { - final Builder parent = getActualNode(); if (parent instanceof UsesNodeBuilder) { ((UsesNodeBuilder) parent).addRefine(refine); } else { @@ -467,8 +475,6 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } refine.setParent(parent); } - - path.add(refine.getName()); } public RpcDefinitionBuilder addRpc(final int line, final QName qname) { @@ -477,148 +483,183 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { throw new YangParseException(name, line, "rpc can be defined only in module or submodule"); } - final RpcDefinitionBuilder rpcBuilder = new RpcDefinitionBuilder(line, qname); + final RpcDefinitionBuilder rpcBuilder = new RpcDefinitionBuilder(name, line, qname); + + String rpcName = qname.getLocalName(); for (RpcDefinitionBuilder rpc : addedRpcs) { - if (rpc.getQName().getLocalName().equals(qname.getLocalName())) { - throw new YangParseException(name, line, "Duplicate node found at line " + rpc.getLine()); + if (rpc.getQName().getLocalName().equals(rpcName)) { + throw new YangParseException(name, line, "rpc with same name '" + rpcName + + "' already declared at line " + rpc.getLine()); + } + } + for (DataSchemaNodeBuilder addedChild : addedChildNodes) { + if (addedChild.getQName().getLocalName().equals(rpcName)) { + throw new YangParseException(name, line, "Can not add rpc: node with same name '" + rpcName + + "' already declared at line " + addedChild.getLine()); + } + } + for (NotificationBuilder addedNotification : addedNotifications) { + if (addedNotification.getQName().getLocalName().equals(rpcName)) { + throw new YangParseException(name, line, "Can not add rpc: notification with same name '" + rpcName + + "' already declared at line " + addedNotification.getLine()); } } addedRpcs.add(rpcBuilder); return rpcBuilder; } - public ContainerSchemaNodeBuilder addRpcInput(final SchemaPath schemaPath, final QName inputQName, final int line) { + public ContainerSchemaNodeBuilder addRpcInput(final int line, final QName qname, final SchemaPath schemaPath) { final Builder parent = getActualNode(); if (!(parent instanceof RpcDefinitionBuilder)) { throw new YangParseException(name, line, "input can be defined only in rpc statement"); } final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent; - final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(line, inputQName, schemaPath); + final ContainerSchemaNodeBuilder inputBuilder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath); inputBuilder.setParent(rpc); rpc.setInput(inputBuilder); return inputBuilder; } - public ContainerSchemaNodeBuilder addRpcOutput(final SchemaPath schemaPath, final QName outputQName, final int line) { + public ContainerSchemaNodeBuilder addRpcOutput(final SchemaPath schemaPath, final QName qname, final int line) { final Builder parent = actualPath.getFirst(); if (!(parent instanceof RpcDefinitionBuilder)) { throw new YangParseException(name, line, "output can be defined only in rpc statement"); } final RpcDefinitionBuilder rpc = (RpcDefinitionBuilder) parent; - final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(line, outputQName, schemaPath); + final ContainerSchemaNodeBuilder outputBuilder = new ContainerSchemaNodeBuilder(name, line, qname, schemaPath); outputBuilder.setParent(rpc); rpc.setOutput(outputBuilder); return outputBuilder; } - public NotificationBuilder addNotification(final QName notificationName, final List parentPath, - final int line) { + public NotificationBuilder addNotification(final int line, final QName qname) { if (!(actualPath.isEmpty())) { 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(notificationName)) { - throw new YangParseException(name, line, "Duplicate node found at line " + nb.getLine()); + if (nb.getQName().equals(qname)) { + throw new YangParseException(name, line, "notification with same name '" + notificationName + + "' already declared at line " + nb.getLine()); + } + } + for (RpcDefinitionBuilder rpc : addedRpcs) { + if (rpc.getQName().getLocalName().equals(notificationName)) { + throw new YangParseException(name, line, "Can not add notification: rpc with same name '" + + notificationName + "' already declared at line " + rpc.getLine()); + } + } + for (DataSchemaNodeBuilder addedChild : addedChildNodes) { + if (addedChild.getQName().getLocalName().equals(notificationName)) { + throw new YangParseException(name, line, "Can not add notification: node with same name '" + + notificationName + "' already declared at line " + addedChild.getLine()); } } - final NotificationBuilder builder = new NotificationBuilder(line, notificationName); + final NotificationBuilder builder = new NotificationBuilder(name, line, qname); addedNotifications.add(builder); return builder; } - public FeatureBuilder addFeature(final int line, final QName featureName) { + public FeatureBuilder addFeature(final int line, final QName qname) { Builder parent = getActualNode(); if (parent != null) { throw new YangParseException(name, line, "feature can be defined only in module or submodule"); } - final FeatureBuilder builder = new FeatureBuilder(line, featureName); - for (FeatureBuilder fb : addedFeatures) { - if (fb.getQName().getLocalName().equals(featureName.getLocalName())) { - throw new YangParseException(name, line, "Duplicate node found at line " + fb.getLine()); + final FeatureBuilder builder = new FeatureBuilder(name, line, qname); + + String featureName = qname.getLocalName(); + for (FeatureBuilder addedFeature : addedFeatures) { + if (addedFeature.getQName().getLocalName().equals(featureName)) { + throw new YangParseException(name, line, "feature with same name '" + featureName + + "' already declared at line " + addedFeature.getLine()); } } addedFeatures.add(builder); return builder; } - public ChoiceBuilder addChoice(final int line, final QName choiceName) { - final ChoiceBuilder builder = new ChoiceBuilder(line, choiceName); + public ChoiceBuilder addChoice(final int line, final QName qname) { + final ChoiceBuilder builder = new ChoiceBuilder(name, line, qname); Builder parent = getActualNode(); builder.setParent(parent); - addChildToParent(parent, builder, choiceName.getLocalName()); + addChildToParent(parent, builder, qname.getLocalName()); return builder; } - public ChoiceCaseBuilder addCase(final int line, final QName caseName) { + public ChoiceCaseBuilder addCase(final int line, final QName qname) { Builder parent = getActualNode(); if (parent == null) { throw new YangParseException(name, line, "'case' parent not found"); } - final ChoiceCaseBuilder builder = new ChoiceCaseBuilder(line, caseName); + final ChoiceCaseBuilder builder = new ChoiceCaseBuilder(name, line, qname); builder.setParent(parent); if (parent instanceof ChoiceBuilder) { - ((ChoiceBuilder) parent).addChildNode(builder); + ((ChoiceBuilder) parent).addCase(builder); } else if (parent instanceof AugmentationSchemaBuilder) { ((AugmentationSchemaBuilder) parent).addChildNode(builder); } else { - throw new YangParseException(name, line, "Unresolved parent of 'case' " + caseName.getLocalName()); + throw new YangParseException(name, line, "Unresolved parent of 'case' " + qname.getLocalName()); } return builder; } - public AnyXmlBuilder addAnyXml(final int line, final QName anyXmlName, final SchemaPath schemaPath) { - final AnyXmlBuilder builder = new AnyXmlBuilder(line, anyXmlName, schemaPath); + public AnyXmlBuilder addAnyXml(final int line, final QName qname, final SchemaPath schemaPath) { + final AnyXmlBuilder builder = new AnyXmlBuilder(name, line, qname, schemaPath); Builder parent = getActualNode(); builder.setParent(parent); - addChildToParent(parent, builder, anyXmlName.getLocalName()); + addChildToParent(parent, builder, qname.getLocalName()); return builder; } @Override public void addTypedef(TypeDefinitionBuilder typedefBuilder) { + String nodeName = typedefBuilder.getQName().getLocalName(); for (TypeDefinitionBuilder tdb : addedTypedefs) { - if (tdb.getQName().getLocalName().equals(typedefBuilder.getQName().getLocalName())) { - throw new YangParseException(name, typedefBuilder.getLine(), "Duplicate node found at line " - + tdb.getLine()); + if (tdb.getQName().getLocalName().equals(nodeName)) { + throw new YangParseException(name, typedefBuilder.getLine(), "typedef with same name '" + nodeName + + "' already declared at line " + tdb.getLine()); } } addedTypedefs.add(typedefBuilder); } - public TypeDefinitionBuilderImpl addTypedef(final int line, final QName typeDefName) { - final TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(typeDefName, line); + public TypeDefinitionBuilderImpl addTypedef(final int line, final QName qname) { + final TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(name, line, qname); Builder parent = getActualNode(); builder.setParent(parent); + String typedefName = qname.getLocalName(); if (parent == null) { for (TypeDefinitionBuilder tdb : addedTypedefs) { - if (tdb.getQName().getLocalName().equals(builder.getQName().getLocalName())) { - throw new YangParseException(name, builder.getLine(), "Duplicate node found at line " - + tdb.getLine()); + if (tdb.getQName().getLocalName().equals(typedefName)) { + throw new YangParseException(name, line, "typedef with same name '" + typedefName + + "' already declared at line " + tdb.getLine()); } } addedTypedefs.add(builder); } else { if (parent instanceof DataNodeContainerBuilder) { DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent; - for (DataSchemaNodeBuilder child : parentNode.getChildNodeBuilders()) { - if (child.getQName().getLocalName().equals(typeDefName.getLocalName())) { - throw new YangParseException(name, line, "Duplicate node found at line " + child.getLine()); + for (TypeDefinitionBuilder child : parentNode.getTypeDefinitionBuilders()) { + if (child.getQName().getLocalName().equals(typedefName)) { + throw new YangParseException(name, line, "typedef with same name '" + typedefName + + "' already declared at line " + child.getLine()); } } parentNode.addTypedef(builder); @@ -626,13 +667,13 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { RpcDefinitionBuilder rpcParent = (RpcDefinitionBuilder) parent; for (TypeDefinitionBuilder tdb : rpcParent.getTypeDefinitions()) { if (tdb.getQName().getLocalName().equals(builder.getQName().getLocalName())) { - throw new YangParseException(name, builder.getLine(), "Duplicate node found at line " - + tdb.getLine()); + throw new YangParseException(name, line, "typedef with same name '" + typedefName + + "' already declared at line " + tdb.getLine()); } } rpcParent.addTypedef(builder); } else { - throw new YangParseException(name, line, "Unresolved parent of typedef " + typeDefName.getLocalName()); + throw new YangParseException(name, line, "Unresolved parent of typedef " + typedefName); } } @@ -651,9 +692,9 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { public UnionTypeBuilder addUnionType(final int line, final URI namespace, final Date revision) { final Builder parent = getActualNode(); if (parent == null) { - throw new YangParseException(line, "Error while parsing union type"); + throw new YangParseException(name, line, "Unresolved parent of union type"); } else { - final UnionTypeBuilder union = new UnionTypeBuilder(line); + final UnionTypeBuilder union = new UnionTypeBuilder(name, line); if (parent instanceof TypeAwareBuilder) { ((TypeAwareBuilder) parent).setTypedef(union); return union; @@ -664,11 +705,11 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } public void addIdentityrefType(final int line, final SchemaPath schemaPath, final String baseString) { - final IdentityrefTypeBuilder identityref = new IdentityrefTypeBuilder(baseString, schemaPath, line); + final IdentityrefTypeBuilder identityref = new IdentityrefTypeBuilder(name, line, baseString, schemaPath); final Builder parent = getActualNode(); if (parent == null) { - throw new YangParseException(line, "Error while parsing identityref type."); + throw new YangParseException(name, line, "Unresolved parent of identityref type."); } else { if (parent instanceof TypeAwareBuilder) { final TypeAwareBuilder typeParent = (TypeAwareBuilder) parent; @@ -686,7 +727,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { throw new YangParseException(name, line, "deviation can be defined only in module or submodule"); } - final DeviationBuilder builder = new DeviationBuilder(line, targetPath); + final DeviationBuilder builder = new DeviationBuilder(name, line, targetPath); addedDeviations.add(builder); return builder; } @@ -696,13 +737,15 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { if (parent != null) { throw new YangParseException(name, line, "identity can be defined only in module or submodule"); } + String identityName = qname.getLocalName(); for (IdentitySchemaNodeBuilder idBuilder : addedIdentities) { if (idBuilder.getQName().equals(qname)) { - throw new YangParseException(name, line, "Duplicate node found at line " + idBuilder.getLine()); + throw new YangParseException(name, line, "identity with same name '" + identityName + + "' already declared at line " + idBuilder.getLine()); } } - final IdentitySchemaNodeBuilder builder = new IdentitySchemaNodeBuilder(line, qname); + final IdentitySchemaNodeBuilder builder = new IdentitySchemaNodeBuilder(name, line, qname); addedIdentities.add(builder); return builder; } @@ -715,7 +758,7 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { public UnknownSchemaNodeBuilder addUnknownSchemaNode(final int line, final QName qname) { final Builder parent = getActualNode(); - final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(line, qname); + final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(name, line, qname); builder.setParent(parent); allUnknownNodes.add(builder); @@ -1083,7 +1126,16 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { } } - private void addChildToParent(final Builder parent, final DataSchemaNodeBuilder child, final String childLocalName) { + /** + * Add child to parent. Method checks for duplicates and add given child + * node to parent. If node with same name is found, throws exception. If + * parent is null, child node will be added directly to module. + * + * @param parent + * @param child + * @param childName + */ + private void addChildToParent(final Builder parent, final DataSchemaNodeBuilder child, final String childName) { final int line = child.getLine(); if (parent == null) { // if parent == null => node is defined under module @@ -1092,18 +1144,21 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { // top level of the module or its submodules share the same // identifier namespace. for (DataSchemaNodeBuilder childNode : addedChildNodes) { - if (childNode.getQName().getLocalName().equals(childLocalName)) { - throw new YangParseException(name, line, "Duplicate node found at line " + childNode.getLine()); + if (childNode.getQName().getLocalName().equals(childName)) { + throw new YangParseException(name, line, "Can not add '" + child + + "': node with same name already declared at line " + childNode.getLine()); } } for (RpcDefinitionBuilder rpc : addedRpcs) { - if (rpc.getQName().getLocalName().equals(childLocalName)) { - throw new YangParseException(name, line, "Duplicate node found at line " + rpc.getLine()); + if (rpc.getQName().getLocalName().equals(childName)) { + throw new YangParseException(name, line, "Can not add '" + child + + "': rpc with same name already declared at line " + rpc.getLine()); } } for (NotificationBuilder notification : addedNotifications) { - if (notification.getQName().getLocalName().equals(childLocalName)) { - throw new YangParseException(name, line, "Duplicate node found at line " + notification.getLine()); + if (notification.getQName().getLocalName().equals(childName)) { + throw new YangParseException(name, line, "Can not add '" + child + + "': notification with same name already declared at line " + notification.getLine()); } } addedChildNodes.add(child); @@ -1113,22 +1168,23 @@ public class ModuleBuilder extends AbstractDataNodeContainerBuilder { if (parent instanceof DataNodeContainerBuilder) { DataNodeContainerBuilder parentNode = (DataNodeContainerBuilder) parent; for (DataSchemaNodeBuilder childNode : parentNode.getChildNodeBuilders()) { - if (childNode.getQName().getLocalName().equals(childLocalName)) { - throw new YangParseException(name, line, "Duplicate node found at line " + childNode.getLine()); + if (childNode.getQName().getLocalName().equals(childName)) { + throw new YangParseException(name, line, "Can not add '" + child + "': node with same name '" + + childName + "' already declared at line " + childNode.getLine()); } } parentNode.addChildNode(child); } else if (parent instanceof ChoiceBuilder) { ChoiceBuilder parentNode = (ChoiceBuilder) parent; for (ChoiceCaseBuilder caseBuilder : parentNode.getCases()) { - if (caseBuilder.getQName().getLocalName().equals(childLocalName)) { - throw new YangParseException(name, line, "Duplicate node found at line " - + caseBuilder.getLine()); + if (caseBuilder.getQName().getLocalName().equals(childName)) { + throw new YangParseException(name, line, "Can not add '" + child + "': case with same name '" + + childName + "' already declared at line " + caseBuilder.getLine()); } } - parentNode.addChildNode(child); + parentNode.addCase(child); } else { - throw new YangParseException(name, line, "Unresolved parent of node '" + childLocalName + "'."); + throw new YangParseException(name, line, "Unresolved parent of node '" + childName + "'."); } } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java index 14b701fe9e..eab1cffceb 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/NotificationBuilder.java @@ -49,8 +49,8 @@ public final class NotificationBuilder extends AbstractDataNodeContainerBuilder private Set augmentations; private final Set addedAugmentations = new HashSet(); - NotificationBuilder(final int line, final QName qname) { - super(line, qname); + NotificationBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); instance = new NotificationDefinitionImpl(qname); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java index 65b15c583b..53190d0bb6 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/RpcDefinitionBuilder.java @@ -35,8 +35,8 @@ public final class RpcDefinitionBuilder extends AbstractSchemaNodeBuilder { private final Set addedTypedefs = new HashSet(); private final Set addedGroupings = new HashSet(); - RpcDefinitionBuilder(final int line, final QName qname) { - super(line, qname); + RpcDefinitionBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); this.instance = new RpcDefinitionImpl(qname); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java index 7ff7847763..5f2ca1c028 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/TypeDefinitionBuilderImpl.java @@ -40,12 +40,12 @@ public final class TypeDefinitionBuilderImpl extends AbstractTypeAwareBuilder im private Object defaultValue; private boolean addedByUses; - public TypeDefinitionBuilderImpl(final QName qname, final int line) { - super(line, qname); + public TypeDefinitionBuilderImpl(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); } public TypeDefinitionBuilderImpl(TypeDefinitionBuilder tdb) { - super(tdb.getLine(), tdb.getQName()); + super(tdb.getModuleName(), tdb.getLine(), tdb.getQName()); schemaPath = tdb.getPath(); type = tdb.getType(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java index fac5001944..6c57c25b98 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnionTypeBuilder.java @@ -39,13 +39,12 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements private SchemaPath path; - public UnionTypeBuilder(final int line) { - super(line, null); + public UnionTypeBuilder(final String moduleName, final int line) { + super(moduleName, line, null); types = new ArrayList>(); typedefs = new ArrayList(); } - public List> getTypes() { return types; } @@ -93,17 +92,17 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements @Override public void setDescription(final String description) { - throw new YangParseException(line, "Can not set description to " + NAME); + throw new YangParseException(moduleName, line, "Can not set description to " + NAME); } @Override public void setReference(final String reference) { - throw new YangParseException(line, "Can not set reference to " + NAME); + throw new YangParseException(moduleName, line, "Can not set reference to " + NAME); } @Override public void setStatus(final Status status) { - throw new YangParseException(line, "Can not set status to " + NAME); + throw new YangParseException(moduleName, line, "Can not set status to " + NAME); } @Override @@ -113,7 +112,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements @Override public void setAddedByUses(final boolean addedByUses) { - throw new YangParseException(line, "Union type can not be added by uses."); + throw new YangParseException(moduleName, line, "Union type can not be added by uses."); } @Override @@ -153,7 +152,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements @Override public void setRanges(List ranges) { - throw new YangParseException(line, "Can not set ranges to " + NAME); + throw new YangParseException(moduleName, line, "Can not set ranges to " + NAME); } @Override @@ -163,7 +162,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements @Override public void setLengths(List lengths) { - throw new YangParseException(line, "Can not set lengths to " + NAME); + throw new YangParseException(moduleName, line, "Can not set lengths to " + NAME); } @Override @@ -173,7 +172,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements @Override public void setPatterns(List patterns) { - throw new YangParseException(line, "Can not set patterns to " + NAME); + throw new YangParseException(moduleName, line, "Can not set patterns to " + NAME); } @Override @@ -183,7 +182,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements @Override public void setFractionDigits(Integer fractionDigits) { - throw new YangParseException(line, "Can not set fraction digits to " + NAME); + throw new YangParseException(moduleName, line, "Can not set fraction digits to " + NAME); } @Override @@ -198,7 +197,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements @Override public void setDefaultValue(Object defaultValue) { - throw new YangParseException(line, "Can not set default value to " + NAME); + throw new YangParseException(moduleName, line, "Can not set default value to " + NAME); } @Override @@ -208,7 +207,7 @@ public final class UnionTypeBuilder extends AbstractTypeAwareBuilder implements @Override public void setUnits(String units) { - throw new YangParseException(line, "Can not set units to " + NAME); + throw new YangParseException(moduleName, line, "Can not set units to " + NAME); } @Override diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java index 267696bdae..e7b344b6fd 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UnknownSchemaNodeBuilder.java @@ -25,13 +25,13 @@ public final class UnknownSchemaNodeBuilder extends AbstractSchemaNodeBuilder { private QName nodeType; private String nodeParameter; - public UnknownSchemaNodeBuilder(final int line, final QName qname) { - super(line, qname); + public UnknownSchemaNodeBuilder(final String moduleName, final int line, final QName qname) { + super(moduleName, line, qname); instance = new UnknownSchemaNodeImpl(qname); } public UnknownSchemaNodeBuilder(UnknownSchemaNodeBuilder b) { - super(b.getLine(), b.getQName()); + super(b.getModuleName(), b.getLine(), b.getQName()); instance = new UnknownSchemaNodeImpl(qname); schemaPath = b.getPath(); description = b.getDescription(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java index 3b1eb33d39..ee07e8be46 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/builder/impl/UsesNodeBuilderImpl.java @@ -20,6 +20,7 @@ import org.opendaylight.controller.yang.model.api.SchemaNode; import org.opendaylight.controller.yang.model.api.SchemaPath; import org.opendaylight.controller.yang.model.api.UnknownSchemaNode; import org.opendaylight.controller.yang.model.api.UsesNode; +import org.opendaylight.controller.yang.parser.builder.api.AbstractBuilder; import org.opendaylight.controller.yang.parser.builder.api.AugmentationSchemaBuilder; import org.opendaylight.controller.yang.parser.builder.api.Builder; import org.opendaylight.controller.yang.parser.builder.api.DataNodeContainerBuilder; @@ -28,10 +29,9 @@ import org.opendaylight.controller.yang.parser.builder.api.UsesNodeBuilder; import org.opendaylight.controller.yang.parser.util.RefineHolder; import org.opendaylight.controller.yang.parser.util.YangParseException; -public final class UsesNodeBuilderImpl implements UsesNodeBuilder { +public final class UsesNodeBuilderImpl extends AbstractBuilder implements UsesNodeBuilder { private boolean isBuilt; private UsesNodeImpl instance; - private final int line; private DataNodeContainerBuilder parent; private final String groupingName; private SchemaPath groupingPath; @@ -40,16 +40,15 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { private final Set addedAugments = new HashSet(); private final List refineBuilders = new ArrayList(); private final List refines = new ArrayList(); - private final List addedUnknownNodes = new ArrayList(); - public UsesNodeBuilderImpl(final int line, final String groupingName) { + public UsesNodeBuilderImpl(final String moduleName, final int line, final String groupingName) { + super(moduleName, line); this.groupingName = groupingName; - this.line = line; } public UsesNodeBuilderImpl(UsesNodeBuilder b) { + super(b.getModuleName(), b.getLine()); groupingName = b.getGroupingName(); - line = b.getLine(); parent = b.getParent(); groupingPath = b.getGroupingPath(); augmenting = b.isAugmenting(); @@ -93,11 +92,6 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { return instance; } - @Override - public int getLine() { - return line; - } - @Override public DataNodeContainerBuilder getParent() { return parent; @@ -106,7 +100,7 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { @Override public void setParent(Builder parent) { if (!(parent instanceof DataNodeContainerBuilder)) { - throw new YangParseException(line, "Unresolved parent of uses '" + groupingName + "'."); + throw new YangParseException(moduleName, line, "Unresolved parent of uses '" + groupingName + "'."); } this.parent = (DataNodeContainerBuilder) parent; } @@ -176,16 +170,6 @@ public final class UsesNodeBuilderImpl implements UsesNodeBuilder { refines.add(refine); } - @Override - public List getUnknownNodeBuilders() { - return addedUnknownNodes; - } - - @Override - public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { - addedUnknownNodes.add(unknownNode); - } - @Override public int hashCode() { final int prime = 31; diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java index 7d64b94421..0c1f5e27dd 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserImpl.java @@ -921,7 +921,7 @@ public final class YangParserImpl implements YangModelParser { usesNode.setGroupingPath(targetGrouping.getPath()); for (RefineHolder refine : usesNode.getRefines()) { final SchemaNodeBuilder nodeToRefine = RefineUtils.getRefineNodeFromGroupingDefinition( - targetGrouping, refine, module.getName()); + targetGrouping, refine); if (nodeToRefine instanceof GroupingMember) { ((GroupingMember) nodeToRefine).setAddedByUses(true); } @@ -1053,7 +1053,8 @@ public final class YangParserImpl implements YangModelParser { } /** - * Add nodes defined in target grouping to current context. + * Add nodes defined in target grouping to current context. Refinement has + * to be already performed. * * @param usesNode * @param targetGrouping @@ -1088,7 +1089,7 @@ public final class YangParserImpl implements YangModelParser { } if (newChild == null) { - throw new YangParseException(usesNode.getLine(), + throw new YangParseException(usesNode.getModuleName(), usesNode.getLine(), "Unknown member of target grouping while resolving uses node."); } @@ -1127,6 +1128,7 @@ public final class YangParserImpl implements YangModelParser { } private void processUsesNode(final UsesNodeBuilder usesNode, final GroupingDefinition targetGrouping) { + final String moduleName = usesNode.getModuleName(); final int line = usesNode.getLine(); List refineNodes = usesNode.getRefineNodes(); DataNodeContainerBuilder parent = usesNode.getParent(); @@ -1143,21 +1145,21 @@ public final class YangParserImpl implements YangModelParser { DataSchemaNodeBuilder newChild = null; if (child instanceof AnyXmlSchemaNode) { - newChild = createAnyXml((AnyXmlSchemaNode) child, line); + newChild = createAnyXml((AnyXmlSchemaNode) child, moduleName, line); } else if (child instanceof ChoiceNode) { - newChild = createChoice((ChoiceNode) child, line); + newChild = createChoice((ChoiceNode) child, moduleName, line); } else if (child instanceof ContainerSchemaNode) { - newChild = createContainer((ContainerSchemaNode) child, line); + newChild = createContainer((ContainerSchemaNode) child, moduleName, line); } else if (child instanceof LeafListSchemaNode) { - newChild = createLeafList((LeafListSchemaNode) child, line); + newChild = createLeafList((LeafListSchemaNode) child, moduleName, line); } else if (child instanceof LeafSchemaNode) { - newChild = createLeafBuilder((LeafSchemaNode) child, line); + newChild = createLeafBuilder((LeafSchemaNode) child, moduleName, line); } else if (child instanceof ListSchemaNode) { - newChild = createList((ListSchemaNode) child, line); + newChild = createList((ListSchemaNode) child, moduleName, line); } if (newChild == null) { - throw new YangParseException(usesNode.getLine(), + throw new YangParseException(moduleName, line, "Unknown member of target grouping while resolving uses node."); } @@ -1169,13 +1171,13 @@ public final class YangParserImpl implements YangModelParser { } } for (GroupingDefinition g : targetGrouping.getGroupings()) { - GroupingBuilder newGrouping = createGrouping(g, line); + GroupingBuilder newGrouping = createGrouping(g, moduleName, line); newGrouping.setAddedByUses(true); newGrouping.setPath(createSchemaPath(parentPath, newGrouping.getQName().getLocalName())); parent.addGrouping(newGrouping); } for (TypeDefinition td : targetGrouping.getTypeDefinitions()) { - TypeDefinitionBuilder newType = createTypedef((ExtendedType) td, line); + TypeDefinitionBuilder newType = createTypedef((ExtendedType) td, moduleName, line); newType.setAddedByUses(true); newType.setPath(createSchemaPath(parentPath, newType.getQName().getLocalName())); parent.addTypedef(newType); @@ -1189,7 +1191,7 @@ public final class YangParserImpl implements YangModelParser { } } for (UnknownSchemaNode un : targetGrouping.getUnknownSchemaNodes()) { - UnknownSchemaNodeBuilder newNode = createUnknownSchemaNode(un, line); + UnknownSchemaNodeBuilder newNode = createUnknownSchemaNode(un, moduleName, line); newNode.setAddedByUses(true); newNode.setPath(createSchemaPath(parentPath, un.getQName().getLocalName())); parent.addUnknownNodeBuilder(newNode); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java index 155deced66..77ac8a5620 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/impl/YangParserListenerImpl.java @@ -373,13 +373,13 @@ public final class YangParserListenerImpl extends YangParserBaseListener { SchemaPath path = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, typeName); moduleBuilder.addIdentityrefType(line, path, getIdentityrefBase(typeBody)); } else { - type = parseTypeWithBody(moduleName, typeName, typeBody, actualPath, namespace, revision, - yangModelPrefix, moduleBuilder.getActualNode()); + type = parseTypeWithBody(typeName, typeBody, actualPath, namespace, revision, yangModelPrefix, + moduleBuilder.getActualNode()); moduleBuilder.setType(type); } } } else { - type = parseUnknownTypeWithBody(moduleName, typeQName, typeBody, actualPath, namespace, revision, yangModelPrefix, + type = parseUnknownTypeWithBody(typeQName, typeBody, actualPath, namespace, revision, yangModelPrefix, moduleBuilder.getActualNode()); // add parent node of this type statement to dirty nodes moduleBuilder.markActualNodeDirty(); @@ -528,8 +528,8 @@ public final class YangParserListenerImpl extends YangParserBaseListener { final String refineString = stringFromNode(ctx); enterLog("refine", refineString, ctx.getStart().getLine()); - RefineHolder refine = parseRefine(ctx); - moduleBuilder.addRefine(refine, actualPath); + RefineHolder refine = parseRefine(ctx, moduleName); + moduleBuilder.addRefine(refine); moduleBuilder.enterNode(refine); actualPath.push(refineString); } @@ -699,7 +699,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { enterLog("notification", notificationName, line); QName notificationQName = new QName(namespace, revision, yangModelPrefix, notificationName); - NotificationBuilder builder = moduleBuilder.addNotification(notificationQName, actualPath, line); + NotificationBuilder builder = moduleBuilder.addNotification(line, notificationQName); moduleBuilder.enterNode(builder); actualPath.push(notificationName); @@ -787,7 +787,7 @@ public final class YangParserListenerImpl extends YangParserBaseListener { QName rpcQName = new QName(namespace, revision, yangModelPrefix, input); SchemaPath path = createActualSchemaPath(actualPath, namespace, revision, yangModelPrefix, input); - ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcInput(path, rpcQName, line); + ContainerSchemaNodeBuilder builder = moduleBuilder.addRpcInput(line, rpcQName, path); moduleBuilder.enterNode(builder); actualPath.push(input); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserListenerUtils.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserListenerUtils.java index 5f291d74a3..d2ca3a7695 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserListenerUtils.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserListenerUtils.java @@ -326,13 +326,14 @@ public final class ParserListenerUtils { * type body context to parse * @param path * actual position in YANG model + * @param moduleName current module name * @param namespace * @param revision * @param prefix * @return List of EnumPair object parsed from given context */ private static List getEnumConstants(final Type_body_stmtsContext ctx, - final List path, final URI namespace, final Date revision, final String prefix) { + final List path, final String moduleName, final URI namespace, final Date revision, final String prefix) { List enumConstants = new ArrayList(); for (int i = 0; i < ctx.getChildCount(); i++) { @@ -342,7 +343,7 @@ public final class ParserListenerUtils { for (int j = 0; j < enumSpecChild.getChildCount(); j++) { ParseTree enumChild = enumSpecChild.getChild(j); if (enumChild instanceof Enum_stmtContext) { - EnumPair enumPair = createEnumPair((Enum_stmtContext) enumChild, highestValue, path, namespace, + EnumPair enumPair = createEnumPair((Enum_stmtContext) enumChild, highestValue, path, moduleName, namespace, revision, prefix); if (enumPair.getValue() > highestValue) { highestValue = enumPair.getValue(); @@ -364,13 +365,16 @@ public final class ParserListenerUtils { * current highest value in enumeration * @param path * actual position in YANG model + * @param moduleName + * current module name * @param namespace * @param revision * @param prefix * @return EnumPair object parsed from given context */ private static EnumTypeDefinition.EnumPair createEnumPair(final Enum_stmtContext ctx, final int highestValue, - final List path, final URI namespace, final Date revision, final String prefix) { + final List path, final String moduleName, final URI namespace, final Date revision, + final String prefix) { final String name = stringFromNode(ctx); final QName qname = new QName(namespace, revision, prefix, name); Integer value = null; @@ -400,7 +404,7 @@ public final class ParserListenerUtils { value = highestValue + 1; } if (value < -2147483648 || value > 2147483647) { - throw new YangParseException(ctx.getStart().getLine(), "Error on enum '" + name + throw new YangParseException(moduleName, ctx.getStart().getLine(), "Error on enum '" + name + "': the enum value MUST be in the range from -2147483648 to 2147483647, but was: " + value); } @@ -543,7 +547,7 @@ public final class ParserListenerUtils { * type body context to parse * @return List of RangeConstraint created from this context */ - private static List getRangeConstraints(final Type_body_stmtsContext ctx) { + private static List getRangeConstraints(final Type_body_stmtsContext ctx, final String moduleName) { List rangeConstraints = Collections.emptyList(); outer: for (int i = 0; i < ctx.getChildCount(); i++) { ParseTree numRestrChild = ctx.getChild(i); @@ -551,7 +555,7 @@ public final class ParserListenerUtils { for (int j = 0; j < numRestrChild.getChildCount(); j++) { ParseTree rangeChild = numRestrChild.getChild(j); if (rangeChild instanceof Range_stmtContext) { - rangeConstraints = parseRangeConstraints((Range_stmtContext) rangeChild); + rangeConstraints = parseRangeConstraints((Range_stmtContext) rangeChild, moduleName); break outer; } } @@ -567,7 +571,7 @@ public final class ParserListenerUtils { * range context to parse * @return List of RangeConstraints parsed from this context */ - private static List parseRangeConstraints(final Range_stmtContext ctx) { + private static List parseRangeConstraints(final Range_stmtContext ctx, final String moduleName) { final int line = ctx.getStart().getLine(); List rangeConstraints = new ArrayList(); String description = null; @@ -590,10 +594,10 @@ public final class ParserListenerUtils { Number min; Number max; if (splittedRangeDef.length == 1) { - min = max = parseNumberConstraintValue(splittedRangeDef[0], line); + min = max = parseNumberConstraintValue(splittedRangeDef[0], moduleName, line); } else { - min = parseNumberConstraintValue(splittedRangeDef[0], line); - max = parseNumberConstraintValue(splittedRangeDef[1], line); + min = parseNumberConstraintValue(splittedRangeDef[0], moduleName, line); + max = parseNumberConstraintValue(splittedRangeDef[1], moduleName, line); } RangeConstraint range = BaseConstraints.rangeConstraint(min, max, description, reference); rangeConstraints.add(range); @@ -609,7 +613,7 @@ public final class ParserListenerUtils { * type body context to parse * @return List of LengthConstraint created from this context */ - private static List getLengthConstraints(final Type_body_stmtsContext ctx) { + private static List getLengthConstraints(final Type_body_stmtsContext ctx, final String moduleName) { List lengthConstraints = Collections.emptyList(); outer: for (int i = 0; i < ctx.getChildCount(); i++) { ParseTree stringRestrChild = ctx.getChild(i); @@ -617,7 +621,7 @@ public final class ParserListenerUtils { for (int j = 0; j < stringRestrChild.getChildCount(); j++) { ParseTree lengthChild = stringRestrChild.getChild(j); if (lengthChild instanceof Length_stmtContext) { - lengthConstraints = parseLengthConstraints((Length_stmtContext) lengthChild); + lengthConstraints = parseLengthConstraints((Length_stmtContext) lengthChild, moduleName); break outer; } } @@ -633,7 +637,7 @@ public final class ParserListenerUtils { * length context to parse * @return List of LengthConstraints parsed from this context */ - private static List parseLengthConstraints(final Length_stmtContext ctx) { + private static List parseLengthConstraints(final Length_stmtContext ctx, final String moduleName) { final int line = ctx.getStart().getLine(); List lengthConstraints = new ArrayList(); String description = null; @@ -656,10 +660,10 @@ public final class ParserListenerUtils { Number min; Number max; if (splittedRangeDef.length == 1) { - min = max = parseNumberConstraintValue(splittedRangeDef[0], line); + min = max = parseNumberConstraintValue(splittedRangeDef[0], moduleName, line); } else { - min = parseNumberConstraintValue(splittedRangeDef[0], line); - max = parseNumberConstraintValue(splittedRangeDef[1], line); + min = parseNumberConstraintValue(splittedRangeDef[0], moduleName, line); + max = parseNumberConstraintValue(splittedRangeDef[1], moduleName, line); } LengthConstraint range = BaseConstraints.lengthConstraint(min, max, description, reference); lengthConstraints.add(range); @@ -674,7 +678,7 @@ public final class ParserListenerUtils { * @return wrapper object of primitive java type or UnknownBoundaryNumber if * type is one of special YANG values 'min' or 'max' */ - private static Number parseNumberConstraintValue(final String value, final int line) { + private static Number parseNumberConstraintValue(final String value, final String moduleName, final int line) { Number result = null; if ("min".equals(value) || "max".equals(value)) { result = new UnknownBoundaryNumber(value); @@ -682,7 +686,7 @@ public final class ParserListenerUtils { try { result = Long.valueOf(value); } catch (NumberFormatException e) { - throw new YangParseException(line, "Unable to parse range value '" + value + "'.", e); + throw new YangParseException(moduleName, line, "Unable to parse range value '" + value + "'.", e); } } return result; @@ -812,13 +816,14 @@ public final class ParserListenerUtils { * type body context to parse * @param actualPath * current position in YANG model + * @param moduleName current module name * @param namespace * @param revision * @param prefix * @return List of Bit objects created from this context */ private static List getBits(Type_body_stmtsContext ctx, List actualPath, - URI namespace, Date revision, String prefix) { + String moduleName, URI namespace, Date revision, String prefix) { final List bits = new ArrayList(); for (int j = 0; j < ctx.getChildCount(); j++) { ParseTree bitsSpecChild = ctx.getChild(j); @@ -827,7 +832,7 @@ public final class ParserListenerUtils { for (int k = 0; k < bitsSpecChild.getChildCount(); k++) { ParseTree bitChild = bitsSpecChild.getChild(k); if (bitChild instanceof Bit_stmtContext) { - Bit bit = parseBit((Bit_stmtContext) bitChild, highestPosition, actualPath, namespace, + Bit bit = parseBit((Bit_stmtContext) bitChild, highestPosition, actualPath, moduleName, namespace, revision, prefix); if (bit.getPosition() > highestPosition) { highestPosition = bit.getPosition(); @@ -849,13 +854,14 @@ public final class ParserListenerUtils { * current highest position in bits type * @param actualPath * current position in YANG model + * @param moduleName current module name * @param namespace * @param revision * @param prefix * @return Bit object parsed from this context */ private static BitsTypeDefinition.Bit parseBit(final Bit_stmtContext ctx, long highestPosition, - List actualPath, final URI namespace, final Date revision, final String prefix) { + List actualPath, final String moduleName, final URI namespace, final Date revision, final String prefix) { String name = stringFromNode(ctx); final QName qname = new QName(namespace, revision, prefix, name); Long position = null; @@ -888,7 +894,7 @@ public final class ParserListenerUtils { position = highestPosition + 1; } if (position < 0 || position > 4294967295L) { - throw new YangParseException(ctx.getStart().getLine(), "Error on bit '" + name + throw new YangParseException(moduleName, ctx.getStart().getLine(), "Error on bit '" + name + "': the position value MUST be in the range 0 to 4294967295"); } @@ -946,7 +952,7 @@ public final class ParserListenerUtils { for (int i = 0; i < ctx.getChildCount(); i++) { ParseTree child = ctx.getChild(i); if (child instanceof Config_stmtContext) { - config = parseConfig((Config_stmtContext) child); + config = parseConfig((Config_stmtContext) child, moduleName); break; } } @@ -994,10 +1000,11 @@ public final class ParserListenerUtils { * Parse config statement. * * @param ctx - * config context to parse. + * config context to parse + * @param moduleName current module name * @return true if given context contains string 'true', false otherwise */ - private static Boolean parseConfig(final Config_stmtContext ctx) { + private static Boolean parseConfig(final Config_stmtContext ctx, final String moduleName) { Boolean result = null; if (ctx != null) { for (int i = 0; i < ctx.getChildCount(); ++i) { @@ -1011,7 +1018,7 @@ public final class ParserListenerUtils { result = false; break; } else { - throw new YangParseException(ctx.getStart().getLine(), + throw new YangParseException(moduleName, ctx.getStart().getLine(), "Failed to parse 'config' statement value: '" + value + "'."); } } @@ -1023,8 +1030,6 @@ public final class ParserListenerUtils { /** * Parse type body and create UnknownType definition. * - * @param moduleName - * name of current module * @param typedefQName * qname of current type * @param ctx @@ -1036,16 +1041,17 @@ public final class ParserListenerUtils { * @param parent * @return UnknownType object with constraints from parsed type body */ - public static TypeDefinition parseUnknownTypeWithBody(final String moduleName, final QName typedefQName, + public static TypeDefinition parseUnknownTypeWithBody(final QName typedefQName, final Type_body_stmtsContext ctx, final List actualPath, final URI namespace, final Date revision, final String prefix, final Builder parent) { + String moduleName = parent.getModuleName(); String typeName = typedefQName.getLocalName(); UnknownType.Builder unknownType = new UnknownType.Builder(typedefQName); if (ctx != null) { - List rangeStatements = getRangeConstraints(ctx); - List lengthStatements = getLengthConstraints(ctx); + List rangeStatements = getRangeConstraints(ctx, moduleName); + List lengthStatements = getLengthConstraints(ctx, moduleName); List patternStatements = getPatternConstraint(ctx); Integer fractionDigits = getFractionDigits(ctx, moduleName); @@ -1080,8 +1086,6 @@ public final class ParserListenerUtils { /** * Create TypeDefinition object based on given type name and type body. * - * @param moduleName - * current module name * @param typeName * name of type * @param typeBody @@ -1098,16 +1102,17 @@ public final class ParserListenerUtils { * parent builder * @return TypeDefinition object based on parsed values. */ - public static TypeDefinition parseTypeWithBody(final String moduleName, final String typeName, + public static TypeDefinition parseTypeWithBody(final String typeName, final Type_body_stmtsContext typeBody, final List actualPath, final URI namespace, final Date revision, final String prefix, final Builder parent) { + final String moduleName = parent.getModuleName(); final int line = typeBody.getStart().getLine(); TypeDefinition baseType = null; Integer fractionDigits = getFractionDigits(typeBody, moduleName); - List lengthStatements = getLengthConstraints(typeBody); + List lengthStatements = getLengthConstraints(typeBody, moduleName); List patternStatements = getPatternConstraint(typeBody); - List rangeStatements = getRangeConstraints(typeBody); + List rangeStatements = getRangeConstraints(typeBody, moduleName); TypeConstraints constraints = new TypeConstraints(moduleName, line); constraints.addFractionDigits(fractionDigits); @@ -1159,7 +1164,7 @@ public final class ParserListenerUtils { constraints.addRanges(uintType.getRangeStatements()); baseType = uintType; } else if ("enumeration".equals(typeName)) { - List enumConstants = getEnumConstants(typeBody, actualPath, namespace, + List enumConstants = getEnumConstants(typeBody, actualPath, moduleName, namespace, revision, prefix); return new EnumerationType(baseTypePathFinal, enumConstants); } else if ("string".equals(typeName)) { @@ -1167,7 +1172,7 @@ public final class ParserListenerUtils { constraints.addLengths(stringType.getLengthStatements()); baseType = stringType; } else if ("bits".equals(typeName)) { - return new BitsType(baseTypePathFinal, getBits(typeBody, actualPath, namespace, revision, prefix)); + return new BitsType(baseTypePathFinal, getBits(typeBody, actualPath, moduleName, namespace, revision, prefix)); } else if ("leafref".equals(typeName)) { final String path = parseLeafrefPath(typeBody); final boolean absolute = path.startsWith("/"); @@ -1382,10 +1387,10 @@ public final class ParserListenerUtils { for (int i = 0; i < ctx.getChildCount(); ++i) { final ParseTree childNode = ctx.getChild(i); if (childNode instanceof Max_elements_stmtContext) { - Integer max = parseMaxElements((Max_elements_stmtContext) childNode); + Integer max = parseMaxElements((Max_elements_stmtContext) childNode, constraints.getModuleName()); constraints.setMaxElements(max); } else if (childNode instanceof Min_elements_stmtContext) { - Integer min = parseMinElements((Min_elements_stmtContext) childNode); + Integer min = parseMinElements((Min_elements_stmtContext) childNode, constraints.getModuleName()); constraints.setMinElements(min); } else if (childNode instanceof Must_stmtContext) { MustDefinition must = parseMust((Must_stmtContext) childNode); @@ -1404,7 +1409,7 @@ public final class ParserListenerUtils { } } - private static Integer parseMinElements(Min_elements_stmtContext ctx) { + private static Integer parseMinElements(Min_elements_stmtContext ctx, String moduleName) { Integer result = null; try { for (int i = 0; i < ctx.getChildCount(); i++) { @@ -1418,11 +1423,11 @@ public final class ParserListenerUtils { } return result; } catch (Exception e) { - throw new YangParseException(ctx.getStart().getLine(), "Failed to parse min-elements.", e); + throw new YangParseException(moduleName, ctx.getStart().getLine(), "Failed to parse min-elements.", e); } } - private static Integer parseMaxElements(Max_elements_stmtContext ctx) { + private static Integer parseMaxElements(Max_elements_stmtContext ctx, String moduleName) { Integer result = null; try { for (int i = 0; i < ctx.getChildCount(); i++) { @@ -1436,7 +1441,7 @@ public final class ParserListenerUtils { } return result; } catch (Exception e) { - throw new YangParseException(ctx.getStart().getLine(), "Failed to parse max-elements.", e); + throw new YangParseException(moduleName, ctx.getStart().getLine(), "Failed to parse max-elements.", e); } } @@ -1506,9 +1511,9 @@ public final class ParserListenerUtils { * refine statement * @return RefineHolder object representing this refine statement */ - public static RefineHolder parseRefine(Refine_stmtContext refineCtx) { + public static RefineHolder parseRefine(Refine_stmtContext refineCtx, String moduleName) { final String refineTarget = stringFromNode(refineCtx); - final RefineHolder refine = new RefineHolder(refineCtx.getStart().getLine(), refineTarget); + final RefineHolder refine = new RefineHolder(moduleName, refineCtx.getStart().getLine(), refineTarget); for (int i = 0; i < refineCtx.getChildCount(); i++) { ParseTree refinePom = refineCtx.getChild(i); if (refinePom instanceof Refine_pomContext) { @@ -1545,7 +1550,7 @@ public final class ParserListenerUtils { String reference = stringFromNode(refineArg); refine.setReference(reference); } else if (refineArg instanceof Config_stmtContext) { - Boolean config = parseConfig((Config_stmtContext) refineArg); + Boolean config = parseConfig((Config_stmtContext) refineArg, refine.getModuleName()); refine.setConfiguration(config); } } @@ -1594,10 +1599,10 @@ public final class ParserListenerUtils { MustDefinition must = parseMust((Must_stmtContext) refineArg); refine.setMust(must); } else if (refineArg instanceof Max_elements_stmtContext) { - Integer max = parseMaxElements((Max_elements_stmtContext) refineArg); + Integer max = parseMaxElements((Max_elements_stmtContext) refineArg, refine.getModuleName()); refine.setMaxElements(max); } else if (refineArg instanceof Min_elements_stmtContext) { - Integer min = parseMinElements((Min_elements_stmtContext) refineArg); + Integer min = parseMinElements((Min_elements_stmtContext) refineArg, refine.getModuleName()); refine.setMinElements(min); } } @@ -1611,10 +1616,10 @@ public final class ParserListenerUtils { MustDefinition must = parseMust((Must_stmtContext) refineArg); refine.setMust(must); } else if (refineArg instanceof Max_elements_stmtContext) { - Integer max = parseMaxElements((Max_elements_stmtContext) refineArg); + Integer max = parseMaxElements((Max_elements_stmtContext) refineArg, refine.getModuleName()); refine.setMaxElements(max); } else if (refineArg instanceof Min_elements_stmtContext) { - Integer min = parseMinElements((Min_elements_stmtContext) refineArg); + Integer min = parseMinElements((Min_elements_stmtContext) refineArg, refine.getModuleName()); refine.setMinElements(min); } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java index 587c8bed4e..25232796cc 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/ParserUtils.java @@ -482,7 +482,7 @@ public final class ParserUtils { } } correctAugmentChildPath(builder, target.getPath()); - target.addChildNode(builder); + target.addCase(builder); } } @@ -750,8 +750,9 @@ public final class ParserUtils { * line in module * @return builder object from leaf */ - public static LeafSchemaNodeBuilder createLeafBuilder(LeafSchemaNode leaf, int line) { - final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(leaf.getQName(), leaf.getPath(), line); + public static LeafSchemaNodeBuilder createLeafBuilder(LeafSchemaNode leaf, String moduleName, int line) { + final LeafSchemaNodeBuilder builder = new LeafSchemaNodeBuilder(moduleName, line, leaf.getQName(), + leaf.getPath()); convertDataSchemaNode(leaf, builder); builder.setConfiguration(leaf.isConfiguration()); final TypeDefinition type = leaf.getType(); @@ -763,9 +764,9 @@ public final class ParserUtils { return builder; } - public static ContainerSchemaNodeBuilder createContainer(ContainerSchemaNode container, int line) { - final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(line, container.getQName(), - container.getPath()); + public static ContainerSchemaNodeBuilder createContainer(ContainerSchemaNode container, String moduleName, int line) { + final ContainerSchemaNodeBuilder builder = new ContainerSchemaNodeBuilder(moduleName, line, + container.getQName(), container.getPath()); convertDataSchemaNode(container, builder); builder.setConfiguration(container.isConfiguration()); builder.setUnknownNodes(container.getUnknownSchemaNodes()); @@ -778,8 +779,8 @@ public final class ParserUtils { return builder; } - public static ListSchemaNodeBuilder createList(ListSchemaNode list, int line) { - ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(line, list.getQName(), list.getPath()); + public static ListSchemaNodeBuilder createList(ListSchemaNode list, String moduleName, int line) { + ListSchemaNodeBuilder builder = new ListSchemaNodeBuilder(moduleName, line, list.getQName(), list.getPath()); convertDataSchemaNode(list, builder); builder.setConfiguration(list.isConfiguration()); builder.setUnknownNodes(list.getUnknownSchemaNodes()); @@ -792,8 +793,8 @@ public final class ParserUtils { return builder; } - public static LeafListSchemaNodeBuilder createLeafList(LeafListSchemaNode leafList, int line) { - final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(line, leafList.getQName(), + public static LeafListSchemaNodeBuilder createLeafList(LeafListSchemaNode leafList, String moduleName, int line) { + final LeafListSchemaNodeBuilder builder = new LeafListSchemaNodeBuilder(moduleName, line, leafList.getQName(), leafList.getPath()); convertDataSchemaNode(leafList, builder); builder.setConfiguration(leafList.isConfiguration()); @@ -803,8 +804,8 @@ public final class ParserUtils { return builder; } - public static ChoiceBuilder createChoice(ChoiceNode choice, int line) { - final ChoiceBuilder builder = new ChoiceBuilder(line, choice.getQName()); + public static ChoiceBuilder createChoice(ChoiceNode choice, String moduleName, int line) { + final ChoiceBuilder builder = new ChoiceBuilder(moduleName, line, choice.getQName()); convertDataSchemaNode(choice, builder); builder.setConfiguration(choice.isConfiguration()); builder.setCases(choice.getCases()); @@ -813,16 +814,16 @@ public final class ParserUtils { return builder; } - public static AnyXmlBuilder createAnyXml(AnyXmlSchemaNode anyxml, int line) { - final AnyXmlBuilder builder = new AnyXmlBuilder(line, anyxml.getQName(), anyxml.getPath()); + public static AnyXmlBuilder createAnyXml(AnyXmlSchemaNode anyxml, String moduleName, int line) { + final AnyXmlBuilder builder = new AnyXmlBuilder(moduleName, line, anyxml.getQName(), anyxml.getPath()); convertDataSchemaNode(anyxml, builder); builder.setConfiguration(anyxml.isConfiguration()); builder.setUnknownNodes(anyxml.getUnknownSchemaNodes()); return builder; } - public static GroupingBuilder createGrouping(GroupingDefinition grouping, int line) { - final GroupingBuilderImpl builder = new GroupingBuilderImpl(grouping.getQName(), line); + public static GroupingBuilder createGrouping(GroupingDefinition grouping, String moduleName, int line) { + final GroupingBuilderImpl builder = new GroupingBuilderImpl(moduleName, line, grouping.getQName()); builder.setPath(grouping.getPath()); builder.setChildNodes(grouping.getChildNodes()); builder.setGroupings(grouping.getGroupings()); @@ -835,8 +836,8 @@ public final class ParserUtils { return builder; } - public static TypeDefinitionBuilder createTypedef(ExtendedType typedef, int line) { - final TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(typedef.getQName(), line); + public static TypeDefinitionBuilder createTypedef(ExtendedType typedef, String moduleName, int line) { + final TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(moduleName, line, typedef.getQName()); builder.setPath(typedef.getPath()); builder.setDefaultValue(typedef.getDefaultValue()); builder.setUnits(typedef.getUnits()); @@ -854,8 +855,9 @@ public final class ParserUtils { return builder; } - public static UnknownSchemaNodeBuilder createUnknownSchemaNode(UnknownSchemaNode unknownNode, int line) { - final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(line, unknownNode.getQName()); + public static UnknownSchemaNodeBuilder createUnknownSchemaNode(UnknownSchemaNode unknownNode, String moduleName, + int line) { + final UnknownSchemaNodeBuilder builder = new UnknownSchemaNodeBuilder(moduleName, line, unknownNode.getQName()); builder.setPath(unknownNode.getPath()); builder.setUnknownNodes(unknownNode.getUnknownSchemaNodes()); builder.setDescription(unknownNode.getDescription()); @@ -1084,7 +1086,8 @@ public final class ParserUtils { tc.addRanges(oldExtendedType.getRanges()); final TypeConstraints constraints = findConstraintsFromTypeBuilder(newBaseType, tc, modules, module, null); - final TypeDefinitionBuilderImpl newType = new TypeDefinitionBuilderImpl(oldExtendedType.getQName(), line); + final TypeDefinitionBuilderImpl newType = new TypeDefinitionBuilderImpl(module.getModuleName(), line, + oldExtendedType.getQName()); newType.setTypedef(newBaseType); newType.setPath(oldExtendedType.getPath()); newType.setDescription(oldExtendedType.getDescription()); @@ -1120,7 +1123,8 @@ public final class ParserUtils { final TypeConstraints tc = new TypeConstraints(module.getName(), line); final TypeConstraints constraints = findConstraintsFromTypeDefinition(newBaseType, tc); - final TypeDefinitionBuilderImpl newType = new TypeDefinitionBuilderImpl(oldExtendedType.getQName(), line); + final TypeDefinitionBuilderImpl newType = new TypeDefinitionBuilderImpl(module.getModuleName(), line, + oldExtendedType.getQName()); newType.setType(newBaseType); newType.setPath(oldExtendedType.getPath()); newType.setDescription(oldExtendedType.getDescription()); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java index 44bb56be1c..9e57d80aa9 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineHolder.java @@ -7,16 +7,10 @@ */ package org.opendaylight.controller.yang.parser.util; -import java.util.ArrayList; -import java.util.List; - import org.opendaylight.controller.yang.model.api.MustDefinition; -import org.opendaylight.controller.yang.parser.builder.api.Builder; -import org.opendaylight.controller.yang.parser.builder.impl.UnknownSchemaNodeBuilder; +import org.opendaylight.controller.yang.parser.builder.api.AbstractBuilder; -public final class RefineHolder implements Builder { - private Builder parent; - private final int line; +public final class RefineHolder extends AbstractBuilder { private final String name; private String defaultStr; private String description; @@ -27,26 +21,10 @@ public final class RefineHolder implements Builder { private MustDefinition must; private Integer minElements; private Integer maxElements; - private final List addedUnknownNodes = new ArrayList(); - public RefineHolder(final int line, final String name) { + public RefineHolder(final String moduleName, final int line, final String name) { + super(moduleName, line); this.name = name; - this.line = line; - } - - @Override - public int getLine() { - return line; - } - - @Override - public Builder getParent() { - return parent; - } - - @Override - public void setParent(final Builder parent) { - this.parent = parent; } public String getDefaultStr() { @@ -125,16 +103,6 @@ public final class RefineHolder implements Builder { return name; } - @Override - public List getUnknownNodeBuilders() { - return addedUnknownNodes; - } - - @Override - public void addUnknownNodeBuilder(UnknownSchemaNodeBuilder unknownNode) { - addedUnknownNodes.add(unknownNode); - } - @Override public Object build() { return null; @@ -233,7 +201,7 @@ public final class RefineHolder implements Builder { @Override public String toString() { - return "revine " + name; + return "refine " + name; } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java index 69c90caadf..11d00cc05c 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/RefineUtils.java @@ -96,38 +96,37 @@ public class RefineUtils { * grouping which should contains node to refine * @param refine * refine object containing informations about refine - * @param moduleName - * current module name * @return */ public static SchemaNodeBuilder getRefineNodeFromGroupingDefinition(final GroupingDefinition grouping, - final RefineHolder refine, final String moduleName) { - SchemaNodeBuilder result = null; + final RefineHolder refine) { + final String moduleName = refine.getModuleName(); final int line = refine.getLine(); + SchemaNodeBuilder result = null; final Object lookedUpNode = findRefineTargetNode(grouping, refine.getName()); if (lookedUpNode instanceof LeafSchemaNode) { - result = createLeafBuilder((LeafSchemaNode) lookedUpNode, line); + result = createLeafBuilder((LeafSchemaNode) lookedUpNode, moduleName, line); } else if (lookedUpNode instanceof ContainerSchemaNode) { - result = createContainer((ContainerSchemaNode) lookedUpNode, line); + result = createContainer((ContainerSchemaNode) lookedUpNode, moduleName, line); } else if (lookedUpNode instanceof ListSchemaNode) { - result = createList((ListSchemaNode) lookedUpNode, line); + result = createList((ListSchemaNode) lookedUpNode, moduleName, line); } else if (lookedUpNode instanceof LeafListSchemaNode) { - result = createLeafList((LeafListSchemaNode) lookedUpNode, line); + result = createLeafList((LeafListSchemaNode) lookedUpNode, moduleName, line); } else if (lookedUpNode instanceof ChoiceNode) { - result = createChoice((ChoiceNode) lookedUpNode, line); + result = createChoice((ChoiceNode) lookedUpNode, moduleName, line); } else if (lookedUpNode instanceof AnyXmlSchemaNode) { - result = createAnyXml((AnyXmlSchemaNode) lookedUpNode, line); + result = createAnyXml((AnyXmlSchemaNode) lookedUpNode, moduleName, line); } else if (lookedUpNode instanceof GroupingDefinition) { - result = createGrouping((GroupingDefinition) lookedUpNode, line); + result = createGrouping((GroupingDefinition) lookedUpNode, moduleName, line); } else if (lookedUpNode instanceof TypeDefinition) { - result = createTypedef((ExtendedType) lookedUpNode, line); + result = createTypedef((ExtendedType) lookedUpNode, moduleName, line); } else { throw new YangParseException(moduleName, line, "Target '" + refine.getName() + "' can not be refined"); } return result; } - public static void refineLeaf(LeafSchemaNodeBuilder leaf, RefineHolder refine, int line) { + public static void refineLeaf(LeafSchemaNodeBuilder leaf, RefineHolder refine) { String defaultStr = refine.getDefaultStr(); Boolean mandatory = refine.isMandatory(); MustDefinition must = refine.getMust(); @@ -256,8 +255,9 @@ public class RefineUtils { * refine object containing information about refine process */ public static void checkRefine(SchemaNodeBuilder node, RefineHolder refine) { - String name = node.getQName().getLocalName(); + String moduleName = refine.getModuleName(); int line = refine.getLine(); + String name = node.getQName().getLocalName(); String defaultStr = refine.getDefaultStr(); Boolean mandatory = refine.isMandatory(); @@ -267,64 +267,66 @@ public class RefineUtils { Integer max = refine.getMaxElements(); if (node instanceof AnyXmlBuilder) { - checkRefineDefault(node, defaultStr, line); - checkRefinePresence(node, presence, line); - checkRefineMinMax(name, line, min, max); + checkRefineDefault(node, defaultStr, moduleName, line); + checkRefinePresence(node, presence, moduleName, line); + checkRefineMinMax(name, min, max, moduleName, line); } else if (node instanceof ChoiceBuilder) { - checkRefinePresence(node, presence, line); - checkRefineMust(node, must, line); - checkRefineMinMax(name, line, min, max); + checkRefinePresence(node, presence, moduleName, line); + checkRefineMust(node, must, moduleName, line); + checkRefineMinMax(name, min, max, moduleName, line); } else if (node instanceof ContainerSchemaNodeBuilder) { - checkRefineDefault(node, defaultStr, line); - checkRefineMandatory(node, mandatory, line); - checkRefineMust(node, must, line); - checkRefineMinMax(name, line, min, max); + checkRefineDefault(node, defaultStr, moduleName, line); + checkRefineMandatory(node, mandatory, moduleName, line); + checkRefineMust(node, must, moduleName, line); + checkRefineMinMax(name, min, max, moduleName, line); } else if (node instanceof LeafSchemaNodeBuilder) { - checkRefinePresence(node, presence, line); - checkRefineMinMax(name, line, min, max); + checkRefinePresence(node, presence, moduleName, line); + checkRefineMinMax(name, min, max, moduleName, line); } else if (node instanceof LeafListSchemaNodeBuilder || node instanceof ListSchemaNodeBuilder) { - checkRefineDefault(node, defaultStr, line); - checkRefinePresence(node, presence, line); - checkRefineMandatory(node, mandatory, line); + checkRefineDefault(node, defaultStr, moduleName, line); + checkRefinePresence(node, presence, moduleName, line); + checkRefineMandatory(node, mandatory, moduleName, line); } else if (node instanceof GroupingBuilder || node instanceof TypeDefinitionBuilder || node instanceof UsesNodeBuilder) { - checkRefineDefault(node, defaultStr, line); - checkRefinePresence(node, presence, line); - checkRefineMandatory(node, mandatory, line); - checkRefineMust(node, must, line); - checkRefineMinMax(name, line, min, max); + checkRefineDefault(node, defaultStr, moduleName, line); + checkRefinePresence(node, presence, moduleName, line); + checkRefineMandatory(node, mandatory, moduleName, line); + checkRefineMust(node, must, moduleName, line); + checkRefineMinMax(name, min, max, moduleName, line); } } - private static void checkRefineDefault(SchemaNodeBuilder node, String defaultStr, int line) { + private static void checkRefineDefault(SchemaNodeBuilder node, String defaultStr, String moduleName, int line) { if (defaultStr != null) { - throw new YangParseException(line, "Can not refine 'default' for '" + node.getQName().getLocalName() + "'."); + throw new YangParseException(moduleName, line, "Can not refine 'default' for '" + + node.getQName().getLocalName() + "'."); } } - private static void checkRefineMandatory(SchemaNodeBuilder node, Boolean mandatory, int line) { + private static void checkRefineMandatory(SchemaNodeBuilder node, Boolean mandatory, String moduleName, int line) { if (mandatory != null) { - throw new YangParseException(line, "Can not refine 'mandatory' for '" + node.getQName().getLocalName() - + "'."); + throw new YangParseException(moduleName, line, "Can not refine 'mandatory' for '" + + node.getQName().getLocalName() + "'."); } } - private static void checkRefinePresence(SchemaNodeBuilder node, Boolean presence, int line) { + private static void checkRefinePresence(SchemaNodeBuilder node, Boolean presence, String moduleName, int line) { if (presence != null) { - throw new YangParseException(line, "Can not refine 'presence' for '" + node.getQName().getLocalName() - + "'."); + throw new YangParseException(moduleName, line, "Can not refine 'presence' for '" + + node.getQName().getLocalName() + "'."); } } - private static void checkRefineMust(SchemaNodeBuilder node, MustDefinition must, int line) { + private static void checkRefineMust(SchemaNodeBuilder node, MustDefinition must, String moduleName, int line) { if (must != null) { - throw new YangParseException(line, "Can not refine 'must' for '" + node.getQName().getLocalName() + "'."); + throw new YangParseException(moduleName, line, "Can not refine 'must' for '" + + node.getQName().getLocalName() + "'."); } } - private static void checkRefineMinMax(String refineTargetName, int refineLine, Integer min, Integer max) { + private static void checkRefineMinMax(String refineTargetName, Integer min, Integer max, String moduleName, int line) { if (min != null || max != null) { - throw new YangParseException(refineLine, "Can not refine 'min-elements' or 'max-elements' for '" + throw new YangParseException(moduleName, line, "Can not refine 'min-elements' or 'max-elements' for '" + refineTargetName + "'."); } } @@ -343,10 +345,10 @@ public class RefineUtils { * node to refine * @param refine * refine object containing information about refine process - * @param line - * current line in yang model */ - public static void refineDefault(final Builder node, final RefineHolder refine, final int line) { + public static void refineDefault(final Builder node, final RefineHolder refine) { + final String moduleName = refine.getModuleName(); + final int line = refine.getLine(); Class cls = node.getClass(); String description = refine.getDescription(); @@ -355,7 +357,7 @@ public class RefineUtils { Method method = cls.getDeclaredMethod("setDescription", String.class); method.invoke(node, description); } catch (Exception e) { - throw new YangParseException(line, "Cannot refine description in " + cls.getName(), e); + throw new YangParseException(moduleName, line, "Cannot refine description in " + cls.getName(), e); } } @@ -365,7 +367,7 @@ public class RefineUtils { Method method = cls.getDeclaredMethod("setReference", String.class); method.invoke(node, reference); } catch (Exception e) { - throw new YangParseException(line, "Cannot refine reference in " + cls.getName(), e); + throw new YangParseException(moduleName, line, "Cannot refine reference in " + cls.getName(), e); } } @@ -375,7 +377,7 @@ public class RefineUtils { Method method = cls.getDeclaredMethod("setConfiguration", Boolean.class); method.invoke(node, config); } catch (Exception e) { - throw new YangParseException(line, "Cannot refine config in " + cls.getName(), e); + throw new YangParseException(moduleName, line, "Cannot refine config in " + cls.getName(), e); } } } @@ -392,9 +394,9 @@ public class RefineUtils { */ public static void performRefine(SchemaNodeBuilder nodeToRefine, RefineHolder refine, int line) { checkRefine(nodeToRefine, refine); - refineDefault(nodeToRefine, refine, line); + refineDefault(nodeToRefine, refine); if (nodeToRefine instanceof LeafSchemaNodeBuilder) { - refineLeaf((LeafSchemaNodeBuilder) nodeToRefine, refine, line); + refineLeaf((LeafSchemaNodeBuilder) nodeToRefine, refine); } else if (nodeToRefine instanceof ContainerSchemaNodeBuilder) { refineContainer((ContainerSchemaNodeBuilder) nodeToRefine, refine, line); } else if (nodeToRefine instanceof ListSchemaNodeBuilder) { diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/TypeConstraints.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/TypeConstraints.java index 4d2c5b5823..08422c8392 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/TypeConstraints.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/TypeConstraints.java @@ -229,7 +229,7 @@ public final class TypeConstraints { for (RangeConstraint range : typeRange) { if (range.getMin() instanceof UnknownBoundaryNumber || range.getMax() instanceof UnknownBoundaryNumber) { - throw new YangParseException(line, "Unresolved range constraints"); + throw new YangParseException(moduleName, line, "Unresolved range constraints"); } final long min = range.getMin().longValue(); final long max = range.getMax().longValue(); @@ -268,7 +268,7 @@ public final class TypeConstraints { for (RangeConstraint range : typeRange) { if (range.getMin() instanceof UnknownBoundaryNumber || range.getMax() instanceof UnknownBoundaryNumber) { - throw new YangParseException(line, "Unresolved range constraints"); + throw new YangParseException(moduleName, line, "Unresolved range constraints"); } final long min = range.getMin().longValue(); final long max = range.getMax().longValue(); @@ -308,7 +308,7 @@ public final class TypeConstraints { for (LengthConstraint length : typeLength) { if (length.getMin() instanceof UnknownBoundaryNumber || length.getMax() instanceof UnknownBoundaryNumber) { - throw new YangParseException(line, "Unresolved length constraints"); + throw new YangParseException(moduleName, line, "Unresolved length constraints"); } final long min = length.getMin().longValue(); final long max = length.getMax().longValue(); @@ -347,7 +347,7 @@ public final class TypeConstraints { for (LengthConstraint length : typeLength) { if (length.getMin() instanceof UnknownBoundaryNumber || length.getMax() instanceof UnknownBoundaryNumber) { - throw new YangParseException(line, "Unresolved length constraints"); + throw new YangParseException(moduleName, line, "Unresolved length constraints"); } final long min = length.getMin().longValue(); final long max = length.getMax().longValue(); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangParseException.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangParseException.java index c9fd723559..6939261a57 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangParseException.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/main/java/org/opendaylight/controller/yang/parser/util/YangParseException.java @@ -8,7 +8,6 @@ package org.opendaylight.controller.yang.parser.util; public class YangParseException extends RuntimeException { - private static final long serialVersionUID = 1239548963471793178L; public YangParseException(final String errorMsg) { @@ -19,24 +18,15 @@ public class YangParseException extends RuntimeException { super(errorMsg, exception); } - public YangParseException(final int line, final String errorMsg) { - super("Error on line " + line + ": " + errorMsg); - } - - public YangParseException(final int line, final String errorMsg, - final Exception exception) { - super("Error on line " + line + ": " + errorMsg, exception); - } - public YangParseException(final String moduleName, final int line, final String errorMsg) { - super("Error in module '" + moduleName + "' on line " + line + ": " + super("Error in module '" + moduleName + "' at line " + line + ": " + errorMsg); } public YangParseException(final String moduleName, final int line, final String errorMsg, final Exception exception) { - super("Error in module '" + moduleName + "' on line " + line + ": " + super("Error in module '" + moduleName + "' at line " + line + ": " + errorMsg, exception); } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserNegativeTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserNegativeTest.java index fb73bd6e5b..0412013405 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserNegativeTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserNegativeTest.java @@ -13,6 +13,7 @@ import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.junit.Test; @@ -43,8 +44,7 @@ public class YangParserNegativeTest { fail("YangParseException should by thrown"); } } catch (YangParseException e) { - assertTrue(e.getMessage().contains( - "Error in module 'test2' on line 24: Referenced type 'int-ext' not found.")); + assertEquals(e.getMessage(), "Error in module 'test2' at line 24: Referenced type 'int-ext' not found."); } } @@ -116,8 +116,8 @@ public class YangParserNegativeTest { fail("YangParseException should by thrown"); } } catch (YangParseException e) { - assertTrue(e.getMessage() - .contains("Error in module 'container' on line 10: Duplicate node found at line 6")); + String expected = "Error in module 'container' at line 10: Can not add 'container foo': node with same name already declared at line 6"; + assertEquals(expected, e.getMessage()); } } @@ -130,8 +130,8 @@ public class YangParserNegativeTest { fail("YangParseException should by thrown"); } } catch (YangParseException e) { - assertTrue(e.getMessage().contains( - "Error in module 'container-list' on line 10: Duplicate node found at line 6")); + String expected = "Error in module 'container-list' at line 10: Can not add 'list foo': node with same name already declared at line 6"; + assertEquals(expected, e.getMessage()); } } @@ -144,8 +144,8 @@ public class YangParserNegativeTest { fail("YangParseException should by thrown"); } } catch (YangParseException e) { - assertTrue(e.getMessage().contains( - "Error in module 'container-leaf' on line 10: Duplicate node found at line 6")); + String expected = "Error in module 'container-leaf' at line 10: Can not add 'leaf foo': node with same name already declared at line 6"; + assertEquals(expected, e.getMessage()); } } @@ -158,7 +158,40 @@ public class YangParserNegativeTest { fail("YangParseException should by thrown"); } } catch (YangParseException e) { - assertTrue(e.getMessage().contains("Error in module 'typedef' on line 10: Duplicate node found at line 6")); + String expected = "Error in module 'typedef' at line 10: typedef with same name 'int-ext' already declared at line 6"; + assertEquals(expected, e.getMessage()); + } + } + + @Test + public void testDuplicityInAugmentTarget1() throws Exception { + try { + try (InputStream stream1 = new FileInputStream(getClass().getResource( + "/negative-scenario/duplicity/augment0.yang").getPath()); + InputStream stream2 = new FileInputStream(getClass().getResource( + "/negative-scenario/duplicity/augment1.yang").getPath())) { + TestUtils.loadModules(Arrays.asList(stream1, stream2)); + fail("YangParseException should by thrown"); + } + } catch (YangParseException e) { + String expected = "Error in module 'augment1' at line 11: Can not add 'leaf id' to node 'bar' in module 'augment0': node with same name already declared at line 9"; + assertEquals(expected, e.getMessage()); + } + } + + @Test + public void testDuplicityInAugmentTarget2() throws Exception { + try { + try (InputStream stream1 = new FileInputStream(getClass().getResource( + "/negative-scenario/duplicity/augment0.yang").getPath()); + InputStream stream2 = new FileInputStream(getClass().getResource( + "/negative-scenario/duplicity/augment2.yang").getPath())) { + TestUtils.loadModules(Arrays.asList(stream1, stream2)); + fail("YangParseException should by thrown"); + } + } catch (YangParseException e) { + String expected = "Error in module 'augment2' at line 11: Can not add 'anyxml delta' to node 'choice-ext' in module 'augment0': case with same name already declared at line 18"; + assertEquals(expected, e.getMessage()); } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java index f2478e741d..83109ea9b1 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/java/org/opendaylight/controller/yang/parser/impl/YangParserTest.java @@ -195,7 +195,7 @@ public class YangParserTest { // test DataNodeContainer args assertEquals(0, interfaces.getTypeDefinitions().size()); assertEquals(1, interfaces.getChildNodes().size()); - assertEquals(0, interfaces.getGroupings().size()); + assertEquals(1, interfaces.getGroupings().size()); assertEquals(0, interfaces.getUses().size()); ListSchemaNode ifEntry = (ListSchemaNode) interfaces.getDataChildByName("ifEntry"); diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/types.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/types.yang index d9d5064383..bff9543009 100644 --- a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/types.yang +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/model/types.yang @@ -2,7 +2,7 @@ module types { yang-version 1; namespace "urn:simple.types.test"; prefix "t"; - + organization "opendaylight"; contact "http://www.opendaylight.org/"; description "This is types-data test description"; @@ -37,7 +37,7 @@ module types { length "6..10"; } } - + typedef string-ext3 { type string-ext2 { pattern "[b-u]*"; @@ -77,21 +77,24 @@ module types { } container interfaces { - list ifEntry { - key "ifIndex"; + grouping ifEntry { + container augment-holder; + } + list ifEntry { + key "ifIndex"; - leaf ifIndex { - type uint32; - units minutes; - } + leaf ifIndex { + type uint32; + units minutes; + } - leaf ifMtu { - type int32; - } + leaf ifMtu { + type int32; + } - min-elements 1; - max-elements 11; - } + min-elements 1; + max-elements 11; + } } } diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment0.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment0.yang new file mode 100644 index 0000000000..ff8519ccdb --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment0.yang @@ -0,0 +1,25 @@ +module augment0 { + yang-version 1; + namespace "urn:simple.augment0.demo"; + prefix "a0"; + + container foo { + description "foo container"; + container bar { + leaf id { + type int8; + } + typedef int-ext { + type int8 { + range "5..10"; + } + } + choice choice-ext { + leaf delta { + type int8; + } + } + } + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment1.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment1.yang new file mode 100644 index 0000000000..6afb493a5b --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment1.yang @@ -0,0 +1,16 @@ +module augment1 { + yang-version 1; + namespace "urn:simple.augment1.demo"; + prefix "a1"; + + import augment0 { + prefix "a0"; + } + + augment "/a0:foo/a0:bar" { + leaf id { + type string; + } + } + +} diff --git a/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment2.yang b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment2.yang new file mode 100644 index 0000000000..4d87619ae2 --- /dev/null +++ b/opendaylight/sal/yang-prototype/code-generator/yang-model-parser-impl/src/test/resources/negative-scenario/duplicity/augment2.yang @@ -0,0 +1,14 @@ +module augment2 { + yang-version 1; + namespace "urn:simple.augment2.demo"; + prefix "a2"; + + import augment0 { + prefix "a0"; + } + + augment "/a0:foo/a0:bar/a0:choice-ext" { + anyxml delta; + } + +} -- 2.36.6