Author: pete
Date: Tue May 3 20:52:02 2011
New Revision: 1099238
URL: http://svn.apache.org/viewvc?rev=1099238&view=rev
Log:
replace occurrences of unix long timestamps and java.util.Date, mostly in date
header processing parts and last modification code for wicket's resources
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebResponse.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ByteArrayResource.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResource.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/DynamicImageResource.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceStreamResource.java
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebRequest.java
Tue May 3 20:52:02 2011
@@ -31,6 +31,7 @@ import org.apache.wicket.request.Url;
import org.apache.wicket.request.Url.QueryParameter;
import org.apache.wicket.request.http.WebRequest;
import org.apache.wicket.util.string.UrlUtils;
+import org.apache.wicket.util.time.Time;
/**
* Mutable mock {@link WebRequest}.
@@ -137,22 +138,22 @@ public class MockWebRequest extends WebR
@Override
- public long getDateHeader(String name)
+ public Time getDateHeader(String name)
{
List<Object> dates = headers.get(name);
if (dates == null || dates.isEmpty())
{
- return -1;
+ return null;
}
Object date = dates.get(0);
- if (date instanceof Long == false)
+ if (date instanceof Time == false)
{
throw new WicketRuntimeException("Date header with name
'" + name +
- "' is not a valid long.");
+ "' is not a valid Time.");
}
- return (Long)date;
+ return (Time)date;
}
private void addHeaderObject(String name, Object value)
@@ -172,7 +173,7 @@ public class MockWebRequest extends WebR
* @param name
* @param value
*/
- public void setDateHeader(String name, long value)
+ public void setDateHeader(String name, Time value)
{
removeHeader(name);
addHeaderObject(name, value);
@@ -184,7 +185,7 @@ public class MockWebRequest extends WebR
* @param name
* @param value
*/
- public void addDateHeader(String name, long value)
+ public void addDateHeader(String name, Time value)
{
addHeaderObject(name, value);
}
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebResponse.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebResponse.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebResponse.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/mock/MockWebResponse.java
Tue May 3 20:52:02 2011
@@ -29,6 +29,8 @@ import javax.servlet.http.Cookie;
import org.apache.wicket.WicketRuntimeException;
import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.time.Time;
/**
* Mocked {@link WebResponse}.
@@ -128,8 +130,9 @@ public class MockWebResponse extends Web
private final Map<String, Object> headers = new HashMap<String,
Object>();
@Override
- public void setDateHeader(String name, long date)
+ public void setDateHeader(String name, Time date)
{
+ Args.notNull(date, "date");
headers.put(name, date);
}
@@ -138,20 +141,20 @@ public class MockWebResponse extends Web
*
* @return date header with specified name
*/
- public long getDateHeader(String name)
+ public Time getDateHeader(String name)
{
Object value = headers.get(name);
if (value == null)
{
throw new WicketRuntimeException("Date header '" + name
+ "' is not set.");
}
- else if (value instanceof Long == false)
+ else if (value instanceof Time == false)
{
throw new WicketRuntimeException("Header '" + name + "'
is not date type.");
}
else
{
- return (Long)value;
+ return (Time)value;
}
}
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/BufferedWebResponse.java
Tue May 3 20:52:02 2011
@@ -32,6 +32,7 @@ import org.apache.wicket.request.http.We
import org.apache.wicket.response.filter.IResponseFilter;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.string.AppendingStringBuffer;
+import org.apache.wicket.util.time.Time;
/**
* Subclass of {@link WebResponse} that buffers the actions and performs those
on another response.
@@ -253,9 +254,9 @@ public class BufferedWebResponse extends
private static class SetDateHeaderAction extends MetaDataAction
{
private final String name;
- private final long value;
+ private final Time value;
- public SetDateHeaderAction(String name, long value)
+ public SetDateHeaderAction(String name, Time value)
{
this.name = name;
this.value = value;
@@ -397,9 +398,9 @@ public class BufferedWebResponse extends
}
@Override
- public void setDateHeader(String name, long date)
+ public void setDateHeader(String name, Time date)
{
- actions.add(new SetDateHeaderAction(name, date));
+ actions.add(new SetDateHeaderAction(name, Args.notNull(date,
"date")));
}
@Override
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/HeaderBufferingWebResponse.java
Tue May 3 20:52:02 2011
@@ -20,6 +20,8 @@ import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.apache.wicket.request.http.WebResponse;
+import org.apache.wicket.util.lang.Args;
+import org.apache.wicket.util.time.Time;
/**
* Response that keeps headers in buffers but writes the content directly to
the response.
@@ -126,8 +128,9 @@ class HeaderBufferingWebResponse extends
}
@Override
- public void setDateHeader(String name, long date)
+ public void setDateHeader(String name, Time date)
{
+ Args.notNull(date, "date");
checkHeader();
bufferedResponse.setDateHeader(name, date);
}
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebRequest.java
Tue May 3 20:52:02 2011
@@ -43,6 +43,7 @@ import org.apache.wicket.util.string.Pre
import org.apache.wicket.util.string.StringValue;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.util.string.UrlUtils;
+import org.apache.wicket.util.time.Time;
import org.apache.wicket.util.upload.FileItemFactory;
import org.apache.wicket.util.upload.FileUploadException;
import org.slf4j.Logger;
@@ -208,9 +209,9 @@ public class ServletWebRequest extends W
}
@Override
- public long getDateHeader(String name)
+ public Time getDateHeader(String name)
{
- return httpServletRequest.getDateHeader(name);
+ return Time.valueOf(httpServletRequest.getDateHeader(name));
}
@Override
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/protocol/http/servlet/ServletWebResponse.java
Tue May 3 20:52:02 2011
@@ -29,6 +29,7 @@ import org.apache.wicket.request.Url;
import org.apache.wicket.request.http.WebResponse;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.string.Strings;
+import org.apache.wicket.util.time.Time;
/**
* WebResponse that wraps a {@link ServletWebResponse}.
@@ -82,9 +83,10 @@ public class ServletWebResponse extends
}
@Override
- public void setDateHeader(String name, long date)
+ public void setDateHeader(String name, Time date)
{
- httpServletResponse.setDateHeader(name, date);
+ Args.notNull(date, "date");
+ httpServletResponse.setDateHeader(name, date.getMilliseconds());
}
@Override
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/AbstractResource.java
Tue May 3 20:52:02 2011
@@ -19,7 +19,6 @@ package org.apache.wicket.request.resour
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
-import java.util.Date;
import javax.servlet.http.HttpServletResponse;
@@ -32,6 +31,7 @@ import org.apache.wicket.settings.IResou
import org.apache.wicket.util.io.Streams;
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.time.Duration;
+import org.apache.wicket.util.time.Time;
/**
* Convenience resource implementation. The subclass must implement
@@ -73,7 +73,7 @@ public abstract class AbstractResource i
private String contentType = null;
private String textEncoding;
private long contentLength = -1;
- private Date lastModified = null;
+ private Time lastModified = null;
private WriteCallback writeCallback;
private Duration cacheDuration;
private WebResponse.CacheScope cacheScope;
@@ -246,17 +246,17 @@ public abstract class AbstractResource i
* to client.
*
* @param lastModified
- * last modification date
+ * last modification timestamp
*/
- public void setLastModified(Date lastModified)
+ public void setLastModified(Time lastModified)
{
this.lastModified = lastModified;
}
/**
- * @return last modified date
+ * @return last modification timestamp
*/
- public Date getLastModified()
+ public Time getLastModified()
{
return lastModified;
}
@@ -264,7 +264,7 @@ public abstract class AbstractResource i
/**
* Check to determine if the resource data needs to be written.
This method checks the
* <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.
+ * In order for this method to work {@link
#setLastModified(Time)} has to be called first.
*
* @param attributes
* request attributes
@@ -274,19 +274,18 @@ public abstract class AbstractResource i
public boolean dataNeedsToBeWritten(Attributes attributes)
{
WebRequest request =
(WebRequest)attributes.getRequest();
- Date ifModifiedSince =
request.getIfModifiedSinceHeader();
- Date lastModified = getLastModified();
+ Time ifModifiedSince =
request.getIfModifiedSinceHeader();
- if (ifModifiedSince != null && lastModified != null)
+ if (ifModifiedSince != null && this.lastModified !=
null)
{
// [Last-Modified] headers have a maximum
precision of one second
// so we have to truncate the milliseconds part
for a proper compare.
// that's stupid, since changes within one
second will not be reliably
// detected by the client ... any hint or
clarification to improve this
// situation will be appreciated...
- long modified = this.lastModified.getTime() /
1000 * 1000;
+ Time roundedLastModified =
Time.valueOf(this.lastModified.getMilliseconds() / 1000 * 1000);
- return ifModifiedSince.getTime() < modified;
+ return
ifModifiedSince.before(roundedLastModified);
}
else
{
@@ -437,10 +436,10 @@ public abstract class AbstractResource i
WebResponse response = (WebResponse)attributes.getResponse();
// 1. Last Modified
- Date lastModified = data.getLastModified();
+ Time lastModified = data.getLastModified();
if (lastModified != null)
{
- response.setLastModifiedTime(lastModified.getTime());
+ response.setLastModifiedTime(lastModified);
}
// 2. Caching
@@ -521,7 +520,7 @@ public abstract class AbstractResource i
*
* @author Matej Knopp
*/
- public static abstract class WriteCallback
+ public abstract static class WriteCallback
{
/**
* Write the resource data to response.
@@ -565,7 +564,7 @@ public abstract class AbstractResource i
}
else
{
- byte copy[] = new byte[len];
+ byte[] copy = new byte[len];
System.arraycopy(b, off, copy,
0, len);
write(copy);
}
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ByteArrayResource.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ByteArrayResource.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ByteArrayResource.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ByteArrayResource.java
Tue May 3 20:52:02 2011
@@ -101,7 +101,7 @@ public class ByteArrayResource extends A
final ResourceResponse response = new ResourceResponse();
response.setContentType(contentType);
- response.setLastModified(lastModified.toDate());
+ response.setLastModified(lastModified);
if (response.dataNeedsToBeWritten(attributes))
{
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResource.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResource.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResource.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ContextRelativeResource.java
Tue May 3 20:52:02 2011
@@ -72,7 +72,7 @@ public class ContextRelativeResource ext
path);
resourceResponse.setContentType(webExternalResourceStream.getContentType());
-
resourceResponse.setLastModified(webExternalResourceStream.lastModifiedTime().toDate());
+
resourceResponse.setLastModified(webExternalResourceStream.lastModifiedTime());
resourceResponse.setFileName(path);
resourceResponse.setWriteCallback(new WriteCallback()
{
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/DynamicImageResource.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/DynamicImageResource.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/DynamicImageResource.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/DynamicImageResource.java
Tue May 3 20:52:02 2011
@@ -135,11 +135,11 @@ public abstract class DynamicImageResour
if (lastModifiedTime != null)
{
- response.setLastModified(lastModifiedTime.toDate());
+ response.setLastModified(lastModifiedTime);
}
else
{
- response.setLastModified(new Date());
+ response.setLastModified(Time.now());
}
if (response.dataNeedsToBeWritten(attributes))
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/PackageResource.java
Tue May 3 20:52:02 2011
@@ -209,7 +209,7 @@ public class PackageResource extends Abs
final Time lastModified =
resourceStream.lastModifiedTime();
if (lastModified != null)
-
resourceResponse.setLastModified(lastModified.toDate());
+ resourceResponse.setLastModified(lastModified);
try
{
Modified:
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceStreamResource.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceStreamResource.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceStreamResource.java
(original)
+++
wicket/trunk/wicket-core/src/main/java/org/apache/wicket/request/resource/ResourceStreamResource.java
Tue May 3 20:52:02 2011
@@ -94,7 +94,7 @@ public class ResourceStreamResource exte
Time lastModifiedTime = stream.lastModifiedTime();
if (lastModifiedTime != null)
{
- data.setLastModified(lastModifiedTime.toDate());
+ data.setLastModified(lastModifiedTime);
}
// performance check; don't bother to do anything if the
resource is still cached by client
Modified:
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
(original)
+++
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebRequest.java
Tue May 3 20:52:02 2011
@@ -17,7 +17,6 @@
package org.apache.wicket.request.http;
import java.nio.charset.Charset;
-import java.util.Date;
import java.util.List;
import java.util.Locale;
@@ -27,7 +26,7 @@ import org.apache.wicket.request.IReques
import org.apache.wicket.request.Request;
import org.apache.wicket.request.Url;
import org.apache.wicket.util.string.Strings;
-
+import org.apache.wicket.util.time.Time;
/**
* Base class for request that provides additional web-related information.
@@ -89,26 +88,18 @@ public abstract class WebRequest extends
* as <code>If-Modified-Since</code>.
*
* @param name
- * @return date value of request header
+ * @return date value of request header or <code>null</code> if not
found
*/
- public abstract long getDateHeader(String name);
+ public abstract Time getDateHeader(String name);
/**
* Convenience method for retrieving If-Modified-Since header.
*
* @return date representing the header or <code>null</code> if not set
*/
- public final Date getIfModifiedSinceHeader()
+ public final Time getIfModifiedSinceHeader()
{
- final long header = getDateHeader("If-Modified-Since");
- if (header >= 0)
- {
- return new Date(header);
- }
- else
- {
- return null;
- }
+ return getDateHeader("If-Modified-Since");
}
@@ -173,7 +164,7 @@ public abstract class WebRequest extends
}
@Override
- public long getDateHeader(final String name)
+ public Time getDateHeader(final String name)
{
return WebRequest.this.getDateHeader(name);
}
Modified:
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
URL:
http://svn.apache.org/viewvc/wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java?rev=1099238&r1=1099237&r2=1099238&view=diff
==============================================================================
---
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
(original)
+++
wicket/trunk/wicket-request/src/main/java/org/apache/wicket/request/http/WebResponse.java
Tue May 3 20:52:02 2011
@@ -24,6 +24,7 @@ import org.apache.wicket.request.Respons
import org.apache.wicket.util.lang.Args;
import org.apache.wicket.util.string.Strings;
import org.apache.wicket.util.time.Duration;
+import org.apache.wicket.util.time.Time;
/**
* Base class for web-related responses.
@@ -66,7 +67,7 @@ public abstract class WebResponse extend
* @param name
* @param date
*/
- public abstract void setDateHeader(String name, long date);
+ public abstract void setDateHeader(String name, Time date);
/**
* Set the content length on the response, if appropriate in the
subclass. This default
@@ -90,9 +91,9 @@ public abstract class WebResponse extend
* Set the contents last modified time, if appropriate in the subclass.
*
* @param time
- * The last modified time in milliseconds
+ * The last modified time
*/
- public void setLastModifiedTime(final long time)
+ public void setLastModifiedTime(final Time time)
{
setDateHeader("Last-Modified", time);
}
@@ -166,8 +167,8 @@ public abstract class WebResponse extend
*/
public void disableCaching()
{
- setDateHeader("Date", System.currentTimeMillis());
- setDateHeader("Expires", 0);
+ setDateHeader("Date", Time.now());
+ setDateHeader("Expires", Time.START_OF_UNIX_TIME);
setHeader("Pragma", "no-cache");
setHeader("Cache-Control", "no-cache, no-store");
}
@@ -196,13 +197,13 @@ public abstract class WebResponse extend
}
// Get current time
- long now = System.currentTimeMillis();
+ Time now = Time.now();
// Time of message generation
setDateHeader("Date", now);
// Time for cache expiry = now + duration
- setDateHeader("Expires", now + duration.getMilliseconds());
+ setDateHeader("Expires", now.add(duration));
// Enable caching and set max age
setHeader("Cache-Control", scope.cacheControl + ", max-age=" +
duration.getMilliseconds());