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


Reply via email to