Add AbstractEffectiveDocumentedNodeWithoutStatus 68/85968/1
authorRobert Varga <robert.varga@pantheon.tech>
Mon, 25 Nov 2019 12:07:44 +0000 (13:07 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Tue, 26 Nov 2019 10:27:03 +0000 (11:27 +0100)
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 <robert.varga@pantheon.tech>
(cherry picked from commit 96d12ee2688b296760c29597d44140a34ca762cf)

yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractConstraintEffectiveStatement.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNode.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveDocumentedNodeWithoutStatus.java [new file with mode: 0644]
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/deviation/DeviationEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/import_/ImportEffectiveStatementImpl.java
yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/revision/RevisionEffectiveStatementImpl.java

index 72069a5c5229529d1dffc4c585f7f2326c64dc98..4ec0d07f16989021f2f3f1d57e2d3e666cce2fe7 100644 (file)
@@ -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<A, D extends DeclaredStatement<A>> extends
-        DeclaredEffectiveStatementBase<A, D> implements ConstraintMetaDefinition {
-    private final String description;
-    private final String reference;
+        AbstractEffectiveDocumentedNodeWithoutStatus<A, D> implements ConstraintMetaDefinition {
     private final String errorAppTag;
     private final String errorMessage;
     private final ModifierKind modifier;
@@ -32,19 +28,11 @@ public abstract class AbstractConstraintEffectiveStatement<A, D extends Declared
 
     protected AbstractConstraintEffectiveStatement(final StmtContext<A, D, ?> 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<A, D extends Declared
             }
         }
 
-        this.description = descriptionInit;
-        this.reference = referenceInit;
         this.errorAppTag = errorAppTagInit;
         this.errorMessage = errorMessageInit;
         this.modifier = modifierInit;
@@ -70,24 +56,14 @@ public abstract class AbstractConstraintEffectiveStatement<A, D extends Declared
     }
 
     public final boolean isCustomizedStatement() {
-        return this.description != null || this.reference != null || this.errorAppTag != null
+        return getDescription().isPresent() || getReference().isPresent() || this.errorAppTag != null
                 || this.errorMessage != null || this.modifier != null;
     }
 
-    @Override
-    public final Optional<String> getDescription() {
-        return Optional.ofNullable(description);
-    }
-
     public final ModifierKind getModifier() {
         return modifier;
     }
 
-    @Override
-    public final Optional<String> getReference() {
-        return Optional.ofNullable(reference);
-    }
-
     @Override
     public final Optional<String> getErrorAppTag() {
         return Optional.ofNullable(errorAppTag);
index d99e7d87a3801e6fc16016d33e0ce25bcdadc2e2..5f09391c7bd802dafc9fce84c74d4b97885f0347 100644 (file)
@@ -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<A, D extends DeclaredStatement<A>>
-        extends DeclaredEffectiveStatementBase<A, D> implements DocumentedNode.WithStatus {
-
-    private final String description;
-    private final String reference;
+        extends AbstractEffectiveDocumentedNodeWithoutStatus<A, D> implements DocumentedNode.WithStatus {
     private final @NonNull Status status;
 
     /**
@@ -32,21 +27,9 @@ public abstract class AbstractEffectiveDocumentedNode<A, D extends DeclaredState
      */
     protected AbstractEffectiveDocumentedNode(final StmtContext<A, D, ?> 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<String> getDescription() {
-        return Optional.ofNullable(description);
-    }
-
-    @Override
-    public final Optional<String> 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 (file)
index 0000000..6ac2a48
--- /dev/null
@@ -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<A, D extends DeclaredStatement<A>>
+        extends DeclaredEffectiveStatementBase<A, D> implements DocumentedNode {
+
+    private final @Nullable String description;
+    private final @Nullable String reference;
+
+    protected AbstractEffectiveDocumentedNodeWithoutStatus(final StmtContext<A, D, ?> ctx) {
+        super(ctx);
+        description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null);
+        reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null);
+    }
+
+    @Override
+    public final Optional<String> getDescription() {
+        return Optional.ofNullable(description);
+    }
+
+    @Override
+    public final Optional<String> getReference() {
+        return Optional.ofNullable(reference);
+    }
+
+    protected final @Nullable String nullableDescription() {
+        return description;
+    }
+
+    protected final @Nullable String nullableReference() {
+        return reference;
+    }
+}
index 55fd25db6077ef93f419691f3095555dffea8678..63951ecf4157044807112bfcf64627da7ecd5018 100644 (file)
@@ -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<SchemaNodeIdentifier, DeviationStatement>
+        extends AbstractEffectiveDocumentedNodeWithoutStatus<SchemaNodeIdentifier, DeviationStatement>
         implements Deviation, DeviationEffectiveStatement, Immutable {
     private final SchemaPath targetPath;
-    private final String description;
-    private final String reference;
     private final @NonNull ImmutableList<UnknownSchemaNode> unknownSchemaNodes;
     private final ImmutableList<DeviateDefinition> deviateDefinitions;
 
     DeviationEffectiveStatementImpl(final StmtContext<SchemaNodeIdentifier, DeviationStatement, ?> 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<UnknownSchemaNode> unknownSchemaNodesInit = new ArrayList<>();
         for (final EffectiveStatement<?, ?> effectiveStatement : effectiveSubstatements()) {
             if (effectiveStatement instanceof UnknownSchemaNode) {
@@ -64,16 +55,6 @@ final class DeviationEffectiveStatementImpl
         return deviateDefinitions;
     }
 
-    @Override
-    public Optional<String> getDescription() {
-        return Optional.ofNullable(description);
-    }
-
-    @Override
-    public Optional<String> getReference() {
-        return Optional.ofNullable(reference);
-    }
-
     @Override
     public List<UnknownSchemaNode> 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()
                 + "]";
     }
 }
index fe4928bb2c3c133b8dc0fcab6981a738bd3e6ffd..a780173b1a1b5fbbc7501d8256a034905042174d 100644 (file)
@@ -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<String, ImportStatement>
+final class ImportEffectiveStatementImpl extends AbstractEffectiveDocumentedNodeWithoutStatus<String, ImportStatement>
         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<String, ImportStatement, ?> 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<String, ImportStatement, ?> ctx) {
@@ -94,19 +87,9 @@ final class ImportEffectiveStatementImpl extends DeclaredEffectiveStatementBase<
         return prefix;
     }
 
-    @Override
-    public Optional<String> getDescription() {
-        return Optional.ofNullable(description);
-    }
-
-    @Override
-    public Optional<String> 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();
     }
 }
index df9ec74fd0dac1d8cfd2211e2344cfb59425e34f..e24b56c9720fb3863c4ce8a1f3d8eced18de735a 100644 (file)
@@ -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<Revision, RevisionStatement>
-        implements DocumentedNode, RevisionEffectiveStatement {
-
-    private final String reference;
-    private final String description;
-
+final class RevisionEffectiveStatementImpl
+        extends AbstractEffectiveDocumentedNodeWithoutStatus<Revision, RevisionStatement>
+        implements RevisionEffectiveStatement {
     RevisionEffectiveStatementImpl(final StmtContext<Revision, RevisionStatement, ?> ctx) {
         super(ctx);
-        description = findFirstEffectiveSubstatementArgument(DescriptionEffectiveStatement.class).orElse(null);
-        reference = findFirstEffectiveSubstatementArgument(ReferenceEffectiveStatement.class).orElse(null);
-    }
-
-    @Override
-    public Optional<String> getDescription() {
-        return Optional.ofNullable(description);
-    }
-
-    @Override
-    public Optional<String> getReference() {
-        return Optional.ofNullable(reference);
     }
 }