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