You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by tu...@apache.org on 2002/09/24 22:23:37 UTC

cvs commit: jakarta-commons/validator/src/test/org/apache/commons/validator MultipleTests.java validator-multipletest.xml ValidatorTestSuite.java

turner      2002/09/24 13:23:35

  Modified:    validator/src/share/org/apache/commons/validator
                        Validator.java
               validator/src/test/org/apache/commons/validator
                        ValidatorTestSuite.java
  Added:       validator/src/test/org/apache/commons/validator
                        MultipleTests.java validator-multipletest.xml
  Log:
  Refactors Validator.java to split one big method (validate) into a number of methods, have it iterate over fields rather than iterate over actions, stop on the first error for each field rather than skip processing a field if a depended action fails for any field.  Also added unit tests for multiple action fields.
  
  Revision  Changes    Path
  1.9       +295 -375  jakarta-commons/validator/src/share/org/apache/commons/validator/Validator.java
  
  Index: Validator.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/validator/src/share/org/apache/commons/validator/Validator.java,v
  retrieving revision 1.8
  retrieving revision 1.9
  diff -u -r1.8 -r1.9
  --- Validator.java	19 Sep 2002 17:11:46 -0000	1.8
  +++ Validator.java	24 Sep 2002 20:23:35 -0000	1.9
  @@ -81,9 +81,9 @@
   
   
   /**
  - * <p>Validations are processed by the validate method.  
  - * An instance of <code>ValidatorResources</code> is 
  - * used to define the validators (validation methods) 
  + * <p>Validations are processed by the validate method.
  + * An instance of <code>ValidatorResources</code> is
  + * used to define the validators (validation methods)
    * and the validation rules for a JavaBean.</p>
    *
    * @author David Winterfeldt
  @@ -103,40 +103,40 @@
      public static String BEAN_KEY = "java.lang.Object";
   
      /**
  -    * Resources key the <code>ValidatorAction</code> is stored under.  
  -    * This will be automatically passed into a validation method 
  -    * with the current <code>ValidatorAction</code> if it is 
  +    * Resources key the <code>ValidatorAction</code> is stored under.
  +    * This will be automatically passed into a validation method
  +    * with the current <code>ValidatorAction</code> if it is
       * specified in the method signature.
      */
      public static String VALIDATOR_ACTION_KEY = "org.apache.commons.validator.ValidatorAction";
   
      /**
  -    * Resources key the <code>Field</code> is stored under.  
  -    * This will be automatically passed into a validation method 
  -    * with the current <code>Field</code> if it is 
  +    * Resources key the <code>Field</code> is stored under.
  +    * This will be automatically passed into a validation method
  +    * with the current <code>Field</code> if it is
       * specified in the method signature.
      */
      public static String FIELD_KEY = "org.apache.commons.validator.Field";
   
      /**
  -    * Resources key the <code>Validator</code> is stored under.  
  -    * This will be automatically passed into a validation method 
  -    * with the current <code>Validator</code> if it is 
  +    * Resources key the <code>Validator</code> is stored under.
  +    * This will be automatically passed into a validation method
  +    * with the current <code>Validator</code> if it is
       * specified in the method signature.
      */
      public static String VALIDATOR_KEY = "org.apache.commons.validator.Validator";
      /**
       * Resources key the <code>Locale</code> is stored.
  -    * This will be used to retrieve the appropriate 
  -    * <code>FormSet</code> and <code>Form</code> to be 
  +    * This will be used to retrieve the appropriate
  +    * <code>FormSet</code> and <code>Form</code> to be
       * processed.
      */
      public static String LOCALE_KEY = "java.util.Locale";
  -   
  +
      protected ValidatorResources resources = null;
      protected String formName = null;
      protected HashMap hResources = new HashMap();
  -   protected int page = 0;   
  +   protected int page = 0;
   
      /**
       * The class loader to use for instantiating application objects.
  @@ -153,12 +153,12 @@
      protected boolean useContextClassLoader = false;
   
      /**
  -    * Construct a <code>Validator</code> that will 
  -    * use the <code>ValidatorResources</code> 
  -    * passed in to retrieve pluggable validators 
  +    * Construct a <code>Validator</code> that will
  +    * use the <code>ValidatorResources</code>
  +    * passed in to retrieve pluggable validators
       * the different sets of validation rules.
       *
  -    * @param	resources	<code>ValidatorResources</code> 
  +    * @param	resources	<code>ValidatorResources</code>
       *				to use during validation.
      */
      public Validator(ValidatorResources resources) {
  @@ -166,30 +166,30 @@
      }
   
      /**
  -    * Construct a <code>Validator</code> that will 
  -    * use the <code>ValidatorResources</code> 
  -    * passed in to retrieve pluggable validators 
  +    * Construct a <code>Validator</code> that will
  +    * use the <code>ValidatorResources</code>
  +    * passed in to retrieve pluggable validators
       * the different sets of validation rules.
       *
  -    * @param	resources	<code>ValidatorResources</code> 
  +    * @param	resources	<code>ValidatorResources</code>
       *				to use during validation.
  -    * @param	formName	Key used for retrieving the set of 
  +    * @param	formName	Key used for retrieving the set of
       *				validation rules.
      */
      public Validator(ValidatorResources resources, String formName) {
         this.resources = resources;
         this.formName = formName;
      }
  -   
  +
      /**
  -    * Add a resource to be used during the processing 
  +    * Add a resource to be used during the processing
       * of validations.
       *
  -    * @param	key		The full class name of the parameter 
  -    *				of the validation method that 
  -    *				corresponds to the value/instance 
  +    * @param	key		The full class name of the parameter
  +    *				of the validation method that
  +    *				corresponds to the value/instance
       *				passed in with it.
  -    * @param	value		The instance that will be passed 
  +    * @param	value		The instance that will be passed
       *				into the validation method.
      */
      public void addResource(String key, Object value) {
  @@ -197,72 +197,72 @@
      }
   
      /**
  -    * Get a resource to be used during the processing 
  +    * Get a resource to be used during the processing
       * of validations.
       *
  -    * @param	key		The full class name of the parameter 
  -    *				of the validation method that 
  -    *				corresponds to the value/instance 
  +    * @param	key		The full class name of the parameter
  +    *				of the validation method that
  +    *				corresponds to the value/instance
       *				passed in with it.
      */
   
     public Object getResource(String key) {
         return hResources.get(key);
     }
  -   
  +
      /**
  -    * Gets the form name which is the key 
  +    * Gets the form name which is the key
       * to a set of validation rules.
      */
      public String getFormName() {
  -      return formName;	
  +      return formName;
      }
  -   
  +
      /**
  -    * Sets the form name which is the key 
  +    * Sets the form name which is the key
       * to a set of validation rules.
      */
      public void setFormName(String formName) {
  -      this.formName = formName;	
  +      this.formName = formName;
      }
   
      /**
  -    * Gets the page.  This in conjunction with 
  -    * the page property of a <code>Field<code> 
  -    * can control the processing of fields.  
  -    * If the field's page is less than or equal 
  +    * Gets the page.  This in conjunction with
  +    * the page property of a <code>Field<code>
  +    * can control the processing of fields.
  +    * If the field's page is less than or equal
       * to this page value, it will be processed.
      */
      public int getPage() {
  -      return page;	
  +      return page;
      }
  -   
  +
      /**
  -    * Sets the page.  This in conjunction with 
  -    * the page property of a <code>Field<code> 
  -    * can control the processing of fields.  
  -    * If the field's page is less than or equal 
  +    * Sets the page.  This in conjunction with
  +    * the page property of a <code>Field<code>
  +    * can control the processing of fields.
  +    * If the field's page is less than or equal
       * to this page value, it will be processed.
      */
      public void setPage(int page) {
  -      this.page = page;	
  +      this.page = page;
      }
   
      /**
  -    * Clears the form name, resources that were added, 
  -    * and the page that was set (if any).  This can 
  -    * be called to reinitialize the Validator instance 
  -    * so it can be reused.  The form name (key to 
  -    * set of validation rules) and any resources needed, 
  -    * like the JavaBean being validated, will need to 
  -    * set and/or added to this instance again.  The 
  -    * <code>ValidatorResources</code> will not be removed 
  +    * Clears the form name, resources that were added,
  +    * and the page that was set (if any).  This can
  +    * be called to reinitialize the Validator instance
  +    * so it can be reused.  The form name (key to
  +    * set of validation rules) and any resources needed,
  +    * like the JavaBean being validated, will need to
  +    * set and/or added to this instance again.  The
  +    * <code>ValidatorResources</code> will not be removed
       * since it can be used again and is thread safe.
      */
      public void clear() {
         formName = null;
         hResources = new HashMap();
  -      page = 0;   
  +      page = 0;
      }
   
      /**
  @@ -303,7 +303,7 @@
         if (this.classLoader != null) {
            return (this.classLoader);
         }
  -      
  +
         if (this.useContextClassLoader) {
            ClassLoader classLoader =
                    Thread.currentThread().getContextClassLoader();
  @@ -311,7 +311,7 @@
                return (classLoader);
            }
         }
  -      
  +
         return (this.getClass().getClassLoader());
      }
   
  @@ -327,330 +327,250 @@
          this.classLoader = classLoader;
   
      }
  -      
  +
  +
  +    private boolean validateFieldForRule(Field field,
  +					ValidatorAction va,
  +					ValidatorResults results,
  +					Map hActions,
  +					int pos) throws ValidatorException {
  +	if (results.getValidatorResult(va.getName()) != null) {
  +	    return isValid(results.getValidatorResult(va.getName()));
  +	}
  +
  +	if (va.getDepends() != null) {
  +	    StringTokenizer st = new StringTokenizer(va.getDepends(), ",");
  +	    while (st.hasMoreTokens()) {
  +		String depend = st.nextToken().trim();
  +
  +		ValidatorAction depAction = (ValidatorAction)hActions.get(depend);
  +		if (depAction == null) {
  +		    log.error("No ValidatorAction called " + depend +
  +			      " found for field " + field.getProperty());
  +		    return false;
  +		}
  +		if (!validateFieldForRule(field, depAction,
  +					  results, hActions, pos)) {
  +		    return false;
  +		}
  +	    }
  +	}
  +
  +	try {
  +	    // Add these two Objects to the resources since they reference
  +	    // the current validator action and field
  +	    hResources.put(VALIDATOR_ACTION_KEY, va);
  +	    hResources.put(FIELD_KEY, field);
  +
  +	    Class c = getClassLoader().loadClass(va.getClassname());
  +
  +	    List lParams = va.getMethodParamsList();
  +	    int size = lParams.size();
  +	    int beanIndexPos = -1;
  +	    int fieldIndexPos = -1;
  +	    Class[] paramClass = new Class[size];
  +	    Object[] paramValue = new Object[size];
  +
  +	    for (int x = 0; x < size; x++) {
  +		String paramKey = (String)lParams.get(x);
  +
  +		if (BEAN_KEY.equals(paramKey)) {
  +		    beanIndexPos = x;
  +		}
  +
  +		if (FIELD_KEY.equals(paramKey)) {
  +		    fieldIndexPos = x;
  +		}
  +
  +		// There were problems calling getClass on paramValue[]
  +		paramClass[x] = getClassLoader().loadClass(paramKey);
  +
  +		paramValue[x] = hResources.get(paramKey);
  +	    }
  +
  +	    Method m = c.getMethod(va.getMethod(), paramClass);
  +
  +	    // If the method is static we don't need an instance of the class
  +	    // to call the method.  If it isn't, we do.
  +	    if (!Modifier.isStatic(m.getModifiers())) {
  +		try {
  +		    if (va.getClassnameInstance() == null) {
  +			va.setClassnameInstance(c.newInstance());
  +		    }
  +		} catch (Exception ex) {
  +		    log.error("Couldn't load instance " +
  +			      "of class " + va.getClassname() + ".  " + ex.getMessage());
  +		}
  +	    }
  +
  +	    Object result = null;
  +
  +	    if (field.isIndexed()) {
  +		Object oIndexed = PropertyUtils.getProperty(hResources.get(BEAN_KEY), field.getIndexedListProperty());
  +		Object indexedList[] = new Object[0];
  +
  +		if (oIndexed instanceof Collection) {
  +		    indexedList = ((Collection)oIndexed).toArray();
  +		} else if(oIndexed.getClass().isArray()) {
  +		    indexedList = (Object[])oIndexed;
  +		}
  +
  +		// Set current iteration object to the parameter array
  +		paramValue[beanIndexPos] = indexedList[pos];
  +
  +		// Set field clone with the key modified to represent
  +		// the current field
  +		Field indexedField = (Field)field.clone();
  +		indexedField.setKey(ValidatorUtil.replace(indexedField.getKey(), Field.TOKEN_INDEXED, "[" + pos + "]"));
  +		paramValue[fieldIndexPos] = indexedField;
  +
  +		result = m.invoke(va.getClassnameInstance(), paramValue);
  +		results.add(field, va.getName(), isValid(result), result);
  +		if (!isValid(result)) {
  +		    return false;
  +		}
  +	    } else {
  +		result = m.invoke(va.getClassnameInstance(), paramValue);
  +		results.add(field, va.getName(), isValid(result), result);
  +		if (!isValid(result))
  +		    return false;
  +	    }
  +	} catch (Exception e) {
  +	    log.error("reflection: " + e.getMessage(), e);
  +
  +	    results.add(field, va.getName(), false);
  +
  +	    if (e instanceof ValidatorException) {
  +		throw ((ValidatorException)e);
  +	    }
  +	    return false;
  +	}
  +	return true;
  +    }
  +
  +    /**
  +     * Run the validations on a given field, modifying the passed
  +     * ValidatorResults to add in any new errors found.  If the
  +     * field is an indexed one, run all the validations in the depends
  +     * clause over each item in turn, returning when the first one fails.
  +     * If it's non-indexed, just run it on the field.
  +     **/
  +
  +    private void validateField (Field field, ValidatorResults allResults)
  +	throws ValidatorException {
  +
  +	Map hActions = resources.getValidatorActions();
  +	if (field.isIndexed()) {
  +	    Object oIndexed;
  +	    try {
  +		oIndexed = PropertyUtils.getProperty(hResources.get(BEAN_KEY), field.getIndexedListProperty());
  +	    } catch (Exception e) {
  +		log.error("in validateField", e);
  +		return;
  +	    }
  +
  +	    Object indexedList[] = new Object[0];
  +
  +	    if (oIndexed instanceof Collection) {
  +		indexedList = ((Collection)oIndexed).toArray();
  +	    } else if(oIndexed.getClass().isArray()) {
  +		indexedList = (Object[])oIndexed;
  +	    }
  +
  +	    for (int pos = 0; pos < indexedList.length; pos++) {
  +		ValidatorResults results = new ValidatorResults();
  +		StringTokenizer st = new StringTokenizer(field.getDepends(), ",");
  +		while (st.hasMoreTokens()) {
  +		    String depend = st.nextToken().trim();
  +
  +		    ValidatorAction depAction = (ValidatorAction)hActions.get(depend);
  +		    if (depAction == null) {
  +			log.error("No ValidatorAction called " + depend +
  +				  " found for field " + field.getProperty());
  +			return;
  +		    }
  +		    boolean good =validateFieldForRule(field, depAction,
  +						       results, hActions, pos);
  +		    allResults.merge(results);
  +		    if (!good) return;
  +		}
  +	    }
  +	} else {
  +	    ValidatorResults results = new ValidatorResults();
  +	    StringTokenizer st = new StringTokenizer(field.getDepends(), ",");
  +	    while (st.hasMoreTokens()) {
  +		String depend = st.nextToken().trim();
  +
  +		ValidatorAction depAction = (ValidatorAction)hActions.get(depend);
  +		if (depAction == null) {
  +		    log.error("No ValidatorAction called " + depend +
  +			      " found for field " + field.getProperty());
  +		    return;
  +		}
  +		boolean good = validateFieldForRule(field, depAction,
  +						    results, hActions, 0);
  +		allResults.merge(results);
  +
  +		if (good == false) {
  +		    return;
  +		}
  +	    }
  +	}
  +    }
  +
      /**
  -    * Performs validations based on the configured resources.  
  -    * 
  -    * @return	The <code>Map</code> returned uses the property 
  -    *		of the <code>Field</code> for the key and the value 
  +    * Performs validations based on the configured resources.
  +    *
  +    * @return	The <code>Map</code> returned uses the property
  +    *		of the <code>Field</code> for the key and the value
       *		is the number of error the field had.
  -   */ 
  +   */
      public ValidatorResults validate() throws ValidatorException {
  -      ValidatorResults results = new ValidatorResults();
  -      Locale locale = null;
  -      
  -      if (hResources.containsKey(LOCALE_KEY)) {
  -         locale = (Locale)hResources.get(LOCALE_KEY);
  -      }
  -      hResources.put(VALIDATOR_KEY, this);
  -      
  -      if (locale == null) {
  -         locale = Locale.getDefault();
  -      }
  -         
  -      Form form = null;
  -      if (resources == null) {
  -	  throw new ValidatorException("Resources not defined for Validator");
  -      }
  -      if ((form = resources.get(locale, formName)) != null) {	    
  -         Map hActions = resources.getValidatorActions();
  -         List lActions = new ArrayList();
  -         Map hActionsRun = new HashMap();
  -         boolean bMoreActions = true;
  -         boolean bErrors = false;
  -      
  -         for (Iterator actions = hActions.values().iterator(); actions.hasNext(); )
  -            lActions.add(actions.next());
  -      
  -         while (bMoreActions) {
  -            ValidatorAction va = null;
  -            int iErrorCount = 0;
  -            
  -            // FIX ME - These sorts will not work for all variations.
  -            // Sort by number dependencies
  -            Collections.sort(lActions, new DependencyComparator());
  -      
  -            // Sort by number of dependencies successfully run
  -            Collections.sort(lActions, new DependencySuccessComparator(hActionsRun));
  -            
  -            if (lActions.size() > 0)
  -               va = (ValidatorAction)lActions.get(0);
  -      
  -            if (va != null && va.getDepends() != null && va.getDepends().length() > 0) {
  -               StringTokenizer st = new StringTokenizer(va.getDepends(), ",");
  -               while (st.hasMoreTokens()) {
  -                  String depend = st.nextToken().trim();
  -                  Object o = hActionsRun.get(depend);
  -      
  -                  if (log.isDebugEnabled()) {
  -      	             log.debug("ValidatorAction name=" + va.getName() + "  depends=" + va.getDepends());
  -      	          }
  -      	                       
  -                  if (o == null) {
  -                     lActions.clear();
  -                     va = null;
  -                     bMoreActions = false;
  -                     break;
  -                  } else {
  -                     boolean bContinue = ((Boolean)o).booleanValue();
  -
  -                     if (log.isDebugEnabled()) {
  -      	                log.debug("ValidatorAction name=" + va.getName() + "  depend=" + depend + "  bContinue=" + bContinue);
  -      	             }
  -                     
  -                     if (!bContinue) {
  -                        lActions.clear();
  -                        va = null;
  -                        bMoreActions = false;
  -                        break;
  -                     }
  -                  }
  -               }
  -            }
  -            
  -            // For debug   
  -
  -            if (log.isDebugEnabled()) {
  -               StringBuffer sbLog = new StringBuffer();
  -      	       sbLog.append("Order \n");
  -               
  -               for (Iterator actions = lActions.iterator(); actions.hasNext(); ) {
  -                  ValidatorAction tmp = (ValidatorAction)actions.next();
  -                  sbLog.append("\t ValidatorAction name=" + tmp.getName() + "  depends=" + tmp.getDepends() + "\n");
  -               }
  -
  -               log.debug(sbLog.toString());
  -      	    }
  -            
  -            if (va != null) {
  -               for (Iterator i = form.getFields().iterator(); i.hasNext(); ) {
  -                  Field field = (Field)i.next();         
  -      
  -                  if (field.getPage() <= page && (field.getDepends() != null && field.isDependency(va.getName()))) {
  -                     try {
  -                     	  // Add these two Objects to the resources since they reference 
  -                     	  // the current validator action and field
  -                     	  hResources.put(VALIDATOR_ACTION_KEY, va);
  -                     	  hResources.put(FIELD_KEY, field);
  -      
  -                     	  Class c = getClassLoader().loadClass(va.getClassname());
  -
  -                     	  List lParams = va.getMethodParamsList();
  -                     	  int size = lParams.size();
  -                     	  int beanIndexPos = -1;
  -                     	  int fieldIndexPos = -1;
  -                     	  int validatorIndexPos = -1;
  -                     	  Class[] paramClass = new Class[size];
  -                     	  Object[] paramValue = new Object[size];
  -      
  -                     	  for (int x = 0; x < size; x++) {
  -                     	     String paramKey = (String)lParams.get(x);
  -             	             
  -			     if (VALIDATOR_KEY.equals(paramKey)) {
  -				 validatorIndexPos = x;
  -			     }
  -
  -             	             if (BEAN_KEY.equals(paramKey)) {
  -             	                beanIndexPos = x;
  -             	             }
  -             	                
  -             	             if (FIELD_KEY.equals(paramKey)) {
  -             	                fieldIndexPos = x;
  -             	             }
  -             	             
  -                     	     // There were problems calling getClass on paramValue[]
  -                     	     paramClass[x] = getClassLoader().loadClass(paramKey);
  -
  -                     	     paramValue[x] = hResources.get(paramKey);
  -                     	  }
  -      
  -                        Method m = c.getMethod(va.getMethod(), paramClass);
  -      		  
  -      		        // If the method is static we don't need an instance of the class 
  -      		        // to call the method.  If it isn't, we do.
  -                        if (!Modifier.isStatic(m.getModifiers())) {
  -                           try {
  -                              if (va.getClassnameInstance() == null) {
  -                                 va.setClassnameInstance(c.newInstance());
  -                              }
  -                           } catch (Exception ex) {
  -                              log.error("Couldn't load instance " +
  -                                        "of class " + va.getClassname() + ".  " + ex.getMessage());
  -                           }
  -                        }
  -      
  -                        Object result = null;
  -                        
  -                        if (field.isIndexed()) {
  -                           Object oIndexed = PropertyUtils.getProperty(hResources.get(BEAN_KEY), field.getIndexedListProperty());
  -                           Object indexedList[] = new Object[0];
  -                           
  -                           if (oIndexed instanceof Collection) {
  -                              indexedList = ((Collection)oIndexed).toArray();
  -                           } else if(oIndexed.getClass().isArray()) {
  -                              indexedList = (Object[])oIndexed;
  -                           }
  -                           
  -                           for (int pos = 0; pos < indexedList.length; pos++) {
  -                              // Set current iteration object to the parameter array
  -                              paramValue[beanIndexPos] = indexedList[pos];
  -                              
  -                              // Set field clone with the key modified to represent 
  -                              // the current field
  -                              Field indexedField = (Field)field.clone();
  -                              indexedField.setKey(ValidatorUtil.replace(indexedField.getKey(), Field.TOKEN_INDEXED, "[" + pos + "]"));
  -                              paramValue[fieldIndexPos] = indexedField;
  -                              
  -                              result = m.invoke(va.getClassnameInstance(), paramValue);
  -                           }
  -                        } else {
  -                           result = m.invoke(va.getClassnameInstance(), paramValue);
  -                        }
  -                        
  -                        if (!isValid(result)) {
  -                           iErrorCount++;
  -                        }
  -                         
  -                        results.add(field, va.getName(), isValid(result), result);
  -      	       } catch (Exception e) {
  -      	          bErrors = true;
  -      	          log.error("reflection: " + e.getMessage(), e);
  -      	          
  -      	          results.add(field, va.getName(), false);
  -      	          
  -      	          if (e instanceof ValidatorException) {
  -      	             throw ((ValidatorException)e);
  -      	          }
  -      	       }
  -               
  -                  }
  -               }
  -               
  -               if (iErrorCount == 0) {
  -                  hActionsRun.put(va.getName(), new Boolean(true));
  -               } else {
  -                  hActionsRun.put(va.getName(), new Boolean(false));
  -               }
  -               
  -               if (log.isDebugEnabled()) {
  -                  log.debug("name=" + va.getName() + "  size=" + lActions.size());
  -               }
  -                  
  -               if (lActions.size() > 0) {
  -                  lActions.remove(0);
  -               }
  -               
  -               if (log.isDebugEnabled()) {
  -                  log.debug("after remove - name=" + va.getName() + "  size=" + lActions.size());
  -               }
  -            }
  -            
  -            if (lActions.size() == 0) {
  -               bMoreActions = false;
  -            }
  -         }
  -      }
  -      
  -      return results;
  +       ValidatorResults results = new ValidatorResults();
  +       Locale locale = null;
  +
  +       if (hResources.containsKey(LOCALE_KEY)) {
  +	   locale = (Locale)hResources.get(LOCALE_KEY);
  +       }
  +       hResources.put(VALIDATOR_KEY, this);
  +
  +       if (locale == null) {
  +	   locale = Locale.getDefault();
  +       }
  +
  +       Form form = null;
  +       if (resources == null) {
  +	   throw new ValidatorException("Resources not defined for Validator");
  +       }
  +       if ((form = resources.get(locale, formName)) != null) {
  +       for (Iterator i = form.getFields().iterator(); i.hasNext(); ) {
  +	   Field field = (Field)i.next();
  +	   if (field.getPage() <= page) {
  +	       validateField(field, results);
  +	   }
  +       }
  +       }
  +       return results;
      }
   
      /**
  -    * Returns if the result if valid.  If the 
  -    * result object is <code>Boolean</code>, then it will 
  -    * the value.  If the result object isn't <code>Boolean</code>, 
  -    * then it will return <code>false</code> if the result 
  -    * object is <code>null</code> and <code>true</code> if it 
  +    * Returns if the result if valid.  If the
  +    * result object is <code>Boolean</code>, then it will
  +    * the value.  If the result object isn't <code>Boolean</code>,
  +    * then it will return <code>false</code> if the result
  +    * object is <code>null</code> and <code>true</code> if it
       * isn't.
      */
      private boolean isValid(Object result) {
         boolean bValid = false;
  -      
  +
         if (result instanceof Boolean) {
            Boolean valid = (Boolean)result;
            bValid = valid.booleanValue();
         } else {
            bValid = (result != null);
         }
  -      
  -      return bValid;
  -   }
  -
  -   /**
  -    * Sort by number dependencies.
  -   */
  -   protected class DependencyComparator implements 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();
  -         }
  -      }
  -
  -   }
  -
  -   /**
  -    * Sort by number of dependencies successfully run.
  -   */
  -   protected class DependencySuccessComparator implements Comparator {
  -      Map hActionsRun = null;
  -      
  -      public DependencySuccessComparator(Map hActionsRun) {
  -         this.hActionsRun = hActionsRun;
  -      }
  -      
  -      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 {
  -            int iVA1 = 0;
  -            int iVA2 = 0;
  -            
  -            for (Iterator i = va1.getDependencies().iterator(); i.hasNext(); ) {
  -               String depend = ((String)i.next()).trim();
  -               Object o = hActionsRun.get(depend);
  -               
  -               if (o != null) {
  -                  if (((Boolean)o).booleanValue())
  -                    iVA1++;
  -               }
  -            }
  -      
  -            for (Iterator i = va2.getDependencies().iterator(); i.hasNext(); ) {
  -               String depend = ((String)i.next()).trim();
  -               Object o = hActionsRun.get(depend);
  -               
  -               if (o != null) {
  -                  if (((Boolean)o).booleanValue())
  -                    iVA2++;
  -               }	
  -            }
  -            
  -            return iVA1 - iVA2;
  -         }
  -      }
   
  +      return bValid;
      }
  -
   }
  
  
  
  1.5       +30 -28    jakarta-commons/validator/src/test/org/apache/commons/validator/ValidatorTestSuite.java
  
  Index: ValidatorTestSuite.java
  ===================================================================
  RCS file: /home/cvs/jakarta-commons/validator/src/test/org/apache/commons/validator/ValidatorTestSuite.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ValidatorTestSuite.java	19 Sep 2002 17:11:46 -0000	1.4
  +++ ValidatorTestSuite.java	24 Sep 2002 20:23:35 -0000	1.5
  @@ -62,44 +62,46 @@
   
   package org.apache.commons.validator;
   
  -import junit.framework.Test;                           
  -import junit.framework.TestCase;                          
  +import junit.framework.Test;
  +import junit.framework.TestCase;
   import junit.framework.TestSuite;
   
  -                                                          
  -/**                                                       
  +
  +/**
    * Test suite for <code>org.apache.commons.validator</code>
    * package.
    *
    * @author David Winterfeldt
  + * @author James Turner
    * @version $Revision$ $Date$
  -*/                                                       
  -public class ValidatorTestSuite extends TestCase {            
  -                                                          
  -    public ValidatorTestSuite(String name) {                  
  +*/
  +public class ValidatorTestSuite extends TestCase {
  +
  +    public ValidatorTestSuite(String name) {
           super(name);
  -    }                                                     
  +    }
   
       public static Test suite() {
          TestSuite suite = new TestSuite();
   
  -       suite.addTest(RequiredNameTest.suite()); 
  -       suite.addTest(RequiredIfTest.suite()); 
  -       suite.addTest(ByteTest.suite()); 
  -       suite.addTest(ShortTest.suite()); 
  -       suite.addTest(IntegerTest.suite()); 
  -       suite.addTest(LongTest.suite()); 
  -       suite.addTest(FloatTest.suite()); 
  -       suite.addTest(DoubleTest.suite()); 
  -       suite.addTest(TypeTest.suite()); 
  -       suite.addTest(EmailTest.suite()); 
  -       suite.addTest(ValidatorTest.suite()); 
  +       suite.addTest(RequiredNameTest.suite());
  +       suite.addTest(RequiredIfTest.suite());
  +       suite.addTest(MultipleTests.suite());
  +       suite.addTest(ByteTest.suite());
  +       suite.addTest(ShortTest.suite());
  +       suite.addTest(IntegerTest.suite());
  +       suite.addTest(LongTest.suite());
  +       suite.addTest(FloatTest.suite());
  +       suite.addTest(DoubleTest.suite());
  +       suite.addTest(TypeTest.suite());
  +       suite.addTest(EmailTest.suite());
  +       suite.addTest(ValidatorTest.suite());
   
          return suite;
       }
  -                                                          
  -    public static void main(String args[]) {              
  +
  +    public static void main(String args[]) {
           junit.textui.TestRunner.run(suite());
  -    }          
  -                                               
  +    }
  +
   }
  
  
  
  1.1                  jakarta-commons/validator/src/test/org/apache/commons/validator/MultipleTests.java
  
  Index: MultipleTests.java
  ===================================================================
  /*
   * $Header: /home/cvs/jakarta-commons/validator/src/test/org/apache/commons/validator/MultipleTests.java,v 1.1 2002/09/24 20:23:35 turner Exp $
   * $Revision: 1.1 $
   * $Date: 2002/09/24 20:23:35 $
   *
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2002 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact apache@apache.org.
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  
  package org.apache.commons.validator;
  
  import java.io.IOException;
  import java.io.InputStream;
  import java.util.Map;
  import junit.framework.Test;
  import junit.framework.TestCase;
  import junit.framework.TestSuite;
  import junit.framework.AssertionFailedError;
  import org.apache.commons.logging.Log;
  import org.apache.commons.logging.LogSource;
  
  /**
   * <p>Performs Validation Test.</p>
   *
   * @author James Turner
   * @version $Revision: 1.1 $ $Date: 2002/09/24 20:23:35 $
  */
  public class MultipleTests extends TestCase {
  
     /**
      * The key used to retrieve the set of validation
      * rules from the xml file.
     */
     protected static String FORM_KEY = "nameForm";
  
     /**
      * The key used to retrieve the validator action.
     */
     protected static String ACTION = "required";
  
  
     /**
      * Commons Logging instance.
     */
     private Log log = LogSource.getInstance(this.getClass().getName());
  
     /**
      * Resources used for validation tests.
     */
     private ValidatorResources resources = null;
  
     public MultipleTests(String name) {
         super(name);
     }
  
     /**
      * Start the tests.
      *
      * @param theArgs the arguments. Not used
      */
     public static void main(String[] theArgs) {
         junit.awtui.TestRunner.main(new String[] {MultipleTests.class.getName()});
     }
  
     /**
      * @return a test suite (<code>TestSuite</code>) that includes all methods
      *         starting with "test"
      */
     public static Test suite() {
         // All methods starting with "test" will be executed in the test suite.
         return new TestSuite(MultipleTests.class);
     }
  
     /**
      * Load <code>ValidatorResources</code> from
      * validator-name-required.xml.
     */
     protected void setUp() throws IOException {
        // Load resources
        InputStream in = null;
        resources = new ValidatorResources();
  
        try {
           in = this.getClass().getResourceAsStream("validator-multipletest.xml");
           ValidatorResourcesInitializer.initialize(resources, in);
        } catch (IOException e) {
           log.error(e.getMessage(), e);
           throw e;
        } finally {
           if (in != null) {
              try { in.close(); } catch (Exception e) {}
           }
        }
     }
  
     protected void tearDown() {
     }
  
     /**
      * With nothing provided, we should fail both because both are required.
     */
     public void testBothBlank() throws ValidatorException {
        // Create bean to run test on.
        NameBean name = new NameBean();
  
        // Construct validator based on the loaded resources
        // and the form key
        Validator validator = new Validator(resources, FORM_KEY);
        // add the name bean to the validator as a resource
        // for the validations to be performed on.
        validator.addResource(Validator.BEAN_KEY, name);
  
        // Get results of the validation.
        ValidatorResults results = null;
  
        // throws ValidatorException,
        // but we aren't catching for testing
        // since no validation methods we use
        // throw this
        results = validator.validate();
  
        assertNotNull("Results are null.", results);
  
        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
  
        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have failed.", !firstNameResult.isValid(ACTION));
  
        assertNotNull("Last Name ValidatorResult should not be null.", lastNameResult);
        assertTrue("Last Name ValidatorResult should contain the '" + ACTION +"' action.", lastNameResult.containsAction(ACTION));
        assertTrue("Last Name ValidatorResult for the '" + ACTION +"' action should have failed.", !lastNameResult.isValid(ACTION));
        assertTrue("Last Name ValidatorResults should not contain the 'int' action.", !lastNameResult.containsAction("int"));
     }
  
     /**
      * If the first name fails required, and the second test fails int, we should get two errors.
     */
     public void testRequiredFirstNameBlankLastNameShort() throws ValidatorException {
        // Create bean to run test on.
        NameBean name = new NameBean();
        name.setFirstName("");
        name.setLastName("Test");
  
        // Construct validator based on the loaded resources
        // and the form key
        Validator validator = new Validator(resources, FORM_KEY);
        // add the name bean to the validator as a resource
        // for the validations to be performed on.
        validator.addResource(Validator.BEAN_KEY, name);
  
        // Get results of the validation.
        ValidatorResults results = null;
  
        results = validator.validate();
  
        assertNotNull("Results are null.", results);
  
        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
  
        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have failed.", !firstNameResult.isValid(ACTION));
  
        assertNotNull("Last Name ValidatorResult should not be null.", lastNameResult);
        assertTrue("Last Name ValidatorResult should contain the 'int' action.", lastNameResult.containsAction("int"));
        assertTrue("Last Name ValidatorResult for the 'int' action should have failed.", !lastNameResult.isValid("int"));
     }
  
     /**
      * If the first name is there, and the last name fails int, we should get one error.
     */
     public void testRequiredLastNameShort() throws ValidatorException {
        // Create bean to run test on.
        NameBean name = new NameBean();
        name.setFirstName("Test");
        name.setLastName("Test");
  
        // Construct validator based on the loaded resources
        // and the form key
        Validator validator = new Validator(resources, FORM_KEY);
        // add the name bean to the validator as a resource
        // for the validations to be performed on.
        validator.addResource(Validator.BEAN_KEY, name);
  
        // Get results of the validation.
        ValidatorResults results = null;
  
        results = validator.validate();
  
        assertNotNull("Results are null.", results);
  
        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
  
        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have passed.", firstNameResult.isValid(ACTION));
  
        assertNotNull("Last Name ValidatorResult should not be null.", lastNameResult);
        assertTrue("Last Name ValidatorResult should contain the 'int' action.", lastNameResult.containsAction("int"));
        assertTrue("Last Name ValidatorResult for the 'int' action should have failed.", !lastNameResult.isValid("int"));
     }
  
     /**
      * If first name is ok and last name is ok and is an int, no errors.
     */
     public void testRequiredLastNameLong() throws ValidatorException {
        // Create bean to run test on.
        NameBean name = new NameBean();
        name.setFirstName("Joe");
        name.setLastName("12345678");
  
        // Construct validator based on the loaded resources
        // and the form key
        Validator validator = new Validator(resources, FORM_KEY);
        // add the name bean to the validator as a resource
        // for the validations to be performed on.
        validator.addResource(Validator.BEAN_KEY, name);
  
        // Get results of the validation.
        ValidatorResults results = null;
  
        results = validator.validate();
  
        assertNotNull("Results are null.", results);
  
        ValidatorResult firstNameResult = results.getValidatorResult("firstName");
        ValidatorResult lastNameResult = results.getValidatorResult("lastName");
  
        assertNotNull("First Name ValidatorResult should not be null.", firstNameResult);
        assertTrue("First Name ValidatorResult should contain the '" + ACTION +"' action.", firstNameResult.containsAction(ACTION));
        assertTrue("First Name ValidatorResult for the '" + ACTION +"' action should have passed.", firstNameResult.isValid(ACTION));
  
        assertNotNull("Last Name ValidatorResult should not be null.", lastNameResult);
        assertTrue("Last Name ValidatorResult should contain the 'int' action.", lastNameResult.containsAction("int"));
        assertTrue("Last Name ValidatorResult for the 'int' action should have passed.", lastNameResult.isValid("int"));
     }
  
  
  }
  
  
  
  1.1                  jakarta-commons/validator/src/test/org/apache/commons/validator/validator-multipletest.xml
  
  Index: validator-multipletest.xml
  ===================================================================
  <form-validation>
     <global>
        <validator name="int"
                   classname="org.apache.commons.validator.TestValidator"
                   method="validateInt"
                   methodParams="java.lang.Object,org.apache.commons.validator.Field"/>
        <validator name="required"
                   classname="org.apache.commons.validator.TestValidator"
                   method="validateRequired"
                   methodParams="java.lang.Object,org.apache.commons.validator.Field"/>
     </global>
     <formset>
        <form    name="nameForm">
           <field    property="firstName"  depends="required">
           	     <arg0 key="nameForm.firstname.displayname"/>
           </field>    
           <field    property="lastName"
           	   depends="required,int">
           	     <arg0 key="nameForm.lastname.displayname"/>
           </field>
        </form>
     </formset>   
  </form-validation>
  
  
  

--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>