Clean up StatementDefinition argument definition interface 43/81043/8
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 20 Mar 2019 15:08:28 +0000 (16:08 +0100)
committerRobert Varga <nite@hq.sk>
Fri, 22 Mar 2019 19:02:32 +0000 (19:02 +0000)
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 <robert.varga@pantheon.tech>
21 files changed:
yang/odlext-model-api/src/main/java/org/opendaylight/yangtools/odlext/model/api/OpenDaylightExtensionsStatements.java
yang/openconfig-model-api/src/main/java/org/opendaylight/yangtools/openconfig/model/api/OpenConfigStatements.java
yang/rfc6536-model-api/src/main/java/org/opendaylight/yangtools/rfc6536/model/api/NACMStatements.java
yang/rfc7952-model-api/src/main/java/org/opendaylight/yangtools/rfc7952/model/api/MetadataStatements.java
yang/rfc8040-model-api/src/main/java/org/opendaylight/yangtools/rfc8040/model/api/YangDataStatements.java
yang/rfc8528-model-api/src/main/java/org/opendaylight/yangtools/rfc8528/model/api/SchemaMountStatements.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/YangStmtMapping.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/AbstractStatementDefinition.java [new file with mode: 0644]
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/ArgumentDefinition.java [new file with mode: 0644]
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DefaultStatementDefinition.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/StatementDefinition.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/repo/api/YinDomSchemaSource.java
yang/yang-model-export/src/main/java/org/opendaylight/yangtools/yang/model/export/YinXMLEventReader.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/SourceSpecificContext.java
yang/yang-parser-reactor/src/main/java/org/opendaylight/yangtools/yang/parser/stmt/reactor/StatementDefinitionContext.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/repo/YinStatementStreamSource.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/ArgumentUtils.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/ModelDefinedStatementDefinition.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/extension/UnrecognizedStatementSupport.java
yang/yang-parser-rfc7950/src/test/java/org/opendaylight/yangtools/yang/thirdparty/plugin/ThirdPartyExtensionsMapping.java
yang/yang-parser-spi/src/main/java/org/opendaylight/yangtools/yang/parser/spi/meta/StatementSupport.java

index 82b7b71c3d88c330dfe97adfba379af29e709271..7ec3fe709dc1dc6ed03993b3eecc97cab044e9ac 100644 (file)
@@ -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<? extends EffectiveStatement<?, ?>> effectiveRepresentation;
     private final Class<? extends DeclaredStatement<?>> declaredRepresentation;
     private final QName statementName;
-    private final QName argumentName;
+    private final ArgumentDefinition argumentDef;
 
     OpenDaylightExtensionsStatements(final QName statementName, final String argumentName,
             final Class<? extends DeclaredStatement<?>> declaredRepresentation,
             final Class<? extends EffectiveStatement<?, ?>> 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<ArgumentDefinition> getArgumentDefinition() {
+        return Optional.of(argumentDef);
     }
 
     @Override
@@ -62,9 +63,4 @@ public enum OpenDaylightExtensionsStatements implements StatementDefinition {
     public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
         return effectiveRepresentation;
     }
-
-    @Override
-    public boolean isArgumentYinElement() {
-        return false;
-    }
 }
index 940928906aa3a94d1809f1579f7333e7d285cb20..9fcc47c3427253c050f2a3adb412f32acba611d8 100644 (file)
@@ -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<ArgumentDefinition> getArgumentDefinition() {
+        return ArgumentDefinition.ofNullable(argumentName, false);
     }
 
     @Override
@@ -62,9 +64,4 @@ public enum OpenConfigStatements implements StatementDefinition {
     public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
         return effectiveRepresentation;
     }
-
-    @Override
-    public boolean isArgumentYinElement() {
-        return false;
-    }
 }
index bf896c389b0e022ab66bce19f9314c516829c798..6f34f33605653bb5ec0d95d64b24060aa1a0fc81 100644 (file)
@@ -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<ArgumentDefinition> getArgumentDefinition() {
+        return Optional.empty();
     }
 
     @Override
index 06ec8691bdb7dc1dfda6eb5e021c05a51d8513d9..4266579877fcb4cb9a564097df5bbe641c745021 100644 (file)
@@ -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<? extends EffectiveStatement<?, ?>> effectiveRepresentation;
     private final Class<? extends DeclaredStatement<?>> declaredRepresentation;
     private final QName statementName;
-    private final QName argumentName;
+    private final ArgumentDefinition argumentDef;
 
     MetadataStatements(final QName statementName, final String argumentName,
             final Class<? extends DeclaredStatement<?>> declaredRepresentation,
                     final Class<? extends EffectiveStatement<?, ?>> 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<ArgumentDefinition> getArgumentDefinition() {
+        return Optional.of(argumentDef);
     }
 
     @Override
index 48b85393937502bed0dcdb3f021cc1e9dbc171e4..a7ac3c917aa8d0e714dece96c99c0a47a6e47c7d 100644 (file)
@@ -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<? extends EffectiveStatement<?, ?>> effectiveRepresentation;
     private final Class<? extends DeclaredStatement<?>> declaredRepresentation;
     private final QName statementName;
-    private final QName argumentName;
+    private final ArgumentDefinition argumentDef;
 
     YangDataStatements(final QName statementName, final String argumentName,
             final Class<? extends DeclaredStatement<?>> declaredRepresentation,
                     final Class<? extends EffectiveStatement<?, ?>> 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<ArgumentDefinition> getArgumentDefinition() {
+        return Optional.of(argumentDef);
     }
 
     @Override
index 1ba110ed30f1d3785df97a3086ff262202c26a38..9b3723dd385b8fbad05594352b73f4c1ad7ebe8b 100644 (file)
@@ -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<? extends EffectiveStatement<?, ?>> effectiveRepresentation;
     private final Class<? extends DeclaredStatement<?>> declaredRepresentation;
     private final QName statementName;
-    private final QName argumentName;
+    private final ArgumentDefinition argumentDef;
 
     SchemaMountStatements(final QName statementName, final String argumentName,
             final Class<? extends DeclaredStatement<?>> declaredRepresentation,
                     final Class<? extends EffectiveStatement<?, ?>> 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<ArgumentDefinition> getArgumentDefinition() {
+        return Optional.of(argumentDef);
     }
 
     @Override
index d53dde83a250223a44624be3bebee2d5101fc166..0aafcc7e4d21cab71bc86e2f73baba7b1fe2e191 100644 (file)
@@ -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<ArgumentDefinition> getArgumentDefinition() {
+        return ArgumentDefinition.ofNullable(argument, yinElement);
     }
 
     @Override
@@ -286,9 +288,4 @@ public enum YangStmtMapping implements StatementDefinition {
     public Class<? extends EffectiveStatement<?, ?>> 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 (file)
index 0000000..150bff2
--- /dev/null
@@ -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<ArgumentDefinition> 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 (file)
index 0000000..194426c
--- /dev/null
@@ -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<ArgumentDefinition> 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();
+    }
+}
index 979e8cbbd19ab51d68d743ab66b50355d29d27ac..331006069a7053170b1bfbb164b97db03b669262 100644 (file)
@@ -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<A, D extends DeclaredStatement<A>, E extends EffectiveStatement<A, D>>
-        implements StatementDefinition {
+        extends AbstractStatementDefinition {
     private final Class<E> effectiveRepresentation;
     private final Class<D> declaredRepresentation;
-    private final QName statementName;
-    private final @Nullable QName argumentName;
-    private final boolean argumentYinElement;
 
     DefaultStatementDefinition(final QName statementName, final Class<D> declaredRepresentation,
             final Class<E> 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<A, D extends DeclaredStatement<A>,
                 argumentYinElement, requireNonNull(argumentName));
     }
 
-    @Override
-    public QName getStatementName() {
-        return statementName;
-    }
-
-    @Override
-    public @Nullable QName getArgumentName() {
-        return argumentName;
-    }
-
     @Override
     public Class<? extends DeclaredStatement<?>> getDeclaredRepresentationClass() {
         return declaredRepresentation;
@@ -94,19 +78,9 @@ public final class DefaultStatementDefinition<A, D extends DeclaredStatement<A>,
     }
 
     @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();
     }
 }
index f27a05ea68fc8f70278598e89c4bf672bb152a78..df3247e7b63d6576149e9686c49d03ac52edf337 100644 (file)
@@ -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<StatementArgumentDefinition>, which will include the boolean value
-    //               of isArgumentYinElement()
-    @Nullable QName getArgumentName();
+    @NonNull Optional<ArgumentDefinition> 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<? extends EffectiveStatement<?, ?>> 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();
 }
index 2d037474fab06ed626b3f59085dbab11770256e6..d32ccd06899dd69eedfc49eade2cc157ce5adc50 100644 (file)
@@ -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(),
index 92d05d0bc86024497a41b6c68f22bf95ea84ec8a..75ecf97bb886d3ffbd4d5f9b6cc55798ee1c18cd 100644 (file)
@@ -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<ArgumentDefinition> 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 {
index 5bad5a187b577bde20f9693a122b3b4f37273eac..f11a094ed7dea2af79d7e99c80d2bab6367c71a7 100644 (file)
@@ -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);
index 43fdeb696d09d65d3e66661cda8af76439c1cc3f..570da62a649daacf61e22424effe170ee491c4f9 100644 (file)
@@ -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<A, D extends DeclaredStatement<A>, E ext
         return support.getDeclaredRepresentationClass();
     }
 
-    public boolean hasArgument() {
-        return support.getArgumentName() != null;
-    }
-
-    public boolean isArgumentYinElement() {
-        return support.isArgumentYinElement();
+    public @NonNull Optional<ArgumentDefinition> 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();
index a8b645ba047a776da2f35756c2bd70679b83e146..62f9b38b5d03bc2e2c572c2218ee57bdeab09933 100644 (file)
@@ -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<ArgumentDefinition> 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<ArgumentDefinition> 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;
index 6fa67c99b4edf02c09b8afe29459ab03c5a9abf0..73ab63ee97fd3517c59822a97a5626a6ee9612e1 100644 (file)
@@ -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);
         }
     }
 
index 95fac928721a25b5669bde1acf2c89340b422e69..3e90f7403f062ef560c731e62cd540b1e1c38be9 100644 (file)
@@ -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<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
         return UnrecognizedEffectiveStatement.class;
     }
-
-    @Override
-    public boolean isArgumentYinElement() {
-        return yinElement;
-    }
 }
index 74e7b3198ae93fc0eef0bee523dd85a19719f0eb..ad17d614d3e38720a5933495d146351d44842386 100644 (file)
@@ -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<String
     public Optional<StatementSupport<?, ?, ?>> 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<ArgumentDefinition> 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
index 93e7d487d2c14014c8dffa2c9648c629126bb5cb..829ae3ed854da58821c47ca39afcedcb1c044163 100644 (file)
@@ -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<ArgumentDefinition> getArgumentDefinition() {
+        return ArgumentDefinition.ofNullable(argument, yinElement);
     }
 
     @Override
@@ -76,9 +78,4 @@ public enum ThirdPartyExtensionsMapping implements StatementDefinition {
     public Class<? extends EffectiveStatement<?, ?>> getEffectiveRepresentationClass() {
         return effectiveType;
     }
-
-    @Override
-    public boolean isArgumentYinElement() {
-        return yinElement;
-    }
 }
index e0a60739bd20d6183ee8107d48d1f4e3eb374793..22e20df65cf0052dc093f4e90063cfcfe287576c 100644 (file)
@@ -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<A, D extends DeclaredStatement<A>, E extends E
     }
 
     @Override
-    default QName getArgumentName() {
-        return getPublicView().getArgumentName();
+    default @NonNull Optional<ArgumentDefinition> getArgumentDefinition() {
+        return getPublicView().getArgumentDefinition();
     }
 
     @Override
@@ -226,9 +227,4 @@ public interface StatementSupport<A, D extends DeclaredStatement<A>, E extends E
     default Class<? extends EffectiveStatement<?,?>> getEffectiveRepresentationClass() {
         return getPublicView().getEffectiveRepresentationClass();
     }
-
-    @Override
-    default boolean isArgumentYinElement() {
-        return getPublicView().isArgumentYinElement();
-    }
 }