From c2ebad8bda9f1aee955e6ea4664c381f53d42a71 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 3 Feb 2020 16:56:55 +0100 Subject: [PATCH] Refactor deviation statement implementations This minimizes memory footprint, while reusing most infrastructure we have for simple statements. JIRA: YANGTOOLS-1065 Change-Id: Ibd33acfec39768a6ba5610669b619ccda34f753c Signed-off-by: Robert Varga --- .../api/stmt/DeviationEffectiveStatement.java | 7 ++- .../model/api/stmt/DeviationStatement.java | 7 +++ .../stmt/AbstractDeclaredStatement.java | 15 +++++ .../DeviationEffectiveStatementImpl.java | 60 ++++++------------- .../deviation/DeviationStatementImpl.java | 11 ++-- .../deviation/DeviationStatementSupport.java | 44 ++++++++++---- 6 files changed, 85 insertions(+), 59 deletions(-) diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviationEffectiveStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviationEffectiveStatement.java index 524d90f387..41f33f198b 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviationEffectiveStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviationEffectiveStatement.java @@ -8,9 +8,14 @@ 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.EffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; @Beta public interface DeviationEffectiveStatement extends EffectiveStatement { - + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.DEVIATION; + } } diff --git a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviationStatement.java b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviationStatement.java index adec391fb4..674001c33b 100644 --- a/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviationStatement.java +++ b/yang/yang-model-api/src/main/java/org/opendaylight/yangtools/yang/model/api/stmt/DeviationStatement.java @@ -11,8 +11,15 @@ import static com.google.common.base.Verify.verifyNotNull; import java.util.Collection; import org.eclipse.jdt.annotation.NonNull; +import org.opendaylight.yangtools.yang.model.api.YangStmtMapping; +import org.opendaylight.yangtools.yang.model.api.meta.StatementDefinition; public interface DeviationStatement extends DocumentedDeclaredStatement { + @Override + default StatementDefinition statementDefinition() { + return YangStmtMapping.DEVIATION; + } + default @NonNull SchemaNodeIdentifier getTargetNode() { // FIXME: YANGTOOLS-908: verifyNotNull() should not be needed here return verifyNotNull(argument()); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredStatement.java index 666a561b26..9788d4417c 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractDeclaredStatement.java @@ -126,6 +126,21 @@ public abstract class AbstractDeclaredStatement extends AbstractModelStatemen } public abstract static class WithArgument extends WithRawArgument { + public abstract static class WithSubstatements extends WithArgument { + private final @NonNull Object substatements; + + protected WithSubstatements(final StmtContext context, + final ImmutableList> substatements) { + super(context); + this.substatements = maskList(substatements); + } + + @Override + public final Collection> declaredSubstatements() { + return unmaskList(substatements); + } + } + private final A argument; protected WithArgument(final StmtContext context) { diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationEffectiveStatementImpl.java index 63951ecf41..99486de8c2 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationEffectiveStatementImpl.java @@ -8,61 +8,39 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviation; import com.google.common.collect.ImmutableList; -import java.util.ArrayList; import java.util.List; import java.util.Objects; -import org.eclipse.jdt.annotation.NonNull; -import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.model.api.DeviateDefinition; import org.opendaylight.yangtools.yang.model.api.Deviation; import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; import org.opendaylight.yangtools.yang.model.api.meta.EffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviationEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNodeWithoutStatus; -import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredEffectiveStatement.DefaultArgument.WithSubstatements; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.EffectiveStatementMixins.DocumentedNodeMixin; -final class DeviationEffectiveStatementImpl - extends AbstractEffectiveDocumentedNodeWithoutStatus - implements Deviation, DeviationEffectiveStatement, Immutable { - private final SchemaPath targetPath; - private final @NonNull ImmutableList unknownSchemaNodes; - private final ImmutableList deviateDefinitions; - - DeviationEffectiveStatementImpl(final StmtContext ctx) { - super(ctx); - this.targetPath = ctx.getStatementArgument().asSchemaPath(); - this.deviateDefinitions = ImmutableList.copyOf(allSubstatementsOfType(DeviateDefinition.class)); - - List unknownSchemaNodesInit = new ArrayList<>(); - for (final EffectiveStatement effectiveStatement : effectiveSubstatements()) { - if (effectiveStatement instanceof UnknownSchemaNode) { - unknownSchemaNodesInit.add((UnknownSchemaNode) effectiveStatement); - } - } - unknownSchemaNodes = ImmutableList.copyOf(unknownSchemaNodesInit); +final class DeviationEffectiveStatementImpl extends WithSubstatements + implements DeviationEffectiveStatement, Deviation, + DocumentedNodeMixin { + DeviationEffectiveStatementImpl(final DeviationStatement declared, + final ImmutableList> substatements) { + super(declared, substatements); } @Override public SchemaPath getTargetPath() { - return targetPath; + return argument().asSchemaPath(); } @Override public List getDeviates() { - return deviateDefinitions; - } - - @Override - public List getUnknownSchemaNodes() { - return unknownSchemaNodes; + return filterEffectiveStatementsList(DeviateDefinition.class); } @Override public int hashCode() { - return Objects.hash(targetPath, deviateDefinitions, nullableDescription(), nullableReference()); + return Objects.hash(getTargetPath(), getDeviates(), getDescription().orElse(null), getReference().orElse(null)); } @Override @@ -74,19 +52,19 @@ final class DeviationEffectiveStatementImpl return false; } final DeviationEffectiveStatementImpl other = (DeviationEffectiveStatementImpl) obj; - return Objects.equals(targetPath, other.targetPath) - && Objects.equals(deviateDefinitions, other.deviateDefinitions) - && Objects.equals(nullableDescription(), other.nullableDescription()) - && Objects.equals(nullableReference(), other.nullableReference()); + return Objects.equals(getTargetPath(), other.getTargetPath()) + && Objects.equals(getDeviates(), other.getDeviates()) + && Objects.equals(getDescription(), other.getDescription()) + && Objects.equals(getReference(), other.getReference()); } @Override public String toString() { return DeviationEffectiveStatementImpl.class.getSimpleName() + "[" - + "targetPath=" + targetPath - + ", deviates=" + deviateDefinitions - + ", description=" + nullableDescription() - + ", reference=" + nullableReference() + + "targetPath=" + getTargetPath() + + ", deviates=" + getDeviates() + + ", description=" + getDescription().orElse(null) + + ", reference=" + getReference().orElse(null) + "]"; } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationStatementImpl.java index 7e7f73defa..a819935ced 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationStatementImpl.java @@ -7,14 +7,17 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviation; +import com.google.common.collect.ImmutableList; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractDeclaredStatement; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractDeclaredStatement.WithArgument.WithSubstatements; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -final class DeviationStatementImpl extends AbstractDeclaredStatement +final class DeviationStatementImpl extends WithSubstatements implements DeviationStatement { - DeviationStatementImpl(final StmtContext context) { - super(context); + DeviationStatementImpl(final StmtContext context, + final ImmutableList> substatements) { + super(context, substatements); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationStatementSupport.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationStatementSupport.java index 5d12279048..bd4e994aad 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationStatementSupport.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationStatementSupport.java @@ -7,13 +7,16 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.deviation; +import com.google.common.collect.ImmutableList; import org.opendaylight.yangtools.yang.common.QNameModule; 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.DeviationEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.DeviationStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.ArgumentUtils; -import org.opendaylight.yangtools.yang.parser.spi.meta.AbstractStatementSupport; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.BaseStatementSupport; import org.opendaylight.yangtools.yang.parser.spi.meta.InferenceException; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext.Mutable; @@ -21,7 +24,7 @@ import org.opendaylight.yangtools.yang.parser.spi.meta.SubstatementValidator; import org.opendaylight.yangtools.yang.parser.spi.source.ModuleCtxToModuleQName; public final class DeviationStatementSupport - extends AbstractStatementSupport { + extends BaseStatementSupport { private static final SubstatementValidator SUBSTATEMENT_VALIDATOR = SubstatementValidator.builder(YangStmtMapping .DEVIATION) .addOptional(YangStmtMapping.DESCRIPTION) @@ -43,17 +46,6 @@ public final class DeviationStatementSupport return ArgumentUtils.nodeIdentifierFromPath(ctx, value); } - @Override - public DeviationStatement createDeclared(final StmtContext ctx) { - return new DeviationStatementImpl(ctx); - } - - @Override - public DeviationEffectiveStatement createEffective( - final StmtContext ctx) { - return new DeviationEffectiveStatementImpl(ctx); - } - @Override public void onFullDefinitionDeclared( final Mutable ctx) { @@ -71,4 +63,30 @@ public final class DeviationStatementSupport protected SubstatementValidator getSubstatementValidator() { return SUBSTATEMENT_VALIDATOR; } + + @Override + protected DeviationStatement createDeclared(final StmtContext ctx, + final ImmutableList> substatements) { + return new DeviationStatementImpl(ctx, substatements); + } + + @Override + protected DeviationStatement createEmptyDeclared( + final StmtContext ctx) { + return new DeviationStatementImpl(ctx, ImmutableList.of()); + } + + @Override + protected DeviationEffectiveStatement createEffective( + final StmtContext ctx, + final DeviationStatement declared, final ImmutableList> substatements) { + return new DeviationEffectiveStatementImpl(declared, substatements); + } + + @Override + protected DeviationEffectiveStatement createEmptyEffective( + final StmtContext ctx, + final DeviationStatement declared) { + return new DeviationEffectiveStatementImpl(declared, ImmutableList.of()); + } } \ No newline at end of file -- 2.36.6