rleland     2002/10/23 23:20:33

  Modified:    doc/userGuide struts-html.xml
               src/share/org/apache/struts/taglib/html
                        JavascriptValidatorTag.java
  Log:
  Bug 11950 reopened by [EMAIL PROTECTED]
  Bug 13836 opened by [EMAIL PROTECTED]
       and reported by [EMAIL PROTECTED]
  changed:
  Bug 11950
  The formName is now again used as a flag
  to indicate that the <script></script> should be
  included around javascript.
  Bug 13836 - uncovered one condition where
  a //End --> comment could be printed without a
  <!-- Begin, which was onlty ehibited by mixing a
  new struts.jar with old validator example code.
  
  Also added htmlComment attribute to indicate
  wheather the html comment should wrap
  the javascript.
  
  Revision  Changes    Path
  1.29      +12 -0     jakarta-struts/doc/userGuide/struts-html.xml
  
  Index: struts-html.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-struts/doc/userGuide/struts-html.xml,v
  retrieving revision 1.28
  retrieving revision 1.29
  diff -u -r1.28 -r1.29
  --- struts-html.xml   16 Oct 2002 19:51:55 -0000      1.28
  +++ struts-html.xml   24 Oct 2002 06:20:33 -0000      1.29
  @@ -3195,6 +3195,18 @@
                  </p>
               </info>
           </attribute>
  +        <attribute>
  +            <name>htmlComment</name>
  +            <required>false</required>
  +            <rtexprvalue>true</rtexprvalue>
  +            <info>
  +               <p>
  +                  Wheather or not to enclose the javascript
  +                  with html comments.
  +                  Defaults to <code>true</code>.
  +               </p>
  +            </info>
  +        </attribute>
   
       </tag>
   
  
  
  
  1.10      +154 -112  
jakarta-struts/src/share/org/apache/struts/taglib/html/JavascriptValidatorTag.java
  
  Index: JavascriptValidatorTag.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-struts/src/share/org/apache/struts/taglib/html/JavascriptValidatorTag.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- JavascriptValidatorTag.java       20 Oct 2002 23:17:06 -0000      1.9
  +++ JavascriptValidatorTag.java       24 Oct 2002 06:20:33 -0000      1.10
  @@ -111,12 +111,14 @@
   
       /**
        * The name of the form that corresponds with the action name
  -     * in struts-config.xml.
  +     * in struts-config.xml. Specifying a form name places a
  +     * &lt;script&gt; &lt;/script&gt; around the javascript.
        */
       protected String formName = null;
   
       /**
        * The current page number of a multi-part form.
  +     * Only valid when the formName attribute is set.
        */
       protected int page = 0;
   
  @@ -137,11 +139,21 @@
       protected String dynamicJavascript = "true";
   
       /**
  -     * The src attribute for html script element (used to include an external 
script resource).
  +     * The src attribute for html script element (used to include an external script
  +     * resource). The src attribute is only recognized
  +     * when the formName attribute is specified.
        */
       protected String src = null;
   
       /**
  +     * The JavaScript methods will enclosed with html comments if this is set to 
"true".
  +     */
  +    protected String htmlComment = "true";
  +
  +    private String htmlBeginComment = "\n<!-- Begin \n";
  +
  +    private String htmlEndComment = "//End --> \n";
  +    /**
        * Gets the key (form name) that will be used
        * to retrieve a set of validation rules to be
        * performed on the bean passed in for validation.
  @@ -154,6 +166,8 @@
        * Sets the key (form name) that will be used
        * to retrieve a set of validation rules to be
        * performed on the bean passed in for validation.
  +     * Specifying a form name places a
  +     * &lt;script&gt; &lt;/script&gt; tag around the javascript.
        */
       public void setFormName(String formName) {
           this.formName = formName;
  @@ -163,6 +177,7 @@
        * Gets the current page number of a multi-part form.
        * Only field validations with a matching page numer
        * will be generated that match the current page number.
  +     * Only valid when the formName attribute is set.
        */
       public int getPage() {
           return page;
  @@ -172,6 +187,7 @@
        * Sets the current page number of a multi-part form.
        * Only field validations with a matching page numer
        * will be generated that match the current page number.
  +     * Only valid when the formName attribute is set.
        */
       public void setPage(int page) {
           this.page = page;
  @@ -234,6 +250,24 @@
       }
   
       /**
  +      * Gets whether or not to delimit the
  +      * JavaScript with html comments.  If this is set to 'true', which
  +      * is the default, the htmlComment will be surround the JavaScript.
  +      */
  +     public String getHtmlComment() {
  +         return htmlComment;
  +     }
  +
  +     /**
  +      * Sets whether or not to delimit the
  +      * JavaScript with html comments.  If this is set to 'true', which
  +      * is the default, the htmlComment will be surround the JavaScript.
  +      */
  +     public void setHtmlComment(String htmlComment) {
  +         this.htmlComment = htmlComment;
  +     }
  +
  +    /**
        * Gets the src attribute's value when defining
        * the html script element.
        */
  @@ -243,7 +277,8 @@
   
       /**
        * Sets the src attribute's value when defining
  -     * the html script element.
  +     * the html script element. The src attribute is only recognized
  +     * when the formName attribute is specified.
        */
       public void setSrc(String src) {
           this.src = src;
  @@ -259,8 +294,8 @@
   
           ApplicationConfig config = RequestUtils.getApplicationConfig(pageContext);
           ValidatorResources resources = (ValidatorResources)
  -                             pageContext.getAttribute(ValidatorPlugIn.VALIDATOR_KEY 
+
  -                             config.getPrefix(), PageContext.APPLICATION_SCOPE);
  +                pageContext.getAttribute(ValidatorPlugIn.VALIDATOR_KEY +
  +                config.getPrefix(), PageContext.APPLICATION_SCOPE);
           Locale locale = null;
           try {
               locale = (Locale) pageContext.getAttribute(Action.LOCALE_KEY, 
PageContext.SESSION_SCOPE);
  @@ -273,135 +308,139 @@
           }
   
           Form form = null;
  -        if ((form = resources.get(locale, formName)) != null && 
"true".equals(dynamicJavascript)) {
  -            MessageResources messages = (MessageResources)
  -                                 pageContext.getAttribute(bundle, 
PageContext.APPLICATION_SCOPE);
  -
  -            List lActions = new ArrayList();
  -            List lActionMethods = new ArrayList();
  -
  -            // Get List of actions for this Form
  -            for (Iterator i = form.getFields().iterator(); i.hasNext();) {
  -                Field field = (Field) i.next();
  +        form = resources.get(locale, formName);
  +        if (form != null) {
  +            if ("true".equals(dynamicJavascript)) {
  +                MessageResources messages = (MessageResources)
  +                        pageContext.getAttribute(bundle, 
PageContext.APPLICATION_SCOPE);
  +
  +                List lActions = new ArrayList();
  +                List lActionMethods = new ArrayList();
  +
  +                // Get List of actions for this Form
  +                for (Iterator i = form.getFields().iterator(); i.hasNext();) {
  +                    Field field = (Field) i.next();
   
  -                for (Iterator x = field.getDependencies().iterator(); x.hasNext();) 
{
  -                    Object o = x.next();
  +                    for (Iterator x = field.getDependencies().iterator(); 
x.hasNext();) {
  +                        Object o = x.next();
   
  -                    if (o != null && !lActionMethods.contains(o)) {
  -                        lActionMethods.add(o);
  +                        if (o != null && !lActionMethods.contains(o)) {
  +                            lActionMethods.add(o);
  +                        }
                       }
  +
                   }
   
  -            }
  +                // Create list of ValidatorActions based on lActionMethods
  +                for (Iterator i = lActionMethods.iterator(); i.hasNext();) {
  +                    ValidatorAction va = resources.getValidatorAction((String) 
i.next());
  +
  +                    String javascript = va.getJavascript();
  +                    if (javascript != null && javascript.length() > 0) {
  +                        lActions.add(va);
  +                    } else {
  +                        i.remove();
  +                    }
  +                }
   
  -            // Create list of ValidatorActions based on lActionMethods
  -            for (Iterator i = lActionMethods.iterator(); i.hasNext();) {
  -                ValidatorAction va = resources.getValidatorAction((String) 
i.next());
  +                Collections.sort(lActions, new Comparator() {
  +                    public int compare(Object o1, Object o2) {
  +                        ValidatorAction va1 = (ValidatorAction) o1;
  +                        ValidatorAction va2 = (ValidatorAction) o2;
  +
  +                        if ((va1.getDepends() == null || va1.getDepends().length() 
== 0) &&
  +                                (va2.getDepends() == null || 
va2.getDepends().length() == 0)) {
  +                            return 0;
  +                        } else if ((va1.getDepends() != null && 
va1.getDepends().length() > 0) &&
  +                                (va2.getDepends() == null || 
va2.getDepends().length() == 0)) {
  +                            return 1;
  +                        } else if ((va1.getDepends() == null || 
va1.getDepends().length() == 0) &&
  +                                (va2.getDepends() != null && 
va2.getDepends().length() > 0)) {
  +                            return -1;
  +                        } else {
  +                            return va1.getDependencies().size() - 
va2.getDependencies().size();
  +                        }
  +                    }
  +                });
   
  -                String javascript = va.getJavascript();
  -                if (javascript != null && javascript.length() > 0) {
  -                    lActions.add(va);
  -                } else {
  -                    i.remove();
  -                }
  -            }
  +                String methods = null;
  +                for (Iterator i = lActions.iterator(); i.hasNext();) {
  +                    ValidatorAction va = (ValidatorAction) i.next();
   
  -            Collections.sort(lActions, new Comparator() {
  -                public int compare(Object o1, Object o2) {
  -                    ValidatorAction va1 = (ValidatorAction) o1;
  -                    ValidatorAction va2 = (ValidatorAction) o2;
  -
  -                    if ((va1.getDepends() == null || va1.getDepends().length() == 
0) &&
  -                                         (va2.getDepends() == null || 
va2.getDepends().length() == 0)) {
  -                        return 0;
  -                    } else if ((va1.getDepends() != null && 
va1.getDepends().length() > 0) &&
  -                                         (va2.getDepends() == null || 
va2.getDepends().length() == 0)) {
  -                        return 1;
  -                    } else if ((va1.getDepends() == null || 
va1.getDepends().length() == 0) &&
  -                                         (va2.getDepends() != null && 
va2.getDepends().length() > 0)) {
  -                        return -1;
  +                    if (methods == null) {
  +                        methods = va.getMethod() + "(form)";
                       } else {
  -                        return va1.getDependencies().size() - 
va2.getDependencies().size();
  +                        methods += " && " + va.getMethod() + "(form)";
                       }
                   }
  -            });
   
  -            String methods = null;
  -            for (Iterator i = lActions.iterator(); i.hasNext();) {
  -                ValidatorAction va = (ValidatorAction) i.next();
  -
  -                if (methods == null) {
  -                    methods = va.getMethod() + "(form)";
  -                } else {
  -                    methods += " && " + va.getMethod() + "(form)";
  -                }
  -            }
  +                results.append(getJavascriptBegin(methods));
   
  -            results.append(getJavascriptBegin(methods));
  +                for (Iterator i = lActions.iterator(); i.hasNext();) {
  +                    ValidatorAction va = (ValidatorAction) i.next();
  +                    String jscriptVar = null;
  +                    String functionName = null;
   
  -            for (Iterator i = lActions.iterator(); i.hasNext();) {
  -                ValidatorAction va = (ValidatorAction) i.next();
  -                String jscriptVar = null;
  -                String functionName = null;
  -
  -                if (va.getJsFunctionName() != null && 
va.getJsFunctionName().length() > 0) {
  -                    functionName = va.getJsFunctionName();
  -                } else {
  -                    functionName = va.getName();
  -                }
  +                    if (va.getJsFunctionName() != null && 
va.getJsFunctionName().length() > 0) {
  +                        functionName = va.getJsFunctionName();
  +                    } else {
  +                        functionName = va.getName();
  +                    }
   
  -                results.append("    function " + functionName + " () { \n");
  -                for (Iterator x = form.getFields().iterator(); x.hasNext();) {
  -                    Field field = (Field) x.next();
  -
  -                    // Skip indexed fields for now until there is
  -                    // a good way to handle error messages (and the length of the 
list (could retrieve from scope?))
  -                    if (!field.isIndexed() && field.getPage() == page && 
field.isDependency(va.getName())) {
  -                        String message = Resources.getMessage(messages, locale, va, 
field);
  -                        message = (message != null ? message : "");
  -
  -                        jscriptVar = getNextVar(jscriptVar);
  -
  -                        results.append("     this." + jscriptVar + " = new 
Array(\"" + field.getKey() + "\", \"" + message + "\", ");
  -
  -                        results.append("new Function (\"varName\", \"");
  -
  -                        Map hVars = field.getVars();
  -                        // Loop through the field's variables.
  -                        for (Iterator iVars = hVars.keySet().iterator(); 
iVars.hasNext();) {
  -                            String varKey = (String) iVars.next();
  -                            Var var = (Var) hVars.get(varKey);
  -                            String varValue = var.getValue();
  -                            String jsType = var.getJsType();
  -
  -                            if (Var.JSTYPE_INT.equalsIgnoreCase(jsType)) {
  -                                results.append("this." + varKey + "=" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "; ");
  -                            } else if (Var.JSTYPE_REGEXP.equalsIgnoreCase(jsType)) {
  -                                results.append("this." + varKey + "=/" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "/; ");
  -                            } else if (Var.JSTYPE_STRING.equalsIgnoreCase(jsType)) {
  -                                results.append("this." + varKey + "='" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "'; ");
  -                                // So everyone using the latest format doesn't need 
to change their xml files immediately.
  -                            } else if ("mask".equalsIgnoreCase(varKey)) {
  -                                results.append("this." + varKey + "=/" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "/; ");
  -                            } else {
  -                                results.append("this." + varKey + "='" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "'; ");
  +                    results.append("    function " + functionName + " () { \n");
  +                    for (Iterator x = form.getFields().iterator(); x.hasNext();) {
  +                        Field field = (Field) x.next();
  +
  +                        // Skip indexed fields for now until there is
  +                        // a good way to handle error messages (and the length of 
the list (could retrieve from scope?))
  +                        if (!field.isIndexed() && field.getPage() == page && 
field.isDependency(va.getName())) {
  +                            String message = Resources.getMessage(messages, locale, 
va, field);
  +                            message = (message != null ? message : "");
  +
  +                            jscriptVar = getNextVar(jscriptVar);
  +
  +                            results.append("     this." + jscriptVar + " = new 
Array(\"" + field.getKey() + "\", \"" + message + "\", ");
  +
  +                            results.append("new Function (\"varName\", \"");
  +
  +                            Map hVars = field.getVars();
  +                            // Loop through the field's variables.
  +                            for (Iterator iVars = hVars.keySet().iterator(); 
iVars.hasNext();) {
  +                                String varKey = (String) iVars.next();
  +                                Var var = (Var) hVars.get(varKey);
  +                                String varValue = var.getValue();
  +                                String jsType = var.getJsType();
  +
  +                                if (Var.JSTYPE_INT.equalsIgnoreCase(jsType)) {
  +                                    results.append("this." + varKey + "=" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "; ");
  +                                } else if 
(Var.JSTYPE_REGEXP.equalsIgnoreCase(jsType)) {
  +                                    results.append("this." + varKey + "=/" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "/; ");
  +                                } else if 
(Var.JSTYPE_STRING.equalsIgnoreCase(jsType)) {
  +                                    results.append("this." + varKey + "='" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "'; ");
  +                                    // So everyone using the latest format doesn't 
need to change their xml files immediately.
  +                                } else if ("mask".equalsIgnoreCase(varKey)) {
  +                                    results.append("this." + varKey + "=/" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "/; ");
  +                                } else {
  +                                    results.append("this." + varKey + "='" + 
ValidatorUtil.replace(varValue, "\\", "\\\\") + "'; ");
  +                                }
                               }
  -                        }
   
  -                        results.append(" return this[varName];\"));\n");
  +                            results.append(" return this[varName];\"));\n");
  +                        }
                       }
  +                    results.append("    } \n\n");
                   }
  -                results.append("    } \n\n");
  +            } else if ("true".equals(staticJavascript)) {
  +                results.append("<script language=\"Javascript1.1\" 
type=\"text/javascript\">");
  +                if ("true".equals(htmlComment))
  +                  results.append(htmlBeginComment);
               }
  -        } else if ("true".equals(staticJavascript)) {
  -            results.append("<script language=\"Javascript1.1\" 
type=\"text/javascript\">");
           }
  -
           if ("true".equals(staticJavascript)) {
               results.append(getJavascriptStaticMethods(resources));
           }
   
  -        if ("true".equals(dynamicJavascript) || "true".equals(staticJavascript)) {
  +        if (form != null && ("true".equals(dynamicJavascript) || 
"true".equals(staticJavascript))) {
               results.append(getJavascriptEnd());
           }
   
  @@ -430,6 +469,7 @@
           methodName = null;
           staticJavascript = "true";
           dynamicJavascript = "true";
  +        htmlComment = "true";
           src = null;
       }
   
  @@ -446,7 +486,8 @@
               sb.append("> \n");
           }
   
  -        sb.append("<!-- Begin \n");
  +        if ("true".equals(htmlComment))
  +           sb.append(htmlBeginComment);
           sb.append("\n     var bCancel = false; \n\n");
   
           if (methodName == null || methodName.length() == 0)
  @@ -492,7 +533,8 @@
           StringBuffer sb = new StringBuffer();
   
           sb.append("\n");
  -        sb.append("//  End -->\n");
  +        if ("true".equals(htmlComment))
  +           sb.append(htmlEndComment);
           sb.append("</script>\n\n");
   
           return sb.toString();
  
  
  

--
To unsubscribe, e-mail:   <mailto:struts-dev-unsubscribe@;jakarta.apache.org>
For additional commands, e-mail: <mailto:struts-dev-help@;jakarta.apache.org>

Reply via email to