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.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
*
*/
public class MapXmlCodec {
private static final XStream XSTREAM = new XStream(new DomDriver());
static {
XSTREAM.aliasType("map", Map.class);
XSTREAM.registerConverter(new HashMapConverter());
}
private MapXmlCodec() {
}
public static synchronized String encode(Map<String, String> map) {
return XSTREAM.toXML(map);
}
@SuppressWarnings("unchecked")
public static synchronized Map<String, String> decode(String data) {
return (Map<String, String>)XSTREAM.fromXML(data);
}
private static class HashMapConverter implements Converter {
public boolean canConvert(Class type) {
return Map.class.isAssignableFrom(type);
}
@SuppressWarnings("unchecked")
public void marshal(Object source, HierarchicalStreamWriter writer, MarshallingContext context) {
Map<String, String> map = (Map<String, String>)source;
for (Entry<String, String> entry : map.entrySet()) {
writer.startNode("data");
writer.addAttribute("key", entry.getKey());
writer.addAttribute("value", entry.getValue());
writer.endNode();
}
}
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
Map<String, String> map = new HashMap<String, String>();
while (reader.hasMoreChildren()) {
reader.moveDown();
String key = reader.getAttribute("key");
String value = reader.getAttribute("value");
map.put(key, value);
reader.moveUp();
}
return map;
}
}
}