You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "pascal jacob (JIRA)" <ji...@apache.org> on 2010/08/25 11:42:23 UTC

[jira] Created: (LANG-647) ToStringBuilder output makes it difficult to distinguich between an empty String array and an array of one empty String

ToStringBuilder output makes it difficult to distinguich between an empty String array and an array of one empty String
-----------------------------------------------------------------------------------------------------------------------

                 Key: LANG-647
                 URL: https://issues.apache.org/jira/browse/LANG-647
             Project: Commons Lang
          Issue Type: Improvement
          Components: lang.builder.*
    Affects Versions: 2.5
            Reporter: pascal jacob
            Priority: Minor


ToStringBuilder output is the same for an empty array (i.e. new String[0]) and for an array containing only a single empty string (i.e. new String[] { "" } ).  This makes it difficult in some case to see the true nature of arrays.

For example I once had a JUnit test case that print the following trace failure:
java.lang.AssertionError: 
Expected: <InputViewHelper[a={},b={},c={msg},d={time}>
     got: <InputViewHelper[a={},b={},c={msg},d={time}>

Apparently the two objects look like the same! But they are not: one had an empty array; the other had an array with only a single empty string. With a customized ToStringStyle the difference became apparent:
Expected: <InputViewHelper[a={},b={},c={msg},d={time}>
     got: <InputViewHelper[a={""},b={},c={msg},d={time}>


The fix is simple, change the method: protected void appendDetail(StringBuffer buffer, String fieldName, Object value) to:
			protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
				if((value instanceof String) && ((String)value).isEmpty()) {
					buffer.append("\"\"");
				}
				else {
					super.appendDetail(buffer, fieldName, value);
				}
			}
 
here is the test case that revealed the problem:
	public void testToStringBuilder() {
		ToStringBuilder builder1 = new ToStringBuilder("Builder1");
		builder1.append("empty array", new String[0]);
		builder1.append("array of one empty string", new String[] { "" });
		builder1.append("array of two empty strings", new String[] { "", "" });
		String builder1Result = builder1.toString();
		System.out.println(builder1Result);
		// -----
		ToStringBuilder builder2 = new ToStringBuilder("Builder2", new ToStringStyle() {
			@Override
			protected void appendDetail(StringBuffer buffer, String fieldName, Object value) {
				if((value instanceof String) && ((String)value).isEmpty()) {
					buffer.append("\"\"");
				}
				else {
					super.appendDetail(buffer, fieldName, value);
				}
			}
		});
		builder2.append("empty array", new String[0]);
		builder2.append("array of one empty string", new String[] { "" });
		builder2.append("array of two empty strings", new String[] { "", "" });
		String builder2Result = builder2.toString();
		System.out.println(builder2Result);
	}


-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.