package no.difi.datahotel.util.formater;
import java.util.AbstractMap;
import java.util.Map;
import no.difi.datahotel.model.FieldLight;
import no.difi.datahotel.model.MetadataLight;
import no.difi.datahotel.model.Result;
import no.difi.datahotel.util.FormaterInterface;
import no.difi.datahotel.util.RequestContext;
import no.difi.datahotel.util.SimpleError;
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 com.thoughtworks.xstream.io.xml.XmlFriendlyNameCoder;
/**
* Class representing an XML.
*/
public class XMLFormater implements FormaterInterface {
private XStream xstream;
public XMLFormater() {
XmlFriendlyNameCoder replacer = new XmlFriendlyNameCoder("dd", "_");
xstream = new XStream(new DomDriver("UTF-8", replacer));
xstream.alias("metadata", MetadataLight.class);
xstream.alias("result", Result.class);
xstream.alias("entry", Map.class);
xstream.alias("field", FieldLight.class);
xstream.alias("error", SimpleError.class);
xstream.useAttributeFor("page", Long.class);
xstream.useAttributeFor("pages", Long.class);
xstream.useAttributeFor("posts", Long.class);
xstream.registerConverter(new MapConverter());
}
@Override
public String format(Object object, RequestContext context) {
return xstream.toXML(object);
}
static class MapConverter implements Converter {
@SuppressWarnings("rawtypes")
public boolean canConvert(Class clazz) {
return AbstractMap.class.isAssignableFrom(clazz);
}
@SuppressWarnings({ "rawtypes", "unchecked" })
public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
Map<String, String> map = (AbstractMap) value;
for (String key : map.keySet()) {
writer.startNode(key);
writer.setValue(map.get(key));
writer.endNode();
}
}
@Override
public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
return null;
}
}
}