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 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
);
117 request
.setProperties(properties
);
120 throw new DetachedException(requestType
+ " not implemented.");
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(
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(
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>");
145 buf
.append("</slc-det:properties>");
147 buf
.append("</slc-det:detached-answer>");
148 StringReader reader
= new StringReader(buf
.toString());
149 Source source
= new StreamSource(reader
);
151 copy
.transform(source
, result
);
152 } catch (TransformerException e
) {
153 throw new DetachedException("Could not copy xml to result", e
);
155 IOUtils
.closeQuietly(reader
);
159 public void marshallRequest(DetachedRequest request
, Result result
) {
160 throw new DetachedException(" Not implemented.");
163 public DetachedRequest
unmarshallRequest(Source source
) {
164 DOMResult result
= new DOMResult();
166 copy
.transform(source
, result
);
167 } catch (TransformerException e
) {
168 throw new DetachedException("Could not copy xml source", e
);
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
);
188 request
.setProperties(properties
);