package org.simpleframework.xml.convert; import java.io.StringWriter; import org.simpleframework.xml.Default; import org.simpleframework.xml.DefaultType; import org.simpleframework.xml.Element; import org.simpleframework.xml.Root; import org.simpleframework.xml.Serializer; import org.simpleframework.xml.ValidationTestCase; import org.simpleframework.xml.core.Persister; import org.simpleframework.xml.stream.CamelCaseStyle; import org.simpleframework.xml.stream.Format; import org.simpleframework.xml.stream.InputNode; import org.simpleframework.xml.stream.OutputNode; import org.simpleframework.xml.stream.Style; public class RegistryConverterTest extends ValidationTestCase { public static class EnvelopeConverter implements Converter<Envelope> { private final Serializer serializer; public EnvelopeConverter(Serializer serializer) { this.serializer = serializer; } public Envelope read(InputNode node) throws Exception { return serializer.read(Envelope.class, node); } public void write(OutputNode node, Envelope value) throws Exception { serializer.write(value.getValue(), node); } } public static class PersonConverter implements Converter<Person> { private final Serializer serializer; public PersonConverter(Serializer serializer) { this.serializer = serializer; } public Person read(InputNode node) throws Exception { return serializer.read(PersonDelegate.class, node.getNext()); } public void write(OutputNode node, Person value) throws Exception { Person person = new PersonDelegate(value); serializer.write(person, node); } @Root @Default(DefaultType.PROPERTY) private static class PersonDelegate extends Person { public PersonDelegate() { super(); } public PersonDelegate(Person person) { super(person.name, person.age); } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } } } @Root private static class OrderItem { @Element private Envelope envelope; public OrderItem() { super(); } public OrderItem(Envelope envelope) { this.envelope = envelope; } } @Root @Default private static class PersonProfile { private Person person; public PersonProfile() { super(); } public PersonProfile(Person person) { this.person = person; } } private static class Person { protected String name; protected int age; public Person() { super(); } public Person(String name, int age) { this.name = name; this.age = age; } } @Root @Default private static class Customer { private String name; private String address; public Customer() { super(); } public Customer(String name, String address) { this.name = name; this.address = address; } } private static class Envelope { private final Object value; public Envelope(Object value) { this.value = value; } public Object getValue() { return value; } } public void testConverter() throws Exception { Style style = new CamelCaseStyle(); Format format = new Format(style); Registry registry = new Registry(); Customer customer = new Customer("Niall", "Some Place"); Envelope envelope = new Envelope(customer); RegistryStrategy strategy = new RegistryStrategy(registry); Serializer serializer = new Persister(strategy, format); Converter converter = new EnvelopeConverter(serializer); registry.bind(Envelope.class, converter); OrderItem order = new OrderItem(envelope); serializer.write(order, System.out); } public void testPersonConverter() throws Exception { Style style = new CamelCaseStyle(); Format format = new Format(style); Registry registry = new Registry(); Person person = new Person("Niall", 30); RegistryStrategy strategy = new RegistryStrategy(registry); Serializer serializer = new Persister(strategy, format); Converter converter = new PersonConverter(serializer); StringWriter writer = new StringWriter(); registry.bind(Person.class, converter); PersonProfile profile = new PersonProfile(person); serializer.write(profile, writer); System.out.println(writer.toString()); PersonProfile read = serializer.read(PersonProfile.class, writer.toString()); assertEquals(read.person.name, "Niall"); assertEquals(read.person.age, 30); } }