From 9e33901323d2be89cd6a7f2b7866927293fe10b0 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Wed, 22 Jan 2020 13:11:22 +0100 Subject: [PATCH] Remove hashCode()/equals() from SchemaNode implementations Most SchemaNode comparisons end up operating on a statement's SchemaPath, pretending they are equal based on path. This is not accurate when comparing nodes between SchemaContexts, as their definition can vary wildly and they cannot be considered 'equal'. Inter-SchemaContext comparison is all about compatibility and as such cannot be in terms of equals() contract -- such a compatibility check is both irreflexive and asymmetric unless the two nodes are completely compatible. With the above out of the picture, the definition of comparison really boils down to a glorified identity check, as SchemaPath is supposed to be unique for a node. This patch removes most hashCode()/equals() methods, defaulting to identity. Notable leftovers are Mandatory/Config statements and TypeDefinitions (which are DocumentedNodes, but the point is pretty much the same). JIRA: YANGTOOLS-761 Change-Id: I8162b2b121f611bc128fbbcea3cef7921f25eb72 Signed-off-by: Robert Varga --- ...lSchemaLocationEffectiveStatementImpl.java | 27 ---------------- ...ngModeledAnyxmlEffectiveStatementImpl.java | 26 ---------------- .../YangDataEffectiveStatementImpl.java | 20 ------------ ...enConfigVersionEffectiveStatementImpl.java | 19 ------------ ...EffectiveOperationContainerSchemaNode.java | 18 ----------- .../AbstractEffectiveOperationDefinition.java | 19 ------------ .../EmptyAnydataEffectiveStatement.java | 18 ----------- .../anyxml/EmptyAnyxmlEffectiveStatement.java | 23 -------------- .../AugmentEffectiveStatementImpl.java | 26 ---------------- .../stmt/bit/BitEffectiveStatementImpl.java | 28 ----------------- .../case_/DeclaredCaseEffectiveStatement.java | 23 -------------- .../UndeclaredCaseEffectiveStatement.java | 22 ------------- .../choice/ChoiceEffectiveStatementImpl.java | 30 +----------------- .../ContainerEffectiveStatementImpl.java | 25 --------------- .../DeviateEffectiveStatementImpl.java | 31 ------------------- .../DeviationEffectiveStatementImpl.java | 21 ------------- .../ExtensionEffectiveStatementImpl.java | 25 --------------- .../UnrecognizedEffectiveStatementImpl.java | 26 ---------------- .../EmptyFeatureEffectiveStatement.java | 22 ------------- .../GroupingEffectiveStatementImpl.java | 22 ------------- .../AbstractIdentityEffectiveStatement.java | 22 ------------- .../import_/ImportEffectiveStatementImpl.java | 25 --------------- .../AbstractLeafListEffectiveStatement.java | 22 ------------- .../list/AbstractListEffectiveStatement.java | 22 ------------- .../module/ModuleEffectiveStatementImpl.java | 19 ------------ .../stmt/must/MustEffectiveStatementImpl.java | 19 ------------ .../NotificationEffectiveStatementImpl.java | 22 ------------- .../SubmoduleEffectiveStatementImpl.java | 19 ------------ .../stmt/uses/UsesEffectiveStatementImpl.java | 25 --------------- ...dPartyExtensionEffectiveStatementImpl.java | 31 ------------------- 30 files changed, 1 insertion(+), 696 deletions(-) diff --git a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationEffectiveStatementImpl.java b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationEffectiveStatementImpl.java index 8b8dc70a86..510e24b645 100644 --- a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationEffectiveStatementImpl.java +++ b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/AnyxmlSchemaLocationEffectiveStatementImpl.java @@ -8,7 +8,6 @@ package org.opendaylight.yangtools.odlext.parser; import com.google.common.annotations.VisibleForTesting; -import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationEffectiveStatement; import org.opendaylight.yangtools.odlext.model.api.AnyxmlSchemaLocationStatement; @@ -40,30 +39,4 @@ public final class AnyxmlSchemaLocationEffectiveStatementImpl public @NonNull SchemaPath getPath() { return path; } - - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(path); - result = prime * result + Objects.hashCode(getNodeType()); - result = prime * result + Objects.hashCode(getNodeParameter()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - AnyxmlSchemaLocationEffectiveStatementImpl other = (AnyxmlSchemaLocationEffectiveStatementImpl) obj; - return Objects.equals(path, other.path) && Objects.equals(getNodeType(), other.getNodeType()) - && Objects.equals(getNodeParameter(), other.getNodeParameter()); - } } diff --git a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/YangModeledAnyxmlEffectiveStatementImpl.java b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/YangModeledAnyxmlEffectiveStatementImpl.java index fbb678c557..0b86ab89c9 100644 --- a/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/YangModeledAnyxmlEffectiveStatementImpl.java +++ b/yang/odlext-parser-support/src/main/java/org/opendaylight/yangtools/odlext/parser/YangModeledAnyxmlEffectiveStatementImpl.java @@ -11,7 +11,6 @@ import static java.util.Objects.requireNonNull; import java.util.Collection; import java.util.List; -import java.util.Objects; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.odlext.model.api.YangModeledAnyxmlSchemaNode; @@ -115,31 +114,6 @@ final class YangModeledAnyxmlEffectiveStatementImpl return delegateSchemaNode().getUnknownSchemaNodes(); } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(getQName()); - result = prime * result + Objects.hashCode(getPath()); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null) { - return false; - } - if (getClass() != obj.getClass()) { - return false; - } - - YangModeledAnyxmlEffectiveStatementImpl other = (YangModeledAnyxmlEffectiveStatementImpl) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); - } - @Override public String toString() { return YangModeledAnyxmlEffectiveStatementImpl.class.getSimpleName() + "[" diff --git a/yang/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java b/yang/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java index 9d1cacbe26..a3fc63614b 100644 --- a/yang/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java +++ b/yang/rfc8040-parser-support/src/main/java/org/opendaylight/yangtools/rfc8040/parser/YangDataEffectiveStatementImpl.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.rfc8040.parser; import com.google.common.annotations.Beta; import com.google.common.base.MoreObjects; import com.google.common.base.Verify; -import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.rfc8040.model.api.YangDataEffectiveStatement; import org.opendaylight.yangtools.rfc8040.model.api.YangDataSchemaNode; @@ -71,25 +70,6 @@ final class YangDataEffectiveStatementImpl extends UnknownEffectiveStatementBase return (ContainerSchemaNode) container; } - @Override - public int hashCode() { - return Objects.hash(maybeQNameArgument, path); - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - - if (!(obj instanceof YangDataEffectiveStatementImpl)) { - return false; - } - - final YangDataEffectiveStatementImpl other = (YangDataEffectiveStatementImpl) obj; - return Objects.equals(maybeQNameArgument, other.maybeQNameArgument) && Objects.equals(path, other.path); - } - @Override public String toString() { return MoreObjects.toStringHelper(this).omitNullValues() diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/openconfig/stmt/OpenConfigVersionEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/openconfig/stmt/OpenConfigVersionEffectiveStatementImpl.java index dbc862152b..f16d6afaac 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/openconfig/stmt/OpenConfigVersionEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/openconfig/stmt/OpenConfigVersionEffectiveStatementImpl.java @@ -7,7 +7,6 @@ */ package org.opendaylight.yangtools.yang.parser.openconfig.stmt; -import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.concepts.SemVer; import org.opendaylight.yangtools.openconfig.model.api.OpenConfigVersionEffectiveStatement; @@ -37,22 +36,4 @@ final class OpenConfigVersionEffectiveStatementImpl extends public SchemaPath getPath() { return path; } - - @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 OpenConfigVersionEffectiveStatementImpl)) { - return false; - } - final OpenConfigVersionEffectiveStatementImpl other = (OpenConfigVersionEffectiveStatementImpl) obj; - return Objects.equals(path, other.path) && Objects.equals(getNodeType(), other.getNodeType()) - && Objects.equals(getNodeParameter(), other.getNodeParameter()); - } } diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationContainerSchemaNode.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationContainerSchemaNode.java index f11caa428b..0ee89d350e 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationContainerSchemaNode.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/AbstractEffectiveOperationContainerSchemaNode.java @@ -9,7 +9,6 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt; import com.google.common.base.MoreObjects; import com.google.common.collect.ImmutableSet; -import java.util.Objects; import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.ActionDefinition; @@ -40,23 +39,6 @@ public abstract class AbstractEffectiveOperationContainerSchemaNode other = (AbstractEffectiveOperationContainerSchemaNode) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); - } - @Override public final String toString() { return MoreObjects.toStringHelper(this).add("path", getPath()).toString(); 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 2baf3aeaf7..0f8a71d7dd 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 @@ -12,7 +12,6 @@ import com.google.common.base.Verify; import com.google.common.collect.ImmutableSet; import java.util.HashSet; import java.util.LinkedHashSet; -import java.util.Objects; import java.util.Set; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; @@ -85,24 +84,6 @@ public abstract class AbstractEffectiveOperationDefinition other = - (AbstractEffectiveOperationDefinition) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); - } - @Override public final String toString() { return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).add("input", input) diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java index 670204ed0d..680bdde9cf 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anydata/EmptyAnydataEffectiveStatement.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anydata; import static java.util.Objects.requireNonNull; import com.google.common.base.MoreObjects; -import java.util.Objects; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; @@ -60,23 +59,6 @@ class EmptyAnydataEffectiveStatement extends Default return Optional.empty(); } - @Override - public final int hashCode() { - return Objects.hash(getQName(), getPath()); - } - - @Override - public final boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof EmptyAnydataEffectiveStatement)) { - return false; - } - final EmptyAnydataEffectiveStatement other = (EmptyAnydataEffectiveStatement) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); - } - @Override public final String toString() { return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString(); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java index 911a130e35..2ca2b37deb 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/anyxml/EmptyAnyxmlEffectiveStatement.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.anyxml; import static java.util.Objects.requireNonNull; import com.google.common.base.MoreObjects; -import java.util.Objects; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; @@ -51,28 +50,6 @@ class EmptyAnyxmlEffectiveStatement extends Default return Optional.ofNullable(original); } - @Override - public final int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(getQName()); - result = prime * result + Objects.hashCode(getPath()); - return result; - } - - @Override - public final boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof EmptyAnyxmlEffectiveStatement)) { - return false; - } - - EmptyAnyxmlEffectiveStatement other = (EmptyAnyxmlEffectiveStatement) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); - } - @Override public final String toString() { return MoreObjects.toStringHelper(this).add("qname", getQName()).add("path", getPath()).toString(); diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AugmentEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AugmentEffectiveStatementImpl.java index 30c8806853..3e84a216ed 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AugmentEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/augment/AugmentEffectiveStatementImpl.java @@ -11,7 +11,6 @@ import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableList; import java.net.URI; -import java.util.Objects; import java.util.Optional; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; @@ -83,31 +82,6 @@ final class AugmentEffectiveStatementImpl extends DefaultDataNodeContainer return path; } - @Override - public final int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(getQName()); - result = prime * result + Objects.hashCode(getPath()); - return result; - } - - @Override - public final boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (!(obj instanceof EmptyFeatureEffectiveStatement)) { - return false; - } - final EmptyFeatureEffectiveStatement other = (EmptyFeatureEffectiveStatement) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(getPath(), other.getPath()); - } - @Override public final String toString() { return getClass().getSimpleName() + "[name=" + getQName() + "]"; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingEffectiveStatementImpl.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingEffectiveStatementImpl.java index 4b056d9c95..df09c33063 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingEffectiveStatementImpl.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/grouping/GroupingEffectiveStatementImpl.java @@ -10,7 +10,6 @@ package org.opendaylight.yangtools.yang.parser.rfc7950.stmt.grouping; import static java.util.Objects.requireNonNull; import com.google.common.collect.ImmutableList; -import java.util.Objects; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; import org.opendaylight.yangtools.yang.common.QName; @@ -56,27 +55,6 @@ final class GroupingEffectiveStatementImpl return path; } - @Override - public int hashCode() { - final int prime = 31; - int result = 1; - result = prime * result + Objects.hashCode(getQName()); - result = prime * result + Objects.hashCode(path); - return result; - } - - @Override - public boolean equals(final Object obj) { - if (this == obj) { - return true; - } - if (obj == null || getClass() != obj.getClass()) { - return false; - } - final GroupingEffectiveStatementImpl other = (GroupingEffectiveStatementImpl) obj; - return Objects.equals(getQName(), other.getQName()) && Objects.equals(path, other.path); - } - @Override public String toString() { return GroupingEffectiveStatementImpl.class.getSimpleName() + "[" + "qname=" + getQName() + "]"; diff --git a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/identity/AbstractIdentityEffectiveStatement.java b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/identity/AbstractIdentityEffectiveStatement.java index da84949a4f..2af816d53d 100644 --- a/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/identity/AbstractIdentityEffectiveStatement.java +++ b/yang/yang-parser-rfc7950/src/main/java/org/opendaylight/yangtools/yang/parser/rfc7950/stmt/identity/AbstractIdentityEffectiveStatement.java @@ -14,7 +14,6 @@ import com.google.common.collect.ImmutableSet; import java.util.Collections; import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Set; import org.eclipse.jdt.annotation.NonNull; import org.opendaylight.yangtools.yang.common.QName; @@ -83,27 +82,6 @@ abstract class AbstractIdentityEffectiveStatement extends DefaultArgument