On 23 April 2014 17:02,  <c...@apache.org> wrote:
> Author: chas
> Date: Wed Apr 23 16:02:52 2014
> New Revision: 1589446
>
> URL: http://svn.apache.org/r1589446
> Log:
> LANG-966 - FastDateParser should be case insensitive
>
> Modified:
>     
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java
>     
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
>
> Modified: 
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java
> URL: 
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java?rev=1589446&r1=1589445&r2=1589446&view=diff
> ==============================================================================
> --- 
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java
>  (original)
> +++ 
> commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/FastDateParser.java
>  Wed Apr 23 16:02:52 2014
> @@ -25,6 +25,7 @@ import java.text.ParsePosition;
>  import java.util.ArrayList;
>  import java.util.Calendar;
>  import java.util.Date;
> +import java.util.HashMap;
>  import java.util.List;
>  import java.util.Locale;
>  import java.util.Map;
> @@ -586,6 +587,7 @@ public class FastDateParser implements D
>       private static class TextStrategy extends Strategy {
>          private final int field;
>          private final Map<String, Integer> keyValues;
> +        private final Map<String, Integer> lKeyValues;

This is an extra data area for ALL Text fields, but is only needed for
Month parsing.

I think a separate class is needed.

>          /**
>           * Construct a Strategy that parses a Text field
> @@ -596,6 +598,11 @@ public class FastDateParser implements D
>          TextStrategy(final int field, final Calendar definingCalendar, final 
> Locale locale) {
>              this.field= field;
>              this.keyValues= getDisplayNames(field, definingCalendar, locale);
> +            this.lKeyValues= new HashMap<String,Integer>();
> +
> +            for(Map.Entry<String, Integer> entry : keyValues.entrySet()) {
> +               lKeyValues.put(entry.getKey().toLowerCase(), 
> entry.getValue());
> +            }
>          }
>
>          /**
> @@ -603,7 +610,7 @@ public class FastDateParser implements D
>           */
>          @Override
>          boolean addRegex(final FastDateParser parser, final StringBuilder 
> regex) {
> -            regex.append('(');
> +            regex.append("((?i)(?u)");
>              for(final String textKeyValue : keyValues.keySet()) {
>                  escapeRegex(regex, textKeyValue, false).append('|');

-1

AFAICT, this will enable incorrect matching of text fields that are
not supposed to be case-blind.
Also, the case-blind matching is not disabled at the end of the
section, so can affect later matches.

Using a separate class for case-blind matching will fix the first
issue, and will avoid creating duplicate data unnecessarily.

>              }
> @@ -616,7 +623,7 @@ public class FastDateParser implements D
>           */
>          @Override
>          void setCalendar(final FastDateParser parser, final Calendar cal, 
> final String value) {
> -            final Integer iVal = keyValues.get(value);
> +            final Integer iVal = lKeyValues.get(value.toLowerCase());
>              if(iVal == null) {
>                  final StringBuilder sb= new StringBuilder(value);
>                  sb.append(" not in (");
>
> Modified: 
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
> URL: 
> http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java?rev=1589446&r1=1589445&r2=1589446&view=diff
> ==============================================================================
> --- 
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
>  (original)
> +++ 
> commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java
>  Wed Apr 23 16:02:52 2014
> @@ -540,4 +540,16 @@ public class FastDateParserTest {
>          final DateParser parser= getInstance(yMdHmsSZ, REYKJAVIK);
>          assertEquals(REYKJAVIK, parser.getTimeZone());
>      }
> +
> +    @Test
> +    public void testLang996() throws ParseException {
> +        Calendar expected = Calendar.getInstance(NEW_YORK, Locale.US);
> +        expected.clear();
> +        expected.set(2014, 4, 14);
> +
> +        final DateParser fdp = getInstance("ddMMMyyyy", NEW_YORK, Locale.US);
> +        assertEquals(expected.getTime(), fdp.parse("14may2014"));
> +        assertEquals(expected.getTime(), fdp.parse("14MAY2014"));
> +        assertEquals(expected.getTime(), fdp.parse("14May2014"));
> +    }

Need more tests to show that the parsing of other case-significant
dates is not affected.

>  }
>
>

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

Reply via email to