Author: julien(a)jboss.com
Date: 2008-01-25 16:12:42 -0500 (Fri, 25 Jan 2008)
New Revision: 9611
Modified:
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/aspects/portlet/ConsumerCacheInterceptor.java
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/api/MimeResponseImpl.java
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr168/ext/nocache/AbstractNoCacheTestCase.java
Log:
test and implemented caching revalidation
Modified:
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/aspects/portlet/ConsumerCacheInterceptor.java
===================================================================
---
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/aspects/portlet/ConsumerCacheInterceptor.java 2008-01-25
19:59:07 UTC (rev 9610)
+++
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/aspects/portlet/ConsumerCacheInterceptor.java 2008-01-25
21:12:42 UTC (rev 9611)
@@ -29,6 +29,7 @@
import org.jboss.portal.portlet.invocation.response.cache.StrongContentRef;
import org.jboss.portal.portlet.invocation.response.FragmentResponse;
import org.jboss.portal.portlet.invocation.response.PortletInvocationResponse;
+import org.jboss.portal.portlet.invocation.response.RevalidateMarkupResponse;
import org.jboss.portal.portlet.StateString;
import org.jboss.portal.portlet.ParametersStateString;
import org.jboss.portal.portlet.cache.CacheControl;
@@ -124,43 +125,66 @@
{
RenderInvocation render = (RenderInvocation)invocation;
- // Set validation token for revalidation if any
- render.setValidationToken(cachedEntry != null ? cachedEntry.validationToken :
null);
+ // Set validation token for revalidation only we have have a fragment
+ if (fragment != null)
+ {
+ render.setValidationToken(cachedEntry.validationToken);
+ }
// Invoke
PortletInvocationResponse response =
(PortletInvocationResponse)invocation.invokeNext();
// Try to cache any fragment result
+ CacheControl control = null;
if (response instanceof FragmentResponse)
{
- FragmentResponse renderResult = (FragmentResponse)response;
+ fragment = (FragmentResponse)response;
+ control = fragment.getCacheControl();
+ }
+ else if (response instanceof RevalidateMarkupResponse)
+ {
+ RevalidateMarkupResponse revalidate = (RevalidateMarkupResponse)response;
+ control = revalidate.getCacheControl();
+ }
- //
- CacheControl control = renderResult.getCacheControl();
-
- //
- if (control != null)
+ // Compute expiration time, i.e when it will expire
+ long expirationTimeMillis = 0;
+ String validationToken = null;
+ if (control != null)
+ {
+ if (control.getExpirationSecs() == -1)
{
- // Compute expiration time, i.e when it will expire
- long expirationTimeMillis = 0;
- if (control.getExpirationSecs() == -1)
- {
- expirationTimeMillis = Long.MAX_VALUE;
- }
- else if (control.getExpirationSecs() > 0)
- {
- expirationTimeMillis = System.currentTimeMillis() +
control.getExpirationSecs() * 1000;
- }
-
- // Cache if we can
- if (expirationTimeMillis > 0)
- {
- CacheEntry cacheEntry = new CacheEntry(navState, windowState, mode,
renderResult, expirationTimeMillis, control.getValidationToken());
- resolver.setAttribute(scopeKey, cacheEntry);
- }
+ expirationTimeMillis = Long.MAX_VALUE;
}
+ else if (control.getExpirationSecs() > 0)
+ {
+ expirationTimeMillis = System.currentTimeMillis() +
control.getExpirationSecs() * 1000;
+ }
+ if (control.getValidationToken() != null)
+ {
+ validationToken = control.getValidationToken();
+ }
+ else if (cachedEntry != null)
+ {
+ validationToken = cachedEntry.validationToken;
+ }
}
+ // Compute the validation token
+
+ // Cache if we can
+ if (expirationTimeMillis > 0)
+ {
+ CacheEntry cacheEntry = new CacheEntry(
+ navState,
+ windowState,
+ mode,
+ fragment,
+ expirationTimeMillis,
+ validationToken);
+ resolver.setAttribute(scopeKey, cacheEntry);
+ }
+
//
return response;
}
Modified:
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/api/MimeResponseImpl.java
===================================================================
---
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/api/MimeResponseImpl.java 2008-01-25
19:59:07 UTC (rev 9610)
+++
modules/portlet/trunk/portlet/src/main/java/org/jboss/portal/portlet/impl/jsr168/api/MimeResponseImpl.java 2008-01-25
21:12:42 UTC (rev 9611)
@@ -237,6 +237,13 @@
fragment.getCacheControl().setValidationToken(value);
}
}
+ else if (MimeResponse.USE_CACHED_CONTENT.equals(key))
+ {
+ if (value != null)
+ {
+ getCacheControl().setUseCachedContent(true);
+ }
+ }
else
{
super.addProperty(key, value);
Modified:
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr168/ext/nocache/AbstractNoCacheTestCase.java
===================================================================
---
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr168/ext/nocache/AbstractNoCacheTestCase.java 2008-01-25
19:59:07 UTC (rev 9610)
+++
modules/portlet/trunk/portlet/src/test/java/org/jboss/portal/test/portlet/jsr168/ext/nocache/AbstractNoCacheTestCase.java 2008-01-25
21:12:42 UTC (rev 9611)
@@ -33,7 +33,7 @@
import org.jboss.unit.driver.response.EndTestResponse;
import org.jboss.unit.remote.driver.handler.http.response.InvokeGetResponse;
import org.jboss.unit.Failure;
-import static org.jboss.unit.api.Assert.assertEquals;
+import static org.jboss.unit.api.Assert.*;
import javax.portlet.Portlet;
import javax.portlet.RenderRequest;
@@ -157,36 +157,107 @@
protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
{
assertEquals("xyz", request.getETag());
+
assertTrue(Tools.toSet(request.getPropertyNames()).contains(RenderRequest.ETAG));
+ assertEquals("xyz", request.getProperty(RenderRequest.ETAG));
- // Should be called
+ // Record we were called
calls.add("5");
+
+ // Revalidate existing content
response.setProperty(RenderResponse.EXPIRATION_CACHE, "5");
+ response.setProperty(RenderResponse.USE_CACHED_CONTENT, "foo");
+
+ //
+ url = response.createRenderURL().toString();
+ return new InvokeGetResponse(url);
+ }
+ });
+
+ //
+ seq.bindAction(6, p1renderjp, new PortletRenderTestAction()
+ {
+ protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
+ {
+ // Should not be called
+ calls.add("6");
+ return null;
+ }
+ });
+ seq.bindAction(6, p2renderjp, new PortletRenderTestAction()
+ {
+ protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
+ {
+ // Refresh
+ return new InvokeGetResponse(url);
+ }
+ });
+
+ //
+ seq.bindAction(7, p1renderjp, new PortletRenderTestAction()
+ {
+ protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
+ {
+ // Could be called or not depending on the page rendering ordre
+ return null;
+ }
+ });
+ seq.bindAction(7, p2renderjp, new PortletRenderTestAction()
+ {
+ protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
+ {
+ try
+ {
+ // Wait 5 seconds for the cache entry to be invalid
+ Thread.sleep(5 * 1000);
+
+ // Refresh
+ return new InvokeGetResponse(url);
+ }
+ catch (InterruptedException e)
+ {
+ return new FailureResponse(Failure.createFailure(e));
+ }
+ }
+ });
+
+ //
+ seq.bindAction(8, p1renderjp, new PortletRenderTestAction()
+ {
+ protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
+ {
+ assertEquals("xyz", request.getETag());
+
assertTrue(Tools.toSet(request.getPropertyNames()).contains(RenderRequest.ETAG));
+ assertEquals("xyz", request.getProperty(RenderRequest.ETAG));
+
+ // Record we were called
+ calls.add("8");
+
url = response.createActionURL().toString();
return new InvokeGetResponse(url);
}
});
//
- seq.bindAction(6, p1actionjp, new PortletActionTestAction()
+ seq.bindAction(9, p1actionjp, new PortletActionTestAction()
{
protected void run(Portlet portlet, ActionRequest request, ActionResponse
response, PortletTestContext context) throws PortletException, IOException
{
// Should be called
- calls.add("6_action");
+ calls.add("9_action");
}
});
- seq.bindAction(6, p1renderjp, new PortletRenderTestAction()
+ seq.bindAction(9, p1renderjp, new PortletRenderTestAction()
{
protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
{
// Should be called
- calls.add("6_render");
+ calls.add("9_render");
return new InvokeGetResponse(response.createRenderURL().toString());
}
});
//
- seq.bindAction(7, p1renderjp, new PortletRenderTestAction()
+ seq.bindAction(10, p1renderjp, new PortletRenderTestAction()
{
protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
{
@@ -194,12 +265,12 @@
return null;
}
});
- seq.bindAction(7, p2renderjp, new PortletRenderTestAction()
+ seq.bindAction(10, p2renderjp, new PortletRenderTestAction()
{
protected DriverResponse run(Portlet portlet, RenderRequest request,
RenderResponse response, PortletTestContext context) throws IOException, PortletException
{
//
- Set expected = Tools.toSet("0", "1", "2",
"5", "6_render", "6_action");
+ Set expected = Tools.toSet("0", "1", "2",
"5", "8", "9_render", "9_action");
assertEquals(expected, calls);
// Refresh