package org.activityinfo.io.xform.form; import com.google.common.base.Strings; import org.activityinfo.io.xform.Namespaces; import org.w3c.dom.*; import javax.xml.bind.annotation.adapters.XmlAdapter; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; public class InstanceElementAdapter extends XmlAdapter<Object, InstanceElement> { private DocumentBuilder documentBuilder; public InstanceElementAdapter() { try { DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); documentBuilder = dbf.newDocumentBuilder(); } catch(Exception e) { throw new RuntimeException(e); } } @Override public InstanceElement unmarshal(Object v) throws Exception { Element element = (Element) v; return createInstanceElement(element); } private InstanceElement createInstanceElement(Element element) { InstanceElement instanceElement = new InstanceElement(element.getLocalName()); instanceElement.setId(Strings.emptyToNull(element.getAttribute("id"))); StringBuilder text = new StringBuilder(); NodeList childNodes = element.getChildNodes(); for(int i=0;i!=childNodes.getLength();++i) { Node child = childNodes.item(i); if(child instanceof Text) { text.append(((Text) child).getData()); } else if(child instanceof Element) { instanceElement.getChildren().add(createInstanceElement((Element)child)); } } if(text.length() > 0) { instanceElement.setValue(text.toString()); } return instanceElement; } @Override public Object marshal(InstanceElement instanceEl) throws Exception { Document document = documentBuilder.newDocument(); return createElement(document, instanceEl); } private Element createElement(Document document, InstanceElement instanceEl) { Element element = document.createElementNS(Namespaces.XFORM, instanceEl.getName()); if(!Strings.isNullOrEmpty(instanceEl.getId())) { element.setAttribute("id", instanceEl.getId()); } if(instanceEl.hasChildren()) { for(InstanceElement child : instanceEl.getChildren()) { element.appendChild(createElement(document, child)); } } else { element.setTextContent(instanceEl.getValue()); } return element; } }