Author: mrdon Date: Thu Nov 30 23:16:50 2006 New Revision: 481173 URL: http://svn.apache.org/viewvc?view=rev&rev=481173 Log: Better handle image submit buttons WW-1532
Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Modified: struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java?view=diff&rev=481173&r1=481172&r2=481173 ============================================================================== --- struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java (original) +++ struts/struts2/trunk/core/src/main/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapper.java Thu Nov 30 23:16:50 2006 @@ -22,9 +22,11 @@ import java.util.ArrayList; import java.util.Arrays; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Set; import javax.servlet.http.HttpServletRequest; @@ -285,15 +287,26 @@ public void handleSpecialParameters(HttpServletRequest request, ActionMapping mapping) { // handle special parameter prefixes. + Set<String> uniqueParameters = new HashSet<String>(); Map parameterMap = request.getParameterMap(); for (Iterator iterator = parameterMap.keySet().iterator(); iterator .hasNext();) { String key = (String) iterator.next(); - ParameterAction parameterAction = (ParameterAction) prefixTrie - .get(key); - if (parameterAction != null) { - parameterAction.execute(key, mapping); - break; + + // Strip off the image button location info, if found + if (key.endsWith(".x") || key.endsWith(".y")) { + key = key.substring(0, key.length() - 2); + } + + // Ensure a parameter doesn't get processed twice + if (!uniqueParameters.contains(key)) { + ParameterAction parameterAction = (ParameterAction) prefixTrie + .get(key); + if (parameterAction != null) { + parameterAction.execute(key, mapping); + uniqueParameters.add(key); + break; + } } } } Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java?view=diff&rev=481173&r1=481172&r2=481173 ============================================================================== --- struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java (original) +++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/dispatcher/mapper/DefaultActionMapperTest.java Thu Nov 30 23:16:50 2006 @@ -239,6 +239,37 @@ assertEquals(actionMapping.getName(), "myAction"); } + + public void testActionPrefix_fromImageButton() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction", ""); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.x", ""); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.y", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + + assertEquals(actionMapping.getName(), "myAction"); + } + + public void testActionPrefix_fromIEImageButton() throws Exception { + Map parameterMap = new HashMap(); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.x", ""); + parameterMap.put(DefaultActionMapper.ACTION_PREFIX + "myAction.y", ""); + + StrutsMockHttpServletRequest request = new StrutsMockHttpServletRequest(); + request.setParameterMap(parameterMap); + request.setupGetServletPath("/someServletPath.action"); + + DefaultActionMapper defaultActionMapper = new DefaultActionMapper(); + ActionMapping actionMapping = defaultActionMapper.getMapping(request, configManager); + + assertEquals(actionMapping.getName(), "myAction"); + } public void testRedirectPrefix() throws Exception { Map parameterMap = new HashMap();