You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@ignite.apache.org by Дмитрий Рябов <so...@gmail.com> on 2017/02/15 12:07:43 UTC

IGNITE-602

Hello, can you answer me a simple question?

We have 2 looping lists:

ArrayList<Object> list1 = new ArrayList<>();
ArrayList<Object> list2 = new ArrayList<>();

list2.add(list1);
list1.add(list2);

Class GridToStringBuilder represent them into string.

Simple public static <T> String toString(Class<T> cls, T obj) method
returns string "ArrayList [size=1]" for each list.

*Question is* how should look the result of toString(Class<T> cls, T obj,
String name, @Nullable Object val) method and other methods with additional
values?
"ArrayList [size=1, name=ArrayList[size=1]]" or something else?

The trouble is in GridStringBuilder.a(Object obj) method - it tries to
append collection's toString() method which invokes toString() on every
element.

Re: IGNITE-602

Posted by Vladimir Ozerov <vo...@gridgain.com>.
Yes, my idea was around it - we need to stop recursion somehow. On the
other hand, position-based format is not very user-friendly, apparently.
May be some other approaches will be more suitable, but I cannot think of
anything else.

On Thu, Feb 16, 2017 at 2:26 PM, Дмитрий Рябов <so...@gmail.com>
wrote:

> Hello, Vladimir. Do you mean something like "ArrayList [size=1,
> name=ArrayList [size=1, ArrayList {position 0}]]"?
>
> 2017-02-16 12:32 GMT+03:00 Vladimir Ozerov <vo...@gridgain.com>:
>
> > Hi Dmitriy,
> >
> > We should print all objects, because this is the whole purpose of
> > GridToStringBuilder class - to print as much as possible in pretty
> format.
> > For cyclic references, we should introduce smarter approach, ensuring
> that
> > certain object is printed only once, I would use a kind of stack or
> > IdentityHashMap to track already printed entries and then print a
> reference
> > to them instead of the whole body.
> >
> > We use similar approach for binary objects, see
> > BinaryObjectExImpl.toString(...)
> > method. In this case (hash + body) is printed normally, but when a cycle
> is
> > found, we print only (hash). This is not very suitable for
> > GridToStringBuilder, as we definitely do not want output to be flooded
> with
> > hashes, which are useless in common case. May be it makes sense to
> object's
> > position in already printed string.
> >
> > Vladimir.
> >
> >
> > On Wed, Feb 15, 2017 at 3:07 PM, Дмитрий Рябов <so...@gmail.com>
> > wrote:
> >
> > > Hello, can you answer me a simple question?
> > >
> > > We have 2 looping lists:
> > >
> > > ArrayList<Object> list1 = new ArrayList<>();
> > > ArrayList<Object> list2 = new ArrayList<>();
> > >
> > > list2.add(list1);
> > > list1.add(list2);
> > >
> > > Class GridToStringBuilder represent them into string.
> > >
> > > Simple public static <T> String toString(Class<T> cls, T obj) method
> > > returns string "ArrayList [size=1]" for each list.
> > >
> > > *Question is* how should look the result of toString(Class<T> cls, T
> obj,
> > > String name, @Nullable Object val) method and other methods with
> > additional
> > > values?
> > > "ArrayList [size=1, name=ArrayList[size=1]]" or something else?
> > >
> > > The trouble is in GridStringBuilder.a(Object obj) method - it tries to
> > > append collection's toString() method which invokes toString() on every
> > > element.
> > >
> >
>

Re: IGNITE-602

Posted by Дмитрий Рябов <so...@gmail.com>.
Hello, Vladimir. Do you mean something like "ArrayList [size=1,
name=ArrayList [size=1, ArrayList {position 0}]]"?

2017-02-16 12:32 GMT+03:00 Vladimir Ozerov <vo...@gridgain.com>:

> Hi Dmitriy,
>
> We should print all objects, because this is the whole purpose of
> GridToStringBuilder class - to print as much as possible in pretty format.
> For cyclic references, we should introduce smarter approach, ensuring that
> certain object is printed only once, I would use a kind of stack or
> IdentityHashMap to track already printed entries and then print a reference
> to them instead of the whole body.
>
> We use similar approach for binary objects, see
> BinaryObjectExImpl.toString(...)
> method. In this case (hash + body) is printed normally, but when a cycle is
> found, we print only (hash). This is not very suitable for
> GridToStringBuilder, as we definitely do not want output to be flooded with
> hashes, which are useless in common case. May be it makes sense to object's
> position in already printed string.
>
> Vladimir.
>
>
> On Wed, Feb 15, 2017 at 3:07 PM, Дмитрий Рябов <so...@gmail.com>
> wrote:
>
> > Hello, can you answer me a simple question?
> >
> > We have 2 looping lists:
> >
> > ArrayList<Object> list1 = new ArrayList<>();
> > ArrayList<Object> list2 = new ArrayList<>();
> >
> > list2.add(list1);
> > list1.add(list2);
> >
> > Class GridToStringBuilder represent them into string.
> >
> > Simple public static <T> String toString(Class<T> cls, T obj) method
> > returns string "ArrayList [size=1]" for each list.
> >
> > *Question is* how should look the result of toString(Class<T> cls, T obj,
> > String name, @Nullable Object val) method and other methods with
> additional
> > values?
> > "ArrayList [size=1, name=ArrayList[size=1]]" or something else?
> >
> > The trouble is in GridStringBuilder.a(Object obj) method - it tries to
> > append collection's toString() method which invokes toString() on every
> > element.
> >
>

Re: IGNITE-602

Posted by Vladimir Ozerov <vo...@gridgain.com>.
Hi Dmitriy,

We should print all objects, because this is the whole purpose of
GridToStringBuilder class - to print as much as possible in pretty format.
For cyclic references, we should introduce smarter approach, ensuring that
certain object is printed only once, I would use a kind of stack or
IdentityHashMap to track already printed entries and then print a reference
to them instead of the whole body.

We use similar approach for binary objects, see
BinaryObjectExImpl.toString(...)
method. In this case (hash + body) is printed normally, but when a cycle is
found, we print only (hash). This is not very suitable for
GridToStringBuilder, as we definitely do not want output to be flooded with
hashes, which are useless in common case. May be it makes sense to object's
position in already printed string.

Vladimir.


On Wed, Feb 15, 2017 at 3:07 PM, Дмитрий Рябов <so...@gmail.com>
wrote:

> Hello, can you answer me a simple question?
>
> We have 2 looping lists:
>
> ArrayList<Object> list1 = new ArrayList<>();
> ArrayList<Object> list2 = new ArrayList<>();
>
> list2.add(list1);
> list1.add(list2);
>
> Class GridToStringBuilder represent them into string.
>
> Simple public static <T> String toString(Class<T> cls, T obj) method
> returns string "ArrayList [size=1]" for each list.
>
> *Question is* how should look the result of toString(Class<T> cls, T obj,
> String name, @Nullable Object val) method and other methods with additional
> values?
> "ArrayList [size=1, name=ArrayList[size=1]]" or something else?
>
> The trouble is in GridStringBuilder.a(Object obj) method - it tries to
> append collection's toString() method which invokes toString() on every
> element.
>