package org.simpleframework.xml.convert;
import java.io.StringWriter;
import org.simpleframework.xml.Element;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.ValidationTestCase;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.stream.Format;
import org.simpleframework.xml.stream.HyphenStyle;
import org.simpleframework.xml.stream.InputNode;
import org.simpleframework.xml.stream.OutputNode;
import org.simpleframework.xml.stream.Style;
public class CombinedStrategyTest extends ValidationTestCase {
private static class Item {
private int value;
public Item(int value) {
this.value = value;
}
public int getValue(){
return value;
}
}
@Root
@Convert(ExtendedItemConverter.class)
private static class ExtendedItem extends Item {
public ExtendedItem(int value) {
super(value);
}
}
private static class AnnotationItemConverter implements Converter<Item> {
public Item read(InputNode node) throws Exception {
return new Item(Integer.parseInt(node.getAttribute("value").getValue()));
}
public void write(OutputNode node, Item value) throws Exception {
node.setAttribute("value", String.valueOf(value.getValue()));
node.setAttribute("type", getClass().getName());
}
}
private static class RegistryItemConverter implements Converter<Item> {
public Item read(InputNode node) throws Exception {
return new Item(Integer.parseInt(node.getNext().getValue()));
}
public void write(OutputNode node, Item value) throws Exception {
node.getChild("value").setValue(String.valueOf(value.getValue()));
node.getChild("type").setValue(getClass().getName());
}
}
private static class ExtendedItemConverter implements Converter<ExtendedItem> {
public ExtendedItem read(InputNode node) throws Exception {
return new ExtendedItem(Integer.parseInt(node.getAttribute("value").getValue()));
}
public void write(OutputNode node, ExtendedItem value) throws Exception {
node.setAttribute("value", String.valueOf(value.getValue()));
node.setAttribute("type", getClass().getName());
}
}
@Root
private static class CombinationExample {
@Element
private Item item; // handled by the registry
@Element
@Convert(AnnotationItemConverter.class) // handled by annotation
private Item overriddenItem;
@Element
private Item extendedItem; // handled by class annotation
public CombinationExample(int item, int overriddenItem, int extendedItem) {
this.item = new Item(item);
this.overriddenItem = new Item(overriddenItem);
this.extendedItem = new ExtendedItem(extendedItem);
}
public Item getItem(){
return item;
}
public Item getOverriddenItem(){
return overriddenItem;
}
public Item getExtendedItem() {
return extendedItem;
}
}
public void testCombinedStrategy() throws Exception {
Registry registry = new Registry();
AnnotationStrategy annotationStrategy = new AnnotationStrategy();
RegistryStrategy registryStrategy = new RegistryStrategy(registry, annotationStrategy);
Persister persister = new Persister(registryStrategy);
CombinationExample example = new CombinationExample(1, 2, 3);
StringWriter writer = new StringWriter();
registry.bind(Item.class, RegistryItemConverter.class);
persister.write(example, writer);
String text = writer.toString();
System.out.println(text);
assertElementExists(text, "/combinationExample/item/value");
assertElementHasValue(text, "/combinationExample/item/value", "1");
assertElementHasValue(text, "/combinationExample/item/type", RegistryItemConverter.class.getName());
assertElementExists(text, "/combinationExample/overriddenItem");
assertElementHasAttribute(text, "/combinationExample/overriddenItem", "value", "2");
assertElementHasAttribute(text, "/combinationExample/overriddenItem", "type", AnnotationItemConverter.class.getName());
assertElementExists(text, "/combinationExample/extendedItem");
assertElementHasAttribute(text, "/combinationExample/extendedItem", "value", "3");
assertElementHasAttribute(text, "/combinationExample/extendedItem", "type", ExtendedItemConverter.class.getName());
}
public void testCombinationStrategyWithStyle() throws Exception {
Registry registry = new Registry();
AnnotationStrategy annotationStrategy = new AnnotationStrategy();
RegistryStrategy registryStrategy = new RegistryStrategy(registry, annotationStrategy);
Style style = new HyphenStyle();
Format format = new Format(style);
Persister persister = new Persister(registryStrategy, format);
CombinationExample example = new CombinationExample(1, 2, 3);
StringWriter writer = new StringWriter();
registry.bind(Item.class, RegistryItemConverter.class);
persister.write(example, writer);
String text = writer.toString();
System.out.println(text);
assertElementExists(text, "/combination-example/item/value");
assertElementHasValue(text, "/combination-example/item/value", "1");
assertElementHasValue(text, "/combination-example/item/type", RegistryItemConverter.class.getName());
assertElementExists(text, "/combination-example/overridden-item");
assertElementHasAttribute(text, "/combination-example/overridden-item", "value", "2");
assertElementHasAttribute(text, "/combination-example/overridden-item", "type", AnnotationItemConverter.class.getName());
assertElementExists(text, "/combination-example/extended-item");
assertElementHasAttribute(text, "/combination-example/extended-item", "value", "3");
assertElementHasAttribute(text, "/combination-example/extended-item", "type", ExtendedItemConverter.class.getName());
}
}