(no commit message)
[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.lang.StringEscapeUtils;
18 import org.apache.commons.logging.Log;
19 import org.apache.commons.logging.LogFactory;
20 import org.w3c.dom.DOMException;
21 import org.w3c.dom.Document;
22 import org.w3c.dom.DocumentFragment;
23 import org.w3c.dom.NamedNodeMap;
24 import org.w3c.dom.Node;
25 import org.w3c.dom.NodeList;
26 import org.xml.sax.InputSource;
27
28 public class FormattedTextAdapter extends XmlAdapter<FormattedText,java.lang.String> {
29 public static String[] NAMESPACE_PREFIXES = {"xmlns:common",
30 "xmlns:agent",
31 "xmlns:description",
32 "xmlns:location",
33 "xmlns:media",
34 "xmlns:molecular",
35 "xmlns:name",
36 "xmlns:occurence",
37 "xmlns:reference",
38 "xmlns:taxon",
39 "xmlns:view",
40 "xmlns:xsi"};
41
42 private static final Log log = LogFactory.getLog(FormattedTextAdapter.class);
43
44 public FormattedText marshal(String string) throws Exception {
45 if(string != null) {
46
47 string = StringEscapeUtils.escapeXml(string);
48 String documentString = "<?xml version=\"1.0\"?><Text>" + string + "</Text>";
49 log.debug("Parsing " + documentString);
50
51 FormattedText text = new FormattedText();
52 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
53 DocumentBuilder parser = factory.newDocumentBuilder();
54 //
55 // System.err.println(documentString);
56 Document document = parser.parse(new InputSource(new StringReader(documentString)));
57
58 NodeList childNodes = document.getDocumentElement().getChildNodes();
59
60 for(int i = 0; i < childNodes.getLength(); i++) {
61 Node node = childNodes.item(i);
62 if(node instanceof org.w3c.dom.Text ) {
63 org.w3c.dom.Text textNode = (org.w3c.dom.Text) node;
64 //if (documentString.contains("United Kingdom")){
65 // System.err.println("w3c..." + textNode.getData());
66 //}
67
68 text.getContent().add(textNode.getTextContent());
69 } else {
70 text.getContent().add(node);
71 //System.err.println("no w3c..." + text.toString());
72 }
73 }
74 return text;
75 }
76 return null;
77 }
78
79 public String unmarshal(FormattedText text) throws Exception {
80 DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
81 Document document = factory.newDocumentBuilder().newDocument();
82 DocumentFragment documentFragment = document.createDocumentFragment();
83
84 for(Object object : text.getContent()) {
85 if(object instanceof String) {
86 String string = (String)object;
87 documentFragment.appendChild(document.createTextNode(string));
88 } else {
89 Node node = (Node)object;
90 NamedNodeMap attributes = node.getAttributes();
91 for(String prefix : FormattedTextAdapter.NAMESPACE_PREFIXES) {
92 try{
93 attributes.removeNamedItem(prefix);
94 } catch(DOMException de){
95 if(de.code != DOMException.NOT_FOUND_ERR) {
96 System.err.println("no such prefix: " + prefix);
97 throw de;
98 }
99 }
100
101 }
102
103 documentFragment.appendChild(document.importNode(node,true));
104 }
105
106 }
107
108 TransformerFactory transformerFactory = TransformerFactory.newInstance();
109 Transformer transformer = transformerFactory.newTransformer();
110 transformer.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION , "yes");
111
112 Source input = new DOMSource(documentFragment);
113 StringWriter stringWriter = new StringWriter();
114 Result output = new StreamResult(stringWriter);
115 transformer.transform(input, output);
116 return stringWriter.toString();
117 }
118 }