From fce9b11e87d23b7ddf4d27e442bc472c76ef5cd8 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Mon, 25 Nov 2019 13:07:44 +0100 Subject: [PATCH] Add AbstractEffectiveDocumentedNodeWithoutStatus We have a number of statements which are specified to be DocumentedNode, but not DocumentedNode.WithStatus. These are handled by subclassing DeclaredEffectiveStatementBase and repeated logic looking up description and reference. Introduce AbstractEffectiveDocumentedNodeWithoutStatus, which acts as a plain DocumentedNode implementation without also implying WithStatus and retrofits this class to all users. JIRA: YANGTOOLS-1040 Change-Id: Ied1794c4fbd8ca27a4add1d2245fdfb10d8104cb Signed-off-by: Robert Varga (cherry picked from commit 96d12ee2688b296760c29597d44140a34ca762cf) --- .../AbstractConstraintEffectiveStatement.java | 28 +---------- .../stmt/AbstractEffectiveDocumentedNode.java | 21 +------- ...tEffectiveDocumentedNodeWithoutStatus.java | 50 +++++++++++++++++++ .../DeviationEffectiveStatementImpl.java | 32 +++--------- .../import_/ImportEffectiveStatementImpl.java | 28 +++-------- .../RevisionEffectiveStatementImpl.java | 27 ++-------- 6 files changed, 71 insertions(+), 115 deletions(-) create mode 100644 yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithoutStatus.java diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java index 72069a5c52..4ec0d07f16 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java @@ -12,19 +12,15 @@ import java.util.Optional; import org.opendaylight.yangtools.yang.model.api.ConstraintMetaDefinition; 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.ErrorAppTagEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ErrorMessageEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ModifierEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.type.ModifierKind; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; @Beta public abstract class AbstractConstraintEffectiveStatement> extends - DeclaredEffectiveStatementBase implements ConstraintMetaDefinition { - private final String description; - private final String reference; + AbstractEffectiveDocumentedNodeWithoutStatus implements ConstraintMetaDefinition { private final String errorAppTag; private final String errorMessage; private final ModifierKind modifier; @@ -32,19 +28,11 @@ public abstract class AbstractConstraintEffectiveStatement ctx) { super(ctx); - String descriptionInit = null; - String referenceInit = null; String errorAppTagInit = null; String errorMessageInit = null; ModifierKind modifierInit = null; for (final EffectiveStatement stmt : effectiveSubstatements()) { - if (stmt instanceof DescriptionEffectiveStatement) { - descriptionInit = ((DescriptionEffectiveStatement) stmt).argument(); - } - if (stmt instanceof ReferenceEffectiveStatement) { - referenceInit = ((ReferenceEffectiveStatement) stmt).argument(); - } if (stmt instanceof ErrorAppTagEffectiveStatement) { errorAppTagInit = ((ErrorAppTagEffectiveStatement) stmt).argument(); } @@ -56,8 +44,6 @@ public abstract class AbstractConstraintEffectiveStatement getDescription() { - return Optional.ofNullable(description); - } - public final ModifierKind getModifier() { return modifier; } - @Override - public final Optional getReference() { - return Optional.ofNullable(reference); - } - @Override public final Optional getErrorAppTag() { return Optional.ofNullable(errorAppTag); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java index d99e7d87a3..5f09391c7b 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java @@ -7,21 +7,16 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt; -import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.model.api.DocumentedNode; import org.opendaylight.yangtools.yang.model.api.Status; import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.StatusEffectiveStatement; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; +// FIXME: 5.0.0: rename to AbstractEffectiveDocumentedNodeWithStatus public abstract class AbstractEffectiveDocumentedNode> - extends DeclaredEffectiveStatementBase implements DocumentedNode.WithStatus { - - private final String description; - private final String reference; + extends AbstractEffectiveDocumentedNodeWithoutStatus implements DocumentedNode.WithStatus { private final @NonNull Status status; /** @@ -32,21 +27,9 @@ public abstract class AbstractEffectiveDocumentedNode ctx) { super(ctx); - description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null); - reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null); status = findFirstEffectiveSubstatementArgument(StatusEffectiveStatement.class).orElse(Status.CURRENT); } - @Override - public final Optional getDescription() { - return Optional.ofNullable(description); - } - - @Override - public final Optional getReference() { - return Optional.ofNullable(reference); - } - @Override public final Status getStatus() { return status; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithoutStatus.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithoutStatus.java new file mode 100644 index 0000000000..6ac2a48aec --- /dev/null +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithoutStatus.java @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2019 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; + +import com.google.common.annotations.Beta; +import java.util.Optional; +import org.eclipse.jdt.annotation.Nullable; +import org.opendaylight.yangtools.yang.model.api.DocumentedNode; +import org.opendaylight.yangtools.yang.model.api.meta.DeclaredStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement; +import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement; +import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; + +@Beta +//FIXME: 5.0.0: rename to AbstractEffectiveDocumentedNode +public abstract class AbstractEffectiveDocumentedNodeWithoutStatus> + extends DeclaredEffectiveStatementBase implements DocumentedNode { + + private final @Nullable String description; + private final @Nullable String reference; + + protected AbstractEffectiveDocumentedNodeWithoutStatus(final StmtContext ctx) { + super(ctx); + description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null); + reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null); + } + + @Override + public final Optional getDescription() { + return Optional.ofNullable(description); + } + + @Override + public final Optional getReference() { + return Optional.ofNullable(reference); + } + + protected final @Nullable String nullableDescription() { + return description; + } + + protected final @Nullable String nullableReference() { + return reference; + } +} 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 55fd25db60..63951ecf41 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 @@ -11,7 +11,6 @@ import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; import java.util.Objects; -import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.Immutable; import org.opendaylight.yangtools.yang.model.api.DeviateDefinition; @@ -19,32 +18,24 @@ 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.DescriptionEffectiveStatement; 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.ReferenceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.SchemaNodeIdentifier; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNodeWithoutStatus; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; final class DeviationEffectiveStatementImpl - extends DeclaredEffectiveStatementBase + extends AbstractEffectiveDocumentedNodeWithoutStatus implements Deviation, DeviationEffectiveStatement, Immutable { private final SchemaPath targetPath; - private final String description; - private final String reference; 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)); - description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null); - reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null); - List unknownSchemaNodesInit = new ArrayList<>(); for (final EffectiveStatement effectiveStatement : effectiveSubstatements()) { if (effectiveStatement instanceof UnknownSchemaNode) { @@ -64,16 +55,6 @@ final class DeviationEffectiveStatementImpl return deviateDefinitions; } - @Override - public Optional getDescription() { - return Optional.ofNullable(description); - } - - @Override - public Optional getReference() { - return Optional.ofNullable(reference); - } - @Override public List getUnknownSchemaNodes() { return unknownSchemaNodes; @@ -81,7 +62,7 @@ final class DeviationEffectiveStatementImpl @Override public int hashCode() { - return Objects.hash(targetPath, deviateDefinitions, description, reference); + return Objects.hash(targetPath, deviateDefinitions, nullableDescription(), nullableReference()); } @Override @@ -95,7 +76,8 @@ final class DeviationEffectiveStatementImpl final DeviationEffectiveStatementImpl other = (DeviationEffectiveStatementImpl) obj; return Objects.equals(targetPath, other.targetPath) && Objects.equals(deviateDefinitions, other.deviateDefinitions) - && Objects.equals(description, other.description) && Objects.equals(reference, other.reference); + && Objects.equals(nullableDescription(), other.nullableDescription()) + && Objects.equals(nullableReference(), other.nullableReference()); } @Override @@ -103,8 +85,8 @@ final class DeviationEffectiveStatementImpl return DeviationEffectiveStatementImpl.class.getSimpleName() + "[" + "targetPath=" + targetPath + ", deviates=" + deviateDefinitions - + ", description=" + description - + ", reference=" + reference + + ", description=" + nullableDescription() + + ", reference=" + nullableReference() + "]"; } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportEffectiveStatementImpl.java index fe4928bb2c..a780173b1a 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportEffectiveStatementImpl.java @@ -14,29 +14,25 @@ import org.opendaylight.yangtools.concepts.SemVer; import org.opendaylight.yangtools.yang.common.QNameModule; import org.opendaylight.yangtools.yang.common.Revision; import org.opendaylight.yangtools.yang.model.api.ModuleImport; -import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ImportEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.ImportStatement; import org.opendaylight.yangtools.yang.model.api.stmt.PrefixEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionDateEffectiveStatement; import org.opendaylight.yangtools.yang.model.repo.api.SemVerSourceIdentifier; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNodeWithoutStatus; import org.opendaylight.yangtools.yang.parser.spi.meta.MissingSubstatementException; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContextUtils; import org.opendaylight.yangtools.yang.parser.spi.source.ImportPrefixToSemVerSourceIdentifier; import org.opendaylight.yangtools.yang.parser.spi.source.SourceException; -final class ImportEffectiveStatementImpl extends DeclaredEffectiveStatementBase +final class ImportEffectiveStatementImpl extends AbstractEffectiveDocumentedNodeWithoutStatus implements ImportEffectiveStatement, ModuleImport { private final String moduleName; private final Revision revision; private final SemVer semVer; private final String prefix; - private final String description; - private final String reference; ImportEffectiveStatementImpl(final StmtContext ctx) { super(ctx); @@ -58,9 +54,6 @@ final class ImportEffectiveStatementImpl extends DeclaredEffectiveStatementBase< revision = importedModuleIdentifier.getRevision().orElse(null); semVer = importedModuleIdentifier.getSemanticVersion().orElse(null); } - - description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null); - reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null); } private Revision getImportedRevision(final StmtContext ctx) { @@ -94,19 +87,9 @@ final class ImportEffectiveStatementImpl extends DeclaredEffectiveStatementBase< return prefix; } - @Override - public Optional getDescription() { - return Optional.ofNullable(description); - } - - @Override - public Optional getReference() { - return Optional.ofNullable(reference); - } - @Override public int hashCode() { - return Objects.hash(moduleName, revision, prefix, semVer, description, reference); + return Objects.hash(moduleName, revision, prefix, semVer, nullableDescription(), nullableReference()); } @Override @@ -123,13 +106,14 @@ final class ImportEffectiveStatementImpl extends DeclaredEffectiveStatementBase< final ImportEffectiveStatementImpl other = (ImportEffectiveStatementImpl) obj; return Objects.equals(moduleName, other.moduleName) && Objects.equals(revision, other.revision) && Objects.equals(semVer, other.semVer) && Objects.equals(prefix, other.prefix) - && Objects.equals(description, other.description) && Objects.equals(reference, other.reference); + && Objects.equals(nullableDescription(), other.nullableDescription()) + && Objects.equals(nullableReference(), other.nullableReference()); } @Override public String toString() { return MoreObjects.toStringHelper(this).omitNullValues().add("moduleName", getModuleName()) .add("revision", revision).add("version", semVer).add("prefix", getPrefix()) - .add("description", description).add("reference", reference).toString(); + .add("description", nullableDescription()).add("reference", nullableReference()).toString(); } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/revision/RevisionEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/revision/RevisionEffectiveStatementImpl.java index df9ec74fd0..e24b56c972 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/revision/RevisionEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/revision/RevisionEffectiveStatementImpl.java @@ -7,35 +7,16 @@ */ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.revision; -import java.util.Optional; import org.opendaylight.yangtools.yang.common.Revision; -import org.opendaylight.yangtools.yang.model.api.DocumentedNode; -import org.opendaylight.yangtools.yang.model.api.stmt.DescriptionEffectiveStatement; -import org.opendaylight.yangtools.yang.model.api.stmt.ReferenceEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionEffectiveStatement; import org.opendaylight.yangtools.yang.model.api.stmt.RevisionStatement; -import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.DeclaredEffectiveStatementBase; +import org.opendaylight.yangtools.yang.parser.rfc7950.stmt.AbstractEffectiveDocumentedNodeWithoutStatus; import org.opendaylight.yangtools.yang.parser.spi.meta.StmtContext; -final class RevisionEffectiveStatementImpl extends DeclaredEffectiveStatementBase - implements DocumentedNode, RevisionEffectiveStatement { - - private final String reference; - private final String description; - +final class RevisionEffectiveStatementImpl + extends AbstractEffectiveDocumentedNodeWithoutStatus + implements RevisionEffectiveStatement { RevisionEffectiveStatementImpl(final StmtContext ctx) { super(ctx); - description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null); - reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null); - } - - @Override - public Optional getDescription() { - return Optional.ofNullable(description); - } - - @Override - public Optional getReference() { - return Optional.ofNullable(reference); } } -- 2.36.6