package org.simpleframework.xml.convert;
import java.io.StringWriter;
import junit.framework.TestCase;
import org.simpleframework.xml.Default;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.strategy.Strategy;
import org.simpleframework.xml.stream.InputNode;
import org.simpleframework.xml.stream.OutputNode;
public class WrapperTest extends TestCase {
private static class Wrapper {
private final Object value;
public Wrapper(Object value) {
this.value = value;
}
public Object get(){
return value;
}
}
private static class WrapperConverter implements Converter<Wrapper> {
private final Serializer serializer;
public WrapperConverter(Serializer serializer) {
this.serializer = serializer;
}
public Wrapper read(InputNode node) throws Exception {
InputNode type = node.getAttribute("type");
InputNode child = node.getNext();
String className = type.getValue();
Object value = null;
if(child != null) {
value = serializer.read(Class.forName(className), child);
}
return new Wrapper(value);
}
public void write(OutputNode node, Wrapper wrapper) throws Exception {
Object value = wrapper.get();
Class type = value.getClass();
String className = type.getName();
node.setAttribute("type", className);
serializer.write(value, node);
}
}
@Root
@Default(required=false)
private static class Entry {
private String name;
private String value;
public Entry(@Element(name="name", required=false) String name, @Element(name="value", required=false) String value){
this.name = name;
this.value = value;
}
}
@Root
@Default(required=false)
private static class WrapperExample {
@Convert(WrapperConverter.class)
private Wrapper wrapper;
public WrapperExample(@Element(name="wrapper", required=false) Wrapper wrapper) {
this.wrapper = wrapper;
}
}
public void testWrapper() throws Exception{
Registry registry = new Registry();
Strategy strategy = new RegistryStrategy(registry);
Serializer serializer = new Persister(strategy);
Entry entry = new Entry("name", "value");
Wrapper wrapper = new Wrapper(entry);
WrapperExample example = new WrapperExample(wrapper);
WrapperConverter converter = new WrapperConverter(serializer);
StringWriter writer = new StringWriter();
registry.bind(Wrapper.class, converter);
serializer.write(example, writer);
serializer.read(WrapperExample.class, writer.toString());
System.err.println(writer.toString());
}
}