1 package org
.argeo
.slc
.detached
;
3 import java
.io
.StringReader
;
4 import java
.io
.StringWriter
;
5 import java
.util
.Enumeration
;
6 import java
.util
.Properties
;
8 import javax
.xml
.transform
.Result
;
9 import javax
.xml
.transform
.Source
;
10 import javax
.xml
.transform
.Transformer
;
11 import javax
.xml
.transform
.TransformerException
;
12 import javax
.xml
.transform
.TransformerFactory
;
13 import javax
.xml
.transform
.dom
.DOMResult
;
14 import javax
.xml
.transform
.dom
.DOMSource
;
15 import javax
.xml
.transform
.stream
.StreamResult
;
16 import javax
.xml
.transform
.stream
.StreamSource
;
18 import org
.apache
.commons
.io
.IOUtils
;
19 import org
.apache
.commons
.logging
.Log
;
20 import org
.apache
.commons
.logging
.LogFactory
;
21 import org
.w3c
.dom
.Document
;
22 import org
.w3c
.dom
.Element
;
23 import org
.w3c
.dom
.NodeList
;
26 * For compatibility with old JDKs (pre 1.5). Use Spring base one when possible.
28 public class DetachedXmlConverterCompat
implements DetachedXmlConverter
{
29 public final static String SLC_DETACHED_NAMESPACE_URI
= "http://argeo.org/projects/slc/schemas/detached";
30 private final static Log log
= LogFactory
31 .getLog(DetachedXmlConverterCompat
.class);
33 private final Transformer copy
;
35 public DetachedXmlConverterCompat() {
37 copy
= TransformerFactory
.newInstance().newTransformer();
38 } catch (Exception e
) {
39 throw new DetachedException("Could not create transformer.", e
);
43 public void marshallCommunication(DetachedCommunication detCom
,
45 if (detCom
instanceof DetachedRequest
) {
46 marshallRequest((DetachedRequest
) detCom
, result
);
47 } else if (detCom
instanceof DetachedAnswer
) {
48 marshallAnswer((DetachedAnswer
) detCom
, result
);
50 throw new DetachedException("Unkown communication type "
55 public DetachedCommunication
unmarshallCommunication(Source source
) {
57 DOMResult result
= new DOMResult();
59 copy
.transform(source
, result
);
60 } catch (TransformerException e
) {
61 throw new DetachedException("Could not copy xml source", e
);
64 if (log
.isTraceEnabled()) {
66 DOMSource domSource
= new DOMSource(result
.getNode());
67 StringWriter stringWriter
= new StringWriter();
68 StreamResult streamResult
= new StreamResult(stringWriter
);
69 copy
.transform(domSource
, streamResult
);
70 log
.trace("Unmarshall communication:\n"
71 + stringWriter
.toString());
72 IOUtils
.closeQuietly(stringWriter
);
73 } catch (TransformerException e
) {
74 log
.warn("Could not log xml source", e
);
77 Element root
= (Element
) ((Document
) result
.getNode())
78 .getDocumentElement();
81 String requestType
= root
.getLocalName();
82 if (requestType
.equals("detached-request")) {
83 DetachedRequest request
= new DetachedRequest();
84 request
.setUuid(root
.getElementsByTagNameNS(
85 SLC_DETACHED_NAMESPACE_URI
, "uuid").item(0)
88 .setRef(root
.getElementsByTagNameNS(
89 SLC_DETACHED_NAMESPACE_URI
, "ref").item(0)
91 request
.setPath(root
.getElementsByTagNameNS(
92 SLC_DETACHED_NAMESPACE_URI
, "path").item(0)
94 Element propertiesElement
= (Element
) root
.getElementsByTagNameNS(
95 SLC_DETACHED_NAMESPACE_URI
, "properties").item(0);
96 NodeList propElements
= propertiesElement
.getElementsByTagNameNS(
97 SLC_DETACHED_NAMESPACE_URI
, "prop");
98 Properties properties
= new Properties();
99 for (int i
= 0; i
< propElements
.getLength(); i
++) {
100 Element propElement
= (Element
) propElements
.item(i
);
101 String key
= propElement
.getAttribute("key");
102 String value
= propElement
.getTextContent();
103 properties
.setProperty(key
, value
);
105 request
.setProperties(properties
);
108 throw new DetachedException(requestType
+ " not implemented.");
112 public void marshallAnswer(DetachedAnswer answer
, Result result
) {
113 StringBuffer buf
= new StringBuffer("");
114 buf
.append("<slc-det:detached-answer xmlns:slc-det=\""
115 + SLC_DETACHED_NAMESPACE_URI
+ "\">");
116 if (answer
.getUuid() != null)
117 buf
.append("<slc-det:uuid>").append(answer
.getUuid()).append(
119 buf
.append("<slc-det:status>").append(answer
.getStatus()).append(
120 "</slc-det:status>");
121 if (answer
.getLog() != null)
122 buf
.append("<slc-det:log>").append(answer
.getLog()).append(
124 if (answer
.getProperties().size() != 0) {
125 buf
.append("<slc-det:properties>");
126 Enumeration keys
= answer
.getProperties().keys();
127 while (keys
.hasMoreElements()) {
128 String key
= (String
) keys
.nextElement();
129 buf
.append("<slc-det:prop key=\"").append(key
).append("\">");
130 buf
.append(answer
.getProperties().getProperty(key
));
131 buf
.append("</slc-det:prop>");
133 buf
.append("</slc-det:properties>");
135 buf
.append("</slc-det:detached-answer>");
136 StringReader reader
= new StringReader(buf
.toString());
137 Source source
= new StreamSource(reader
);
139 copy
.transform(source
, result
);
140 } catch (TransformerException e
) {
141 throw new DetachedException("Could not copy xml to result", e
);
143 IOUtils
.closeQuietly(reader
);
147 public void marshallRequest(DetachedRequest request
, Result result
) {
148 throw new DetachedException(" Not implemented.");
151 public DetachedRequest
unmarshallRequest(Source source
) {
152 DOMResult result
= new DOMResult();
154 copy
.transform(source
, result
);
155 } catch (TransformerException e
) {
156 throw new DetachedException("Could not copy xml source", e
);
158 Element node
= (Element
) ((Document
) result
.getNode())
159 .getDocumentElement();
160 DetachedRequest request
= new DetachedRequest();
161 request
.setUuid(node
.getElementsByTagNameNS(SLC_DETACHED_NAMESPACE_URI
,
162 "uuid").item(0).getTextContent());
163 request
.setRef(node
.getElementsByTagNameNS(SLC_DETACHED_NAMESPACE_URI
,
164 "ref").item(0).getTextContent());
165 request
.setPath(node
.getElementsByTagNameNS(SLC_DETACHED_NAMESPACE_URI
,
166 "path").item(0).getTextContent());
167 Element propertiesElement
= (Element
) node
.getElementsByTagNameNS(
168 SLC_DETACHED_NAMESPACE_URI
, "properties").item(0);
169 NodeList propElements
= propertiesElement
.getElementsByTagNameNS(
170 SLC_DETACHED_NAMESPACE_URI
, "prop");
171 Properties properties
= new Properties();
172 for (int i
= 0; i
< propElements
.getLength(); i
++) {
173 Element propElement
= (Element
) propElements
.item(i
);
174 String key
= propElement
.getAttribute("key");
175 String value
= propElement
.getTextContent();
176 properties
.setProperty(key
, value
);
178 request
.setProperties(properties
);