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


Reply via email to