You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by hl...@apache.org on 2010/04/07 01:01:06 UTC

svn commit: r931362 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry5/internal/services/ main/java/org/apache/tapestry5/services/ test/java/org/apache/tapestry5/internal/services/

Author: hlship
Date: Tue Apr  6 23:01:05 2010
New Revision: 931362

URL: http://svn.apache.org/viewvc?rev=931362&view=rev
Log:
TAP5-1099: Introduce public service responsible for handling page activation

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivator.java   (with props)
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivatorImpl.java   (with props)
Removed:
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/PageRenderDispatcherTest.java
Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentEventRequestHandler.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventRequestHandlerImpl.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/services/TapestryModule.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImplTest.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/services/AjaxComponentEventRequestHandler.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentEventRequestHandler.java?rev=931362&r1=931361&r2=931362&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentEventRequestHandler.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/AjaxComponentEventRequestHandler.java Tue Apr  6 23:01:05 2010
@@ -48,13 +48,17 @@ public class AjaxComponentEventRequestHa
 
     private final AjaxPartialResponseRenderer partialRenderer;
 
+    private final PageActivator pageActivator;
+
     public AjaxComponentEventRequestHandler(RequestPageCache cache, Request request, PageRenderQueue queue, @Ajax
-    ComponentEventResultProcessor resultProcessor, PageContentTypeAnalyzer pageContentTypeAnalyzer,
-            Environment environment, AjaxPartialResponseRenderer partialRenderer)
+    ComponentEventResultProcessor resultProcessor, PageActivator pageActivator,
+            PageContentTypeAnalyzer pageContentTypeAnalyzer, Environment environment,
+            AjaxPartialResponseRenderer partialRenderer)
     {
         this.cache = cache;
         this.queue = queue;
         this.resultProcessor = resultProcessor;
+        this.pageActivator = pageActivator;
         this.pageContentTypeAnalyzer = pageContentTypeAnalyzer;
         this.request = request;
         this.environment = environment;
@@ -78,16 +82,9 @@ public class AjaxComponentEventRequestHa
             }
         };
 
-        ComponentResultProcessorWrapper callback = new ComponentResultProcessorWrapper(interceptor);
-
-        activePage.getRootElement().triggerContextEvent(EventConstants.ACTIVATE, parameters.getPageActivationContext(),
-                callback);
-
-        if (callback.isAborted())
-        {
-            callback.rethrow();
+        if (pageActivator.activatePage(activePage.getRootElement().getComponentResources(), parameters
+                .getPageActivationContext(), interceptor))
             return;
-        }
 
         // If we end up doing a partial render, the page render queue service needs to know the
         // page that will be rendered (for logging purposes, if nothing else).
@@ -106,6 +103,8 @@ public class AjaxComponentEventRequestHa
         // pass its event handler return values to the correct result processor.
         // This is certainly the case for forms.
 
+        TrackableComponentEventCallback callback = new ComponentResultProcessorWrapper(interceptor);
+
         environment.push(ComponentEventResultProcessor.class, interceptor);
         environment.push(TrackableComponentEventCallback.class, callback);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventRequestHandlerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventRequestHandlerImpl.java?rev=931362&r1=931361&r2=931362&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventRequestHandlerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/ComponentEventRequestHandlerImpl.java Tue Apr  6 23:01:05 2010
@@ -17,7 +17,6 @@ package org.apache.tapestry5.internal.se
 import java.io.IOException;
 
 import org.apache.tapestry5.TrackableComponentEventCallback;
-import org.apache.tapestry5.EventConstants;
 import org.apache.tapestry5.internal.structure.ComponentPageElement;
 import org.apache.tapestry5.internal.structure.Page;
 import org.apache.tapestry5.ioc.annotations.Primary;
@@ -38,6 +37,8 @@ public class ComponentEventRequestHandle
 
     private final Response response;
 
+    private final PageActivator pageActivator;
+
     private final ActionRenderResponseGenerator generator;
 
     private final Environment environment;
@@ -48,13 +49,14 @@ public class ComponentEventRequestHandle
 
     RequestPageCache cache, Response response,
 
-    ActionRenderResponseGenerator generator,
+    PageActivator pageActivator,
 
-    Environment environment)
+    ActionRenderResponseGenerator generator, Environment environment)
     {
         this.resultProcessor = resultProcessor;
         this.cache = cache;
         this.response = response;
+        this.pageActivator = pageActivator;
         this.generator = generator;
         this.environment = environment;
     }
@@ -63,25 +65,17 @@ public class ComponentEventRequestHandle
     {
         Page activePage = cache.get(parameters.getActivePageName());
 
+        if (pageActivator.activatePage(activePage.getRootElement().getComponentResources(), parameters
+                .getPageActivationContext(), resultProcessor))
+            return;
+
+        Page containerPage = cache.get(parameters.getContainingPageName());
+
         TrackableComponentEventCallback callback = new ComponentResultProcessorWrapper(resultProcessor);
 
         environment.push(ComponentEventResultProcessor.class, resultProcessor);
         environment.push(TrackableComponentEventCallback.class, callback);
 
-        // If activating the page returns a "navigational result", then don't trigger the action
-        // on the component.
-
-        activePage.getRootElement().triggerContextEvent(EventConstants.ACTIVATE, parameters.getPageActivationContext(),
-                callback);
-
-        if (callback.isAborted())
-        {
-            callback.rethrow();
-            return;
-        }
-
-        Page containerPage = cache.get(parameters.getContainingPageName());
-
         ComponentPageElement element = containerPage.getComponentElementByNestedId(parameters.getNestedComponentId());
 
         boolean handled = element

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivator.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivator.java?rev=931362&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivator.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivator.java Tue Apr  6 23:01:05 2010
@@ -0,0 +1,46 @@
+// Copyright 2010 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.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal.services;
+
+import java.io.IOException;
+
+import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.EventConstants;
+import org.apache.tapestry5.EventContext;
+import org.apache.tapestry5.services.ComponentEventResultProcessor;
+
+/**
+ * Responsible for firing the {@linkplain EventConstants#ACTIVATE} event on the page.
+ * 
+ * @since 5.2.0
+ */
+public interface PageActivator
+{
+    /**
+     * Activates the page.
+     * 
+     * @param pageResources
+     *            resource for the page
+     * @param activationContext
+     *            the page activation context
+     * @param resultProcessor
+     *            responsible for handling the value returned from the event handler method
+     * @return true if result processor received a non-null value (indicating that the processing of the request
+     *         should terminate)
+     */
+    @SuppressWarnings("unchecked")
+    boolean activatePage(ComponentResources pageResources, EventContext activationContext,
+            ComponentEventResultProcessor resultProcessor) throws IOException;
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivator.java
------------------------------------------------------------------------------
    svn:eol-style = native

Added: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivatorImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivatorImpl.java?rev=931362&view=auto
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivatorImpl.java (added)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivatorImpl.java Tue Apr  6 23:01:05 2010
@@ -0,0 +1,45 @@
+// Copyright 2010 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.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+package org.apache.tapestry5.internal.services;
+
+import java.io.IOException;
+
+import org.apache.tapestry5.ComponentResources;
+import org.apache.tapestry5.EventConstants;
+import org.apache.tapestry5.EventContext;
+import org.apache.tapestry5.TrackableComponentEventCallback;
+import org.apache.tapestry5.services.ComponentEventResultProcessor;
+
+public class PageActivatorImpl implements PageActivator
+{
+
+    @SuppressWarnings("unchecked")
+    public boolean activatePage(ComponentResources pageResources, EventContext activationContext,
+            ComponentEventResultProcessor resultProcessor) throws IOException
+    {
+        TrackableComponentEventCallback callback = new ComponentResultProcessorWrapper(resultProcessor);
+
+        pageResources.triggerContextEvent(EventConstants.ACTIVATE, activationContext, callback);
+
+        if (callback.isAborted())
+        {
+            callback.rethrow();
+            return true;
+        }
+
+        return false;
+    }
+
+}

Propchange: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/internal/services/PageActivatorImpl.java
------------------------------------------------------------------------------
    svn:eol-style = native

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=931362&r1=931361&r2=931362&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 Tue Apr  6 23:01:05 2010
@@ -16,8 +16,6 @@ package org.apache.tapestry5.internal.se
 
 import java.io.IOException;
 
-import org.apache.tapestry5.TrackableComponentEventCallback;
-import org.apache.tapestry5.EventConstants;
 import org.apache.tapestry5.internal.structure.Page;
 import org.apache.tapestry5.ioc.annotations.Primary;
 import org.apache.tapestry5.services.ComponentEventResultProcessor;
@@ -39,30 +37,26 @@ public class PageRenderRequestHandlerImp
 
     private final PageResponseRenderer pageResponseRenderer;
 
+    private final PageActivator pageActivator;
+
     public PageRenderRequestHandlerImpl(RequestPageCache cache, @Traditional
     @Primary
-    ComponentEventResultProcessor resultProcessor, PageResponseRenderer pageResponseRenderer)
+    ComponentEventResultProcessor resultProcessor, PageResponseRenderer pageResponseRenderer,
+            PageActivator pageActivator)
     {
         this.cache = cache;
         this.resultProcessor = resultProcessor;
         this.pageResponseRenderer = pageResponseRenderer;
+        this.pageActivator = pageActivator;
     }
 
     public void handle(PageRenderRequestParameters parameters) throws IOException
     {
         Page page = cache.get(parameters.getLogicalPageName());
 
-        TrackableComponentEventCallback callback = new ComponentResultProcessorWrapper(resultProcessor);
-
-        page.getRootElement().triggerContextEvent(EventConstants.ACTIVATE, parameters.getActivationContext(), callback);
-
-        // The handler will have asked the result processor to send a response.
-
-        if (callback.isAborted())
-        {
-            callback.rethrow();
+        if (pageActivator.activatePage(page.getRootElement().getComponentResources(),
+                parameters.getActivationContext(), resultProcessor))
             return;
-        }
 
         if (!parameters.isLoopback())
             page.pageReset();

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java?rev=931362&r1=931361&r2=931362&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/services/TapestryModule.java Tue Apr  6 23:01:05 2010
@@ -357,6 +357,7 @@ public final class TapestryModule
         binder.bind(AssetPathAuthorizer.class, RegexAuthorizer.class).withId("RegexAuthorizer");
         binder.bind(ValidatorMacro.class, ValidatorMacroImpl.class);
         binder.bind(PropertiesFileParser.class, PropertiesFileParserImpl.class);
+        binder.bind(PageActivator.class, PageActivatorImpl.class);
     }
 
     // ========================================================================

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImplTest.java?rev=931362&r1=931361&r2=931362&view=diff
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/internal/services/ComponentEventLinkEncoderImplTest.java Tue Apr  6 23:01:05 2010
@@ -1,10 +1,10 @@
-// Copyright 2009 The Apache Software Foundation
+// Copyright 2009, 2010 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.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -16,9 +16,16 @@ package org.apache.tapestry5.internal.se
 
 import org.apache.tapestry5.Link;
 import org.apache.tapestry5.internal.EmptyEventContext;
+import org.apache.tapestry5.internal.InternalConstants;
 import org.apache.tapestry5.internal.test.InternalBaseTestCase;
 import org.apache.tapestry5.ioc.services.TypeCoercer;
-import org.apache.tapestry5.services.*;
+import org.apache.tapestry5.services.ComponentClassResolver;
+import org.apache.tapestry5.services.ComponentEventLinkEncoder;
+import org.apache.tapestry5.services.ContextPathEncoder;
+import org.apache.tapestry5.services.LocalizationSetter;
+import org.apache.tapestry5.services.PageRenderRequestParameters;
+import org.apache.tapestry5.services.Request;
+import org.apache.tapestry5.services.Response;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -31,10 +38,13 @@ public class ComponentEventLinkEncoderIm
 {
     private TypeCoercer typeCoercer;
 
+    private ContextPathEncoder contextPathEncoder;
+
     @BeforeClass
     public void setup()
     {
         typeCoercer = getService(TypeCoercer.class);
+        contextPathEncoder = getService(ContextPathEncoder.class);
     }
 
     @Test
@@ -53,11 +63,10 @@ public class ComponentEventLinkEncoderIm
 
         replay();
 
-        ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null,
-                contextPathEncoder, null, request, response, manager, optimizer, null, false);
+        ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null, contextPathEncoder, null, request,
+                response, manager, optimizer, null, false);
 
-        PageRenderRequestParameters parameters = new PageRenderRequestParameters("MyPage",
-                new EmptyEventContext());
+        PageRenderRequestParameters parameters = new PageRenderRequestParameters("MyPage", new EmptyEventContext());
 
         Link link = encoder.createPageRenderLink(parameters);
 
@@ -82,11 +91,11 @@ public class ComponentEventLinkEncoderIm
 
         replay();
 
-        ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null,
-                contextPathEncoder, null, request, response, manager, optimizer, null, false);
+        ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null, contextPathEncoder, null, request,
+                response, manager, optimizer, null, false);
 
-        PageRenderRequestParameters parameters = new PageRenderRequestParameters("admin/Index",
-                new ArrayEventContext(typeCoercer, "abc"));
+        PageRenderRequestParameters parameters = new PageRenderRequestParameters("admin/Index", new ArrayEventContext(
+                typeCoercer, "abc"));
 
         Link link = encoder.createPageRenderLink(parameters);
 
@@ -111,17 +120,221 @@ public class ComponentEventLinkEncoderIm
 
         replay();
 
-        ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null,
-                contextPathEncoder, null, request, response, manager, optimizer, null, false);
+        ComponentEventLinkEncoder encoder = new ComponentEventLinkEncoderImpl(null, contextPathEncoder, null, request,
+                response, manager, optimizer, null, false);
 
-        PageRenderRequestParameters parameters = new PageRenderRequestParameters("Index",
-                new EmptyEventContext());
+        PageRenderRequestParameters parameters = new PageRenderRequestParameters("Index", new EmptyEventContext());
 
         Link link = encoder.createPageRenderLink(parameters);
 
         assertEquals(link.toAbsoluteURI(), "MAGIC");
 
         verify();
+    }
+
+    @Test
+    public void empty_path() throws Exception
+    {
+        ComponentClassResolver resolver = mockComponentClassResolver();
+        Request request = mockRequest();
+        Response response = mockResponse();
+        LocalizationSetter ls = mockLocalizationSetter();
+
+        train_getPath(request, "");
+
+        train_setLocaleFromLocaleName(ls, "", false);
+
+        train_isPageName(resolver, "", false);
+
+        replay();
+
+        ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls,
+                request, response, null, null, null, true);
+
+        PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request);
+
+        assertNull(parameters);
+
+        verify();
+    }
+
+    @Test
+    public void not_a_page_request() throws Exception
+    {
+        ComponentClassResolver resolver = mockComponentClassResolver();
+        Request request = mockRequest();
+        Response response = mockResponse();
+        LocalizationSetter ls = mockLocalizationSetter();
+
+        stub_isPageName(resolver, false);
+
+        train_setLocaleFromLocaleName(ls, "foo", false);
+        train_getPath(request, "/foo/Bar.baz");
+
+        replay();
+
+        ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls,
+                request, response, null, null, null, true);
+
+        PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request);
+
+        assertNull(parameters);
+
+        verify();
+    }
+
+    @Test
+    public void just_the_locale_name() throws Exception
+    {
+        ComponentClassResolver resolver = mockComponentClassResolver();
+        Request request = mockRequest();
+        Response response = mockResponse();
+        LocalizationSetter ls = mockLocalizationSetter();
+
+        train_getPath(request, "/en");
+
+        train_setLocaleFromLocaleName(ls, "en", true);
+
+        train_isPageName(resolver, "", false);
+
+        replay();
+
+        ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls,
+                request, response, null, null, null, true);
+
+        PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request);
+
+        assertNull(parameters);
+
+        verify();
+    }
+
+    private Request mockRequest(boolean isLoopback)
+    {
+        Request request = mockRequest();
+
+        train_getParameter(request, InternalConstants.LOOPBACK, isLoopback ? "t" : null);
+
+        return request;
+    }
+
+    /**
+     * TAPESTRY-2226
+     */
+    @Test
+    public void page_activation_context_for_root_index_page() throws Exception
+    {
+        ComponentClassResolver resolver = mockComponentClassResolver();
+        Request request = mockRequest(false);
+        LocalizationSetter ls = mockLocalizationSetter();
+
+        train_getPath(request, "/foo/bar");
+
+        train_setLocaleFromLocaleName(ls, "foo", false);
+
+        train_isPageName(resolver, "foo/bar", false);
+        train_isPageName(resolver, "foo", false);
+        train_isPageName(resolver, "", true);
+
+        train_canonicalizePageName(resolver, "", "index");
+
+        replay();
+
+        ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls,
+                request, null, null, null, null, true);
+
+        PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request);
+
+        assertEquals(parameters.getLogicalPageName(), "index");
+        assertArraysEqual(parameters.getActivationContext().toStrings(), "foo", "bar");
+        assertFalse(parameters.isLoopback());
+
+        verify();
+    }
+
+    @Test
+    public void no_extra_context_without_final_slash() throws Exception
+    {
+        no_extra_context(false);
+    }
+
+    @Test
+    public void no_extra_context_with_final_slash() throws Exception
+    {
+        no_extra_context(true);
+    }
+
+    private void no_extra_context(boolean finalSlash) throws Exception
+    {
+        ComponentClassResolver resolver = mockComponentClassResolver();
+        Request request = mockRequest(false);
+        LocalizationSetter ls = mockLocalizationSetter();
+
+        String path = "/foo/Bar" + (finalSlash ? "/" : "");
+        train_getPath(request, path);
+
+        train_setLocaleFromLocaleName(ls, "foo", false);
+
+        train_isPageName(resolver, "foo/Bar", true);
+
+        train_canonicalizePageName(resolver, "foo/Bar", "foo/bar");
+
+        replay();
 
+        ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls,
+                request, null, null, null, null, true);
+
+        PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request);
+
+        assertEquals(parameters.getLogicalPageName(), "foo/bar");
+        assertEquals(parameters.getActivationContext().getCount(), 0);
+        assertFalse(parameters.isLoopback());
+
+        verify();
+    }
+
+    @Test
+    public void context_passed_in_path_without_final_slash() throws Exception
+    {
+        context_passed_in_path(false);
+    }
+
+    @Test
+    public void context_passed_in_path_with_final_slash() throws Exception
+    {
+        context_passed_in_path(true);
+    }
+
+    private void context_passed_in_path(boolean finalSlash) throws Exception
+    {
+        ComponentClassResolver resolver = mockComponentClassResolver();
+        Request request = mockRequest(true);
+        LocalizationSetter ls = mockLocalizationSetter();
+
+        String path = "/foo/Bar/zip/zoom" + (finalSlash ? "/" : "");
+        train_getPath(request, path);
+
+        train_setLocaleFromLocaleName(ls, "foo", false);
+
+        train_isPageName(resolver, "foo/Bar/zip/zoom", false);
+
+        train_isPageName(resolver, "foo/Bar/zip", false);
+
+        train_isPageName(resolver, "foo/Bar", true);
+
+        train_canonicalizePageName(resolver, "foo/Bar", "foo/bar");
+
+        replay();
+
+        ComponentEventLinkEncoderImpl linkEncoder = new ComponentEventLinkEncoderImpl(resolver, contextPathEncoder, ls,
+                request, null, null, null, null, true);
+
+        PageRenderRequestParameters parameters = linkEncoder.decodePageRenderRequest(request);
+
+        assertEquals(parameters.getLogicalPageName(), "foo/bar");
+        assertArraysEqual(parameters.getActivationContext().toStrings(), "zip", "zoom");
+        assertTrue(parameters.isLoopback());
+
+        verify();
     }
 }

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=931362&r1=931361&r2=931362&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 Tue Apr  6 23:01:05 2010
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//     http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,16 +14,14 @@
 
 package org.apache.tapestry5.internal.services;
 
-import org.apache.tapestry5.ComponentEventCallback;
-import org.apache.tapestry5.EventConstants;
 import org.apache.tapestry5.EventContext;
+import org.apache.tapestry5.internal.InternalComponentResources;
 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.easymock.EasyMock;
 import org.testng.annotations.Test;
 
 public class PageRenderRequestHandlerImplTest extends InternalBaseTestCase
@@ -37,15 +35,14 @@ public class PageRenderRequestHandlerImp
         Page page = mockPage();
         EventContext context = mockEventContext();
         ComponentPageElement root = mockComponentPageElement();
+        InternalComponentResources pageResources = mockInternalComponentResources();
+        PageActivator activator = newMock(PageActivator.class);
 
         train_get(cache, "foo/Bar", page);
 
         train_getRootElement(page, root);
-
-        expect(
-                root.triggerContextEvent(EasyMock.eq(EventConstants.ACTIVATE), EasyMock
-                        .same(context), EasyMock.isA(ComponentEventCallback.class))).andReturn(
-                false);
+        train_getComponentResources(root, pageResources);
+        expect(activator.activatePage(pageResources, context, processor)).andReturn(false);
 
         // Skips the pageReset()
 
@@ -53,11 +50,9 @@ public class PageRenderRequestHandlerImp
 
         replay();
 
-        PageRenderRequestHandler handler = new PageRenderRequestHandlerImpl(cache, processor,
-                renderer);
+        PageRenderRequestHandler handler = new PageRenderRequestHandlerImpl(cache, processor, renderer, activator);
 
-        PageRenderRequestParameters parameters = new PageRenderRequestParameters("foo/Bar",
-                context, true);
+        PageRenderRequestParameters parameters = new PageRenderRequestParameters("foo/Bar", context, true);
 
         handler.handle(parameters);