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    }