]> git.argeo.org Git - gpl/argeo-slc.git/blob - runtime/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedXmlConverterCompat.java
d7f6394fb0e586226b2f5d0e7142d0128e650c34
[gpl/argeo-slc.git] / runtime / org.argeo.slc.detached / src / main / java / org / argeo / slc / detached / DetachedXmlConverterCompat.java
1 /*
2 * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 package org.argeo.slc.detached;
18
19 import java.io.StringReader;
20 import java.io.StringWriter;
21 import java.util.Enumeration;
22 import java.util.Properties;
23
24 import javax.xml.transform.Result;
25 import javax.xml.transform.Source;
26 import javax.xml.transform.Transformer;
27 import javax.xml.transform.TransformerException;
28 import javax.xml.transform.TransformerFactory;
29 import javax.xml.transform.dom.DOMResult;
30 import javax.xml.transform.dom.DOMSource;
31 import javax.xml.transform.stream.StreamResult;
32 import javax.xml.transform.stream.StreamSource;
33
34 import org.apache.commons.io.IOUtils;
35 import org.apache.commons.logging.Log;
36 import org.apache.commons.logging.LogFactory;
37 import org.w3c.dom.Document;
38 import org.w3c.dom.Element;
39 import org.w3c.dom.NodeList;
40
41 /**
42 * For compatibility with old JDKs (pre 1.5). Use Spring base one when possible.
43 */
44 public class DetachedXmlConverterCompat implements DetachedXmlConverter {
45 public final static String SLC_DETACHED_NAMESPACE_URI = "http://argeo.org/projects/slc/schemas/detached";
46 private final static Log log = LogFactory
47 .getLog(DetachedXmlConverterCompat.class);
48
49 private final Transformer copy;
50
51 public DetachedXmlConverterCompat() {
52 try {
53 copy = TransformerFactory.newInstance().newTransformer();
54 } catch (Exception e) {
55 throw new DetachedException("Could not create transformer.", e);
56 }
57 }
58
59 public void marshallCommunication(DetachedCommunication detCom,
60 Result result) {
61 if (detCom instanceof DetachedRequest) {
62 marshallRequest((DetachedRequest) detCom, result);
63 } else if (detCom instanceof DetachedAnswer) {
64 marshallAnswer((DetachedAnswer) detCom, result);
65 } else {
66 throw new DetachedException("Unkown communication type "
67 + detCom.getClass());
68 }
69 }
70
71 public DetachedCommunication unmarshallCommunication(Source source) {
72 // Parse
73 DOMResult result = new DOMResult();
74 try {
75 copy.transform(source, result);
76 } catch (TransformerException e) {
77 throw new DetachedException("Could not copy xml source", e);
78 }
79
80 if (log.isTraceEnabled()) {
81 try {
82 DOMSource domSource = new DOMSource(result.getNode());
83 StringWriter stringWriter = new StringWriter();
84 StreamResult streamResult = new StreamResult(stringWriter);
85 copy.transform(domSource, streamResult);
86 log.trace("Unmarshall communication:\n"
87 + stringWriter.toString());
88 IOUtils.closeQuietly(stringWriter);
89 } catch (TransformerException e) {
90 log.warn("Could not log xml source", e);
91 }
92 }
93 Element root = (Element) ((Document) result.getNode())
94 .getDocumentElement();
95
96 // Create objects
97 String requestType = root.getLocalName();
98 if (requestType.equals("detached-request")) {
99 DetachedRequest request = new DetachedRequest();
100 request.setUuid(root.getElementsByTagNameNS(
101 SLC_DETACHED_NAMESPACE_URI, "uuid").item(0)
102 .getTextContent());
103 request
104 .setRef(root.getElementsByTagNameNS(
105 SLC_DETACHED_NAMESPACE_URI, "ref").item(0)
106 .getTextContent());
107 request.setPath(root.getElementsByTagNameNS(
108 SLC_DETACHED_NAMESPACE_URI, "path").item(0)
109 .getTextContent());
110 Element propertiesElement = (Element) root.getElementsByTagNameNS(
111 SLC_DETACHED_NAMESPACE_URI, "properties").item(0);
112 NodeList propElements = propertiesElement.getElementsByTagNameNS(
113 SLC_DETACHED_NAMESPACE_URI, "prop");
114 Properties properties = new Properties();
115 for (int i = 0; i < propElements.getLength(); i++) {
116 Element propElement = (Element) propElements.item(i);
117 String key = propElement.getAttribute("key");
118 String value = propElement.getTextContent();
119 properties.setProperty(key, value);
120 }
121 request.setProperties(properties);
122 return request;
123 } else {
124 throw new DetachedException(requestType + " not implemented.");
125 }
126 }
127
128 public void marshallAnswer(DetachedAnswer answer, Result result) {
129 StringBuffer buf = new StringBuffer("");
130 buf.append("<slc-det:detached-answer xmlns:slc-det=\""
131 + SLC_DETACHED_NAMESPACE_URI + "\">");
132 if (answer.getUuid() != null)
133 buf.append("<slc-det:uuid>").append(answer.getUuid()).append(
134 "</slc-det:uuid>");
135 buf.append("<slc-det:status>").append(answer.getStatus()).append(
136 "</slc-det:status>");
137 if (answer.getLog() != null)
138 buf.append("<slc-det:log>").append(answer.getLog()).append(
139 "</slc-det:log>");
140 if (answer.getProperties().size() != 0) {
141 buf.append("<slc-det:properties>");
142 Enumeration keys = answer.getProperties().keys();
143 while (keys.hasMoreElements()) {
144 String key = (String) keys.nextElement();
145 buf.append("<slc-det:prop key=\"").append(key).append("\">");
146 buf.append(answer.getProperties().getProperty(key));
147 buf.append("</slc-det:prop>");
148 }
149 buf.append("</slc-det:properties>");
150 }
151 buf.append("</slc-det:detached-answer>");
152 StringReader reader = new StringReader(buf.toString());
153 Source source = new StreamSource(reader);
154 try {
155 copy.transform(source, result);
156 } catch (TransformerException e) {
157 throw new DetachedException("Could not copy xml to result", e);
158 } finally {
159 IOUtils.closeQuietly(reader);
160 }
161 }
162
163 public void marshallRequest(DetachedRequest request, Result result) {
164 throw new DetachedException(" Not implemented.");
165 }
166
167 public DetachedRequest unmarshallRequest(Source source) {
168 DOMResult result = new DOMResult();
169 try {
170 copy.transform(source, result);
171 } catch (TransformerException e) {
172 throw new DetachedException("Could not copy xml source", e);
173 }
174 Element node = (Element) ((Document) result.getNode())
175 .getDocumentElement();
176 DetachedRequest request = new DetachedRequest();
177 request.setUuid(node.getElementsByTagNameNS(SLC_DETACHED_NAMESPACE_URI,
178 "uuid").item(0).getTextContent());
179 request.setRef(node.getElementsByTagNameNS(SLC_DETACHED_NAMESPACE_URI,
180 "ref").item(0).getTextContent());
181 request.setPath(node.getElementsByTagNameNS(SLC_DETACHED_NAMESPACE_URI,
182 "path").item(0).getTextContent());
183 Element propertiesElement = (Element) node.getElementsByTagNameNS(
184 SLC_DETACHED_NAMESPACE_URI, "properties").item(0);
185 NodeList propElements = propertiesElement.getElementsByTagNameNS(
186 SLC_DETACHED_NAMESPACE_URI, "prop");
187 Properties properties = new Properties();
188 for (int i = 0; i < propElements.getLength(); i++) {
189 Element propElement = (Element) propElements.item(i);
190 String key = propElement.getAttribute("key");
191 String value = propElement.getTextContent();
192 properties.setProperty(key, value);
193 }
194 request.setProperties(properties);
195 return request;
196 }
197 }