[jira] [Created] (LANG-754) embedded objects are not toString-ed like top-level objects

classic Classic list List threaded Threaded
3 messages Options
Reply | Threaded
Open this post in threaded view
|

[jira] [Created] (LANG-754) embedded objects are not toString-ed like top-level objects

ASF GitHub Bot (Jira)
embedded objects are not toString-ed like top-level objects
-----------------------------------------------------------

                 Key: LANG-754
                 URL: https://issues.apache.org/jira/browse/LANG-754
             Project: Commons Lang
          Issue Type: Bug
          Components: lang.builder.*
    Affects Versions: 3.0.1, 2.5
         Environment: Linux Ubuntu
java version "1.6.0_24"
Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)

            Reporter: Dominique De Vito
            Priority: Minor


I have a simple class 'A' defined as follows:

======================================
public class A {
  int p1;
  String p2;
  B b;
}
======================================

While I execute the following instructions:
ToStringBuilder builder = new ReflectionToStringBuilder(a);
System.out.println(builder.toString());

The output is:
A@3ea981ca[p1=0,p2=<null>,b=B@1ee7b241]
that's normal, without recursion

So, I defined my own style, for recursive toString-ing display:

======================================
class MyStyle extends ToStringStyle {
  private final static ToStringStyle instance = new MyStyle();

  public MyStyle() {
    setArrayContentDetail(true);
    setUseShortClassName(true);
    setUseClassName(true);
    setUseIdentityHashCode(true);
    setFieldSeparator(", ");
  }

  public static ToStringStyle getInstance() {
    return instance;
  };

  @Override
  public void appendDetail(final StringBuffer buffer, final String fieldName, final Object value) {
    if (!value.getClass().getName().startsWith("java")) {
      buffer.append(ReflectionToStringBuilder.toString(value, instance));
    } else {
      super.appendDetail(buffer, fieldName, value);
    }
  }

  @Override
  public void appendDetail(final StringBuffer buffer, final String fieldName, final Collection value) {
    appendDetail(buffer, fieldName, value.toArray());
  }

}
======================================


When I use my custom MyStyle:
String s = ReflectionToStringBuilder.toString(a, MyStyle.getInstance());
System.out.println(s);

The output is:
A@3ea981ca[p1=0, p2=<null>, b=byte@1ee7b241[p4=234]]

So, the name of the class 'B' is not displayed.
I expected something like: b=B@1ee7b241[p4=234]

Instead, the name of the class 'B' is replaced with 'byte'.
I don't know why.


--
This message is automatically generated by JIRA.
For more information on JIRA, see: http://www.atlassian.com/software/jira

       
Reply | Threaded
Open this post in threaded view
|

[jira] [Commented] (LANG-754) embedded objects are not toString-ed like top-level objects

ASF GitHub Bot (Jira)

    [ https://issues.apache.org/jira/browse/LANG-754?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13215870#comment-13215870 ]

Thomas Neidhart commented on LANG-754:
--------------------------------------

I digged into this problem and the problem you describe occurs only when using setUseShortName(true), and the class is located in the default package and the name is one of [IZFJSBDC], explanation follows.

The ToStringStyle uses ClassUtils to get the short name for the class, which uses an internal reverse abbreviation map to resolve primitive array types which are something like [B for a byte[]. Now there seems to be a bug in the ClassUtils.getShortName method as it does this reverse resolve all the time, and if you happen to have a class called B in the default package, it is wrongly identified as byte.

So the fix would be to do the reverse lookup only in case of arrays.
               

> embedded objects are not toString-ed like top-level objects
> -----------------------------------------------------------
>
>                 Key: LANG-754
>                 URL: https://issues.apache.org/jira/browse/LANG-754
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.builder.*
>    Affects Versions: 2.5, 3.0.1
>         Environment: Linux Ubuntu
> java version "1.6.0_24"
> Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
> Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
>            Reporter: Dominique De Vito
>            Priority: Minor
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> I have a simple class 'A' defined as follows:
> ======================================
> public class A {
>   int p1;
>   String p2;
>   B b;
> }
> ======================================
> While I execute the following instructions:
> ToStringBuilder builder = new ReflectionToStringBuilder(a);
> System.out.println(builder.toString());
> The output is:
> A@3ea981ca[p1=0,p2=<null>,b=B@1ee7b241]
> that's normal, without recursion
> So, I defined my own style, for recursive toString-ing display:
> ======================================
> class MyStyle extends ToStringStyle {
>   private final static ToStringStyle instance = new MyStyle();
>   public MyStyle() {
>     setArrayContentDetail(true);
>     setUseShortClassName(true);
>     setUseClassName(true);
>     setUseIdentityHashCode(true);
>     setFieldSeparator(", ");
>   }
>   public static ToStringStyle getInstance() {
>     return instance;
>   };
>   @Override
>   public void appendDetail(final StringBuffer buffer, final String fieldName, final Object value) {
>     if (!value.getClass().getName().startsWith("java")) {
>       buffer.append(ReflectionToStringBuilder.toString(value, instance));
>     } else {
>       super.appendDetail(buffer, fieldName, value);
>     }
>   }
>   @Override
>   public void appendDetail(final StringBuffer buffer, final String fieldName, final Collection value) {
>     appendDetail(buffer, fieldName, value.toArray());
>   }
> }
> ======================================
> When I use my custom MyStyle:
> String s = ReflectionToStringBuilder.toString(a, MyStyle.getInstance());
> System.out.println(s);
> The output is:
> A@3ea981ca[p1=0, p2=<null>, b=byte@1ee7b241[p4=234]]
> So, the name of the class 'B' is not displayed.
> I expected something like: b=B@1ee7b241[p4=234]
> Instead, the name of the class 'B' is replaced with 'byte'.
> I don't know why.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

       
Reply | Threaded
Open this post in threaded view
|

[jira] [Issue Comment Edited] (LANG-754) embedded objects are not toString-ed like top-level objects

ASF GitHub Bot (Jira)
In reply to this post by ASF GitHub Bot (Jira)

    [ https://issues.apache.org/jira/browse/LANG-754?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13215870#comment-13215870 ]

Thomas Neidhart edited comment on LANG-754 at 3/1/12 6:22 PM:
--------------------------------------------------------------

I digged into this problem and the problem you describe occurs only when using setUseShortName(true), and the class is located in the default package and the name is one of [IZFJSBDC], explanation follows.

The ToStringStyle uses ClassUtils to get the short name for the class, which uses an internal reverse abbreviation map to resolve primitive array types which are something like [B for a byte[]. Now there seems to be a bug in the ClassUtils.getShortName method as it does this reverse resolve all the time, and if you happen to have a class called B in the default package, it is wrongly identified as byte.
               
      was (Author: tn):
    I digged into this problem and the problem you describe occurs only when using setUseShortName(true), and the class is located in the default package and the name is one of [IZFJSBDC], explanation follows.

The ToStringStyle uses ClassUtils to get the short name for the class, which uses an internal reverse abbreviation map to resolve primitive array types which are something like [B for a byte[]. Now there seems to be a bug in the ClassUtils.getShortName method as it does this reverse resolve all the time, and if you happen to have a class called B in the default package, it is wrongly identified as byte.

So the fix would be to do the reverse lookup only in case of arrays.
                 

> embedded objects are not toString-ed like top-level objects
> -----------------------------------------------------------
>
>                 Key: LANG-754
>                 URL: https://issues.apache.org/jira/browse/LANG-754
>             Project: Commons Lang
>          Issue Type: Bug
>          Components: lang.builder.*
>    Affects Versions: 2.5, 3.0.1
>         Environment: Linux Ubuntu
> java version "1.6.0_24"
> Java(TM) SE Runtime Environment (build 1.6.0_24-b07)
> Java HotSpot(TM) 64-Bit Server VM (build 19.1-b02, mixed mode)
>            Reporter: Dominique De Vito
>            Priority: Minor
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> I have a simple class 'A' defined as follows:
> ======================================
> public class A {
>   int p1;
>   String p2;
>   B b;
> }
> ======================================
> While I execute the following instructions:
> ToStringBuilder builder = new ReflectionToStringBuilder(a);
> System.out.println(builder.toString());
> The output is:
> A@3ea981ca[p1=0,p2=<null>,b=B@1ee7b241]
> that's normal, without recursion
> So, I defined my own style, for recursive toString-ing display:
> ======================================
> class MyStyle extends ToStringStyle {
>   private final static ToStringStyle instance = new MyStyle();
>   public MyStyle() {
>     setArrayContentDetail(true);
>     setUseShortClassName(true);
>     setUseClassName(true);
>     setUseIdentityHashCode(true);
>     setFieldSeparator(", ");
>   }
>   public static ToStringStyle getInstance() {
>     return instance;
>   };
>   @Override
>   public void appendDetail(final StringBuffer buffer, final String fieldName, final Object value) {
>     if (!value.getClass().getName().startsWith("java")) {
>       buffer.append(ReflectionToStringBuilder.toString(value, instance));
>     } else {
>       super.appendDetail(buffer, fieldName, value);
>     }
>   }
>   @Override
>   public void appendDetail(final StringBuffer buffer, final String fieldName, final Collection value) {
>     appendDetail(buffer, fieldName, value.toArray());
>   }
> }
> ======================================
> When I use my custom MyStyle:
> String s = ReflectionToStringBuilder.toString(a, MyStyle.getInstance());
> System.out.println(s);
> The output is:
> A@3ea981ca[p1=0, p2=<null>, b=byte@1ee7b241[p4=234]]
> So, the name of the class 'B' is not displayed.
> I expected something like: b=B@1ee7b241[p4=234]
> Instead, the name of the class 'B' is replaced with 'byte'.
> I don't know why.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira