You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by hl...@apache.org on 2007/02/22 23:38:37 UTC

svn commit: r510698 - in /tapestry/tapestry5/tapestry-core/trunk/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: Thu Feb 22 14:38:36 2007
New Revision: 510698

URL: http://svn.apache.org/viewvc?view=rev&rev=510698
Log:
Add support for supplying an explicit activation context to the PageLink component.

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

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/ComponentResourcesCommon.java Thu Feb 22 14:38:36 2007
@@ -43,7 +43,7 @@
     String getNestedId();
 
     /**
-     * Creates a link that will trigger an action for this component.
+     * Creates a component action request link as a callback for this component.
      * 
      * @param action
      *            a name for the action associated with the link
@@ -57,9 +57,15 @@
     Link createActionLink(String action, boolean forForm, Object... context);
 
     /**
-     * Creates a link that will case a page within the application to render.
+     * Creates a render request link to a specific page.
+     * 
+     * @param pageName
+     *            the logical name of the page to link to
+     * @param context
+     *            the activation context for the page. If omitted, the activation context is
+     *            obtained from the target paget
      */
-    Link createPageLink(String pageName);
+    Link createPageLink(String pageName, Object... context);
 
     /**
      * Returns a string consisting of the fully qualified class name of the containing page, and the

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/PageLink.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/PageLink.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/PageLink.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/corelib/components/PageLink.java Thu Feb 22 14:38:36 2007
@@ -14,6 +14,8 @@
 
 package org.apache.tapestry.corelib.components;
 
+import java.util.List;
+
 import org.apache.tapestry.ComponentResources;
 import org.apache.tapestry.Link;
 import org.apache.tapestry.MarkupWriter;
@@ -23,11 +25,18 @@
 import org.apache.tapestry.services.PageRenderSupport;
 
 /**
- * Generates a link to some other page in the application.
+ * Generates a render request link to some other page in the application. If an activation context
+ * is supplied (as the context parameter), then the context values will be encoded into the URL. If
+ * no context is supplied, then the target page itself will supply the context via a passivate
+ * event.
+ * <p>
+ * Pages are not required to have an activation context. When a page does have an activation
+ * context, the value typically represents the identity of some object displayed or otherwise
+ * manipulated by the page.
  */
 public class PageLink
 {
-    /** The name of the page to link to. */
+    /** The logical name of the page to link to. */
     @Parameter(required = true, defaultPrefix = "literal")
     private String _page;
 
@@ -37,11 +46,23 @@
     @Environmental
     private PageRenderSupport _support;
 
+    /**
+     * If provided, this is the activation context for the target page (the information will be
+     * encoded into the URL). If not provided, then the target page will provide its own activation
+     * context.
+     */
+    @Parameter
+    private List _context;
+
+    private final Object[] _emptyContext = new Object[0];
+
     void beginRender(MarkupWriter writer)
     {
         String clientId = _support.allocateClientId(_resources.getId());
 
-        Link link = _resources.createPageLink(_page);
+        Object[] activationContext = _context != null ? _context.toArray() : _emptyContext;
+
+        Link link = _resources.createPageLink(_page, activationContext);
 
         writer.element("a", "href", link, "id", clientId);
 

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/ComponentInstanceResultProcessor.java Thu Feb 22 14:38:36 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.

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/LinkFactory.java Thu Feb 22 14:38:36 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.
@@ -44,15 +44,29 @@
             Object... context);
 
     /**
-     * Creates a link to a page. TODO: What about context? Additional query parameters?
+     * 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.
      * 
      * @param page
+     *            the page to which a link should be created
+     * @param activationContext
+     *            the activation context for the page
      * @return
      */
-    Link createPageLink(Page page);
+    Link createPageLink(Page page, Object... activationContext);
 
-    /** Creates a link to a page, given its logical page name. */
-    Link createPageLink(String page);
+    /**
+     * As with {@link #createPageLink(Page, 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 context
+     *            activation context for the page
+     * @return
+     */
+    Link createPageLink(String page, Object... context);
 
     void addListener(LinkFactoryListener listener);
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/LinkFactoryImpl.java Thu Feb 22 14:38:36 2007
@@ -175,14 +175,15 @@
 
     }
 
-    public Link createPageLink(final Page page)
+    public Link createPageLink(final Page page, Object... activationContext)
     {
         notNull(page, "page");
 
         String pageName = page.getName();
         String logicalPageName = _componentClassResolver.resolvePageClassNameToPageName(pageName);
 
-        String[] context = collectActivationContextForPage(page);
+        String[] context = activationContext.length != 0 ? toContextStrings(activationContext)
+                : collectActivationContextForPage(page);
 
         PageLinkTarget target = new PageLinkTarget(logicalPageName);
         ComponentInvocation invocation = new ComponentInvocation(target, context, null);
@@ -238,11 +239,11 @@
         return result;
     }
 
-    public Link createPageLink(String pageName)
+    public Link createPageLink(String pageName, Object... context)
     {
         // This verifies that the page name is valid.
         Page page = _pageCache.get(pageName);
 
-        return createPageLink(page);
+        return createPageLink(page, context);
     }
 }

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/services/StringResultProcessor.java Thu Feb 22 14:38:36 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.

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/ComponentPageElementImpl.java Thu Feb 22 14:38:36 2007
@@ -781,9 +781,9 @@
         return _page.createActionLink(this, action, forForm, context);
     }
 
-    public Link createPageLink(String pageName)
+    public Link createPageLink(String pageName, Object... context)
     {
-        return _page.createPageLink(pageName);
+        return _page.createPageLink(pageName, context);
     }
 
     public void enqueueBeforeRenderBody(RenderQueue queue)

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/InternalComponentResourcesImpl.java Thu Feb 22 14:38:36 2007
@@ -111,9 +111,9 @@
         return _element.createActionLink(action, forForm, context);
     }
 
-    public Link createPageLink(String pageName)
+    public Link createPageLink(String pageName, Object... context)
     {
-        return _element.createPageLink(pageName);
+        return _element.createPageLink(pageName, context);
     }
 
     public String getCompleteId()

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/Page.java Thu Feb 22 14:38:36 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.
@@ -125,8 +125,16 @@
     Link createActionLink(ComponentPageElement element, String action, boolean forForm,
             Object... context);
 
-    /** Creates a link to the named page. */
-    Link createPageLink(String pageName);
+    /**
+     * Creates a link to the named page.
+     * 
+     * @param pageName
+     *            the logical name of the page
+     * @param contxt
+     *            optional activation context for the page (if not provided, it is generated from
+     *            the page itself)
+     */
+    Link createPageLink(String pageName, Object... context);
 
     /**
      * Posts a change to a persistent field.

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/structure/PageImpl.java Thu Feb 22 14:38:36 2007
@@ -164,9 +164,9 @@
         return _linkFactory.createActionLink(element, action, forForm, context);
     }
 
-    public Link createPageLink(String pageName)
+    public Link createPageLink(String pageName, Object... context)
     {
-        return _linkFactory.createPageLink(pageName);
+        return _linkFactory.createPageLink(pageName, context);
     }
 
     public void persistFieldChange(ComponentResources resources, String fieldName, Object newValue)

Modified: tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/main/java/org/apache/tapestry/internal/test/InternalBaseTestCase.java Thu Feb 22 14:38:36 2007
@@ -481,7 +481,8 @@
         expect(resolver.isPageName(isA(String.class))).andStubReturn(result);
     }
 
-    protected final void train_isPageName(ComponentClassResolver resolver, String pageName, boolean result)
+    protected final void train_isPageName(ComponentClassResolver resolver, String pageName,
+            boolean result)
     {
         expect(resolver.isPageName(pageName)).andReturn(result);
     }

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/PageLinkContext.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/PageLinkContext.html?view=auto&rev=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/PageLinkContext.html (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/PageLinkContext.html Thu Feb 22 14:38:36 2007
@@ -0,0 +1,17 @@
+<html t:type="Border" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
+    
+    <h1>PageLink Context Demo</h1>
+    
+    <p>
+        Demonstrates how to supply explicit context is a page link.  This is often used in pages with a master/detail relationship,
+        with the master page providing links to the detail page, configured via the explicit context.
+    </p>
+
+    <a t:type="pagelink" page="target">no context</a>
+    <br/>
+    <a t:type="pagelink" page="target" context="literal:literal context">literal context</a>
+    <br/>
+    <a t:type="pagelink" page="target" context="computedContext">computed context</a>
+
+    
+</html>

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/Start.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/Start.html?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/Start.html (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/Start.html Thu Feb 22 14:38:36 2007
@@ -56,17 +56,17 @@
                     <li>
                         <a href="InjectComponentMismatch">InjectComponentMismatch</a> -- check error
                         reporting when @InjectComponent doesn't match the actual field type </li>
-                </ul>
-            </td>
-            <td>
-                <ul>
-              
+
                     <li>
                         <a t:type="PageLink" page="ParameterDefault">ParameterDefault</a> --
                         defaulter methods for component parameters </li>
                     <li>
                         <a t:type="PageLink" page="ValidForm">ValidForm</a> -- server-side input
                         validation</li>
+                </ul>
+            </td>
+            <td>
+                <ul>
                     <li>
                         <a t:type="PageLink" page="AnyDemo">AnyDemo</a> -- test out the Any
                         component </li>
@@ -107,16 +107,17 @@
                         component event that directly returns a stream of character (rather than a
                         redirect) </li>
                     <li>
-                        <a t:type="PageLink" page="protected">Protected Page</a> -- Demonstrate result of non-void return from
-                        a page's activate method.
-                    </li>
-                    <li>
-                        <a t:type="PageLink" page="kicker">Kicker</a> -- demos complex page and component context in links
-                    </li>
-                    <li>
-                        <a t:type="PageLink" page="simpletrackgriddemo">SimpleTrack Grid Demo</a> -- customizing the model for a Grid around
-                        an interface
-                    </li>
+                        <a t:type="PageLink" page="protected">Protected Page</a> -- Demonstrate
+                        result of non-void return from a page's activate method. </li>
+                    <li>
+                        <a t:type="PageLink" page="kicker">Kicker</a> -- demos complex page and
+                        component context in links </li>
+                    <li>
+                        <a t:type="PageLink" page="simpletrackgriddemo">SimpleTrack Grid Demo</a> --
+                        customizing the model for a Grid around an interface </li>
+                    <li>
+                        <a t:type="PageLink" page="pagelinkcontext">PageLink Context Demo</a> --
+                        passing explicit context in a page render link </li>
                 </ul>
             </td>
         </tr>

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/Target.html
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/Target.html?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/Target.html (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/app1/WEB-INF/Target.html Thu Feb 22 14:38:36 2007
@@ -1,29 +1,26 @@
 <html t:type="Border" xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd">
-    
-    <h1>Target</h1>    
-    
-  
-  <h2>Activation Context</h2>
-  
-    <ul>
-        <li t:type="loop" source="activationContext" value="object">${object}</li>
-    </ul>
-  
-  <h2>Component Context</h2>
-  
+    <h1>Target</h1>
+    <h2>Activation Context</h2>
+    <t:comp type="if" test="activationContext">
+
+        <ul>
+            <li t:type="loop" source="activationContext" value="object">${object}</li>
+        </ul>
+        <t:parameter name="else">No activation context.</t:parameter>
+    </t:comp>
+    <h2>Component Context</h2>
     <t:comp type="if" test="componentContext">
-        
+
         <ul>
             <li t:type="loop" source="componentContext" value="object">${object}</li>
         </ul>
 
-        <t:parameter name="else">
-            No component context.
-        </t:parameter>
+        <t:parameter name="else"> No component context. </t:parameter>
     </t:comp>
-  
-  <h2>Setup Component Context</h2>
-  
-  [<a t:type="actionlink" context="contextToEncode">go</a>]
+    <h2>Setup Component Context</h2> [<a t:type="actionlink" context="contextToEncode">go</a>] 
+    
+    <h2>Navigation</h2>
+    
+    [<a t:type="pagelink" page="pagelinkcontext">PageLink Context Demo</a>]
     
-</html>
\ No newline at end of file
+    </html>

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/IntegrationTests.java Thu Feb 22 14:38:36 2007
@@ -914,4 +914,28 @@
         assertTextSeries("//li[%d]", 1, "betty", "wilma");
         assertTextSeries("//ul[2]/li[%d]", 1, "fred", "barney", "clark kent");
     }
+
+    @Test
+    public void page_link_with_explicit_activation_context()
+    {
+        _selenium.open(BASE_URL);
+ 
+        clickAndWait("link=PageLink Context Demo");
+
+        clickAndWait("link=no context");
+
+        assertTextPresent("No activation context.");
+
+        clickAndWait("link=PageLink Context Demo");
+
+        clickAndWait("link=literal context");
+
+        assertText("//li[1]", "literal context");
+
+        clickAndWait("link=PageLink Context Demo");
+
+        clickAndWait("link=computed context");
+
+        assertTextSeries("//li[%d]", 1, "fred", "7", "true");
+    }
 }

Added: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/PageLinkContext.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/PageLinkContext.java?view=auto&rev=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/PageLinkContext.java (added)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/integration/app1/pages/PageLinkContext.java Thu Feb 22 14:38:36 2007
@@ -0,0 +1,24 @@
+// Copyright 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.
+// 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.tapestry.integration.app1.pages;
+
+public class PageLinkContext
+{
+    public Object[] getComputedContext()
+    {
+        return new Object[]
+        { "fred", 7, true };
+    }
+}

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/LinkFactoryImplTest.java Thu Feb 22 14:38:36 2007
@@ -144,6 +144,52 @@
         verify();
     }
 
+    @SuppressWarnings("unchecked")
+    @Test
+    public void page_link_using_supplied_activation_context()
+    {
+        Request request = newRequest();
+        Response response = newResponse();
+        ComponentClassResolver resolver = newComponentClassResolver();
+        Page page = newPage();
+        LinkFactoryListener listener = newLinkFactoryListener();
+        ComponentInvocationMap map = newComponentInvocationMap();
+
+        train_getName(page, PAGE_CLASS_NAME);
+        train_resolvePageClassNameToPageName(resolver, PAGE_CLASS_NAME, 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()
+                + "/biff/bazz", 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, "biff", "bazz");
+
+        assertEquals(link.toRedirectURI(), ENCODED);
+
+        // Make sure the link was passed to the LinkFactoryListener
+
+        assertSame(link, holder.get());
+
+        verify();
+    }
+
     @Test
     public void page_link_by_name()
     {
@@ -197,33 +243,11 @@
 
     @SuppressWarnings("unchecked")
     private void train_triggerPassivateEventForPageLink(ComponentPageElement rootElement,
-            LinkFactoryListener listener, final Holder<Link> holder)
+            LinkFactoryListener listener, Holder<Link> holder)
     {
-        IAnswer<Boolean> triggerEventAnswer = new IAnswer<Boolean>()
-        {
-            public Boolean answer() throws Throwable
-            {
-                ComponentEventHandler handler = (ComponentEventHandler) EasyMock
-                        .getCurrentArguments()[2];
+        IAnswer<Boolean> triggerEventAnswer = newAnswerForPassivateEventTrigger();
 
-                handler.handleResult(new Object[]
-                { "foo", "bar" }, null, null);
-
-                return true;
-            }
-        };
-
-        IAnswer<Void> createdPageLinkAnswer = new IAnswer<Void>()
-        {
-            public Void answer() throws Throwable
-            {
-                Link link = (Link) EasyMock.getCurrentArguments()[0];
-
-                holder.put(link);
-
-                return null;
-            }
-        };
+        IAnswer<Void> createdPageLinkAnswer = newAnswerForCreatedLink(holder);
 
         // Intercept the call to handle component event, and let the IAnswer
         // do the work.
@@ -240,23 +264,28 @@
 
     @SuppressWarnings("unchecked")
     private void train_triggerPassivateEventForActionLink(ComponentPageElement rootElement,
-            LinkFactoryListener listener, final Holder<Link> holder)
+            LinkFactoryListener listener, Holder<Link> holder)
     {
-        IAnswer<Boolean> triggerEventAnswer = new IAnswer<Boolean>()
-        {
-            public Boolean answer() throws Throwable
-            {
-                ComponentEventHandler handler = (ComponentEventHandler) EasyMock
-                        .getCurrentArguments()[2];
+        IAnswer<Boolean> triggerEventAnswer = newAnswerForPassivateEventTrigger();
 
-                handler.handleResult(new Object[]
-                { "foo", "bar" }, null, null);
+        IAnswer<Void> createdPageLinkAnswer = newAnswerForCreatedLink(holder);
 
-                return true;
-            }
-        };
+        // Intercept the call to handle component event, and let the IAnswer
+        // do the work.
+
+        expect(
+                rootElement.triggerEvent(
+                        eq(TapestryConstants.PASSIVATE_EVENT),
+                        (Object[]) isNull(),
+                        isA(ComponentEventHandler.class))).andAnswer(triggerEventAnswer);
 
-        IAnswer<Void> createdPageLinkAnswer = new IAnswer<Void>()
+        listener.createdActionLink(isA(Link.class));
+        getMocksControl().andAnswer(createdPageLinkAnswer);
+    }
+
+    private IAnswer<Void> newAnswerForCreatedLink(final Holder<Link> holder)
+    {
+        return new IAnswer<Void>()
         {
             public Void answer() throws Throwable
             {
@@ -267,18 +296,24 @@
                 return null;
             }
         };
+    }
 
-        // Intercept the call to handle component event, and let the IAnswer
-        // do the work.
+    private IAnswer<Boolean> newAnswerForPassivateEventTrigger()
+    {
+        return new IAnswer<Boolean>()
+        {
+            @SuppressWarnings("unchecked")
+            public Boolean answer() throws Throwable
+            {
+                ComponentEventHandler handler = (ComponentEventHandler) EasyMock
+                        .getCurrentArguments()[2];
 
-        expect(
-                rootElement.triggerEvent(
-                        eq(TapestryConstants.PASSIVATE_EVENT),
-                        (Object[]) isNull(),
-                        isA(ComponentEventHandler.class))).andAnswer(triggerEventAnswer);
+                handler.handleResult(new Object[]
+                { "foo", "bar" }, null, null);
 
-        listener.createdActionLink(isA(Link.class));
-        getMocksControl().andAnswer(createdPageLinkAnswer);
+                return true;
+            }
+        };
     }
 
     @SuppressWarnings("unchecked")

Modified: tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java
URL: http://svn.apache.org/viewvc/tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java?view=diff&rev=510698&r1=510697&r2=510698
==============================================================================
--- tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java (original)
+++ tapestry/tapestry5/tapestry-core/trunk/src/test/java/org/apache/tapestry/internal/services/NoOpPage.java Thu Feb 22 14:38:36 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.
@@ -117,7 +117,7 @@
 
     }
 
-    public Link createPageLink(String pageName)
+    public Link createPageLink(String pageName, Object... context)
     {
         return null;
     }