« Return to Thread: svn commit: r655721 - in /struts/struts2/trunk/core/src: main/java/org/apache/struts2/interceptor/CheckboxInterceptor.java test/java/org/apache/struts2/interceptor/CheckboxInterceptorTest.java

svn commit: r655721 - in /struts/struts2/trunk/core/src: main/java/org/apache/struts2/interceptor/CheckboxInterceptor.java test/java/org/apache/struts2/interceptor/CheckboxInterceptorTest.java

by mrdon :: Rate this Message:

Reply to Author | View in Thread

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", "batman@...");
+ 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", "batman@...");
  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]);
  }
 
 }


 « Return to Thread: svn commit: r655721 - in /struts/struts2/trunk/core/src: main/java/org/apache/struts2/interceptor/CheckboxInterceptor.java test/java/org/apache/struts2/interceptor/CheckboxInterceptorTest.java