From 42a5ab126bea6cdbc1eb3693044a024ed468ac4e Mon Sep 17 00:00:00 2001 From: "Filip.Gregor" Date: Wed, 25 Nov 2015 15:47:49 +0100 Subject: [PATCH] Bug 4646: Parser accepts invalid models fixed exceptions, reworked tests Change-Id: I35941730696aa3f6563695e929ab9952d5551b3b Signed-off-by: Filip.Gregor --- .../parser/spi/SubstatementValidator.java | 155 ++++++++++++++++++ .../meta/InvalidSubstatementException.java | 27 +++ .../meta/MissingSubstatementException.java | 27 +++ .../stmt/rfc6020/AnyxmlStatementImpl.java | 28 +++- .../stmt/rfc6020/ArgumentStatementImpl.java | 19 ++- .../stmt/rfc6020/AugmentStatementImpl.java | 22 ++- .../stmt/rfc6020/BaseStatementImpl.java | 12 ++ .../stmt/rfc6020/BelongsToStatementImpl.java | 12 ++ .../parser/stmt/rfc6020/BitStatementImpl.java | 15 ++ .../stmt/rfc6020/BitsSpecificationImpl.java | 15 ++ .../stmt/rfc6020/CaseStatementImpl.java | 28 +++- .../stmt/rfc6020/ChoiceStatementImpl.java | 36 +++- .../stmt/rfc6020/ConfigStatementImpl.java | 18 +- .../stmt/rfc6020/ContactStatementImpl.java | 18 +- .../stmt/rfc6020/ContainerStatementImpl.java | 31 +++- .../rfc6020/Decimal64SpecificationImpl.java | 13 ++ .../stmt/rfc6020/DefaultStatementImpl.java | 18 +- .../rfc6020/DescriptionStatementImpl.java | 18 +- .../stmt/rfc6020/DeviateStatementImpl.java | 29 +++- .../stmt/rfc6020/DeviationStatementImpl.java | 19 ++- .../stmt/rfc6020/EnumSpecificationImpl.java | 15 +- .../stmt/rfc6020/EnumStatementImpl.java | 16 ++ .../rfc6020/ErrorAppTagStatementImpl.java | 16 +- .../rfc6020/ErrorMessageStatementImpl.java | 16 +- .../stmt/rfc6020/ExtensionStatementImpl.java | 21 ++- .../stmt/rfc6020/FeatureStatementImpl.java | 24 ++- .../rfc6020/FractionDigitsStatementImpl.java | 16 +- .../stmt/rfc6020/GroupingStatementImpl.java | 26 ++- .../rfc6020/IdentityRefSpecificationImpl.java | 27 ++- .../stmt/rfc6020/IdentityStatementImpl.java | 15 ++ .../stmt/rfc6020/IfFeatureStatementImpl.java | 16 +- .../rfc6020/ImportStatementDefinition.java | 17 ++ .../stmt/rfc6020/IncludeStatementImpl.java | 21 ++- .../stmt/rfc6020/InputStatementImpl.java | 34 +++- .../InstanceIdentifierSpecificationImpl.java | 23 ++- .../parser/stmt/rfc6020/KeyStatementImpl.java | 15 +- .../stmt/rfc6020/LeafListStatementImpl.java | 48 ++++-- .../stmt/rfc6020/LeafStatementImpl.java | 35 +++- .../rfc6020/LeafrefSpecificationImpl.java | 23 ++- .../stmt/rfc6020/LengthStatementImpl.java | 19 ++- .../stmt/rfc6020/ListStatementImpl.java | 61 +++++-- .../stmt/rfc6020/MandatoryStatementImpl.java | 14 +- .../rfc6020/MaxElementsStatementImpl.java | 16 +- .../rfc6020/MinElementsStatementImpl.java | 17 +- .../stmt/rfc6020/ModuleStatementSupport.java | 37 +++++ .../stmt/rfc6020/MustStatementImpl.java | 16 ++ .../stmt/rfc6020/NamespaceStatementImpl.java | 15 +- .../rfc6020/NotificationStatementImpl.java | 39 ++++- .../rfc6020/NumericalRestrictionsImpl.java | 13 ++ .../stmt/rfc6020/OrderedByStatementImpl.java | 16 +- .../rfc6020/OrganizationStatementImpl.java | 16 +- .../stmt/rfc6020/OutputStatementImpl.java | 25 ++- .../stmt/rfc6020/PathStatementImpl.java | 12 ++ .../stmt/rfc6020/PatternStatementImpl.java | 18 +- .../stmt/rfc6020/PositionStatementImpl.java | 16 +- .../stmt/rfc6020/PrefixStatementImpl.java | 15 +- .../stmt/rfc6020/PresenceStatementImpl.java | 16 +- .../stmt/rfc6020/RangeStatementImpl.java | 19 ++- .../stmt/rfc6020/ReferenceStatementImpl.java | 14 +- .../stmt/rfc6020/RefineStatementImpl.java | 23 ++- .../rfc6020/RequireInstanceStatementImpl.java | 14 +- .../rfc6020/RevisionDateStatementImpl.java | 19 ++- .../stmt/rfc6020/RevisionStatementImpl.java | 21 ++- .../parser/stmt/rfc6020/RpcStatementImpl.java | 34 +++- .../stmt/rfc6020/StatusStatementImpl.java | 19 ++- .../stmt/rfc6020/StringRestrictionsImpl.java | 16 +- .../stmt/rfc6020/SubmoduleStatementImpl.java | 42 ++++- .../stmt/rfc6020/TypeStatementImpl.java | 19 ++- .../stmt/rfc6020/TypedefStatementImpl.java | 17 ++ .../stmt/rfc6020/UnionSpecificationImpl.java | 22 ++- .../stmt/rfc6020/UniqueStatementImpl.java | 11 ++ .../stmt/rfc6020/UnitsStatementImpl.java | 16 +- .../stmt/rfc6020/UsesStatementImpl.java | 14 ++ .../stmt/rfc6020/ValueStatementImpl.java | 13 +- .../stmt/rfc6020/WhenStatementImpl.java | 14 ++ .../rfc6020/YangVersionStatementImpl.java | 24 ++- .../stmt/rfc6020/YinElementStatementImpl.java | 16 +- .../stmt/test/SubstatementValidatorTest.java | 93 +++++++++++ .../root-valid-aug-args.yang | 4 +- .../effective-module/root.yang | 2 - .../semantic-statement-parser/types2.yang | 5 - .../bug-4310/bug4310.yang | 19 +++ .../empty-element/empty.yang | 19 +++ .../maximal-element/baz.yang | 25 +++ .../maximal-element/maximal.yang | 33 ++++ .../missing-element/baz.yang | 16 ++ .../missing-element/missing.yang | 12 ++ .../undesirable-element/undesirable.yang | 13 ++ .../src/test/resources/type-tests/types.yang | 7 - 89 files changed, 1776 insertions(+), 224 deletions(-) create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubstatementValidator.java create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/InvalidSubstatementException.java create mode 100644 yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/MissingSubstatementException.java create mode 100644 yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/test/SubstatementValidatorTest.java create mode 100644 yang/yang-parser-impl/src/test/resources/substatement-validator/bug-4310/bug4310.yang create mode 100644 yang/yang-parser-impl/src/test/resources/substatement-validator/empty-element/empty.yang create mode 100644 yang/yang-parser-impl/src/test/resources/substatement-validator/maximal-element/baz.yang create mode 100644 yang/yang-parser-impl/src/test/resources/substatement-validator/maximal-element/maximal.yang create mode 100644 yang/yang-parser-impl/src/test/resources/substatement-validator/missing-element/baz.yang create mode 100644 yang/yang-parser-impl/src/test/resources/substatement-validator/missing-element/missing.yang create mode 100644 yang/yang-parser-impl/src/test/resources/substatement-validator/undesirable-element/undesirable.yang diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubstatementValidator.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubstatementValidator.java new file mode 100644 index 0000000000..5f0b63f451 --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/SubstatementValidator.java @@ -0,0 +1,155 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.yangtools.yang.parser.spi; + +import com.google.common.collect.ImmutableMap; +import com.google.common.collect.MapDifference; +import com.google.common.collect.Maps; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; +import org.opendaylight.yangtools.yang.parser.spi.meta.InvalidSubstatementException; +import org.opendaylight.yangtools.yang.parser.spi.meta.MissingSubstatementException; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName; +import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase; +import org.opendaylight.yangtools.yang.parser.util.YangParseException; + +public final class SubstatementValidator { + private final Map cardinalityMap; + private final StatementDefinition currentStatement; + private final SpecialCase specialCase; + public final static int MAX = Integer.MAX_VALUE; + + private SubstatementValidator(Builder builder, SpecialCase specialCase) { + this.cardinalityMap = builder.cardinalityMap.build(); + this.currentStatement = builder.currentStatement; + this.specialCase = specialCase; + } + + public static Builder builder(StatementDefinition currentStatement) { + return new Builder(currentStatement); + } + + public static class Builder { + private final ImmutableMap.Builder cardinalityMap = ImmutableMap.builder(); + private final StatementDefinition currentStatement; + + private Builder(StatementDefinition currentStatement) { + this.currentStatement = currentStatement; + } + + public Builder add(StatementDefinition d, int min, int max) { + this.cardinalityMap.put(d, new Cardinality(min, max)); + return this; + } + + public SubstatementValidator build() { + return new SubstatementValidator(this, SpecialCase.NULL); + } + + public SubstatementValidator build(SpecialCase specialCase) { + return new SubstatementValidator(this, specialCase); + } + } + + public void validate(StmtContext ctx) throws InvalidSubstatementException, MissingSubstatementException{ + final Map stmtDefMap = new HashMap<>(); + final Map validatedMap = new HashMap<>(); + final Collection> substatementsInit = new ArrayList<>(); + substatementsInit.addAll(ctx.declaredSubstatements()); + substatementsInit.addAll(ctx.effectiveSubstatements()); + + for (StatementContextBase stmtCtx : substatementsInit) { + final StatementDefinition definition = stmtCtx.getPublicDefinition(); + if (!stmtDefMap.containsKey(definition)) { + stmtDefMap.put(definition, 1); + } else { + stmtDefMap.put(definition, stmtDefMap.get(definition) + 1); + } + } + + if (stmtDefMap.isEmpty() && specialCase == SpecialCase.NOTNULL) { + throw new InvalidSubstatementException(String.format("%s must contain atleast 1 element. Error in module " + + "%s (%s)", currentStatement, ctx.getRoot().getStatementArgument(), ctx.getFromNamespace + (ModuleCtxToModuleQName.class, ctx.getRoot())), ctx.getStatementSourceReference()); + } + + for (Map.Entry entry : stmtDefMap.entrySet()) { + final StatementDefinition key = (StatementDefinition) entry.getKey(); + if (!cardinalityMap.containsKey(key)) { + if (ctx.getFromNamespace(ExtensionNamespace.class, key.getArgumentName()) != null) { + continue; + } + throw new InvalidSubstatementException(String.format("%s is not valid for %s. Error in module %s (%s)", + key, currentStatement, ctx.getRoot().getStatementArgument(), + ctx.getFromNamespace(ModuleCtxToModuleQName.class, ctx.getRoot())), + ctx.getStatementSourceReference()); + } + if (cardinalityMap.get(key).getMin() > (Integer)entry.getValue()) { + throw new InvalidSubstatementException(String.format("Minimal count of %s for %s is %s, detected %s. " + + "Error in module %s (%s)", key, currentStatement, cardinalityMap.get(key).getMin(), + entry.getValue(), ctx.getRoot().getStatementArgument(), + ctx.getFromNamespace(ModuleCtxToModuleQName.class, ctx.getRoot())), + ctx.getStatementSourceReference()); + } + if (cardinalityMap.get(key).getMax() < (Integer)entry.getValue()) { + throw new InvalidSubstatementException(String.format("Maximal count of %s for %s is %s, detected %s. " + + "Error in module %s (%s)", key, currentStatement, cardinalityMap.get(key).getMax(), + entry.getValue(), ctx.getRoot().getStatementArgument(), + ctx.getFromNamespace(ModuleCtxToModuleQName.class, ctx.getRoot())), + ctx.getStatementSourceReference()); + } + validatedMap.put(key, 1); + } + + final MapDifference diff = Maps.difference(validatedMap, cardinalityMap); + + for (Map.Entry entry : diff.entriesOnlyOnRight().entrySet()) { + final int min = ((Cardinality)entry.getValue()).getMin(); + if (min > 0) { + throw new MissingSubstatementException(String.format("%s is missing %s. Minimal count is %s. Error in" + + " module %s (%s)", currentStatement, entry.getKey(), min, ctx.getRoot().getStatementArgument(), + ctx.getFromNamespace(ModuleCtxToModuleQName.class, ctx.getRoot())), + ctx.getStatementSourceReference()); + } + } + } + + private static class Cardinality { + private final int min; + private final int max; + + private Cardinality(int min, int max) throws YangParseException { + if (min > max) { + throw new IllegalArgumentException("Min can not be greater than max!"); + } + if (min < 0) { + throw new IllegalArgumentException("Min can not be les than 0!"); + } + this.min = min; + this.max = max; + } + + private int getMax() { + return max; + } + + private int getMin() { + return min; + } + } + + public enum SpecialCase { + NOTNULL, + NULL + } +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/InvalidSubstatementException.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/InvalidSubstatementException.java new file mode 100644 index 0000000000..b4d258abd6 --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/InvalidSubstatementException.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.spi.meta; + +import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; + +/** + * + * Thrown when there was Invalid element in yang file + * + */ +public class InvalidSubstatementException extends SourceException { + public InvalidSubstatementException(@Nonnull String message, @Nonnull StatementSourceReference source, Throwable cause) { + super(message, source, cause); + } + + public InvalidSubstatementException(@Nonnull String message, @Nonnull StatementSourceReference source) { + super(message, source); + } +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/MissingSubstatementException.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/MissingSubstatementException.java new file mode 100644 index 0000000000..a2c45721f9 --- /dev/null +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/MissingSubstatementException.java @@ -0,0 +1,27 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ +package org.opendaylight.yangtools.yang.parser.spi.meta; + +import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference; + +/** + * + * Thrown when there was Missing element in yang file + * + */ +public class MissingSubstatementException extends SourceException { + public MissingSubstatementException(@Nonnull String message, @Nonnull StatementSourceReference source) { + super(message, source); + } + + public MissingSubstatementException(@Nonnull String message, @Nonnull StatementSourceReference source, Throwable cause) { + super(message, source, cause); + } +} diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AnyxmlStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AnyxmlStatementImpl.java index 7cdead359b..135b20988b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AnyxmlStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AnyxmlStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,27 +7,41 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.AnyXmlEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; -import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement; import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AnyxmlStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.AnyXmlEffectiveStatementImpl; public class AnyxmlStatementImpl extends AbstractDeclaredStatement implements AnyxmlStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .ANYXML) + .add(Rfc6020Mapping.CONFIG, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.MANDATORY, 0, 1) + .add(Rfc6020Mapping.MUST, 0, MAX) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); protected AnyxmlStatementImpl(StmtContext context) { super(context); @@ -59,6 +73,12 @@ public class AnyxmlStatementImpl extends AbstractDeclaredStatement implem return new AnyXmlEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ArgumentStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ArgumentStatementImpl.java index 8930d9c941..df4f9b8366 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ArgumentStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ArgumentStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,19 +7,24 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ArgumentEffectiveStatementImpl; - -import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ArgumentEffectiveStatementImpl; public class ArgumentStatementImpl extends AbstractDeclaredStatement implements ArgumentStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .ARGUMENT) + .add(Rfc6020Mapping.YIN_ELEMENT, 0, 1) + .build(); protected ArgumentStatementImpl( StmtContext context) { @@ -51,6 +56,12 @@ public class ArgumentStatementImpl extends AbstractDeclaredStatement return new ArgumentEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java index 4d660e91b2..3280c9d0f9 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/AugmentStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,6 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; + import com.google.common.base.Preconditions; import java.util.Collection; import java.util.regex.Pattern; @@ -16,6 +18,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.AugmentStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -36,6 +39,22 @@ public class AugmentStatementImpl extends AbstractDeclaredStatement context) { super(context); @@ -73,6 +92,7 @@ public class AugmentStatementImpl extends AbstractDeclaredStatement> augmentNode) throws SourceException { + SUBSTATEMENT_VALIDATOR.validate(augmentNode); if (StmtContextUtils.isInExtensionBody(augmentNode)) { return; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BaseStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BaseStatementImpl.java index ab3be5be82..a14a557c24 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BaseStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BaseStatementImpl.java @@ -16,6 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement; import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.DerivedIdentitiesNamespace; @@ -27,9 +28,13 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.BaseEffectiveStatementImpl; public class BaseStatementImpl extends AbstractDeclaredStatement implements BaseStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .BASE) + .build(); protected BaseStatementImpl(final StmtContext context) { super(context); @@ -91,6 +96,13 @@ public class BaseStatementImpl extends AbstractDeclaredStatement implemen }); } } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BelongsToStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BelongsToStatementImpl.java index 07a11fe7d4..dd8c76b3a0 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BelongsToStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BelongsToStatementImpl.java @@ -17,6 +17,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.BelongsToStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -33,6 +34,10 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.BelongsEffe public class BelongsToStatementImpl extends AbstractDeclaredStatement implements BelongsToStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .BELONGS_TO) + .add(Rfc6020Mapping.PREFIX, 1, 1) + .build(); protected BelongsToStatementImpl( final StmtContext context) { @@ -98,6 +103,13 @@ public class BelongsToStatementImpl extends AbstractDeclaredStatement String moduleName = belongsToCtx.getStatementArgument(); return new ModuleIdentifierImpl(moduleName, Optional. absent(), Optional.of(SimpleDateFormatUtil.DEFAULT_BELONGS_TO_DATE)); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BitStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BitStatementImpl.java index 1bce3556dd..c3aa80cf32 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BitStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BitStatementImpl.java @@ -15,12 +15,21 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.BitEffectiveStatementImpl; public class BitStatementImpl extends AbstractDeclaredStatement implements BitStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .BIT) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.POSITION, 0, 1) + .build(); protected BitStatementImpl(StmtContext context) { super(context); @@ -49,6 +58,12 @@ public class BitStatementImpl extends AbstractDeclaredStatement implement return new BitEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BitsSpecificationImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BitsSpecificationImpl.java index 24cf387b6e..59ee8d73ad 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BitsSpecificationImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/BitsSpecificationImpl.java @@ -7,17 +7,25 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; + import java.util.Collection; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.BitStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.BitsSpecificationEffectiveStatementImpl; public class BitsSpecificationImpl extends AbstractDeclaredStatement implements TypeStatement.BitsSpecification { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.BIT, 1, MAX) + .build(); protected BitsSpecificationImpl(final StmtContext context) { super(context); @@ -47,6 +55,13 @@ public class BitsSpecificationImpl extends AbstractDeclaredStatement imp final StmtContext> ctx) { return new BitsSpecificationEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/CaseStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/CaseStatementImpl.java index 0bc862b03a..e838237846 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/CaseStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/CaseStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,6 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; + import java.util.Collection; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -20,13 +22,30 @@ import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.CaseEffectiveStatementImpl; public class CaseStatementImpl extends AbstractDeclaredStatement implements CaseStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .CASE) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.USES, 0, MAX) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); protected CaseStatementImpl( final StmtContext context) { @@ -57,6 +76,13 @@ public class CaseStatementImpl extends AbstractDeclaredStatement implemen final StmtContext> ctx) { return new CaseEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ChoiceStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ChoiceStatementImpl.java index b951ba978f..faf845a407 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ChoiceStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ChoiceStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,8 +7,11 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ChoiceEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; +import java.util.Collection; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -22,17 +25,33 @@ import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Collection; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ChoiceEffectiveStatementImpl; public class ChoiceStatementImpl extends AbstractDeclaredStatement implements ChoiceStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .CHOICE) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.CASE, 0, MAX) + .add(Rfc6020Mapping.CONFIG, 0, 1) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.DEFAULT, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.MANDATORY, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); protected ChoiceStatementImpl(StmtContext context) { super(context); @@ -68,6 +87,13 @@ public class ChoiceStatementImpl extends AbstractDeclaredStatement StmtContext> ctx) { return new ChoiceEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java index b0985e1a5a..e96ae0a25b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ConfigStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -8,18 +8,21 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ConfigEffectiveStatementImpl; - +import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ConfigEffectiveStatementImpl; public class ConfigStatementImpl extends AbstractDeclaredStatement implements ConfigStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .CONFIG) + .build(); protected ConfigStatementImpl( StmtContext context) { @@ -44,6 +47,13 @@ public class ConfigStatementImpl extends AbstractDeclaredStatement impl @Override public EffectiveStatement createEffective(StmtContext> ctx) { return new ConfigEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContactStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContactStatementImpl.java index eca9c5b9ec..791980b95c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContactStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContactStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,18 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ContactEffectiveStatementImpl; - +import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ContactStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ContactEffectiveStatementImpl; public class ContactStatementImpl extends AbstractDeclaredStatement implements ContactStatement{ + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .CONTACT) + .build(); protected ContactStatementImpl(StmtContext context) { super(context); @@ -44,6 +47,13 @@ public class ContactStatementImpl extends AbstractDeclaredStatement impl public EffectiveStatement createEffective(StmtContext> ctx) { return new ContactEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContainerStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContainerStatementImpl.java index e68b8ed12b..7afda05eae 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContainerStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ContainerStatementImpl.java @@ -7,7 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ContainerEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; @@ -25,12 +25,35 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ContainerEffectiveStatementImpl; public class ContainerStatementImpl extends AbstractDeclaredStatement implements ContainerStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .CONTAINER) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONFIG, 0, 1) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.MUST, 0, MAX) + .add(Rfc6020Mapping.PRESENCE, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .add(Rfc6020Mapping.USES, 0, MAX) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); protected ContainerStatementImpl(StmtContext context) { super(context); @@ -63,6 +86,12 @@ public class ContainerStatementImpl extends AbstractDeclaredStatement imp return new ContainerEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Decimal64SpecificationImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Decimal64SpecificationImpl.java index 4ac0251e61..09314d2a00 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Decimal64SpecificationImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/Decimal64SpecificationImpl.java @@ -12,6 +12,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement.Decimal64Specification; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @@ -19,6 +20,11 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.Decimal64SpecificationEffectiveStatementImpl; public class Decimal64SpecificationImpl extends AbstractDeclaredStatement implements Decimal64Specification { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.FRACTION_DIGITS, 1, 1) + .add(Rfc6020Mapping.RANGE, 0, 1) + .build(); protected Decimal64SpecificationImpl(final StmtContext context) { super(context); @@ -46,6 +52,13 @@ public class Decimal64SpecificationImpl extends AbstractDeclaredStatement> ctx) { return new Decimal64SpecificationEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DefaultStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DefaultStatementImpl.java index dbf650af41..edceab161f 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DefaultStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DefaultStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,19 +7,22 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DefaultEffectiveStatementImpl; - +import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DefaultEffectiveStatementImpl; public class DefaultStatementImpl extends AbstractDeclaredStatement implements DefaultStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .DEFAULT) + .build(); protected DefaultStatementImpl( StmtContext context) { @@ -46,6 +49,13 @@ public class DefaultStatementImpl extends AbstractDeclaredStatement impl StmtContext> ctx) { return new DefaultEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DescriptionStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DescriptionStatementImpl.java index 0bbec539c6..7d8e1d7dae 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DescriptionStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DescriptionStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,18 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DescriptionEffectiveStatementImpl; - +import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DescriptionEffectiveStatementImpl; public class DescriptionStatementImpl extends AbstractDeclaredStatement implements DescriptionStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .DESCRIPTION) + .build(); protected DescriptionStatementImpl( StmtContext context) { @@ -45,6 +48,13 @@ public class DescriptionStatementImpl extends AbstractDeclaredStatement public EffectiveStatement createEffective(StmtContext> ctx) { return new DescriptionEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviateStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviateStatementImpl.java index 5186596ad1..6d04cbdad1 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviateStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviateStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,20 +7,33 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.model.api.Deviation; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DeviateEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; +import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.model.api.Deviation; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviateStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; - -import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DeviateEffectiveStatementImpl; public class DeviateStatementImpl extends AbstractDeclaredStatement implements DeviateStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .DEVIATE) + .add(Rfc6020Mapping.CONFIG, 0, 1) + .add(Rfc6020Mapping.DEFAULT, 0, 1) + .add(Rfc6020Mapping.MANDATORY, 0, 1) + .add(Rfc6020Mapping.MAX_ELEMENTS, 0, 1) + .add(Rfc6020Mapping.MIN_ELEMENTS, 0, 1) + .add(Rfc6020Mapping.MUST, 0, MAX) + .add(Rfc6020Mapping.TYPE, 0, 1) + .add(Rfc6020Mapping.UNIQUE, 0, MAX) + .add(Rfc6020Mapping.UNITS, 0, 1) + .build(); protected DeviateStatementImpl( StmtContext context) { @@ -48,6 +61,12 @@ public class DeviateStatementImpl extends AbstractDeclaredStatement> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviationStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviationStatementImpl.java index cc87db3b7f..75a6c63f50 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviationStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/DeviationStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,27 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; + import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.DeviationEffectiveStatementImpl; public class DeviationStatementImpl extends AbstractDeclaredStatement implements DeviationStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .DEVIATION) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.DEVIATE, 0, MAX) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .build(); protected DeviationStatementImpl(final StmtContext context) { super(context); @@ -44,6 +54,13 @@ public class DeviationStatementImpl extends AbstractDeclaredStatement> ctx) { return new DeviationEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EnumSpecificationImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EnumSpecificationImpl.java index 0b8b6d6d67..de14c071e5 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EnumSpecificationImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EnumSpecificationImpl.java @@ -7,12 +7,14 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import java.util.Collection; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; +import java.util.Collection; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @@ -20,6 +22,10 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.EnumSpecificationEffectiveStatementImpl; public class EnumSpecificationImpl extends AbstractDeclaredStatement implements TypeStatement.EnumSpecification { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.ENUM, 1, MAX) + .build(); protected EnumSpecificationImpl(StmtContext context) { super(context); @@ -49,6 +55,13 @@ public class EnumSpecificationImpl extends AbstractDeclaredStatement imp StmtContext> ctx) { return new EnumSpecificationEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EnumStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EnumStatementImpl.java index 6605ba57d5..1015f3fc7e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EnumStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/EnumStatementImpl.java @@ -14,12 +14,21 @@ import org.opendaylight.yangtools.yang.model.api.stmt.EnumStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.EnumEffectiveStatementImpl; public class EnumStatementImpl extends AbstractDeclaredStatement implements EnumStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .ENUM) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.VALUE, 0, 1) + .build(); protected EnumStatementImpl(final StmtContext context) { super(context); @@ -48,6 +57,13 @@ public class EnumStatementImpl extends AbstractDeclaredStatement impleme final StmtContext> ctx) { return new EnumEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ErrorAppTagStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ErrorAppTagStatementImpl.java index 7db9c97909..3402c7e8fd 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ErrorAppTagStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ErrorAppTagStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ErrorAppTagEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ErrorAppTagEffectiveStatementImpl; public class ErrorAppTagStatementImpl extends AbstractDeclaredStatement implements ErrorAppTagStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .ERROR_APP_TAG) + .build(); protected ErrorAppTagStatementImpl( StmtContext context) { @@ -49,6 +53,12 @@ public class ErrorAppTagStatementImpl extends AbstractDeclaredStatement return new ErrorAppTagEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ErrorMessageStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ErrorMessageStatementImpl.java index 7769180f09..0e7f1bf379 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ErrorMessageStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ErrorMessageStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ErrorMessageEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ErrorMessageEffectiveStatementImpl; public class ErrorMessageStatementImpl extends AbstractDeclaredStatement implements ErrorMessageStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .ERROR_MESSAGE) + .build(); protected ErrorMessageStatementImpl( StmtContext context) { @@ -49,6 +53,12 @@ public class ErrorMessageStatementImpl extends return new ErrorMessageEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java index e7bebeee0e..0dd010deba 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ExtensionStatementImpl.java @@ -7,22 +7,30 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ExtensionEffectiveStatementImpl; import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ArgumentStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ExtensionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.parser.spi.ExtensionNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ExtensionEffectiveStatementImpl; public class ExtensionStatementImpl extends AbstractDeclaredStatement implements ExtensionStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .EXTENSION) + .add(Rfc6020Mapping.ARGUMENT, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .build(); protected ExtensionStatementImpl(StmtContext context) { super(context); @@ -53,6 +61,13 @@ public class ExtensionStatementImpl extends AbstractDeclaredStatement imp public void onStatementDefinitionDeclared(final StmtContext.Mutable> stmt) throws SourceException { stmt.addContext(ExtensionNamespace.class, stmt.getStatementArgument(), stmt); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/FeatureStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/FeatureStatementImpl.java index c59ea619b5..d381d16928 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/FeatureStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/FeatureStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,23 +7,33 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.FeatureEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; import java.util.Collection; -import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.FeatureStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.FeatureEffectiveStatementImpl; public class FeatureStatementImpl extends AbstractDeclaredStatement implements FeatureStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .FEATURE) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .build(); protected FeatureStatementImpl( StmtContext context) { @@ -55,6 +65,12 @@ public class FeatureStatementImpl extends AbstractDeclaredStatement return new FeatureEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/FractionDigitsStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/FractionDigitsStatementImpl.java index 047ef86478..97886d78a2 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/FractionDigitsStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/FractionDigitsStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import com.google.common.collect.Range; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.FractionDigitsStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.FractionDigitsEffectiveStatementImpl; -import com.google.common.collect.Range; - public class FractionDigitsStatementImpl extends AbstractDeclaredStatement implements FractionDigitsStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .FRACTION_DIGITS) + .build(); private static final Range FRAC_DIGITS_ALLOWED = Range.closed(1, 18); @@ -64,6 +68,12 @@ public class FractionDigitsStatementImpl extends AbstractDeclaredStatement> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/GroupingStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/GroupingStatementImpl.java index 98a5667df0..63ff017733 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/GroupingStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/GroupingStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,8 +7,9 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import java.util.Collection; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; +import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -19,6 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @@ -28,6 +30,21 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.GroupingEff public class GroupingStatementImpl extends AbstractDeclaredStatement implements GroupingStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .GROUPING) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .add(Rfc6020Mapping.USES, 0, MAX) + .build(); protected GroupingStatementImpl( StmtContext context) { @@ -60,7 +77,10 @@ public class GroupingStatementImpl extends AbstractDeclaredStatement } @Override - public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + SUBSTATEMENT_VALIDATOR.validate(stmt); + if (stmt != null && stmt.getParentContext() != null) { stmt.getParentContext().addContext(GroupingNamespace.class, stmt.getStatementArgument(), stmt); } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IdentityRefSpecificationImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IdentityRefSpecificationImpl.java index 18ec2111f0..6f18c54348 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IdentityRefSpecificationImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IdentityRefSpecificationImpl.java @@ -8,23 +8,27 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import com.google.common.base.Preconditions; +import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.BaseStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.IdentityRefSpecificationEffectiveStatementImpl; -import javax.annotation.Nonnull; - public class IdentityRefSpecificationImpl extends AbstractDeclaredStatement implements TypeStatement.IdentityRefSpecification { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.BASE, 1, 1) + .build(); protected IdentityRefSpecificationImpl( StmtContext context) { @@ -73,6 +77,13 @@ public class IdentityRefSpecificationImpl extends AbstractDeclaredStatement> stmt) throws SourceException { + super.onStatementDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IdentityStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IdentityStatementImpl.java index 798e59374b..178dd534a6 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IdentityStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IdentityStatementImpl.java @@ -16,6 +16,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.IdentityStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.parser.spi.IdentityNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @@ -24,6 +25,13 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.IdentityEff public class IdentityStatementImpl extends AbstractDeclaredStatement implements IdentityStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .IDENTITY) + .add(Rfc6020Mapping.BASE, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .build(); protected IdentityStatementImpl( final StmtContext context) { @@ -57,6 +65,13 @@ public class IdentityStatementImpl extends AbstractDeclaredStatement public void onStatementDefinitionDeclared(final StmtContext.Mutable> stmt) throws SourceException { stmt.addToNs(IdentityNamespace.class, stmt.getStatementArgument(), stmt); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IfFeatureStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IfFeatureStatementImpl.java index 4b2e434203..bacdf2cf7e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IfFeatureStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IfFeatureStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,18 +7,22 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.IfFeatureEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.IfFeatureEffectiveStatementImpl; public class IfFeatureStatementImpl extends AbstractDeclaredStatement implements IfFeatureStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .IF_FEATURE) + .build(); protected IfFeatureStatementImpl( StmtContext context) { @@ -50,6 +54,12 @@ public class IfFeatureStatementImpl extends AbstractDeclaredStatement return new IfFeatureEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java index 0dbd2c3ee3..5832cf68f3 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ImportStatementDefinition.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.SOURCE_LINKAGE; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf; + import com.google.common.base.Optional; import java.net.URI; import java.util.Collection; @@ -26,6 +27,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder; @@ -34,10 +36,16 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prereq import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.source.ImpPrefixToModuleIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ImportEffectiveStatementImpl; public class ImportStatementDefinition extends AbstractStatementSupport> { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .IMPORT) + .add(Rfc6020Mapping.PREFIX, 1, 1) + .add(Rfc6020Mapping.REVISION_DATE, 0, 1) + .build(); public ImportStatementDefinition() { super(Rfc6020Mapping.IMPORT); @@ -60,6 +68,13 @@ public class ImportStatementDefinition return new ImportEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } + @Override public void onLinkageDeclared( final Mutable> stmt) { @@ -122,6 +137,8 @@ public class ImportStatementDefinition } } }); + + } private static ModuleIdentifier getImportedModuleIdentifier(final Mutable stmt) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IncludeStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IncludeStatementImpl.java index 929634c14c..d5869d6cf9 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IncludeStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/IncludeStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -10,9 +10,7 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import static org.opendaylight.yangtools.yang.parser.spi.meta.ModelProcessingPhase.SOURCE_LINKAGE; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf; -import org.opendaylight.yangtools.yang.parser.spi.source.IncludedSubmoduleNameToIdentifier; - -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.IncludeEffectiveStatementImpl; +import com.google.common.base.Optional; import java.net.URI; import java.util.Collection; import java.util.Date; @@ -25,6 +23,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; import org.opendaylight.yangtools.yang.parser.spi.SubmoduleNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -33,10 +32,15 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Infere import org.opendaylight.yangtools.yang.parser.spi.meta.ModelActionBuilder.Prerequisite; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.source.IncludedSubmoduleNameToIdentifier; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import com.google.common.base.Optional; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.IncludeEffectiveStatementImpl; public class IncludeStatementImpl extends AbstractDeclaredStatement implements IncludeStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .INCLUDE) + .add(Rfc6020Mapping.REVISION_DATE, 0, 1) + .build(); protected IncludeStatementImpl(StmtContext context) { super(context); @@ -108,6 +112,13 @@ public class IncludeStatementImpl extends AbstractDeclaredStatement impl return new ModuleIdentifierImpl(subModuleName, Optional. absent(), Optional. of(revisionDate)); } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/InputStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/InputStatementImpl.java index 4aa7aa2d0e..440b9ce56b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/InputStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/InputStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,24 +7,38 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.InputEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import java.util.Collection; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement; -import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.InputEffectiveStatementImpl; public class InputStatementImpl extends AbstractDeclaredStatement implements InputStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .INPUT) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .add(Rfc6020Mapping.USES, 0, MAX) + .build(); protected InputStatementImpl(StmtContext context) { super(context); @@ -61,6 +75,12 @@ public class InputStatementImpl extends AbstractDeclaredStatement return new InputEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/InstanceIdentifierSpecificationImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/InstanceIdentifierSpecificationImpl.java index b3b30cecad..360527e68d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/InstanceIdentifierSpecificationImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/InstanceIdentifierSpecificationImpl.java @@ -7,20 +7,24 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement; - -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.InstanceIdentifierSpecificationEffectiveStatementImpl; public class InstanceIdentifierSpecificationImpl extends AbstractDeclaredStatement implements TypeStatement.InstanceIdentifierSpecification { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.REQUIRE_INSTANCE, 0, 1) + .build(); protected InstanceIdentifierSpecificationImpl( StmtContext ctx) { @@ -52,6 +56,13 @@ public class InstanceIdentifierSpecificationImpl extends StmtContext> ctx) { return new InstanceIdentifierSpecificationEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java index 128e3b6c76..6bb9679a14 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/KeyStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -15,14 +15,19 @@ import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.KeyEffectiveStatementImpl; public class KeyStatementImpl extends AbstractDeclaredStatement> implements KeyStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .KEY) + .build(); protected KeyStatementImpl(final StmtContext, KeyStatement, ?> context) { super(context); @@ -62,6 +67,12 @@ public class KeyStatementImpl extends AbstractDeclaredStatement, KeyStatement, EffectiveStatement, KeyStatement>> ctx) { return new KeyEffectiveStatementImpl(ctx); } - } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable, KeyStatement, + EffectiveStatement, KeyStatement>> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } + } } diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafListStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafListStatementImpl.java index 547e91f599..0489699779 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafListStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafListStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,35 +7,52 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.LeafListEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; -import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement; +import java.util.Collection; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.LeafListStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Collection; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.LeafListEffectiveStatementImpl; public class LeafListStatementImpl extends AbstractDeclaredStatement implements LeafListStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .LEAF_LIST) + .add(Rfc6020Mapping.CONFIG, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.MIN_ELEMENTS, 0, 1) + .add(Rfc6020Mapping.MAX_ELEMENTS, 0, 1) + .add(Rfc6020Mapping.MUST, 0, MAX) + .add(Rfc6020Mapping.ORDERED_BY, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.TYPE, 1, 1) + .add(Rfc6020Mapping.UNITS, 0, 1) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); protected LeafListStatementImpl( StmtContext context) { @@ -73,6 +90,13 @@ public class LeafListStatementImpl extends AbstractDeclaredStatement StmtContext> ctx) { return new LeafListEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafStatementImpl.java index a9fb5f0f62..a09e1957a2 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,10 +7,13 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.LeafEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; -import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import java.util.Collection; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DefaultStatement; @@ -24,16 +27,29 @@ import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Collection; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.LeafEffectiveStatementImpl; public class LeafStatementImpl extends AbstractDeclaredStatement implements LeafStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .LEAF) + .add(Rfc6020Mapping.CONFIG, 0, 1) + .add(Rfc6020Mapping.DEFAULT, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.MANDATORY, 0, 1) + .add(Rfc6020Mapping.MUST, 0, MAX) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.TYPE, 1, 1) + .add(Rfc6020Mapping.UNITS, 0, 1) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); protected LeafStatementImpl(StmtContext context) { super(context); @@ -64,6 +80,13 @@ public class LeafStatementImpl extends AbstractDeclaredStatement implemen StmtContext> ctx) { return new LeafEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nullable @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafrefSpecificationImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafrefSpecificationImpl.java index cc30a2177c..bac3d36578 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafrefSpecificationImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LeafrefSpecificationImpl.java @@ -7,18 +7,24 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.LeafrefSpecificationEffectiveStatementImpl; public class LeafrefSpecificationImpl extends AbstractDeclaredStatement implements TypeStatement.LeafrefSpecification { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.PATH, 1, 1) + .add(Rfc6020Mapping.REQUIRE_INSTANCE, 0, 1) + .build(); protected LeafrefSpecificationImpl( StmtContext context) { @@ -50,6 +56,13 @@ public class LeafrefSpecificationImpl extends AbstractDeclaredStatement StmtContext> ctx) { return new LeafrefSpecificationEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LengthStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LengthStatementImpl.java index faf07270c6..24b8d6c02c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LengthStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/LengthStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import java.util.List; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; @@ -17,12 +16,21 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement; import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.type.LengthConstraint; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.LengthEffectiveStatementImpl; public class LengthStatementImpl extends AbstractDeclaredStatement> implements LengthStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .LENGTH) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.ERROR_APP_TAG, 0, 1) + .add(Rfc6020Mapping.ERROR_MESSAGE, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .build(); protected LengthStatementImpl(StmtContext, LengthStatement, ?> context) { super(context); @@ -51,6 +59,13 @@ public class LengthStatementImpl extends AbstractDeclaredStatement, LengthStatement, EffectiveStatement, LengthStatement>> ctx) { return new LengthEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable, + LengthStatement, EffectiveStatement, LengthStatement>> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ListStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ListStatementImpl.java index 9fb93b761c..622fa9859d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ListStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ListStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,38 +7,64 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ListEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; +import java.util.Collection; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; import org.opendaylight.yangtools.yang.model.api.stmt.KeyStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement; import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ListStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ConfigStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.util.Collection; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ListEffectiveStatementImpl; public class ListStatementImpl extends AbstractDeclaredStatement implements ListStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .LIST) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONFIG, 0, 1) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.KEY, 0, 1) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.MAX_ELEMENTS, 0, 1) + .add(Rfc6020Mapping.MIN_ELEMENTS, 0, 1) + .add(Rfc6020Mapping.MUST, 0, MAX) + .add(Rfc6020Mapping.ORDERED_BY, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .add(Rfc6020Mapping.UNIQUE, 0, MAX) + .add(Rfc6020Mapping.USES, 0, MAX) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); protected ListStatementImpl(StmtContext context) { super(context); @@ -74,6 +100,13 @@ public class ListStatementImpl extends AbstractDeclaredStatement StmtContext> ctx) { return new ListEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MandatoryStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MandatoryStatementImpl.java index 3e8cb0bf60..11c292a104 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MandatoryStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MandatoryStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -11,12 +11,17 @@ import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MandatoryStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.MandatoryEffectiveStatementImpl; public class MandatoryStatementImpl extends AbstractDeclaredStatement implements MandatoryStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .MANDATORY) + .build(); protected MandatoryStatementImpl(final StmtContext context) { super(context); @@ -56,6 +61,13 @@ public class MandatoryStatementImpl extends AbstractDeclaredStatement i } return ret; } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MaxElementsStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MaxElementsStatementImpl.java index d9be753688..fb130205cf 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MaxElementsStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MaxElementsStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.MaxElementsEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MaxElementsStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.MaxElementsEffectiveStatementImpl; public class MaxElementsStatementImpl extends AbstractDeclaredStatement implements MaxElementsStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .MAX_ELEMENTS) + .build(); protected MaxElementsStatementImpl( StmtContext context) { @@ -49,6 +53,12 @@ public class MaxElementsStatementImpl extends AbstractDeclaredStatement return new MaxElementsEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MinElementsStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MinElementsStatementImpl.java index c3dbe62ce8..4f5f9bf883 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MinElementsStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MinElementsStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.MinElementsEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MinElementsStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.MinElementsEffectiveStatementImpl; public class MinElementsStatementImpl extends AbstractDeclaredStatement implements MinElementsStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .MIN_ELEMENTS) + .build(); protected MinElementsStatementImpl( StmtContext context) { @@ -48,6 +52,13 @@ public class MinElementsStatementImpl extends StmtContext> ctx) { return new MinElementsEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java index 16e2d9331e..1f68421d2c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ModuleStatementSupport.java @@ -7,6 +7,7 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf; import com.google.common.base.Optional; @@ -23,6 +24,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; import org.opendaylight.yangtools.yang.parser.spi.ModuleNamespace; import org.opendaylight.yangtools.yang.parser.spi.NamespaceToModule; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; @@ -38,6 +40,35 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ModuleEffec public class ModuleStatementSupport extends AbstractStatementSupport> { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .MODULE) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.AUGMENT, 0, MAX) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONTACT, 0, 1) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.DEVIATION, 0, MAX) + .add(Rfc6020Mapping.EXTENSION, 0, MAX) + .add(Rfc6020Mapping.FEATURE, 0, MAX) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.IDENTITY, 0, MAX) + .add(Rfc6020Mapping.IMPORT, 0, MAX) + .add(Rfc6020Mapping.INCLUDE, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.NAMESPACE, 1, 1) + .add(Rfc6020Mapping.NOTIFICATION, 0, MAX) + .add(Rfc6020Mapping.ORGANIZATION, 0, 1) + .add(Rfc6020Mapping.PREFIX, 1, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.REVISION, 0, MAX) + .add(Rfc6020Mapping.RPC, 0, MAX) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .add(Rfc6020Mapping.USES, 0, MAX) + .add(Rfc6020Mapping.YANG_VERSION, 0, 1) + .build(); public ModuleStatementSupport() { super(Rfc6020Mapping.MODULE); @@ -97,4 +128,10 @@ public class ModuleStatementSupport extends stmt.addToNs(ImpPrefixToModuleIdentifier.class, modulePrefix, moduleIdentifier); } + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } \ No newline at end of file diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java index 2a7762d221..8cff45a27d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/MustStatementImpl.java @@ -17,12 +17,21 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ErrorAppTagStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement; import org.opendaylight.yangtools.yang.model.api.stmt.MustStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.MustEffectiveStatementImpl; public class MustStatementImpl extends AbstractDeclaredStatement implements MustStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .MUST) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.ERROR_APP_TAG, 0, 1) + .add(Rfc6020Mapping.ERROR_MESSAGE, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .build(); protected MustStatementImpl(final StmtContext context) { super(context); @@ -50,6 +59,13 @@ public class MustStatementImpl extends AbstractDeclaredStatement> ctx) { return new MustEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NamespaceStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NamespaceStatementImpl.java index 0c25f11ccb..0c75ecfd2e 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NamespaceStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NamespaceStatementImpl.java @@ -7,16 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.NamespaceEffectiveStatementImpl; - import java.net.URI; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.NamespaceStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.NamespaceEffectiveStatementImpl; public class NamespaceStatementImpl extends AbstractDeclaredStatement implements NamespaceStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .NAMESPACE) + .build(); public static class Definition extends AbstractStatementSupport> { @@ -39,6 +44,12 @@ public class NamespaceStatementImpl extends AbstractDeclaredStatement imple return new NamespaceEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } NamespaceStatementImpl(StmtContext context) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NotificationStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NotificationStatementImpl.java index ea4abed332..b873d3f099 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NotificationStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NotificationStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,27 +7,46 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.NotificationEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; -import javax.annotation.Nullable; import java.util.Collection; +import javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.NotificationStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.NotificationEffectiveStatementImpl; public class NotificationStatementImpl extends AbstractDeclaredStatement implements NotificationStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .NOTIFICATION) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .add(Rfc6020Mapping.USES, 0, MAX) + .build(); protected NotificationStatementImpl( StmtContext context) { @@ -65,6 +84,12 @@ public class NotificationStatementImpl extends AbstractDeclaredStatement return new NotificationEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NumericalRestrictionsImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NumericalRestrictionsImpl.java index a65d01e1c4..1620774b0d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NumericalRestrictionsImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/NumericalRestrictionsImpl.java @@ -11,13 +11,19 @@ import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.NumericalRestrictionsEffectiveStatementImpl; public class NumericalRestrictionsImpl extends AbstractDeclaredStatement implements TypeStatement.NumericalRestrictions { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.RANGE, 1, 1) + .build(); protected NumericalRestrictionsImpl(final StmtContext context) { super(context); @@ -46,6 +52,13 @@ public class NumericalRestrictionsImpl extends AbstractDeclaredStatement final StmtContext> ctx) { return new NumericalRestrictionsEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrderedByStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrderedByStatementImpl.java index eb9872e1eb..ad4f5c60d0 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrderedByStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrderedByStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.OrderedByEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.OrderedByStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.OrderedByEffectiveStatementImpl; public class OrderedByStatementImpl extends AbstractDeclaredStatement implements OrderedByStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .ORDERED_BY) + .build(); protected OrderedByStatementImpl( StmtContext context) { @@ -49,6 +53,12 @@ public class OrderedByStatementImpl extends AbstractDeclaredStatement return new OrderedByEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrganizationStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrganizationStatementImpl.java index afdab511a2..798c5ae685 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrganizationStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OrganizationStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.OrganizationEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.OrganizationStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.OrganizationEffectiveStatementImpl; public class OrganizationStatementImpl extends AbstractDeclaredStatement implements OrganizationStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .ORGANIZATION) + .build(); protected OrganizationStatementImpl( StmtContext context) { @@ -49,6 +53,12 @@ public class OrganizationStatementImpl extends return new OrganizationEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OutputStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OutputStatementImpl.java index 44b53650c4..ac26272f62 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OutputStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/OutputStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,6 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; + import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; @@ -15,13 +17,27 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DataDefinitionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement; import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.OutputEffectiveStatementImpl; public class OutputStatementImpl extends AbstractDeclaredStatement implements OutputStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .OUTPUT) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .add(Rfc6020Mapping.USES, 0, MAX) + .build(); protected OutputStatementImpl(final StmtContext context) { super(context); @@ -54,6 +70,13 @@ public class OutputStatementImpl extends AbstractDeclaredStatement implem final StmtContext> ctx) { return new OutputEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java index fe45098be7..2ec0cbf5f1 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PathStatementImpl.java @@ -12,12 +12,17 @@ import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PathStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.PathEffectiveStatementImpl; public class PathStatementImpl extends AbstractDeclaredStatement implements PathStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .PATH) + .build(); protected PathStatementImpl(final StmtContext context) { super(context); @@ -45,6 +50,13 @@ public class PathStatementImpl extends AbstractDeclaredStatement> ctx) { return new PathEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PatternStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PatternStatementImpl.java index 7fbafff6be..c5cf296150 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PatternStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PatternStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -18,15 +18,24 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.type.PatternConstraint; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.PatternConstraintEffectiveImpl; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.PatternEffectiveStatementImpl; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class PatternStatementImpl extends AbstractDeclaredStatement implements PatternStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .PATTERN) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.ERROR_APP_TAG, 0, 1) + .add(Rfc6020Mapping.ERROR_MESSAGE, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .build(); private static final Logger LOG = LoggerFactory.getLogger(PatternStatementImpl.class); protected PatternStatementImpl(final StmtContext context) { @@ -65,6 +74,13 @@ public class PatternStatementImpl extends AbstractDeclaredStatement> ctx) { return new PatternEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PositionStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PositionStatementImpl.java index 2a92fd5440..687d9b57f7 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PositionStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PositionStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.PositionEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PositionStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.PositionEffectiveStatementImpl; public class PositionStatementImpl extends AbstractDeclaredStatement implements PositionStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .POSITION) + .build(); protected PositionStatementImpl( StmtContext context) { @@ -53,6 +57,12 @@ public class PositionStatementImpl extends AbstractDeclaredStatement return new PositionEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PrefixStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PrefixStatementImpl.java index 16dc0071c1..fb2256fb13 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PrefixStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PrefixStatementImpl.java @@ -7,16 +7,20 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.PrefixEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PrefixStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.PrefixEffectiveStatementImpl; public class PrefixStatementImpl extends AbstractDeclaredStatement implements PrefixStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .PREFIX) + .build(); public static class Definition extends AbstractStatementSupport> { @@ -38,6 +42,13 @@ public class PrefixStatementImpl extends AbstractDeclaredStatement imple public EffectiveStatement createEffective(StmtContext> ctx) { return new PrefixEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } PrefixStatementImpl(StmtContext context) { diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PresenceStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PresenceStatementImpl.java index 101fa1b500..e63f9a7125 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PresenceStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/PresenceStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.PresenceEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PresenceStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.PresenceEffectiveStatementImpl; public class PresenceStatementImpl extends AbstractDeclaredStatement implements PresenceStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .PRESENCE) + .build(); protected PresenceStatementImpl( StmtContext context) { @@ -49,6 +53,12 @@ public class PresenceStatementImpl extends AbstractDeclaredStatement return new PresenceEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RangeStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RangeStatementImpl.java index 467517f9e7..21b13682a2 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RangeStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RangeStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import java.math.BigDecimal; import java.util.List; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; @@ -18,12 +17,21 @@ import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RangeStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.type.RangeConstraint; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.RangeEffectiveStatementImpl; public class RangeStatementImpl extends AbstractDeclaredStatement> implements RangeStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .RANGE) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.ERROR_APP_TAG, 0, 1) + .add(Rfc6020Mapping.ERROR_MESSAGE, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .build(); // these objects are to compare whether range has MAX or MIN value // none of these values should appear as Yang number according to spec so they are safe to use @@ -57,6 +65,13 @@ public class RangeStatementImpl extends AbstractDeclaredStatement, RangeStatement, EffectiveStatement, RangeStatement>> ctx) { return new RangeEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable, RangeStatement, + EffectiveStatement, RangeStatement>> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ReferenceStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ReferenceStatementImpl.java index 675f8bd541..63448a1d40 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ReferenceStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ReferenceStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -11,12 +11,17 @@ import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ReferenceEffectiveStatementImpl; public class ReferenceStatementImpl extends AbstractDeclaredStatement implements ReferenceStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .REFERENCE) + .build(); protected ReferenceStatementImpl(final StmtContext context) { super(context); @@ -43,6 +48,13 @@ public class ReferenceStatementImpl extends AbstractDeclaredStatement im final StmtContext> ctx) { return new ReferenceEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RefineStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RefineStatementImpl.java index 897b65f60a..ea79b9b4a8 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RefineStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RefineStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -15,12 +15,26 @@ import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RefineStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RefineEffectiveStatementImpl; public class RefineStatementImpl extends AbstractDeclaredStatement implements RefineStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .REFINE) + .add(Rfc6020Mapping.DEFAULT, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.CONFIG, 0, 1) + .add(Rfc6020Mapping.MANDATORY, 0, 1) + .add(Rfc6020Mapping.PRESENCE, 0, 1) + .add(Rfc6020Mapping.MUST, 0, 1) + .add(Rfc6020Mapping.MIN_ELEMENTS, 0, 1) + .add(Rfc6020Mapping.MAX_ELEMENTS, 0, 1) + .build(SubstatementValidator.SpecialCase.NOTNULL); protected RefineStatementImpl(final StmtContext context) { super(context); @@ -48,6 +62,13 @@ public class RefineStatementImpl extends AbstractDeclaredStatement> ctx) { return new RefineEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RequireInstanceStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RequireInstanceStatementImpl.java index cd192b9f9a..e2854f8cad 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RequireInstanceStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RequireInstanceStatementImpl.java @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RequireInstanceEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RequireInstanceStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RequireInstanceEffectiveStatementImpl; public class RequireInstanceStatementImpl extends AbstractDeclaredStatement implements RequireInstanceStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .REQUIRE_INSTANCE) + .build(); protected RequireInstanceStatementImpl( StmtContext context) { @@ -49,6 +53,12 @@ public class RequireInstanceStatementImpl extends return new RequireInstanceEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RevisionDateStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RevisionDateStatementImpl.java index f376f73735..0e6ef322fb 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RevisionDateStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RevisionDateStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,21 +7,24 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; - import java.text.ParseException; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; import java.util.Date; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RevisionDateEffectiveStatementImpl; +import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RevisionDateEffectiveStatementImpl; public class RevisionDateStatementImpl extends AbstractDeclaredStatement implements RevisionDateStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .REVISION_DATE) + .build(); protected RevisionDateStatementImpl( StmtContext context) { @@ -62,6 +65,12 @@ public class RevisionDateStatementImpl extends return new RevisionDateEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RevisionStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RevisionStatementImpl.java index d8cc62c8c1..16ef33e27b 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RevisionStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RevisionStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,23 +7,29 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RevisionEffectiveStatementImpl; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; import java.text.ParseException; import java.util.Date; +import javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RevisionEffectiveStatementImpl; public class RevisionStatementImpl extends AbstractDeclaredStatement implements RevisionStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .REVISION) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .build(); protected RevisionStatementImpl( StmtContext context) { @@ -64,6 +70,13 @@ public class RevisionStatementImpl extends AbstractDeclaredStatement StmtContext> ctx) { return new RevisionEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RpcStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RpcStatementImpl.java index 85235b9e01..efd30ca75a 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RpcStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/RpcStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,29 +7,43 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RpcEffectiveStatementImpl; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; -import javax.annotation.Nullable; import java.util.Collection; +import javax.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.GroupingStatement; import org.opendaylight.yangtools.yang.model.api.stmt.IfFeatureStatement; import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement; import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement; -import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; -import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.RpcEffectiveStatementImpl; public class RpcStatementImpl extends AbstractDeclaredStatement implements RpcStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .RPC) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.INPUT, 0, 1) + .add(Rfc6020Mapping.OUTPUT, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .build(); protected RpcStatementImpl(StmtContext context) { super(context); @@ -65,6 +79,12 @@ public class RpcStatementImpl extends AbstractDeclaredStatement return new RpcEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StatusStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StatusStatementImpl.java index 26878d737a..6c75b68e93 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StatusStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StatusStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,18 +7,22 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.model.api.Status; - -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.StatusEffectiveStatementImpl; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; +import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.StatusEffectiveStatementImpl; public class StatusStatementImpl extends AbstractDeclaredStatement implements StatusStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .STATUS) + .build(); protected StatusStatementImpl( StmtContext context) { @@ -49,6 +53,13 @@ public class StatusStatementImpl extends AbstractDeclaredStatement StmtContext> ctx) { return new StatusEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StringRestrictionsImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StringRestrictionsImpl.java index a98487e4cf..e2745bd15d 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StringRestrictionsImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/StringRestrictionsImpl.java @@ -7,13 +7,15 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import java.util.Collection; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; +import java.util.Collection; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.LengthStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PatternStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @@ -22,6 +24,11 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.String public class StringRestrictionsImpl extends AbstractDeclaredStatement implements TypeStatement.StringRestrictions { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.LENGTH, 0, 1) + .add(Rfc6020Mapping.PATTERN, 0, MAX) + .build(); protected StringRestrictionsImpl(StmtContext context) { super(context); @@ -51,6 +58,13 @@ public class StringRestrictionsImpl extends AbstractDeclaredStatement im StmtContext> ctx) { return new StringRestrictionsEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java index 803b5e48e0..eab3ce3436 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/SubmoduleStatementImpl.java @@ -7,13 +7,14 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.findFirstDeclaredSubstatement; import static org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils.firstAttributeOf; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; - +import com.google.common.base.Optional; import java.net.URI; import java.util.Date; +import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; import org.opendaylight.yangtools.yang.model.api.ModuleIdentifier; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; @@ -23,16 +24,44 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SubmoduleStatement; import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; import org.opendaylight.yangtools.yang.parser.builder.impl.ModuleIdentifierImpl; import org.opendaylight.yangtools.yang.parser.spi.SubmoduleNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; import org.opendaylight.yangtools.yang.parser.spi.source.BelongsToPrefixToModuleName; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.SubmoduleEffectiveStatementImpl; -import com.google.common.base.Optional; public class SubmoduleStatementImpl extends AbstractRootStatement implements SubmoduleStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .SUBMODULE) + .add(Rfc6020Mapping.ANYXML, 0, MAX) + .add(Rfc6020Mapping.AUGMENT, 0, MAX) + .add(Rfc6020Mapping.BELONGS_TO, 1, 1) + .add(Rfc6020Mapping.CHOICE, 0, MAX) + .add(Rfc6020Mapping.CONTACT, 0, 1) + .add(Rfc6020Mapping.CONTAINER, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.DEVIATION, 0, MAX) + .add(Rfc6020Mapping.EXTENSION, 0, MAX) + .add(Rfc6020Mapping.FEATURE, 0, MAX) + .add(Rfc6020Mapping.GROUPING, 0, MAX) + .add(Rfc6020Mapping.IDENTITY, 0, MAX) + .add(Rfc6020Mapping.IMPORT, 0, MAX) + .add(Rfc6020Mapping.INCLUDE, 0, MAX) + .add(Rfc6020Mapping.LEAF, 0, MAX) + .add(Rfc6020Mapping.LEAF_LIST, 0, MAX) + .add(Rfc6020Mapping.LIST, 0, MAX) + .add(Rfc6020Mapping.NOTIFICATION, 0, MAX) + .add(Rfc6020Mapping.ORGANIZATION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.REVISION, 0, MAX) + .add(Rfc6020Mapping.RPC, 0, MAX) + .add(Rfc6020Mapping.TYPEDEF, 0, MAX) + .add(Rfc6020Mapping.USES, 0, MAX) + .add(Rfc6020Mapping.YANG_VERSION, 0, 1) + .build(); protected SubmoduleStatementImpl( StmtContext context) { @@ -96,6 +125,13 @@ public class SubmoduleStatementImpl extends stmt.addToNs(BelongsToPrefixToModuleName.class, prefix, belongsToModuleName); } + + @Override + public void onFullDefinitionDeclared(Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeStatementImpl.java index a06463a7d5..de9ea479bb 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypeStatementImpl.java @@ -7,6 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; + import com.google.common.base.Verify; import java.util.Collection; import javax.annotation.Nonnull; @@ -31,6 +33,7 @@ import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition; import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; @@ -60,6 +63,19 @@ import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.Unsign public class TypeStatementImpl extends AbstractDeclaredStatement implements TypeStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.BASE, 0, 1) + .add(Rfc6020Mapping.BIT, 0, MAX) + .add(Rfc6020Mapping.ENUM, 0, MAX) + .add(Rfc6020Mapping.FRACTION_DIGITS, 0, 1) + .add(Rfc6020Mapping.LENGTH, 0, 1) + .add(Rfc6020Mapping.PATH, 0, 1) + .add(Rfc6020Mapping.PATTERN, 0, MAX) + .add(Rfc6020Mapping.RANGE, 0, 1) + .add(Rfc6020Mapping.REQUIRE_INSTANCE, 0, 1) + .add(Rfc6020Mapping.TYPE, 0, MAX) + .build(); protected TypeStatementImpl(final StmtContext context) { super(context); @@ -185,6 +201,7 @@ public class TypeStatementImpl extends AbstractDeclaredStatement public void onFullDefinitionDeclared( final Mutable> stmt) throws SourceException { + SUBSTATEMENT_VALIDATOR.validate(stmt); // if it is yang built-in type, no prerequisite is needed, so simply return if (TypeUtils.isYangBuiltInTypeString(stmt.getStatementArgument())) { @@ -224,4 +241,4 @@ public class TypeStatementImpl extends AbstractDeclaredStatement public String getName() { return argument(); } -} +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypedefStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypedefStatementImpl.java index 5ab0e3cb52..3c06831867 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypedefStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/TypedefStatementImpl.java @@ -17,6 +17,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypedefStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.TypeNamespace; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; @@ -25,6 +26,15 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.TypeDefEffectiveStatementImpl; public class TypedefStatementImpl extends AbstractDeclaredStatement implements TypedefStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPEDEF) + .add(Rfc6020Mapping.DEFAULT, 0, 1) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.TYPE, 1, 1) + .add(Rfc6020Mapping.UNITS, 0, 1) + .build(); protected TypedefStatementImpl(StmtContext context) { super(context); @@ -66,6 +76,13 @@ public class TypedefStatementImpl extends AbstractDeclaredStatement imple stmt.getParentContext().addContext(TypeNamespace.class, stmt.getStatementArgument(), stmt); } } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nullable diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UnionSpecificationImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UnionSpecificationImpl.java index 13df3b4d0f..398e9881ad 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UnionSpecificationImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UnionSpecificationImpl.java @@ -7,19 +7,25 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import java.util.Collection; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; +import java.util.Collection; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; -import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.type.UnionSpecificationEffectiveStatementImpl; public class UnionSpecificationImpl extends AbstractDeclaredStatement implements TypeStatement.UnionSpecification { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .TYPE) + .add(Rfc6020Mapping.TYPE, 1, MAX) + .build(); protected UnionSpecificationImpl( StmtContext context) { @@ -49,6 +55,12 @@ public class UnionSpecificationImpl extends AbstractDeclaredStatement StmtContext> ctx) { return new UnionSpecificationEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UniqueStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UniqueStatementImpl.java index ed95fbf06b..7148cbbf25 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UniqueStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UniqueStatementImpl.java @@ -15,6 +15,7 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier.Relative; import org.opendaylight.yangtools.yang.model.api.stmt.UniqueStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @@ -22,6 +23,9 @@ import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.UniqueEffectiveStatementImpl; public class UniqueStatementImpl extends AbstractDeclaredStatement> implements UniqueStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .UNIQUE) + .build(); protected UniqueStatementImpl(StmtContext, UniqueStatement, ?> context) { super(context); @@ -53,6 +57,13 @@ public class UniqueStatementImpl extends AbstractDeclaredStatement> ctx) { return new UniqueEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable, UniqueStatement, + EffectiveStatement, UniqueStatement>> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UnitsStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UnitsStatementImpl.java index f61576b4f5..2bdd91891c 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UnitsStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UnitsStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.UnitsEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UnitsStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.UnitsEffectiveStatementImpl; public class UnitsStatementImpl extends AbstractDeclaredStatement implements UnitsStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .UNITS) + .build(); protected UnitsStatementImpl(StmtContext context) { super(context); @@ -48,6 +52,12 @@ public class UnitsStatementImpl extends AbstractDeclaredStatement return new UnitsEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java index 36cf90302d..154467fb19 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/UsesStatementImpl.java @@ -7,6 +7,8 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; +import static org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator.MAX; + import java.util.Collection; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; @@ -20,6 +22,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.StatusStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UsesStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; import org.opendaylight.yangtools.yang.parser.spi.GroupingNamespace; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; @@ -37,6 +40,16 @@ import org.slf4j.LoggerFactory; public class UsesStatementImpl extends AbstractDeclaredStatement implements UsesStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .USES) + .add(Rfc6020Mapping.AUGMENT, 0, MAX) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.IF_FEATURE, 0, MAX) + .add(Rfc6020Mapping.REFINE, 0, MAX) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .add(Rfc6020Mapping.STATUS, 0, 1) + .add(Rfc6020Mapping.WHEN, 0, 1) + .build(); private static final Logger LOG = LoggerFactory.getLogger(UsesStatementImpl.class); @@ -60,6 +73,7 @@ public class UsesStatementImpl extends AbstractDeclaredStatement implemen public void onFullDefinitionDeclared( final StmtContext.Mutable> usesNode) throws SourceException { + SUBSTATEMENT_VALIDATOR.validate(usesNode); if(StmtContextUtils.isInExtensionBody(usesNode)) { return; diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ValueStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ValueStatementImpl.java index de57f4c946..4c1a959040 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ValueStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/ValueStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -10,12 +10,17 @@ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ValueStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.ValueEffectiveStatementImpl; public class ValueStatementImpl extends AbstractDeclaredStatement implements ValueStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .VALUE) + .build(); protected ValueStatementImpl(StmtContext context) { super(context); @@ -55,6 +60,12 @@ public class ValueStatementImpl extends AbstractDeclaredStatement imple return new ValueEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java index 3af90daf87..3badb10404 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/WhenStatementImpl.java @@ -15,12 +15,19 @@ import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceStatement; import org.opendaylight.yangtools.yang.model.api.stmt.WhenStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.WhenEffectiveStatementImpl; public class WhenStatementImpl extends AbstractDeclaredStatement implements WhenStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .WHEN) + .add(Rfc6020Mapping.DESCRIPTION, 0, 1) + .add(Rfc6020Mapping.REFERENCE, 0, 1) + .build(); protected WhenStatementImpl(final StmtContext context) { super(context); @@ -48,6 +55,13 @@ public class WhenStatementImpl extends AbstractDeclaredStatement> ctx) { return new WhenEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangVersionStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangVersionStatementImpl.java index 093c3df202..436d8cee39 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangVersionStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YangVersionStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,24 +7,28 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.YangVersionEffectiveStatementImpl; - +import javax.annotation.Nonnull; import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.YangVersionStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -import javax.annotation.Nonnull; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.YangVersionEffectiveStatementImpl; public class YangVersionStatementImpl extends AbstractDeclaredStatement implements YangVersionStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .YANG_VERSION) + .build(); protected YangVersionStatementImpl(StmtContext context) { super(context); } - public static class Definition extends AbstractStatementSupport> { + public static class Definition extends AbstractStatementSupport> { public Definition() { super(Rfc6020Mapping.YANG_VERSION); @@ -41,9 +45,17 @@ public class YangVersionStatementImpl extends AbstractDeclaredStatement } @Override - public EffectiveStatement createEffective(StmtContext> ctx) { + public EffectiveStatement createEffective + (StmtContext> ctx) { return new YangVersionEffectiveStatementImpl(ctx); } + + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Nonnull @Override diff --git a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinElementStatementImpl.java b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinElementStatementImpl.java index 79f437a55b..3d178bde02 100644 --- a/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinElementStatementImpl.java +++ b/yang/yang-parser-impl/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/rfc6020/YinElementStatementImpl.java @@ -1,4 +1,4 @@ -/** +/* * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. * * This program and the accompanying materials are made available under the @@ -7,17 +7,21 @@ */ package org.opendaylight.yangtools.yang.parser.stmt.rfc6020; -import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.YinElementEffectiveStatementImpl; - import org.opendaylight.yangtools.yang.model.api.Rfc6020Mapping; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.YinElementStatement; +import org.opendaylight.yangtools.yang.parser.spi.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; +import org.opendaylight.yangtools.yang.parser.stmt.rfc6020.effective.YinElementEffectiveStatementImpl; public class YinElementStatementImpl extends AbstractDeclaredStatement implements YinElementStatement { + private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(Rfc6020Mapping + .YIN_ELEMENT) + .build(); protected YinElementStatementImpl( StmtContext context) { @@ -49,6 +53,12 @@ public class YinElementStatementImpl extends AbstractDeclaredStatement return new YinElementEffectiveStatementImpl(ctx); } + @Override + public void onFullDefinitionDeclared(StmtContext.Mutable> stmt) throws SourceException { + super.onFullDefinitionDeclared(stmt); + SUBSTATEMENT_VALIDATOR.validate(stmt); + } } @Override diff --git a/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/test/SubstatementValidatorTest.java b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/test/SubstatementValidatorTest.java new file mode 100644 index 0000000000..4c67d6c3b9 --- /dev/null +++ b/yang/yang-parser-impl/src/test/java/org/opendaylight/yangtools/yang/stmt/test/SubstatementValidatorTest.java @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2015 Cisco Systems, Inc. and others. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v1.0 which accompanies this distribution, + * and is available at http://www.eclipse.org/legal/epl-v10.html + */ + +package org.opendaylight.yangtools.yang.stmt.test; + +import static junit.framework.Assert.assertTrue; +import static org.junit.Assert.assertNotNull; + +import java.io.ByteArrayOutputStream; +import java.io.PrintStream; +import java.io.UnsupportedEncodingException; +import java.net.URISyntaxException; +import java.util.NoSuchElementException; +import java.util.Set; +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.opendaylight.yangtools.yang.model.api.Module; +import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; +import org.opendaylight.yangtools.yang.stmt.retest.TestUtils; + +public class SubstatementValidatorTest { + + private final PrintStream stdout = System.out; + private final ByteArrayOutputStream output = new ByteArrayOutputStream(); + private String testLog; + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + + @Before + public void setUp() throws UnsupportedEncodingException { + System.setOut(new PrintStream(output, true, "UTF-8")); + } + + @After + public void cleanUp() { + System.setOut(stdout); + } + + @Test + public void noException() throws URISyntaxException, ReactorException { + Set modules = TestUtils.loadModules(getClass().getResource("/augment-test/augment-in-augment").toURI()); + assertNotNull(modules); + } + + @Test + public void undesirableElementException() throws URISyntaxException, ReactorException { + Set modules = TestUtils.loadModules(getClass().getResource + ("/substatement-validator/undesirable-element").toURI()); + testLog = output.toString(); + assertTrue(testLog.contains("TYPE is not valid for REVISION")); + } + + @Test + public void maximalElementCountException() throws URISyntaxException, ReactorException { + Set modules = TestUtils.loadModules(getClass().getResource + ("/substatement-validator/maximal-element").toURI()); + testLog = output.toString(); + assertTrue(testLog.contains("Maximal count of DESCRIPTION for AUGMENT is 1")); + } + + @Test + public void missingElementException() throws URISyntaxException, ReactorException { + expectedEx.expect(IllegalStateException.class); + + Set modules = TestUtils.loadModules(getClass().getResource + ("/substatement-validator/missing-element").toURI()); + } + + @Test + public void emptyElementException() throws URISyntaxException, ReactorException { + expectedEx.expect(NoSuchElementException.class); + + Set modules = TestUtils.loadModules(getClass().getResource + ("/substatement-validator/empty-element").toURI()); + } + + @Test + public void bug4310test() throws URISyntaxException, ReactorException { + expectedEx.expect(IllegalArgumentException.class); + + Set modules = TestUtils.loadModules(getClass().getResource + ("/substatement-validator/bug-4310").toURI()); + } +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/augment-arg-parsing/root-valid-aug-args.yang b/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/augment-arg-parsing/root-valid-aug-args.yang index 8683912dec..36ea846f28 100644 --- a/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/augment-arg-parsing/root-valid-aug-args.yang +++ b/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/augment-arg-parsing/root-valid-aug-args.yang @@ -2,7 +2,9 @@ module root-valid-aug-args { namespace root; prefix root; - import imported; + import imported { + prefix "imp"; + } augment "/aug1/aug11/aug111" { container add { diff --git a/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/effective-module/root.yang b/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/effective-module/root.yang index 9c1f226815..51ce0c5e0f 100644 --- a/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/effective-module/root.yang +++ b/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/effective-module/root.yang @@ -38,8 +38,6 @@ module root { deviation /cont { deviate add { - container subcont { - } } reference "deviate reference"; } diff --git a/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/types2.yang b/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/types2.yang index d69850fed5..b67d2d4ed5 100644 --- a/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/types2.yang +++ b/yang/yang-parser-impl/src/test/resources/semantic-statement-parser/types2.yang @@ -33,11 +33,6 @@ module types2 { default "auto-sense-speed"; } - type union { - type int32; - type string; - } - grouping grp1 { leaf myenum { type enumeration { diff --git a/yang/yang-parser-impl/src/test/resources/substatement-validator/bug-4310/bug4310.yang b/yang/yang-parser-impl/src/test/resources/substatement-validator/bug-4310/bug4310.yang new file mode 100644 index 0000000000..13315e9813 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/substatement-validator/bug-4310/bug4310.yang @@ -0,0 +1,19 @@ +module bug4310 { + yang-version 1; + namespace "urn:opendaylight.bug4310"; + prefix "bug"; + + organization "opendaylight"; + contact "http://www.opendaylight.org/"; + + leaf datapath-id { + type union { + bug:simple-ext-w-arg "key:value"; + } + } + + extension simple-ext-w-arg { + argument "ext-arg"; + description "Extension with single argument definition."; + } +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/test/resources/substatement-validator/empty-element/empty.yang b/yang/yang-parser-impl/src/test/resources/substatement-validator/empty-element/empty.yang new file mode 100644 index 0000000000..fad4799f48 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/substatement-validator/empty-element/empty.yang @@ -0,0 +1,19 @@ +module empty { + namespace "root-module"; + prefix empty; + + container root-container { + uses grp-1 { + refine container-from-grouping/list-in-container { + } + } + } + + grouping grp-1 { + container container-from-grouping { + list list-in-container { + description "original description"; + } + } + } +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/test/resources/substatement-validator/maximal-element/baz.yang b/yang/yang-parser-impl/src/test/resources/substatement-validator/maximal-element/baz.yang new file mode 100644 index 0000000000..185be60af5 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/substatement-validator/maximal-element/baz.yang @@ -0,0 +1,25 @@ +module baz { + yang-version 1; + namespace "urn:opendaylight.baz"; + prefix "baz"; + + import maximal { + prefix "max"; + revision-date 2015-11-11; + } + + organization "opendaylight"; + contact "http://www.opendaylight.org/"; + + revision "2015-11-11" { + reference " WILL BE DEFINED LATER"; + } + + augment "/max:interfaces/max:ifEntry" { + description "Test describtion"; + description "Test describtion"; + container augment-holder2 { + description "Description for augment holder"; + } + } +} diff --git a/yang/yang-parser-impl/src/test/resources/substatement-validator/maximal-element/maximal.yang b/yang/yang-parser-impl/src/test/resources/substatement-validator/maximal-element/maximal.yang new file mode 100644 index 0000000000..62f2f563d4 --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/substatement-validator/maximal-element/maximal.yang @@ -0,0 +1,33 @@ +module maximal { + yang-version 1; + namespace "urn:opendaylight.maximal"; + prefix "maximal"; + + organization "opendaylight"; + contact "http://www.opendaylight.org/"; + + revision "2015-11-11" { + reference "WILL BE DEFINED LATER"; + } + + container interfaces { + grouping ifEntry { + container augment-holder; + } + list ifEntry { + key "ifIndex"; + + leaf ifIndex { + type uint32; + units minutes; + } + + leaf ifMtu { + type int32; + } + + min-elements 1; + max-elements 11; + } + } +} diff --git a/yang/yang-parser-impl/src/test/resources/substatement-validator/missing-element/baz.yang b/yang/yang-parser-impl/src/test/resources/substatement-validator/missing-element/baz.yang new file mode 100644 index 0000000000..accae9280b --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/substatement-validator/missing-element/baz.yang @@ -0,0 +1,16 @@ +module baz { + yang-version 1; + namespace "urn:opendaylight.baz"; + prefix "baz"; + + import missing { + revision-date 2015-11-11; + } + + organization "opendaylight"; + contact "http://www.opendaylight.org/"; + + revision "2015-11-11" { + reference " WILL BE DEFINED LATER"; + } +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/test/resources/substatement-validator/missing-element/missing.yang b/yang/yang-parser-impl/src/test/resources/substatement-validator/missing-element/missing.yang new file mode 100644 index 0000000000..753238ecbb --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/substatement-validator/missing-element/missing.yang @@ -0,0 +1,12 @@ +module missing { + yang-version 1; + namespace "urn:opendaylight.missing"; + prefix "missing"; + + organization "opendaylight"; + contact "http://www.opendaylight.org/"; + + revision "2015-11-11" { + reference " WILL BE DEFINED LATER"; + } +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/test/resources/substatement-validator/undesirable-element/undesirable.yang b/yang/yang-parser-impl/src/test/resources/substatement-validator/undesirable-element/undesirable.yang new file mode 100644 index 0000000000..449526a7cd --- /dev/null +++ b/yang/yang-parser-impl/src/test/resources/substatement-validator/undesirable-element/undesirable.yang @@ -0,0 +1,13 @@ +module undesirable { + yang-version 1; + namespace "urn:opendaylight.undesirable"; + prefix "undesirable"; + + organization "opendaylight"; + contact "http://www.opendaylight.org/"; + + revision "2015-11-11" { + reference " WILL BE DEFINED LATER"; + type "string"; + } +} \ No newline at end of file diff --git a/yang/yang-parser-impl/src/test/resources/type-tests/types.yang b/yang/yang-parser-impl/src/test/resources/type-tests/types.yang index eb57402a6d..7f8ed0cc96 100644 --- a/yang/yang-parser-impl/src/test/resources/type-tests/types.yang +++ b/yang/yang-parser-impl/src/test/resources/type-tests/types.yang @@ -52,7 +52,6 @@ module types { leaf leaf-identityref { type identityref { base "test-identity"; - units "test-unit"; } } @@ -82,9 +81,6 @@ module types { type decimal64 { fraction-digits 2; range "1 .. 3.14 | 10 | 20..max"; - description "test decimal64"; - reference "test decimal64 ref"; - status current; } } @@ -99,18 +95,15 @@ module types { description "test bit"; reference "test bit ref"; status current; - value 0; } bit two { position 1; - value 1; } bit three { position 2; description "test bit"; reference "test bit ref"; status current; - value 0; } } default "one"; -- 2.36.6