Hello Charles, looks like things got missed up. The Log messages takes about LANG-1109, but LANG-1107 was added to changes.xml. Furthermore there is a change in FieldUtilsTest. How does this relate to either of the issues?
Regards, Benedikt 2015-04-07 4:40 GMT+02:00 <c...@apache.org>: > Author: chas > Date: Tue Apr 7 02:40:49 2015 > New Revision: 1671734 > > URL: http://svn.apache.org/r1671734 > Log: > LANG-1109 - Number percentage formatting with fractional digits > > Modified: > commons/proper/lang/trunk/src/changes/changes.xml > > 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/reflect/FieldUtilsTest.java > > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java > > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserTest.java > > Modified: commons/proper/lang/trunk/src/changes/changes.xml > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/changes/changes.xml?rev=1671734&r1=1671733&r2=1671734&view=diff > > ============================================================================== > --- commons/proper/lang/trunk/src/changes/changes.xml [utf-8] (original) > +++ commons/proper/lang/trunk/src/changes/changes.xml [utf-8] Tue Apr 7 > 02:40:49 2015 > @@ -22,7 +22,7 @@ > <body> > > <release version="3.5" date="tba" description="tba"> > - > + <action issue="LANG-1107" type="update" dev="chas">Fix parsing edge > cases in FastDateParser</action> > </release> > > <release version="3.4" date="2014-04-06" description="Feature and > bugfix release"> > > 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=1671734&r1=1671733&r2=1671734&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 > Tue Apr 7 02:40:49 2015 > @@ -744,9 +744,13 @@ public class FastDateParser implements D > /** > * A strategy that handles a timezone field in the parsing pattern > */ > - private static class TimeZoneStrategy extends Strategy { > - > - private final String validTimeZoneChars; > + static class TimeZoneStrategy extends Strategy { > + private static final String RFC_822_TIME_ZONE = "[+-]\\d{4}"; > + private static final String GMT_OPTION= "GMT[+-]\\d{1,2}:\\d{2}"; > + // see http://www.iana.org/time-zones and > http://cldr.unicode.org/translation/timezones > + static final String TZ_DATABASE= > "(?:\\p{L}[\\p{L}\\p{Mc}\\p{Nd}\\p{Zs}\\p{P}&&[^-]]*-?\\p{Zs}?)*"; > + private static final String VALID_TZ = > "((?iu)"+RFC_822_TIME_ZONE+"|"+GMT_OPTION+"|"+TZ_DATABASE+")"; > + > private final SortedMap<String, TimeZone> tzNames= new > TreeMap<String, TimeZone>(String.CASE_INSENSITIVE_ORDER); > > /** > @@ -777,9 +781,6 @@ public class FastDateParser implements D > TimeZoneStrategy(final Locale locale) { > final String[][] zones = > DateFormatSymbols.getInstance(locale).getZoneStrings(); > for (final String[] zone : zones) { > - if (zone[ID].startsWith("GMT")) { > - continue; > - } > final TimeZone tz = TimeZone.getTimeZone(zone[ID]); > if (!tzNames.containsKey(zone[LONG_STD])){ > tzNames.put(zone[LONG_STD], tz); > @@ -795,16 +796,7 @@ public class FastDateParser implements D > tzNames.put(zone[SHORT_DST], tz); > } > } > - } > - > - final StringBuilder sb= new StringBuilder(); > - sb.append("(GMT[+-]\\d{1,2}:\\d{2}").append('|'); > - sb.append("[+-]\\d{4}").append('|'); > - for(final String id : tzNames.keySet()) { > - escapeRegex(sb, id, false).append('|'); > - } > - sb.setCharAt(sb.length()-1, ')'); > - validTimeZoneChars= sb.toString(); > + } > } > > /** > @@ -812,7 +804,7 @@ public class FastDateParser implements D > */ > @Override > boolean addRegex(final FastDateParser parser, final StringBuilder > regex) { > - regex.append(validTimeZoneChars); > + regex.append(VALID_TZ); > return true; > } > > @@ -825,8 +817,8 @@ public class FastDateParser implements D > if(value.charAt(0)=='+' || value.charAt(0)=='-') { > tz= TimeZone.getTimeZone("GMT"+value); > } > - else if(value.startsWith("GMT")) { > - tz= TimeZone.getTimeZone(value); > + else if(value.regionMatches(true, 0, "GMT", 0, 3)) { > + tz= TimeZone.getTimeZone(value.toUpperCase()); > } > else { > tz= tzNames.get(value); > > Modified: > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java?rev=1671734&r1=1671733&r2=1671734&view=diff > > ============================================================================== > --- > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java > (original) > +++ > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/reflect/FieldUtilsTest.java > Tue Apr 7 02:40:49 2015 > @@ -24,8 +24,8 @@ import org.junit.Test; > import java.lang.reflect.Constructor; > import java.lang.reflect.Field; > import java.lang.reflect.Modifier; > -import java.util.ArrayList; > import java.util.Arrays; > +import java.util.Collections; > import java.util.List; > > import static org.junit.Assert.*; > @@ -146,26 +146,36 @@ public class FieldUtilsTest { > FieldUtils.getField(PublicChild.class, " ", true); > } > > + private Field[] allPublicChildFields() { > + Class<? super PublicChild> parentClass = > PublicChild.class.getSuperclass(); > + final Field[] fieldsParent = > parentClass.getDeclaredFields(); > + assertArrayEquals(fieldsParent, > FieldUtils.getAllFields(parentClass)); > + > + final Field[] fieldsPublicChild = > PublicChild.class.getDeclaredFields(); > + return ArrayUtils.addAll(fieldsPublicChild, fieldsParent); > + } > + > + private Field[] allIntegerFields() { > + final Field[] fieldsNumber = Number.class.getDeclaredFields(); > + assertArrayEquals(Number.class.getDeclaredFields(), > FieldUtils.getAllFields(Number.class)); > + final Field[] fieldsInteger = Integer.class.getDeclaredFields(); > + return ArrayUtils.addAll(fieldsInteger, fieldsNumber); > + } > + > @Test > public void testGetAllFields() { > assertArrayEquals(new Field[0], > FieldUtils.getAllFields(Object.class)); > - final Field[] fieldsNumber = Number.class.getDeclaredFields(); > - assertArrayEquals(fieldsNumber, > FieldUtils.getAllFields(Number.class)); > - final Field[] fieldsInteger = Integer.class.getDeclaredFields(); > - assertArrayEquals(ArrayUtils.addAll(fieldsInteger, fieldsNumber), > FieldUtils.getAllFields(Integer.class)); > - assertEquals(5, > FieldUtils.getAllFields(PublicChild.class).length); > + assertArrayEquals(allIntegerFields(), > FieldUtils.getAllFields(Integer.class)); > + > + assertArrayEquals(allPublicChildFields(), > FieldUtils.getAllFields(PublicChild.class)); > } > > @Test > public void testGetAllFieldsList() { > - assertEquals(0, FieldUtils.getAllFieldsList(Object.class).size()); > - final List<Field> fieldsNumber = > Arrays.asList(Number.class.getDeclaredFields()); > - assertEquals(fieldsNumber, > FieldUtils.getAllFieldsList(Number.class)); > - final List<Field> fieldsInteger = > Arrays.asList(Integer.class.getDeclaredFields()); > - final List<Field> allFieldsInteger = new > ArrayList<Field>(fieldsInteger); > - allFieldsInteger.addAll(fieldsNumber); > - assertEquals(allFieldsInteger, > FieldUtils.getAllFieldsList(Integer.class)); > - assertEquals(5, > FieldUtils.getAllFieldsList(PublicChild.class).size()); > + assertEquals(Collections.emptyList(), > FieldUtils.getAllFieldsList(Object.class)); > + assertEquals(Arrays.asList(allIntegerFields()), > FieldUtils.getAllFieldsList(Integer.class)); > + > + assertEquals(Arrays.asList(allPublicChildFields()), > FieldUtils.getAllFieldsList(PublicChild.class)); > } > > @Test > > Modified: > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java > URL: > http://svn.apache.org/viewvc/commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java?rev=1671734&r1=1671733&r2=1671734&view=diff > > ============================================================================== > --- > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java > (original) > +++ > commons/proper/lang/trunk/src/test/java/org/apache/commons/lang3/time/FastDateParserSDFTest.java > Tue Apr 7 02:40:49 2015 > @@ -27,7 +27,6 @@ import java.util.Date; > import java.util.Locale; > import java.util.TimeZone; > > -import org.junit.Ignore; > import org.junit.Test; > import org.junit.runner.RunWith; > import org.junit.runners.Parameterized; > @@ -138,13 +137,11 @@ public class FastDateParserSDFTest { > } > > @Test > - @Ignore // not currently supported > public void testLowerCase() throws Exception { > checkParse(input.toLowerCase(locale)); > } > > @Test > - @Ignore // not currently supported > public void testLowerCasePP() throws Exception { > checkParsePosition(input.toLowerCase(locale)); > } > > 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=1671734&r1=1671733&r2=1671734&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 > Tue Apr 7 02:40:49 2015 > @@ -21,6 +21,7 @@ import static org.junit.Assert.assertFal > import static org.junit.Assert.assertTrue; > > import java.io.Serializable; > +import java.text.DateFormatSymbols; > import java.text.ParseException; > import java.text.SimpleDateFormat; > import java.util.Calendar; > @@ -30,6 +31,7 @@ import java.util.HashMap; > import java.util.Locale; > import java.util.Map; > import java.util.TimeZone; > +import java.util.regex.Pattern; > > import org.apache.commons.lang3.SerializationUtils; > import org.junit.Assert; > @@ -260,21 +262,21 @@ public class FastDateParserTest { > @Test > public void testTzParses() throws Exception { > // Check that all Locales can parse the time formats we use > - for(final Locale locale : Locale.getAvailableLocales()) { > - final FastDateParser fdp= new FastDateParser("yyyy/MM/dd > z", TimeZone.getDefault(), locale); > + for(final Locale locale : Locale.getAvailableLocales()) { > + final FastDateParser fdp= new FastDateParser("yyyy/MM/dd z", > TimeZone.getDefault(), locale); > + > + for(final TimeZone tz : new TimeZone[]{NEW_YORK, REYKJAVIK, > GMT}) { > + final Calendar cal= Calendar.getInstance(tz, locale); > + cal.clear(); > + cal.set(Calendar.YEAR, 2000); > + cal.set(Calendar.MONTH, 1); > + cal.set(Calendar.DAY_OF_MONTH, 10); > + final Date expected= cal.getTime(); > > - for(final TimeZone tz : new TimeZone[]{NEW_YORK, > REYKJAVIK, GMT}) { > - final Calendar cal= Calendar.getInstance(tz, > locale); > - cal.clear(); > - cal.set(Calendar.YEAR, 2000); > - cal.set(Calendar.MONTH, 1); > - cal.set(Calendar.DAY_OF_MONTH, 10); > - final Date expected= cal.getTime(); > - > - final Date actual = fdp.parse("2000/02/10 > "+tz.getDisplayName(locale)); > - Assert.assertEquals("tz:"+tz.getID()+" > locale:"+locale.getDisplayName(), expected, actual); > - } > - } > + final Date actual = fdp.parse("2000/02/10 > "+tz.getDisplayName(locale)); > + Assert.assertEquals("tz:"+tz.getID()+" > locale:"+locale.getDisplayName(), expected, actual); > + } > + } > } > > > @@ -640,4 +642,19 @@ public class FastDateParserTest { > } > } > > + @Test > + public void testTimeZoneStrategyPattern() { > + Pattern tz = > Pattern.compile(FastDateParser.TimeZoneStrategy.TZ_DATABASE); > + Assert.assertFalse(tz.matcher("GMT-1234").matches()); > + > + for (Locale locale : Locale.getAvailableLocales()) { > + final String[][] zones = > DateFormatSymbols.getInstance(locale).getZoneStrings(); > + for (final String[] zone : zones) { > + for (String zoneExpr : zone) { > + Assert.assertTrue(locale.getDisplayName() + ":" + > zoneExpr, tz.matcher(zoneExpr).matches()); > + } > + } > + } > + } > + > } > > > -- http://people.apache.org/~britter/ http://www.systemoutprintln.de/ http://twitter.com/BenediktRitter http://github.com/britter