package io.hummer.prefetch.sim.util; import io.hummer.util.xml.XMLUtil; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.SortedMap; import java.util.TreeMap; import javax.xml.bind.annotation.adapters.XmlAdapter; import org.w3c.dom.Element; public class CollectionXmlAdapter extends XmlAdapter<Object, Object> { private static final String NAMESPACE = "http://jaxbAdapter"; private static XMLUtil xmlUtil = new XMLUtil(); @Override @SuppressWarnings("all") public Object marshal(Object o) throws Exception { StringBuilder b = new StringBuilder(); if(o instanceof Map) { Map map = (Map)o; String name = "map"; if(o instanceof SortedMap) { name = "sortedMap"; } b.append("<j:" + name + " xmlns:j=\"" + NAMESPACE + "\" j:type=\"" + name + "\">"); for(Object e : map.entrySet()) { Entry entry = (Entry)e; b.append("<j:e>"); b.append("<k>"); b.append(xmlUtil.toString(marshal(entry.getKey()))); b.append("</k>"); b.append("<v>"); b.append(xmlUtil.toString(marshal(entry.getValue()))); b.append("</v>"); b.append("</j:e>"); } b.append("</j:" + name + ">"); } else if(o instanceof List) { List list = (List)o; b.append("<j:list xmlns:j=\"" + NAMESPACE + "\">"); for(Object i : list) { b.append("<j:i>"); b.append(xmlUtil.toString(marshal(i))); b.append("</j:i>"); } b.append("</j:list>"); } else if(o instanceof Element) { return (Element)o; } else { return xmlUtil.toElement(o); } return xmlUtil.toElement(b.toString()); } @Override @SuppressWarnings("all") public Object unmarshal(Object v) throws Exception { Element e = (Element)v; List<Element> children = xmlUtil.getChildElements(e); if(NAMESPACE.equals(e.getNamespaceURI()) || (children.size() > 0 && NAMESPACE.equals(children.get(0).getNamespaceURI()))) { if(e.getLocalName().equals("map") || e.getLocalName().equals("sortedMap") || (children.size() > 0 && children.get(0).getLocalName().equals("e"))) { // e = map entry Map map = new HashMap(); if(e.getLocalName().equals("sortedMap") || e.getAttributeNS(NAMESPACE, "type").equals("sortedMap")) { map = new TreeMap(); } for(Element entry : children) { List<Element> keyAndValue = xmlUtil.getChildElements(entry); Object key = unmarshal(xmlUtil.getChildElements(keyAndValue.get(0)).get(0)); Object value = unmarshal(xmlUtil.getChildElements(keyAndValue.get(1)).get(0)); map.put(key, value); } return map; } else if(e.getLocalName().equals("list") || (children.size() > 0 && children.get(0).getLocalName().equals("i"))) { // i = list item List list = new LinkedList(); for(Element item : children) { Object itemObj = unmarshal(xmlUtil.getChildElements(item).get(0)); list.add(itemObj); } return list; } } Object returnObj = xmlUtil.toJaxbObject(e); return returnObj; } }