Add default statementOrigin() implementations 61/98961/2
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 14 Dec 2021 00:21:03 +0000 (01:21 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 14 Dec 2021 00:46:33 +0000 (01:46 +0100)
The design of {Model,Declared,Effective}Statement interfaces harks back
to Java 7 days. Refresh it with Java 8's default interface methods,
properly binding them to DeclaredStatement and
EffectiveStatement.getDeclared() methods.

JIRA: YANGTOOLS-1384
Change-Id: I8823b08eb0484fa48024a594081f536ac4b41542
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/DeclaredStatement.java
model/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/meta/EffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/TypedefEffectiveStatementImpl.java
model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredEffectiveStatement.java
model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractDeclaredStatement.java
model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractUndeclaredEffectiveStatement.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/type/BuiltinEffectiveStatement.java

index 639e52cef6e335cf56db4df79d81e51535718e4e..30bd0b114c5ceab4fbff21b0a736ad94429280bf 100644 (file)
@@ -25,6 +25,18 @@ import org.opendaylight.yangtools.yang.common.Empty;
  * @param <A> Argument type ({@link Empty} if statement does not have argument.)
  */
 public interface DeclaredStatement<A> extends ModelStatement<A> {
+    /**
+     * {@inheritDoc}
+     *
+     * <p>
+     * Implementations are required to return {@link StatementOrigin#DECLARATION}, which is what the default
+     * implementation does. This method should never be explicitly implemented.
+     */
+    @Override
+    default StatementOrigin statementOrigin() {
+        return StatementOrigin.DECLARATION;
+    }
+
     /**
      * Returns statement argument as was present in original source.
      *
index ed4201e4a5f45f6318e4f129ef785ee390f8de64..2ec06488e7675eefb1a721c0d16ab6305d1fd299 100644 (file)
@@ -23,6 +23,19 @@ import org.opendaylight.yangtools.yang.common.Empty;
  * @param <D> Class representing declared version of this statement.
  */
 public interface EffectiveStatement<A, D extends DeclaredStatement<A>> extends ModelStatement<A> {
+    /**
+     * {@inheritDoc}
+     *
+     * <p>
+     * Implementations are required to return a {@link StatementOrigin}, consistent with {@link #getDeclared()}
+     * nullness. This is what the default implementation does and hence this method should never be explicitly
+     * implemented -- unless there is significant cost to the {@link #getDeclared()} implementation.
+     */
+    @Override
+    default StatementOrigin statementOrigin() {
+        return getDeclared() != null ? StatementOrigin.DECLARATION : StatementOrigin.CONTEXT;
+    }
+
     /**
      * Returns statement, which was explicit declaration of this effective
      * statement.
index c193ad8f6423444e368c1e6992fb48bccd69ec28..ff771835ce8c48264e9ba1a0fe84f983ef30ee71 100644 (file)
@@ -19,7 +19,6 @@ import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
 import org.opendaylight.yangtools.yang.model.api.stmt.DefaultEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
@@ -148,11 +147,6 @@ public final class TypedefEffectiveStatementImpl extends WithSubstatements<QName
             return TypedefEffectiveStatementImpl.this.argument();
         }
 
-        @Override
-        public StatementOrigin statementOrigin() {
-            return StatementOrigin.CONTEXT;
-        }
-
         @Override
         public TypeDefinition<?> getTypeDefinition() {
             return TypedefEffectiveStatementImpl.this.getTypeDefinition();
index fd16fa23ed174832e1b0d8046d908ae628a6f0b5..a11f0725d18b4bbac77674c0e2dcb4a6678f1bae 100644 (file)
@@ -23,7 +23,6 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 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;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement;
@@ -45,11 +44,6 @@ import org.opendaylight.yangtools.yang.model.api.stmt.TypedefNamespace;
 @Beta
 public abstract class AbstractDeclaredEffectiveStatement<A, D extends DeclaredStatement<A>>
         extends AbstractEffectiveStatement<A, D> {
-    @Override
-    public final StatementOrigin statementOrigin() {
-        return StatementOrigin.DECLARATION;
-    }
-
     @Override
     public abstract @NonNull D getDeclared();
 
index c6a3ec0e027bd23fc329f3d37060e59538af3f0c..274baf62a39215ee3772f06749c6d6f1c9595d93 100644 (file)
@@ -16,7 +16,6 @@ import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.Empty;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
 
 /**
  * An abstract base class for {@link DeclaredStatement} implementations. It provides various further stateless and
@@ -24,11 +23,6 @@ import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
  */
 @Beta
 public abstract class AbstractDeclaredStatement<A> extends AbstractModelStatement<A> implements DeclaredStatement<A> {
-    @Override
-    public StatementOrigin statementOrigin() {
-        return StatementOrigin.DECLARATION;
-    }
-
     @Override
     public ImmutableList<? extends DeclaredStatement<?>> declaredSubstatements() {
         // Default to reduce load on subclasses and keep the number of implementations down
index b1270ff886b5f5f01ccea445af37d02703c547af..5ba540f0e0285c4c818d1a2f7ea31e6b68d065fa 100644 (file)
@@ -23,7 +23,6 @@ import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
 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;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeAwareEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.DataTreeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeAwareEffectiveStatement;
@@ -32,11 +31,6 @@ import org.opendaylight.yangtools.yang.model.api.stmt.SchemaTreeEffectiveStateme
 @Beta
 public abstract class AbstractUndeclaredEffectiveStatement<A, D extends DeclaredStatement<A>>
         extends AbstractEffectiveStatement<A, D>  {
-    @Override
-    public final StatementOrigin statementOrigin() {
-        return StatementOrigin.CONTEXT;
-    }
-
     @Override
     public final D getDeclared() {
         return null;
index 53947036a0772ab2f6acd885ff6fa078d846da9e..ab2842967331fbd4acdfe1c31c9154fdead230c7 100644 (file)
@@ -18,7 +18,6 @@ import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.meta.IdentifierNamespace;
-import org.opendaylight.yangtools.yang.model.api.meta.StatementOrigin;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypeStatement;
 import org.opendaylight.yangtools.yang.model.ri.type.BaseTypes;
@@ -79,9 +78,4 @@ enum BuiltinEffectiveStatement implements TypeEffectiveStatement<TypeStatement>
     public final QName argument() {
         return getTypeDefinition().getQName();
     }
-
-    @Override
-    public final StatementOrigin statementOrigin() {
-        return StatementOrigin.CONTEXT;
-    }
 }