From f52635da13db23504dfb68e57c25980d93e1a713 Mon Sep 17 00:00:00 2001 From: Oliver Gierke Date: Wed, 2 Apr 2014 09:38:02 +0200 Subject: [PATCH] DATACMNS-485 - Fixed bug in ParameterizedTypeInformation.hashCode(). Previously, ParameterizedTypeInformation.hashCode() had been inconsistent to equals in case of a fully resolved parameterized type. This is now fixed by not including the parent reference in case a parameterized type is resolved completely. Also, TypeDiscoverer.getActualType() does not return the component type for non-collection/non-maps anymore to make sure we don't accidentally unwrap parameterized types. --- .../util/ParameterizedTypeInformation.java | 2 +- .../data/util/TypeDiscoverer.java | 8 +--- .../data/util/ParameterizedTypeUnitTests.java | 37 +++++++++++++++++++ 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/springframework/data/util/ParameterizedTypeInformation.java b/src/main/java/org/springframework/data/util/ParameterizedTypeInformation.java index 4dd87781e..65e64c542 100644 --- a/src/main/java/org/springframework/data/util/ParameterizedTypeInformation.java +++ b/src/main/java/org/springframework/data/util/ParameterizedTypeInformation.java @@ -181,7 +181,7 @@ class ParameterizedTypeInformation extends ParentTypeAwareTypeInformation */ @Override public int hashCode() { - return super.hashCode() + (isResolvedCompletely() ? this.type.hashCode() : 0); + return isResolvedCompletely() ? this.type.hashCode() : super.hashCode(); } /* diff --git a/src/main/java/org/springframework/data/util/TypeDiscoverer.java b/src/main/java/org/springframework/data/util/TypeDiscoverer.java index 34fbb7df6..18be3d871 100644 --- a/src/main/java/org/springframework/data/util/TypeDiscoverer.java +++ b/src/main/java/org/springframework/data/util/TypeDiscoverer.java @@ -284,13 +284,7 @@ class TypeDiscoverer implements TypeInformation { return getComponentType(); } - List> arguments = getTypeArguments(); - - if (arguments.isEmpty()) { - return this; - } - - return arguments.get(arguments.size() - 1); + return this; } /* diff --git a/src/test/java/org/springframework/data/util/ParameterizedTypeUnitTests.java b/src/test/java/org/springframework/data/util/ParameterizedTypeUnitTests.java index de1363d8e..3f9222a11 100644 --- a/src/test/java/org/springframework/data/util/ParameterizedTypeUnitTests.java +++ b/src/test/java/org/springframework/data/util/ParameterizedTypeUnitTests.java @@ -95,6 +95,31 @@ public class ParameterizedTypeUnitTests { is("org.springframework.data.util.ParameterizedTypeUnitTests$Localized")); } + /** + * @see DATACMNS-485 + */ + @Test + @SuppressWarnings("rawtypes") + public void hashCodeShouldBeConsistentWithEqualsForResolvedTypes() { + + TypeInformation first = from(First.class).getProperty("property"); + TypeInformation second = from(Second.class).getProperty("property"); + + assertThat(first, is(second)); + assertThat(first.hashCode(), is(second.hashCode())); + } + + /** + * @see DATACMNS-485 + */ + @Test + @SuppressWarnings("rawtypes") + public void getActualTypeShouldNotUnwrapParameterizedTypes() { + + TypeInformation type = from(First.class).getProperty("property"); + assertThat(type.getActualType(), is(type)); + } + @SuppressWarnings("serial") class Localized extends HashMap { S value; @@ -109,4 +134,16 @@ public class ParameterizedTypeUnitTests { Localized param; Localized2 param2; } + + class Parameterized { + T property; + } + + class First { + Parameterized property; + } + + class Second { + Parameterized property; + } }