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 2007/06/25 03:19:13 UTC

svn commit: r550310 - in /tapestry/tapestry5/trunk/tapestry-core/src: main/java/org/apache/tapestry/ main/java/org/apache/tapestry/corelib/components/ main/java/org/apache/tapestry/internal/services/ main/java/org/apache/tapestry/internal/structure/ ma...

Author: hlship
Date: Sun Jun 24 18:19:04 2007
New Revision: 550310

URL: http://svn.apache.org/viewvc?view=rev&rev=550310
Log:
TAPESTRY-1457: No way for PageLink to distinguish between an explicitly empty page activate context and normal delegation to the target page's passivate event

Modified:
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/PageLink.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ClassResultProcessor.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentActionRequestHandlerImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryListener.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/Page.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java
    tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/app1/WEB-INF/Target.html
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/app1/pages/ReturnTypes.java
    tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java Sun Jun 24 18:19:04 2007
@@ -62,11 +62,14 @@
      * 
      * @param pageName
      *            the logical name of the page to link to
+     * @param override
+     *            if true, the context is used even if empty (normally, the target page is allowed
+     *            to passivate, providing a context, when the provided context is empty)
      * @param context
      *            the activation context for the page. If omitted, the activation context is
      *            obtained from the target paget
      */
-    Link createPageLink(String pageName, Object... context);
+    Link createPageLink(String pageName, boolean override, Object... context);
 
     /**
      * Returns a string consisting of the fully qualified class name of the containing page, and the

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/PageLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/PageLink.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/PageLink.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/corelib/components/PageLink.java Sun Jun 24 18:19:04 2007
@@ -67,7 +67,10 @@
 
         Object[] activationContext = _context != null ? _context.toArray() : _emptyContext;
 
-        Link link = _resources.createPageLink(_page, activationContext);
+        Link link = _resources.createPageLink(
+                _page,
+                _resources.isBound("context"),
+                activationContext);
 
         writer.element("a", "href", link, "id", _clientId);
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ClassResultProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ClassResultProcessor.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ClassResultProcessor.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ClassResultProcessor.java Sun Jun 24 18:19:04 2007
@@ -49,7 +49,7 @@
         String className = value.getName();
         String pageName = _resolver.resolvePageClassNameToPageName(className);
         Page page = _requestPageCache.get(pageName);
-        Link link = _linkFactory.createPageLink(page);
+        Link link = _linkFactory.createPageLink(page, false);
         return new LinkActionResponseGenerator(link);
     }
 

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentActionRequestHandlerImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentActionRequestHandlerImpl.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentActionRequestHandlerImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentActionRequestHandlerImpl.java Sun Jun 24 18:19:04 2007
@@ -84,7 +84,7 @@
 
         if (result == null)
         {
-            Link link = _linkFactory.createPageLink(page);
+            Link link = _linkFactory.createPageLink(page, false);
 
             result = new LinkActionResponseGenerator(link);
         }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java Sun Jun 24 18:19:04 2007
@@ -54,7 +54,7 @@
 
         Page page = _requestPageCache.get(resources.getPageName());
 
-        Link link = _linkFactory.createPageLink(page);
+        Link link = _linkFactory.createPageLink(page, false);
 
         return new LinkActionResponseGenerator(link);
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java Sun Jun 24 18:19:04 2007
@@ -47,26 +47,41 @@
      * Creates a render link for the page. If an activation context is supplied then that context is
      * built into the URI. If no activation context is supplied, then the activation context is
      * obtained from the page itself, by triggering a passivate event on its root component.
+     * <p>
+     * When the activationContext is an empty array, the targetted page is checked to see if it can
+     * provide an activation context. This is accomplished by triggering a "passivate" event on the
+     * targetted page. If the override parameter is true, this will not occur (even when the
+     * activation context is empty).
      * 
      * @param page
      *            the page to which a link should be created
+     * @param override
+     *            if true, then the provided activation context is always used even if empty
      * @param activationContext
      *            the activation context for the page
      * @return
      */
-    Link createPageLink(Page page, Object... activationContext);
+    Link createPageLink(Page page, boolean override, Object... activationContext);
 
     /**
-     * As with {@link #createPageLink(Page, Object[])}, but the page is specified by logical name,
-     * rather than as an instance.
+     * As with {@link #createPageLink(Page, boolean, Object[])}, but the page is specified by
+     * logical name, rather than as an instance.
      * 
      * @param page
      *            the logical name of the page to generate a link to
+     * @param override
+     *            if true, then the provided activation context is always used even if empty
      * @param context
      *            activation context for the page
      * @return
      */
-    Link createPageLink(String page, Object... context);
+    Link createPageLink(String page, boolean override, Object... context);
 
+    /**
+     * Adds a listener, to be notified any time an action or render link is created; this allows the
+     * listener to modify the link (by adding additional query parameters to the link).
+     * 
+     * @param listener
+     */
     void addListener(LinkFactoryListener listener);
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java Sun Jun 24 18:19:04 2007
@@ -164,13 +164,15 @@
 
     }
 
-    public Link createPageLink(final Page page, Object... activationContext)
+    public Link createPageLink(final Page page, boolean override, Object... activationContext)
     {
         notNull(page, "page");
 
         String logicalPageName = page.getLogicalName();
 
-        String[] context = activationContext.length != 0 ? toContextStrings(activationContext)
+        // When override is true, we use the activation context even if empty.
+
+        String[] context = (override || activationContext.length != 0) ? toContextStrings(activationContext)
                 : collectActivationContextForPage(page);
 
         PageLinkTarget target = new PageLinkTarget(logicalPageName);
@@ -226,11 +228,11 @@
         return result;
     }
 
-    public Link createPageLink(String pageName, Object... context)
+    public Link createPageLink(String pageName, boolean override, Object... context)
     {
         // This verifies that the page name is valid.
         Page page = _pageCache.get(pageName);
 
-        return createPageLink(page, context);
+        return createPageLink(page, override, context);
     }
 }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryListener.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryListener.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryListener.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/LinkFactoryListener.java Sun Jun 24 18:19:04 2007
@@ -1,4 +1,4 @@
-// Copyright 2006 The Apache Software Foundation
+// Copyright 2006, 2007 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.
@@ -17,7 +17,6 @@
 import org.apache.tapestry.Link;
 
 /** Listener interface for objects that need to be notified about newly created links. */
-
 public interface LinkFactoryListener
 {
     /**

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java Sun Jun 24 18:19:04 2007
@@ -43,7 +43,7 @@
     {
         Page page = _requestPageCache.get(value);
 
-        Link link = _linkFactory.createPageLink(page);
+        Link link = _linkFactory.createPageLink(page, false);
 
         return new LinkActionResponseGenerator(link);
     }

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java Sun Jun 24 18:19:04 2007
@@ -785,9 +785,9 @@
         return _page.createActionLink(this, action, forForm, context);
     }
 
-    public Link createPageLink(String pageName, Object... context)
+    public Link createPageLink(String pageName, boolean override, Object... context)
     {
-        return _page.createPageLink(pageName, context);
+        return _page.createPageLink(pageName, override, context);
     }
 
     public void enqueueBeforeRenderBody(RenderQueue queue)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java Sun Jun 24 18:19:04 2007
@@ -117,9 +117,9 @@
         return _element.createActionLink(action, forForm, context);
     }
 
-    public Link createPageLink(String pageName, Object... context)
+    public Link createPageLink(String pageName, boolean override, Object... context)
     {
-        return _element.createPageLink(pageName, context);
+        return _element.createPageLink(pageName, override, context);
     }
 
     public String getCompleteId()

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/Page.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/Page.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/Page.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/Page.java Sun Jun 24 18:19:04 2007
@@ -129,11 +129,13 @@
      * 
      * @param pageName
      *            the logical name of the page
-     * @param contxt
+     * @param override
+     *            if true, the provided context is used even if empty
+     * @param context
      *            optional activation context for the page (if not provided, it is generated from
      *            the page itself)
      */
-    Link createPageLink(String pageName, Object... context);
+    Link createPageLink(String pageName, boolean override, Object... context);
 
     /**
      * Posts a change to a persistent field.

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java Sun Jun 24 18:19:04 2007
@@ -158,9 +158,9 @@
         return _linkFactory.createActionLink(element, action, forForm, context);
     }
 
-    public Link createPageLink(String pageName, Object... context)
+    public Link createPageLink(String pageName, boolean override, Object... context)
     {
-        return _linkFactory.createPageLink(pageName, context);
+        return _linkFactory.createPageLink(pageName, override, context);
     }
 
     public void persistFieldChange(ComponentResources resources, String fieldName, Object newValue)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java Sun Jun 24 18:19:04 2007
@@ -482,7 +482,7 @@
 
     protected final void train_createPageLink(LinkFactory factory, Page page, Link link)
     {
-        expect(factory.createPageLink(page)).andReturn(link);
+        expect(factory.createPageLink(page, false)).andReturn(link);
     }
 
     protected final void train_isLoaded(InternalComponentResources resources, boolean isLoaded)

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/app1/WEB-INF/Target.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/WEB-INF/Target.html?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/app1/WEB-INF/Target.html (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/app1/WEB-INF/Target.html Sun Jun 24 18:19:04 2007
@@ -21,6 +21,13 @@
     
     <h2>Navigation</h2>
     
-    [<a t:type="pagelink" page="pagelinkcontext">PageLink Context Demo</a>]
+    <p>[<a t:type="pagelink" page="pagelinkcontext">PageLink Context Demo</a>]</p>
+    
+  <p>
+    [<t:pagelink t:id="nocontext" page="target" context="null">Target base, no context</t:pagelink>]
+  </p>
+    
+    
+    
     
     </html>

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/IntegrationTests.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/IntegrationTests.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/IntegrationTests.java Sun Jun 24 18:19:04 2007
@@ -764,6 +764,22 @@
 
         assertTextSeries("//li[%d]", 1, "betty", "wilma");
         assertTextSeries("//ul[2]/li[%d]", 1, "fred", "barney", "clark kent");
+    }
+    
+    @Test
+    public void page_link_with_explicit_empty_context()
+    {
+        open(BASE_URL);
+
+        clickAndWait("link=Kicker");
+
+        clickAndWait("actionlink");
+   
+        assertTextSeries("//li[%d]", 1, "betty", "wilma");
+        
+        clickAndWait("nocontext");
+        
+        assertTextPresent("No activation context.");
     }
 
     @Test

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/app1/pages/ReturnTypes.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/app1/pages/ReturnTypes.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/app1/pages/ReturnTypes.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/integration/app1/pages/ReturnTypes.java Sun Jun 24 18:19:04 2007
@@ -55,7 +55,7 @@
 
     Object onActionFromLinkReturnValue()
     {
-        return _resources.createPageLink("start");
+        return _resources.createPageLink("start", false);
     }
 
     Object onActionFromStreamReturnValue()

Modified: tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java?view=diff&rev=550310&r1=550309&r2=550310
==============================================================================
--- tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java (original)
+++ tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java Sun Jun 24 18:19:04 2007
@@ -154,7 +154,7 @@
                 _typeCoercer);
         factory.addListener(listener);
 
-        Link link = factory.createPageLink(page);
+        Link link = factory.createPageLink(page, false);
 
         assertEquals(link.toRedirectURI(), ENCODED);
 
@@ -199,7 +199,51 @@
                 _typeCoercer);
         factory.addListener(listener);
 
-        Link link = factory.createPageLink(page, "biff", "bazz");
+        Link link = factory.createPageLink(page, false, "biff", "bazz");
+
+        assertEquals(link.toRedirectURI(), ENCODED);
+
+        // Make sure the link was passed to the LinkFactoryListener
+
+        assertSame(link, holder.get());
+
+        verify();
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void page_link_using_empty_activation_context_and_override()
+    {
+        Request request = mockRequest();
+        Response response = mockResponse();
+        ComponentClassResolver resolver = mockComponentClassResolver();
+        Page page = mockPage();
+        LinkFactoryListener listener = mockLinkFactoryListener();
+        ComponentInvocationMap map = mockComponentInvocationMap();
+
+        train_getLogicalName(page, PAGE_LOGICAL_NAME);
+        train_getContextPath(request, "/barney");
+
+        Holder<Link> holder = new Holder<Link>();
+
+        IAnswer<Void> createdPageLinkAnswer = newAnswerForCreatedLink(holder);
+
+        listener.createdPageLink(isA(Link.class));
+        getMocksControl().andAnswer(createdPageLinkAnswer);
+
+        train_encodeRedirectURL(response, "/barney/" + PAGE_LOGICAL_NAME.toLowerCase(), ENCODED);
+
+        // This needs to be refactored a bit to be more testable.
+
+        map.store(isA(Link.class), isA(ComponentInvocation.class));
+
+        replay();
+
+        LinkFactory factory = new LinkFactoryImpl(request, response, resolver, map, null,
+                _typeCoercer);
+        factory.addListener(listener);
+
+        Link link = factory.createPageLink(page, true);
 
         assertEquals(link.toRedirectURI(), ENCODED);
 
@@ -249,7 +293,7 @@
                 _typeCoercer);
         factory.addListener(listener);
 
-        Link link = factory.createPageLink(PAGE_LOGICAL_NAME);
+        Link link = factory.createPageLink(PAGE_LOGICAL_NAME, false);
 
         assertEquals(link.toRedirectURI(), ENCODED);