CallResultOutputter.java |
/* * $Id: CallResultOutputter.java,v 1.59 2012/03/03 10:41:19 agoubard Exp $ * * See the COPYRIGHT file for redistribution and use restrictions. */ package org.xins.server; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.io.Writer; import java.util.Map; import org.xins.common.MandatoryArgumentChecker; import org.w3c.dom.Element; import org.xins.common.xml.ElementFormatter; import org.znerd.xmlenc.XMLEncoder; /** * Converter that can be used by calling conventions to generate responses * which are compatible with the XINS standard calling convention. * * <p>The result output is always in the UTF-8 encoding. * * @version $Revision: 1.59 $ $Date: 2012/03/03 10:41:19 $ * @author <a href="mailto:ernst@ernstdehaan.com">Ernst de Haan</a> * @author <a href="mailto:anthony.goubard@japplis.com">Anthony Goubard</a> * * @since XINS 1.5.0 */ public final class CallResultOutputter { /** * The first output for each output conversion. Never <code>null</code>. */ private static final char[] DOCUMENT_PREFACE = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><result".toCharArray(); /** * The output for the new-style calling convention in case success is * false, just before the name of the error code. * Never <code>null</code>. */ private static final char[] ERRORCODE_IS = " errorcode=\"".toCharArray(); /** * The output just before a parameter name. Never <code>null</code>. */ private static final char[] PARAM_PREFACE = "<param name=\"".toCharArray(); /** * The output right after a parameter value. Never <code>null</code>. */ private static final char[] PARAM_SUFFIX = "</param>".toCharArray(); /** * The final output for each output conversion. Never <code>null</code>. */ private static final char[] DOCUMENT_SUFFIX = "</result>".toCharArray(); /** * An <code>XMLEncoder</code> for the UTF-8 encoding. Initialized by the * class initialized and then never <code>null</code>. */ private static final XMLEncoder XML_ENCODER; static { try { XML_ENCODER = XMLEncoder.getEncoder("UTF-8"); } catch (UnsupportedEncodingException exception) { Error error = new Error(exception); throw error; } } /** * Constructs a new <code>CallResultOutputter</code> object. */ private CallResultOutputter() { // empty } /** * Generates XML for the specified call result. The XML is sent to the * specified output stream. * * @param out * the output stream to send the XML to, cannot be <code>null</code>. * * @param result * the call result to convert to XML, cannot be <code>null</code>. * * @throws IllegalArgumentException * if <code>out == null * || result == null</code>. * * @throws IOException * if there was an I/O error while writing to the output stream. */ public static void output(Writer out, FunctionResult result) throws IllegalArgumentException, IOException { // Check preconditions MandatoryArgumentChecker.check("out", out, "result", result); // Output the declaration out.write(DOCUMENT_PREFACE); // Output the start of the <result> element String code = result.getErrorCode(); if (code == null) { out.write('>'); } else { out.write(ERRORCODE_IS); out.write(code); out.write('"'); out.write('>'); } // Write the output parameters, if any Map<String, String> params = result.getParameters(); for (String paramName : params.keySet()) { if (paramName != null && paramName.length() > 0) { String v = params.get(paramName); if (v != null && v.length() > 0) { out.write(PARAM_PREFACE); XML_ENCODER.text(out, paramName, true); out.write('"'); out.write('>'); XML_ENCODER.text(out, v, true); out.write(PARAM_SUFFIX); } } } // Write the data element, if any Element dataElement = result.getDataElement(); if (dataElement != null) { String dataXML = ElementFormatter.format(dataElement); out.write(dataXML); } // End the root element <result> out.write(DOCUMENT_SUFFIX); } }