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