From: <iro...@us...> - 2009-10-21 00:00:45
|
Revision: 166 http://pojomatic.svn.sourceforge.net/pojomatic/?rev=166&view=rev Author: iroberts Date: 2009-10-21 00:00:37 +0000 (Wed, 21 Oct 2009) Log Message: ----------- Stop calling other.equals(this); just rely on whether the ClassProperties for the pojoClass believes that instances of other.getClass() can be equal to instances of pojoClass. Modified Paths: -------------- trunk/PojomaticAll/Pojomatic/src/main/java/org/pojomatic/internal/ClassProperties.java trunk/PojomaticAll/Pojomatic/src/main/java/org/pojomatic/internal/PojomatorImpl.java trunk/PojomaticAll/Pojomatic/src/test/java/org/pojomatic/internal/ClassPropertiesTest.java trunk/PojomaticAll/Pojomatic/src/test/java/org/pojomatic/internal/PojomatorImplTest.java Modified: trunk/PojomaticAll/Pojomatic/src/main/java/org/pojomatic/internal/ClassProperties.java =================================================================== --- trunk/PojomaticAll/Pojomatic/src/main/java/org/pojomatic/internal/ClassProperties.java 2009-10-19 06:57:37 UTC (rev 165) +++ trunk/PojomaticAll/Pojomatic/src/main/java/org/pojomatic/internal/ClassProperties.java 2009-10-21 00:00:37 UTC (rev 166) @@ -28,6 +28,7 @@ private final static SelfPopulatingMap<Class<?>, ClassProperties> INSTANCES = new SelfPopulatingMap<Class<?>, ClassProperties>() { + @Override protected ClassProperties create(Class<?> key) { return new ClassProperties(key); } @@ -108,25 +109,26 @@ } /** - * Get the class which any class must inherit from in order for its instances to be candidates for - * being considered equal by {@link PojomatorImpl#doEquals(Object, Object)}. - * @return the class which any class must inherit from in order for its instances to be candidates - * for being considered equal by {@link PojomatorImpl#doEquals(Object, Object)}. + * Whether instances of {@code otherClass} are candidates for being equal to instances of + * {@code pojoClass} + * @param otherClass + * @return {@code true} if instances of {@code otherClass} are candidates for being equal to + * instances of {@code pojoClass}, or {@code false} otherwise. */ - public Class<?> getEqualsParentClass() { - return equalsParentClass; + public boolean isCompatibleForEquals(Class<?> otherClass) { + if (!equalsParentClass.isAssignableFrom(otherClass)) { + return false; + } + else { + if (!subclassCanOverrideEquals) { + return true; + } + else { + return equalsParentClass.equals(forClass(otherClass).equalsParentClass); + } + } } - /** - * Whether subclasses of this class can override the {@link Object#equals(Object)} method defined - * in {@code pojoClass}. - * @return {@code true} if subclasses of this class can override the {@link Object#equals(Object)} - * method defined in {@code pojoClass}, and {@code false} otherwise. - */ - public boolean subclassCanOverrideEquals() { - return subclassCanOverrideEquals; - } - private void walkHierarchy( Class<?> clazz, OverridableMethods overridableMethods, @@ -145,8 +147,8 @@ OverridableMethods overridableMethods, ClassContributionTracker classContributionTracker) { AutoProperty autoProperty = clazz.getAnnotation(AutoProperty.class); - final DefaultPojomaticPolicy classPolicy = - (autoProperty != null) ? autoProperty.policy() : null; + final DefaultPojomaticPolicy classPolicy = + (autoProperty != null) ? autoProperty.policy() : null; final AutoDetectPolicy autoDetectPolicy = (autoProperty != null) ? autoProperty.autoDetect() : null; @@ -174,7 +176,7 @@ continue; } } - + PojomaticPolicy propertyPolicy = null; if (property != null) { if (!methodSignatureIsAccessor(method)) { @@ -203,7 +205,7 @@ } private void extractFields( - Class<?> clazz, + Class<?> clazz, final DefaultPojomaticPolicy classPolicy, final AutoDetectPolicy autoDetectPolicy, final ClassContributionTracker classContributionTracker) { @@ -219,7 +221,7 @@ continue; } } - + final PojomaticPolicy propertyPolicy = (property != null) ? property.policy() : null; /* add all fields that are explicitly annotated or auto-detected */ Modified: trunk/PojomaticAll/Pojomatic/src/main/java/org/pojomatic/internal/PojomatorImpl.java =================================================================== --- trunk/PojomaticAll/Pojomatic/src/main/java/org/pojomatic/internal/PojomatorImpl.java 2009-10-19 06:57:37 UTC (rev 165) +++ trunk/PojomaticAll/Pojomatic/src/main/java/org/pojomatic/internal/PojomatorImpl.java 2009-10-21 00:00:37 UTC (rev 166) @@ -80,10 +80,10 @@ * is a an instance of a proper subclass of the class of {@code instance}, then this method * returns the result of calling {@code other.equals(instance)}. Otherwise, it is verified that * the class of {@code other} either the same as or a subclass of the most specific class - * contributing a property with a {@code PojomaticPolicy} other than {@code TO_STRING} or + * contributing a property with a {@code PojomaticPolicy} other than {@code TO_STRING} or * {@code NONE}; if not, then this method * returns false. Otherwise, this method will return true provided that each property of {@code - * instance} which has a {@code PojomaticPolicy} other than {@code TO_STRING} or + * instance} which has a {@code PojomaticPolicy} other than {@code TO_STRING} or * {@code NONE} is equal to the corresponding property of {@code other} in the following sense: * <ul> * <li>Both are {@code null}, or</li> @@ -110,15 +110,8 @@ return false; } if (!instance.getClass().equals(other.getClass())) { - if (classProperties.subclassCanOverrideEquals()) { - if (instance.getClass().isAssignableFrom(other.getClass())) { - return other.equals(instance); - } - if ((!classProperties.getEqualsParentClass().isAssignableFrom(other.getClass())) - || !classProperties.getEqualsParentClass().equals( - ClassProperties.forClass(other.getClass()).getEqualsParentClass())) { - return false; - } + if (!classProperties.isCompatibleForEquals(other.getClass())) { + return false; } } Modified: trunk/PojomaticAll/Pojomatic/src/test/java/org/pojomatic/internal/ClassPropertiesTest.java =================================================================== --- trunk/PojomaticAll/Pojomatic/src/test/java/org/pojomatic/internal/ClassPropertiesTest.java 2009-10-19 06:57:37 UTC (rev 165) +++ trunk/PojomaticAll/Pojomatic/src/test/java/org/pojomatic/internal/ClassPropertiesTest.java 2009-10-21 00:00:37 UTC (rev 166) @@ -257,52 +257,33 @@ assertEquals(asSet(getFoo, baz), asSet(classProperties.getEqualsProperties())); } - @Test public void testSubclassCanOverrideEqualsForClasses() { - class Parent { @Property int getX() { return 3; } } // simplify subsequent class defs - - class Unannotated extends Parent {} - @SubclassCanOverrideEquals class Annotated extends Parent {} - @SubclassCanOverrideEquals(true) class AnnotatedWithTrue extends Parent {} - @SubclassCanOverrideEquals(false) class AnnotatedWithFalse extends Parent {} - - assertTrue(ClassProperties.forClass(Unannotated.class).subclassCanOverrideEquals()); - assertTrue(ClassProperties.forClass(Annotated.class).subclassCanOverrideEquals()); - assertTrue(ClassProperties.forClass(AnnotatedWithTrue.class).subclassCanOverrideEquals()); - assertFalse(ClassProperties.forClass(AnnotatedWithFalse.class).subclassCanOverrideEquals()); - } - - @Test public void testSubclassCanOverrideEqualsForInterfaces() { - assertFalse(ClassProperties.forClass(UnannotatedInterface.class).subclassCanOverrideEquals()); - assertTrue(ClassProperties.forClass(AnnotatedInterface.class).subclassCanOverrideEquals()); - assertTrue(ClassProperties.forClass(AnnotatedInterfaceWithTrue.class).subclassCanOverrideEquals()); - assertFalse(ClassProperties.forClass(AnnotatedInterfaceWithFalse.class).subclassCanOverrideEquals()); - } - - @Test public void testEqualsParentClassForInterface() { - assertEquals( - UnannotatedInterface.class, - ClassProperties.forClass(UnannotatedInterface.class).getEqualsParentClass()); - } - - @Test public void testEqualsParentClassForClasses() { - class Parent { @Property int getX() { return 3; } } + @Test public void testIsCompatibleForEquals() { + class Parent { @SuppressWarnings("unused") @Property int getX() { return 3; } } class NonContributingChild extends Parent {} @OverridesEquals class AnnotatedNonContributingChild extends Parent {} - class ContributingChild extends Parent{ @Property int getY() { return 3; } } + class ContributingChild extends Parent{ @SuppressWarnings("unused") @Property int getY() { return 3; } } class ChildOfContributingChild extends ContributingChild{} - assertEquals(Parent.class, ClassProperties.forClass(Parent.class).getEqualsParentClass()); - assertEquals( - Parent.class, ClassProperties.forClass(NonContributingChild.class).getEqualsParentClass()); - assertEquals( - AnnotatedNonContributingChild.class, - ClassProperties.forClass(AnnotatedNonContributingChild.class).getEqualsParentClass()); - assertEquals( - ContributingChild.class, - ClassProperties.forClass(ContributingChild.class).getEqualsParentClass()); - assertEquals( - ContributingChild.class, - ClassProperties.forClass(ChildOfContributingChild.class).getEqualsParentClass()); + @SuppressWarnings("unchecked") + List<List<Class<?>>> partitions = Arrays.asList( + Arrays.<Class<?>>asList(Parent.class, NonContributingChild.class), + Arrays.<Class<?>>asList(ContributingChild.class, ChildOfContributingChild.class), + Arrays.<Class<?>>asList(AnnotatedNonContributingChild.class), + Arrays.<Class<?>>asList(Interface.class)); + for (List<Class<?>> partition: partitions) { + for (Class<?> clazz: partition) { + for(List<Class<?>> otherPartition: partitions) { + for(Class<?> otherClazz: otherPartition) { + if (partition == otherPartition) { + assertTrue(ClassProperties.forClass(clazz).isCompatibleForEquals(otherClazz)); + } + else { + assertFalse(ClassProperties.forClass(clazz).isCompatibleForEquals(otherClazz)); + } + } + } + } + } } //Not all classes can be made internal. In particular, autodetect=FIELD classes cannot, because of the synthetic Modified: trunk/PojomaticAll/Pojomatic/src/test/java/org/pojomatic/internal/PojomatorImplTest.java =================================================================== --- trunk/PojomaticAll/Pojomatic/src/test/java/org/pojomatic/internal/PojomatorImplTest.java 2009-10-19 06:57:37 UTC (rev 165) +++ trunk/PojomaticAll/Pojomatic/src/test/java/org/pojomatic/internal/PojomatorImplTest.java 2009-10-21 00:00:37 UTC (rev 166) @@ -334,6 +334,7 @@ HASH_CODE_MULTIPLIER + 2)*HASH_CODE_MULTIPLIER + "hello".hashCode(), pojomator.doHashCode(new Impl1())); assertTrue(pojomator.doEquals(new Impl1(), new Impl2("hello"))); assertFalse(pojomator.doEquals(new Impl1(), new Impl2("goodbye"))); + assertFalse(pojomator.doEquals(new Impl1(), "not even in the right hierarchy")); } @PojoFormat(SimplePojoFormatter.class) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |