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> + <input type="button" value="^" onclick="moveOptionUp(document.getElementById('myAction_myUpDownSelectTag'), 'key', '');" /> + <input type="button" value="v" onclick="moveOptionDown(document.getElementById('myAction_myUpDownSelectTag'), 'key', '');" /> + <input type="button" value="*" onclick="selectAllOptions(document.getElementById('myAction_myUpDownSelectTag'), 'key', '');" /> +</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>