Author: hlship
Date: Sat Dec 31 01:11:04 2011
New Revision: 1226006
URL: http://svn.apache.org/viewvc?rev=1226006&view=rev
Log:
TAP5-1809: Option to render a particular page instance in its current state
(without page activation)
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/BypassActivationTests.groovy
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.java
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.tml
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalConstants.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImpl.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/StreamPageContentResultProcessor.java
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/StreamPageContent.java
tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Index.tml
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImplTest.java
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalConstants.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalConstants.java?rev=1226006&r1=1226005&r2=1226006&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalConstants.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/InternalConstants.java
Sat Dec 31 01:11:04 2011
@@ -156,4 +156,13 @@ public final class InternalConstants
* @since 5.3
*/
public static final String CANCEL_NAME = "cancel";
+
+ /**
+ * Request attribute that can be set to bypass page activation.
+ *
+ * @since 5.4
+ * @see
org.apache.tapestry5.internal.services.StreamPageContentResultProcessor
+ * @see org.apache.tapestry5.internal.services.PageRenderRequestHandlerImpl
+ */
+ public static final String BYPASS_ACTIVATION =
"tapestry.bypass-page-activation";
}
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImpl.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImpl.java?rev=1226006&r1=1226005&r2=1226006&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImpl.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImpl.java
Sat Dec 31 01:11:04 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2009, 2010 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -14,18 +14,16 @@
package org.apache.tapestry5.internal.services;
-import java.io.IOException;
-
+import org.apache.tapestry5.internal.InternalConstants;
import org.apache.tapestry5.internal.structure.Page;
import org.apache.tapestry5.ioc.annotations.Primary;
-import org.apache.tapestry5.services.ComponentEventResultProcessor;
-import org.apache.tapestry5.services.PageRenderRequestHandler;
-import org.apache.tapestry5.services.PageRenderRequestParameters;
-import org.apache.tapestry5.services.Traditional;
+import org.apache.tapestry5.services.*;
+
+import java.io.IOException;
/**
* Handles a page render request by activating and then rendering the page.
- *
+ *
* @see org.apache.tapestry5.internal.services.PageRenderDispatcher
*/
@SuppressWarnings("unchecked")
@@ -39,27 +37,37 @@ public class PageRenderRequestHandlerImp
private final PageActivator pageActivator;
+ private final Request request;
+
public PageRenderRequestHandlerImpl(RequestPageCache cache, @Traditional
@Primary
ComponentEventResultProcessor resultProcessor, PageResponseRenderer
pageResponseRenderer,
- PageActivator pageActivator)
+ PageActivator pageActivator, Request
request)
{
this.cache = cache;
this.resultProcessor = resultProcessor;
this.pageResponseRenderer = pageResponseRenderer;
this.pageActivator = pageActivator;
+ this.request = request;
}
public void handle(PageRenderRequestParameters parameters) throws
IOException
{
Page page = cache.get(parameters.getLogicalPageName());
- if
(pageActivator.activatePage(page.getRootElement().getComponentResources(),
- parameters.getActivationContext(), resultProcessor))
- return;
-
- if (!parameters.isLoopback())
- page.pageReset();
+ if (request.getAttribute(InternalConstants.BYPASS_ACTIVATION) == null)
+ {
+ if
(pageActivator.activatePage(page.getRootElement().getComponentResources(),
+ parameters.getActivationContext(), resultProcessor))
+ {
+ return;
+ }
+
+ if (!parameters.isLoopback())
+ {
+ page.pageReset();
+ }
+ }
pageResponseRenderer.renderPageResponse(page);
}
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/StreamPageContentResultProcessor.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/StreamPageContentResultProcessor.java?rev=1226006&r1=1226005&r2=1226006&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/StreamPageContentResultProcessor.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/StreamPageContentResultProcessor.java
Sat Dec 31 01:11:04 2011
@@ -14,24 +14,18 @@
package org.apache.tapestry5.internal.services;
-import java.io.IOException;
-
import org.apache.tapestry5.EventContext;
import org.apache.tapestry5.internal.EmptyEventContext;
import org.apache.tapestry5.internal.InternalConstants;
-import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.services.TypeCoercer;
-import org.apache.tapestry5.services.ComponentClassResolver;
-import org.apache.tapestry5.services.ComponentEventResultProcessor;
-import org.apache.tapestry5.services.PageRenderRequestHandler;
-import org.apache.tapestry5.services.PageRenderRequestParameters;
-import org.apache.tapestry5.services.Request;
-import org.apache.tapestry5.services.StreamPageContent;
+import org.apache.tapestry5.services.*;
+
+import java.io.IOException;
/**
* Used to trigger the rendering of a particular page without causing a
redirect to that page.
* The content of the page is just streamed to the client.
- *
+ *
* @since 5.2.0
*/
public class StreamPageContentResultProcessor implements
ComponentEventResultProcessor<StreamPageContent>
@@ -42,24 +36,37 @@ public class StreamPageContentResultProc
private final TypeCoercer typeCoercer;
- public StreamPageContentResultProcessor(PageRenderRequestHandler handler,
ComponentClassResolver resolver, TypeCoercer typeCoercer)
+ private final RequestGlobals requestGlobals;
+
+ private final Request request;
+
+ public StreamPageContentResultProcessor(PageRenderRequestHandler handler,
ComponentClassResolver resolver, TypeCoercer typeCoercer, RequestGlobals
requestGlobals, Request request)
{
this.handler = handler;
this.resolver = resolver;
this.typeCoercer = typeCoercer;
+ this.requestGlobals = requestGlobals;
+ this.request = request;
}
- public void processResultValue(final StreamPageContent value) throws
IOException
+ public void processResultValue(StreamPageContent value) throws IOException
{
+ Class<?> pageClass = value.getPageClass();
+ Object[] activationContext = value.getPageActivationContext();
- final Class<?> pageClass = value.getPageClass();
- final Object[] activationContext = value.getPageActivationContext();
-
- final String pageName =
this.resolver.resolvePageClassNameToPageName(pageClass.getName());
-
- final EventContext context = activationContext == null ? new
EmptyEventContext() : new ArrayEventContext(
- this.typeCoercer, activationContext);
+ String pageName = pageClass == null
+ ? requestGlobals.getActivePageName()
+ : resolver.resolvePageClassNameToPageName(pageClass.getName());
+
+ EventContext context = activationContext == null
+ ? new EmptyEventContext()
+ : new ArrayEventContext(typeCoercer, activationContext);
+
+ if (value.isBypassActivation())
+ {
+ request.setAttribute(InternalConstants.BYPASS_ACTIVATION, true);
+ }
- this.handler.handle(new PageRenderRequestParameters(pageName, context,
false));
+ handler.handle(new PageRenderRequestParameters(pageName, context,
false));
}
}
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/StreamPageContent.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/StreamPageContent.java?rev=1226006&r1=1226005&r2=1226006&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/StreamPageContent.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/StreamPageContent.java
Sat Dec 31 01:11:04 2011
@@ -1,4 +1,4 @@
-// Copyright 2010 The Apache Software Foundation
+// Copyright 2010, 2011 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -15,19 +15,40 @@
package org.apache.tapestry5.services;
/**
- * An event handler method may return an instance of this class to trigger the
rendering
- * of a particular page without causing a redirect to that page.
- *
- * @since 5.2.0
+ * An event handler method may return an instance of this class to trigger the
rendering
+ * of a particular page without causing a redirect to that page; the rendering
takes place as part
+ * of the original component event request, thus forming the opposite of
Tapestry's normal
+ * redirect-after-event behavior.
+ * <p>
+ * The page will be activated using the provided page activation context (or
an empty page activation
+ * context). Starting with 5.3, the page activation step can be bypassed.
Rendering occurs using
+ * the standard {@link PageRenderRequestHandler} pipeline.
+ * </p>
*
+ * @since 5.2.0
*/
public final class StreamPageContent
{
private final Class<?> pageClass;
+
private final Object[] pageActivationContext;
+ private final boolean bypassActivation;
+
+ /**
+ * Creates an instance that streams the activate page's content (that is,
{@link #getPageClass()} will be null).
+ * Unless otherwise configured, page activation will take place.
+ *
+ * @since 5.4
+ */
+ public StreamPageContent()
+ {
+ this(null);
+ }
+
/**
- *
+ * Renders the page using an empty page activation context.
+ *
* @param pageClass class of the page to render
*/
public StreamPageContent(final Class<?> pageClass)
@@ -36,19 +57,27 @@ public final class StreamPageContent
}
/**
- *
- * @param pageClass class of the page to render
+ * Renders the page using the supplied page activation context.
+ *
+ * @param pageClass class of the page to render, or null to
render the currently active page (as per
+ * {@link
org.apache.tapestry5.services.RequestGlobals#getActivePageName()})
* @param pageActivationContext activation context of the page
*/
public StreamPageContent(final Class<?> pageClass, final Object...
pageActivationContext)
{
- super();
+ this(pageClass, pageActivationContext, false);
+ }
+
+ private StreamPageContent(Class<?> pageClass, Object[]
pageActivationContext, boolean bypassActivation)
+ {
this.pageClass = pageClass;
this.pageActivationContext = pageActivationContext;
+ this.bypassActivation = bypassActivation;
}
/**
- * Returns the class of the page to render.
+ * Returns the class of the page to render, or null to indicate that the
active page for the request should simply
+ * be re-rendered.
*/
public Class<?> getPageClass()
{
@@ -56,10 +85,34 @@ public final class StreamPageContent
}
/**
- * Returns the activation context of the page.
+ * Returns the activation context of the page. May return null to indicate
an empty activation context.
*/
public Object[] getPageActivationContext()
{
return this.pageActivationContext;
}
+
+ /**
+ * Returns a new StreamPageInstance with the {@linkplain
#isBypassActivation bypass activation flag} set to true, such that
+ * page activation will be bypassed when the page is rendered.
+ *
+ * @return new instance
+ */
+ public StreamPageContent withoutActivation()
+ {
+ if (pageActivationContext != null)
+ {
+ throw new IllegalStateException("A StreamPageContext instance
created with a page activation context may not be converted to bypass page
activation.");
+ }
+
+ return new StreamPageContent(pageClass, null, true);
+ }
+
+ /**
+ * @return true if configured to bypass activation
+ */
+ public boolean isBypassActivation()
+ {
+ return bypassActivation;
+ }
}
Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Index.tml
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Index.tml?rev=1226006&r1=1226005&r2=1226006&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Index.tml (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/app1/Index.tml Sat Dec 31
01:11:04 2011
@@ -198,6 +198,11 @@
<a href="missingembeddedcomponent">Missing Embedded Component</a> --
@InjectComponent for component not in
template
</li>
+ <li>
+ <t:actionlink t:id="immediateResponse">Immediate
Response</t:actionlink>
+ -- Stream page content bypassing page activation
+ </li>
+
</ul>
</html>
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/BypassActivationTests.groovy
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/BypassActivationTests.groovy?rev=1226006&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/BypassActivationTests.groovy
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/groovy/org/apache/tapestry5/integration/app1/BypassActivationTests.groovy
Sat Dec 31 01:11:04 2011
@@ -0,0 +1,22 @@
+package org.apache.tapestry5.integration.app1
+
+import org.apache.tapestry5.integration.TapestryCoreTestCase
+import org.testng.annotations.Test
+
+/**
+ * See
https://issues.apache.org/jira/browse/TAP5-1809?jwupdated=41324#linkingmodule
+ */
+class BypassActivationTests extends TapestryCoreTestCase {
+
+ @Test
+ void activation_can_by_bypassed() {
+
+ openLinks "Immediate Response"
+
+ assertText "activated", "false"
+
+ clickAndWait "link=refresh"
+
+ assertText "activated", "true"
+ }
+}
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.java?rev=1226006&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.java
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.java
Sat Dec 31 01:11:04 2011
@@ -0,0 +1,14 @@
+package org.apache.tapestry5.integration.app1.pages;
+
+import org.apache.tapestry5.annotations.Property;
+
+public class BypassActivationTarget
+{
+ @Property
+ private boolean activated;
+
+ void onActivate()
+ {
+ activated = true;
+ }
+}
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=1226006&r1=1226005&r2=1226006&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
Sat Dec 31 01:11:04 2011
@@ -23,6 +23,7 @@ import org.apache.tapestry5.annotations.
import org.apache.tapestry5.ioc.annotations.Inject;
import org.apache.tapestry5.ioc.internal.util.CollectionFactory;
import org.apache.tapestry5.ioc.internal.util.InternalUtils;
+import org.apache.tapestry5.services.StreamPageContent;
import java.util.*;
@@ -176,7 +177,7 @@ public class Index
"Use of generic parameters with the Loop
component."),
new Item("LoopWithMixinDemo", "Loop With Mixin Demo",
- "Use a mixin with a Loop component."),
+ "Use a mixin with a Loop component."),
new Item("BlankPasswordDemo", "Blank Password Demo",
"Show that a blank value in a PasswordField does
not update the server side value."),
@@ -581,4 +582,9 @@ public class Index
{
return alert;
}
+
+ Object onActionFromImmediateResponse()
+ {
+ return new
StreamPageContent(BypassActivationTarget.class).withoutActivation();
+ }
}
Modified:
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImplTest.java
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImplTest.java?rev=1226006&r1=1226005&r2=1226006&view=diff
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImplTest.java
(original)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageRenderRequestHandlerImplTest.java
Sat Dec 31 01:11:04 2011
@@ -1,4 +1,4 @@
-// Copyright 2010 The Apache Software Foundation
+// Copyright 2010, 2011 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
@@ -16,12 +16,14 @@ package org.apache.tapestry5.internal.se
import org.apache.tapestry5.EventContext;
import org.apache.tapestry5.internal.InternalComponentResources;
+import org.apache.tapestry5.internal.InternalConstants;
import org.apache.tapestry5.internal.structure.ComponentPageElement;
import org.apache.tapestry5.internal.structure.Page;
import org.apache.tapestry5.internal.test.InternalBaseTestCase;
import org.apache.tapestry5.services.ComponentEventResultProcessor;
import org.apache.tapestry5.services.PageRenderRequestHandler;
import org.apache.tapestry5.services.PageRenderRequestParameters;
+import org.apache.tapestry5.services.Request;
import org.testng.annotations.Test;
public class PageRenderRequestHandlerImplTest extends InternalBaseTestCase
@@ -37,7 +39,9 @@ public class PageRenderRequestHandlerImp
ComponentPageElement root = mockComponentPageElement();
InternalComponentResources pageResources =
mockInternalComponentResources();
PageActivator activator = newMock(PageActivator.class);
-
+ Request request = mockRequest();
+
+ train_getAttribute(request, InternalConstants.BYPASS_ACTIVATION, null);
train_get(cache, "foo/Bar", page);
train_getRootElement(page, root);
@@ -50,7 +54,7 @@ public class PageRenderRequestHandlerImp
replay();
- PageRenderRequestHandler handler = new
PageRenderRequestHandlerImpl(cache, processor, renderer, activator);
+ PageRenderRequestHandler handler = new
PageRenderRequestHandlerImpl(cache, processor, renderer, activator, request);
PageRenderRequestParameters parameters = new
PageRenderRequestParameters("foo/Bar", context, true);
Added:
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.tml
URL:
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.tml?rev=1226006&view=auto
==============================================================================
---
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.tml
(added)
+++
tapestry/tapestry5/trunk/tapestry-core/src/test/resources/org/apache/tapestry5/integration/app1/pages/BypassActivationTarget.tml
Sat Dec 31 01:11:04 2011
@@ -0,0 +1,8 @@
+<html t:type="Border"
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_3.xsd">
+
+ <p>
+ Activate event was triggered: <span id="activated">${activated}</span>
+ </p>
+
+ <t:pagelink page="bypassactivationtarget">refresh</t:pagelink>
+</html>
\ No newline at end of file