org.hd.d.pg2k.webSvr.util
Class XMLCompressionServletResponseWrapper

java.lang.Object
  extended by javax.servlet.ServletResponseWrapper
      extended by javax.servlet.http.HttpServletResponseWrapper
          extended by org.hd.d.pg2k.webSvr.util.XMLCompressionServletResponseWrapper
All Implemented Interfaces:
javax.servlet.http.HttpServletResponse, javax.servlet.ServletResponse

final class XMLCompressionServletResponseWrapper
extends javax.servlet.http.HttpServletResponseWrapper

Allows conservative compaction of (removal of redundant characters from) an XML response. This implementation is only prepared to try to compact the text when it can be parsed unambiguously and in a light-weight way.

The meaning of the XML should be unchanged, just represented in fewer bytes on the wire.

Thus it will only attempt to filter a (char-based) Writer response, not a (byte-based) Stream response, for now.

We call the Writer of the underlying response to preserve the char-based nature of the text as we are processing it.

This implementation is not thread-safe.

This class does not need to be public nor derived from.


Field Summary
private  javax.servlet.http.HttpServletResponse origResponse
          Original response; never null.
private  java.util.concurrent.atomic.AtomicBoolean removingWhitespace
          If true then we are removing whitespace.
private  javax.servlet.ServletOutputStream stream
          Any ServletOutputStream that has been returned, else null.
private  java.io.PrintWriter underlyingWriter
          The PrintWriter from the underlying response, else null.
private  java.io.PrintWriter writer
          Any PrintWriter that has been returned, else null.
 
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
XMLCompressionServletResponseWrapper(javax.servlet.http.HttpServletResponse response)
           
 
Method Summary
 void finishResponse()
          Finish up.
 javax.servlet.ServletOutputStream getOutputStream()
          Get a ServletOutputStream to write the content associated for this response.
 java.io.PrintWriter getWriter()
           
 void reset()
           
 void resetBuffer()
           
 void setContentLength(int length)
          Prevent the Content-Length header from being set.
 
Methods inherited from class javax.servlet.http.HttpServletResponseWrapper
addCookie, addDateHeader, addHeader, addIntHeader, containsHeader, encodeRedirectUrl, encodeRedirectURL, encodeUrl, encodeURL, sendError, sendError, sendRedirect, setDateHeader, setHeader, setIntHeader, setStatus, setStatus
 
Methods inherited from class javax.servlet.ServletResponseWrapper
flushBuffer, getBufferSize, getCharacterEncoding, getLocale, getResponse, isCommitted, setBufferSize, setContentType, 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, setBufferSize, setContentType, setLocale
 

Field Detail

origResponse

private final javax.servlet.http.HttpServletResponse origResponse
Original response; never null.


stream

private javax.servlet.ServletOutputStream stream
Any ServletOutputStream that has been returned, else null.


writer

private java.io.PrintWriter writer
Any PrintWriter that has been returned, else null.


underlyingWriter

private java.io.PrintWriter underlyingWriter
The PrintWriter from the underlying response, else null. Note that underlyingWriter is only non-null if writer is non-null, and the writers and stream cannot not be non-null.


removingWhitespace

private final java.util.concurrent.atomic.AtomicBoolean removingWhitespace
If true then we are removing whitespace. We start off (after creation or reset) by removing any leading whitespace in the output, which is technically not allowed anyway in XML.

Constructor Detail

XMLCompressionServletResponseWrapper

public XMLCompressionServletResponseWrapper(javax.servlet.http.HttpServletResponse response)
Method Detail

getOutputStream

public javax.servlet.ServletOutputStream getOutputStream()
                                                  throws java.io.IOException
Get a ServletOutputStream to write the content associated for this response. This will prevent us from filtering the content.

We get the stream from the underlying response directly.

Specified by:
getOutputStream in interface javax.servlet.ServletResponse
Overrides:
getOutputStream in class javax.servlet.ServletResponseWrapper
Throws:
java.io.IOException

getWriter

public java.io.PrintWriter getWriter()
                              throws java.io.IOException
Specified by:
getWriter in interface javax.servlet.ServletResponse
Overrides:
getWriter in class javax.servlet.ServletResponseWrapper
Throws:
java.io.IOException

reset

public void reset()
Specified by:
reset in interface javax.servlet.ServletResponse
Overrides:
reset in class javax.servlet.ServletResponseWrapper

resetBuffer

public void resetBuffer()
Specified by:
resetBuffer in interface javax.servlet.ServletResponse
Overrides:
resetBuffer in class javax.servlet.ServletResponseWrapper

setContentLength

public void setContentLength(int length)
Prevent the Content-Length header from being set. Since we aim to compact the text, then any content length that the caller is aware of is hopefully going to be wrong (too large).

Specified by:
setContentLength in interface javax.servlet.ServletResponse
Overrides:
setContentLength in class javax.servlet.ServletResponseWrapper

finishResponse

public void finishResponse()
Finish up.


DHD Multimedia Gallery V1.60.69

Copyright (c) 1996-2012, Damon Hart-Davis. All rights reserved.