package org.simpleframework.xml.convert;
import java.io.StringWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import org.simpleframework.xml.Attribute;
import org.simpleframework.xml.Root;
import org.simpleframework.xml.Serializer;
import org.simpleframework.xml.Transient;
import org.simpleframework.xml.ValidationTestCase;
import org.simpleframework.xml.core.Persister;
import org.simpleframework.xml.strategy.Strategy;
import org.simpleframework.xml.stream.InputNode;
import org.simpleframework.xml.stream.NodeMap;
import org.simpleframework.xml.stream.OutputNode;
public class DynamicMapOfAttributesTest extends ValidationTestCase {
private static final String SOURCE =
"<Car color='green' length='3.3' nrOfDoors='2' topSpeed='190' brand='audi' /> ";
private static class CarConverter implements Converter<Car> {
private final Persister persister;
public CarConverter() {
this.persister = new Persister();
}
public Car read(InputNode node) throws Exception {
Car car = persister.read(Car.class, node, false);
NodeMap<InputNode> attributes = node.getAttributes();
for(String name : attributes) {
InputNode attribute = attributes.get(name);
String value = attribute.getValue();
car.furtherAttributes.put(name, value);
}
return car;
}
public void write(OutputNode node, Car car) throws Exception {
Set<String> keys = car.furtherAttributes.keySet();
for(String name : keys) {
String value = car.furtherAttributes.get(name);
node.setAttribute(name, value);
}
}
}
@Root(name="Car")
@Convert(CarConverter.class)
private static class Car
{
@Attribute
private double length;
@Attribute
private String color;
@Attribute
private int nrOfDoors;
@Transient
private Map<String, String> furtherAttributes;
public Car() {
this.furtherAttributes = new HashMap<String, String>();
}
}
public void testConverter() throws Exception {
Strategy strategy = new AnnotationStrategy();
Serializer serializer = new Persister(strategy);
StringWriter buffer = new StringWriter();
Car car = serializer.read(Car.class, SOURCE, false);
assertNotNull(car);
assertEquals(car.length, 3.3);
assertEquals(car.color, "green");
assertEquals(car.nrOfDoors, 2);
assertEquals(car.furtherAttributes.get("topSpeed"), "190");
assertEquals(car.furtherAttributes.get("brand"), "audi");
serializer.write(car, System.out);
serializer.write(car, buffer);
String text = buffer.toString();
assertElementExists(text, "/Car");
assertElementHasAttribute(text, "/Car", "length", "3.3");
assertElementHasAttribute(text, "/Car", "color", "green");
assertElementHasAttribute(text, "/Car", "nrOfDoors", "2");
assertElementHasAttribute(text, "/Car", "topSpeed", "190");
assertElementHasAttribute(text, "/Car", "brand", "audi");
}
}