commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sebb <seb...@gmail.com>
Subject Re: svn commit: r1589446 - in /commons/proper/lang/trunk/src: main/java/org/apache/commons/lang3/time/FastDateParser.java test/java/org/apache/commons/lang3/time/FastDateParserTest.java
Date Thu, 24 Apr 2014 01:14:27 GMT
On 23 April 2014 21:19, Honton, Charles <Charles_Honton@intuit.com> wrote:
> TextStrategy is used for:
> E - DAY_OF_WEEK
> G - ERA
> M - MONTH
> a - AM_PM

Is that the only possible use of TextStrategy?
What about literal text?

> SimpleDateFormat uses case-insensitive parsing for each of these fields.
> I will add tests for each of those fields in multiple Locales.

Thanks.

> The (?u)(?i) modifier is active just for the duration of the group.

I did not know that.
Eventually found it documented but hidden away in the section on
differences from Perl.

Note: could be written as (?iu)

> Consider the following unit test:
>
> @Test
>     public void testCaseSensitiveModifier() throws Exception {
>    Pattern aabb = Pattern.compile("((?u)(?i)AA)BB");
>    assertTrue(aabb.matcher("aaBB").matches());
>    assertTrue(aabb.matcher("AABB").matches());
>    assertFalse(aabb.matcher("aabb").matches());
>    assertFalse(aabb.matcher("AAbb").matches());
> }
>
> Regards,
> chas
>
>
>
> On 4/23/14, 12:04 PM, "sebb" <sebbaz@gmail.com> wrote:
>
>>On 23 April 2014 17:02,  <chas@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/Fas
>>>tDateParser.java
>>>
>>>commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/Fas
>>>tDateParserTest.java
>>>
>>> Modified:
>>>commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/Fas
>>>tDateParser.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=1
>>>589446&view=diff
>>>
>>>=========================================================================
>>>=====
>>> ---
>>>commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/Fas
>>>tDateParser.java (original)
>>> +++
>>>commons/proper/lang/trunk/src/main/java/org/apache/commons/lang3/time/Fas
>>>tDateParser.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/Fas
>>>tDateParserTest.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/Fas
>>>tDateParserTest.java (original)
>>> +++
>>>commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/Fas
>>>tDateParserTest.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-unsubscribe@commons.apache.org
>>For additional commands, e-mail: dev-help@commons.apache.org
>>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@commons.apache.org
> For additional commands, e-mail: dev-help@commons.apache.org
>

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


Mime
View raw message