Refactor rpc/action statements 81/87481/1
authorRobert Varga <robert.varga@pantheon.tech>
Tue, 4 Feb 2020 19:10:20 +0000 (20:10 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Thu, 6 Feb 2020 11:23:56 +0000 (12:23 +0100)
Both these are supported by AbstractEffectiveOperationDefinition,
which has less-than-optimal layout. Refactor implementations to
lower their memory footprint.

JIRA: YANGTOOLS-1065
Change-Id: I60c3bced543e9dd5eaf71e710d01295310b5983e
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
14 files changed:
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcEffectiveStatement.java
yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationDefinition.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/EmptyActionStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementImpl.java with 58% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/RegularActionStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/AbstractRpcStatementSupport.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/EmptyRpcStatement.java [moved from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcStatementImpl.java with 59% similarity]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RegularRpcStatement.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcEffectiveStatementImpl.java

index 4dbbbe2edcb35e62b1fe1efaf5b74a1829f24ab0..95b04213f977dcd1b822e9aa6f113822b29e7d43 100644 (file)
@@ -9,9 +9,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
 public interface ActionEffectiveStatement extends SchemaTreeEffectiveStatement<ActionStatement>,
-    DataTreeAwareEffectiveStatement<QName, ActionStatement> {
-
+        DataTreeAwareEffectiveStatement<QName, ActionStatement> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.ACTION;
+    }
 }
index e24563b6b9c28187e146202ae647a153994bd39d..7814e74df16febe06ab12bbd38fd29b92b0a1524 100644 (file)
@@ -5,10 +5,11 @@
  * 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.stmt;
 
 import com.google.common.annotations.Beta;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 /**
  * Represents YANG action statement.
@@ -21,5 +22,8 @@ import com.google.common.annotations.Beta;
  */
 @Beta
 public interface ActionStatement extends OperationDeclaredStatement {
-
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.ACTION;
+    }
 }
index 87c4b0e133d12261b713022ba1c5364bf0dc13e3..a45bc5cd05a9761847232d60d2f96721899717e1 100644 (file)
@@ -9,9 +9,14 @@ package org.opendaylight.yangtools.yang.model.api.stmt;
 
 import com.google.common.annotations.Beta;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
 @Beta
-public interface RpcEffectiveStatement extends SchemaTreeEffectiveStatement<RpcStatement>,
-    DataTreeAwareEffectiveStatement<QName, RpcStatement> {
-
+public interface RpcEffectiveStatement
+        extends SchemaTreeEffectiveStatement<RpcStatement>, DataTreeAwareEffectiveStatement<QName, RpcStatement> {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.RPC;
+    }
 }
index 20d928e151566adeec9a733d8ff1757bac9b7313..3fe02b20ad10a61bf48e4c195c388dae2ddbdad3 100644 (file)
@@ -7,6 +7,12 @@
  */
 package org.opendaylight.yangtools.yang.model.api.stmt;
 
-public interface RpcStatement extends OperationDeclaredStatement {
+import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition;
 
+public interface RpcStatement extends OperationDeclaredStatement {
+    @Override
+    default StatementDefinition statementDefinition() {
+        return YangStmtMapping.RPC;
+    }
 }
index b3d864f471f9f114d648b50d4252c8c85351a3be..2baf3aeaf7310f6d6e9df701007589b79d2653f6 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
 
-import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Verify;
 import com.google.common.collect.ImmutableSet;
@@ -27,7 +26,7 @@ import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-@Beta
+@Deprecated(forRemoval = true)
 public abstract class AbstractEffectiveOperationDefinition<D extends DeclaredStatement<QName>>
         extends AbstractEffectiveSchemaNode<D> implements OperationDefinition {
     private final ImmutableSet<TypeDefinition<?>> typeDefinitions;
index 3ca01d62ca7f9efeb3ff1d4d8866ab0735a73988..20f5e773a38b17c096ee0663fcfb48956861c29e 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt;
 
+import static com.google.common.base.Verify.verify;
+
 import com.google.common.annotations.Beta;
 import com.google.common.base.MoreObjects;
 import com.google.common.collect.Collections2;
@@ -37,6 +39,7 @@ import org.opendaylight.yangtools.yang.model.api.MustConstraintAware;
 import org.opendaylight.yangtools.yang.model.api.MustDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationDefinition;
 import org.opendaylight.yangtools.yang.model.api.NotificationNodeContainer;
+import org.opendaylight.yangtools.yang.model.api.OperationDefinition;
 import org.opendaylight.yangtools.yang.model.api.RevisionAwareXPath;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 import org.opendaylight.yangtools.yang.model.api.Status;
@@ -47,6 +50,8 @@ import org.opendaylight.yangtools.yang.model.api.WhenConditionAware;
 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.stmt.DescriptionEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.InputEffectiveStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.OutputEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.TypedefEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.WhenEffectiveStatement;
@@ -169,10 +174,7 @@ public final class EffectiveStatementMixins {
     public interface DataNodeContainerMixin<A, D extends DeclaredStatement<A>> extends DataNodeContainer, Mixin<A, D> {
         @Override
         default Set<TypeDefinition<?>> getTypeDefinitions() {
-            // TODO: the cast here is needed to work around Java 11 javac type inference issue
-            return (Set) effectiveSubstatements().stream().filter(TypedefEffectiveStatement.class::isInstance)
-                    .map(stmt -> ((TypedefEffectiveStatement) stmt).getTypeDefinition())
-                    .collect(ImmutableSet.toImmutableSet());
+            return filterTypeDefinitions(this);
         }
 
         @Override
@@ -375,7 +377,7 @@ public final class EffectiveStatementMixins {
     }
 
     /**
-     * Helper bridge for {@code anydata} and {@code anyxml} opaque data..
+     * Helper bridge for {@code anydata} and {@code anyxml} opaque data.
      *
      * @param <D> Class representing declared version of this statement.
      */
@@ -393,6 +395,44 @@ public final class EffectiveStatementMixins {
         }
     }
 
+    /**
+     * Helper bridge for {@code rpc} and {@code action} operations.
+     *
+     * @param <D> Class representing declared version of this statement.
+     */
+    public interface OperationDefinitionMixin<D extends DeclaredStatement<QName>>
+            extends SchemaNodeMixin<QName, D>, OperationDefinition {
+        @Override
+        default @NonNull QName argument() {
+            return getPath().getLastComponent();
+        }
+
+        @Override
+        default QName getQName() {
+            return argument();
+        }
+
+        @Override
+        default Set<TypeDefinition<?>> getTypeDefinitions() {
+            return filterTypeDefinitions(this);
+        }
+
+        @Override
+        default Set<GroupingDefinition> getGroupings() {
+            return filterEffectiveStatementsSet(GroupingDefinition.class);
+        }
+
+        @Override
+        default ContainerSchemaNode getInput() {
+            return findAsContainer(this, InputEffectiveStatement.class);
+        }
+
+        @Override
+        default ContainerSchemaNode getOutput() {
+            return findAsContainer(this, OutputEffectiveStatement.class);
+        }
+    }
+
     /**
      * Support interface for various mixins. Implementations are required to store 32bits worth of flags, which are
      * globally assigned to sub-interfaces -- thus providing storage for many low-cardinality properties.
@@ -507,4 +547,23 @@ public final class EffectiveStatementMixins {
             }
         }
     }
+
+    private EffectiveStatementMixins() {
+    }
+
+    static ContainerSchemaNode findAsContainer(final EffectiveStatement<?, ?> stmt,
+            final Class<? extends EffectiveStatement<QName, ?>> type) {
+        final EffectiveStatement<?, ?> statement = stmt.findFirstEffectiveSubstatement(type).get();
+        verify(statement instanceof ContainerSchemaNode, "Child statement %s is not a ContainerSchemaNode",
+            statement);
+        return (ContainerSchemaNode) statement;
+    }
+
+    static Set<TypeDefinition<?>> filterTypeDefinitions(final Mixin<?, ?> stmt) {
+        // TODO: the cast here is needed to work around Java 11 javac type inference issue
+        return (Set) stmt.effectiveSubstatements().stream()
+                .filter(TypedefEffectiveStatement.class::isInstance)
+                .map(typedef -> ((TypedefEffectiveStatement) typedef).getTypeDefinition())
+                .collect(ImmutableSet.toImmutableSet());
+    }
 }
index d2cb5cbf4e84c80cfe9ace99056fe78fbe9fa969..22f0cb8930b648c5fd6e96351995558ed0f5406e 100644 (file)
@@ -7,43 +7,42 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action;
 
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.ActionDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveOperationDefinition;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyHistory;
-import org.opendaylight.yangtools.yang.parser.spi.meta.CopyType;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.CopyableMixin;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.OperationDefinitionMixin;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class ActionEffectiveStatementImpl extends AbstractEffectiveOperationDefinition<ActionStatement>
-        implements ActionDefinition, ActionEffectiveStatement {
-    private final boolean augmenting;
-    private final boolean addedByUses;
-
-    ActionEffectiveStatementImpl(final StmtContext<QName, ActionStatement, ActionEffectiveStatement> ctx) {
-        super(ctx);
+final class ActionEffectiveStatementImpl extends WithSubstatements<QName, ActionStatement, ActionEffectiveStatement>
+        implements ActionDefinition, ActionEffectiveStatement, OperationDefinitionMixin<ActionStatement>,
+                   CopyableMixin<QName, ActionStatement> {
+    private final @NonNull SchemaPath path;
+    private final int flags;
 
-        // initCopyType
-        final CopyHistory copyTypesFromOriginal = ctx.getCopyHistory();
-        if (copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES_AUGMENTATION)) {
-            this.augmenting = true;
-            this.addedByUses = true;
-        } else {
-            this.augmenting = copyTypesFromOriginal.contains(CopyType.ADDED_BY_AUGMENTATION);
-            this.addedByUses = copyTypesFromOriginal.contains(CopyType.ADDED_BY_USES);
-        }
+    ActionEffectiveStatementImpl(final ActionStatement declared, final SchemaPath path, final int flags,
+            final StmtContext<QName, ActionStatement, ActionEffectiveStatement> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, ctx, substatements);
+        this.path = requireNonNull(path);
+        this.flags = flags;
     }
 
-    @Deprecated
     @Override
-    public boolean isAugmenting() {
-        return augmenting;
+    public @NonNull SchemaPath getPath() {
+        return path;
     }
 
-    @Deprecated
     @Override
-    public boolean isAddedByUses() {
-        return addedByUses;
+    public int flags() {
+        return flags;
     }
 }
index 1ec1fab2842d9c0c62265c2a946d2629c538ee81..7a25df9de139aa4fc80b321a0958426efeacd89c 100644 (file)
@@ -7,27 +7,33 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action;
 
+import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+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.ActionEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.InputStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.input.InputStatementRFC7950Support;
 import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.output.OutputStatementRFC7950Support;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.spi.source.SourceException;
+import org.opendaylight.yangtools.yang.parser.spi.source.StatementSourceReference;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
 
-public final class ActionStatementSupport
-        extends AbstractQNameStatementSupport<ActionStatement, ActionEffectiveStatement> {
+public final class ActionStatementSupport extends BaseQNameStatementSupport<ActionStatement, ActionEffectiveStatement> {
     private static final ImmutableSet<StatementDefinition> ILLEGAL_PARENTS = ImmutableSet.of(
             YangStmtMapping.NOTIFICATION, YangStmtMapping.RPC, YangStmtMapping.ACTION);
 
@@ -62,30 +68,6 @@ public final class ActionStatementSupport
         stmt.coerceParentContext().addToNs(ChildSchemaNodeNamespace.class, stmt.coerceStatementArgument(), stmt);
     }
 
-    @Override
-    public ActionStatement createDeclared(
-            final StmtContext<QName, ActionStatement, ?> ctx) {
-        return new ActionStatementImpl(ctx);
-    }
-
-    @Override
-    public ActionEffectiveStatement createEffective(
-            final StmtContext<QName, ActionStatement, ActionEffectiveStatement> ctx) {
-        SourceException.throwIf(StmtContextUtils.hasAncestorOfType(ctx, ILLEGAL_PARENTS),
-                ctx.getStatementSourceReference(),
-                "Action %s is defined within a notification, rpc or another action", ctx.getStatementArgument());
-        SourceException.throwIf(!StmtContextUtils.hasAncestorOfTypeWithChildOfType(ctx, YangStmtMapping.LIST,
-                YangStmtMapping.KEY), ctx.getStatementSourceReference(),
-                "Action %s is defined within a list that has no key statement", ctx.getStatementArgument());
-        SourceException.throwIf(StmtContextUtils.hasParentOfType(ctx, YangStmtMapping.CASE),
-                ctx.getStatementSourceReference(), "Action %s is defined within a case statement",
-                ctx.getStatementArgument());
-        SourceException.throwIf(StmtContextUtils.hasParentOfType(ctx, YangStmtMapping.MODULE),
-                ctx.getStatementSourceReference(), "Action %s is defined at the top level of a module",
-                ctx.getStatementArgument());
-        return new ActionEffectiveStatementImpl(ctx);
-    }
-
     @Override
     public void onFullDefinitionDeclared(final Mutable<QName, ActionStatement, ActionEffectiveStatement> stmt) {
         super.onFullDefinitionDeclared(stmt);
@@ -104,4 +86,51 @@ public final class ActionStatementSupport
     protected SubstatementValidator getSubstatementValidator() {
         return SUBSTATEMENT_VALIDATOR;
     }
+
+    @Override
+    protected ActionStatement createDeclared(final StmtContext<QName, ActionStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularActionStatement(ctx.coerceStatementArgument(), substatements);
+    }
+
+    @Override
+    protected ActionStatement createEmptyDeclared(final StmtContext<QName, ActionStatement, ?> ctx) {
+        return new EmptyActionStatement(ctx.coerceStatementArgument());
+    }
+
+    @Override
+    protected ActionEffectiveStatement createEffective(
+            final StmtContext<QName, ActionStatement, ActionEffectiveStatement> ctx, final ActionStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        final QName argument = ctx.coerceStatementArgument();
+        final StatementSourceReference ref = ctx.getStatementSourceReference();
+        SourceException.throwIf(StmtContextUtils.hasAncestorOfType(ctx, ILLEGAL_PARENTS), ref,
+            "Action %s is defined within a notification, rpc or another action", argument);
+        SourceException.throwIf(
+            !StmtContextUtils.hasAncestorOfTypeWithChildOfType(ctx, YangStmtMapping.LIST, YangStmtMapping.KEY), ref,
+            "Action %s is defined within a list that has no key statement", argument);
+        SourceException.throwIf(StmtContextUtils.hasParentOfType(ctx, YangStmtMapping.CASE), ref,
+            "Action %s is defined within a case statement", argument);
+        SourceException.throwIf(StmtContextUtils.hasParentOfType(ctx, YangStmtMapping.MODULE), ref,
+            "Action %s is defined at the top level of a module", argument);
+
+        return new ActionEffectiveStatementImpl(declared, ctx.getSchemaPath().get(), computeFlags(ctx, substatements),
+            ctx, substatements);
+    }
+
+    @Override
+    protected ActionEffectiveStatement createEmptyEffective(
+            final StmtContext<QName, ActionStatement, ActionEffectiveStatement> ctx, final ActionStatement declared) {
+        throw new IllegalStateException("Missing implicit input/output statements at "
+            + ctx.getStatementSourceReference());
+    }
+
+    private static int computeFlags(final StmtContext<?, ?, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new FlagsBuilder()
+                .setHistory(ctx.getCopyHistory())
+                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+                .toFlags();
+    }
+
 }
@@ -9,11 +9,10 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument;
 
-final class ActionStatementImpl extends AbstractDeclaredStatement<QName> implements ActionStatement {
-    ActionStatementImpl(final StmtContext<QName, ActionStatement, ?> context) {
-        super(context);
+final class EmptyActionStatement extends WithQNameArgument implements ActionStatement {
+    EmptyActionStatement(final QName argument) {
+        super(argument);
     }
 }
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/RegularActionStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/RegularActionStatement.java
new file mode 100644 (file)
index 0000000..9115a68
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.action;
+
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.ActionStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements;
+
+final class RegularActionStatement extends WithSubstatements implements ActionStatement {
+    RegularActionStatement(final QName argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(argument, substatements);
+    }
+}
index fbcd14d265d22c3659ea99d52a69f306ce726a0e..a126cb97f01f51aef52c833acfa98afd9af58921 100644 (file)
@@ -7,14 +7,20 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc;
 
+import com.google.common.collect.ImmutableList;
 import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.YangStmtMapping;
+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.stmt.InputStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.OutputStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement;
 import org.opendaylight.yangtools.yang.parser.rfc7950.namespace.ChildSchemaNodeNamespace;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseQNameStatementSupport;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.EffectiveStatementWithFlags.FlagsBuilder;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StatementSupport;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable;
@@ -22,8 +28,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils;
 import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator;
 import org.opendaylight.yangtools.yang.parser.stmt.reactor.StatementContextBase;
 
-abstract class AbstractRpcStatementSupport
-        extends AbstractQNameStatementSupport<RpcStatement, RpcEffectiveStatement> {
+abstract class AbstractRpcStatementSupport extends BaseQNameStatementSupport<RpcStatement, RpcEffectiveStatement> {
     private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(
         YangStmtMapping.RPC)
         .addOptional(YangStmtMapping.DESCRIPTION)
@@ -50,17 +55,6 @@ abstract class AbstractRpcStatementSupport
         stmt.coerceParentContext().addToNs(ChildSchemaNodeNamespace.class, stmt.coerceStatementArgument(), stmt);
     }
 
-    @Override
-    public final RpcStatement createDeclared(final StmtContext<QName, RpcStatement, ?> ctx) {
-        return new RpcStatementImpl(ctx);
-    }
-
-    @Override
-    public final RpcEffectiveStatement createEffective(
-            final StmtContext<QName, RpcStatement, RpcEffectiveStatement> ctx) {
-        return new RpcEffectiveStatementImpl(ctx);
-    }
-
     @Override
     public final void onFullDefinitionDeclared(final Mutable<QName, RpcStatement, RpcEffectiveStatement> stmt) {
         super.onFullDefinitionDeclared(stmt);
@@ -73,13 +67,45 @@ abstract class AbstractRpcStatementSupport
         }
     }
 
-
     @Override
     protected final SubstatementValidator getSubstatementValidator() {
         return SUBSTATEMENT_VALIDATOR;
     }
 
+    @Override
+    protected final RpcStatement createDeclared(final StmtContext<QName, RpcStatement, ?> ctx,
+            final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        return new RegularRpcStatement(ctx.coerceStatementArgument(), substatements);
+    }
+
+    @Override
+    protected final RpcStatement createEmptyDeclared(final StmtContext<QName, RpcStatement, ?> ctx) {
+        return new EmptyRpcStatement(ctx.coerceStatementArgument());
+    }
+
+    @Override
+    protected final RpcEffectiveStatement createEffective(
+            final StmtContext<QName, RpcStatement, RpcEffectiveStatement> ctx, final RpcStatement declared,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new RpcEffectiveStatementImpl(declared, ctx.getSchemaPath().get(), computeFlags(ctx, substatements), ctx,
+            substatements);
+    }
+
+    @Override
+    protected final RpcEffectiveStatement createEmptyEffective(
+            final StmtContext<QName, RpcStatement, RpcEffectiveStatement> ctx, final RpcStatement declared) {
+        throw new IllegalStateException("Missing implicit input/output statements at "
+                + ctx.getStatementSourceReference());
+    }
+
     abstract StatementSupport<?, ?, ?> implictInput();
 
     abstract StatementSupport<?, ?, ?> implictOutput();
+
+    private static int computeFlags(final StmtContext<?, ?, ?> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        return new FlagsBuilder()
+                .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT))
+                .toFlags();
+    }
 }
@@ -9,11 +9,10 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc;
 
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement;
-import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument;
 
-final class RpcStatementImpl extends AbstractDeclaredStatement<QName> implements RpcStatement {
-    RpcStatementImpl(final StmtContext<QName, RpcStatement, ?> context) {
-        super(context);
+final class EmptyRpcStatement extends WithQNameArgument implements RpcStatement {
+    EmptyRpcStatement(final QName argument) {
+        super(argument);
     }
 }
diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RegularRpcStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RegularRpcStatement.java
new file mode 100644 (file)
index 0000000..619de11
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2020 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc;
+
+import com.google.common.collect.ImmutableList;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement;
+import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithQNameArgument.WithSubstatements;
+
+final class RegularRpcStatement extends WithSubstatements implements RpcStatement {
+    RegularRpcStatement(final QName argument, final ImmutableList<? extends DeclaredStatement<?>> substatements) {
+        super(argument, substatements);
+    }
+}
index 46dafe87131851dd586f95b82ef8a17323ac9c53..efbbc8a3a51cd5375feb88fa235f1e2488e322df 100644 (file)
@@ -7,16 +7,40 @@
  */
 package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.rpc;
 
+import static java.util.Objects.requireNonNull;
+
+import com.google.common.collect.ImmutableList;
+import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.RpcDefinition;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcEffectiveStatement;
 import org.opendaylight.yangtools.yang.model.api.stmt.RpcStatement;
-import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveOperationDefinition;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultWithDataTree.WithSubstatements;
+import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.OperationDefinitionMixin;
 import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext;
 
-final class RpcEffectiveStatementImpl extends AbstractEffectiveOperationDefinition<RpcStatement>
-        implements RpcDefinition, RpcEffectiveStatement {
-    RpcEffectiveStatementImpl(final StmtContext<QName, RpcStatement, RpcEffectiveStatement> ctx) {
-        super(ctx);
+final class RpcEffectiveStatementImpl extends WithSubstatements<QName, RpcStatement, RpcEffectiveStatement>
+        implements RpcDefinition, RpcEffectiveStatement, OperationDefinitionMixin<RpcStatement> {
+    private final @NonNull SchemaPath path;
+    private final int flags;
+
+    RpcEffectiveStatementImpl(final RpcStatement declared, final SchemaPath path, final int flags,
+            final StmtContext<QName, RpcStatement, RpcEffectiveStatement> ctx,
+            final ImmutableList<? extends EffectiveStatement<?, ?>> substatements) {
+        super(declared, ctx, substatements);
+        this.path = requireNonNull(path);
+        this.flags = flags;
+    }
+
+    @Override
+    public @NonNull SchemaPath getPath() {
+        return path;
+    }
+
+    @Override
+    public int flags() {
+        return flags;
     }
 }