From d511835a5b5a81ea7d5a9606f4f23d0cd5b897d8 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Tue, 4 Feb 2020 20:10:20 +0100 Subject: [PATCH] Refactor rpc/action statements 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 --- .../api/stmt/ActionEffectiveStatement.java | 9 +- .../yang/model/api/stmt/ActionStatement.java | 8 +- .../model/api/stmt/RpcEffectiveStatement.java | 11 ++- .../yang/model/api/stmt/RpcStatement.java | 8 +- .../AbstractEffectiveOperationDefinition.java | 3 +- .../stmt/EffectiveStatementMixins.java | 69 +++++++++++++-- .../action/ActionEffectiveStatementImpl.java | 49 ++++++----- .../stmt/action/ActionStatementSupport.java | 83 +++++++++++++------ ...entImpl.java => EmptyActionStatement.java} | 9 +- .../stmt/action/RegularActionStatement.java | 20 +++++ .../stmt/rpc/AbstractRpcStatementSupport.java | 56 +++++++++---- ...tementImpl.java => EmptyRpcStatement.java} | 9 +- .../rfc7950/stmt/rpc/RegularRpcStatement.java | 20 +++++ .../stmt/rpc/RpcEffectiveStatementImpl.java | 34 ++++++-- 14 files changed, 291 insertions(+), 97 deletions(-) rename yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/{ActionStatementImpl.java => EmptyActionStatement.java} (58%) create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/RegularActionStatement.java rename yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/{RpcStatementImpl.java => EmptyRpcStatement.java} (59%) create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RegularRpcStatement.java diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionEffectiveStatement.java index 4dbbbe2edc..95b04213f9 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionEffectiveStatement.java @@ -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, - DataTreeAwareEffectiveStatement { - + DataTreeAwareEffectiveStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.ACTION; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionStatement.java index e24563b6b9..7814e74df1 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/ActionStatement.java @@ -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; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcEffectiveStatement.java index 87c4b0e133..a45bc5cd05 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcEffectiveStatement.java @@ -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, - DataTreeAwareEffectiveStatement { - +public interface RpcEffectiveStatement + extends SchemaTreeEffectiveStatement, DataTreeAwareEffectiveStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.RPC; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcStatement.java index 20d928e151..3fe02b20ad 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/RpcStatement.java @@ -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; + } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationDefinition.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationDefinition.java index b3d864f471..2baf3aeaf7 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationDefinition.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationDefinition.java @@ -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> extends AbstractEffectiveSchemaNode implements OperationDefinition { private final ImmutableSet> typeDefinitions; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java index 3ca01d62ca..20f5e773a3 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/EffectiveStatementMixins.java @@ -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> extends DataNodeContainer, Mixin { @Override default Set> 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 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 Class representing declared version of this statement. + */ + public interface OperationDefinitionMixin> + extends SchemaNodeMixin, OperationDefinition { + @Override + default @NonNull QName argument() { + return getPath().getLastComponent(); + } + + @Override + default QName getQName() { + return argument(); + } + + @Override + default Set> getTypeDefinitions() { + return filterTypeDefinitions(this); + } + + @Override + default Set 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> 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> 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()); + } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionEffectiveStatementImpl.java index d2cb5cbf4e..22f0cb8930 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionEffectiveStatementImpl.java @@ -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 - implements ActionDefinition, ActionEffectiveStatement { - private final boolean augmenting; - private final boolean addedByUses; - - ActionEffectiveStatementImpl(final StmtContext ctx) { - super(ctx); +final class ActionEffectiveStatementImpl extends WithSubstatements + implements ActionDefinition, ActionEffectiveStatement, OperationDefinitionMixin, + CopyableMixin { + 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 ctx, + final ImmutableList> 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; } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementSupport.java index 1ec1fab284..7a25df9de1 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementSupport.java @@ -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 { +public final class ActionStatementSupport extends BaseQNameStatementSupport { private static final ImmutableSet 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 ctx) { - return new ActionStatementImpl(ctx); - } - - @Override - public ActionEffectiveStatement createEffective( - final StmtContext 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 stmt) { super.onFullDefinitionDeclared(stmt); @@ -104,4 +86,51 @@ public final class ActionStatementSupport protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; } + + @Override + protected ActionStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new RegularActionStatement(ctx.coerceStatementArgument(), substatements); + } + + @Override + protected ActionStatement createEmptyDeclared(final StmtContext ctx) { + return new EmptyActionStatement(ctx.coerceStatementArgument()); + } + + @Override + protected ActionEffectiveStatement createEffective( + final StmtContext ctx, final ActionStatement declared, + final ImmutableList> 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 ctx, final ActionStatement declared) { + throw new IllegalStateException("Missing implicit input/output statements at " + + ctx.getStatementSourceReference()); + } + + private static int computeFlags(final StmtContext ctx, + final ImmutableList> substatements) { + return new FlagsBuilder() + .setHistory(ctx.getCopyHistory()) + .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT)) + .toFlags(); + } + } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/EmptyActionStatement.java similarity index 58% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/EmptyActionStatement.java index f0d3155aba..14d0c85cf4 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/ActionStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/EmptyActionStatement.java @@ -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 implements ActionStatement { - ActionStatementImpl(final StmtContext 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 index 0000000000..9115a686a8 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/action/RegularActionStatement.java @@ -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> substatements) { + super(argument, substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/AbstractRpcStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/AbstractRpcStatementSupport.java index fbcd14d265..a126cb97f0 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/AbstractRpcStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/AbstractRpcStatementSupport.java @@ -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 { +abstract class AbstractRpcStatementSupport extends BaseQNameStatementSupport { 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 ctx) { - return new RpcStatementImpl(ctx); - } - - @Override - public final RpcEffectiveStatement createEffective( - final StmtContext ctx) { - return new RpcEffectiveStatementImpl(ctx); - } - @Override public final void onFullDefinitionDeclared(final Mutable 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 ctx, + final ImmutableList> substatements) { + return new RegularRpcStatement(ctx.coerceStatementArgument(), substatements); + } + + @Override + protected final RpcStatement createEmptyDeclared(final StmtContext ctx) { + return new EmptyRpcStatement(ctx.coerceStatementArgument()); + } + + @Override + protected final RpcEffectiveStatement createEffective( + final StmtContext ctx, final RpcStatement declared, + final ImmutableList> substatements) { + return new RpcEffectiveStatementImpl(declared, ctx.getSchemaPath().get(), computeFlags(ctx, substatements), ctx, + substatements); + } + + @Override + protected final RpcEffectiveStatement createEmptyEffective( + final StmtContext 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> substatements) { + return new FlagsBuilder() + .setStatus(findFirstArgument(substatements, StatusEffectiveStatement.class, Status.CURRENT)) + .toFlags(); + } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/EmptyRpcStatement.java similarity index 59% rename from yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcStatementImpl.java rename to yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/EmptyRpcStatement.java index 139ff27011..1e33b8095b 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/EmptyRpcStatement.java @@ -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 implements RpcStatement { - RpcStatementImpl(final StmtContext 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 index 0000000000..619de113d7 --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RegularRpcStatement.java @@ -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> substatements) { + super(argument, substatements); + } +} diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcEffectiveStatementImpl.java index 46dafe8713..efbbc8a3a5 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/rpc/RpcEffectiveStatementImpl.java @@ -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 - implements RpcDefinition, RpcEffectiveStatement { - RpcEffectiveStatementImpl(final StmtContext ctx) { - super(ctx); +final class RpcEffectiveStatementImpl extends WithSubstatements + implements RpcDefinition, RpcEffectiveStatement, OperationDefinitionMixin { + private final @NonNull SchemaPath path; + private final int flags; + + RpcEffectiveStatementImpl(final RpcStatement declared, final SchemaPath path, final int flags, + final StmtContext ctx, + final ImmutableList> 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; } } -- 2.36.6