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]