2 * Copyright (C) 2007-2012 Mathieu Baudier
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.
16 package org
.argeo
.slc
.detached
;
18 import java
.io
.StringReader
;
19 import java
.io
.StringWriter
;
20 import java
.util
.Enumeration
;
21 import java
.util
.Properties
;
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
;
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
;
41 * For compatibility with old JDKs (pre 1.5). Use Spring base one when possible.
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);
48 private final Transformer copy
;
50 public DetachedXmlConverterCompat() {
52 copy
= TransformerFactory
.newInstance().newTransformer();
53 } catch (Exception e
) {
54 throw new DetachedException("Could not create transformer.", e
);
58 public void marshallCommunication(DetachedCommunication detCom
,
60 if (detCom
instanceof DetachedRequest
) {
61 marshallRequest((DetachedRequest
) detCom
, result
);
62 } else if (detCom
instanceof DetachedAnswer
) {
63 marshallAnswer((DetachedAnswer
) detCom
, result
);
65 throw new DetachedException("Unkown communication type "
70 public DetachedCommunication
unmarshallCommunication(Source source
) {
72 DOMResult result
= new DOMResult();
74 copy
.transform(source
, result
);
75 } catch (TransformerException e
) {
76 throw new DetachedException("Could not copy xml source", e
);
79 if (log
.isTraceEnabled()) {
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
);
92 Element root
= (Element
) ((Document
) result
.getNode())
93 .getDocumentElement();
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)
103 .setRef(root
.getElementsByTagNameNS(
104 SLC_DETACHED_NAMESPACE_URI
, "ref").item(0)
106 request
.setPath(root
.getElementsByTagNameNS(
107 SLC_DETACHED_NAMESPACE_URI
, "path").item(0)
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
);
120 request
.setProperties(properties
);
123 throw new DetachedException(requestType
+ " not implemented.");
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(
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(
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>");
148 buf
.append("</slc-det:properties>");
150 buf
.append("</slc-det:detached-answer>");
151 StringReader reader
= new StringReader(buf
.toString());
152 Source source
= new StreamSource(reader
);
154 copy
.transform(source
, result
);
155 } catch (TransformerException e
) {
156 throw new DetachedException("Could not copy xml to result", e
);
158 IOUtils
.closeQuietly(reader
);
162 public void marshallRequest(DetachedRequest request
, Result result
) {
163 throw new DetachedException(" Not implemented.");
166 public DetachedRequest
unmarshallRequest(Source source
) {
167 DOMResult result
= new DOMResult();
169 copy
.transform(source
, result
);
170 } catch (TransformerException e
) {
171 throw new DetachedException("Could not copy xml source", e
);
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
);
193 request
.setProperties(properties
);