You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tapestry.apache.org by th...@apache.org on 2014/01/10 21:45:00 UTC
git commit: TAP5-1403: Add support for Arrays in request parameters
Updated Branches:
refs/heads/master 66a0a9bd5 -> fd693291d
TAP5-1403: Add support for Arrays in request parameters
Project: http://git-wip-us.apache.org/repos/asf/tapestry-5/repo
Commit: http://git-wip-us.apache.org/repos/asf/tapestry-5/commit/fd693291
Tree: http://git-wip-us.apache.org/repos/asf/tapestry-5/tree/fd693291
Diff: http://git-wip-us.apache.org/repos/asf/tapestry-5/diff/fd693291
Branch: refs/heads/master
Commit: fd693291d4aba488df41eefb443545954f3b272f
Parents: 66a0a9b
Author: Thiago H. de Paula Figueiredo <th...@apache.org>
Authored: Fri Jan 10 18:44:43 2014 -0200
Committer: Thiago H. de Paula Figueiredo <th...@apache.org>
Committed: Fri Jan 10 18:44:43 2014 -0200
----------------------------------------------------------------------
.../internal/transform/OnEventWorker.java | 52 +++++++++++++++-----
.../src/test/app1/RequestParameterDemo.tml | 10 ++++
.../integration/app1/RequestParameterTests.java | 10 ++++
.../app1/pages/RequestParameterDemo.java | 25 ++++++++++
4 files changed, 85 insertions(+), 12 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/fd693291/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/OnEventWorker.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/OnEventWorker.java b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/OnEventWorker.java
index 06f3a1d..ca25276 100644
--- a/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/OnEventWorker.java
+++ b/tapestry-core/src/main/java/org/apache/tapestry5/internal/transform/OnEventWorker.java
@@ -40,6 +40,7 @@ import org.apache.tapestry5.services.ValueEncoderSource;
import org.apache.tapestry5.services.transform.ComponentClassTransformWorker2;
import org.apache.tapestry5.services.transform.TransformationSupport;
+import java.lang.reflect.Array;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@@ -431,24 +432,38 @@ public class OnEventWorker implements ComponentClassTransformWorker2
{
try
{
+
+ Class parameterType = classCache.forName(parameterTypeName);
+ boolean isArray = parameterType.isArray();
+
+ if (isArray)
+ {
+ parameterType = parameterType.getComponentType();
+ }
+
+ ValueEncoder valueEncoder = valueEncoderSource.getValueEncoder(parameterType);
+
String parameterValue = request.getParameter(parameterName);
- if (!allowBlank && InternalUtils.isBlank(parameterValue))
+ if (!allowBlank && parameterValue == null)
throw new RuntimeException(String.format(
"The value for query parameter '%s' was blank, but a non-blank value is needed.",
parameterName));
+
+ Object value;
- Class parameterType = classCache.forName(parameterTypeName);
-
- ValueEncoder valueEncoder = valueEncoderSource.getValueEncoder(parameterType);
-
- Object value = valueEncoder.toValue(parameterValue);
-
- if (parameterType.isPrimitive() && value == null)
- throw new RuntimeException(
- String.format(
- "Query parameter '%s' evaluates to null, but the event method parameter is type %s, a primitive.",
- parameterName, parameterType.getName()));
+ if (!isArray) {
+ value = coerce(parameterName, parameterType, parameterValue, valueEncoder);
+ }
+ else {
+ String[] parameterValues = request.getParameters(parameterName);
+ Object[] array = (Object[]) Array.newInstance(parameterType, parameterValues.length);
+ for (int i = 0; i < parameterValues.length; i++)
+ {
+ array[i] = coerce(parameterName, parameterType, parameterValues[i], valueEncoder);
+ }
+ value = array;
+ }
return value;
} catch (Exception ex)
@@ -460,6 +475,19 @@ public class OnEventWorker implements ComponentClassTransformWorker2
ExceptionUtils.toMessage(ex)), ex);
}
}
+
+ private Object coerce(final String parameterName, Class parameterType,
+ String parameterValue, ValueEncoder valueEncoder)
+ {
+ Object value = valueEncoder.toValue(parameterValue);
+
+ if (parameterType.isPrimitive() && value == null)
+ throw new RuntimeException(
+ String.format(
+ "Query parameter '%s' evaluates to null, but the event method parameter is type %s, a primitive.",
+ parameterName, parameterType.getName()));
+ return value;
+ }
};
}
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/fd693291/tapestry-core/src/test/app1/RequestParameterDemo.tml
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/app1/RequestParameterDemo.tml b/tapestry-core/src/test/app1/RequestParameterDemo.tml
index 17e64c7..6d13f2e 100644
--- a/tapestry-core/src/test/app1/RequestParameterDemo.tml
+++ b/tapestry-core/src/test/app1/RequestParameterDemo.tml
@@ -8,11 +8,21 @@
.
</p>
+ <p>
+ The current list of values is:
+ <ul id="values">
+ <li t:type="Loop" t:source="values" t:value="var:v">${var:v}</li>
+ </ul>
+ </p>
+
<ul>
<li>
<a href="${workingLink}">Working Link</a>
</li>
<li>
+ <a href="${multivaluedQueryParameterLink}">Link With Multivalued Query Parameter</a>
+ </li>
+ <li>
<a href="${brokenLink}">Broken Link</a>
</li>
<li>
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/fd693291/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/RequestParameterTests.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/RequestParameterTests.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/RequestParameterTests.java
index 487ec8c..0ac0193 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/RequestParameterTests.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/RequestParameterTests.java
@@ -27,6 +27,16 @@ public class RequestParameterTests extends App1TestCase
}
@Test
+ public void successful_use_of_query_parameter_annotation_with_array_parameter()
+ {
+ openLinks("RequestParameter Annotation Demo", "Link With Multivalued Query Parameter");
+
+ assertText("//ul[@id='values']/li[1]", "97");
+ assertText("//ul[@id='values']/li[2]", "98");
+ assertText("//ul[@id='values']/li[3]", "99");
+ }
+
+ @Test
public void null_value_when_not_allowed()
{
openLinks("RequestParameter Annotation Demo", "Null Link");
http://git-wip-us.apache.org/repos/asf/tapestry-5/blob/fd693291/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RequestParameterDemo.java
----------------------------------------------------------------------
diff --git a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RequestParameterDemo.java b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RequestParameterDemo.java
index 69c235c..f7bd799 100644
--- a/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RequestParameterDemo.java
+++ b/tapestry-core/src/test/java/org/apache/tapestry5/integration/app1/pages/RequestParameterDemo.java
@@ -14,6 +14,9 @@
package org.apache.tapestry5.integration.app1.pages;
+import java.util.Arrays;
+import java.util.List;
+
import org.apache.tapestry5.ComponentResources;
import org.apache.tapestry5.Link;
import org.apache.tapestry5.annotations.Persist;
@@ -26,11 +29,17 @@ public class RequestParameterDemo
private static final String PARAMETER_NAME = "gnip";
private static final String EVENT_NAME = "frob";
+
+ private static final String MULTIVALUED_PARAMETER_EVENT_NAME = "frobFrob";
@Property
@Persist
private int value;
+ @Property
+ @Persist
+ private List<Integer> values;
+
@Inject
private ComponentResources resources;
@@ -41,6 +50,16 @@ public class RequestParameterDemo
return link;
}
+
+ public Link getMultivaluedQueryParameterLink()
+ {
+ Link link = resources.createEventLink(MULTIVALUED_PARAMETER_EVENT_NAME);
+ link.addParameter(PARAMETER_NAME, "97");
+ link.addParameter(PARAMETER_NAME, "98");
+ link.addParameter(PARAMETER_NAME, "99");
+
+ return link;
+ }
public Link getBrokenLink()
{
@@ -65,6 +84,12 @@ public class RequestParameterDemo
{
this.value = value;
}
+
+ void onFrobFrob(@RequestParameter(PARAMETER_NAME)
+ Integer[] values)
+ {
+ this.values = Arrays.asList(values);
+ }
void onFrobNullAllowed(@RequestParameter(value = PARAMETER_NAME, allowBlank = true)
int value)