Author: robertdzeigler
Date: Thu May  5 16:31:50 2011
New Revision: 1099864

URL: http://svn.apache.org/viewvc?rev=1099864&view=rev
Log:
TAP5-1496: Link components should support easily adding request parameters to 
the generated link

Added:
    tapestry/tapestry5/trunk/tapestry-core/src/test/app1/LinkQueryParameters.tml
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/LinkQueryParameters.java
Modified:
    
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractLink.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/base/AbstractLinkTest.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
    
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractLink.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractLink.java?rev=1099864&r1=1099863&r2=1099864&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractLink.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/main/java/org/apache/tapestry5/corelib/base/AbstractLink.java
 Thu May  5 16:31:50 2011
@@ -1,4 +1,4 @@
-// Copyright 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2007, 2008, 2009, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -22,6 +22,8 @@ import org.apache.tapestry5.dom.Element;
 import org.apache.tapestry5.ioc.annotations.Inject;
 import org.apache.tapestry5.services.javascript.JavaScriptSupport;
 
+import java.util.Map;
+
 /**
  * Provides base utilities for classes that generate clickable links.
  */
@@ -41,6 +43,14 @@ public abstract class AbstractLink imple
     @Parameter("false")
     private boolean disabled;
 
+    /**
+     * If specified, the parameters are added to the link as query parameters 
in key=value fashion.
+     * Both values will be coerced to string using value encoder.
+     * @since 5.3
+     */
+    @Parameter(allowNull = false)
+    private Map<String, ?> parameters;
+
     @Inject
     private ComponentResources resources;
 
@@ -84,6 +94,8 @@ public abstract class AbstractLink imple
      */
     protected final void writeLink(MarkupWriter writer, Link link, Object... 
namesAndValues)
     {
+        addParameters(link);
+
         element = writer.element("a", "href", buildHref(link));
 
         writer.attributes(namesAndValues);
@@ -94,6 +106,21 @@ public abstract class AbstractLink imple
     }
 
     /**
+     * Adds any user-defined parameters as query parameters.
+     * @param link
+     */
+    protected final void addParameters(Link link)
+    {
+       if (!resources.isBound("parameters"))
+           return;
+
+       for(Map.Entry<String,?> entry : parameters.entrySet())
+       {
+           link.addParameterValue(entry.getKey(), entry.getValue());
+       }
+    }
+
+    /**
      * Returns the most recently rendered {@link org.apache.tapestry5.Link} 
for this component. Subclasses calculate
      * their link value as they render, and the value is valid until the end 
of the request, or the next time the same
      * component renders itself (if inside a loop).

Added: 
tapestry/tapestry5/trunk/tapestry-core/src/test/app1/LinkQueryParameters.tml
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/app1/LinkQueryParameters.tml?rev=1099864&view=auto
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/app1/LinkQueryParameters.tml 
(added)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/app1/LinkQueryParameters.tml 
Thu May  5 16:31:50 2011
@@ -0,0 +1,30 @@
+<html t:type="border" 
xmlns:t="http://tapestry.apache.org/schema/tapestry_5_0_0.xsd"; 
xmlns:p="tapestry:parameter">
+    <h1>Link Query Parameter Demo</h1>
+
+    <ul>
+        <li><a t:type="pagelink" page="LinkQueryParameters">Page Link With No 
Parameters</a></li>
+        <li><a t:type="pagelink" page="LinkQueryParameters" 
parameters="emptyParameters">Page Link With Explicitly Empty Parameters</a></li>
+        <li><a t:type="pagelink" page="LinkQueryParameters" 
parameters="nonEmptyParameters">Page Link With Parameters</a></li>
+
+        <li><a t:type="actionlink">Action Link With No Parameters</a></li>
+        <li><a t:type="actionlink" parameters="emptyParameters">Action Link 
With Explicitly Empty Parameters</a></li>
+        <li><a t:type="actionlink" parameters="nonEmptyParameters">Action Link 
With Parameters</a></li>
+
+        <li><a t:type="eventlink" event="parameterCheck">Event Link With No 
Parameters</a></li>
+        <li><a t:type="eventlink" event="parameterCheck" 
parameters="emptyParameters">Event Link With Explicitly Empty 
Parameters</a></li>
+        <li><a t:type="eventlink" event="parameterCheck" 
parameters="nonEmptyParameters">Event Link With Parameters</a></li>
+    </ul>
+
+    <div id="parametercheck">
+        <t:if test="hasParameters">
+            <ul>
+                <li t:type="loop" source="parameters" value="paramName" 
class="qparam">
+                    ${paramName}: ${paramVal}
+                </li>
+            </ul>
+            <p:else>
+                No Parameters
+            </p:else>
+        </t:if>
+    </div>
+</html>

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/base/AbstractLinkTest.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/base/AbstractLinkTest.java?rev=1099864&r1=1099863&r2=1099864&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/base/AbstractLinkTest.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/corelib/base/AbstractLinkTest.java
 Thu May  5 16:31:50 2011
@@ -1,4 +1,4 @@
-// Copyright 2007, 2008, 2009 The Apache Software Foundation
+// Copyright 2007, 2008, 2009, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -38,6 +38,9 @@ public class AbstractLinkTest extends In
         MarkupWriter writer = new MarkupWriterImpl();
 
         train_toURI(link, LINK_URI);
+        //note that we aren't trying to test the parameters code here, so we 
only worry about the single, simplest branch.
+        //The parameters code is fully tested in CoreBehaviorsTests.
+        expect(resources.isBound("parameters")).andReturn(false);
 
         resources.renderInformalParameters(writer);
 
@@ -66,6 +69,9 @@ public class AbstractLinkTest extends In
 
         train_toURI(link, LINK_URI);
 
+        //see note in no_anchor.
+        expect(resources.isBound("parameters")).andReturn(false);
+
         resources.renderInformalParameters(writer);
 
         replay();

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java?rev=1099864&r1=1099863&r2=1099864&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/CoreBehaviorsTests.java
 Thu May  5 16:31:50 2011
@@ -422,6 +422,66 @@ public class CoreBehaviorsTests extends 
         assertText("//li[1]", "NULL");
     }
 
+    private void openLinkParameterTest()
+    {
+        openLinks("Link Query Parameters Demo");
+        assertText("parametercheck", "No Parameters");
+    }
+
+    //TAP5-1496
+    @Test
+    public void links_with_unspecified_query_parameter_map()
+    {
+        openLinkParameterTest();
+
+        clickAndWait("link=Page Link With No Parameters");
+        assertText("parametercheck", "No Parameters");
+
+        clickAndWait("link=Action Link With No Parameters");
+        assertText("parametercheck", "No Parameters");
+
+        clickAndWait("link=Event Link With No Parameters");
+        assertText("parametercheck", "No Parameters");
+    }
+
+    //TAP5-1496
+    @Test
+    public void links_with_explicit_empty_query_parameter_map()
+    {
+        openLinkParameterTest();
+
+        clickAndWait("link=Page Link With Explicitly Empty Parameters");
+        assertText("parametercheck", "No Parameters");
+
+        clickAndWait("link=Action Link With Explicitly Empty Parameters");
+        assertText("parametercheck", "No Parameters");
+
+        clickAndWait("link=Event Link With Explicitly Empty Parameters");
+        assertText("parametercheck", "No Parameters");
+    }
+
+    //TAP5-1496
+    @Test
+    public void links_with_nonempty_query_parameter_map()
+    {
+        openLinkParameterTest();
+
+        clickAndWait("link=Page Link With Parameters");
+        assertText("xpath=(//li[@class='qparam'])[1]", "param1: value1");
+        assertText("xpath=(//li[@class='qparam'])[2]", "param2: 10");
+
+        //re-open between checks to make sure there is no "bleedover" between 
checks.
+        openLinkParameterTest();
+        clickAndWait("link=Action Link With Parameters");
+        assertText("xpath=(//li[@class='qparam'])[1]", "param1: value1");
+        assertText("xpath=(//li[@class='qparam'])[2]", "param2: 10");
+
+        openLinkParameterTest();;
+        clickAndWait("link=Event Link With Parameters");
+        assertText("xpath=(//li[@class='qparam'])[1]", "param1: value1");
+        assertText("xpath=(//li[@class='qparam'])[2]", "param2: 10");
+    }
+
     @Test
     public void recursive_components_are_identified_as_errors()
     {

Modified: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java?rev=1099864&r1=1099863&r2=1099864&view=diff
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
 (original)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/Index.java
 Thu May  5 16:31:50 2011
@@ -1,4 +1,4 @@
-// Copyright 2006, 2007, 2008, 2009, 2010 The Apache Software Foundation
+// Copyright 2006, 2007, 2008, 2009, 2010, 2011 The Apache Software Foundation
 //
 // Licensed under the Apache License, Version 2.0 (the "License");
 // you may not use this file except in compliance with the License.
@@ -467,7 +467,10 @@ public class Index
 
                     new Item("ValidatorMacroDemo", "Validator Macro Demo", 
"Using validator macros"),
 
-                    new Item("AtInjectDemo", "@javax.inject.Inject Demo", 
"Using @javax.inject.Inject for injection")
+                    new Item("AtInjectDemo", "@javax.inject.Inject Demo", 
"Using @javax.inject.Inject for injection"),
+
+                    new Item("LinkQueryParameters", "Link Query Parameters 
Demo",
+                                         "Providing Query Parameters directly 
to link components as a map of key=parameter name, value=parameter values")
 
             );
 

Added: 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/LinkQueryParameters.java
URL: 
http://svn.apache.org/viewvc/tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/LinkQueryParameters.java?rev=1099864&view=auto
==============================================================================
--- 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/LinkQueryParameters.java
 (added)
+++ 
tapestry/tapestry5/trunk/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/LinkQueryParameters.java
 Thu May  5 16:31:50 2011
@@ -0,0 +1,94 @@
+// Copyright 2011 The Apache Software Foundation
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+package org.apache.tapestry5.integration.app1.pages;
+
+import org.apache.tapestry5.Link;
+import org.apache.tapestry5.annotations.Property;
+import org.apache.tapestry5.ioc.annotations.Inject;
+import org.apache.tapestry5.services.PageRenderLinkSource;
+import org.apache.tapestry5.services.Request;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Page for testing the query parameter component parameter on all of the 
framework-supplied link components
+ * (page, action, event)
+ */
+public class LinkQueryParameters
+{
+
+    @Property
+    private String paramName;
+
+    @Inject
+    private Request request;
+
+    @Inject
+    private PageRenderLinkSource linkSource;
+
+    public Map<String,?> getEmptyParameters()
+    {
+        return Collections.emptyMap();
+    }
+
+    public Map<String, ?> getNonEmptyParameters()
+    {
+        Map<String, Object> map = new HashMap<String, Object>();
+        map.put("param1","value1");
+        map.put("param2", 10);
+        return map;
+    }
+
+    public Link onAction()
+    {
+        return buildLink();
+    }
+
+    public Link onParameterCheck()
+    {
+        return buildLink();
+    }
+
+    //small hack for test simplicity: we'll generate a new page link, add any 
parameters we find in the current
+    //request, and redirect to that instead of the default.
+    private Link buildLink()
+    {
+        Link l = linkSource.createPageRenderLink(LinkQueryParameters.class);
+        for(String param : request.getParameterNames())
+        {
+            l.addParameter(param,request.getParameter(param));
+        }
+
+        return l;
+    }
+
+    public boolean isHasParameters()
+    {
+        return !request.getParameterNames().isEmpty();
+    }
+
+    public List<String> getParameters()
+    {
+        return request.getParameterNames();
+    }
+
+    public String getParamVal()
+    {
+        return request.getParameter(paramName);
+    }
+
+}


Reply via email to