001 package org.deegree.enterprise.control.ajax; 002 003 import java.io.IOException; 004 005 import java.io.OutputStream; 006 import java.nio.charset.Charset; 007 import java.util.Locale; 008 009 import javax.servlet.http.HttpServletResponse; 010 import javax.xml.transform.Source; 011 import javax.xml.transform.TransformerException; 012 import javax.xml.transform.dom.DOMSource; 013 import javax.xml.transform.stream.StreamResult; 014 015 import org.deegree.framework.log.ILogger; 016 import org.deegree.framework.log.LoggerFactory; 017 import org.deegree.framework.util.CharsetUtils; 018 import org.deegree.framework.xml.XMLFragment; 019 import org.deegree.framework.xml.XSLTDocument; 020 import org.stringtree.json.JSONWriter; 021 022 /** 023 * 024 * 025 * 026 * @author <a href="mailto:poth@lat-lon.de">Andreas Poth</a> 027 * @author last edited by: $Author: apoth $ 028 * 029 * @version. $Revision: 29086 $, $Date: 2011-01-06 14:44:01 +0100 (Thu, 06 Jan 2011) $ 030 */ 031 public class ResponseHandler { 032 033 private static final ILogger LOG = LoggerFactory.getLogger( ResponseHandler.class ); 034 035 private HttpServletResponse response; 036 037 private OutputStream os; 038 039 private XSLTDocument xslt; 040 041 /** 042 * 043 * @param response 044 */ 045 ResponseHandler( HttpServletResponse response ) { 046 this.response = response; 047 } 048 049 private void openStream() 050 throws IOException { 051 if ( os == null ) { 052 os = response.getOutputStream(); 053 } 054 } 055 056 /** 057 * sets content type 058 * 059 * @param contentType 060 */ 061 public void setContentType( String contentType ) { 062 response.setContentType( contentType ); 063 } 064 065 /** 066 * sets locale/character encoding 067 * 068 * @param locale 069 */ 070 public void setLocale( Locale locale ) { 071 response.setLocale( locale ); 072 } 073 074 /** 075 * sets content length 076 * 077 * @param length 078 */ 079 public void setContentLength( int length ) { 080 response.setContentLength( length ); 081 } 082 083 /** 084 * sets an xslt script that will be used if a XML document will be written; - {@link #writeAndClose(XMLFragment)} 085 * 086 * @param xslt 087 */ 088 void setXSLT( XSLTDocument xslt ) { 089 this.xslt = xslt; 090 } 091 092 /** 093 * write a string result back to the client and closes the output stream. 'text/plain; charset=utf-8' will be used 094 * as default if no content-type has been set. 095 * 096 * @param value 097 * @throws IOException 098 */ 099 public void writeAndClose( String value ) 100 throws IOException { 101 if ( response.getContentType() == null ) { 102 response.setContentType( "text/plain; charset=" + CharsetUtils.getSystemCharset() ); 103 } 104 openStream(); 105 byte[] b = value.getBytes(); 106 setContentLength( b.length ); 107 os.write( b ); 108 os.flush(); 109 os.close(); 110 } 111 112 /** 113 * write a XML result back to the client (if a xslt script has been set the document will be transformed first) and 114 * closes the output stream.<br> 115 * 'text/plain; charset=utf-8' will be used as default if no content-type has been set. 116 * 117 * @param value 118 * @throws IOException 119 */ 120 public void writeAndClose( XMLFragment value ) 121 throws IOException { 122 if ( response.getContentType() == null ) { 123 response.setContentType( "text/plain; charset=" + CharsetUtils.getSystemCharset() ); 124 } 125 openStream(); 126 127 if ( xslt != null ) { 128 Source xmlSource = new DOMSource( value.getRootElement() ); 129 Source xslSource = new DOMSource( xslt.getRootElement() ); 130 try { 131 XSLTDocument.transform( xmlSource, xslSource, new StreamResult( os ), null, null ); 132 } catch ( TransformerException e ) { 133 LOG.logError( e.getMessage(), e ); 134 throw new IOException( e.getMessage() ); 135 } 136 } else { 137 value.write( os ); 138 } 139 os.flush(); 140 os.close(); 141 } 142 143 /** 144 * 'application/json; charset=$deafultCharset$' will be used as default if no content-type has been set. 145 * 146 * @param emitClassName 147 * @param value 148 * @throws IOException 149 */ 150 public void writeAndClose( boolean emitClassName, Object value ) 151 throws IOException { 152 153 if ( response.getContentType() == null ) { 154 response.setContentType( "application/json; charset=" + Charset.defaultCharset().displayName() ); 155 } 156 value.getClass().getModifiers(); 157 JSONWriter writer = new JSONWriter( emitClassName ); 158 writeAndClose( writer.write( value ) ); 159 } 160 161 /** 162 * 163 * @return original HttpServletResponse object 164 */ 165 public HttpServletResponse getHttpServletResponse() { 166 return response; 167 } 168 169 }