On Feb 10, 2010, at 11:53 PM, Adam Heath wrote:

> Adrian Crum wrote:
>> --- On Wed, 2/10/10, Adam Heath <doo...@brainfood.com> wrote:
>>> From: Adam Heath <doo...@brainfood.com>
>>> Subject: Re: svn commit: r908713 - in 
>>> /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion: 
>>> CollectionConverters.java test/MiscTests.java
>>> To: dev@ofbiz.apache.org
>>> Date: Wednesday, February 10, 2010, 9:19 PM
>>> Adrian Crum wrote:
>>>> --- On Wed, 2/10/10, Adam Heath <doo...@brainfood.com>
>>> wrote:
>>>>> From: Adam Heath <doo...@brainfood.com>
>>>>> Subject: Re: svn commit: r908713 - in
>>> /ofbiz/trunk/framework/base/src/org/ofbiz/base/conversion:
>>> CollectionConverters.java test/MiscTests.java
>>>>> To: dev@ofbiz.apache.org
>>>>> Date: Wednesday, February 10, 2010, 7:05 PM
>>>>> Adrian Crum wrote:
>>>>>> Every programmer has their own design style.
>>> This
>>>>> would be mine:
>>>>>> class JsonString {
>>>>>>    public String toString() {
>>>>>>      ...
>>>>>>    }
>>>>>> }
>>>>>> 
>>>>>> public static class ListToJsonString<T>
>>> extends
>>>>> AbstractConverter<List<T>, JsonString>
>>> {
>>>>>>    public ListToJsonString() {
>>>>>>      super(List.class,
>>> JsonString
>>>>> .class);
>>>>>>    }
>>>>>>    ...
>>>>>> }
>>>>>> 
>>>>>> The problem I have with your approach is the
>>> fact that
>>>>> there is no way to know that converting object x
>>> to a String
>>>>> will result in a JSON string. In addition, I was
>>> hoping we
>>>>> could stick to this pattern: Converting any Java
>>> type to a
>>>>> String is the same as calling the object's
>>> toString()
>>>>> method.
>>>>>> -Adrian
>>>>> Yeah, I thought you would comment on this.
>>>>> 
>>>>> Should ListToString and StringToList be
>>> reflective? 
>>>>> As they used to
>>>>> be, they weren't.
>>>> That's a good question. The original List conversions
>>> were copied from the ObjectType code and I never looked into
>>> that code in detail - I just wanted to maintain the original
>>> behavior.
>>>> When I picture java types being converted to strings,
>>> I imagine them being displayed - kind of like how they would
>>> appear if you did something like:
>>>> String prompt = "The List is: " + someList;
>>>> 
>>>> Making the converters reflective is a worthwhile goal
>>> - I just never considered it.
>>>> What you're trying to accomplish is great. We can take
>>> that concept even further by having type x to XML converters
>>> - so that java objects can be serialized to XML.
>>>> So, that's why I commented on it. What if I wanted to
>>> convert a List to an XML string? Or a [insert encoding
>>> method here] string?
>>> 
>>> Here's a summary of what you have said, and what I have
>>> been thinking:
>>> 
>>> 1: I've got an object, I want to convert it for
>>> display.  This could
>>> call to string, or something else, maybe multiple
>>> converters in series.
>>> 
>>> 2: I want to change the format of an object; an object is
>>> nothing
>>> without the data it encapsulates, and there are different
>>> ways of
>>> encapsulating said data.  So, converting a
>>> List<Map> to JSON, still
>>> ends up carrying the exact same set of data.  This is
>>> simliar to
>>> serialization, but hopefully allows for a human to edit the
>>> converted
>>> state.
>>> 
>>> 3: JSON kinda has a hard-coded registry; it can only handle
>>> very
>>> simple basic types.  If it was made to use a large
>>> registry of
>>> converters, it would need to have the basic types use the
>>> internal
>>> json, but then all other types use the resolve() syntax.
>>> 
>>> 4: XML output is similiar to JSON, but there are no
>>> intrinsic types,
>>> so there doesn't have to be any special casing.
>>> 
>>> What this is saying to me, is we need a third parameter to
>>> this
>>> conversion framework; first is source class, second is
>>> target class,
>>> and third would be maybe 'flavor' or 'method'.  Method
>>> as in
>>> request.METHOD, or output method, or some such.
>> 
>> Nope, we need separate converters:
>> 
>> <set field="listAsJsonString" from-field="someList" type="JsonString"/>
>> <set field="listAsXmlString" from-field="someList" type="XmlString"/>
>> <set field="listAsFooString" from-field="someList" type="FooString"/>
> 
> Stop thinking top level.
> 
> (borrowing json syntax)
> 
> {"numbers": [1, 2, 3, 4], "map": {"a": "b"}}
> 
> In your example, "someList" is equal to the above example object.  But
> then the method that is doing the encoding(JsonString, XmlString,
> FooString) will *itself* call *back* into Converters, asking for a
> conversion for the embed String keys, the embeded list, and the
> embedded map.  Then, for the list and map, they too will have to again
> call into Converters, asking for each number and String to be encoded.
> 
> What I am suggesting is getting rid of the else if block in
> JSONWriter, *and* the hard-coded xml serialization stuff, and just
> making that *all* use Converters as it's registry.
> 
> Hmm, I was going to write more here, but then I realized something
> else.  While keeping the above 2 paragraphs is useful, what I am about
> to suggest is an even more radical approach.
> 
> If the supposed xml converter existed, how would it actually function?
> Would it have each nested object get converted to a *string*, then
> parse that string back into DOM, and append it to the current
> document?  Of course not.  So, the next way to do that might be to
> have a FooToElement type converter.  This is better.  However, each
> FooToElement converter would end up creating a dummy document, just to
> create the singleton element that would be representing of it's data.
> So, maybe we need to be able to pass down a 'context' variable, in
> this specific case, a 'node', to which the converter can attach it's
> element.
> 
> This would also work well for JSON output, because the IndentingWriter
> class could be the context variable that is passed to child converters.
> 
> Even doing a normal FooToString converter could make use of this, by
> passing a StringBuilder around.

Keep in mind that Adrian's goal is to do all conversions through polymorphism.

Whether or not that's the best approach is another question (I obviously don't 
agree, or I would have written in that way in the first place, or rewritten it 
that way, or at least responded to Adrian's commits with a high-five email). Of 
course, I'm not convinced I'm always right, so I'll let Adrian have his fun 
with this one and see how it goes... either way I hope he "finishes" it soon so 
we can get rid of certain error messages that didn't used to be there and such.

-David


Reply via email to