com.planetj.servlet.filter.compression
Class CompressingStreamFactory

java.lang.Object
  extended by com.planetj.servlet.filter.compression.CompressingStreamFactory
Direct Known Subclasses:
CompressingStreamFactory.DeflateCompressingStreamFactory, CompressingStreamFactory.GZIPCompressingStreamFactory, CompressingStreamFactory.ZipCompressingStreamFactory

abstract class CompressingStreamFactory
extends java.lang.Object

Implementations of this abstract class can add compression of a particular type to a given OutputStream. They each return a CompressingOutputStream, which is just a thin wrapper on top of an OutputStream that adds the ability to "finish" a stream (see CompressingOutputStream).

This class contains implementations based on several popular compression algorithms, such as gzip. For example, the gzip implementation can decorate an OutputStream using an instance of GZIPOutputStream and in that way add gzip compression to the stream.

Author:
Sean Owen

Nested Class Summary
private static class CompressingStreamFactory.ContentEncodingQ
           
private static class CompressingStreamFactory.DeflateCompressingStreamFactory
           
private static class CompressingStreamFactory.GZIPCompressingStreamFactory
           
private static class CompressingStreamFactory.ZipCompressingStreamFactory
           
 
Field Summary
private static java.lang.String ANY_ENCODING
          "Any encoding" content type: the "*" wildcard.
private static java.util.Map<java.lang.String,java.lang.String> bestEncodingCache
          Cache mapping previously seen "Accept-Encoding" header Strings to an appropriate instance of CompressingStreamFactory.
private static java.lang.String COMPRESS_ENCODING
           
private static CompressingStreamFactory DEFLATE_CSF
          Implementation based on DeflaterOutputStream.
private static java.lang.String DEFLATE_ENCODING
           
private static java.util.Map<java.lang.String,CompressingStreamFactory> factoryMap
          Maps content type String to appropriate implementation of CompressingStreamFactory.
private static CompressingStreamFactory GZIP_CSF
          Implementation based on GZIPOutputStream and GZIPInputStream.
private static java.lang.String GZIP_ENCODING
           
(package private) static java.lang.String NO_ENCODING
          "No encoding" content type: "identity".
private static java.util.List<java.lang.String> supportedEncodings
          Ordered list of preferred encodings, from most to least preferred
private static java.lang.String X_COMPRESS_ENCODING
           
private static java.lang.String X_GZIP_ENCODING
           
private static CompressingStreamFactory ZIP_CSF
          Implementation based on ZipOutputStream and ZipInputStream.
 
Constructor Summary
CompressingStreamFactory()
           
 
Method Summary
(package private) static java.lang.String getBestContentEncoding(javax.servlet.http.HttpServletRequest httpRequest)
          Determines best content encoding for the response, based on the request -- in particular, based on its "Accept-Encoding" header.
(package private) abstract  CompressingInputStream getCompressingStream(java.io.InputStream servletInputStream, CompressingFilterContext context)
           
(package private) abstract  CompressingOutputStream getCompressingStream(java.io.OutputStream servletOutputStream, CompressingFilterContext context)
           
(package private) static CompressingStreamFactory getFactoryForContentEncoding(java.lang.String contentEncoding)
          Returns the CompressingStreamFactory instance associated to the given content encoding.
private static java.io.InputStream getStatsInputStream(java.io.InputStream inputStream, CompressingFilterContext context, CompressingFilterStats.StatsField field)
           
private static java.io.OutputStream getStatsOutputStream(java.io.OutputStream outputStream, CompressingFilterContext context, CompressingFilterStats.StatsField field)
           
(package private) static boolean isSupportedRequestContentEncoding(java.lang.String contentEncoding)
           
private static boolean isSupportedResponseContentEncoding(java.lang.String contentEncoding)
           
private static java.lang.String parseBestEncoding(java.lang.String acceptEncodingHeader)
           
private static CompressingStreamFactory.ContentEncodingQ parseContentEncodingQ(java.lang.String contentEncodingString)
           
private static java.lang.String selectBestEncoding(java.lang.String acceptEncodingHeader)
           
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

GZIP_CSF

private static final CompressingStreamFactory GZIP_CSF
Implementation based on GZIPOutputStream and GZIPInputStream.


ZIP_CSF

private static final CompressingStreamFactory ZIP_CSF
Implementation based on ZipOutputStream and ZipInputStream.


DEFLATE_CSF

private static final CompressingStreamFactory DEFLATE_CSF
Implementation based on DeflaterOutputStream.


NO_ENCODING

static final java.lang.String NO_ENCODING
"No encoding" content type: "identity".

See Also:
Constant Field Values

GZIP_ENCODING

private static final java.lang.String GZIP_ENCODING
See Also:
Constant Field Values

X_GZIP_ENCODING

private static final java.lang.String X_GZIP_ENCODING
See Also:
Constant Field Values

DEFLATE_ENCODING

private static final java.lang.String DEFLATE_ENCODING
See Also:
Constant Field Values

COMPRESS_ENCODING

private static final java.lang.String COMPRESS_ENCODING
See Also:
Constant Field Values

X_COMPRESS_ENCODING

private static final java.lang.String X_COMPRESS_ENCODING
See Also:
Constant Field Values

ANY_ENCODING

private static final java.lang.String ANY_ENCODING
"Any encoding" content type: the "*" wildcard.

See Also:
Constant Field Values

supportedEncodings

private static final java.util.List<java.lang.String> supportedEncodings
Ordered list of preferred encodings, from most to least preferred


bestEncodingCache

private static final java.util.Map<java.lang.String,java.lang.String> bestEncodingCache
Cache mapping previously seen "Accept-Encoding" header Strings to an appropriate instance of CompressingStreamFactory.


factoryMap

private static final java.util.Map<java.lang.String,CompressingStreamFactory> factoryMap
Maps content type String to appropriate implementation of CompressingStreamFactory.

Constructor Detail

CompressingStreamFactory

CompressingStreamFactory()
Method Detail

getCompressingStream

abstract CompressingOutputStream getCompressingStream(java.io.OutputStream servletOutputStream,
                                                      CompressingFilterContext context)
                                               throws java.io.IOException
Throws:
java.io.IOException

getCompressingStream

abstract CompressingInputStream getCompressingStream(java.io.InputStream servletInputStream,
                                                     CompressingFilterContext context)
                                              throws java.io.IOException
Throws:
java.io.IOException

getStatsOutputStream

@NotNull
private static java.io.OutputStream getStatsOutputStream(java.io.OutputStream outputStream,
                                                                 CompressingFilterContext context,
                                                                 CompressingFilterStats.StatsField field)

getStatsInputStream

@NotNull
private static java.io.InputStream getStatsInputStream(java.io.InputStream inputStream,
                                                               CompressingFilterContext context,
                                                               CompressingFilterStats.StatsField field)

isSupportedResponseContentEncoding

private static boolean isSupportedResponseContentEncoding(java.lang.String contentEncoding)

isSupportedRequestContentEncoding

static boolean isSupportedRequestContentEncoding(java.lang.String contentEncoding)

getFactoryForContentEncoding

@NotNull
static CompressingStreamFactory getFactoryForContentEncoding(java.lang.String contentEncoding)
Returns the CompressingStreamFactory instance associated to the given content encoding.

Parameters:
contentEncoding - content encoding (e.g. "gzip")
Returns:
CompressingStreamFactory for content encoding

getBestContentEncoding

static java.lang.String getBestContentEncoding(javax.servlet.http.HttpServletRequest httpRequest)
Determines best content encoding for the response, based on the request -- in particular, based on its "Accept-Encoding" header.

Parameters:
httpRequest - request
Returns:
best content encoding

parseBestEncoding

@NotNull
private static java.lang.String parseBestEncoding(java.lang.String acceptEncodingHeader)

selectBestEncoding

@NotNull
private static java.lang.String selectBestEncoding(java.lang.String acceptEncodingHeader)

parseContentEncodingQ

@NotNull
private static CompressingStreamFactory.ContentEncodingQ parseContentEncodingQ(java.lang.String contentEncodingString)