Author: mrdon
Date: Mon May 12 20:14:03 2008
New Revision: 655721
URL: http://svn.apache.org/viewvc?rev=655721&view=rev
Log:
Disabling the interceptor for multiple checkboxes with the same name, changing
to add an array rather than a String
WW-2526
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/CheckboxInterceptor.java
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/CheckboxInterceptorTest.java
Modified:
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/CheckboxInterceptor.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/CheckboxInterceptor.java?rev=655721&r1=655720&r2=655721&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/CheckboxInterceptor.java
(original)
+++
struts/struts2/trunk/core/src/main/java/org/apache/struts2/interceptor/CheckboxInterceptor.java
Mon May 12 20:14:03 2008
@@ -22,6 +22,8 @@
package org.apache.struts2.interceptor;
import com.opensymphony.xwork2.ActionInvocation;
+import com.opensymphony.xwork2.util.logging.Logger;
+import com.opensymphony.xwork2.util.logging.LoggerFactory;
import com.opensymphony.xwork2.interceptor.Interceptor;
import java.util.Map;
@@ -53,6 +55,8 @@
private String uncheckedValue = Boolean.FALSE.toString();
+ private static final Logger LOG =
LoggerFactory.getLogger(CheckboxInterceptor.class);
+
public void destroy() {
}
@@ -61,7 +65,7 @@
public String intercept(ActionInvocation ai) throws Exception {
Map parameters = ai.getInvocationContext().getParameters();
- Map<String, String> newParams = new HashMap<String, String>();
+ Map<String, String[]> newParams = new HashMap<String, String[]>();
Set<String> keys = parameters.keySet();
for (Iterator<String> iterator = keys.iterator(); iterator.hasNext();)
{
String key = iterator.next();
@@ -69,12 +73,17 @@
if (key.startsWith("__checkbox_")) {
String name = key.substring("__checkbox_".length());
+ Object values = parameters.get(key);
iterator.remove();
+ if (values != null && values instanceof String[] &&
((String[])values).length > 1) {
+ LOG.debug("Bypassing automatic checkbox detection due to
multiple checkboxes of the same name: #1", name);
+ continue;
+ }
// is this checkbox checked/submitted?
if (!parameters.containsKey(name)) {
// if not, let's be sure to default the value to false
- newParams.put(name, uncheckedValue);
+ newParams.put(name, new String[]{uncheckedValue});
}
}
}
Modified:
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/CheckboxInterceptorTest.java
URL:
http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/CheckboxInterceptorTest.java?rev=655721&r1=655720&r2=655721&view=diff
==============================================================================
---
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/CheckboxInterceptorTest.java
(original)
+++
struts/struts2/trunk/core/src/test/java/org/apache/struts2/interceptor/CheckboxInterceptorTest.java
Mon May 12 20:14:03 2008
@@ -36,11 +36,11 @@
private CheckboxInterceptor interceptor;
private MockActionInvocation ai;
- private Map<String, String> param;
+ private Map<String, Object> param;
protected void setUp() throws Exception {
super.setUp();
- param = new HashMap<String, String>();
+ param = new HashMap<String, Object>();
interceptor = new CheckboxInterceptor();
ai = new MockActionInvocation();
@@ -103,7 +103,7 @@
assertFalse(param.containsKey("__checkbox_superpower"));
assertEquals(3, param.size()); // should be 3 as __checkbox_
should be removed
- assertEquals("false", param.get("superpower"));
+ assertEquals("false", ((String[])param.get("superpower"))[0]);
}
public void testOneCheckboxNoValueDifferentDefault() throws Exception {
@@ -119,10 +119,24 @@
assertFalse(param.containsKey("__checkbox_superpower"));
assertEquals(3, param.size()); // should be 3 as __checkbox_
should be removed
- assertEquals("off", param.get("superpower"));
+ assertEquals("off", ((String[])param.get("superpower"))[0]);
}
- public void testTwoCheckboxMixed() throws Exception {
+ public void testTwoCheckboxNoValue() throws Exception {
+ param.put("user", "batman");
+ param.put("email", "[EMAIL PROTECTED]");
+ param.put("__checkbox_superpower", new String[]{"true","true"});
+
+ interceptor.init();
+ interceptor.intercept(ai);
+ interceptor.destroy();
+
+ assertFalse(param.containsKey("__checkbox_superpower"));
+ assertEquals(2, param.size()); // should be 2 as __checkbox_
should be removed
+ assertNull(param.get("superpower"));
+ }
+
+ public void testTwoCheckboxMixed() throws Exception {
param.put("user", "batman");
param.put("email", "[EMAIL PROTECTED]");
param.put("__checkbox_superpower", "true");
@@ -139,7 +153,7 @@
assertFalse(param.containsKey("__checkbox_cool"));
assertEquals(4, param.size()); // should be 4 as __checkbox_
should be removed
assertEquals("yes", param.get("superpower"));
- assertEquals("false", param.get("cool")); // will use false as
default and not 'no'
+ assertEquals("false", ((String[])param.get("cool"))[0]); //
will use false as default and not 'no'
}
public void testTwoCheckboxMixedWithDifferentDefault() throws Exception
{
@@ -160,7 +174,7 @@
assertFalse(param.containsKey("__checkbox_cool"));
assertEquals(4, param.size()); // should be 4 as __checkbox_
should be removed
assertEquals("yes", param.get("superpower"));
- assertEquals("no", param.get("cool"));
+ assertEquals("no", ((String[])param.get("cool"))[0]);
}
}