dgraham     2003/07/25 16:46:27

  Modified:    src/share/org/apache/struts/taglib/html
                        JavascriptValidatorTag.java
  Log:
  Refactored doStartTag into several smaller methods.
  
  Revision  Changes    Path
  1.32      +254 -204  
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.31
  retrieving revision 1.32
  diff -u -r1.31 -r1.32
  --- JavascriptValidatorTag.java       8 Jul 2003 00:05:10 -0000       1.31
  +++ JavascriptValidatorTag.java       25 Jul 2003 23:46:27 -0000      1.32
  @@ -93,10 +93,40 @@
    * defined in the struts-config.xml file.
    *
    * @author David Winterfeldt
  + * @author David Graham
    * @version $Revision$ $Date$
    * @since Struts 1.1
    */
   public class JavascriptValidatorTag extends BodyTagSupport {
  +    
  +    /**
  +     * A Comparator to use when sorting ValidatorAction objects.
  +     */
  +    private static final Comparator actionComparator = 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();
  +            }
  +        }
  +    };
   
       private static final String HTML_BEGIN_COMMENT = "\n<!-- Begin \n";
   
  @@ -310,240 +340,260 @@
        * @exception JspException if a JSP exception has occurred
        */
       public int doStartTag() throws JspException {
  -        StringBuffer results = new StringBuffer();
   
  +        JspWriter writer = pageContext.getOut();
  +        try {
  +            writer.print(this.renderJavascript());
  +            
  +        } catch (IOException e) {
  +            throw new JspException(e.getMessage());
  +        }
  +
  +        return EVAL_BODY_TAG;
  +
  +    }
  +
  +    /**
  +     * Returns fully rendered JavaScript. 
  +     * @since Struts 1.2
  +     */
  +    protected String renderJavascript() {
  +        StringBuffer results = new StringBuffer();
  +        
           ModuleConfig config = RequestUtils.getModuleConfig(pageContext);
           ValidatorResources resources =
               (ValidatorResources) pageContext.getAttribute(
                   ValidatorPlugIn.VALIDATOR_KEY + config.getPrefix(),
                   PageContext.APPLICATION_SCOPE);
  -
  +        
           Locale locale = RequestUtils.retrieveUserLocale(this.pageContext, null);
  -
  +        
           Form form = resources.get(locale, formName);
           if (form != null) {
               if ("true".equalsIgnoreCase(dynamicJavascript)) {
  -                MessageResources messages =
  -                    (MessageResources) pageContext.getAttribute(
  -                        bundle + config.getPrefix(),
  -                        PageContext.APPLICATION_SCOPE);
  -
  -                List actions = new ArrayList();
  -                List actionMethods = 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();
  -
  -                        if (o != null && !actionMethods.contains(o)) {
  -                            actionMethods.add(o);
  -                        }
  -                    }
  -
  +                results.append(
  +                    this.createDynamicJavascript(config, resources, locale, form));
  +                
  +            } else if ("true".equalsIgnoreCase(staticJavascript)) {
  +                results.append(this.getStartElement());
  +                if ("true".equalsIgnoreCase(htmlComment)) {
  +                    results.append(HTML_BEGIN_COMMENT);
                   }
  -
  -                // Create list of ValidatorActions based on lActionMethods
  -                for (Iterator i = actionMethods.iterator(); i.hasNext();) {
  -                    String depends = (String) i.next();
  -                    ValidatorAction va = resources.getValidatorAction(depends);
  -
  -                    // throw nicer NPE for easier debugging
  -                    if (va == null) {
  -                        throw new NullPointerException(
  -                            "Depends string \""
  -                                + depends
  -                                + "\" was not found in validator-rules.xml.");
  -                    }               
  +            }
  +        }
  +        
  +        if ("true".equalsIgnoreCase(staticJavascript)) {
  +            results.append(getJavascriptStaticMethods(resources));
  +        }
  +        
  +        if (form != null
  +            && ("true".equalsIgnoreCase(dynamicJavascript)
  +                || "true".equalsIgnoreCase(staticJavascript))) {
                       
  -                    String javascript = va.getJavascript();
  -                    if (javascript != null && javascript.length() > 0) {
  -                        actions.add(va);
  -                    } else {
  -                        i.remove();
  -                    }
  -                }
  +            results.append(getJavascriptEnd());
  +        }
  +        
  +        return results.toString();
  +    }
   
  -                Collections.sort(actions, 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();
  -                        }
  -                    }
  -                });
  +    /**
  +     * Generates the dynamic JavaScript for the form.
  +     * @param config
  +     * @param resources
  +     * @param locale
  +     * @param form
  +     */
  +    private String createDynamicJavascript(
  +        ModuleConfig config,
  +        ValidatorResources resources,
  +        Locale locale,
  +        Form form) {
  +
  +        StringBuffer results = new StringBuffer();
  +        
  +        MessageResources messages =
  +            (MessageResources) pageContext.getAttribute(
  +                bundle + config.getPrefix(),
  +                PageContext.APPLICATION_SCOPE);
   
  -                String methods = null;
  -                for (Iterator i = actions.iterator(); i.hasNext();) {
  -                    ValidatorAction va = (ValidatorAction) i.next();
  +        List actions = this.createActionList(resources, form);
   
  -                    if (methods == null) {
  -                        methods = va.getMethod() + "(form)";
  -                    } else {
  -                        methods += " && " + va.getMethod() + "(form)";
  -                    }
  -                }
  +        results.append(this.getJavascriptBegin(this.createMethods(actions)));
   
  -                results.append(getJavascriptBegin(methods));
  +        for (Iterator i = actions.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();
  +            }
   
  -                for (Iterator i = actions.iterator(); i.hasNext();) {
  -                    ValidatorAction va = (ValidatorAction) i.next();
  -                    String jscriptVar = null;
  -                    String functionName = null;
  +            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())) {
   
  -                    if (va.getJsFunctionName() != null && 
va.getJsFunctionName().length() > 0) {
  -                        functionName = va.getJsFunctionName();
  -                    } else {
  -                        functionName = va.getName();
  -                    }
  +                    continue;
  +                }
   
  -                    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())) {
  -                                
  -                            continue;
  -                        }
  -                        
  -                        String message =
  -                            Resources.getMessage(messages, locale, va, field);
  -                        
  -                        message = (message != null) ? message : "";
  +                String message = Resources.getMessage(messages, locale, va, field);
   
  -                        jscriptVar = this.getNextVar(jscriptVar);
  +                message = (message != null) ? message : "";
   
  -                        results.append(
  -                            "     this."
  -                                + jscriptVar
  -                                + " = new Array(\""
  -                                + field.getKey()
  -                                + "\", \""
  -                                + message
  -                                + "\", ");
  -
  -                        results.append("new Function (\"varName\", \"");
  -
  -                        Map vars = field.getVars();
  -                        // Loop through the field's variables.
  -                        Iterator varsIterator = vars.keySet().iterator();
  -                        while (varsIterator.hasNext()) {
  -                            String varName = (String) varsIterator.next();
  -                            Var var = (Var) vars.get(varName);
  -                            String varValue = var.getValue();
  -                            String jsType = var.getJsType();
  -
  -                            // skip requiredif variables field, fieldIndexed, 
fieldTest, fieldValue
  -                            if (varName.startsWith("field")) {
  -                                continue;
  -                            }
  -
  -                            if (Var.JSTYPE_INT.equalsIgnoreCase(jsType)) {
  -                                results.append(
  -                                    "this."
  -                                        + varName
  -                                        + "="
  -                                        + ValidatorUtil.replace(
  -                                            varValue,
  -                                            "\\",
  -                                            "\\\\")
  -                                        + "; ");
  -                            } else if (Var.JSTYPE_REGEXP.equalsIgnoreCase(jsType)) {
  -                                results.append(
  -                                    "this."
  -                                        + varName
  -                                        + "=/"
  -                                        + ValidatorUtil.replace(
  -                                            varValue,
  -                                            "\\",
  -                                            "\\\\")
  -                                        + "/; ");
  -                            } else if (Var.JSTYPE_STRING.equalsIgnoreCase(jsType)) {
  -                                results.append(
  -                                    "this."
  -                                        + varName
  -                                        + "='"
  -                                        + ValidatorUtil.replace(
  -                                            varValue,
  -                                            "\\",
  -                                            "\\\\")
  -                                        + "'; ");
  -                                // So everyone using the latest format doesn't need 
to change their xml files immediately.
  -                            } else if ("mask".equalsIgnoreCase(varName)) {
  -                                results.append(
  -                                    "this."
  -                                        + varName
  -                                        + "=/"
  -                                        + ValidatorUtil.replace(
  -                                            varValue,
  -                                            "\\",
  -                                            "\\\\")
  -                                        + "/; ");
  -                            } else {
  -                                results.append(
  -                                    "this."
  -                                        + varName
  -                                        + "='"
  -                                        + ValidatorUtil.replace(
  -                                            varValue,
  -                                            "\\",
  -                                            "\\\\")
  -                                        + "'; ");
  -                            }
  -                        }
  +                jscriptVar = this.getNextVar(jscriptVar);
   
  -                        results.append(" return this[varName];\"));\n");
  +                results.append(
  +                    "     this."
  +                        + jscriptVar
  +                        + " = new Array(\""
  +                        + field.getKey()
  +                        + "\", \""
  +                        + message
  +                        + "\", ");
  +
  +                results.append("new Function (\"varName\", \"");
  +
  +                Map vars = field.getVars();
  +                // Loop through the field's variables.
  +                Iterator varsIterator = vars.keySet().iterator();
  +                while (varsIterator.hasNext()) {
  +                    String varName = (String) varsIterator.next();
  +                    Var var = (Var) vars.get(varName);
  +                    String varValue = var.getValue();
  +                    String jsType = var.getJsType();
  +
  +                    // skip requiredif variables field, fieldIndexed, fieldTest, 
fieldValue
  +                    if (varName.startsWith("field")) {
  +                        continue;
  +                    }
  +
  +                    if (Var.JSTYPE_INT.equalsIgnoreCase(jsType)) {
  +                        results.append(
  +                            "this."
  +                                + varName
  +                                + "="
  +                                + ValidatorUtil.replace(varValue, "\\", "\\\\")
  +                                + "; ");
  +                    } else if (Var.JSTYPE_REGEXP.equalsIgnoreCase(jsType)) {
  +                        results.append(
  +                            "this."
  +                                + varName
  +                                + "=/"
  +                                + ValidatorUtil.replace(varValue, "\\", "\\\\")
  +                                + "/; ");
  +                    } else if (Var.JSTYPE_STRING.equalsIgnoreCase(jsType)) {
  +                        results.append(
  +                            "this."
  +                                + varName
  +                                + "='"
  +                                + ValidatorUtil.replace(varValue, "\\", "\\\\")
  +                                + "'; ");
  +                        // So everyone using the latest format doesn't need to 
change their xml files immediately.
  +                    } else if ("mask".equalsIgnoreCase(varName)) {
  +                        results.append(
  +                            "this."
  +                                + varName
  +                                + "=/"
  +                                + ValidatorUtil.replace(varValue, "\\", "\\\\")
  +                                + "/; ");
  +                    } else {
  +                        results.append(
  +                            "this."
  +                                + varName
  +                                + "='"
  +                                + ValidatorUtil.replace(varValue, "\\", "\\\\")
  +                                + "'; ");
                       }
  -                    results.append("    } \n\n");
  -                }
  -            } else if ("true".equalsIgnoreCase(staticJavascript)) {
  -                results.append(this.getStartElement());
  -                if ("true".equalsIgnoreCase(htmlComment)) {
  -                    results.append(HTML_BEGIN_COMMENT);
                   }
  +
  +                results.append(" return this[varName];\"));\n");
               }
  +            results.append("    } \n\n");
           }
  +
  +        return results.toString();
  +    }
  +
  +    /**
  +     * Creates the JavaScript methods list from the given actions.
  +     * @param actions A List of ValidatorAction objects.
  +     * @return JavaScript methods.
  +     */
  +    private String createMethods(List actions) {
  +        String methods = null;
           
  -        if ("true".equalsIgnoreCase(staticJavascript)) {
  -            results.append(getJavascriptStaticMethods(resources));
  +        Iterator iter = actions.iterator();
  +        while (iter.hasNext()) {
  +            ValidatorAction va = (ValidatorAction) iter.next();
  +
  +            if (methods == null) {
  +                methods = va.getMethod() + "(form)";
  +            } else {
  +                methods += " && " + va.getMethod() + "(form)";
  +            }
           }
  +        
  +        return methods;
  +    }
   
  -        if (form != null
  -            && ("true".equalsIgnoreCase(dynamicJavascript)
  -                || "true".equalsIgnoreCase(staticJavascript))) {
  -                    
  -            results.append(getJavascriptEnd());
  -        }
  +    /**
  +     * Get List of actions for the given Form.
  +     * @param resources
  +     * @param form
  +     * @return A sorted List of ValidatorAction objects.
  +     */
  +    private List createActionList(ValidatorResources resources, Form form) {
   
  +        List actionMethods = new ArrayList();
  +        
  +        Iterator iterator = form.getFields().iterator();
  +        while (iterator.hasNext()) {
  +            Field field = (Field) iterator.next();
   
  -        JspWriter writer = pageContext.getOut();
  -        try {
  -            writer.print(results.toString());
  -        } catch (IOException e) {
  -            throw new JspException(e.getMessage());
  +            for (Iterator x = field.getDependencies().iterator(); x.hasNext();) {
  +                Object o = x.next();
  +
  +                if (o != null && !actionMethods.contains(o)) {
  +                    actionMethods.add(o);
  +                }
  +            }
           }
   
  -        return (EVAL_BODY_TAG);
  +        List actions = new ArrayList();
  +
  +        // Create list of ValidatorActions based on actionMethods
  +        iterator = actionMethods.iterator();
  +        while (iterator.hasNext()) {
  +            String depends = (String) iterator.next();
  +            ValidatorAction va = resources.getValidatorAction(depends);
  +
  +            // throw nicer NPE for easier debugging
  +            if (va == null) {
  +                throw new NullPointerException(
  +                    "Depends string \""
  +                        + depends
  +                        + "\" was not found in validator-rules.xml.");
  +            }
   
  +            if (va.getJavascript() != null && va.getJavascript().length() > 0) {
  +                actions.add(va);
  +            } else {
  +                iterator.remove();
  +            }
  +        }
  +        
  +        Collections.sort(actions, actionComparator);
  +        
  +        return actions;
       }
   
       /**
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to