Author: pete
Date: Wed Sep  1 22:11:54 2010
New Revision: 991731

URL: http://svn.apache.org/viewvc?rev=991731&view=rev
Log:
add headers for better cache / proxy / CDN utilization, removed javadoc 
warnings (for details see: 
http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html)

Modified:
    
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/resource/AbstractResource.java

Modified: 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
URL: 
http://svn.apache.org/viewvc/wicket/trunk/wicket/src/main/java/org/apache/wicket/request/resource/AbstractResource.java?rev=991731&r1=991730&r2=991731&view=diff
==============================================================================
--- 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
 (original)
+++ 
wicket/trunk/wicket/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
 Wed Sep  1 22:11:54 2010
@@ -54,7 +54,7 @@ public abstract class AbstractResource i
        /**
         * Override this method to return a {...@link ResourceResponse} for the 
request.
         * 
-        * @param attributes
+        * @param attributes request attributes
         * @return resource data instance
         */
        protected abstract ResourceResponse newResourceResponse(Attributes 
attributes);
@@ -90,7 +90,7 @@ public abstract class AbstractResource i
                 * Sets the error code for resource. If there is an error code 
set the data will not be
                 * rendered and the code will be sent to client.
                 * 
-                * @param errorCode
+                * @param errorCode error code
                 */
                public void setError(Integer errorCode)
                {
@@ -101,7 +101,7 @@ public abstract class AbstractResource i
                 * Sets the error code and message for resource. If there is an 
error code set the data will
                 * not be rendered and the code and message will be sent to 
client.
                 * 
-                * @param errorCode
+                * @param errorCode error code
                 * @param errorMessage
                 *            error message
                 */
@@ -130,7 +130,7 @@ public abstract class AbstractResource i
                /**
                 * Sets the file name of the resource.
                 * 
-                * @param fileName
+                * @param fileName file name
                 */
                public void setFileName(String fileName)
                {
@@ -150,7 +150,7 @@ public abstract class AbstractResource i
                 * 
                 * @see ContentDisposition
                 * 
-                * @param contentDisposition
+                * @param contentDisposition content disposition (attachment or 
inline)
                 */
                public void setContentDisposition(ContentDisposition 
contentDisposition)
                {
@@ -170,7 +170,7 @@ public abstract class AbstractResource i
                 * Sets the content type for the resource. If no content type 
is set it will be determined
                 * by the extension.
                 * 
-                * @param contentType
+                * @param contentType content type (also known as mime type)
                 */
                public void setContentType(String contentType)
                {
@@ -193,7 +193,7 @@ public abstract class AbstractResource i
                 * Sets the text encoding for the resource. The encoding is 
only used if the content type
                 * indicates a textual resource.
                 * 
-                * @param textEncoding
+                * @param textEncoding character encoding of text body
                 */
                public void setTextEncoding(String textEncoding)
                {
@@ -212,7 +212,7 @@ public abstract class AbstractResource i
                 * Sets the content length (in bytes) of the data. Content 
length is optional but it's
                 * recommended to set it so that the browser can show download 
progress.
                 * 
-                * @param contentLength
+                * @param contentLength length of response body
                 */
                public void setContentLength(long contentLength)
                {
@@ -233,7 +233,7 @@ public abstract class AbstractResource i
                 * <code>If-Modified-Since</code> to determine if the actuall 
data really needs to be sent
                 * to client.
                 * 
-                * @param lastModified
+                * @param lastModified last modification date
                 */
                public void setLastModified(Date lastModified)
                {
@@ -253,7 +253,7 @@ public abstract class AbstractResource i
                 * <code>If-Modified-Since</code> request header and compares 
it to lastModified property.
                 * In order for this method to work {...@link 
#setLastModified(Date)} has to be called first.
                 * 
-                * @param attributes
+                * @param attributes request attributes
                 * @return <code>true</code> if the resource data does need to 
be written,
                 *         <code>false</code> otherwise.
                 */
@@ -280,9 +280,9 @@ public abstract class AbstractResource i
                 * Cachable resources are cached on client. This flag affects 
the <code>Expires</code> and
                 * <code>Cache-Control</code> headers.
                 * 
-                * @see #setCacheDuration(int)
+                * @see #setCacheDuration(long)
                 * 
-                * @param cacheable
+                * @param cacheable resource may be cached (true/false)
                 */
                public void setCacheable(boolean cacheable)
                {
@@ -301,7 +301,7 @@ public abstract class AbstractResource i
                 * Sets the duration for which this resource should be cached 
on client (in seconds). #see
                 * {...@link IResourceSettings#setDefaultCacheDuration(int)}
                 * 
-                * @param cacheDuration
+                * @param cacheDuration caching duration in seconds
                 */
                public void setCacheDuration(long cacheDuration)
                {
@@ -321,10 +321,10 @@ public abstract class AbstractResource i
                 * data.
                 * <p>
                 * It is necessary to set the {...@link WriteCallback} if
-                * {...@link 
#dataNeedsToBeWritten(org.apache.wicket.ng.resource.IResource.Attributes)} 
returns
+                * {...@link 
#dataNeedsToBeWritten(org.apache.wicket.request.resource.IResource.Attributes)} 
returns
                 * <code>true</code> and {...@link #setError(Integer)} has not 
been called.
                 * 
-                * @param writeCallback
+                * @param writeCallback write callback
                 */
                public void setWriteCallback(final WriteCallback writeCallback)
                {
@@ -344,20 +344,30 @@ public abstract class AbstractResource i
        /**
         * Configure the web response header for client cache control.
         * 
-        * @param request
-        * @param response
-        * @param data
-        * @param attributes
+        * @param request web request
+        * @param response web response
+        * @param data resource data
+        * @param attributes request attributes
         */
        protected void configureCache(final WebRequest request, final 
WebResponse response,
                final ResourceResponse data, final Attributes attributes)
        {
+               long now = System.currentTimeMillis();
+
+               // Time of message generation
+               response.setDateHeader("Date", now);
+
                if (data.isCacheable())
                {
-                       // If time is set also set cache headers.
-                       response.setDateHeader("Expires", 
System.currentTimeMillis() +
-                               (data.getCacheDuration() * 1000L));
-                       response.setHeader(CACHE_CONTROL, "max-age=" + 
data.getCacheDuration());
+                       // Time for cache expiry
+                       response.setDateHeader("Expires", now + 
(data.getCacheDuration() * 1000L));
+
+                       // Allow caching even for public proxies or CDN 
providers
+                       response.setHeader(CACHE_CONTROL, "public, max-age=" + 
data.getCacheDuration());
+
+                       // Let caches distinguish between compressed and 
uncompressed
+                       // versions of the resource so they can serve them 
properly
+                       response.setHeader("Vary", "Accept-Encoding");
                }
                else
                {
@@ -392,73 +402,72 @@ public abstract class AbstractResource i
                        response.setStatus(HttpServletResponse.SC_NOT_MODIFIED);
                        return;
                }
-               else if (data.getErrorCode() != null)
+
+               if (data.getErrorCode() != null)
                {
                        response.sendError(data.getErrorCode(), 
data.getErrorMessage());
                        return;
                }
-               else
+
+               if (data.getWriteCallback() == null)
                {
-                       if (data.getWriteCallback() == null)
-                       {
-                               throw new IllegalStateException(
-                                       "ResourceData#setWriteCallback must be 
called for AbstractResource.");
-                       }
+                       throw new IllegalStateException(
+                               "ResourceData#setWriteCallback must be called 
for AbstractResource.");
+               }
 
-                       String fileName = data.getFileName();
-                       ContentDisposition disposition = 
data.getContentDisposition();
-                       String mimeType = data.getContentType();
-                       String encoding = null;
+               String fileName = data.getFileName();
+               ContentDisposition disposition = data.getContentDisposition();
+               String mimeType = data.getContentType();
+               String encoding = null;
 
-                       if (mimeType != null && mimeType.indexOf("text") != -1)
-                       {
-                               encoding = data.getTextEncoding();
-                       }
+               if (mimeType != null && mimeType.indexOf("text") != -1)
+               {
+                       encoding = data.getTextEncoding();
+               }
 
-                       long contentLength = data.getContentLength();
+               long contentLength = data.getContentLength();
 
-                       // 3. Content Disposition
-                       if (ContentDisposition.ATTACHMENT == disposition)
-                       {
-                               response.setAttachmentHeader(fileName);
-                       }
-                       else if (ContentDisposition.INLINE == disposition)
-                       {
-                               response.setInlineHeader(fileName);
-                       }
+               // 3. Content Disposition
+               if (ContentDisposition.ATTACHMENT == disposition)
+               {
+                       response.setAttachmentHeader(fileName);
+               }
+               else if (ContentDisposition.INLINE == disposition)
+               {
+                       response.setInlineHeader(fileName);
+               }
 
-                       // 4. Mime Type (+ encoding)
-                       if (mimeType != null)
+               // 4. Mime Type (+ encoding)
+               if (mimeType != null)
+               {
+                       if (encoding == null)
                        {
-                               if (encoding == null)
-                               {
-                                       response.setContentType(mimeType);
-                               }
-                               else
-                               {
-                                       response.setContentType(mimeType + "; 
charset=" + encoding);
-                               }
+                               response.setContentType(mimeType);
                        }
-
-                       // 5. Content Length
-                       if (contentLength != -1)
+                       else
                        {
-                               response.setContentLength(contentLength);
+                               response.setContentType(mimeType + "; charset=" 
+ encoding);
                        }
+               }
 
-                       // 6. Flush the response
-                       // This is necessary for firefox if this resource is an 
image, otherwise it messes up
-                       // other images on page
-                       response.flush();
-
-                       // 7. Write Data
-                       data.getWriteCallback().writeData(attributes);
+               // 5. Content Length
+               if (contentLength != -1)
+               {
+                       response.setContentLength(contentLength);
                }
+
+               // 6. Flush the response
+               // This is necessary for firefox if this resource is an image, 
otherwise it messes up
+               // other images on page
+               response.flush();
+
+               // 7. Write Data
+               data.getWriteCallback().writeData(attributes);
        }
 
        /**
         * Callback invoked when resource data needs to be written to response. 
Subclass needs to
-        * implement the {...@link 
#writeData(org.apache.wicket.ng.resource.IResource.Attributes)} method.
+        * implement the {...@link 
#writeData(org.apache.wicket.request.resource.IResource.Attributes)} method.
         * 
         * @author Matej Knopp
         */
@@ -467,15 +476,15 @@ public abstract class AbstractResource i
                /**
                 * Write the resource data to response.
                 * 
-                * @param attributes
+                * @param attributes request attributes
                 */
                public abstract void writeData(Attributes attributes);
 
                /**
                 * Convenience method to write an {...@link InputStream} to 
response.
                 * 
-                * @param attributes
-                * @param stream
+                * @param attributes request attributes
+                * @param stream input stream
                 */
                protected final void writeStream(Attributes attributes, 
InputStream stream)
                {


Reply via email to