From 560a786c0972eb3253f4f72e34668b3ce403a6b8 Mon Sep 17 00:00:00 2001 From: Keith Donald Date: Sun, 18 Nov 2007 14:38:44 +0000 Subject: [PATCH] enable resource caching --- ...eAction.java => RenderResourceAction.java} | 21 +++++++++++++++---- .../ui/resource/ResourcesFlowBuilder.java | 4 ++-- ...ts.java => RenderResourceActionTests.java} | 6 +++--- 3 files changed, 22 insertions(+), 9 deletions(-) rename spring-faces/src/main/java/org/springframework/faces/ui/resource/{ResolveAndRenderResourceAction.java => RenderResourceAction.java} (82%) rename spring-faces/src/test/java/org/springframework/faces/ui/resource/{ResolveAndRenderResourceActionTests.java => RenderResourceActionTests.java} (93%) diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceAction.java b/spring-faces/src/main/java/org/springframework/faces/ui/resource/RenderResourceAction.java similarity index 82% rename from spring-faces/src/main/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceAction.java rename to spring-faces/src/main/java/org/springframework/faces/ui/resource/RenderResourceAction.java index 42d47000..4277496b 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceAction.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/resource/RenderResourceAction.java @@ -21,7 +21,7 @@ import org.springframework.webflow.execution.RequestContext; * * @author Jeremy Grelle */ -public class ResolveAndRenderResourceAction implements Action { +public class RenderResourceAction implements Action { private static final String IF_MODIFIED_SINCE_HEADER = "If-Modified-Since"; @@ -29,6 +29,10 @@ public class ResolveAndRenderResourceAction implements Action { private static final String HTTP_LAST_MODIFIED_HEADER = "Last-Modified"; + private static final String HTTP_EXPIRES_HEADER = "Expires"; + + private static final String HTTP_CACHE_CONTROL_HEADER = "Cache-Control"; + private Map defaultMimeTypes = new HashMap(); { defaultMimeTypes.put(".css", "text/css"); @@ -77,10 +81,8 @@ public class ResolveAndRenderResourceAction implements Action { response.setContentType(mimeType); response.setHeader(HTTP_CONTENT_LENGTH_HEADER, Long.toString(resourceConn.getContentLength())); - response.setDateHeader(HTTP_LAST_MODIFIED_HEADER, lastModified); - - // TODO - Should probably be setting cache and expires headers as well + configureCaching(response, 31556926); InputStream in = resourceConn.getInputStream(); OutputStream out = response.getOutputStream(); @@ -96,4 +98,15 @@ public class ResolveAndRenderResourceAction implements Action { } return new Event(this, "success"); } + + /** + * Set HTTP headers to allow caching for the given number of seconds. + * @param seconds number of seconds into the future that the response should be cacheable for + */ + private void configureCaching(HttpServletResponse response, int seconds) { + // HTTP 1.0 header + response.setDateHeader(HTTP_EXPIRES_HEADER, System.currentTimeMillis() + seconds * 1000L); + // HTTP 1.1 header + response.setHeader(HTTP_CACHE_CONTROL_HEADER, "max-age=" + seconds); + } } diff --git a/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourcesFlowBuilder.java b/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourcesFlowBuilder.java index 01d5f660..25c97b3a 100644 --- a/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourcesFlowBuilder.java +++ b/spring-faces/src/main/java/org/springframework/faces/ui/resource/ResourcesFlowBuilder.java @@ -10,7 +10,7 @@ import org.springframework.webflow.engine.builder.support.AbstractFlowBuilder; */ public class ResourcesFlowBuilder extends AbstractFlowBuilder { public void buildStates() throws FlowBuilderException { - EndState endState = new EndState(getFlow(), "renderResource"); - endState.setFinalResponseAction(new ResolveAndRenderResourceAction()); + EndState renderResource = new EndState(getFlow(), "renderResource"); + renderResource.setFinalResponseAction(new RenderResourceAction()); } } diff --git a/spring-faces/src/test/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceActionTests.java b/spring-faces/src/test/java/org/springframework/faces/ui/resource/RenderResourceActionTests.java similarity index 93% rename from spring-faces/src/test/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceActionTests.java rename to spring-faces/src/test/java/org/springframework/faces/ui/resource/RenderResourceActionTests.java index 7fc83ab4..e4f7a990 100644 --- a/spring-faces/src/test/java/org/springframework/faces/ui/resource/ResolveAndRenderResourceActionTests.java +++ b/spring-faces/src/test/java/org/springframework/faces/ui/resource/RenderResourceActionTests.java @@ -18,7 +18,7 @@ import org.springframework.webflow.context.ExternalContext; import org.springframework.webflow.context.RequestPath; import org.springframework.webflow.execution.RequestContext; -public class ResolveAndRenderResourceActionTests extends TestCase { +public class RenderResourceActionTests extends TestCase { ExternalContext externalContext = createMock(ExternalContext.class); RequestContext requestContext = createMock(RequestContext.class); @@ -29,10 +29,10 @@ public class ResolveAndRenderResourceActionTests extends TestCase { RequestPath requestPath; String[] requestElements; - ResolveAndRenderResourceAction action; + RenderResourceAction action; protected void setUp() throws Exception { - action = new ResolveAndRenderResourceAction(); + action = new RenderResourceAction(); expect(requestContext.getExternalContext()).andStubReturn(externalContext); expect(externalContext.getContext()).andStubReturn(servletContext);