--- 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:53 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, 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.

I call it "Imagine the possibilities..."

> 
> (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?

Probably by using an existing Java object to XML conversion library.

>  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.

If it was me I would design a JsonString class that hides all of those 
implementation details from the conversion framework. I try to avoid feature 
envy.

-Adrian




Reply via email to