com.opensymphony.module.sitemesh.filter
Class PageResponseWrapper

java.lang.Object
  extended by javax.servlet.ServletResponseWrapper
      extended by javax.servlet.http.HttpServletResponseWrapper
          extended by com.opensymphony.module.sitemesh.filter.PageResponseWrapper
All Implemented Interfaces:
HttpServletResponse, ServletResponse

public final class PageResponseWrapper
extends HttpServletResponseWrapper

Implementation of HttpServletResponseWrapper that captures page data instead of sending to the writer.

Should be used in filter-chains or when forwarding/including pages using a RequestDispatcher.

In order to capture the response, getWriter() returns an instance of PageWriter.

Version:
$Revision: 1.8 $
Author:
Joe Walnes, Scott Farquhar

Field Summary
private  boolean aborted
           
private  Config config
           
private  String contentType
           
private  boolean debug
           
private  String encoding
           
private  Page page
           
private  PageOutputStream pageOutputStream
           
private  PageWriter pageWriter
           
private  boolean parseablePage
           
private  HttpServletResponse response
           
private  boolean setContentTypeCalled
           
private  boolean usingStream
           
private  boolean usingWriter
           
 
Fields inherited from interface javax.servlet.http.HttpServletResponse
SC_ACCEPTED, SC_BAD_GATEWAY, SC_BAD_REQUEST, SC_CONFLICT, SC_CONTINUE, SC_CREATED, SC_EXPECTATION_FAILED, SC_FORBIDDEN, SC_GATEWAY_TIMEOUT, SC_GONE, SC_HTTP_VERSION_NOT_SUPPORTED, SC_INTERNAL_SERVER_ERROR, SC_LENGTH_REQUIRED, SC_METHOD_NOT_ALLOWED, SC_MOVED_PERMANENTLY, SC_MOVED_TEMPORARILY, SC_MULTIPLE_CHOICES, SC_NO_CONTENT, SC_NON_AUTHORITATIVE_INFORMATION, SC_NOT_ACCEPTABLE, SC_NOT_FOUND, SC_NOT_IMPLEMENTED, SC_NOT_MODIFIED, SC_OK, SC_PARTIAL_CONTENT, SC_PAYMENT_REQUIRED, SC_PRECONDITION_FAILED, SC_PROXY_AUTHENTICATION_REQUIRED, SC_REQUEST_ENTITY_TOO_LARGE, SC_REQUEST_TIMEOUT, SC_REQUEST_URI_TOO_LONG, SC_REQUESTED_RANGE_NOT_SATISFIABLE, SC_RESET_CONTENT, SC_SEE_OTHER, SC_SERVICE_UNAVAILABLE, SC_SWITCHING_PROTOCOLS, SC_TEMPORARY_REDIRECT, SC_UNAUTHORIZED, SC_UNSUPPORTED_MEDIA_TYPE, SC_USE_PROXY
 
Constructor Summary
PageResponseWrapper(HttpServletResponse response, Config config)
          Create PageResponse wrapped around an existing HttpServletResponse.
PageResponseWrapper(HttpServletResponse response, Config config, boolean debug)
          Create PageResponse wrapped around an existing HttpServletResponse.
 
Method Summary
 void closeWriter()
          Flush and close output stream of wrapped response.
private  String extractContentTypeValue(String type, int startIndex)
           
private  OutputBuffer getBufferStream()
           
 ServletOutputStream getOutputStream()
          If the page is parseable, return a wrapped ServletOutputStream, else return the default ServletOutputStream.
 Page getPage()
          Send data written to PageWriter to PageParser and return a Page instance.
private  PageOutputStream getPageOutputStream()
           
private  PageWriter getPageWriter()
          Return instance of PageWriter allowing all data written to stream to be stored in temporary buffer.
 PrintWriter getWriter()
          If the page is parseable we return an instance of PageWriter allowing all data written to stream to be stored in temporary buffer.
 boolean isUsingStream()
           
 boolean isUsingWriter()
           
 void sendError(int sc)
           
 void sendError(int sc, String msg)
           
 void sendRedirect(String location)
           
 void setContentLength(int contentLength)
          Prevent content-length being set if page is parseable.
 void setContentType(String type)
          Set the content-type of the request and store it so it can be passed to the PageParser.
 void setHeader(String name, String value)
          Prevent content-length being set if page is parseable.
 void setStatus(int sc)
          Prevent 'not modified' (304) HTTP status from being sent if page is parseable (so web-server/browser doesn't cache contents).
 
Methods inherited from class javax.servlet.http.HttpServletResponseWrapper
addCookie, addDateHeader, addHeader, addIntHeader, containsHeader, encodeRedirectUrl, encodeRedirectURL, encodeUrl, encodeURL, setDateHeader, setIntHeader, setStatus
 
Methods inherited from class javax.servlet.ServletResponseWrapper
flushBuffer, getBufferSize, getCharacterEncoding, getLocale, getResponse, isCommitted, reset, resetBuffer, setBufferSize, setLocale, setResponse
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface javax.servlet.ServletResponse
flushBuffer, getBufferSize, getCharacterEncoding, getLocale, isCommitted, reset, resetBuffer, setBufferSize, setLocale
 

Field Detail

pageWriter

private PageWriter pageWriter

pageOutputStream

private PageOutputStream pageOutputStream

usingStream

private boolean usingStream

usingWriter

private boolean usingWriter

config

private Config config

page

private Page page

contentType

private String contentType

encoding

private String encoding

aborted

private boolean aborted

parseablePage

private boolean parseablePage

setContentTypeCalled

private boolean setContentTypeCalled

debug

private boolean debug

response

private HttpServletResponse response
Constructor Detail

PageResponseWrapper

public PageResponseWrapper(HttpServletResponse response,
                           Config config)
                    throws IOException
Create PageResponse wrapped around an existing HttpServletResponse.

Throws:
IOException

PageResponseWrapper

public PageResponseWrapper(HttpServletResponse response,
                           Config config,
                           boolean debug)
                    throws IOException
Create PageResponse wrapped around an existing HttpServletResponse.

Throws:
IOException
Method Detail

setContentType

public void setContentType(String type)
Set the content-type of the request and store it so it can be passed to the PageParser.

Specified by:
setContentType in interface ServletResponse
Overrides:
setContentType in class ServletResponseWrapper

extractContentTypeValue

private String extractContentTypeValue(String type,
                                       int startIndex)

setContentLength

public void setContentLength(int contentLength)
Prevent content-length being set if page is parseable.

Specified by:
setContentLength in interface ServletResponse
Overrides:
setContentLength in class ServletResponseWrapper

setHeader

public void setHeader(String name,
                      String value)
Prevent content-length being set if page is parseable.

Specified by:
setHeader in interface HttpServletResponse
Overrides:
setHeader in class HttpServletResponseWrapper

setStatus

public void setStatus(int sc)
Prevent 'not modified' (304) HTTP status from being sent if page is parseable (so web-server/browser doesn't cache contents).

Specified by:
setStatus in interface HttpServletResponse
Overrides:
setStatus in class HttpServletResponseWrapper

getOutputStream

public ServletOutputStream getOutputStream()
                                    throws IOException

If the page is parseable, return a wrapped ServletOutputStream, else return the default ServletOutputStream.

This is called internally by Orion 1.5.4, Resin 2.1.0, Tomcat 4.1.12 - naughty!

Specified by:
getOutputStream in interface ServletResponse
Overrides:
getOutputStream in class ServletResponseWrapper
Throws:
IOException

getPageOutputStream

private PageOutputStream getPageOutputStream()

getWriter

public PrintWriter getWriter()
                      throws IOException

If the page is parseable we return an instance of PageWriter allowing all data written to stream to be stored in temporary buffer.

Specified by:
getWriter in interface ServletResponse
Overrides:
getWriter in class ServletResponseWrapper
Throws:
IOException

getPageWriter

private PageWriter getPageWriter()
                          throws IOException
Return instance of PageWriter allowing all data written to stream to be stored in temporary buffer.

Throws:
IOException

closeWriter

public void closeWriter()
Flush and close output stream of wrapped response.


getBufferStream

private OutputBuffer getBufferStream()

isUsingStream

public boolean isUsingStream()

isUsingWriter

public boolean isUsingWriter()

getPage

public Page getPage()
             throws IOException
Send data written to PageWriter to PageParser and return a Page instance. If the Page is not parseable, null will be returned.

Throws:
IOException

sendError

public void sendError(int sc)
               throws IOException
Specified by:
sendError in interface HttpServletResponse
Overrides:
sendError in class HttpServletResponseWrapper
Throws:
IOException

sendError

public void sendError(int sc,
                      String msg)
               throws IOException
Specified by:
sendError in interface HttpServletResponse
Overrides:
sendError in class HttpServletResponseWrapper
Throws:
IOException

sendRedirect

public void sendRedirect(String location)
                  throws IOException
Specified by:
sendRedirect in interface HttpServletResponse
Overrides:
sendRedirect in class HttpServletResponseWrapper
Throws:
IOException

www.opensymphony.com/sitemesh/