Hi Marcin,

Stefaniuk Marcin wrote:

> I was searching for the answer through the list but haven't found
> anything.
> 
> I have a class with an attribute of interface type.
> @XStreamAlias("given")
> public class Given {
>        @XStreamAsAttribute
>        public String name;
>        public Mock mock;
> }
> 
> Interface is very simple:
> @XStreamInclude({ExactMock.class})
> public interface Mock {
>        void execute();
> }
> 
> I have implementations of the interface:
> @XStreamAlias("exact-mock")
> public class ExactMock implements Mock {
>        @XStreamAsAttribute
>        String endpoint;
>        @XStreamAsAttribute
>        String name;
> 
>        @Override
>        public void execute() {
>              // TODO Auto-generated method stub
>        }
> }
> 
> It is easy to marshal as:
> <given that="My entry condition">
>        <mock type="exact-mock"/>
> </given>
> 
> Given the above class structure (type annotations are part of my
> experiments) I would like to receive below XML structure: <given that="My
> entry condition">
>        <exact-mock endpoint="my-endpoint" name="name-so-so" />
> </given>
> 
> Important is to put aliases to element names but not any attribute. I have
> attempt to make own converter but I would like to change main element
> generation only. My implementations of interface would radically vary so
> rest of marshall / unmarshall I would like to delegate to XStream again.
> It should allow to write interface implementations without change of
> converter. Is it possible?

First you have to understand that the tag name is produced by the converter 
that handles the container i.e. in your case it is the converter (probably 
the ReflectionConverter) that handles "Given". The ReflectionConverter uses 
the field names as tag names to assign the individual elements at 
deserialization time again to the appropriate field.

What you can do now is to derive a custom converter from the 
ReflectionConverter and declare the "mock" field to be omitted, handle it 
yourself in the custom converter and call super afterwards (see my example 
in the Hibernate thread some days ago).

Another approach is the usage of an implicit array here, but you would have 
to change Given:

======== %< ===========
@XStreamAlias("given")
public class Given {
  @XStreamAsAttribute
  public String name;
  @XStreamImplicit
  public Mock[] mock;
}
======== %< ===========

In this case the ReflectionProvider will associate any element that is not a 
field name, but represents a class (resp. an alias for a class) of type 
"Mock" with the array in the field "mock" - matching your XML exactly.

- Jörg


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

    http://xircles.codehaus.org/manage_email


Reply via email to