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;
}