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 }