]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedXmlConverterCompat.java
Ignore log files
[gpl/argeo-slc.git] / runtime / org.argeo.slc.detached / src / main / java / org / argeo / slc / detached / DetachedXmlConverterCompat.java
1 package org.argeo.slc.detached;
2
3 import java.io.StringReader;
4 import java.io.StringWriter;
5 import java.util.Enumeration;
6 import java.util.Properties;
7
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;
17
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;
24
25 /**
26 * For compatibility with old JDKs (pre 1.5). Use Spring base one when possible.
27 */
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);
32
33 private final Transformer copy;
34
35 public DetachedXmlConverterCompat() {
36 try {
37 copy = TransformerFactory.newInstance().newTransformer();
38 } catch (Exception e) {
39 throw new DetachedException("Could not create transformer.", e);
40 }
41 }
42
43 public void marshallCommunication(DetachedCommunication detCom,
44 Result result) {
45 if (detCom instanceof DetachedRequest) {
46 marshallRequest((DetachedRequest) detCom, result);
47 } else if (detCom instanceof DetachedAnswer) {
48 marshallAnswer((DetachedAnswer) detCom, result);
49 } else {
50 throw new DetachedException("Unkown communication type "
51 + detCom.getClass());
52 }
53 }
54
55 public DetachedCommunication unmarshallCommunication(Source source) {
56 // Parse
57 DOMResult result = new DOMResult();
58 try {
59 copy.transform(source, result);
60 } catch (TransformerException e) {
61 throw new DetachedException("Could not copy xml source", e);
62 }
63
64 if (log.isDebugEnabled()) {
65 try {
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.debug("Unmarshall communication:\n"
71 + stringWriter.toString());
72 IOUtils.closeQuietly(stringWriter);
73 } catch (TransformerException e) {
74 log.warn("Could not log xml source", e);
75 }
76 }
77 Element root = (Element) ((Document) result.getNode())
78 .getDocumentElement();
79
80 // Create objects
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)
86 .getTextContent());
87 request
88 .setRef(root.getElementsByTagNameNS(
89 SLC_DETACHED_NAMESPACE_URI, "ref").item(0)
90 .getTextContent());
91 request.setPath(root.getElementsByTagNameNS(
92 SLC_DETACHED_NAMESPACE_URI, "path").item(0)
93 .getTextContent());
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);
104 }
105 request.setProperties(properties);
106 return request;
107 } else {
108 throw new DetachedException(requestType + " not implemented.");
109 }
110 }
111
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(
118 "</slc-det:uuid>");
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(
123 "</slc-det:log>");
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>");
132 }
133 buf.append("</slc-det:properties>");
134 }
135 buf.append("</slc-det:detached-answer>");
136 StringReader reader = new StringReader(buf.toString());
137 Source source = new StreamSource(reader);
138 try {
139 copy.transform(source, result);
140 } catch (TransformerException e) {
141 throw new DetachedException("Could not copy xml to result", e);
142 } finally {
143 IOUtils.closeQuietly(reader);
144 }
145 }
146
147 public void marshallRequest(DetachedRequest request, Result result) {
148 throw new DetachedException(" Not implemented.");
149 }
150
151 public DetachedRequest unmarshallRequest(Source source) {
152 DOMResult result = new DOMResult();
153 try {
154 copy.transform(source, result);
155 } catch (TransformerException e) {
156 throw new DetachedException("Could not copy xml source", e);
157 }
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);
177 }
178 request.setProperties(properties);
179 return request;
180 }
181 }