17cdb73dc0621ba3aa5f166a16390a31fb20556c
[cdmlib.git] / cdmlib-model / src / main / java / eu / etaxonomy / cdm / jaxb / FormattedTextAdapter.java
1 package eu.etaxonomy.cdm.jaxb;
2
3 import java.io.StringReader;
4 import java.io.StringWriter;
5
6 import javax.xml.bind.annotation.adapters.XmlAdapter;
7 import javax.xml.parsers.DocumentBuilder;
8 import javax.xml.parsers.DocumentBuilderFactory;
9 import javax.xml.transform.OutputKeys;
10 import javax.xml.transform.Result;
11 import javax.xml.transform.Source;
12 import javax.xml.transform.Transformer;
13 import javax.xml.transform.TransformerFactory;
14 import javax.xml.transform.dom.DOMSource;
15 import javax.xml.transform.stream.StreamResult;
16
17 import org.apache.commons.logging.Log;
18 import org.apache.commons.logging.LogFactory;
19 import org.w3c.dom.DOMException;
20 import org.w3c.dom.Document;
21 import org.w3c.dom.DocumentFragment;
22 import org.w3c.dom.NamedNodeMap;
23 import org.w3c.dom.Node;
24 import org.w3c.dom.NodeList;
25 import org.xml.sax.InputSource;
26
27 public class FormattedTextAdapter extends XmlAdapter<FormattedText,java.lang.String> {
28 public static String[] NAMESPACE_PREFIXES = {"xmlns:common",
29 "xmlns:agent",
30 "xmlns:description",
31 "xmlns:location",
32 "xmlns:media",
33 "xmlns:molecular",
34 "xmlns:name",
35 "xmlns:occurence",
36 "xmlns:reference",
37 "xmlns:taxon",
38 "xmlns:view",
39 "xmlns:xsi"};
40
41 private static final Log log = LogFactory.getLog(FormattedTextAdapter.class);
42
43 public FormattedText marshal(String string) throws Exception {
44 if(string != null) {
45 String documentString = "<?xml version=\"1.0\"?><text>" + string + "</text>";
46 log.debug("Parsing " + documentString);
47 FormattedText text = new FormattedText();
48 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
49 DocumentBuilder parser = factory.newDocumentBuilder();
50 Document document = parser.parse(new InputSource(new StringReader(documentString)));
51 NodeList childNodes = document.getDocumentElement().getChildNodes();
52 for(int i = 0; i < childNodes.getLength(); i++) {
53 Node node = childNodes.item(i);
54 if(node instanceof org.w3c.dom.Text ) {
55 org.w3c.dom.Text textNode = (org.w3c.dom.Text) node;
56
57 text.getContent().add(textNode.getTextContent());
58 } else {
59 text.getContent().add(node);
60 }
61 }
62 return text;
63 }
64 return null;
65 }
66
67 public String unmarshal(FormattedText text) throws Exception {
68 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
69 Document document = factory.newDocumentBuilder().newDocument();
70 DocumentFragment documentFragment = document.createDocumentFragment();
71
72 for(Object object : text.getContent()) {
73 if(object instanceof String) {
74 String string = (String)object;
75 documentFragment.appendChild(document.createTextNode(string));
76 } else {
77 Node node = (Node)object;
78 NamedNodeMap attributes = node.getAttributes();
79 for(String prefix : FormattedTextAdapter.NAMESPACE_PREFIXES) {
80 try{
81 attributes.removeNamedItem(prefix);
82 } catch(DOMException de){
83 if(de.code != DOMException.NOT_FOUND_ERR) {
84 throw de;
85 }
86 }
87
88 }
89
90 documentFragment.appendChild(document.importNode(node,true));
91 }
92
93 }
94
95 TransformerFactory transformerFactory = TransformerFactory.newInstance();
96 Transformer transformer = transformerFactory.newTransformer();
97 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION , "yes");
98
99 Source input = new DOMSource(documentFragment);
100 StringWriter stringWriter = new StringWriter();
101 Result output = new StreamResult(stringWriter);
102 transformer.transform(input, output);
103 return stringWriter.toString();
104 }
105 }