/*
* Created on Jun 10, 2005
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*
* Copyright @2005 the original author or authors.
*/
package org.springmodules.remoting.xmlrpc.dom;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import javax.xml.transform.Result;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerConfigurationException;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.springmodules.remoting.xmlrpc.XmlRpcResponseWriter;
import org.springmodules.remoting.xmlrpc.XmlRpcWriterException;
import org.springmodules.remoting.xmlrpc.support.XmlRpcElementNames;
import org.springmodules.remoting.xmlrpc.support.XmlRpcFault;
import org.springmodules.remoting.xmlrpc.support.XmlRpcResponse;
import org.springmodules.remoting.xmlrpc.support.XmlRpcStruct;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* <p>
* Implementation of <code>{@link XmlRpcResponseWriter}</code> that uses DOM
* for creating the XML-RPC response.
* </p>
*
* @author Alex Ruiz
*
* @version $Revision$ $Date$
*/
public final class DomXmlRpcResponseWriter extends AbstractDomXmlRpcWriter
implements XmlRpcResponseWriter {
public DomXmlRpcResponseWriter() {
super();
}
/**
* Creates the XML representation of the given XML-RPC response fault.
*
* @param fault
* the XML-RPC response fault.
* @param document
* the XML document used to create new XML elements.
* @return the created XML element.
*/
protected Element createFaultElement(XmlRpcFault fault, Document document) {
XmlRpcStruct struct = fault.getFaultStruct();
Element structElement = createStructElement(struct, document);
Element faultElement = document.createElement(XmlRpcElementNames.FAULT);
faultElement.appendChild(structElement);
return faultElement;
}
/**
* Creates the XML representation of the given XML-RPC method response.
*
* @param response
* the XML-RPC method response.
* @param document
* the XML document used to create new XML elements.
* @return the created XML element.
*/
protected Element createMethodResponseElement(XmlRpcResponse response,
Document document) {
Element content = null;
if (response.isFaultThrown()) {
content = createFaultElement(response.getFault(), document);
} else {
content = createParametersElement(response.getParameters(), document);
}
Element methodResponseElement = document
.createElement(XmlRpcElementNames.METHOD_RESPONSE);
methodResponseElement.appendChild(content);
return methodResponseElement;
}
/**
*
* @see XmlRpcResponseWriter#writeResponse(XmlRpcResponse)
*/
public byte[] writeResponse(XmlRpcResponse response) {
Document document = createEmptyXmlDocument();
Element methodResponseElement = createMethodResponseElement(response,
document);
document.appendChild(methodResponseElement);
Source source = new DOMSource(document);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
Result xmlStreamResult = new StreamResult(outputStream);
byte[] serialized = null;
try {
Transformer transformer = TransformerFactory.newInstance()
.newTransformer();
transformer.transform(source, xmlStreamResult);
serialized = outputStream.toByteArray();
} catch (TransformerConfigurationException exception) {
throw new XmlRpcWriterException("Transformer configuration exception",
exception);
} catch (TransformerException exception) {
throw new XmlRpcWriterException("Transformer exception", exception);
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException exception) {
logger.warn("Could not close InputStream", exception);
}
}
}
return serialized;
}
}