From 2e806d5f576cfeb7fd151de197af3c54b9106e30 Mon Sep 17 00:00:00 2001 From: Karthikeyan Palanivelu Date: Mon, 6 Nov 2017 10:28:50 -0500 Subject: [PATCH 1/4] LANG-1366 - Add Feature for No ClassName and MultiLine StringStyle - Added the feature as a Inner Class to ToStringStyle - Added JUnit --- .../commons/lang3/builder/ToStringStyle.java | 57 ++++++++ ...NoClassNameMultiLineToStringStyleTest.java | 127 ++++++++++++++++++ 2 files changed, 184 insertions(+) create mode 100644 src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java diff --git a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java index e24aa3100ae..08d97c3a6d0 100644 --- a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java +++ b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java @@ -157,6 +157,20 @@ public abstract class ToStringStyle implements Serializable { */ public static final ToStringStyle JSON_STYLE = new JsonToStringStyle(); + /** + * The no class name Multi Line toString style. Using the Person + * example from {@link ToStringBuilder}, the output would look like this: + * + *
+     * name=John Doe
+     * age=33
+     * smoker=false
+     * 
+ * + * @since 3.7 + */ + public static final ToStringStyle NO_CLASS_NAME_MULTI_LINE_STYLE = new NoClassNameMultiLineToStringStyle(); + /** *

* A registry of objects used by reflectionToString methods @@ -2633,4 +2647,47 @@ private Object readResolve() { } } + + /** + *

+ * ToStringStyle that outputs with No Class Name in a Multi Line format. + *

+ * + *

+ * This is an inner class rather than using + * StandardToStringStyle to ensure its immutability. + *

+ * + * @since 3.7 + * @see json.org + */ + private static final class NoClassNameMultiLineToStringStyle extends ToStringStyle { + + private static final long serialVersionUID = 1L; + + /** + *

Constructor.

+ *

+ *

Use the static constant rather than instantiating.

+ */ + NoClassNameMultiLineToStringStyle() { + super(); + this.setUseClassName(false); + this.setUseIdentityHashCode(false); + this.setContentStart(StringUtils.EMPTY); + this.setFieldSeparator(System.lineSeparator()); + this.setFieldSeparatorAtStart(false); + this.setContentEnd(System.lineSeparator()); + } + + /** + *

Ensure Singleton after serialization.

+ * + * @return the singleton + */ + private Object readResolve() { + return ToStringStyle.NO_CLASS_NAME_MULTI_LINE_STYLE; + } + + } } diff --git a/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java b/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java new file mode 100644 index 00000000000..2fadcb59a45 --- /dev/null +++ b/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java @@ -0,0 +1,127 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.commons.lang3.builder; + +import static org.testng.Assert.assertEquals; + +import java.util.ArrayList; +import java.util.HashMap; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ToStringStyleTest.Person; +import org.junit.After; +import org.junit.Before; +import org.junit.Test; + +/** + * Unit tests {@link org.apache.commons.lang3.builder.NoClassNameMultiLineToStringStyleTest}. + */ +public class NoClassNameMultiLineToStringStyleTest { + + private final Integer base = Integer.valueOf(5); + + @Before + public void setUp() throws Exception { + ToStringBuilder.setDefaultStyle(ToStringStyle.NO_CLASS_NAME_MULTI_LINE_STYLE); + } + + @After + public void tearDown() throws Exception { + ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE); + } + + //---------------------------------------------------------------- + + @Test + public void testBlank() { + assertEquals(StringUtils.EMPTY + System.lineSeparator(), new ToStringBuilder(base).toString()); + } + + @Test + public void testAppendSuper() { + assertEquals(base + System.lineSeparator(), new ToStringBuilder(base).appendSuper(base.toString() + System.lineSeparator()).toString()); + assertEquals(base + System.lineSeparator() + "" + System.lineSeparator(), new ToStringBuilder(base).appendSuper(base.toString() + System.lineSeparator() + "" + System.lineSeparator()).toString()); + assertEquals(base + System.lineSeparator() + "a=hello" + System.lineSeparator(), new ToStringBuilder(base).appendSuper(base.toString() + System.lineSeparator()).append("a", "hello").toString()); + assertEquals(base + System.lineSeparator() + "" + System.lineSeparator() + "a=hello" + System.lineSeparator(), new ToStringBuilder(base).appendSuper(base.toString() + System.lineSeparator() + "" + System.lineSeparator()).append("a", "hello").toString()); + assertEquals("a=hello" + System.lineSeparator(), new ToStringBuilder(base).appendSuper(null).append("a", "hello").toString()); + } + + @Test + public void testObject() { + final Integer i3 = Integer.valueOf(3); + final Integer i4 = Integer.valueOf(4); + assertEquals(base + System.lineSeparator() + "" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append((Object) null).toString()); + assertEquals(base + System.lineSeparator() + "3" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append(i3).toString()); + assertEquals("a=" + System.lineSeparator(), new ToStringBuilder(base).append("a", (Object) null).toString()); + assertEquals(base + System.lineSeparator() + "a=3" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append("a", i3).toString()); + assertEquals("a=3" + System.lineSeparator() + "b=4" + System.lineSeparator(), new ToStringBuilder(base).append("a", i3).append("b", i4).toString()); + assertEquals("a=" + System.lineSeparator(), new ToStringBuilder(base).append("a", i3, false).toString()); + assertEquals("a=" + System.lineSeparator(), new ToStringBuilder(base).append("a", new ArrayList<>(), false).toString()); + assertEquals("a=[]" + System.lineSeparator(), new ToStringBuilder(base).append("a", new ArrayList<>(), true).toString()); + assertEquals("a=" + System.lineSeparator(), new ToStringBuilder(base).append("a", new HashMap<>(), false).toString()); + assertEquals("a={}" + System.lineSeparator(), new ToStringBuilder(base).append("a", new HashMap<>(), true).toString()); + assertEquals(base + System.lineSeparator() + "a=" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append("a", (Object) new String[0], false).toString()); + assertEquals(base + System.lineSeparator() + "a={}" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append("a", (Object) new String[0], true).toString()); + } + + @Test + public void testPerson() { + final Person p = new Person(); + p.name = "Jane Doe"; + p.age = 25; + p.smoker = true; + assertEquals("name=Jane Doe" + System.lineSeparator() + "age=25" + System.lineSeparator() + "smoker=true" + System.lineSeparator(), new ToStringBuilder(p).append("name", p.name).append("age", p.age).append("smoker", p.smoker).toString()); + } + + @Test + public void testLong() { + assertEquals("3" + System.lineSeparator(), new ToStringBuilder(base).append(3L).toString()); + assertEquals(base + System.lineSeparator() + "a=3" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append("a", 3L).toString()); + assertEquals("a=3" + System.lineSeparator() + "b=4" + System.lineSeparator(), new ToStringBuilder(base).append("a", 3L).append("b", 4L).toString()); + } + + @Test + public void testObjectArray() { + Object[] array = new Object[] {null, base, new int[] {3, 6}}; + assertEquals(base + System.lineSeparator() + "{,5,{3,6}}" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append(array).toString()); + assertEquals("{,5,{3,6}}" + System.lineSeparator(), new ToStringBuilder(base).append((Object) array).toString()); + array = null; + assertEquals(base + System.lineSeparator() + "" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append(array).toString()); + assertEquals("" + System.lineSeparator(), new ToStringBuilder(base).append((Object) array).toString()); + } + + @Test + public void testLongArray() { + long[] array = new long[] {1, 2, -3, 4}; + assertEquals(base + System.lineSeparator() + "{1,2,-3,4}" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append(array).toString()); + assertEquals("{1,2,-3,4}" + System.lineSeparator(), new ToStringBuilder(base).append((Object) array).toString()); + array = null; + assertEquals(base + System.lineSeparator() + "" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append(array).toString()); + assertEquals("" + System.lineSeparator(), new ToStringBuilder(base).append((Object) array).toString()); + } + + @Test + public void testLongArrayArray() { + long[][] array = new long[][] {{1, 2}, null, {5}}; + assertEquals(base + System.lineSeparator() + "{{1,2},,{5}}" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append(array).toString()); + assertEquals("{{1,2},,{5}}" + System.lineSeparator(), new ToStringBuilder(base).append((Object) array).toString()); + array = null; + assertEquals(base + System.lineSeparator() + "" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append(array).toString()); + assertEquals("" + System.lineSeparator(), new ToStringBuilder(base).append((Object) array).toString()); + } + +} From d716403dc4c3cbe30e596fcb6ceea82138c61af4 Mon Sep 17 00:00:00 2001 From: Karthikeyan Palanivelu Date: Mon, 6 Nov 2017 10:33:53 -0500 Subject: [PATCH 2/4] Updated the Format --- .../java/org/apache/commons/lang3/builder/ToStringStyle.java | 3 ++- .../lang3/builder/NoClassNameMultiLineToStringStyleTest.java | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java index 08d97c3a6d0..9d4638d2d85 100644 --- a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java +++ b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java @@ -2648,6 +2648,8 @@ private Object readResolve() { } + // ---------------------------------------------------------------------------- + /** *

* ToStringStyle that outputs with No Class Name in a Multi Line format. @@ -2688,6 +2690,5 @@ private static final class NoClassNameMultiLineToStringStyle extends ToStringSty private Object readResolve() { return ToStringStyle.NO_CLASS_NAME_MULTI_LINE_STYLE; } - } } diff --git a/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java b/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java index 2fadcb59a45..e2e40266ac2 100644 --- a/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java +++ b/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java @@ -123,5 +123,4 @@ public void testLongArrayArray() { assertEquals(base + System.lineSeparator() + "" + System.lineSeparator(), new ToStringBuilder(base).append(base.toString()).append(array).toString()); assertEquals("" + System.lineSeparator(), new ToStringBuilder(base).append((Object) array).toString()); } - } From 76eff93b7e07bed1e8d961169a34974cd18da0a2 Mon Sep 17 00:00:00 2001 From: Karthik Palanivelu Date: Fri, 4 Oct 2019 10:40:10 -0400 Subject: [PATCH 3/4] Updated the review comments: 1) Revised version to 3.10 2) Removed json only comment 3) Updated the Return type to be consistent with other classes 4) Updated the Unit Test --- .../commons/lang3/builder/ToStringStyle.java | 6 +++--- .../NoClassNameMultiLineToStringStyleTest.java | 17 +++++++++-------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java index 7fd6a7dbb71..ffd96480431 100644 --- a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java +++ b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java @@ -2662,8 +2662,8 @@ private Object readResolve() { * StandardToStringStyle to ensure its immutability. *

* - * @since 3.7 - * @see json.org + * @since 3.10 + * */ private static final class NoClassNameMultiLineToStringStyle extends ToStringStyle { @@ -2690,7 +2690,7 @@ private static final class NoClassNameMultiLineToStringStyle extends ToStringSty * @return the singleton */ private Object readResolve() { - return ToStringStyle.NO_CLASS_NAME_MULTI_LINE_STYLE; + return NO_CLASS_NAME_MULTI_LINE_STYLE; } } } diff --git a/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java b/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java index e2e40266ac2..d794b474b98 100644 --- a/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java +++ b/src/test/java/org/apache/commons/lang3/builder/NoClassNameMultiLineToStringStyleTest.java @@ -16,16 +16,17 @@ */ package org.apache.commons.lang3.builder; -import static org.testng.Assert.assertEquals; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.builder.ToStringStyleTest.Person; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; + import java.util.ArrayList; import java.util.HashMap; -import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.builder.ToStringStyleTest.Person; -import org.junit.After; -import org.junit.Before; -import org.junit.Test; +import static org.junit.jupiter.api.Assertions.assertEquals; /** * Unit tests {@link org.apache.commons.lang3.builder.NoClassNameMultiLineToStringStyleTest}. @@ -34,12 +35,12 @@ public class NoClassNameMultiLineToStringStyleTest { private final Integer base = Integer.valueOf(5); - @Before + @BeforeEach public void setUp() throws Exception { ToStringBuilder.setDefaultStyle(ToStringStyle.NO_CLASS_NAME_MULTI_LINE_STYLE); } - @After + @AfterEach public void tearDown() throws Exception { ToStringBuilder.setDefaultStyle(ToStringStyle.DEFAULT_STYLE); } From 68282aa915c659c99e0c96d64fd05d4928852627 Mon Sep 17 00:00:00 2001 From: Karthik Palanivelu Date: Fri, 4 Oct 2019 10:49:56 -0400 Subject: [PATCH 4/4] Updated the version to 3.10 in the initialization section --- .../java/org/apache/commons/lang3/builder/ToStringStyle.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java index ffd96480431..fff277c60f2 100644 --- a/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java +++ b/src/main/java/org/apache/commons/lang3/builder/ToStringStyle.java @@ -169,7 +169,7 @@ public abstract class ToStringStyle implements Serializable { * smoker=false * * - * @since 3.7 + * @since 3.10 */ public static final ToStringStyle NO_CLASS_NAME_MULTI_LINE_STYLE = new NoClassNameMultiLineToStringStyle();