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]