]> git.argeo.org Git - gpl/argeo-slc.git/blob - legacy/runtime/org.argeo.slc.detached/src/main/java/org/argeo/slc/detached/DetachedXmlConverterCompat.java
Clean up directories
[gpl/argeo-slc.git] / legacy / runtime / org.argeo.slc.detached / src / main / java / org / argeo / slc / detached / DetachedXmlConverterCompat.java
1 /*
2 * Copyright (C) 2007-2012 Argeo GmbH
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 Element propertiesElement = (Element) root.getElementsByTagNameNS(
107 SLC_DETACHED_NAMESPACE_URI, "properties").item(0);
108 NodeList propElements = propertiesElement.getElementsByTagNameNS(
109 SLC_DETACHED_NAMESPACE_URI, "prop");
110 Properties properties = new Properties();
111 for (int i = 0; i < propElements.getLength(); i++) {
112 Element propElement = (Element) propElements.item(i);
113 String key = propElement.getAttribute("key");
114 String value = propElement.getTextContent();
115 properties.setProperty(key, value);
116 }
117 request.setProperties(properties);
118 return request;
119 } else {
120 throw new DetachedException(requestType + " not implemented.");
121 }
122 }
123
124 public void marshallAnswer(DetachedAnswer answer, Result result) {
125 StringBuffer buf = new StringBuffer("");
126 buf.append("<slc-det:detached-answer xmlns:slc-det=\""
127 + SLC_DETACHED_NAMESPACE_URI + "\">");
128 if (answer.getUuid() != null)
129 buf.append("<slc-det:uuid>").append(answer.getUuid()).append(
130 "</slc-det:uuid>");
131 buf.append("<slc-det:status>").append(answer.getStatus()).append(
132 "</slc-det:status>");
133 if (answer.getLog() != null)
134 buf.append("<slc-det:log>").append(answer.getLog()).append(
135 "</slc-det:log>");
136 if (answer.getProperties().size() != 0) {
137 buf.append("<slc-det:properties>");
138 Enumeration keys = answer.getProperties().keys();
139 while (keys.hasMoreElements()) {
140 String key = (String) keys.nextElement();
141 buf.append("<slc-det:prop key=\"").append(key).append("\">");
142 buf.append(answer.getProperties().getProperty(key));
143 buf.append("</slc-det:prop>");
144 }
145 buf.append("</slc-det:properties>");
146 }
147 buf.append("</slc-det:detached-answer>");
148 StringReader reader = new StringReader(buf.toString());
149 Source source = new StreamSource(reader);
150 try {
151 copy.transform(source, result);
152 } catch (TransformerException e) {
153 throw new DetachedException("Could not copy xml to result", e);
154 } finally {
155 IOUtils.closeQuietly(reader);
156 }
157 }
158
159 public void marshallRequest(DetachedRequest request, Result result) {
160 throw new DetachedException(" Not implemented.");
161 }
162
163 public DetachedRequest unmarshallRequest(Source source) {
164 DOMResult result = new DOMResult();
165 try {
166 copy.transform(source, result);
167 } catch (TransformerException e) {
168 throw new DetachedException("Could not copy xml source", e);
169 }
170 Element node = (Element) ((Document) result.getNode())
171 .getDocumentElement();
172 DetachedRequest request = new DetachedRequest();
173 request.setUuid(node.getElementsByTagNameNS(SLC_DETACHED_NAMESPACE_URI,
174 "uuid").item(0).getTextContent());
175 request.setRef(node.getElementsByTagNameNS(SLC_DETACHED_NAMESPACE_URI,
176 "ref").item(0).getTextContent());
177 Element propertiesElement = (Element) node.getElementsByTagNameNS(
178 SLC_DETACHED_NAMESPACE_URI, "properties").item(0);
179 NodeList propElements = propertiesElement.getElementsByTagNameNS(
180 SLC_DETACHED_NAMESPACE_URI, "prop");
181 Properties properties = new Properties();
182 for (int i = 0; i < propElements.getLength(); i++) {
183 Element propElement = (Element) propElements.item(i);
184 String key = propElement.getAttribute("key");
185 String value = propElement.getTextContent();
186 properties.setProperty(key, value);
187 }
188 request.setProperties(properties);
189 return request;
190 }
191 }