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