2 * Copyright (C) 2010 Mathieu Baudier <mbaudier@argeo.org>
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
17 package org
.argeo
.slc
.detached
;
19 import java
.io
.StringReader
;
20 import java
.io
.StringWriter
;
21 import java
.util
.Enumeration
;
22 import java
.util
.Properties
;
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
;
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
;
42 * For compatibility with old JDKs (pre 1.5). Use Spring base one when possible.
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);
49 private final Transformer copy
;
51 public DetachedXmlConverterCompat() {
53 copy
= TransformerFactory
.newInstance().newTransformer();
54 } catch (Exception e
) {
55 throw new DetachedException("Could not create transformer.", e
);
59 public void marshallCommunication(DetachedCommunication detCom
,
61 if (detCom
instanceof DetachedRequest
) {
62 marshallRequest((DetachedRequest
) detCom
, result
);
63 } else if (detCom
instanceof DetachedAnswer
) {
64 marshallAnswer((DetachedAnswer
) detCom
, result
);
66 throw new DetachedException("Unkown communication type "
71 public DetachedCommunication
unmarshallCommunication(Source source
) {
73 DOMResult result
= new DOMResult();
75 copy
.transform(source
, result
);
76 } catch (TransformerException e
) {
77 throw new DetachedException("Could not copy xml source", e
);
80 if (log
.isTraceEnabled()) {
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
);
93 Element root
= (Element
) ((Document
) result
.getNode())
94 .getDocumentElement();
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)
104 .setRef(root
.getElementsByTagNameNS(
105 SLC_DETACHED_NAMESPACE_URI
, "ref").item(0)
107 request
.setPath(root
.getElementsByTagNameNS(
108 SLC_DETACHED_NAMESPACE_URI
, "path").item(0)
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
);
121 request
.setProperties(properties
);
124 throw new DetachedException(requestType
+ " not implemented.");
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(
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(
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>");
149 buf
.append("</slc-det:properties>");
151 buf
.append("</slc-det:detached-answer>");
152 StringReader reader
= new StringReader(buf
.toString());
153 Source source
= new StreamSource(reader
);
155 copy
.transform(source
, result
);
156 } catch (TransformerException e
) {
157 throw new DetachedException("Could not copy xml to result", e
);
159 IOUtils
.closeQuietly(reader
);
163 public void marshallRequest(DetachedRequest request
, Result result
) {
164 throw new DetachedException(" Not implemented.");
167 public DetachedRequest
unmarshallRequest(Source source
) {
168 DOMResult result
= new DOMResult();
170 copy
.transform(source
, result
);
171 } catch (TransformerException e
) {
172 throw new DetachedException("Could not copy xml source", e
);
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
);
194 request
.setProperties(properties
);