Merge branch 'branch-3.4-fix-json-style-rebase'

LANG-1128: JsonToStringStyle doesn't handle chars and objects correctly.
This also fixes #74 from github. Thanks to github user jacktan1991.
This commit is contained in:
Benedikt Ritter 2015-05-01 23:55:25 +02:00
commit 4a882e76d9
3 changed files with 102 additions and 5 deletions

View File

@ -22,6 +22,7 @@
<body>
<release version="3.5" date="tba" description="tba">
<action issue="LANG-1128" type="fix" dev="britter" due-to="jacktan1991">JsonToStringStyle doesn't handle chars and objects correctly</action>
<action issue="LANG-456" type="fix" dev="britter" due-to="Bob Fields, Woosan Ko, Bruno P. Kinoshita">HashCodeBuilder throws StackOverflowError in bidirectional navigable association</action>
<action issue="LANG-1126" type="fix" dev="britter">DateFormatUtilsTest.testSMTP depends on the default Locale</action>
<action issue="LANG-1123" type="fix" dev="chas" due-to="Christian P. Momon">Unit test FastDatePrinterTimeZonesTest needs a timezone set</action>

View File

@ -2559,22 +2559,46 @@ public void append(StringBuffer buffer, String fieldName, Object value,
super.append(buffer, fieldName, value, fullDetail);
}
@Override
protected void appendDetail(StringBuffer buffer, String fieldName, char value) {
appendValueAsString(buffer, String.valueOf(value));
}
@Override
protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
if (value == null) {
appendNullText(buffer, fieldName);
return;
}
if (value.getClass() == String.class) {
appendValueAsString(buffer, (String)value);
if (value instanceof String || value instanceof Character) {
appendValueAsString(buffer, value.toString());
return;
}
buffer.append(value);
if (value instanceof Number || value instanceof Boolean) {
buffer.append(value);
return;
}
final String valueAsString = value.toString();
if (isJsonObject(valueAsString) || isJsonArray(valueAsString)) {
buffer.append(value);
return;
}
appendDetail(buffer, fieldName, valueAsString);
}
private boolean isJsonArray(String valueAsString) {
return valueAsString.startsWith(getArrayStart())
&& valueAsString.startsWith(getArrayEnd());
}
private boolean isJsonObject(String valueAsString) {
return valueAsString.startsWith(getContentStart())
&& valueAsString.endsWith(getContentEnd());
}
/**

View File

@ -20,6 +20,7 @@
import static org.junit.Assert.fail;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import org.apache.commons.lang3.SystemUtils;
@ -91,6 +92,37 @@ public void testAppendSuper() {
.appendSuper("{\"a\":\"hello\"}").append("b", "world").toString());
}
@Test
public void testChar() {
try {
new ToStringBuilder(base).append('A').toString();
fail("Should have generated UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
}
assertEquals("{\"a\":\"A\"}", new ToStringBuilder(base).append("a", 'A')
.toString());
assertEquals("{\"a\":\"A\",\"b\":\"B\"}", new ToStringBuilder(base).append("a", 'A').append("b", 'B')
.toString());
}
@Test
public void testDate() {
final Date now = new Date();
final Date afterNow = new Date(System.currentTimeMillis() + 1);
try {
new ToStringBuilder(base).append(now).toString();
fail("Should have generated UnsupportedOperationException");
} catch (UnsupportedOperationException e) {
}
assertEquals("{\"now\":\"" + now.toString() +"\"}", new ToStringBuilder(base).append("now", now)
.toString());
assertEquals("{\"now\":\"" + now.toString() +"\",\"after\":\"" + afterNow.toString() + "\"}", new ToStringBuilder(base).append("now", now).append("after", afterNow)
.toString());
}
@Test
public void testObject() {
@ -195,6 +227,30 @@ public void testPerson() {
.append("age", p.age).append("smoker", p.smoker)
.toString());
}
@Test
public void testNestingPerson() {
final Person p = new Person(){
public String toString(){
return new ToStringBuilder(this).append("name", this.name)
.append("age", this.age).append("smoker", this.smoker)
.toString();
}
};
p.name = "Jane Doe";
p.age = 25;
p.smoker = true;
final NestingPerson nestP = new NestingPerson();
nestP.pid="#1@Jane";
nestP.person = p;
assertEquals(
"{\"pid\":\"#1@Jane\",\"person\":{\"name\":\"Jane Doe\",\"age\":25,\"smoker\":true}}",
new ToStringBuilder(nestP).append("pid", nestP.pid)
.append("person", nestP.person)
.toString());
}
@Test
public void testLong() {
@ -303,4 +359,20 @@ public void testLongArrayArray() {
} catch (UnsupportedOperationException e) {
}
}
/**
* An object with nested object structures used to test {@link JsonToStringStyle}.
*
*/
static class NestingPerson {
/**
* Test String field.
*/
String pid;
/**
* Test nested object field.
*/
Person person;
}
}