package net.codjo.dataprocess.common.codec;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.DomDriver;
import java.util.ArrayList;
import java.util.List;
/**
*
*/
public class ListXmlCodec {
private static final XStream XSTREAM = new XStream(new DomDriver());
static {
XSTREAM.aliasType("list", List.class);
XSTREAM.registerConverter(new ArrayListConverter());
}
private ListXmlCodec() {
}
public static synchronized String encode(List<String> list) {
return XSTREAM.toXML(list);
}
@SuppressWarnings("unchecked")
public static synchronized List<String> decode(String data) {
return (List<String>)XSTREAM.fromXML(data);
}
private static class ArrayListConverter implements Converter {
public boolean canConvert(Class type) {
return List.class.isAssignableFrom(type);
}
@SuppressWarnings("unchecked")
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
List<String> list = (List<String>)source;
for (String data : list) {
writer.startNode("data");
writer.addAttribute("value", data);
writer.endNode();
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
List<String> list = new ArrayList<String>();
while (reader.hasMoreChildren()) {
reader.moveDown();
String data = reader.getAttribute("value");
list.add(data);
reader.moveUp();
}
return list;
}
}
}