1 /* 2 * Copyright (c) 2002-2017, Mairie de Paris 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 9 * 1. Redistributions of source code must retain the above copyright notice 10 * and the following disclaimer. 11 * 12 * 2. Redistributions in binary form must reproduce the above copyright notice 13 * and the following disclaimer in the documentation and/or other materials 14 * provided with the distribution. 15 * 16 * 3. Neither the name of 'Mairie de Paris' nor 'Lutece' nor the names of its 17 * contributors may be used to endorse or promote products derived from 18 * this software without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 21 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE 24 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 25 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 26 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 27 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 28 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 29 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 30 * POSSIBILITY OF SUCH DAMAGE. 31 * 32 * License 1.0 33 */ 34 package fr.paris.lutece.plugins.jsr168.pluto; 35 36 import fr.paris.lutece.portal.service.util.AppLogService; 37 38 import java.io.ByteArrayOutputStream; 39 import java.io.IOException; 40 import java.io.PrintWriter; 41 import java.io.UnsupportedEncodingException; 42 43 import javax.servlet.ServletOutputStream; 44 import javax.servlet.ServletResponse; 45 import javax.servlet.http.HttpServletResponse; 46 import javax.servlet.http.HttpServletResponseWrapper; 47 48 49 /** 50 * Wrap <code>HttpServletResponse</code> for Lutece processing: 51 * We can't output direct flow to response. 52 * We must keep all output, and give to {@link fr.paris.lutece.plugins.jsr168.pluto.LuteceToPlutoConnector} 53 * for return it for render. 54 */ 55 public class LuteceHttpServletResponse extends HttpServletResponseWrapper 56 { 57 private ServletOutputStream _servletOutputStream; 58 private PrintWriter _printWriter; 59 private ByteArrayOutputStream _buffer; 60 61 /** 62 * Initialize buffer and stream of the instance for capture 63 * chars flow. 64 * 65 * @param response the real (parent) <code>HttpServletResponse</code> instance 66 */ 67 public LuteceHttpServletResponse( HttpServletResponse response ) 68 { 69 super( response ); 70 71 _buffer = new ByteArrayOutputStream( ); 72 _servletOutputStream = new ServletOutputStream( ) 73 { 74 public void write( int b ) 75 { 76 _buffer.write( b ); 77 } 78 }; 79 _printWriter = new PrintWriter( _servletOutputStream ); 80 } 81 82 /** 83 * Return the content of the buffer 84 * 85 * @return the content of the buffer 86 */ 87 public String getBufferString( ) 88 { 89 flushBuffer( ); 90 91 try 92 { 93 return _buffer.toString( "ISO-8859-1" ); 94 } 95 catch ( UnsupportedEncodingException e ) 96 { 97 // UTF-8 est un encoding standard de JAVA 98 AppLogService.error( e.getMessage( ), e ); 99 throw new RuntimeException( e.getMessage( ) ); 100 } 101 } 102 103 /** 104 * Overridden: flush local buffer instead "real" buffer (in parent). 105 * 106 * @see javax.servlet.ServletResponse#flushBuffer() 107 */ 108 public void flushBuffer( ) 109 { 110 // super.flushBuffer( ); 111 _printWriter.flush( ); 112 113 try 114 { 115 _servletOutputStream.flush( ); 116 } 117 catch ( IOException e ) 118 { 119 // Nothing to do 120 AppLogService.error( "Unreachable catch case", e ); 121 } 122 } 123 124 /** 125 * Overridden: return local <code>OutputStream</code>. 126 * 127 * @see javax.servlet.ServletResponse#getOutputStream() 128 */ 129 public ServletOutputStream getOutputStream( ) 130 { 131 // return super.getOutputStream( ); 132 return _servletOutputStream; 133 } 134 135 /** 136 * Overridden: return local <code>PrintWriter</code>. 137 * 138 * @see javax.servlet.ServletResponse#getWriter() 139 */ 140 public PrintWriter getWriter( ) 141 { 142 // return super.getWriter( ); 143 return _printWriter; 144 } 145 146 /** 147 * Overridden: flush buffer and clear content 148 * 149 * @see javax.servlet.ServletResponse#reset() 150 */ 151 public void reset( ) 152 { 153 // return super.reset( ); 154 flushBuffer( ); 155 _buffer.reset( ); 156 } 157 158 /** 159 * Overridden: flush buffer and clear content 160 * 161 * @see javax.servlet.ServletResponse#resetBuffer() 162 */ 163 public void resetBuffer( ) 164 { 165 // return super.resetBuffer( ); 166 throw new UnsupportedOperationException( "resetBuffer n'est pas supporte!" ); 167 } 168 169 /** 170 * Overridden: unsupported operation 171 * 172 * @see HttpServletResponse#sendError(int) 173 */ 174 public void sendError( int nHttpErrorCode ) 175 { 176 // return super.sendError( nHttpErrorCode ); 177 throw new UnsupportedOperationException( "sendError n'est pas supporte!" ); 178 } 179 180 /** 181 * Overridden: unsupported operation 182 * 183 * @see HttpServletResponse#sendError(int, java.lang.String) 184 */ 185 public void sendError( int arg0, String arg1 ) throws IOException 186 { 187 throw new UnsupportedOperationException( "sendError n'est pas supporte!" ); 188 } 189 190 /** 191 * Overridden: unsupported operation 192 * 193 * @see HttpServletResponse#sendRedirect(java.lang.String) 194 */ 195 public void sendRedirect( String arg0 ) throws IOException 196 { 197 throw new UnsupportedOperationException( "sendRedirect n'est pas supporte!" ); 198 } 199 200 /** 201 * Overridden: empty operation 202 * 203 * @see javax.servlet.ServletResponse#setBufferSize(int) 204 */ 205 public void setBufferSize( int nSize ) 206 { 207 // super.setBufferSize( nSize ); 208 } 209 210 /** 211 * Overridden: unsupported operation 212 * 213 * @see javax.servlet.ServletResponse#setContentLength(int) 214 */ 215 public void setContentLength( int nContentLength ) 216 { 217 // super.setContentType( nContentLength ); 218 throw new UnsupportedOperationException( "setContentLength n'est pas supporte!" ); 219 } 220 221 /** 222 * Overridden: empty operation 223 * 224 * @see javax.servlet.ServletResponse#setContentType(java.lang.String) 225 */ 226 public void setContentType( String strContentType ) 227 { 228 // super.setContentType( strContentType ); 229 } 230 231 /** 232 * Overridden: unsupported operation 233 * 234 * @see HttpServletResponse#setStatus(int) 235 */ 236 public void setStatus( int nHttpStatus ) 237 { 238 throw new UnsupportedOperationException( "setStatus n'est pas supporte!" ); 239 } 240 241 /** 242 * Overridden: unsupported operation 243 * 244 * @see HttpServletResponse#setStatus(int, java.lang.String) 245 */ 246 public void setStatus( int arg0, String arg1 ) 247 { 248 throw new UnsupportedOperationException( "setStatus n'est pas supporte!" ); 249 } 250 251 /** 252 * Overridden: empty operation (warn logged) 253 * 254 * @see javax.servlet.ServletResponseWrapper#setResponse(javax.servlet.ServletResponse) 255 */ 256 public void setResponse( ServletResponse response ) 257 { 258 AppLogService.info( "Plugin JSR 168: Try to redefine a response object!" ); 259 } 260 261 /** 262 * Overridden: return local buffer size 263 * 264 * @see javax.servlet.ServletResponse#getBufferSize() 265 */ 266 public int getBufferSize( ) 267 { 268 // return super.getBufferSize( ); 269 return _buffer.size( ); 270 } 271 272 /** 273 * Overridden: proxy operation (info logged) 274 * 275 * @see javax.servlet.ServletResponseWrapper#getResponse() 276 */ 277 public ServletResponse getResponse( ) 278 { 279 ServletResponse response = super.getResponse( ); 280 281 AppLogService.debug( "Plugin JSR 168: getResponse() asked (response class is " + 282 response.getClass( ).getName( ) + ")." ); 283 284 return response; 285 } 286 287 /** 288 * Overridden: always "true" operation (info logged) 289 * 290 * @see javax.servlet.ServletResponse#isCommitted() 291 */ 292 public boolean isCommitted( ) 293 { 294 boolean comitted = super.isCommitted( ); 295 296 AppLogService.debug( "Plugin JSR 168: isCommited asked (commited: " + comitted + ")." ); 297 298 return true; 299 } 300 }