Util types: implement hashCode()/equals()/toString() 38/28538/4
authorRobert Varga <robert.varga@pantheon.sk>
Fri, 16 Oct 2015 17:52:10 +0000 (19:52 +0200)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 19 Oct 2015 07:24:08 +0000 (07:24 +0000)
This patch adds the infrastructure and provides the base
hashCode/equals/toString implementations for all types.

Change-Id: I8e10bcc71e41bc07e5ff96f2746e3352b02abc39
Signed-off-by: Robert Varga <robert.varga@pantheon.sk>
45 files changed:
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractBaseType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractDerivedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractIntegerBaseType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRangedBaseType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractRestrictedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractTypeDefinition.java [new file with mode: 0644]
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractUnsignedBaseType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseBinaryType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseBitsType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseBooleanType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseDecimalType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseEmptyType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseEnumerationType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseIdentityrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseInstanceIdentifierType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseLeafrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseStringType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/BaseUnionType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedBinaryType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedBitsType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedBooleanType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedDecimalType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedEmptyType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedEnumerationType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedIdentityrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedInstanceIdentifierType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedIntegerType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedLeafrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedStringType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedUnionType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/DerivedUnsignedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedBinaryType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedBitsType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedBooleanType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedDecimalType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedEmptyType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedEnumerationType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedIdentityrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedInstanceIdentifierType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedIntegerType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedLeafrefType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedStringType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUnionType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/RestrictedUnsignedType.java
yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/TypeDefinitions.java [new file with mode: 0644]

index 5b5c287099c1fa4abc7bd90f6df19490737b63e9..a9d171ca2c98b932d6786d6aab6b514c3695b006 100644 (file)
@@ -7,29 +7,21 @@
  */
 package org.opendaylight.yangtools.yang.model.util.type;
 
-import com.google.common.base.MoreObjects;
-import com.google.common.base.MoreObjects.ToStringHelper;
-import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
-import org.opendaylight.yangtools.concepts.Immutable;
 import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 
-abstract class AbstractBaseType<T extends TypeDefinition<T>> implements Immutable, TypeDefinition<T> {
-    private final List<UnknownSchemaNode> unknownSchemaNodes;
-    private final SchemaPath path;
-
+abstract class AbstractBaseType<T extends TypeDefinition<T>> extends AbstractTypeDefinition<T> {
     AbstractBaseType(final QName qname) {
         this(SchemaPath.create(true, qname), ImmutableList.<UnknownSchemaNode>of());
     }
 
     AbstractBaseType(final SchemaPath path, final List<UnknownSchemaNode> unknownSchemaNodes) {
-        this.path = Preconditions.checkNotNull(path);
-        this.unknownSchemaNodes = Preconditions.checkNotNull(unknownSchemaNodes);
+        super(path, unknownSchemaNodes);
     }
 
     @Override
@@ -47,16 +39,6 @@ abstract class AbstractBaseType<T extends TypeDefinition<T>> implements Immutabl
         return null;
     }
 
-    @Override
-    public final QName getQName() {
-        return path.getLastComponent();
-    }
-
-    @Override
-    public final SchemaPath getPath() {
-        return path;
-    }
-
     @Override
     public final String getDescription() {
         return null;
@@ -71,18 +53,4 @@ abstract class AbstractBaseType<T extends TypeDefinition<T>> implements Immutabl
     public final Status getStatus() {
         return Status.CURRENT;
     }
-
-    @Override
-    public final List<UnknownSchemaNode> getUnknownSchemaNodes() {
-        return unknownSchemaNodes;
-    }
-
-    @Override
-    public final String toString() {
-        return addToStringAttributes(MoreObjects.toStringHelper(this).omitNullValues()).toString();
-    }
-
-    protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
-        return toStringHelper.add("path", path);
-    }
 }
index 601afb5bf344393c6763507ec9e6ff788578cdfa..db68f1d2ce981f373bca1ec2530b35691ae0d1fe 100644 (file)
@@ -9,36 +9,29 @@ package org.opendaylight.yangtools.yang.model.util.type;
 
 import com.google.common.base.MoreObjects;
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 import java.util.Collection;
-import java.util.List;
-import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 
-abstract class AbstractDerivedType<T extends TypeDefinition<T>> implements Immutable, TypeDefinition<T> {
-    private final SchemaPath path;
+abstract class AbstractDerivedType<T extends TypeDefinition<T>> extends AbstractTypeDefinition<T> {
     private final T baseType;
     private final Object defaultValue;
     private final String description;
     private final String reference;
     private final Status status;
     private final String units;
-    private final List<UnknownSchemaNode> unknownSchemNodes;
 
     AbstractDerivedType(final T baseType, final SchemaPath path, final Object defaultValue, final String description,
             final String reference, final Status status, final String units, final Collection<UnknownSchemaNode> unknownSchemNodes) {
+        super(path, unknownSchemNodes);
         this.baseType = Preconditions.checkNotNull(baseType);
-        this.path = Preconditions.checkNotNull(path);
         this.status = Preconditions.checkNotNull(status);
         this.defaultValue = defaultValue;
         this.description = description;
         this.reference = reference;
         this.units = units;
-        this.unknownSchemNodes = ImmutableList.copyOf(unknownSchemNodes);
     }
 
     @Override
@@ -51,21 +44,6 @@ abstract class AbstractDerivedType<T extends TypeDefinition<T>> implements Immut
         return defaultValue != null ? defaultValue : baseType.getDefaultValue();
     }
 
-    @Override
-    public final QName getQName() {
-        return path.getLastComponent();
-    }
-
-    @Override
-    public final SchemaPath getPath() {
-        return path;
-    }
-
-    @Override
-    public final List<UnknownSchemaNode> getUnknownSchemaNodes() {
-        return unknownSchemNodes;
-    }
-
     @Override
     public final String getDescription() {
         return description;
@@ -88,8 +66,13 @@ abstract class AbstractDerivedType<T extends TypeDefinition<T>> implements Immut
 
     @Override
     public final String toString() {
-        return MoreObjects.toStringHelper(this).omitNullValues().add("baseType", baseType).add("default", defaultValue)
-                .add("description", description).add("path", path).add("reference", reference).add("status", status)
+        return MoreObjects.toStringHelper(this).omitNullValues()
+                .add("baseType", baseType)
+                .add("default", defaultValue)
+                .add("description", description)
+                .add("path", getPath())
+                .add("reference", reference)
+                .add("status", status)
                 .add("units", units).toString();
     }
 }
index 37c3821660ba362c6882129cd29de39c9c79154f..ddcb015c036f0b640374f1b68be974d5d8dda213 100644 (file)
@@ -14,4 +14,19 @@ abstract class AbstractIntegerBaseType extends AbstractRangedBaseType<IntegerTyp
     AbstractIntegerBaseType(final QName qname, final Number minValue, final Number maxValue) {
         super(qname, minValue, maxValue);
     }
+
+    @Override
+    public final int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public final boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public final String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 37c708afb4e2da95f09ce12d687fbfbfc700eed6..30bff700cdee49615498a6977740cf2a62612523 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.model.util.type;
 
-import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
@@ -36,9 +35,4 @@ abstract class AbstractRangedBaseType<T extends TypeDefinition<T>> extends Abstr
     public final List<RangeConstraint> getRangeConstraints() {
         return rangeConstraints;
     }
-
-    @Override
-    protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
-        return super.addToStringAttributes(toStringHelper).add("range", rangeConstraints);
-    }
 }
index 03ae423136a950064ac6275aaef59efc2036f83f..9d30fc9b0ebc2676e0c10cee0d4c9b80fafd3343 100644 (file)
@@ -8,25 +8,18 @@
 package org.opendaylight.yangtools.yang.model.util.type;
 
 import com.google.common.base.Preconditions;
-import com.google.common.collect.ImmutableList;
 import java.util.Collection;
-import java.util.List;
-import org.opendaylight.yangtools.concepts.Immutable;
-import org.opendaylight.yangtools.yang.common.QName;
 import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.opendaylight.yangtools.yang.model.api.Status;
 import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
 import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
 
-abstract class AbstractRestrictedType<T extends TypeDefinition<T>> implements Immutable, TypeDefinition<T> {
-    private final List<UnknownSchemaNode> unknownSchemaNodes;
+abstract class AbstractRestrictedType<T extends TypeDefinition<T>> extends AbstractTypeDefinition<T> {
     private final T baseType;
-    private final SchemaPath path;
 
     AbstractRestrictedType(final T baseType, final SchemaPath path, final Collection<UnknownSchemaNode> unknownSchemaNodes) {
+        super(path, unknownSchemaNodes);
         this.baseType = Preconditions.checkNotNull(baseType);
-        this.path = Preconditions.checkNotNull(path);
-        this.unknownSchemaNodes = ImmutableList.copyOf(unknownSchemaNodes);
     }
 
     @Override
@@ -44,21 +37,6 @@ abstract class AbstractRestrictedType<T extends TypeDefinition<T>> implements Im
         return baseType.getDefaultValue();
     }
 
-    @Override
-    public final QName getQName() {
-        return path.getLastComponent();
-    }
-
-    @Override
-    public final SchemaPath getPath() {
-        return path;
-    }
-
-    @Override
-    public final List<UnknownSchemaNode> getUnknownSchemaNodes() {
-        return unknownSchemaNodes;
-    }
-
     @Override
     public final String getDescription() {
         return baseType.getDescription();
diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractTypeDefinition.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/AbstractTypeDefinition.java
new file mode 100644 (file)
index 0000000..b601334
--- /dev/null
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2015 Pantheon Technologies 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.model.util.type;
+
+import com.google.common.base.Preconditions;
+import com.google.common.collect.ImmutableList;
+import java.util.Collection;
+import java.util.List;
+import org.opendaylight.yangtools.concepts.Immutable;
+import org.opendaylight.yangtools.yang.common.QName;
+import org.opendaylight.yangtools.yang.model.api.SchemaPath;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode;
+
+abstract class AbstractTypeDefinition<T extends TypeDefinition<T>> implements Immutable, TypeDefinition<T> {
+    private final List<UnknownSchemaNode> unknownSchemaNodes;
+    private final SchemaPath path;
+
+    AbstractTypeDefinition(final SchemaPath path, final Collection<UnknownSchemaNode> unknownSchemaNodes) {
+        this.path = Preconditions.checkNotNull(path);
+        this.unknownSchemaNodes = ImmutableList.copyOf(unknownSchemaNodes);
+    }
+
+    @Override
+    public final QName getQName() {
+        return path.getLastComponent();
+    }
+
+    @Override
+    public final SchemaPath getPath() {
+        return path;
+    }
+
+    @Override
+    public final List<UnknownSchemaNode> getUnknownSchemaNodes() {
+        return unknownSchemaNodes;
+    }
+
+    @Override
+    public abstract String toString();
+
+    @Override
+    public abstract int hashCode();
+
+    @Override
+    public abstract boolean equals(final Object obj);
+}
index 27287fdf6b3a58a66e611965873fc8fe13db217f..acecd8af18bf846a5e7bc5590c3e4bddae9110a2 100644 (file)
@@ -15,4 +15,19 @@ abstract class AbstractUnsignedBaseType extends AbstractRangedBaseType<UnsignedI
     AbstractUnsignedBaseType(final QName qname, final Number minValue, final Number maxValue) {
         super(qname, minValue, maxValue);
     }
+
+    @Override
+    public final int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public final boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public final String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index f3f554fab7d39488c5bb3698cdcf7160acc49ea2..97db47ce3e5aa840331885a8114deff48c9e8dbf 100644 (file)
@@ -24,4 +24,19 @@ final class BaseBinaryType extends AbstractBaseType<BinaryTypeDefinition> implem
     public List<LengthConstraint> getLengthConstraints() {
         return ImmutableList.of();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 055b37dfe1a7d38f9ec9601821a972ef98999552..1ea3156ed28f4375e1846ea346917cd6a08b45c0 100644 (file)
@@ -26,4 +26,19 @@ final class BaseBitsType extends AbstractBaseType<BitsTypeDefinition> implements
     public List<Bit> getBits() {
         return bits;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index a3d029e4ff30be984d38bce92c5bca49d9df0074..701f00827a158497811b223901dba07cd62af228 100644 (file)
@@ -16,4 +16,19 @@ final class BaseBooleanType extends AbstractBaseType<BooleanTypeDefinition> impl
     private BaseBooleanType() {
         super(BaseTypes.BINARY_QNAME);
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index a34ec24381cffc50dc1c69f087c8c26578a14dda..fc8df2ccbaa7cd90fe56c400589c0602edbe22ae 100644 (file)
@@ -7,7 +7,6 @@
  */
 package org.opendaylight.yangtools.yang.model.util.type;
 
-import com.google.common.base.MoreObjects.ToStringHelper;
 import com.google.common.base.Optional;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
@@ -62,7 +61,17 @@ final class BaseDecimalType extends AbstractRangedBaseType<DecimalTypeDefinition
     }
 
     @Override
-    protected ToStringHelper addToStringAttributes(final ToStringHelper toStringHelper) {
-        return super.addToStringAttributes(toStringHelper).add("fractionDigits", fractionDigits);
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
     }
 }
index b3e198271eff13c95b9615a6366f3124d56a866a..5965ce35fce6c8f15634963d6f5bdec9a9468595 100644 (file)
@@ -16,4 +16,19 @@ final class BaseEmptyType extends AbstractBaseType<EmptyTypeDefinition> implemen
     private BaseEmptyType() {
         super(BaseTypes.EMPTY_QNAME);
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index acba86a4bcfab3c45f716b4294c817ddb0c94ee8..bb76a968bdd955ac26dc391832cbb43973277acc 100644 (file)
@@ -26,4 +26,19 @@ final class BaseEnumerationType extends AbstractBaseType<EnumTypeDefinition> imp
     public List<EnumPair> getValues() {
         return values;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 373c460da8daae7d0cbc5c7701de6e45f85695b4..c22b2652982039a1b2002926b2b9058b63d1bf6a 100644 (file)
@@ -26,4 +26,19 @@ final class BaseIdentityrefType extends AbstractBaseType<IdentityrefTypeDefiniti
     public IdentitySchemaNode getIdentity() {
         return identity;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 466d00868af97669a2aeb8da4320b1a7989c3785..18caa978427c4c8dd75206eb0fa39c3775239bef 100644 (file)
@@ -29,4 +29,19 @@ final class BaseInstanceIdentifierType extends AbstractBaseType<InstanceIdentifi
     public boolean requireInstance() {
         return false;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index db504be8278f1d2173485099956573d483d6c45a..e4ea49ad96e15a44d50721fc081da73f5c0670ff 100644 (file)
@@ -26,4 +26,19 @@ final class BaseLeafrefType extends AbstractBaseType<LeafrefTypeDefinition> impl
     public RevisionAwareXPath getPathStatement() {
         return pathStatement;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 2db0125176953c7f33f18eb3b0c141b5658ca6db..ee297d6eeb96c3723532611eb126431da0ef8f2b 100644 (file)
@@ -30,4 +30,19 @@ final class BaseStringType extends AbstractBaseType<StringTypeDefinition> implem
     public List<PatternConstraint> getPatternConstraints() {
         return ImmutableList.of();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 23f4476ba4a627c503eff885408864f0731f1a4a..bbbe6ba8a8a2a4a699e937d235d5bd09a92fb574 100644 (file)
@@ -27,4 +27,19 @@ final class BaseUnionType extends AbstractBaseType<UnionTypeDefinition> implemen
     public List<TypeDefinition<?>> getTypes() {
         return types;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 6eb196c7f6d26b89211f3ef080c9dd587d67bd38..d715790db0943a32c393c680384a0f63e278ce1a 100644 (file)
@@ -26,4 +26,14 @@ final class DerivedBinaryType extends AbstractDerivedType<BinaryTypeDefinition>
     public List<LengthConstraint> getLengthConstraints() {
         return getBaseType().getLengthConstraints();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index fab4135f9b19a6895775663ace89378f8e05dc06..03f01fcaeb3400a96c2124f6f84f7ec141750127 100644 (file)
@@ -25,4 +25,14 @@ final class DerivedBitsType extends AbstractDerivedType<BitsTypeDefinition> impl
     public List<Bit> getBits() {
         return getBaseType().getBits();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index 6f100fd7aee2d40fa06d5cefd2fd56cd0953f949..f1498f4ab25f6b576cb5b32b9cdc1b41292292fb 100644 (file)
@@ -19,4 +19,14 @@ final class DerivedBooleanType extends AbstractDerivedType<BooleanTypeDefinition
         final Collection<UnknownSchemaNode> unknownSchemNodes) {
         super(baseType, path, defaultValue, description, reference, status, units, unknownSchemNodes);
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index 01ae973e382a27f4832b8f81a5274bf2d5720945..d4ef01e96c14c1ea7f310c9d5debb19a703054ac 100644 (file)
@@ -31,4 +31,14 @@ final class DerivedDecimalType extends AbstractDerivedType<DecimalTypeDefinition
     public List<RangeConstraint> getRangeConstraints() {
         return getBaseType().getRangeConstraints();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index ed885134460dee0ebdd638709e7f84ef3d45e20a..d9bca9a7ab12caba13385d4615aef2704d347288 100644 (file)
@@ -19,4 +19,14 @@ final class DerivedEmptyType extends AbstractDerivedType<EmptyTypeDefinition> im
         final Collection<UnknownSchemaNode> unknownSchemNodes) {
         super(baseType, path, defaultValue, description, reference, status, units, unknownSchemNodes);
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index a8924d4957caf9bca1717a40792b222f3e95254c..c89201995fe19992c74fc1c251770bf6250e2444 100644 (file)
@@ -25,4 +25,14 @@ final class DerivedEnumerationType extends AbstractDerivedType<EnumTypeDefinitio
     public List<EnumPair> getValues() {
         return getBaseType().getValues();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index 6e3267121e941427de8bd632aa7f8a25bf40b6a6..6dabd21a3528af17dcd135fffaec23abc9f9b605 100644 (file)
@@ -25,4 +25,14 @@ final class DerivedIdentityrefType extends AbstractDerivedType<IdentityrefTypeDe
     public IdentitySchemaNode getIdentity() {
         return getBaseType().getIdentity();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index 8b13813e6e4488c7e02a2a5092aa44099201479a..d4554bd1c7e65b6878e69567a365309658136db2 100644 (file)
@@ -34,4 +34,14 @@ final class DerivedInstanceIdentifierType extends AbstractDerivedType<InstanceId
     public boolean requireInstance() {
         return requireInstance;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index 9efc5fbcfe8b58a1f28f2635ba199d8dc5d88020..5065ada646fb607322098f0cb974f0bffdec71a9 100644 (file)
@@ -25,4 +25,14 @@ final class DerivedIntegerType extends AbstractDerivedType<IntegerTypeDefinition
     public List<RangeConstraint> getRangeConstraints() {
         return getBaseType().getRangeConstraints();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index fce65e74087abff4dfe5eac19b271885bc496b44..7204a1b3108db07307950df73d5af0d85d768690 100644 (file)
@@ -25,4 +25,14 @@ final class DerivedLeafrefType extends AbstractDerivedType<LeafrefTypeDefinition
     public RevisionAwareXPath getPathStatement() {
         return getBaseType().getPathStatement();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index b527929e8db80fa22da055fdbbc45306e66619b3..a4ea379d76c04d33c84de27f1a6008f46414bc69 100644 (file)
@@ -31,4 +31,14 @@ final class DerivedStringType extends AbstractDerivedType<StringTypeDefinition>
     public List<LengthConstraint> getLengthConstraints() {
         return getBaseType().getLengthConstraints();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index 5546769dede5a95c2f3f8348243be9d52050f214..efed275aa5f6fb7373682d247c9664c239b51835 100644 (file)
@@ -26,4 +26,14 @@ final class DerivedUnionType extends AbstractDerivedType<UnionTypeDefinition> im
     public List<TypeDefinition<?>> getTypes() {
         return getBaseType().getTypes();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index 9240c0358707a5937d8185c660d48ce0ab0d52a5..2a0c8e3f678177499df9bcb632e2259cf782e23d 100644 (file)
@@ -28,4 +28,14 @@ final class DerivedUnsignedType extends AbstractDerivedType<UnsignedIntegerTypeD
     public List<RangeConstraint> getRangeConstraints() {
         return getBaseType().getRangeConstraints();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
 }
index 4cbed792d9f13fb5ee30b97b0082c34f80b0ef7a..930f5654a7323d5611610192342ca54bbe3c7323 100644 (file)
@@ -19,4 +19,19 @@ final class RestrictedBinaryType extends AbstractLengthRestrictedType<BinaryType
             final Collection<LengthConstraint> lengthConstraints) {
         super(baseType, path, unknownSchemaNodes, lengthConstraints);
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index ea29712920f4ff07d5ae0ee94c2ffed11762a7ca..bd18e8bfc6e11272069b018fc86ba9572ed0facd 100644 (file)
@@ -23,4 +23,19 @@ final class RestrictedBitsType extends AbstractRestrictedType<BitsTypeDefinition
     public List<Bit> getBits() {
         return getBaseType().getBits();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 782b17ed42ff83dcfcf6a9a88692d7507cabaff6..41bdc1c7ba925213a6a5436380a9edeb4dd453ae 100644 (file)
@@ -17,4 +17,19 @@ final class RestrictedBooleanType extends AbstractRestrictedType<BooleanTypeDefi
             final Collection<UnknownSchemaNode> unknownSchemaNodes) {
         super(baseType, path, unknownSchemaNodes);
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 86c6d8731eca491a1d0e5f87df9a8218e40f398e..5f0826083fcb4dc9ef74316265bbcd2943962c87 100644 (file)
@@ -24,4 +24,19 @@ final class RestrictedDecimalType extends AbstractRangeRestrictedType<DecimalTyp
     public Integer getFractionDigits() {
         return getBaseType().getFractionDigits();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 08446d8dab8357b1a18bbb04dcdc319f0f33be70..7389249ba3977ca235491f585c659dc3c0b402b6 100644 (file)
@@ -17,4 +17,19 @@ final class RestrictedEmptyType extends AbstractRestrictedType<EmptyTypeDefiniti
             final Collection<UnknownSchemaNode> unknownSchemaNodes) {
         super(baseType, path, unknownSchemaNodes);
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index bc6f34d5994155368959bfab01c7b40c8957f5f5..2de1ce72297ec694402a5633e892b6ab40cf85a0 100644 (file)
@@ -23,4 +23,19 @@ final class RestrictedEnumerationType extends AbstractRestrictedType<EnumTypeDef
     public List<EnumPair> getValues() {
         return getBaseType().getValues();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index edc09ffced09f6bfa65388c4506ddf3b90d724bd..23dc92dd1ba12fbfa44f0ed83b0c65dd41ca77a4 100644 (file)
@@ -23,4 +23,19 @@ final class RestrictedIdentityrefType extends AbstractRestrictedType<Identityref
     public IdentitySchemaNode getIdentity() {
         return getBaseType().getIdentity();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 51ae0c3d526374cd1b300c14e8962da3a4d4e65e..bb609a75404c351b15f1b7684c667831eb8aba9e 100644 (file)
@@ -33,4 +33,19 @@ final class RestrictedInstanceIdentifierType extends AbstractRestrictedType<Inst
     public boolean requireInstance() {
         return requireInstance;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index a27f0093f17e44eae629dae6de145b85ea736b54..9935f24bb26e90da10a130a76afa7371b3e6b2a2 100644 (file)
@@ -18,4 +18,19 @@ final class RestrictedIntegerType extends AbstractRangeRestrictedType<IntegerTyp
         final Collection<UnknownSchemaNode> unknownSchemaNodes, final Collection<RangeConstraint> rangeConstraints) {
         super(baseType, path, unknownSchemaNodes, rangeConstraints);
     }
+
+    @Override
+    public final int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public final boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index 692a7e16d8d2a8286d27d0c1f6c20708d1608039..e3e159432068c26a1a4590e09c68d9070fd9f070 100644 (file)
@@ -23,4 +23,19 @@ final class RestrictedLeafrefType extends AbstractRestrictedType<LeafrefTypeDefi
     public RevisionAwareXPath getPathStatement() {
         return getBaseType().getPathStatement();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index cbd7e1ce47e3a66506d3ccb54b42be3913d33403..04dd026703760d2c92345231e9ed3419c7fd2d40 100644 (file)
@@ -30,4 +30,19 @@ final class RestrictedStringType extends AbstractLengthRestrictedType<StringType
     public List<PatternConstraint> getPatternConstraints() {
         return patternConstraints;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index ca7ec9118f1b7b0ae12e284f3067bd9dd9c72204..aad8dc9e6eaa37e693410ab4f336c6fcafac6d66 100644 (file)
@@ -24,4 +24,19 @@ final class RestrictedUnionType extends AbstractRestrictedType<UnionTypeDefiniti
     public List<TypeDefinition<?>> getTypes() {
         return getBaseType().getTypes();
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
index a1c214c58662ffbf293717e15b5711ef6ab7d35d..f2e295adf795a674641d045575dfd47a82bc2e56 100644 (file)
@@ -29,4 +29,19 @@ final class RestrictedUnsignedType extends AbstractRestrictedType<UnsignedIntege
     public List<RangeConstraint> getRangeConstraints() {
         return rangeConstraints;
     }
+
+    @Override
+    public int hashCode() {
+        return TypeDefinitions.hashCode(this);
+    }
+
+    @Override
+    public boolean equals(final Object obj) {
+        return TypeDefinitions.equals(this, obj);
+    }
+
+    @Override
+    public String toString() {
+        return TypeDefinitions.toString(this);
+    }
 }
diff --git a/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/TypeDefinitions.java b/yang/yang-model-util/src/main/java/org/opendaylight/yangtools/yang/model/util/type/TypeDefinitions.java
new file mode 100644 (file)
index 0000000..117375d
--- /dev/null
@@ -0,0 +1,288 @@
+/*
+ * Copyright (c) 2015 Pantheon Technologies 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.model.util.type;
+
+import com.google.common.base.MoreObjects;
+import com.google.common.base.MoreObjects.ToStringHelper;
+import java.util.Objects;
+import org.opendaylight.yangtools.yang.model.api.TypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BinaryTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BitsTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.BooleanTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.DecimalTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EmptyTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.EnumTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.InstanceIdentifierTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.IntegerTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.StringTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.UnionTypeDefinition;
+import org.opendaylight.yangtools.yang.model.api.type.UnsignedIntegerTypeDefinition;
+
+// TODO: this should be in the API package, as it defines equality for TypeDefinitions
+final class TypeDefinitions {
+    private TypeDefinitions() {
+        throw new UnsupportedOperationException();
+    }
+
+    private static int basicHashCode(final TypeDefinition<?> type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue());
+    }
+
+    private static <T extends TypeDefinition<T>> T castIfEquals(final Class<T> clazz, final T type, final Object obj) {
+        if (!clazz.isInstance(obj)) {
+            return null;
+        }
+
+        final T other = clazz.cast(obj);
+        return Objects.equals(type.getPath(), other.getPath())
+                && Objects.equals(type.getBaseType(), other.getBaseType())
+                && Objects.equals(type.getDefaultValue(), other.getDefaultValue())
+                && Objects.equals(type.getUnknownSchemaNodes(), other.getUnknownSchemaNodes())
+                && Objects.equals(type.getUnits(), other.getUnits()) ? other : null;
+    }
+
+    private static ToStringHelper toStringHelper(final TypeDefinition<?> type) {
+        return MoreObjects.toStringHelper(type).omitNullValues()
+                .add("baseType", type.getBaseType())
+                .add("default", type.getDefaultValue())
+                .add("description", type.getDescription())
+                .add("path", type.getPath())
+                .add("reference", type.getReference())
+                .add("status", type.getStatus())
+                .add("units", type.getUnits());
+    }
+
+    static int hashCode(final BinaryTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getLengthConstraints());
+    }
+
+    static boolean equals(final BinaryTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final BinaryTypeDefinition other = castIfEquals(BinaryTypeDefinition.class, type, obj);
+        return other != null && type.getLengthConstraints().equals(other.getLengthConstraints());
+    }
+
+    static String toString(final BinaryTypeDefinition type) {
+        return toStringHelper(type).add("length", type.getLengthConstraints()).toString();
+    }
+
+    static int hashCode(final BitsTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getBits());
+    }
+
+    static boolean equals(final BitsTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final BitsTypeDefinition other = castIfEquals(BitsTypeDefinition.class, type, obj);
+        return other != null && type.getBits().equals(other.getBits());
+    }
+
+    static String toString(final BitsTypeDefinition type) {
+        return toStringHelper(type).add("bits", type.getBits()).toString();
+    }
+
+    static int hashCode(final BooleanTypeDefinition type) {
+        return basicHashCode(type);
+    }
+
+    static boolean equals(final BooleanTypeDefinition type, final Object obj) {
+        return type == obj || castIfEquals(BooleanTypeDefinition.class, type, obj) != null;
+    }
+
+    static String toString(final BooleanTypeDefinition type) {
+        return toStringHelper(type).toString();
+    }
+
+    static int hashCode(final DecimalTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getFractionDigits(), type.getRangeConstraints());
+    }
+
+    static boolean equals(final DecimalTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final DecimalTypeDefinition other = castIfEquals(DecimalTypeDefinition.class, type, obj);
+        return other != null && type.getFractionDigits().equals(other.getFractionDigits())
+                && type.getRangeConstraints().equals(other.getRangeConstraints());
+    }
+
+    static String toString(final DecimalTypeDefinition type) {
+        return toStringHelper(type).add("fractionDigits", type.getFractionDigits())
+                .add("range", type.getRangeConstraints()).toString();
+    }
+
+    static int hashCode(final EmptyTypeDefinition type) {
+        return basicHashCode(type);
+    }
+
+    static boolean equals(final EmptyTypeDefinition type, final Object obj) {
+        return type == obj || castIfEquals(EmptyTypeDefinition.class, type, obj) != null;
+    }
+
+    static String toString(final EmptyTypeDefinition type) {
+        return toStringHelper(type).toString();
+    }
+
+    static int hashCode(final EnumTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getValues());
+    }
+
+    static boolean equals(final EnumTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final EnumTypeDefinition other = castIfEquals(EnumTypeDefinition.class, type, obj);
+        return other != null && type.getValues().equals(other.getValues());
+    }
+
+    static String toString(final EnumTypeDefinition type) {
+        return toStringHelper(type).add("values", type.getValues()).toString();
+    }
+
+    static int hashCode(final IdentityrefTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getIdentity());
+    }
+
+    static boolean equals(final IdentityrefTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final IdentityrefTypeDefinition other = castIfEquals(IdentityrefTypeDefinition.class, type, obj);
+        return other != null && type.getIdentity().equals(other.getIdentity());
+    }
+
+    static String toString(final IdentityrefTypeDefinition type) {
+        return toStringHelper(type).add("identity", type.getIdentity()).toString();
+    }
+
+    static int hashCode(final InstanceIdentifierTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.requireInstance());
+    }
+
+    static boolean equals(final InstanceIdentifierTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final InstanceIdentifierTypeDefinition other = castIfEquals(InstanceIdentifierTypeDefinition.class, type, obj);
+        return other != null && type.requireInstance() == other.requireInstance();
+    }
+
+    static String toString(final InstanceIdentifierTypeDefinition type) {
+        return toStringHelper(type).add("requireInstance", type.requireInstance()).toString();
+    }
+
+    static int hashCode(final IntegerTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getRangeConstraints());
+    }
+
+    static boolean equals(final IntegerTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final IntegerTypeDefinition other = castIfEquals(IntegerTypeDefinition.class, type, obj);
+        return other != null && type.getRangeConstraints().equals(other.getRangeConstraints());
+    }
+
+    static String toString(final IntegerTypeDefinition type) {
+        return toStringHelper(type).add("range", type.getRangeConstraints()).toString();
+    }
+
+    static int hashCode(final LeafrefTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getPathStatement());
+    }
+
+    static boolean equals(final LeafrefTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final LeafrefTypeDefinition other =castIfEquals(LeafrefTypeDefinition.class, type, obj);
+        return other != null && type.getPathStatement().equals(other.getPathStatement());
+    }
+
+    static String toString(final LeafrefTypeDefinition type) {
+        return toStringHelper(type).add("pathStatement", type.getPathStatement()).toString();
+    }
+
+    static int hashCode(final StringTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getLengthConstraints(), type.getPatternConstraints());
+    }
+
+    static boolean equals(final StringTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final StringTypeDefinition other = castIfEquals(StringTypeDefinition.class, type, obj);
+        return other != null && type.getLengthConstraints().equals(other.getLengthConstraints())
+                && type.getPatternConstraints().equals(other.getPatternConstraints());
+    }
+
+    static String toString(final StringTypeDefinition type) {
+        return toStringHelper(type).add("length", type.getLengthConstraints())
+                .add("patterns", type.getPatternConstraints()).toString();
+    }
+
+    static int hashCode(final UnionTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getTypes());
+    }
+
+    static boolean equals(final UnionTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final UnionTypeDefinition other = castIfEquals(UnionTypeDefinition.class, type, obj);
+        return other != null && type.getTypes().equals(other.getTypes());
+    }
+
+    static String toString(final UnionTypeDefinition type) {
+        return toStringHelper(type).add("types", type.getTypes()).toString();
+    }
+
+    static int hashCode(final UnsignedIntegerTypeDefinition type) {
+        return Objects.hash(type.getPath(), type.getUnknownSchemaNodes(), type.getBaseType(), type.getUnits(),
+            type.getDefaultValue(), type.getRangeConstraints());
+    }
+
+    static boolean equals(final UnsignedIntegerTypeDefinition type, final Object obj) {
+        if (type == obj) {
+            return true;
+        }
+
+        final UnsignedIntegerTypeDefinition other = castIfEquals(UnsignedIntegerTypeDefinition.class, type, obj);
+        return other != null && type.getRangeConstraints().equals(other.getRangeConstraints());
+    }
+
+    static String toString(final UnsignedIntegerTypeDefinition type) {
+        return toStringHelper(type).add("range", type.getRangeConstraints()).toString();
+    }
+}