Implement ModelStatement.toString() 57/98957/1
authorRobert Varga <robert.varga@pantheon.tech>
Wed, 8 Dec 2021 11:20:26 +0000 (12:20 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Mon, 13 Dec 2021 07:47:58 +0000 (08:47 +0100)
Make sure we codify hashCode()/equals()/toString() methods in
AbstractModelStatement -- fixing a major usability issue with our
objects and improving consistency.

JIRA: YANGTOOLS-1378
Change-Id: I60c233c978ac4315e9c7c79a2ff96751108671cb
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 87a0921a2ecdadfabb01f2d47f2c15a3341529a2)

13 files changed:
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/AbstractIdentityEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyAnydataEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/EmptyAnyxmlEffectiveStatement.java
model/yang-model-ri/src/main/java/org/opendaylight/yangtools/yang/model/ri/stmt/impl/eff/ImportEffectiveStatementImpl.java
model/yang-model-spi/src/main/java/org/opendaylight/yangtools/yang/model/spi/meta/AbstractModelStatement.java
parser/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/AliasEffectiveStatementImpl.java
parser/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/DefValEffectiveStatementImpl.java
parser/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/DisplayHintEffectiveStatementImpl.java
parser/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/ImpliedEffectiveStatementImpl.java
parser/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/MaxAccessEffectiveStatementImpl.java
parser/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/OidEffectiveStatementImpl.java
parser/rfc6643-parser-support/src/main/java/org/opendaylight/yangtools/rfc6643/parser/SubIdEffectiveStatementImpl.java
parser/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveModule.java

index 42ca57a3e79d5979af59c03e42307ff1b5afa843..1e24235105d8f5d14fdf1027a38e46aaef70b662 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
 
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.common.QName;
@@ -39,7 +39,7 @@ abstract class AbstractIdentityEffectiveStatement extends DefaultArgument<QName,
     }
 
     @Override
-    public final String toString() {
-        return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", path).toString();
+    protected final ToStringHelper addToStringAttributes(final ToStringHelper helper) {
+        return helper.add("qname", getQName()).add("path", path);
     }
 }
index 63610f9587614e94974a1713af98f2ad8c8b7a89..8cfce64e43c4d271a59b73fcd16392408054cccf 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
 
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
@@ -74,7 +74,7 @@ public class EmptyAnydataEffectiveStatement extends Default<QName, AnydataStatem
     }
 
     @Override
-    public final String toString() {
-        return MoreObjects.toStringHelper(this).add("qname", getQName()).toString();
+    protected final ToStringHelper addToStringAttributes(final ToStringHelper helper) {
+        return helper.add("qname", getQName());
     }
 }
index 1b3ab17d12f7412221f314022a874ef96f4d6441..bac6f5ba4841d5f379cfc02dac70a6ae3d715a0a 100644 (file)
@@ -9,7 +9,7 @@ package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
 
 import static java.util.Objects.requireNonNull;
 
-import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
 import org.eclipse.jdt.annotation.Nullable;
@@ -65,7 +65,7 @@ public class EmptyAnyxmlEffectiveStatement extends Default<QName, AnyxmlStatemen
     }
 
     @Override
-    public final String toString() {
-        return MoreObjects.toStringHelper(this).add("qname", getQName()).toString();
+    protected final ToStringHelper addToStringAttributes(final ToStringHelper helper) {
+        return helper.add("qname", getQName());
     }
 }
index b898eaada10c0acbf63ffa40736c739d0eba5a11..f8d3c9a727e9253bd72619bdc4b2ab0368f97c26 100644 (file)
@@ -7,7 +7,7 @@
  */
 package org.opendaylight.yangtools.yang.model.ri.stmt.impl.eff;
 
-import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableList;
 import java.util.Optional;
 import org.eclipse.jdt.annotation.NonNull;
@@ -32,8 +32,8 @@ public final class ImportEffectiveStatementImpl extends WithSubstatements<String
             final ImmutableList<? extends EffectiveStatement<?, ?>> substatements,
             final @NonNull SourceIdentifier importedSource) {
         super(declared, substatements);
-        this.revision = importedSource.getRevision().orElse(null);
-        this.semVer = importedSource instanceof SemVerSourceIdentifier
+        revision = importedSource.getRevision().orElse(null);
+        semVer = importedSource instanceof SemVerSourceIdentifier
             ? ((SemVerSourceIdentifier) importedSource).getSemanticVersion().orElse(null)
                 : null;
     }
@@ -59,14 +59,13 @@ public final class ImportEffectiveStatementImpl extends WithSubstatements<String
     }
 
     @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this).omitNullValues()
-                .add("moduleName", getModuleName())
-                .add("revision", revision)
-                .add("version", semVer)
-                .add("prefix", getPrefix())
-                .add("description", getDescription().orElse(null))
-                .add("reference", getReference().orElse(null))
-                .toString();
+    protected ToStringHelper addToStringAttributes(final ToStringHelper helper) {
+        return helper
+            .add("moduleName", getModuleName())
+            .add("revision", revision)
+            .add("version", semVer)
+            .add("prefix", getPrefix())
+            .add("description", getDescription().orElse(null))
+            .add("reference", getReference().orElse(null));
     }
 }
index dcd5c67fbe85294b8afd20d597416da33299a742..c9904073b3e5f1abd491d6b493e22d13d8c03634 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.yangtools.yang.model.spi.meta;
 
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableSet;
 import org.eclipse.jdt.annotation.NonNull;
@@ -20,6 +22,16 @@ import org.opendaylight.yangtools.yang.model.api.meta.ModelStatement;
  * @param <A> Argument type ({@link Empty} if statement does not have argument.)
  */
 abstract class AbstractModelStatement<A> implements ModelStatement<A> {
+
+    @Override
+    public String toString() {
+        return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
+    }
+
+    protected ToStringHelper addToStringAttributes(final ToStringHelper helper) {
+        return helper.add("argument", argument());
+    }
+
     /**
      * Utility method for squashing singleton lists into single objects. This is a CPU/mem trade-off, which we are
      * usually willing to make: for the cost of an instanceof check we can save one object and re-create it when needed.
index 2a7b56cd4ef48f4d0445fbf9456a7b8e5c5c3427..35866ffd4be73c28adffdaa89f5fd78e3449f1c1 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.rfc6643.parser;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Objects;
 import org.opendaylight.yangtools.rfc6643.model.api.AliasEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.AliasSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.AliasStatement;
@@ -45,22 +44,4 @@ final class AliasEffectiveStatementImpl extends UnknownEffectiveStatementBase<St
     public AliasEffectiveStatement asEffectiveStatement() {
         return this;
     }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(path, getNodeType(), getNodeParameter());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof AliasEffectiveStatementImpl)) {
-            return false;
-        }
-        final AliasEffectiveStatementImpl other = (AliasEffectiveStatementImpl) obj;
-        return Objects.equals(getNodeType(), other.getNodeType())
-            && Objects.equals(getNodeParameter(), other.getNodeParameter()) && Objects.equals(path, other.path);
-    }
 }
index 2f2ca9f8b285dc82e38f96ba62f5d719b74bc885..5de2e4d5f6f7dea9d20ef4c4d820a889a33364c6 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.rfc6643.parser;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Objects;
 import org.opendaylight.yangtools.rfc6643.model.api.DefValEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.DefValSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.DefValStatement;
@@ -45,22 +44,4 @@ final class DefValEffectiveStatementImpl extends UnknownEffectiveStatementBase<S
     public DefValEffectiveStatement asEffectiveStatement() {
         return this;
     }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(path, getNodeType(), getNodeParameter());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof DefValEffectiveStatementImpl)) {
-            return false;
-        }
-        final DefValEffectiveStatementImpl other = (DefValEffectiveStatementImpl) obj;
-        return Objects.equals(getNodeType(), other.getNodeType())
-            && Objects.equals(getNodeParameter(), other.getNodeParameter()) && Objects.equals(path, other.path);
-    }
 }
index cb836ce2e50b266bea8047f106f861c86609b2eb..6be9b7d591f67c984231db02ea5d3b7cf4eec3f9 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.rfc6643.parser;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Objects;
 import org.opendaylight.yangtools.rfc6643.model.api.DisplayHintEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.DisplayHintSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.DisplayHintStatement;
@@ -45,22 +44,4 @@ final class DisplayHintEffectiveStatementImpl extends UnknownEffectiveStatementB
     public DisplayHintEffectiveStatement asEffectiveStatement() {
         return this;
     }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(path, getNodeType(), getNodeParameter());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof DisplayHintEffectiveStatementImpl)) {
-            return false;
-        }
-        final DisplayHintEffectiveStatementImpl other = (DisplayHintEffectiveStatementImpl) obj;
-        return Objects.equals(getNodeType(), other.getNodeType())
-            && Objects.equals(getNodeParameter(), other.getNodeParameter()) && Objects.equals(path, other.path);
-    }
 }
index 22a014095057cf20a4b27987544e61207735a52d..b0444ed8329a3cddc3a664663ecae1a033fda8ca 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.rfc6643.parser;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Objects;
 import org.opendaylight.yangtools.rfc6643.model.api.ImpliedEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.ImpliedSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.ImpliedStatement;
@@ -46,22 +45,4 @@ final class ImpliedEffectiveStatementImpl extends UnknownEffectiveStatementBase<
     public ImpliedEffectiveStatement asEffectiveStatement() {
         return this;
     }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(path, getNodeType(), getNodeParameter());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof ImpliedEffectiveStatementImpl)) {
-            return false;
-        }
-        final ImpliedEffectiveStatementImpl other = (ImpliedEffectiveStatementImpl) obj;
-        return Objects.equals(getNodeType(), other.getNodeType())
-            && Objects.equals(getNodeParameter(), other.getNodeParameter()) && Objects.equals(path, other.path);
-    }
 }
index 1abda1d33ec58bde10458a85517d1f7db379e351..f9ad1c5ea55da525c670f2a7bfef37aea13766d3 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.rfc6643.parser;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Objects;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccess;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.MaxAccessSchemaNode;
@@ -51,22 +50,4 @@ final class MaxAccessEffectiveStatementImpl extends UnknownEffectiveStatementBas
     public MaxAccessEffectiveStatement asEffectiveStatement() {
         return this;
     }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(path, getNodeType(), getNodeParameter());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof MaxAccessEffectiveStatementImpl)) {
-            return false;
-        }
-        final MaxAccessEffectiveStatementImpl other = (MaxAccessEffectiveStatementImpl) obj;
-        return Objects.equals(getNodeType(), other.getNodeType())
-            && Objects.equals(getNodeParameter(), other.getNodeParameter()) && Objects.equals(path, other.path);
-    }
 }
index 8df7a5cc1017d8c325a0692a92cd0ea814e4c437..ec404d7d9b36a83824f1125088bb5cc9cff0117f 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.rfc6643.parser;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Objects;
 import org.opendaylight.yangtools.rfc6643.model.api.ObjectIdentifier;
 import org.opendaylight.yangtools.rfc6643.model.api.OidEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.OidSchemaNode;
@@ -47,22 +46,4 @@ final class OidEffectiveStatementImpl extends UnknownEffectiveStatementBase<Obje
     public OidEffectiveStatement asEffectiveStatement() {
         return this;
     }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(path, getNodeType(), getNodeParameter());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof OidEffectiveStatementImpl)) {
-            return false;
-        }
-        final OidEffectiveStatementImpl other = (OidEffectiveStatementImpl) obj;
-        return Objects.equals(getNodeType(), other.getNodeType())
-            && Objects.equals(getNodeParameter(), other.getNodeParameter()) && Objects.equals(path, other.path);
-    }
 }
\ No newline at end of file
index 803975707e3678873a43d21e540019dbea344d1c..3a81ba847a9c9fbbfd6fd54a45fcc6ed9895fa9a 100644 (file)
@@ -8,7 +8,6 @@
 package org.opendaylight.yangtools.rfc6643.parser;
 
 import com.google.common.collect.ImmutableList;
-import java.util.Objects;
 import org.opendaylight.yangtools.rfc6643.model.api.SubIdEffectiveStatement;
 import org.opendaylight.yangtools.rfc6643.model.api.SubIdSchemaNode;
 import org.opendaylight.yangtools.rfc6643.model.api.SubIdStatement;
@@ -47,22 +46,4 @@ final class SubIdEffectiveStatementImpl extends UnknownEffectiveStatementBase<Ui
     public SubIdEffectiveStatement asEffectiveStatement() {
         return this;
     }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(path, getNodeType(), getNodeParameter());
-    }
-
-    @Override
-    public boolean equals(final Object obj) {
-        if (this == obj) {
-            return true;
-        }
-        if (!(obj instanceof SubIdEffectiveStatementImpl)) {
-            return false;
-        }
-        final SubIdEffectiveStatementImpl other = (SubIdEffectiveStatementImpl) obj;
-        return Objects.equals(getNodeType(), other.getNodeType())
-            && Objects.equals(getNodeParameter(), other.getNodeParameter()) && Objects.equals(path, other.path);
-    }
 }
index 4da56efaf962ce5905d070a75209580041ce6def..9ec04d4af6c0eb0363b8bc6689632c1d54230e29 100644 (file)
@@ -11,7 +11,7 @@ import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.annotations.Beta;
-import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.collect.Collections2;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap.Builder;
@@ -203,14 +203,13 @@ public abstract class AbstractEffectiveModule<D extends DeclaredStatement<Unqual
     }
 
     @Override
-    public String toString() {
-        return MoreObjects.toStringHelper(this).omitNullValues()
-                .add("name", getName())
-                .add("namespace", getNamespace())
-                .add("revision", getRevision().orElse(null))
-                .add("prefix", prefix)
-                .add("yangVersion", getYangVersion())
-                .toString();
+    protected ToStringHelper addToStringAttributes(final ToStringHelper helper) {
+        return helper
+            .add("name", getName())
+            .add("namespace", getNamespace())
+            .add("revision", getRevision().orElse(null))
+            .add("prefix", prefix)
+            .add("yangVersion", getYangVersion());
     }
 
     protected static final @NonNull String findPrefix(final CommonStmtCtx stmt,