You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by tm...@apache.org on 2006/05/14 08:25:20 UTC

svn commit: r406273 - in /struts/action2/trunk/core/src: main/java/org/apache/struts/action2/components/ main/resources/template/xhtml/ test/java/org/apache/struts/action2/views/jsp/ui/ test/resources/org/apache/struts/action2/views/jsp/ui/

Author: tmjee
Date: Sat May 13 23:25:18 2006
New Revision: 406273

URL: http://svn.apache.org/viewcvs?rev=406273&view=rev
Log:
WW-1284


Added:
    struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-11.txt   (with props)
Modified:
    struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Form.java
    struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/UIBean.java
    struts/action2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl
    struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/FormTagTest.java
    struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-2.txt

Modified: struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Form.java
URL: http://svn.apache.org/viewcvs/struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Form.java?rev=406273&r1=406272&r2=406273&view=diff
==============================================================================
--- struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Form.java (original)
+++ struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/Form.java Sat May 13 23:25:18 2006
@@ -24,11 +24,14 @@
 import org.apache.struts.action2.portlet.util.PortletUrlHelper;
 import org.apache.struts.action2.views.util.UrlHelper;
 import com.opensymphony.xwork.config.ConfigurationManager;
+import com.opensymphony.xwork.config.RuntimeConfiguration;
 import com.opensymphony.xwork.config.entities.ActionConfig;
+import com.opensymphony.xwork.config.entities.InterceptorMapping;
 import com.opensymphony.xwork.util.OgnlValueStack;
 import com.opensymphony.xwork.ActionContext;
 import com.opensymphony.xwork.ActionInvocation;
 import com.opensymphony.xwork.ObjectFactory;
+import com.opensymphony.xwork.validator.ValidationInterceptor;
 import com.opensymphony.xwork.validator.Validator;
 import com.opensymphony.xwork.validator.FieldValidator;
 import com.opensymphony.xwork.validator.ActionValidatorManagerFactory;
@@ -38,10 +41,13 @@
 
 import org.apache.commons.lang.StringUtils;
 
+import com.opensymphony.xwork.interceptor.MethodFilterInterceptorUtil;
+
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Collections;
 import java.util.Iterator;
+import java.util.Set;
 
 /**
  * <!-- START SNIPPET: javadoc -->
@@ -126,6 +132,10 @@
 
         boolean isAjax = "ajax".equalsIgnoreCase(this.theme);
 
+        if (validate != null) {
+            addParameter("validate", findValue(validate, Boolean.class));
+        }
+        
         // calculate the action and namespace
         String action = null;
         if (this.action != null) {
@@ -157,10 +167,6 @@
             addParameter("method", findString(method));
         }
 
-        if (validate != null) {
-            addParameter("validate", findValue(validate, Boolean.class));
-        }
-
         if (acceptcharset != null) {
             addParameter("acceptcharset", findString(acceptcharset));
         }
@@ -256,6 +262,42 @@
                 addParameter("id", escape(id));
             }
         }
+        
+        // WW-1284
+        // evaluate if client-side js is to be enabled. (if validation interceptor 
+        // does allow validation eg. method is not filtered out)
+        evaluateClientSideJsEnablement(actionName, namespace, actionMethod);
+    }
+    
+    private void evaluateClientSideJsEnablement(String actionName, String namespace, String actionMethod) {
+    	
+    	// Only evaluate if Client-Side js is to be enable when validate=true
+    	Boolean validate = (Boolean) getParameters().get("validate");
+    	if (validate != null && validate.booleanValue()) {
+    	
+    		addParameter("performValidation", Boolean.FALSE);
+    	
+    		RuntimeConfiguration runtimeConfiguration = ConfigurationManager.getConfiguration().getRuntimeConfiguration();
+    		ActionConfig actionConfig = runtimeConfiguration.getActionConfig(namespace, actionName);
+
+    		if (actionConfig != null) {
+    			List interceptors = actionConfig.getInterceptors();
+    			for (Iterator i = interceptors.iterator(); i.hasNext(); ) {
+    				InterceptorMapping interceptorMapping = (InterceptorMapping) i.next();
+    				if (ValidationInterceptor.class.isInstance(interceptorMapping.getInterceptor())) {
+    					ValidationInterceptor validationInterceptor = (ValidationInterceptor) interceptorMapping.getInterceptor();
+    				
+    					Set excludeMethods = validationInterceptor.getExcludeMethodsSet();
+    					Set includeMethods = validationInterceptor.getIncludeMethodsSet();
+    			
+    					if (MethodFilterInterceptorUtil.applyMethod(excludeMethods, includeMethods, actionMethod)) {
+    						addParameter("performValidation", Boolean.TRUE);
+    					}
+    					return;
+    				}
+    			}
+    		}
+    	}
     }
 
     /**
@@ -317,7 +359,7 @@
             if (validator instanceof FieldValidator) {
                 FieldValidator fieldValidator = (FieldValidator) validator;
                 if (fieldValidator.getFieldName().equals(name)) {
-                    validators.add(fieldValidator);
+                	validators.add(fieldValidator);
                 }
             }
         }

Modified: struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/UIBean.java
URL: http://svn.apache.org/viewcvs/struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/UIBean.java?rev=406273&r1=406272&r2=406273&view=diff
==============================================================================
--- struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/UIBean.java (original)
+++ struts/action2/trunk/core/src/main/java/org/apache/struts/action2/components/UIBean.java Sat May 13 23:25:18 2006
@@ -32,6 +32,7 @@
 import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.List;
@@ -848,6 +849,7 @@
             addParameter("form", form.getParameters());
 
             if ( name != null ) {
+            	// list should have been created by the form component
                 List tags = (List) form.getParameters().get("tagNames");
                 tags.add(name);
             }

Modified: struts/action2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl
URL: http://svn.apache.org/viewcvs/struts/action2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl?rev=406273&r1=406272&r2=406273&view=diff
==============================================================================
--- struts/action2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl (original)
+++ struts/action2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl Sat May 13 23:25:18 2006
@@ -11,7 +11,7 @@
 * double validator
 END SNIPPET: supported-validators
 -->
-<#if parameters.validate?default(false) == true>
+<#if ((parameters.validate?default(false) == true) && (parameters.performValidation?default(false) == true))>
 <script>
     function validateForm_${parameters.id}() {
         form = document.getElementById("${parameters.id}");

Modified: struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/FormTagTest.java
URL: http://svn.apache.org/viewcvs/struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/FormTagTest.java?rev=406273&r1=406272&r2=406273&view=diff
==============================================================================
--- struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/FormTagTest.java (original)
+++ struts/action2/trunk/core/src/test/java/org/apache/struts/action2/views/jsp/ui/FormTagTest.java Sat May 13 23:25:18 2006
@@ -17,16 +17,28 @@
  */
 package org.apache.struts.action2.views.jsp.ui;
 
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
 import org.apache.struts.action2.TestAction;
 import org.apache.struts.action2.TestConfigurationProvider;
 import org.apache.struts.action2.StrutsConstants;
 import org.apache.struts.action2.config.Configuration;
+import org.apache.struts.action2.dispatcher.mapper.ActionMapper;
+import org.apache.struts.action2.dispatcher.mapper.ActionMapperFactory;
+import org.apache.struts.action2.dispatcher.mapper.DefaultActionMapper;
 import org.apache.struts.action2.views.jsp.AbstractUITagTest;
 import org.apache.struts.action2.views.jsp.ActionTag;
 
 import com.opensymphony.xwork.ActionContext;
+import com.opensymphony.xwork.ActionSupport;
 import com.opensymphony.xwork.ObjectFactory;
 import com.opensymphony.xwork.config.ConfigurationManager;
+import com.opensymphony.xwork.config.RuntimeConfiguration;
+import com.opensymphony.xwork.config.entities.ActionConfig;
+import com.opensymphony.xwork.config.entities.InterceptorMapping;
+import com.opensymphony.xwork.validator.ValidationInterceptor;
 
 
 /**
@@ -100,9 +112,56 @@
     }
     
     /**
-     * This test with form tag validation enabled
+     * This test with form tag validation enabled. Js validation script will appear
+     * cause action submited by the form is intercepted by validation interceptor which
+     * "include" all methods.
      */
-    public void testFormWithCustomOnsubmitEnabledWithValidateEnabled() throws Exception {
+    public void testFormWithCustomOnsubmitEnabledWithValidateEnabled1() throws Exception {
+    	
+    	com.opensymphony.xwork.config.Configuration originalConfiguration = ConfigurationManager.getConfiguration();
+    	ObjectFactory originalObjectFactory = ObjectFactory.getObjectFactory();
+    	
+    	try {
+    	// used to determined if the form action needs js validation
+    	ConfigurationManager.setConfiguration(new com.opensymphony.xwork.config.impl.DefaultConfiguration() {
+    		public RuntimeConfiguration getRuntimeConfiguration() {
+    			return new RuntimeConfiguration() {
+    				public ActionConfig getActionConfig(String namespace, String name) {
+    					ActionConfig actionConfig = new ActionConfig() {
+    						public List getInterceptors() {
+    							List interceptors = new ArrayList();
+    							
+    							ValidationInterceptor validationInterceptor = new ValidationInterceptor();
+    							validationInterceptor.setIncludeMethods("*");
+    							
+    							InterceptorMapping interceptorMapping = new InterceptorMapping();
+    							interceptorMapping.setName("validation");
+    							interceptorMapping.setInterceptor(validationInterceptor);
+    							interceptors.add(interceptorMapping);
+    							
+    							return interceptors;
+    						}
+    					};
+    					return actionConfig;
+    				}
+    				public Map getActionConfigs() {
+    					return null;
+    				}
+    			};
+    		}
+    	});
+    	
+    	// used by form tag to get "actionClass" parameter
+    	ObjectFactory.setObjectFactory(new ObjectFactory() {
+    		public Class getClassInstance(String className) throws ClassNotFoundException {
+    			if (DefaultActionMapper.class.getName().equals(className)) {
+    				return DefaultActionMapper.class;
+    			}
+    			return ActionSupport.class;
+    		}
+    	});
+    	
+    	
     	
     	FormTag tag = new FormTag();
     	tag.setPageContext(pageContext);
@@ -114,6 +173,7 @@
         tag.setTitle("mytitle");
         tag.setOnsubmit("submitMe()");
         tag.setValidate("true");
+        tag.setNamespace("");
         
         UpDownSelectTag t = new UpDownSelectTag();
         t.setPageContext(pageContext);
@@ -126,8 +186,95 @@
         tag.doEndTag();
     	
         verify(FormTag.class.getResource("Formtag-2.txt"));
+    	}
+    	finally {
+    		ConfigurationManager.setConfiguration(originalConfiguration);
+    		ObjectFactory.setObjectFactory(originalObjectFactory);
+    	}
     }
     
+    
+    /**
+     * This test with form tag validation enabled. Js validation script will not appear
+     * cause action submited by the form is intercepted by validation interceptor which
+     * "excludes" all methods.
+     */
+    public void testFormWithCustomOnsubmitEnabledWithValidateEnabled2() throws Exception {
+    	
+    	com.opensymphony.xwork.config.Configuration originalConfiguration = ConfigurationManager.getConfiguration();
+    	ObjectFactory originalObjectFactory = ObjectFactory.getObjectFactory();
+    	
+    	try {
+    	// used to determined if the form action needs js validation
+    	ConfigurationManager.setConfiguration(new com.opensymphony.xwork.config.impl.DefaultConfiguration() {
+    		public RuntimeConfiguration getRuntimeConfiguration() {
+    			return new RuntimeConfiguration() {
+    				public ActionConfig getActionConfig(String namespace, String name) {
+    					ActionConfig actionConfig = new ActionConfig() {
+    						public List getInterceptors() {
+    							List interceptors = new ArrayList();
+    							
+    							ValidationInterceptor validationInterceptor = new ValidationInterceptor();
+    							validationInterceptor.setExcludeMethods("*");
+    							
+    							InterceptorMapping interceptorMapping = new InterceptorMapping();
+    							interceptorMapping.setName("validation");
+    							interceptorMapping.setInterceptor(validationInterceptor);
+    							interceptors.add(interceptorMapping);
+    							
+    							return interceptors;
+    						}
+    					};
+    					return actionConfig;
+    				}
+    				public Map getActionConfigs() {
+    					return null;
+    				}
+    			};
+    		}
+    	});
+    	
+    	// used by form tag to get "actionClass" parameter
+    	ObjectFactory.setObjectFactory(new ObjectFactory() {
+    		public Class getClassInstance(String className) throws ClassNotFoundException {
+    			if (DefaultActionMapper.class.getName().equals(className)) {
+    				return DefaultActionMapper.class;
+    			}
+    			return ActionSupport.class;
+    		}
+    	});
+    	
+    	
+    	
+    	FormTag tag = new FormTag();
+    	tag.setPageContext(pageContext);
+    	tag.setName("myForm");
+    	tag.setMethod("POST");
+        tag.setAction("myAction");
+        tag.setAcceptcharset("UTF-8");
+        tag.setEnctype("myEncType");
+        tag.setTitle("mytitle");
+        tag.setOnsubmit("submitMe()");
+        tag.setValidate("true");
+        tag.setNamespace("");
+        
+        UpDownSelectTag t = new UpDownSelectTag();
+        t.setPageContext(pageContext);
+        t.setName("myUpDownSelectTag");
+        t.setList("{}");
+        
+        tag.doStartTag();
+        t.doStartTag();
+        t.doEndTag();
+        tag.doEndTag();
+    	
+        verify(FormTag.class.getResource("Formtag-11.txt"));
+    	}
+    	finally {
+    		ConfigurationManager.setConfiguration(originalConfiguration);
+    		ObjectFactory.setObjectFactory(originalObjectFactory);
+    	}
+    }
 
     /**
      * This test with form tag validation disabled.

Added: struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-11.txt
URL: http://svn.apache.org/viewcvs/struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-11.txt?rev=406273&view=auto
==============================================================================
--- struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-11.txt (added)
+++ struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-11.txt Sat May 13 23:25:18 2006
@@ -0,0 +1,34 @@
+<script src="/struts/xhtml/validation.js"></script>
+<form namespace="" id="myAction" name="myForm" onsubmit="submitMe(); return validateForm_myAction();" action="/myAction.action" method="POST" enctype="myEncType" title="mytitle" accept-charset="UTF-8">
+<table class="wwFormTable"> <tr>
+    <td class="tdLabel"></td>
+    <td>	<script language="javascript" src="/struts/optiontransferselect.js"></script>
+<table>
+<tr><td>
+<select name="myUpDownSelectTag" size="5" id="myAction_myUpDownSelectTag" multiple="multiple">
+</select></td></tr>
+<tr><td>
+		&nbsp;<input type="button" value="^" onclick="moveOptionUp(document.getElementById('myAction_myUpDownSelectTag'), 'key', '');" />&nbsp;
+		&nbsp;<input type="button" value="v" onclick="moveOptionDown(document.getElementById('myAction_myUpDownSelectTag'), 'key', '');" />&nbsp;
+		&nbsp;<input type="button" value="*" onclick="selectAllOptions(document.getElementById('myAction_myUpDownSelectTag'), 'key', '');" />&nbsp;
+</td></tr>
+</table>
+</td>
+</tr>
+</table>
+</form>
+
+
+<script>
+	dojo.require("dojo.event.connect");
+	var containingForm = document.getElementById("myAction");
+	dojo.event.connect(containingForm, "onsubmit", 
+			function(evt) {
+				var updownselectObj = document.getElementById("myAction_myUpDownSelectTag");
+				selectAllOptionsExceptSome(updownselectObj, "key", "");
+			});
+</script>
+
+<!-- javascript that is needed for tooltips -->
+<script language="JavaScript" type="text/javascript">dojo.require("dojo.widget.html.Tooltip");dojo.require("dojo.fx.html");</script>
+

Propchange: struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-11.txt
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-2.txt
URL: http://svn.apache.org/viewcvs/struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-2.txt?rev=406273&r1=406272&r2=406273&view=diff
==============================================================================
--- struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-2.txt (original)
+++ struts/action2/trunk/core/src/test/resources/org/apache/struts/action2/views/jsp/ui/Formtag-2.txt Sat May 13 23:25:18 2006
@@ -1,5 +1,5 @@
 <script src="/struts/xhtml/validation.js"></script>
-<form namespace="" id="myAction" name="myForm" onsubmit="submitMe(); return validateForm_myAction();" action="myAction" method="POST" enctype="myEncType" title="mytitle" accept-charset="UTF-8">
+<form namespace="" id="myAction" name="myForm" onsubmit="submitMe(); return validateForm_myAction();" action="/myAction.action" method="POST" enctype="myEncType" title="mytitle" accept-charset="UTF-8">
 <table class="wwFormTable"> <tr>
     <td class="tdLabel"></td>
     <td>	<script language="javascript" src="/struts/optiontransferselect.js"></script>