From 37c20df721522b175bc9df3f06a361297010df5e Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 4 May 2015 20:58:47 +0200 Subject: [PATCH 1/7] Reference constants in a non static way to align the retention value with the target value. --- .../java/org/apache/commons/lang3/builder/EqualsExclude.java | 4 ++-- .../org/apache/commons/lang3/builder/HashCodeExclude.java | 4 ++-- .../org/apache/commons/lang3/builder/ToStringExclude.java | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/builder/EqualsExclude.java b/src/main/java/org/apache/commons/lang3/builder/EqualsExclude.java index f71616fb1..52edebb75 100755 --- a/src/main/java/org/apache/commons/lang3/builder/EqualsExclude.java +++ b/src/main/java/org/apache/commons/lang3/builder/EqualsExclude.java @@ -19,13 +19,13 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * Use this annotation to builds a equals excluding the annotated field. */ -@Retention(RUNTIME) +@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface EqualsExclude { diff --git a/src/main/java/org/apache/commons/lang3/builder/HashCodeExclude.java b/src/main/java/org/apache/commons/lang3/builder/HashCodeExclude.java index adc2eb49c..369f0bcad 100755 --- a/src/main/java/org/apache/commons/lang3/builder/HashCodeExclude.java +++ b/src/main/java/org/apache/commons/lang3/builder/HashCodeExclude.java @@ -19,13 +19,13 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import static java.lang.annotation.RetentionPolicy.RUNTIME; /** * Use this annotation to builds a hash code excluding the annotated field. */ -@Retention(RUNTIME) +@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface HashCodeExclude { diff --git a/src/main/java/org/apache/commons/lang3/builder/ToStringExclude.java b/src/main/java/org/apache/commons/lang3/builder/ToStringExclude.java index 0e26c4927..4b7359909 100755 --- a/src/main/java/org/apache/commons/lang3/builder/ToStringExclude.java +++ b/src/main/java/org/apache/commons/lang3/builder/ToStringExclude.java @@ -20,12 +20,12 @@ import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.Target; -import static java.lang.annotation.RetentionPolicy.RUNTIME; +import java.lang.annotation.RetentionPolicy; /** * Use this annotation to builds a String excluding the annotated field. */ -@Retention(RUNTIME) +@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ToStringExclude { From 758f5677a1f219f68ad0036b65498083efadb615 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 4 May 2015 21:06:30 +0200 Subject: [PATCH 2/7] Better JavaDoc for EqualsExclude --- .../apache/commons/lang3/builder/EqualsBuilder.java | 11 +++++++++++ .../apache/commons/lang3/builder/EqualsExclude.java | 4 +++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java b/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java index be8f4f1ce..7551b0daa 100644 --- a/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java +++ b/src/main/java/org/apache/commons/lang3/builder/EqualsBuilder.java @@ -77,6 +77,9 @@ * return EqualsBuilder.reflectionEquals(this, obj); * } * + * + *

The {@link EqualsExclude} annotation can be used to exclude fields from being + * used by the reflectionEquals methods.

* * @since 1.0 * @version $Id$ @@ -245,6 +248,8 @@ public EqualsBuilder() { * @param rhs the other object * @param excludeFields Collection of String field names to exclude from testing * @return true if the two Objects have tested equals. + * + * @see EqualsExclude */ public static boolean reflectionEquals(final Object lhs, final Object rhs, final Collection excludeFields) { return reflectionEquals(lhs, rhs, ReflectionToStringBuilder.toNoNullStringArray(excludeFields)); @@ -269,6 +274,8 @@ public static boolean reflectionEquals(final Object lhs, final Object rhs, final * @param rhs the other object * @param excludeFields array of field names to exclude from testing * @return true if the two Objects have tested equals. + * + * @see EqualsExclude */ public static boolean reflectionEquals(final Object lhs, final Object rhs, final String... excludeFields) { return reflectionEquals(lhs, rhs, false, null, excludeFields); @@ -294,6 +301,8 @@ public static boolean reflectionEquals(final Object lhs, final Object rhs, final * @param rhs the other object * @param testTransients whether to include transient fields * @return true if the two Objects have tested equals. + * + * @see EqualsExclude */ public static boolean reflectionEquals(final Object lhs, final Object rhs, final boolean testTransients) { return reflectionEquals(lhs, rhs, testTransients, null); @@ -324,6 +333,8 @@ public static boolean reflectionEquals(final Object lhs, final Object rhs, final * may be null * @param excludeFields array of field names to exclude from testing * @return true if the two Objects have tested equals. + * + * @see EqualsExclude * @since 2.0 */ public static boolean reflectionEquals(final Object lhs, final Object rhs, final boolean testTransients, final Class reflectUpToClass, diff --git a/src/main/java/org/apache/commons/lang3/builder/EqualsExclude.java b/src/main/java/org/apache/commons/lang3/builder/EqualsExclude.java index 52edebb75..1ed29f05d 100755 --- a/src/main/java/org/apache/commons/lang3/builder/EqualsExclude.java +++ b/src/main/java/org/apache/commons/lang3/builder/EqualsExclude.java @@ -23,7 +23,9 @@ import java.lang.annotation.Target; /** - * Use this annotation to builds a equals excluding the annotated field. + * Use this annotation to exclude a field from being being used by + * the various reflectionEquals methods defined on + * {@link EqualsBuilder}. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) From 0e67448f8b7d6a3b606d6c6d31574ed5329271f9 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 4 May 2015 21:12:20 +0200 Subject: [PATCH 3/7] Better JavaDoc for HashCodeExclude --- .../commons/lang3/builder/HashCodeBuilder.java | 15 +++++++++++++++ .../commons/lang3/builder/HashCodeExclude.java | 4 +++- 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java b/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java index fbbd110a6..a2956a5a0 100644 --- a/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java +++ b/src/main/java/org/apache/commons/lang3/builder/HashCodeBuilder.java @@ -94,6 +94,9 @@ * return HashCodeBuilder.reflectionHashCode(this); * } * + * + *

The {@link HashCodeExclude} annotation can be used to exclude fields from being + * used by the reflectionHashCode methods.

* * @since 1.0 * @version $Id$ @@ -246,6 +249,8 @@ private static void reflectionAppend(final Object object, final Class clazz, * if the Object is null * @throws IllegalArgumentException * if the number is zero or even + * + * @see HashCodeExclude */ public static int reflectionHashCode(final int initialNonZeroOddNumber, final int multiplierNonZeroOddNumber, final Object object) { return reflectionHashCode(initialNonZeroOddNumber, multiplierNonZeroOddNumber, object, false, null); @@ -290,6 +295,8 @@ public static int reflectionHashCode(final int initialNonZeroOddNumber, final in * if the Object is null * @throws IllegalArgumentException * if the number is zero or even + * + * @see HashCodeExclude */ public static int reflectionHashCode(final int initialNonZeroOddNumber, final int multiplierNonZeroOddNumber, final Object object, final boolean testTransients) { @@ -342,6 +349,8 @@ public static int reflectionHashCode(final int initialNonZeroOddNumber, final in * if the Object is null * @throws IllegalArgumentException * if the number is zero or even + * + * @see HashCodeExclude * @since 2.0 */ public static int reflectionHashCode(final int initialNonZeroOddNumber, final int multiplierNonZeroOddNumber, final T object, @@ -392,6 +401,8 @@ public static int reflectionHashCode(final int initialNonZeroOddNumber, fina * @return int hash code * @throws IllegalArgumentException * if the object is null + * + * @see HashCodeExclude */ public static int reflectionHashCode(final Object object, final boolean testTransients) { return reflectionHashCode(DEFAULT_INITIAL_VALUE, DEFAULT_MULTIPLIER_VALUE, object, @@ -430,6 +441,8 @@ public static int reflectionHashCode(final Object object, final boolean testTran * @return int hash code * @throws IllegalArgumentException * if the object is null + * + * @see HashCodeExclude */ public static int reflectionHashCode(final Object object, final Collection excludeFields) { return reflectionHashCode(object, ReflectionToStringBuilder.toNoNullStringArray(excludeFields)); @@ -469,6 +482,8 @@ public static int reflectionHashCode(final Object object, final Collectionnull + * + * @see HashCodeExclude */ public static int reflectionHashCode(final Object object, final String... excludeFields) { return reflectionHashCode(DEFAULT_INITIAL_VALUE, DEFAULT_MULTIPLIER_VALUE, object, false, diff --git a/src/main/java/org/apache/commons/lang3/builder/HashCodeExclude.java b/src/main/java/org/apache/commons/lang3/builder/HashCodeExclude.java index 369f0bcad..25bac4c20 100755 --- a/src/main/java/org/apache/commons/lang3/builder/HashCodeExclude.java +++ b/src/main/java/org/apache/commons/lang3/builder/HashCodeExclude.java @@ -23,7 +23,9 @@ import java.lang.annotation.Target; /** - * Use this annotation to builds a hash code excluding the annotated field. + * Use this annotation to exclude a field from being being used by + * the various reflectionHashcode methods defined on + * {@link HashCodeBuilder}. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) From f24344c2578a829acdfec914db27a5bbe0fc09f7 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 4 May 2015 21:21:32 +0200 Subject: [PATCH 4/7] Better JavaDoc for ToStringExclude --- .../lang3/builder/ReflectionToStringBuilder.java | 14 ++++++++++++++ .../commons/lang3/builder/ToStringExclude.java | 3 ++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java b/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java index 59044699e..83dba01c4 100644 --- a/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java +++ b/src/main/java/org/apache/commons/lang3/builder/ReflectionToStringBuilder.java @@ -79,6 +79,10 @@ * } * *

+ * Alternatively the {@link ToStringExclude} annotation can be used to exclude fields from being incorporated in the + * result. + *

+ *

* The exact format of the toString is determined by the {@link ToStringStyle} passed into the constructor. *

* @@ -113,6 +117,8 @@ public class ReflectionToStringBuilder extends ToStringBuilder { * @return the String result * @throws IllegalArgumentException * if the Object is null + * + * @see ToStringExclude */ public static String toString(final Object object) { return toString(object, null, false, false, null); @@ -145,6 +151,8 @@ public static String toString(final Object object) { * @return the String result * @throws IllegalArgumentException * if the Object or ToStringStyle is null + * + * @see ToStringExclude */ public static String toString(final Object object, final ToStringStyle style) { return toString(object, style, false, false, null); @@ -183,6 +191,8 @@ public static String toString(final Object object, final ToStringStyle style) { * @return the String result * @throws IllegalArgumentException * if the Object is null + * + * @see ToStringExclude */ public static String toString(final Object object, final ToStringStyle style, final boolean outputTransients) { return toString(object, style, outputTransients, false, null); @@ -228,6 +238,8 @@ public static String toString(final Object object, final ToStringStyle style, fi * @return the String result * @throws IllegalArgumentException * if the Object is null + * + * @see ToStringExclude * @since 2.1 */ public static String toString(final Object object, final ToStringStyle style, final boolean outputTransients, final boolean outputStatics) { @@ -279,6 +291,8 @@ public static String toString(final Object object, final ToStringStyle style, fi * @return the String result * @throws IllegalArgumentException * if the Object is null + * + * @see ToStringExclude * @since 2.1 */ public static String toString( diff --git a/src/main/java/org/apache/commons/lang3/builder/ToStringExclude.java b/src/main/java/org/apache/commons/lang3/builder/ToStringExclude.java index 4b7359909..c080e317a 100755 --- a/src/main/java/org/apache/commons/lang3/builder/ToStringExclude.java +++ b/src/main/java/org/apache/commons/lang3/builder/ToStringExclude.java @@ -23,7 +23,8 @@ import java.lang.annotation.RetentionPolicy; /** - * Use this annotation to builds a String excluding the annotated field. + * Use this annotation to exclude a field from being being used by + * the {@link ReflectionToStringBuilder}. */ @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) From f175a241c811d2d0843026b2dde5c3ae308cfb95 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 4 May 2015 21:37:51 +0200 Subject: [PATCH 5/7] Inline unnecessary local methods --- ...ectionToStringBuilderExcludeWithAnnotationTest.java | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java index f6b62bcfd..acf7c2cb7 100755 --- a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java +++ b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java @@ -46,17 +46,11 @@ class TestFixture { @Test public void test_toStringExclude() { final String toString = ReflectionToStringBuilder.toString(new TestFixture()); - this.validateSecretFieldAbsent(toString); - } - private void validateNonSecretField(final String toString) { + Assert.assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(SECRET_FIELD)); + Assert.assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(SECRET_VALUE)); Assert.assertTrue(toString.indexOf(NOT_SECRET_FIELD) > ArrayUtils.INDEX_NOT_FOUND); Assert.assertTrue(toString.indexOf(NOT_SECRET_VALUE) > ArrayUtils.INDEX_NOT_FOUND); } - private void validateSecretFieldAbsent(final String toString) { - Assert.assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(SECRET_FIELD)); - Assert.assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(SECRET_VALUE)); - this.validateNonSecretField(toString); - } } From ea1a69d638d97d5ffc451b32d240479357e02b0a Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 4 May 2015 21:42:50 +0200 Subject: [PATCH 6/7] Use hamcrest matchers for better readability of assertions --- ...onToStringBuilderExcludeWithAnnotationTest.java | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java index acf7c2cb7..f4330a172 100755 --- a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java +++ b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java @@ -17,8 +17,10 @@ package org.apache.commons.lang3.builder; -import org.apache.commons.lang3.ArrayUtils; -import org.junit.Assert; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; +import static org.junit.Assert.assertThat; + import org.junit.Test; /** @@ -47,10 +49,10 @@ class TestFixture { public void test_toStringExclude() { final String toString = ReflectionToStringBuilder.toString(new TestFixture()); - Assert.assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(SECRET_FIELD)); - Assert.assertEquals(ArrayUtils.INDEX_NOT_FOUND, toString.indexOf(SECRET_VALUE)); - Assert.assertTrue(toString.indexOf(NOT_SECRET_FIELD) > ArrayUtils.INDEX_NOT_FOUND); - Assert.assertTrue(toString.indexOf(NOT_SECRET_VALUE) > ArrayUtils.INDEX_NOT_FOUND); + assertThat(toString, not(containsString(SECRET_FIELD))); + assertThat(toString, not(containsString(SECRET_VALUE))); + assertThat(toString, containsString(NOT_SECRET_FIELD)); + assertThat(toString, containsString(NOT_SECRET_VALUE)); } } From cae70c10b4451ee3b919764f72dc4a4caf0f6f27 Mon Sep 17 00:00:00 2001 From: Benedikt Ritter Date: Mon, 4 May 2015 21:45:14 +0200 Subject: [PATCH 7/7] Better field and constant names --- ...tringBuilderExcludeWithAnnotationTest.java | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java index f4330a172..58946cfb5 100755 --- a/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java +++ b/src/test/java/org/apache/commons/lang3/builder/ReflectionToStringBuilderExcludeWithAnnotationTest.java @@ -31,28 +31,28 @@ public class ReflectionToStringBuilderExcludeWithAnnotationTest { class TestFixture { @ToStringExclude - private final String secretField = SECRET_VALUE; + private final String excludedField = EXCLUDED_FIELD_VALUE; @SuppressWarnings("unused") - private final String showField = NOT_SECRET_VALUE; + private final String includedField = INCLUDED_FIELD_VALUE; } - private static final String NOT_SECRET_FIELD = "showField"; + private static final String INCLUDED_FIELD_NAME = "includedField"; - private static final String NOT_SECRET_VALUE = "Hello World!"; + private static final String INCLUDED_FIELD_VALUE = "Hello World!"; - private static final String SECRET_FIELD = "secretField"; + private static final String EXCLUDED_FIELD_NAME = "excludedField"; - private static final String SECRET_VALUE = "secret value"; + private static final String EXCLUDED_FIELD_VALUE = "excluded field value"; @Test public void test_toStringExclude() { final String toString = ReflectionToStringBuilder.toString(new TestFixture()); - assertThat(toString, not(containsString(SECRET_FIELD))); - assertThat(toString, not(containsString(SECRET_VALUE))); - assertThat(toString, containsString(NOT_SECRET_FIELD)); - assertThat(toString, containsString(NOT_SECRET_VALUE)); + assertThat(toString, not(containsString(EXCLUDED_FIELD_NAME))); + assertThat(toString, not(containsString(EXCLUDED_FIELD_VALUE))); + assertThat(toString, containsString(INCLUDED_FIELD_NAME)); + assertThat(toString, containsString(INCLUDED_FIELD_VALUE)); } }