You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@commons.apache.org by "Niall Pemberton (JIRA)" <ji...@apache.org> on 2006/07/19 15:25:26 UTC

[jira] Updated: (VALIDATOR-154) [validator] GenericValidator.isDate can fail when strict == true

     [ http://issues.apache.org/jira/browse/VALIDATOR-154?page=all ]

Niall Pemberton updated VALIDATOR-154:
--------------------------------------

    Component/s: Routines

> [validator] GenericValidator.isDate can fail when strict == true
> ----------------------------------------------------------------
>
>                 Key: VALIDATOR-154
>                 URL: http://issues.apache.org/jira/browse/VALIDATOR-154
>             Project: Commons Validator
>          Issue Type: Improvement
>          Components: Routines
>    Affects Versions: Nightly Builds
>         Environment: Operating System: All
> Platform: All
>            Reporter: Gregg Yost
>            Priority: Minor
>         Attachments: date-patches.zip
>
>
> org.apache.commons.validator.GenericValidator.isDate(String value, String 
> datePattern, boolean strict) fails in some situations when the "strict" 
> parameter is true (it can either accept invalid dates or reject valid ones).  I 
> detected this in 1.0.2 but the latest code in CVS seems to have the same 
> problem (though in the latest code, the problem code has moved from 
> GenericValidator to DateValidator).
> The problem is that the "strict == true" is implemented by comparing the length 
> of the input string to the length of the pattern string.  This heuristic fails 
> in some situations.  For example:
>   - datePattern = "yyyy-MM-dd", value = "2003-06-2x" returns that the date is 
> valid but it isn't.  SimpleDateFormat parses the "2003-06-2" part as June 2, 
> 2003 even when setLenient(false) has been called, and the value and pattern 
> lengths are the same so the "strict" test passes.
>   - datePattern = "MMM dd, yyyy", value = "January 12, 2003" returns that the 
> date is NOT valid but it is.  The date parses correctly but the pattern and 
> value lengths are different, so the "strict" test doesn't pass.
> Both problems can be fixed by changing the implementation of "strict == true" 
> to see whether after the date has been parsed, the ParsePosition is at the end 
> of the input value string.
> Here's some sample code that should work correctly for the 
> DateValidator.isValid method in the latest source code.  Similar code would 
> work in version 1.0.2 in GenericValidator.isDate.  You should consider whether 
> the version of isValid that takes a Locale as a parameter is working as 
> intended as well (maybe it is, since it doesn't have a "strict" parameter -- 
> but should there be a way to specify both "strict" and a Locale?)
>   public boolean isValid(String value, String datePattern, boolean strict) {
>     if (value == null || datePattern == null || datePattern.length() <= 0) {
>       return false;
>     }
>     SimpleDateFormat formatter = new SimpleDateFormat(datePattern);
>     formatter.setLenient(false);
>     ParsePosition pos = new ParsePosition(0);
>     formatter.parse(value, pos);
>     if (strict && (pos.getIndex() < value.length())) {
>       return false;
>     }
>     return true;
>   }

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org