Hi Elena,
Elena Montojo Vanrell wrote:
> Good morning,
>
> I have an object with many variables, three of them are an Integer and 2
> dates. I am using xstream to create an output xml, but instead of display
> the integer I want an String depending also on the dates, so in a "normal"
> case i would create an static method (displayStatus(statusId, date1,
> date2);)
>
> how should i do this? Do I need to create a new variable (String status)
> and add @XStreamOmitField to statusId or there is a "cleaner" posibility?
>
> This is the code as I have it now, I would like to replace the underlined
> code by the dates on fromDate and arcDate. is that possible?
>
> "
> @XStreamConverter(
> StatusConverter.class)
> private Integer statusId;
>
> private Date fromDate;
> private Date arcDate;
>
> ....
>
> public class StatusConverter implements Converter {
> @Override
> public void marshal(Object o, HierarchicalStreamWriter
> hierarchicalStreamWriter, MarshallingContext marshallingContext) {
> Integer statusId = (Integer) o;
>
>
hierarchicalStreamWriter.setValue(PropertyFormatter.displayStatus(statusId,
> *new Date(), new Date()*));
> }
>
> @Override
> public Object unmarshal(HierarchicalStreamReader
> hierarchicalStreamReader, UnmarshallingContext unmarshallingContext) {
> return hierarchicalStreamReader.getValue();
> }
>
>
> @Override
> public boolean canConvert(Class aClass) {
> return aClass.equals(Integer.class);
> }
> }
>
>
> "
>
> Thank you in advance.
the problem in this approach is that your local converter has no access to
the two date fields, it gets only the integer. You will need in any case a
custom converter for the type that contains these fields.
Here you have now two possibilities:
1/ Implement a custom converter as it is explained in the converter tutorial
i.e. this converter must handle all fields of the type, not only these 3.
2/ Derive it from ReflectionConverter, overload canConvert (required to
handle only your type) and overload marshal/unmarshal like
======== %< =======
public void marshal(Object o, HierarchicalStreamWriter writer,
MarshallingContext context) {
YourType instance = (YourType) o;
context.put("fromDate", instance.fromDate);
context.put("arcDate", instance.arcDate);
// call to super only allowed
// if you did nothing yet with the writer
super.marshal(o, writer, context);
}
public Object unmarshal(HierarchicalStreamReader reader,
UnmarshallingContext context) {
// call to super only allowed
// if you did nothing yet with the reader
YourType instance = (YourType) super.unmarshal(reader, context);
instance.fromDate = (Date)context.get("fromDate");
instance.arcDate = (Date)context.get("arcDate");
return instance;
}
======== %< =======
and your StatusConverter should use the contest to get the dates form the
context at marshalling time and set the dates into the context when
unmarshalling.
You will have to declare the two date fields either as transient or add an
annotation to omit them.
Your choice, hope it helps,
Jörg
---------------------------------------------------------------------
To unsubscribe from this list, please visit:
http://xircles.codehaus.org/manage_email