You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@struts.apache.org by mr...@apache.org on 2008/01/25 15:27:54 UTC

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

Author: mrdon
Date: Fri Jan 25 06:27:51 2008
New Revision: 615230

URL: http://svn.apache.org/viewvc?rev=615230&view=rev
Log:
Ensuring numbers are formatted in the client-side javascript validation in such a way to not break the code
WW-1937

Added:
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/IntValidationAction.java
    struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/Formtag-22.txt
    struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/IntValidationAction-validation.xml
Modified:
    struts/struts2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl
    struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java

Modified: struts/struts2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl?rev=615230&r1=615229&r2=615230&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl (original)
+++ struts/struts2/trunk/core/src/main/resources/template/xhtml/form-close-validate.ftl Fri Jan 25 06:27:51 2008
@@ -92,9 +92,9 @@
             <#elseif validator.validatorType = "int">
             if (field.value != null) {
                 if (<#if validator.min?exists>parseInt(field.value) <
-                     ${validator.min?string}<#else>false</#if> ||
+                     ${validator.min?c}<#else>false</#if> ||
                         <#if validator.max?exists>parseInt(field.value) >
-                           ${validator.max?string}<#else>false</#if>) {
+                           ${validator.max?c}<#else>false</#if>) {
                     addError(field, error);
                     errors = true;
                 }
@@ -102,10 +102,10 @@
             <#elseif validator.validatorType = "double">
             if (field.value != null) {
                 var value = parseFloat(field.value);
-                if (<#if validator.minInclusive?exists>value < ${validator.minInclusive?string}<#else>false</#if> ||
-                        <#if validator.maxInclusive?exists>value > ${validator.maxInclusive?string}<#else>false</#if> ||
-                        <#if validator.minExclusive?exists>value <= ${validator.minExclusive?string}<#else>false</#if> ||
-                        <#if validator.maxExclusive?exists>value >= ${validator.maxExclusive?string}<#else>false</#if>) {
+                if (<#if validator.minInclusive?exists>value < ${validator.minInclusive?c}<#else>false</#if> ||
+                        <#if validator.maxInclusive?exists>value > ${validator.maxInclusive?c}<#else>false</#if> ||
+                        <#if validator.minExclusive?exists>value <= ${validator.minExclusive?c}<#else>false</#if> ||
+                        <#if validator.maxExclusive?exists>value >= ${validator.maxExclusive?c}<#else>false</#if>) {
                     addError(field, error);
                     errors = true;
                 }

Modified: struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java?rev=615230&r1=615229&r2=615230&view=diff
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java (original)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/FormTagTest.java Fri Jan 25 06:27:51 2008
@@ -128,87 +128,79 @@
      */
     public void testFormWithCustomOnsubmitEnabledWithValidateEnabled1() throws Exception {
 
-        com.opensymphony.xwork2.config.Configuration originalConfiguration = configurationManager.getConfiguration();
-        ObjectFactory originalObjectFactory = ObjectFactory.getObjectFactory();
-
-        try {
-            final Container cont = container;
-            // used to determined if the form action needs js validation
-            configurationManager.setConfiguration(new com.opensymphony.xwork2.config.impl.DefaultConfiguration() {
-                private DefaultConfiguration self = this;
-                public Container getContainer() {
-                    return new Container() {
-                        public <T> T inject(Class<T> implementation) {return null;}
-                        public void removeScopeStrategy() {}
-                        public void setScopeStrategy(Strategy scopeStrategy) {}
-                        public <T> T getInstance(Class<T> type, String name) {return null;}
-                        public <T> T getInstance(Class<T> type) {return null;}
-                        public Set<String> getInstanceNames(Class<?> type) {return null;}
-
-                        public void inject(Object o) {
-                            cont.inject(o);
-                            if (o instanceof Form) {
-                                ((Form)o).setConfiguration(self);
-                            }
-                        }
-                    };
-                }
-                public RuntimeConfiguration getRuntimeConfiguration() {
-                    return new RuntimeConfiguration() {
-                        public ActionConfig getActionConfig(String namespace, String name) {
-                            ActionConfig actionConfig = new ActionConfig("", name, "") {
-                                public List getInterceptors() {
-                                    List interceptors = new ArrayList();
-
-                                    ValidationInterceptor validationInterceptor = new ValidationInterceptor();
-                                    validationInterceptor.setIncludeMethods("*");
-
-                                    InterceptorMapping interceptorMapping = new InterceptorMapping("validation", validationInterceptor);
-                                    interceptors.add(interceptorMapping);
-
-                                    return interceptors;
-                                }
-                                public String getClassName() {
-                                    return ActionSupport.class.getName();
-                                }
-                            };
-                            return actionConfig;
-                        }
-
-                        public Map getActionConfigs() {
-                            return null;
-                        }
-                    };
-                }
-            });
+        final Container cont = container;
+        // used to determined if the form action needs js validation
+        configurationManager.setConfiguration(new com.opensymphony.xwork2.config.impl.DefaultConfiguration() {
+            private DefaultConfiguration self = this;
+            public Container getContainer() {
+                return new Container() {
+                    public <T> T inject(Class<T> implementation) {return null;}
+                    public void removeScopeStrategy() {}
+                    public void setScopeStrategy(Strategy scopeStrategy) {}
+                    public <T> T getInstance(Class<T> type, String name) {return null;}
+                    public <T> T getInstance(Class<T> type) {return null;}
+                    public Set<String> getInstanceNames(Class<?> type) {return null;}
+
+                    public void inject(Object o) {
+                        cont.inject(o);
+                        if (o instanceof Form) {
+                            ((Form)o).setConfiguration(self);
+                        }
+                    }
+                };
+            }
+            public RuntimeConfiguration getRuntimeConfiguration() {
+                return new RuntimeConfiguration() {
+                    public ActionConfig getActionConfig(String namespace, String name) {
+                        ActionConfig actionConfig = new ActionConfig("", name, "") {
+                            public List getInterceptors() {
+                                List interceptors = new ArrayList();
 
-            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("");
+                                ValidationInterceptor validationInterceptor = new ValidationInterceptor();
+                                validationInterceptor.setIncludeMethods("*");
 
-            UpDownSelectTag t = new UpDownSelectTag();
-            t.setPageContext(pageContext);
-            t.setName("myUpDownSelectTag");
-            t.setList("{}");
+                                InterceptorMapping interceptorMapping = new InterceptorMapping("validation", validationInterceptor);
+                                interceptors.add(interceptorMapping);
 
-            tag.doStartTag();
-            t.doStartTag();
-            t.doEndTag();
-            tag.doEndTag();
+                                return interceptors;
+                            }
+                            public String getClassName() {
+                                return ActionSupport.class.getName();
+                            }
+                        };
+                        return actionConfig;
+                    }
+
+                    public Map getActionConfigs() {
+                        return null;
+                    }
+                };
+            }
+        });
+
+        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-2.txt"));
-        }
-        finally {
-            configurationManager.setConfiguration(originalConfiguration);
-        }
+        verify(FormTag.class.getResource("Formtag-2.txt"));
     }
 
 
@@ -300,6 +292,87 @@
         finally {
             configurationManager.setConfiguration(originalConfiguration);
         }
+    }
+
+    /**
+     * Tests the numbers are formatted correctly to not break the javascript
+     */
+    public void testFormWithCustomOnsubmitEnabledWithValidateEnabled3() throws Exception {
+
+        final Container cont = container;
+        // used to determined if the form action needs js validation
+        configurationManager.setConfiguration(new com.opensymphony.xwork2.config.impl.DefaultConfiguration() {
+            private DefaultConfiguration self = this;
+            public Container getContainer() {
+                return new Container() {
+                    public <T> T inject(Class<T> implementation) {return null;}
+                    public void removeScopeStrategy() {}
+                    public void setScopeStrategy(Strategy scopeStrategy) {}
+                    public <T> T getInstance(Class<T> type, String name) {return null;}
+                    public <T> T getInstance(Class<T> type) {return null;}
+                    public Set<String> getInstanceNames(Class<?> type) {return null;}
+
+                    public void inject(Object o) {
+                        cont.inject(o);
+                        if (o instanceof Form) {
+                            ((Form)o).setConfiguration(self);
+                        }
+                    }
+                };
+            }
+            public RuntimeConfiguration getRuntimeConfiguration() {
+                return new RuntimeConfiguration() {
+                    public ActionConfig getActionConfig(String namespace, String name) {
+                        ActionConfig actionConfig = new ActionConfig("", name, IntValidationAction.class.getName()) {
+                            public List getInterceptors() {
+                                List interceptors = new ArrayList();
+
+                                ValidationInterceptor validationInterceptor = new ValidationInterceptor();
+                                validationInterceptor.setIncludeMethods("*");
+
+                                InterceptorMapping interceptorMapping = new InterceptorMapping("validation", validationInterceptor);
+                                interceptors.add(interceptorMapping);
+
+                                return interceptors;
+                            }
+                            public String getClassName() {
+                                return IntValidationAction.class.getName();
+                            }
+                        };
+                        return actionConfig;
+                    }
+
+                    public Map getActionConfigs() {
+                        return null;
+                    }
+                };
+            }
+        });
+
+        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();
+        tag.getComponent().getParameters().put("actionClass", IntValidationAction.class);
+        t.doStartTag();
+        t.doEndTag();
+        tag.doEndTag();
+
+        verify(FormTag.class.getResource("Formtag-22.txt"));
     }
 
     /**

Added: struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/IntValidationAction.java
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/IntValidationAction.java?rev=615230&view=auto
==============================================================================
--- struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/IntValidationAction.java (added)
+++ struts/struts2/trunk/core/src/test/java/org/apache/struts2/views/jsp/ui/IntValidationAction.java Fri Jan 25 06:27:51 2008
@@ -0,0 +1,18 @@
+package org.apache.struts2.views.jsp.ui;
+
+import com.opensymphony.xwork2.ActionSupport;
+
+/**
+ *
+ */
+public class IntValidationAction extends ActionSupport {
+    private int longint;
+
+    public int getLongint() {
+        return longint;
+    }
+
+    public void setLongint(int longint) {
+        this.longint = longint;
+    }
+}

Added: struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/Formtag-22.txt
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/Formtag-22.txt?rev=615230&view=auto
==============================================================================
--- struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/Formtag-22.txt (added)
+++ struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/Formtag-22.txt Fri Jan 25 06:27:51 2008
@@ -0,0 +1,52 @@
+<script type="text/javascript" src="/struts/xhtml/validation.js"></script>
+<script type="text/javascript "src="/struts/utils.js"></script>
+<form 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 type="text/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 type="text/javascript">
+	var containingForm = document.getElementById("myAction");
+	StrutsUtils.addEventListener(containingForm, "submit", 
+			function(evt) {
+				var updownselectObj = document.getElementById("myAction_myUpDownSelectTag");
+				selectAllOptionsExceptSome(updownselectObj, "key", "");
+			}, true);
+</script>
+
+<script type="text/javascript">
+    function validateForm_myAction() {
+        form = document.getElementById("myAction");
+        clearErrorMessages(form);
+        clearErrorLabels(form);
+        var errors = false;
+         //fieldname:myUpDownSelectTag
+         //validatorname:int
+         if(form.elements['myUpDownSelectTag']){
+            field=form.elements['myUpDownSelectTag'];
+            var error="bar must be between 6000 and 10000.";
+            if(field.value!=null){
+                if(parseInt(field.value)<6000||parseInt(field.value)>10000){
+                    addError(field,error);
+                    errors=true;
+                 }
+             }
+          }
+          return!errors;
+      }</script>
+

Added: struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/IntValidationAction-validation.xml
URL: http://svn.apache.org/viewvc/struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/IntValidationAction-validation.xml?rev=615230&view=auto
==============================================================================
--- struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/IntValidationAction-validation.xml (added)
+++ struts/struts2/trunk/core/src/test/resources/org/apache/struts2/views/jsp/ui/IntValidationAction-validation.xml Fri Jan 25 06:27:51 2008
@@ -0,0 +1,10 @@
+<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0//EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.dtd">
+<validators>
+    <field name="myUpDownSelectTag">
+        <field-validator type="int">
+            <param name="min">6000</param>
+            <param name="max">10000</param>
+            <message>bar must be between ${min} and ${max}.</message>
+        </field-validator>
+    </field>
+</validators>