1 package eu
.etaxonomy
.cdm
.jaxb
;
3 import java
.io
.StringReader
;
4 import java
.io
.StringWriter
;
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
;
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
;
28 public class FormattedTextAdapter
extends XmlAdapter
<FormattedText
,java
.lang
.String
> {
29 public static String
[] NAMESPACE_PREFIXES
= {"xmlns:common",
42 private static final Log log
= LogFactory
.getLog(FormattedTextAdapter
.class);
44 public FormattedText
marshal(String string
) throws Exception
{
47 string
= StringEscapeUtils
.escapeXml(string
);
48 String documentString
= "<?xml version=\"1.0\"?><Text>" + string
+ "</Text>";
49 log
.debug("Parsing " + documentString
);
51 FormattedText text
= new FormattedText();
52 DocumentBuilderFactory factory
= DocumentBuilderFactory
.newInstance();
53 DocumentBuilder parser
= factory
.newDocumentBuilder();
55 // System.err.println(documentString);
56 Document document
= parser
.parse(new InputSource(new StringReader(documentString
)));
58 NodeList childNodes
= document
.getDocumentElement().getChildNodes();
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());
68 text
.getContent().add(textNode
.getTextContent());
70 text
.getContent().add(node
);
71 //System.err.println("no w3c..." + text.toString());
79 public String
unmarshal(FormattedText text
) throws Exception
{
80 DocumentBuilderFactory factory
= DocumentBuilderFactory
.newInstance();
81 Document document
= factory
.newDocumentBuilder().newDocument();
82 DocumentFragment documentFragment
= document
.createDocumentFragment();
84 for(Object object
: text
.getContent()) {
85 if(object
instanceof String
) {
86 String string
= (String
)object
;
87 documentFragment
.appendChild(document
.createTextNode(string
));
89 Node node
= (Node
)object
;
90 NamedNodeMap attributes
= node
.getAttributes();
91 for(String prefix
: FormattedTextAdapter
.NAMESPACE_PREFIXES
) {
93 attributes
.removeNamedItem(prefix
);
94 } catch(DOMException de
){
95 if(de
.code
!= DOMException
.NOT_FOUND_ERR
) {
96 System
.err
.println("no such prefix: " + prefix
);
103 documentFragment
.appendChild(document
.importNode(node
,true));
108 TransformerFactory transformerFactory
= TransformerFactory
.newInstance();
109 Transformer transformer
= transformerFactory
.newTransformer();
110 transformer
.setOutputProperty(OutputKeys
.OMIT_XML_DECLARATION
, "yes");
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();