Hi Carlos,

Carlos Ferreyra wrote:

> I see XSTR-367 <http://jira.codehaus.org/browse/XSTR-367> has been closed.
> 
> I have a case where I read an attribute with the date format used in dates
> strings in subsequent tags. I wanted to read this date format using a
> SingleValueConverter that would store it in the context data holder, but
> SingleValueConverter does not receive such context.
> 
> I'd like to know if it is possible to override this behaviour.
> 
> Example:
> 
> <root format="yyyy/MM/dd">
>     <entry date="1980/01/09">
>         <some-terribly-important-values>...
>     </entry>
>    ...
> </root>
> 
> As it stands, the only solution I see is to construct a Converter for the
> whole entry object. I wanted to avoid this since the entry is a complex
> object and I want to keep the coding to marshall/unmarshall to a minimum.
> 
> I'd like to propose this scenario and ask for reopen of
> XSTR-367<http://jira.codehaus.org/browse/XSTR-367>

Isn't it possible for you to do so? Your use case is actually valid.

However, don't expect a fast solution here. The main problem is, that there 
*is* actually no proper context for a SingleValueConverter. The 
UnmarshallingContext is a construct of the MarshallingStrategy. It can be 
called for every XML *element* to find the proper converter and will execute 
the conversion.

Attributes are handled completely differently. A SingleValueConverter can be 
requested by every converter that uses the Mapper instance of XStream. To 
support at least the custom values from the UnmarshallingContext means that 
all those converters that currently use the SingleValueConverter have to 
support a modified interface, not to mention from all custom converters of 
the XStream clients using or implementing SingleValueConverter...

As current alternative you may derive the EntryConverter from the 
ReflectionConverter (assuming that this one will handle the Entry by 
default) and handle the date before calling the super class. You will have 
to configure XStream to omit the field containing the date though, because 
you're handling it "manually":

=================== %< ============
 class EntryConverter extends ReflectionConverter {
   EntryConverter(Mapper mapper, ReflectionProvider reflectionProvider) {
     super(mapper, reflectionProvider);
   }

   boolean canConvert(Class type) {
     return type = Entry.class;
   }

   void marshal(Object original, HierarchicalStreamWriter writer, 
MarshallingContext context) {
     Entry entry = (Entry)original;
     DateFormat format = (DateFormat)context.get("format");
     writer.addAttribute("date", format.format(entry.getDate()));
     super.marshal(original, writer, context);
   }

   Object unmarshal(Object result, HierarchicalStreamReader reader, 
UnmarshallingContext context) {
     DateFormat format = (DateFormat)context.get("format");
     Date date = format.parse(reader.getAttribute("date"));
     Entry entry = (Entry)super.unmarshal(result, reader, context);
     entry.setDate(date);
     return entry;
   }
 }

=================== %< ============

Regards,
Jörg



---------------------------------------------------------------------
To unsubscribe from this list, please visit:

    http://xircles.codehaus.org/manage_email


Reply via email to