From 7ba42476ebbe233c6118dd6e7a35ac02fa8fed97 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 20 Mar 2019 16:08:28 +0100 Subject: [PATCH] Clean up StatementDefinition argument definition interface This makes it impossible for implementations to present a wrong argument definition by encapsulating it in ArgumentDefinition. To simplify implementations, an AbstractStatementDefinition class is provided, which keeps the two components decomposed and creates the definition on demand. Change-Id: If941eb697ebfd53540da54074cba6018f4172452 Signed-off-by: Robert Varga --- .../api/OpenDaylightExtensionsStatements.java | 16 ++-- .../model/api/OpenConfigStatements.java | 11 +-- .../rfc6536/model/api/NACMStatements.java | 12 +-- .../rfc7952/model/api/MetadataStatements.java | 16 ++-- .../rfc8040/model/api/YangDataStatements.java | 16 ++-- .../model/api/SchemaMountStatements.java | 16 ++-- .../yang/model/api/YangStmtMapping.java | 11 +-- .../api/meta/AbstractStatementDefinition.java | 64 +++++++++++++ .../model/api/meta/ArgumentDefinition.java | 94 +++++++++++++++++++ .../api/meta/DefaultStatementDefinition.java | 34 +------ .../model/api/meta/StatementDefinition.java | 16 +--- .../model/repo/api/YinDomSchemaSource.java | 6 +- .../yang/model/export/YinXMLEventReader.java | 13 ++- .../stmt/reactor/SourceSpecificContext.java | 2 +- .../reactor/StatementDefinitionContext.java | 13 +-- .../repo/YinStatementStreamSource.java | 19 ++-- .../parser/rfc7950/stmt/ArgumentUtils.java | 4 +- .../ModelDefinedStatementDefinition.java | 31 ++---- .../UnrecognizedStatementSupport.java | 17 +++- .../plugin/ThirdPartyExtensionsMapping.java | 11 +-- .../parser/spi/meta/StatementSupport.java | 10 +- 21 files changed, 258 insertions(+), 174 deletions(-) create mode 100644 yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractStatementDefinition.java create mode 100644 yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ArgumentDefinition.java diff --git a/yang/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/OpenDaylightExtensionsStatements.java b/yang/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/OpenDaylightExtensionsStatements.java index 82b7b71c3d..7ec3fe709d 100644 --- a/yang/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/OpenDaylightExtensionsStatements.java +++ b/yang/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/OpenDaylightExtensionsStatements.java @@ -10,9 +10,10 @@ package org.opendaylight.yangtools.odlext.model.api; import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; -import org.eclipse.jdt.annotation.NonNull; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -32,13 +33,13 @@ public enum OpenDaylightExtensionsStatements implements StatementDefinition { private final Class> effectiveRepresentation; private final Class> declaredRepresentation; private final QName statementName; - private final QName argumentName; + private final ArgumentDefinition argumentDef; OpenDaylightExtensionsStatements(final QName statementName, final String argumentName, final Class> declaredRepresentation, final Class> effectiveRepresentation) { this.statementName = statementName.intern(); - this.argumentName = QName.create(statementName, argumentName); + this.argumentDef = ArgumentDefinition.of(QName.create(statementName, argumentName).intern(), false); this.declaredRepresentation = requireNonNull(declaredRepresentation); this.effectiveRepresentation = requireNonNull(effectiveRepresentation); } @@ -49,8 +50,8 @@ public enum OpenDaylightExtensionsStatements implements StatementDefinition { } @Override - public @NonNull QName getArgumentName() { - return argumentName; + public Optional getArgumentDefinition() { + return Optional.of(argumentDef); } @Override @@ -62,9 +63,4 @@ public enum OpenDaylightExtensionsStatements implements StatementDefinition { public Class> getEffectiveRepresentationClass() { return effectiveRepresentation; } - - @Override - public boolean isArgumentYinElement() { - return false; - } } diff --git a/yang/openconfig-model-api/src/main/java/org/opendaylight/yangtools/openconfig/model/api/OpenConfigStatements.java b/yang/openconfig-model-api/src/main/java/org/opendaylight/yangtools/openconfig/model/api/OpenConfigStatements.java index 940928906a..9fcc47c342 100644 --- a/yang/openconfig-model-api/src/main/java/org/opendaylight/yangtools/openconfig/model/api/OpenConfigStatements.java +++ b/yang/openconfig-model-api/src/main/java/org/opendaylight/yangtools/openconfig/model/api/OpenConfigStatements.java @@ -11,9 +11,11 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -49,8 +51,8 @@ public enum OpenConfigStatements implements StatementDefinition { } @Override - public @Nullable QName getArgumentName() { - return argumentName; + public Optional getArgumentDefinition() { + return ArgumentDefinition.ofNullable(argumentName, false); } @Override @@ -62,9 +64,4 @@ public enum OpenConfigStatements implements StatementDefinition { public Class> getEffectiveRepresentationClass() { return effectiveRepresentation; } - - @Override - public boolean isArgumentYinElement() { - return false; - } } diff --git a/yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/NACMStatements.java b/yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/NACMStatements.java index bf896c389b..6f34f33605 100644 --- a/yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/NACMStatements.java +++ b/yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/NACMStatements.java @@ -9,9 +9,10 @@ package org.opendaylight.yangtools.rfc6536.model.api; import static java.util.Objects.requireNonNull; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNullByDefault; -import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -40,13 +41,8 @@ public enum NACMStatements implements StatementDefinition { } @Override - public @Nullable QName getArgumentName() { - return null; - } - - @Override - public boolean isArgumentYinElement() { - return false; + public Optional getArgumentDefinition() { + return Optional.empty(); } @Override diff --git a/yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/MetadataStatements.java b/yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/MetadataStatements.java index 06ec8691bd..4266579877 100644 --- a/yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/MetadataStatements.java +++ b/yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/MetadataStatements.java @@ -9,9 +9,10 @@ package org.opendaylight.yangtools.rfc7952.model.api; import static java.util.Objects.requireNonNull; -import org.eclipse.jdt.annotation.NonNull; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -29,25 +30,20 @@ public enum MetadataStatements implements StatementDefinition { private final Class> effectiveRepresentation; private final Class> declaredRepresentation; private final QName statementName; - private final QName argumentName; + private final ArgumentDefinition argumentDef; MetadataStatements(final QName statementName, final String argumentName, final Class> declaredRepresentation, final Class> effectiveRepresentation) { this.statementName = statementName.intern(); - this.argumentName = QName.create(statementName, argumentName); + this.argumentDef = ArgumentDefinition.of(QName.create(statementName, argumentName).intern(), false); this.declaredRepresentation = requireNonNull(declaredRepresentation); this.effectiveRepresentation = requireNonNull(effectiveRepresentation); } @Override - public @NonNull QName getArgumentName() { - return argumentName; - } - - @Override - public boolean isArgumentYinElement() { - return false; + public Optional getArgumentDefinition() { + return Optional.of(argumentDef); } @Override diff --git a/yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatements.java b/yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatements.java index 48b8539393..a7ac3c917a 100644 --- a/yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatements.java +++ b/yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatements.java @@ -9,9 +9,10 @@ package org.opendaylight.yangtools.rfc8040.model.api; import static java.util.Objects.requireNonNull; -import org.eclipse.jdt.annotation.NonNull; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -29,25 +30,20 @@ public enum YangDataStatements implements StatementDefinition { private final Class> effectiveRepresentation; private final Class> declaredRepresentation; private final QName statementName; - private final QName argumentName; + private final ArgumentDefinition argumentDef; YangDataStatements(final QName statementName, final String argumentName, final Class> declaredRepresentation, final Class> effectiveRepresentation) { this.statementName = statementName.intern(); - this.argumentName = QName.create(statementName, argumentName); + this.argumentDef = ArgumentDefinition.of(QName.create(statementName, argumentName).intern(), false); this.declaredRepresentation = requireNonNull(declaredRepresentation); this.effectiveRepresentation = requireNonNull(effectiveRepresentation); } @Override - public @NonNull QName getArgumentName() { - return argumentName; - } - - @Override - public boolean isArgumentYinElement() { - return true; + public Optional getArgumentDefinition() { + return Optional.of(argumentDef); } @Override diff --git a/yang/rfc8528-model-api/src/main/java/org/opendaylight/yangtools/rfc8528/model/api/SchemaMountStatements.java b/yang/rfc8528-model-api/src/main/java/org/opendaylight/yangtools/rfc8528/model/api/SchemaMountStatements.java index 1ba110ed30..9b3723dd38 100644 --- a/yang/rfc8528-model-api/src/main/java/org/opendaylight/yangtools/rfc8528/model/api/SchemaMountStatements.java +++ b/yang/rfc8528-model-api/src/main/java/org/opendaylight/yangtools/rfc8528/model/api/SchemaMountStatements.java @@ -9,9 +9,10 @@ package org.opendaylight.yangtools.rfc8528.model.api; import static java.util.Objects.requireNonNull; -import org.eclipse.jdt.annotation.NonNull; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNullByDefault; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -29,25 +30,20 @@ public enum SchemaMountStatements implements StatementDefinition { private final Class> effectiveRepresentation; private final Class> declaredRepresentation; private final QName statementName; - private final QName argumentName; + private final ArgumentDefinition argumentDef; SchemaMountStatements(final QName statementName, final String argumentName, final Class> declaredRepresentation, final Class> effectiveRepresentation) { this.statementName = statementName.intern(); - this.argumentName = QName.create(statementName, argumentName); + this.argumentDef = ArgumentDefinition.of(QName.create(statementName, argumentName), false); this.declaredRepresentation = requireNonNull(declaredRepresentation); this.effectiveRepresentation = requireNonNull(effectiveRepresentation); } @Override - public @NonNull QName getArgumentName() { - return argumentName; - } - - @Override - public boolean isArgumentYinElement() { - return false; + public Optional getArgumentDefinition() { + return Optional.of(argumentDef); } @Override diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangStmtMapping.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangStmtMapping.java index d53dde83a2..0aafcc7e4d 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangStmtMapping.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangStmtMapping.java @@ -11,10 +11,12 @@ import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.YangConstants; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -273,8 +275,8 @@ public enum YangStmtMapping implements StatementDefinition { } @Override - public @Nullable QName getArgumentName() { - return argument; + public Optional getArgumentDefinition() { + return ArgumentDefinition.ofNullable(argument, yinElement); } @Override @@ -286,9 +288,4 @@ public enum YangStmtMapping implements StatementDefinition { public Class> getEffectiveRepresentationClass() { return effectiveType; } - - @Override - public boolean isArgumentYinElement() { - return yinElement; - } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractStatementDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractStatementDefinition.java new file mode 100644 index 0000000000..150bff2db1 --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractStatementDefinition.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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.model.api.meta; + +import static java.util.Objects.requireNonNull; + +import com.google.common.annotations.Beta; +import com.google.common.base.MoreObjects; +import com.google.common.base.MoreObjects.ToStringHelper; +import java.util.Optional; +import org.eclipse.jdt.annotation.NonNullByDefault; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.common.QName; + +/** + * Abstract utility class to handle StatementArgumentDefinition aspect of {@link StatementDefinition}. Most users should + * use this class or {@link DefaultStatementDefinition}. + */ +@Beta +@NonNullByDefault +public abstract class AbstractStatementDefinition implements StatementDefinition { + private final QName statementName; + private final @Nullable QName argumentName; + private final boolean yinElement; + + protected AbstractStatementDefinition(final QName statementName) { + this(statementName, false, null); + } + + protected AbstractStatementDefinition(final QName statementName, final boolean yinElement, + final @Nullable QName argumentName) { + this.statementName = requireNonNull(statementName); + this.yinElement = yinElement; + this.argumentName = argumentName; + } + + @Override + public final QName getStatementName() { + return statementName; + } + + @Override + public final Optional getArgumentDefinition() { + return ArgumentDefinition.ofNullable(argumentName, yinElement); + } + + @Override + public final String toString() { + return addToStringAttributes(MoreObjects.toStringHelper(this)).toString(); + } + + protected ToStringHelper addToStringAttributes(final ToStringHelper helper) { + helper.add("name", statementName); + if (argumentName != null) { + helper.add("argument", argumentName).add("yin-element", yinElement); + } + return helper; + } +} diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ArgumentDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ArgumentDefinition.java new file mode 100644 index 0000000000..194426ca97 --- /dev/null +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ArgumentDefinition.java @@ -0,0 +1,94 @@ +/* + * Copyright (c) 2019 PANTHEON.tech, s.r.o. 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.model.api.meta; + +import static java.util.Objects.requireNonNull; + +import com.google.common.annotations.Beta; +import com.google.common.base.MoreObjects; +import java.util.Optional; +import org.eclipse.jdt.annotation.NonNull; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.concepts.Immutable; +import org.opendaylight.yangtools.yang.common.QName; + +@Beta +public abstract class ArgumentDefinition implements Immutable { + private static final class YinAttribute extends ArgumentDefinition { + YinAttribute(final QName argumentName) { + super(argumentName); + } + + @Override + public boolean isYinElement() { + return false; + } + } + + private static final class YinElement extends ArgumentDefinition { + YinElement(final QName argumentName) { + super(argumentName); + } + + @Override + public boolean isYinElement() { + return true; + } + } + + private final @NonNull QName argumentName; + + ArgumentDefinition(final QName argumentName) { + this.argumentName = requireNonNull(argumentName); + } + + public static @NonNull ArgumentDefinition of(final QName argumentName, final boolean yinElement) { + return yinElement ? new YinElement(argumentName) : new YinAttribute(argumentName); + } + + public static @NonNull Optional ofNullable(final @Nullable QName argumentName, + final boolean yinElement) { + return argumentName == null ? Optional.empty() : Optional.of(of(argumentName, yinElement)); + } + + + public final @NonNull QName getArgumentName() { + return argumentName; + } + + /** + * Returns true, if argument of statement is represented as value of YIN element. If argument of statement is + * represented as argument of YIN element, returns false. + * + * @return returns true, if statement argument is represented as value of YIN element, otherwise returns false. + */ + public abstract boolean isYinElement(); + + @Override + public final int hashCode() { + return Boolean.hashCode(isYinElement()) * 31 + argumentName.hashCode(); + } + + @Override + public final boolean equals(final Object obj) { + if (this == obj) { + return true; + } + if (!(obj instanceof ArgumentDefinition)) { + return false; + } + final ArgumentDefinition other = (ArgumentDefinition) obj; + return isYinElement() == other.isYinElement() && argumentName.equals(other.argumentName); + } + + @Override + public final String toString() { + return MoreObjects.toStringHelper(ArgumentDefinition.class).add("argumentName", argumentName) + .add("yinElement", isYinElement()).toString(); + } +} diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DefaultStatementDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DefaultStatementDefinition.java index 979e8cbbd1..331006069a 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DefaultStatementDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DefaultStatementDefinition.java @@ -11,7 +11,6 @@ import static com.google.common.base.Preconditions.checkArgument; import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; -import com.google.common.base.MoreObjects; import com.google.common.base.MoreObjects.ToStringHelper; import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; @@ -30,21 +29,16 @@ import org.opendaylight.yangtools.yang.common.QName; @Beta @NonNullByDefault public final class DefaultStatementDefinition, E extends EffectiveStatement> - implements StatementDefinition { + extends AbstractStatementDefinition { private final Class effectiveRepresentation; private final Class declaredRepresentation; - private final QName statementName; - private final @Nullable QName argumentName; - private final boolean argumentYinElement; DefaultStatementDefinition(final QName statementName, final Class declaredRepresentation, final Class effectiveRepresentation, final boolean argumentYinElement, final @Nullable QName argumentName) { - this.statementName = requireNonNull(statementName); + super(statementName, argumentYinElement, argumentName); this.declaredRepresentation = requireNonNull(declaredRepresentation); this.effectiveRepresentation = requireNonNull(effectiveRepresentation); - this.argumentYinElement = argumentYinElement; - this.argumentName = argumentName; checkArgument(declaredRepresentation.isInterface(), "Declared representation %s is not an interface", declaredRepresentation); @@ -73,16 +67,6 @@ public final class DefaultStatementDefinition, argumentYinElement, requireNonNull(argumentName)); } - @Override - public QName getStatementName() { - return statementName; - } - - @Override - public @Nullable QName getArgumentName() { - return argumentName; - } - @Override public Class> getDeclaredRepresentationClass() { return declaredRepresentation; @@ -94,19 +78,9 @@ public final class DefaultStatementDefinition, } @Override - public boolean isArgumentYinElement() { - return argumentYinElement; - } - - @Override - public String toString() { - final ToStringHelper helper = MoreObjects.toStringHelper(this) - .add("name", statementName) + protected ToStringHelper addToStringAttributes(final ToStringHelper helper) { + return super.addToStringAttributes(helper) .add("declared", declaredRepresentation) .add("effective", effectiveRepresentation); - if (argumentName != null) { - helper.add("argument", argumentName).add("yin-element", argumentYinElement); - } - return helper.toString(); } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/StatementDefinition.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/StatementDefinition.java index f27a05ea68..df3247e7b6 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/StatementDefinition.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/StatementDefinition.java @@ -7,8 +7,8 @@ */ package org.opendaylight.yangtools.yang.model.api.meta; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; -import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.common.QName; @@ -36,9 +36,7 @@ public interface StatementDefinition extends Immutable { * * @return argument name or null, if statement does not take argument. */ - // FIXME: 3.0.0: make this return an Optional, which will include the boolean value - // of isArgumentYinElement() - @Nullable QName getArgumentName(); + @NonNull Optional getArgumentDefinition(); /** * Returns class which represents declared version of statement associated with this definition. This class should @@ -55,14 +53,4 @@ public interface StatementDefinition extends Immutable { * @return class which represents effective version of statement associated with this definition */ @NonNull Class> getEffectiveRepresentationClass(); - - /** - * Returns true, if argument of statement is represented as value of yin element. If argument of statement is - * represented as argument of yin element, returns false. If this statement does not have an argument, this method - * returns false. - * - * @return returns true, if statement argument is represented as value of yin element, otherwise returns false. - */ - // FIXME: 3.0.0: integrate this with getArgumentName() - boolean isArgumentYinElement(); } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/YinDomSchemaSource.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/YinDomSchemaSource.java index 2d037474fa..d32ccd0689 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/YinDomSchemaSource.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/YinDomSchemaSource.java @@ -40,6 +40,8 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource { private static final Logger LOG = LoggerFactory.getLogger(YinDomSchemaSource.class); private static final TransformerFactory TRANSFORMER_FACTORY = TransformerFactory.newInstance(); private static final QName REVISION_STMT = REVISION.getStatementName(); + private static final String MODULE_ARG = MODULE.getArgumentDefinition().get().getArgumentName().getLocalName(); + private static final String REVISION_ARG = REVISION.getArgumentDefinition().get().getArgumentName().getLocalName(); YinDomSchemaSource() { // Prevent outside instantiation @@ -71,7 +73,7 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource { checkArgument(root instanceof Element, "Root node %s is not an element", root); final Element element = (Element)root; - final Attr nameAttr = element.getAttributeNode(MODULE.getArgumentName().getLocalName()); + final Attr nameAttr = element.getAttributeNode(MODULE_ARG); checkArgument(nameAttr != null, "No %s name argument found in %s", element.getLocalName()); final NodeList revisions = element.getElementsByTagNameNS(REVISION_STMT.getNamespace().toString(), @@ -82,7 +84,7 @@ public abstract class YinDomSchemaSource implements YinXmlSchemaSource { } final Element revisionStmt = (Element) revisions.item(0); - final Attr dateAttr = revisionStmt.getAttributeNode(REVISION.getArgumentName().getLocalName()); + final Attr dateAttr = revisionStmt.getAttributeNode(REVISION_ARG); checkArgument(dateAttr != null, "No revision statement argument found in %s", revisionStmt); final SourceIdentifier parsedId = RevisionSourceIdentifier.create(nameAttr.getValue(), diff --git a/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java b/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java index 92d05d0bc8..75ecf97bb8 100644 --- a/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java +++ b/yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java @@ -19,6 +19,7 @@ import java.util.Deque; import java.util.Iterator; import java.util.Map.Entry; import java.util.NoSuchElementException; +import java.util.Optional; import java.util.Queue; import javax.xml.XMLConstants; import javax.xml.stream.XMLEventFactory; @@ -30,6 +31,7 @@ import javax.xml.stream.events.EndElement; import javax.xml.stream.events.StartElement; import javax.xml.stream.events.XMLEvent; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -63,9 +65,10 @@ final class YinXMLEventReader implements XMLEventReader { final StatementDefinition def = root.statementDefinition(); final QName name = def.getStatementName(); + final ArgumentDefinition arg = def.getArgumentDefinition().get(); events.add(eventFactory.createStartElement(XMLConstants.DEFAULT_NS_PREFIX, name.getNamespace().toString(), - name.getLocalName(), singletonIterator(attribute(def.getArgumentName(), root.rawArgument())), + name.getLocalName(), singletonIterator(attribute(arg.getArgumentName(), root.rawArgument())), transform(namespaceContext.prefixesAndNamespaces().entrySet().iterator(), e -> eventFactory.createNamespace(e.getKey(), e.getValue())), namespaceContext)); @@ -208,9 +211,11 @@ final class YinXMLEventReader implements XMLEventReader { private void addStatement(final DeclaredStatement statement) { final StatementDefinition def = statement.statementDefinition(); final QName name = def.getStatementName(); - final QName argName = def.getArgumentName(); - if (argName != null) { - if (def.isArgumentYinElement()) { + final Optional optArgDef = def.getArgumentDefinition(); + if (optArgDef.isPresent()) { + final ArgumentDefinition argDef = optArgDef.get(); + final QName argName = argDef.getArgumentName(); + if (argDef.isYinElement()) { events.addAll(Arrays.asList(startElement(name), startElement(argName), eventFactory.createCharacters(statement.rawArgument()), endElement(argName))); } else { diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java index 5bad5a187b..f11a094ed7 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java @@ -139,7 +139,7 @@ public class SourceSpecificContext implements NamespaceStorageNode, NamespaceBeh } if (InferenceException.throwIfNull(def, ref, "Statement %s does not have type mapping defined.", name) - .hasArgument()) { + .getArgumentDefinition().isPresent()) { SourceException.throwIfNull(argument, ref, "Statement %s requires an argument", name); } else { SourceException.throwIf(argument != null, ref, "Statement %s does not take argument", name); diff --git a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java index 43fdeb696d..570da62a64 100644 --- a/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java +++ b/yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java @@ -17,6 +17,7 @@ import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace; @@ -91,22 +92,14 @@ public class StatementDefinitionContext, E ext return support.getDeclaredRepresentationClass(); } - public boolean hasArgument() { - return support.getArgumentName() != null; - } - - public boolean isArgumentYinElement() { - return support.isArgumentYinElement(); + public @NonNull Optional getArgumentDefinition() { + return support.getArgumentDefinition(); } public @NonNull QName getStatementName() { return support.getStatementName(); } - public QName getArgumentName() { - return support.getArgumentName(); - } - @Override public final String toString() { return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString(); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YinStatementStreamSource.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YinStatementStreamSource.java index a8b645ba04..62f9b38b5d 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YinStatementStreamSource.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YinStatementStreamSource.java @@ -21,6 +21,7 @@ import java.net.URISyntaxException; import java.util.Optional; import javax.xml.transform.TransformerException; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.repo.api.SourceIdentifier; import org.opendaylight.yangtools.yang.model.repo.api.YinDomSchemaSource; @@ -145,11 +146,14 @@ public final class YinStatementStreamSource implements StatementStreamSource { final StatementDefinition def = resumed.getDefinition(); ref = resumed.getSourceReference(); - argName = def.getArgumentName(); - if (argName != null) { - allAttrs = def.isArgumentYinElement(); + final Optional optArgDef = def.getArgumentDefinition(); + if (optArgDef.isPresent()) { + final ArgumentDefinition argDef = optArgDef.get(); + argName = argDef.getArgumentName(); + allAttrs = argDef.isYinElement(); allElements = !allAttrs; } else { + argName = null; allAttrs = false; allElements = false; } @@ -162,15 +166,18 @@ public final class YinStatementStreamSource implements StatementStreamSource { } final String argValue; - argName = def.getArgumentName(); - if (argName != null) { - allAttrs = def.isArgumentYinElement(); + final Optional optArgDef = def.getArgumentDefinition(); + if (optArgDef.isPresent()) { + final ArgumentDefinition argDef = optArgDef.get(); + argName = argDef.getArgumentName(); + allAttrs = argDef.isYinElement(); allElements = !allAttrs; argValue = getArgValue(element, argName, allAttrs); SourceException.throwIfNull(argValue, ref, "Statement {} is missing mandatory argument %s", def.getStatementName(), argName); } else { + argName = null; argValue = null; allAttrs = false; allElements = false; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ArgumentUtils.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ArgumentUtils.java index 6fa67c99b4..73ab63ee97 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ArgumentUtils.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ArgumentUtils.java @@ -26,6 +26,7 @@ import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.YangVersion; import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.model.api.stmt.UnresolvedNumber; import org.opendaylight.yangtools.yang.model.util.RevisionAwareXPathImpl; @@ -96,9 +97,10 @@ public final class ArgumentUtils { } else if ("false".equals(input)) { return Boolean.FALSE; } else { + final StatementDefinition def = ctx.getPublicDefinition(); throw new SourceException(ctx.getStatementSourceReference(), "Invalid '%s' statement %s '%s', it can be either 'true' or 'false'", - ctx.getPublicDefinition().getStatementName(), ctx.getPublicDefinition().getArgumentName(), input); + def.getStatementName(), def.getArgumentDefinition().get().getArgumentName(), input); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ModelDefinedStatementDefinition.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ModelDefinedStatementDefinition.java index 95fac92872..3e90f7403f 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ModelDefinedStatementDefinition.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ModelDefinedStatementDefinition.java @@ -7,14 +7,12 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension; -import static java.util.Objects.requireNonNull; - import org.eclipse.jdt.annotation.NonNullByDefault; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.AbstractStatementDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement; @@ -23,26 +21,14 @@ import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement; * to be declared in a model. */ @NonNullByDefault -final class ModelDefinedStatementDefinition implements StatementDefinition { - private final QName statementName; - private final @Nullable QName argumentName; - private final boolean yinElement; +final class ModelDefinedStatementDefinition extends AbstractStatementDefinition { + ModelDefinedStatementDefinition(final QName statementName) { + super(statementName); + } ModelDefinedStatementDefinition(final QName statementName, final @Nullable QName argumentName, final boolean yinElement) { - this.statementName = requireNonNull(statementName); - this.argumentName = argumentName; - this.yinElement = yinElement; - } - - @Override - public QName getStatementName() { - return statementName; - } - - @Override - public @Nullable QName getArgumentName() { - return argumentName; + super(statementName, yinElement, argumentName); } @Override @@ -54,9 +40,4 @@ final class ModelDefinedStatementDefinition implements StatementDefinition { public Class> getEffectiveRepresentationClass() { return UnrecognizedEffectiveStatement.class; } - - @Override - public boolean isArgumentYinElement() { - return yinElement; - } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedStatementSupport.java index 74e7b3198a..ad17d614d3 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedStatementSupport.java @@ -9,6 +9,7 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.extension; import java.util.Optional; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; import org.opendaylight.yangtools.yang.model.api.stmt.UnrecognizedStatement; @@ -49,10 +50,16 @@ final class UnrecognizedStatementSupport extends AbstractStatementSupport> getUnknownStatementDefinitionOf( final StatementDefinition yangStmtDef) { final QName baseQName = getStatementName(); - final QName argumentName = yangStmtDef.getArgumentName(); - return Optional.of(new ModelDefinedStatementSupport(new ModelDefinedStatementDefinition( - QName.create(baseQName, yangStmtDef.getStatementName().getLocalName()), - argumentName != null ? QName.create(baseQName, argumentName.getLocalName()) : null, - yangStmtDef.isArgumentYinElement()))); + final QName statementName = QName.create(baseQName, yangStmtDef.getStatementName().getLocalName()); + + final ModelDefinedStatementDefinition def; + final Optional optArgDef = yangStmtDef.getArgumentDefinition(); + if (optArgDef.isPresent()) { + final ArgumentDefinition argDef = optArgDef.get(); + def = new ModelDefinedStatementDefinition(statementName, argDef.getArgumentName(), argDef.isYinElement()); + } else { + def = new ModelDefinedStatementDefinition(statementName); + } + return Optional.of(new ModelDefinedStatementSupport(def)); } } \ No newline at end of file diff --git a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionsMapping.java b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionsMapping.java index 93e7d487d2..829ae3ed85 100644 --- a/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionsMapping.java +++ b/yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionsMapping.java @@ -10,8 +10,10 @@ package org.opendaylight.yangtools.yang.thirdparty.plugin; import static java.util.Objects.requireNonNull; import com.google.common.annotations.Beta; +import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -63,8 +65,8 @@ public enum ThirdPartyExtensionsMapping implements StatementDefinition { } @Override - public QName getArgumentName() { - return argument; + public @NonNull Optional getArgumentDefinition() { + return ArgumentDefinition.ofNullable(argument, yinElement); } @Override @@ -76,9 +78,4 @@ public enum ThirdPartyExtensionsMapping implements StatementDefinition { public Class> getEffectiveRepresentationClass() { return effectiveType; } - - @Override - public boolean isArgumentYinElement() { - return yinElement; - } } diff --git a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java index e0a60739bd..22e20df65c 100644 --- a/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java +++ b/yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java @@ -14,6 +14,7 @@ import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.common.QNameModule; +import org.opendaylight.yangtools.yang.model.api.meta.ArgumentDefinition; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @@ -213,8 +214,8 @@ public interface StatementSupport, E extends E } @Override - default QName getArgumentName() { - return getPublicView().getArgumentName(); + default @NonNull Optional getArgumentDefinition() { + return getPublicView().getArgumentDefinition(); } @Override @@ -226,9 +227,4 @@ public interface StatementSupport, E extends E default Class> getEffectiveRepresentationClass() { return getPublicView().getEffectiveRepresentationClass(); } - - @Override - default boolean isArgumentYinElement() { - return getPublicView().isArgumentYinElement(); - } } -- 2.36.6