xref: /aosp_15_r20/external/apache-commons-lang/src/site/resources/release-notes/RELEASE-NOTES-3.6.txt (revision 455610af95f3bf5f4bc8a9eda520f57e389a4c42)
1
2Licensed to the Apache Software Foundation (ASF) under one or more
3contributor license agreements.  See the NOTICE file distributed with
4this work for additional information regarding copyright ownership.
5The ASF licenses this file to You under the Apache License, Version 2.0
6(the "License"); you may not use this file except in compliance with
7the License.  You may obtain a copy of the License at
8
9http://www.apache.org/licenses/LICENSE-2.0
10
11Unless required by applicable law or agreed to in writing, software
12distributed under the License is distributed on an "AS IS" BASIS,
13WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14See the License for the specific language governing permissions and
15limitations under the License.
16
17=============================================================================
18
19                           Apache Commons Lang
20                               Version 3.6
21                              Release Notes
22
23
24INTRODUCTION:
25
26This document contains the release notes for the 3.6 version of
27Apache Commons Lang as well as a history all changes in the Commons Lang 3.x
28release line. Commons Lang is a set of utility functions and reusable
29components that should be of use in any Java environment. Commons Lang 3.6 at
30least requires Java 7.0. Note that this has changed from Commons Lang 3.5, which
31only required Java 1.6.
32
33For the advice on upgrading from 2.x to 3.x, see the following page:
34
35    https://commons.apache.org/lang/article3_0.html
36
37HIGHLIGHTS
38==========
39
40Some of the highlights in this release include:
41
42o The class org.apache.commons.lang3.concurrent.Memoizer is an implementation
43    of the Memoizer pattern as shown in
44    Goetz, Brian et al. (2006) - Java Concurrency in Practice, p. 108.
45o The class org.apache.commons.lang3.ArchUtils has been added. ArchUtils is
46    a utility class for the "os.arch" system property.
47
48DEPRECATIONS
49============
50
51The Apache Commons Community has recently set up the Commons Text component
52as a home for algorithms working on strings. For this reason most of the string
53focused functionality in Commons Lang has been deprecated and moved to
54Commons Text. This includes:
55
56o All classes in the org.apache.commons.lang3.text and the
57    org.apache.commons.lang3.text.translate packages
58o org.apache.commons.lang3.StringEscapeUtils
59o org.apache.commons.lang3.RandomStringUtils
60o The methods org.apache.commons.lang3.StringUtils.getJaroWinklerDistance and
61    org.apache.commons.lang3.StringUtils.getLevenshteinDistance
62
63For more information see the Commons Text website:
64
65    https://commons.apache.org/text
66
67The class org.apache.commons.lang3.CharEncoding has been deprecated in favor of
68java.nio.charset.StandardCharsets.
69
70The following methods have been deprecated in
71org.apache.commons.lang3.ArrayUtils in favor of the corresponding insert
72methods. Note that the handling for null inputs differs between add and insert.
73
74o add(boolean[], int, boolean) -> insert(int, boolean[], boolean...)
75o add(byte[], int, boolean)    -> insert(int, byte[], byte...)
76o add(char[], int, boolean)    -> insert(int, char[], char...)
77o add(double[], int, boolean)  -> insert(int, double[], double...)
78o add(float[], int, boolean)   -> insert(int, float[], float...)
79o add(int[], int, boolean)     -> insert(int, int[], int...)
80o add(long[], int, boolean)    -> insert(int, long[], long...)
81o add(short[], int, boolean)   -> insert(int, short[], short...)
82o add(T[], int, boolean)       -> insert(int, T[], T...)
83
84
85COMPATIBILITY WITH JAVA 9
86==================
87
88The MANIFEST.MF now contains an additional entry:
89
90  Automatic-Module-Name: org.apache.commons.lang3
91
92This should make it possible to use Commons Lang 3.6 as a module in the Java 9
93module system. For more information see the corresponding issue and the
94referenced mailing list discussions:
95
96    https://issues.apache.org/jira/browse/LANG-1338
97
98The build problems present in the 3.5 release have been resolved. Building
99Commons Lang 3.6 should work out of the box with the latest Java 9 EA build.
100Please report any Java 9 related issues at:
101
102    https://issues.apache.org/jira/browse/LANG
103
104NEW FEATURES
105============
106
107o LANG-1336: Add NUL Byte To CharUtils. Thanks to Beluga Behr.
108o LANG-1304: Add method in StringUtils to determine if string contains both
109             mixed cased characters. Thanks to Andy Klimczak.
110o LANG-1325: Increase test coverage of ToStringBuilder class to 100%.
111             Thanks to Arshad Basha.
112o LANG-1307: Add a method in StringUtils to extract only digits out of input
113             string. Thanks to Arshad Basha.
114o LANG-1256: Add JMH maven dependencies. Thanks to C0rWin.
115o LANG-1167: Add null filter to ReflectionToStringBuilder.
116             Thanks to Mark Dacek.
117o LANG-1299: Add method for converting string to an array of code points.
118o LANG-660:  Add methods to insert arrays into arrays at an index.
119o LANG-1034: Add support for recursive comparison to
120             EqualsBuilder#reflectionEquals. Thanks to Yathos UG.
121o LANG-1067: Add a reflection-based variant of DiffBuilder.
122o LANG-740:  Implementation of a Memoizer. Thanks to James Sawle.
123o LANG-1258: Add ArrayUtils#toStringArray method.
124             Thanks to IG, Grzegorz Rożniecki.
125o LANG-1160: StringUtils#abbreviate should support 'custom ellipses' parameter.
126o LANG-1293: Add StringUtils#isAllEmpty and #isAllBlank methods.
127             Thanks to Pierre Templier, Martin Tarjanyi.
128o LANG-1313: Add ArchUtils - An utility class for the "os.arch" system property.
129             Thanks to Tomschi.
130o LANG-1272: Add shuffle methods to ArrayUtils.
131o LANG-1317: Add MethodUtils#findAnnotation and extend
132             MethodUtils#getMethodsWithAnnotation for non-public, super-class
133             and interface methods. Thanks to Yasser Zamani.
134o LANG-1331: Add ImmutablePair.nullPair().
135o LANG-1332: Add ImmutableTriple.nullTriple().
136
137FIXED BUGS
138==========
139
140o LANG-1337: Fix test failures in IBM JDK 8 for ToStringBuilderTest.
141o LANG-1319: MultilineRecursiveToStringStyle StackOverflowError when object is
142             an array.
143o LANG-1320: LocaleUtils#toLocale does not support language followed by UN M.49
144             numeric-3 area code followed by variant.
145o LANG-1300: Clarify or improve behavior of int-based indexOf methods in
146             StringUtils. Thanks to Mark Dacek.
147o LANG-1286: RandomStringUtils random method can overflow and return characters
148             outside of specified range.
149o LANG-1292: WordUtils.wrap throws StringIndexOutOfBoundsException.
150o LANG-1287: RandomStringUtils#random can enter infinite loop if end parameter
151             is to small. Thanks to Ivan Morozov.
152o LANG-1285: NullPointerException in FastDateParser$TimeZoneStrategy.
153             Thanks to Francesco Chicchiriccò.
154o LANG-1281: Javadoc of StringUtils.ordinalIndexOf is contradictory.
155             Thanks to Andreas Lundblad.
156o LANG-1188: StringUtils#join(T...): warning: [unchecked] Possible heap
157             pollution from parameterized vararg type T.
158o LANG-1144: Multiple calls of
159             org.apache.commons.lang3.concurrent.LazyInitializer.initialize()
160             are possible. Thanks to Waldemar Maier, Gary Gregory.
161o LANG-1276: StrBuilder#replaceAll ArrayIndexOutOfBoundsException.
162             Thanks to Andy Klimczak.
163o LANG-1278: BooleanUtils javadoc issues. Thanks to Duke Yin.
164o LANG-1070: ArrayUtils#add confusing example in javadoc.
165             Thanks to Paul Pogonyshev.
166o LANG-1271: StringUtils#isAnyEmpty and #isAnyBlank should return false for an
167             empty array. Thanks to Pierre Templier.
168o LANG-1155: Add StringUtils#unwrap. Thanks to Saif Asif, Thiago Andrade.
169o LANG-1311: TypeUtils.toString() doesn't handle primitive and Object arrays
170             correctly. Thanks to Aaron Digulla.
171o LANG-1312: LocaleUtils#toLocale does not support language followed by UN M.49
172             numeric-3 area code.
173o LANG-1265: Build failures when building with Java 9 EA.
174o LANG-1314: javadoc creation broken with Java 8. Thanks to Allon Murienik.
175o LANG-1310: MethodUtils.invokeMethod throws ArrayStoreException if using
176             varargs arguments and smaller types than the method defines.
177             Thanks to Don Jeba.
178
179CHANGES
180=======
181
182o LANG-1338: Add Automatic-Module-Name MANIFEST entry for Java 9
183             compatibility.
184o LANG-1334: Deprecate CharEncoding in favour of
185             java.nio.charset.StandardCharsets.
186o LANG-1110: Implement HashSetvBitSetTest using JMH.
187             Thanks to Bruno P. Kinoshita.
188o LANG-1290: Increase test coverage of org.apache.commons.lang3.ArrayUtils.
189             Thanks to Andrii Abramov.
190o LANG-1274: StrSubstitutor should state its thread safety.
191o LANG-1277: StringUtils#getLevenshteinDistance reduce memory consumption.
192             Thanks to yufcuy.
193o LANG-1279: Update Java requirement from Java 6 to 7.
194o LANG-1143: StringUtils should use toXxxxCase(int) rather than
195             toXxxxCase(char). Thanks to sebb.
196o LANG-1297: Add SystemUtils.getHostName() API.
197o LANG-1301: Moving apache-rat-plugin configuration into pluginManagement.
198             Thanks to Karl Heinz Marbaise.
199o LANG-1316: Deprecate classes/methods moved to commons-text.
200
201=============================================================================
202
203                        Release Notes for version 3.5
204
205
206HIGHLIGHTS
207==========
208
209Some of the highlights in this release include:
210
211o Added Java 9 detection to org.apache.commons.lang3.SystemUtils.
212o Support for shifting and swapping elements in
213    org.apache.commons.lang3.ArrayUtils.
214o New methods for generating random strings from different character classes
215    including alphabetic, alpha-numeric and ASCII added to
216    org.apache.commons.lang3.RandomStringUtils.
217o Numerous extensions to org.apache.commons.lang3.StringUtils including
218    null safe compare variants, more remove and replace variants, rotation and
219    truncation.
220o Added org.apache.commons.lang3.ThreadUtils - a utility class to work with
221    instances of java.lang.Thread and java.lang.ThreadGroup.
222o Added annotations @EqualsExclude, @HashCodeExclude and @ToStringExclude to
223    mark fields which should be ignored by the reflective builders in the
224    org.apache.commons.lang3.builder package.
225o Support for various modify and retrieve value use cases added to the classes
226    in org.apache.commons.lang3.mutable.
227
228COMPATIBILITY
229=============
230
231Apache Commons Lang 3.5 is binary compatible with the 3.4 release. Users
232should not experience any problems when upgrading from 3.4 to 3.5.
233
234There has been an addition to the org.apache.commons.lang3.time.DatePrinter
235interface:
236
237o Added method 'public boolean parse(java.lang.String, java.text.ParsePosition,
238    java.util.Calendar)'
239o Added method 'public java.lang.Appendable format(long, java.lang.Appendable)'
240o Added method 'public java.lang.Appendable format(java.util.Date,
241    java.lang.Appendable)'
242o Added method 'public java.lang.Appendable format(java.util.Calendar,
243    java.lang.Appendable)'
244
245For this reason 3.5 is not strictly source compatible to 3.4. Since the
246DatePrinter interface is not meant to be implemented by clients, this
247change it not considered to cause any problems.
248
249JAVA 9 SUPPORT
250==============
251
252Java 9 introduces a new version-string scheme. Details of this new scheme are
253documented in JEP-223 (https://openjdk.org/jeps/223). In order to support
254JEP-223 two classes had to be changed:
255
256o org.apache.commons.lang3.JavaVersion
257    deprecated enum constant JAVA_1_9
258    introduced enum constant JAVA_9
259
260o org.apache.commons.lang3.SystemUtils
261    deprecated constant IS_JAVA_1_9
262    introduced constant IS_JAVA_9
263
264For more information see LANG-1197
265(https://issues.apache.org/jira/browse/LANG-1197). All other APIs are expected
266to work with Java 9.
267
268BUILDING ON JAVA 9
269==================
270
271Java 8 introduced the Unicode Consortium's Common Locale Data Repository as
272alternative source for locale data. Java 9 will use the CLDR provider as
273default provider for locale data (see https://openjdk.org/jeps/252). This
274causes an number of locale-sensitive test in Commons Lang to fail. In order
275to build Commons Lang 3.5 on Java 9, the locale provider has to be set to
276'JRE':
277
278    mvn -Djava.locale.providers=JRE clean install
279
280We are currently investigating ways to support building on Java 9 without
281further configuration. For more information see:
282https://issues.apache.org/jira/browse/LANG-1265
283
284
285NEW FEATURES
286==============
287
288o LANG-1275: Added a tryAcquire() method to TimedSemaphore.
289o LANG-1255: Add DateUtils.toCalendar(Date, TimeZone). Thanks to Kaiyuan Wang.
290o LANG-1023: Add WordUtils.wrap overload with customizable breakable character.
291             Thanks to Marko Bekhta.
292o LANG-787:  Add method removeIgnoreCase(String, String) to StringUtils. Thanks
293             to Gokul Nanthakumar C.
294o LANG-1224: Extend RandomStringUtils with methods that generate strings
295             between a min and max length. Thanks to Caleb Cushing.
296o LANG-1257: Add APIs StringUtils.wrapIfMissing(String, char|String). Thanks to
297             Gary Gregory.
298o LANG-1253: Add RandomUtils#nextBoolean() method. Thanks to adilek.
299o LANG-1085: Add a circuit breaker implementation. Thanks to Oliver Heger and
300             Bruno P. Kinoshita.
301o LANG-1013: Add StringUtils.truncate(). Thanks to Thiago Andrade.
302o LANG-1195: Enhance MethodUtils to allow invocation of private methods. Thanks
303             to Derek C. Ashmore.
304o LANG-1189: Add getAndIncrement/getAndDecrement/getAndAdd/incrementAndGet/
305             decrementAndGet/addAndGet in Mutable* classes. Thanks to
306             Haiyang Li and Matthew Bartenschlag.
307o LANG-1225: Add RandomStringUtils#randomGraph and #randomPrint which match
308             corresponding regular expression class. Thanks to Caleb Cushing.
309o LANG-1223: Add StopWatch#getTime(TimeUnit). Thanks to Nick Manley.
310o LANG-781:  Add methods to ObjectUtils class to check for null elements in the
311             array. Thanks to Krzysztof Wolny.
312o LANG-1228: Prefer Throwable.getCause() in ExceptionUtils.getCause().
313             Thanks to Brad Hess.
314o LANG-1233: DiffBuilder add method to allow appending from a DiffResult.
315             Thanks to Nick Manley.
316o LANG-1168: Add SystemUtils.IS_OS_WINDOWS_10 property.
317             Thanks to Pascal Schumacher.
318o LANG-1115: Add support for varargs in ConstructorUtils, MemberUtils, and
319             MethodUtils. Thanks to Jim Lloyd and Joe Ferner.
320o LANG-1134: Add methods to check numbers against NaN and infinite to
321             Validate. Thanks to Alan Smithee.
322o LANG-1220: Add tests for missed branches in DateUtils.
323             Thanks to Casey Scarborough.
324o LANG-1146: z/OS identification in SystemUtils.
325             Thanks to Gabor Liptak.
326o LANG-1192: FastDateFormat support of the week-year component (uppercase 'Y').
327             Thanks to Dominik Stadler.
328o LANG-1169: Add StringUtils methods to compare a string to multiple strings.
329             Thanks to Rafal Glowinski, Robert Parr and Arman Sharif.
330o LANG-1185: Add remove by regular expression methods in StringUtils.
331o LANG-1139: Add replace by regular expression methods in StringUtils.
332o LANG-1171: Add compare methods in StringUtils.
333o LANG-1174: Add sugar to RandomUtils. Thanks to Punkratz312.
334o LANG-1154: FastDateFormat APIs that use a StringBuilder. Thanks to
335             Gary Gregory.
336o LANG-1149: Ability to throw checked exceptions without declaring them. Thanks
337             to Gregory Zak.
338o LANG-1153: Implement ParsePosition api for FastDateParser.
339o LANG-1137: Add check for duplicate event listener in EventListenerSupport.
340             Thanks to Matthew Aguirre.
341o LANG-1135: Add method containsAllWords to WordUtils. Thanks to
342             Eduardo Martins.
343o LANG-1132: ReflectionToStringBuilder doesn't throw IllegalArgumentException
344             when the constructor's object param is null. Thanks to Jack Tan.
345o LANG-701:  StringUtils join with var args. Thanks to James Sawle.
346o LANG-1105: Add ThreadUtils - A utility class which provides helper methods
347             related to java.lang.Thread  Issue: LANG-1105. Thanks to
348             Hendrik Saly.
349o LANG-1031: Add annotations to exclude fields from ReflectionEqualsBuilder,
350             ReflectionToStringBuilder and ReflectionHashCodeBuilder. Thanks
351             to Felipe Adorno.
352o LANG-1127: Use JUnit rules to set and reset the default Locale and TimeZone.
353o LANG-1119: Add rotate(string, int) method to StringUtils. Thanks to
354             Loic Guibert.
355o LANG-1099: Add swap and shift operations for arrays to ArrayUtils. Thanks to
356             Adrian Ber.
357o LANG-1050: Change nullToEmpty methods to generics. Thanks to James Sawle.
358o LANG-1074: Add a method to ArrayUtils for removing all occurrences of a given
359             element  Issue: LANG-1074. Thanks to Haiyang Li.
360
361FIXED BUGS
362============
363
364o LANG-1261: ArrayUtils.contains returns false for instances of subtypes.
365o LANG-1252: Rename NumberUtils.isNumber, isCreatable to better reflect
366             createNumber. Also, accommodated for "+" symbol as prefix in
367             isCreatable and isNumber. Thanks to Rob Tompkins.
368o LANG-1230: Remove unnecessary synchronization from registry lookup in
369             EqualsBuilder and HashCodeBuilder. Thanks to Philippe Marschall.
370o LANG-1214: Handle "void" in ClassUtils.getClass(). Thanks to Henry Tung.
371o LANG-1250: SerializationUtils#deserialize has unnecessary code and a comment
372             for that. Thanks to Glease Wang.
373o LANG-1190: TypeUtils.isAssignable throws NullPointerException when fromType
374             has type variables and toType generic superclass specifies type
375             variable. Thanks to Pascal Schumacher.
376o LANG-1226: StringUtils#normalizeSpace does not trim the string anymore.
377             Thanks to Pascal Schumacher.
378o LANG-1251: SerializationUtils.ClassLoaderAwareObjectInputStream should use
379             static initializer to initialize primitiveTypes map. Thanks to
380             Takuya Ueshin.
381o LANG-1248: FastDatePrinter Memory allocation regression. Thanks to
382             Benoit Wiart.
383o LANG-1018: Fix precision loss on NumberUtils.createNumber(String). Thanks to
384             Nick Manley.
385o LANG-1199: Fix implementation of StringUtils.getJaroWinklerDistance(). Thanks
386             to M. Steiger.
387o LANG-1244: Fix dead links in StringUtils.getLevenshteinDistance() javadoc.
388             Thanks to jjbankert.
389o LANG-1242: "\u2284":"?" mapping missing from
390             EntityArrays#HTML40_EXTENDED_ESCAPE. Thanks to Neal Stewart.
391o LANG-901:  StringUtils#startsWithAny/endsWithAny is case sensitive -
392             documented as case insensitive. Thanks to Matthew Bartenschlag.
393o LANG-1232: DiffBuilder: Add null check on fieldName when appending Object or
394             Object[]. Thanks to Nick Manley.
395o LANG-1178: ArrayUtils.removeAll(Object array, int... indices) should do the
396             clone, not its callers. Thanks to Henri Yandell.
397o LANG-1120: StringUtils.stripAccents should remove accents from "Ł" and "ł".
398             Thanks to kaching88.
399o LANG-1205: NumberUtils.createNumber() behaves inconsistently with
400             NumberUtils.isNumber(). Thanks to pbrose.
401o LANG-1222: Fix for incorrect comment on StringUtils.containsIgnoreCase
402             method. Thanks to Adam J.
403o LANG-1221: Fix typo on appendIfMissing javadoc. Thanks to Pierre Templier.
404o LANG-1202: parseDateStrictly doesn't pass specified locale. Thanks to
405             Markus Jelsma.
406o LANG-1219: FastDateFormat doesn't respect summer daylight in some localized
407             strings. Thanks to Jarek.
408o LANG-1175: Remove Ant-based build.
409o LANG-1194: Limit max heap memory for consistent Travis CI build.
410o LANG-1186: Fix NullPointerException in FastDateParser$TimeZoneStrategy.
411             Thanks to NickManley.
412o LANG-1193: ordinalIndexOf("abc", "ab", 1) gives incorrect answer of -1
413             (correct answer should be 0); revert fix for LANG-1077. Thanks to
414             Qin Li.
415o LANG-1002: Several predefined ISO FastDateFormats in DateFormatUtils are
416             incorrect. Thanks to Michael Osipov.
417o LANG-1152: StringIndexOutOfBoundsException or field over-write for large year
418             fields in FastDateParser. Thanks to Pas Filip.
419o LANG-1141: StrLookup.systemPropertiesLookup() no longer reacts on changes on
420             system properties.
421o LANG-1147: EnumUtils *BitVector issue with more than 32 values Enum. Thanks
422             to Loic Guibert.
423o LANG-1059: Capitalize javadoc is incorrect. Thanks to Colin Casey.
424o LANG-1122: Inconsistent behavior of swap for malformed inputs. Thanks to
425             Adrian Ber.
426o LANG-1130: Fix critical issues reported by SonarQube.
427o LANG-1131: StrBuilder.equals(StrBuilder) doesn't check for null inputs.
428o LANG-1128: JsonToStringStyle doesn't handle chars and objects correctly.
429             Thanks to Jack Tan.
430o LANG-1126: DateFormatUtilsTest.testSMTP depends on the default Locale.
431o LANG-1123: Unit test FastDatePrinterTimeZonesTest needs a timezone set.
432             Thanks to Christian P. Momon.
433o LANG-916:  DateFormatUtils.format does not correctly change Calendar
434             TimeZone in certain situations. Thanks to Christian P. Momon.
435o LANG-1116: DateUtilsTest.testLang530 fails for some timezones. Thanks to
436             Aaron Sheldon.
437o LANG-1114: TypeUtils.ParameterizedType#equals doesn't work with wildcard
438             types. Thanks to Andy Coates.
439o LANG-1118: StringUtils.repeat('z', -1) throws NegativeArraySizeException.
440             Thanks to Loic Guibert.
441o LANG-1111: Fix FindBugs warnings in DurationFormatUtils.
442o LANG-1162: StringUtils#equals fails with Index OOBE on non-Strings with
443             identical leading prefix..
444o LANG-1163: There are no tests for CharSequenceUtils.regionMatches.
445o LANG-1200: Fix Javadoc of StringUtils.ordinalIndexOf. Thanks to BarkZhang.
446o LANG-1191: Incorrect Javadoc
447             StringUtils.containsAny(CharSequence, CharSequence...). Thanks to
448             qed, Brent Worden and Gary Gregory.
449
450CHANGES
451=========
452o LANG-1197: Prepare Java 9 detection.
453o LANG-1262: CompareToBuilder.append(Object, Object, Comparator) method is too
454             big to be inlined. Thanks to Ruslan Cheremin.
455o LANG-1259: Javadoc for ArrayUtils.isNotEmpty() is slightly misleading. Thanks
456             to Dominik Stadler.
457o LANG-1247: FastDatePrinter generates extra Date objects. Thanks to
458             Benoit Wiart.
459o LANG-1229: HashCodeBuilder.append(Object,Object) is too big to be inlined,
460             which prevents whole builder to be scalarized. Thanks to
461             Ruslan Cheremin.
462o LANG-1243: Simplify ArrayUtils removeElements by using new decrementAndGet()
463             method.
464o LANG-1240: Optimize BitField constructor implementation. Thanks to zhanhb.
465o LANG-1206: Improve CharSetUtils.squeeze() performance. Thanks to
466             Mohammed Alfallaj.
467o LANG-1176: Improve ArrayUtils removeElements time complexity to O(n). Thanks
468             to Jeffery Yuan.
469o LANG-1234: getLevenshteinDistance with a threshold: optimize implementation
470             if the strings lengths differ more than the threshold. Thanks to
471             Jonatan Jönsson.
472o LANG-1151: Performance improvements for NumberUtils.isParsable. Thanks to
473             Juan Pablo Santos Rodríguez.
474o LANG-1218: EqualsBuilder.append(Object,Object) is too big to be inlined,
475             which prevents whole builder to be scalarized. Thanks to
476             Ruslan Cheremin.
477o LANG-1210: StringUtils#startsWithAny has error in Javadoc. Thanks to
478             Matthias Niehoff.
479o LANG-1208: StrSubstitutor can preserve escapes. Thanks to Samuel Karp.
480o LANG-1182: Clarify Javadoc of StringUtils.containsAny(). Thanks to
481             Larry West and Pascal Schumacher.
482o LANG-1183: Making replacePattern/removePattern methods null safe in
483             StringUtils.
484o LANG-1057: Replace StringBuilder with String concatenation for better
485             optimization. Thanks to Otávio Santana.
486o LANG-1075: Deprecate SystemUtils.FILE_SEPARATOR and
487             SystemUtils.PATH_SEPARATOR.
488o LANG-979:  TypeUtils.parameterizeWithOwner - wrong format descriptor for
489             "invalid number of type parameters". Thanks to Bruno P. Kinoshita.
490o LANG-1112: MultilineRecursiveToStringStyle largely unusable due to being
491             package-private.
492o LANG-1058: StringUtils.uncapitalize performance improvement. Thanks to
493             Leo Wang.
494o LANG-1069: CharSet.getInstance documentation does not clearly explain how
495             to include negation character in set. Thanks to Arno Noordover.
496o LANG-1107: Fix parsing edge cases in FastDateParser.
497o LANG-1273: Added new property IS_OS_MAC_OSX_EL_CAPITAN in SystemUtils. Thanks
498             to Jake Wang.
499
500=============================================================================
501
502                        Release Notes for version 3.4
503
504
505COMPATIBILITY
506=============
507
508Commons Lang 3.4 is fully binary compatible to the last release and can
509therefore be used as a drop in replacement for 3.3.2. Note that the value of
510org.apache.commons.lang3.time.DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN
511has changed, which may affect clients using the constant. Furthermore the
512constant is used internally in
513o DurationFormatUtils.formatDurationISO(long)
514o DurationFormatUtils.formatPeriodISO(long, long)
515
516For more information see https://issues.apache.org/jira/browse/LANG-1000.
517
518NEW FEATURES
519==============
520
521o LANG-821:  Support OS X versions in SystemUtils. Thanks to Timo Kockert.
522o LANG-1103: Add SystemUtils.IS_JAVA_1_9
523o LANG-1093: Add ClassUtils.getAbbreviatedName(). Thanks to Fabian Lange.
524o LANG-1082: Add option to disable the "objectsTriviallyEqual" test in
525             DiffBuilder. Thanks to Jonathan Baker.
526o LANG-1015: Add JsonToStringStyle implementation to ToStringStyle. Thanks to
527             Thiago Andrade.
528o LANG-1080: Add NoClassNameToStringStyle implementation of ToStringStyle.
529             Thanks to Innokenty Shuvalov.
530o LANG-883:  Add StringUtils.containsAny(CharSequence, CharSequence...) method.
531             Thanks to Daniel Stewart.
532o LANG-1052: Multiline recursive to string style. Thanks to Jan Matèrne.
533o LANG-536:  Add isSorted() to ArrayUtils. Thanks to James Sawle.
534o LANG-1033: Add StringUtils.countMatches(CharSequence, char)
535o LANG-1021: Provide methods to retrieve all fields/methods annotated with a
536             specific type. Thanks to Alexander Müller.
537o LANG-1016: NumberUtils#isParsable method(s). Thanks to
538             Juan Pablo Santos Rodríguez.
539o LANG-999:  Add fuzzy String matching logic to StringUtils. Thanks to
540             Ben Ripkens.
541o LANG-994:  Add zero copy read method to StrBuilder. Thanks to
542             Mikhail Mazursky.
543o LANG-993:  Add zero copy write method to StrBuilder. Thanks to
544             Mikhail Mazursky.
545o LANG-1044: Add method MethodUtils.invokeExactMethod(Object, String)
546o LANG-1045: Add method MethodUtils.invokeMethod(Object, String)
547
548FIXED BUGS
549============
550
551o LANG-794:  SystemUtils.IS_OS_WINDOWS_2008, VISTA are incorrect. Thanks to
552             Timo Kockert.
553o LANG-1104: Parse test fails for TimeZone America/Sao_Paulo
554o LANG-948:  Exception while using ExtendedMessageFormat and escaping braces.
555             Thanks to Andrey Khobnya.
556o LANG-1092: Wrong formatting of time zones with daylight saving time in
557             FastDatePrinter
558o LANG-1090: FastDateParser does not set error indication in ParsePosition
559o LANG-1089: FastDateParser does not handle excess hours as per
560             SimpleDateFormat
561o LANG-1061: FastDateParser error - timezones not handled correctly. Thanks to
562             dmeneses.
563o LANG-1087: NumberUtils#createNumber() returns positive BigDecimal when
564             negative Float is expected. Thanks to Renat Zhilkibaev.
565o LANG-1081: DiffBuilder.append(String, Object left, Object right) does not do
566             a left.equals(right) check. Thanks to Jonathan Baker.
567o LANG-1055: StrSubstitutor.replaceSystemProperties does not work consistently.
568             Thanks to Jonathan Baker.
569o LANG-1083: Add (T) casts to get unit tests to pass in old JDK. Thanks to
570             Jonathan Baker.
571o LANG-1073: Read wrong component type of array in add in ArrayUtils.
572             Thanks to haiyang li.
573o LANG-1077: StringUtils.ordinalIndexOf("aaaaaa", "aa", 2) != 3 in StringUtils.
574             Thanks to haiyang li.
575o LANG-1072: Duplicated "0x" check in createBigInteger in NumberUtils. Thanks
576             to haiyang li.
577o LANG-1064: StringUtils.abbreviate description doesn't agree with the
578             examples. Thanks to B.J. Herbison.
579o LANG-1041: Fix MethodUtilsTest so it does not depend on JDK method ordering.
580             Thanks to Alexandre Bartel.
581o LANG-1000: ParseException when trying to parse UTC dates with Z as zone
582             designator using DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT
583o LANG-1035: Javadoc for EqualsBuilder.reflectionEquals() is unclear
584o LANG-1001: ISO 8601 misspelled throughout the Javadocs. Thanks to
585             Michael Osipov.
586o LANG-1088: FastDateParser should be case insensitive
587o LANG-995:  Fix bug with stripping spaces on last line in WordUtils.wrap().
588             Thanks to Andrey Khobnya.
589
590CHANGES
591=========
592
593o LANG-1102: Make logic for comparing OS versions in SystemUtils smarter
594o LANG-1091: Shutdown thread pools in test cases. Thanks to Fabian Lange.
595o LANG-1101: FastDateParser and FastDatePrinter support 'X' format
596o LANG-1100: Avoid memory allocation when using date formatting to StringBuffer.
597             Thanks to mbracher.
598o LANG-935:  Possible performance improvement on string escape functions.
599             Thanks to Fabian Lange, Thomas Neidhart.
600o LANG-1098: Avoid String allocation in StrBuilder.append(CharSequence). Thanks
601             to Mikhail Mazurskiy, Fabian Lange.
602o LANG-1098: Update maven-checkstyle-plugin to 2.14. Thanks to Micha? Kordas.
603o LANG-1097: Update org.easymock:easymock to 3.3.1. Thanks to Micha? Kordas.
604o LANG-1096: Update maven-pmd-plugin to 3.4. Thanks to Micha? Kordas.
605o LANG-1095: Update maven-antrun-plugin to 1.8. Thanks to Micha? Kordas.
606o LANG-877:  Performance improvements for StringEscapeUtils. Thanks to
607             Fabian Lange.
608o LANG-1071: Fix wrong examples in Javadoc of
609             StringUtils.replaceEachRepeatedly(...),
610             StringUtils.replaceEach(...) Thanks to Arno Noordover.
611o LANG-827:  CompareToBuilder's doc doesn't specify precedence of fields it
612             uses in performing comparisons
613o LANG-1020: Improve performance of normalize space. Thanks to Libor Ondrusek.
614o LANG-1027: org.apache.commons.lang3.SystemUtils#isJavaVersionAtLeast should
615             return true by default
616o LANG-1026: Bring static method references in StringUtils to consistent style.
617             Thanks to Alex Yursha.
618o LANG-1017: Use non-ASCII digits in Javadoc examples for
619             StringUtils.isNumeric. Thanks to Christoph Schneegans.
620o LANG-1008: Change min/max methods in NumberUtils/IEEE754rUtils from array
621             input parameters to varargs. Thanks to Thiago Andrade.
622o LANG-1006: Add wrap (with String or char) to StringUtils. Thanks to
623             Thiago Andrade.
624o LANG-1005: Extend DurationFormatUtils#formatDurationISO default pattern to
625             match #formatDurationHMS. Thanks to Michael Osipov.
626o LANG-1007: Fixing NumberUtils JAVADoc comments for max methods. Thanks to
627             Thiago Andrade.
628o LANG-731:  Better Javadoc for BitField class
629o LANG-1004: DurationFormatUtils#formatDurationHMS implementation does not
630             correspond to Javadoc and vice versa. Thanks to Michael Osipov.
631o LANG-1003: DurationFormatUtils are not able to handle negative
632             durations/periods
633o LANG-998:  Javadoc is not clear on preferred pattern to instantiate
634             FastDateParser / FastDatePrinter
635
636=============================================================================
637
638                        Release Notes for version 3.3.2
639
640NEW FEATURES
641==============
642
643o LANG-989:  Add org.apache.commons.lang3.SystemUtils.IS_JAVA_1_8
644
645FIXED BUGS
646============
647
648o LANG-992:  NumberUtils#isNumber() returns false for "0.0", "0.4790", et al
649
650=============================================================================
651
652                        Release Notes for version 3.3.1
653
654FIXED BUGS
655============
656
657o LANG-987:  DateUtils.getFragmentInDays(Date, Calendar.MONTH) returns wrong
658             days
659o LANG-983:  DurationFormatUtils does not describe format string fully
660o LANG-981:  DurationFormatUtils#lexx does not detect unmatched quote char
661o LANG-984:  DurationFormatUtils does not handle large durations correctly
662o LANG-982:  DurationFormatUtils.formatDuration(61999, "s.SSSS") - ms field
663             size should be 4 digits
664o LANG-978:  Failing tests with Java 8 b128
665
666=============================================================================
667
668                        Release Notes for version 3.3
669
670NEW FEATURES
671==============
672
673o LANG-955:  Add methods for removing all invalid characters according to
674             XML 1.0 and XML 1.1 in an input string to StringEscapeUtils.
675             Thanks to Adam Hooper.
676o LANG-970:  Add APIs MutableBoolean setTrue() and setFalse()
677o LANG-962:  Add SerializationUtils.roundtrip(T extends Serializable) to
678             serialize then deserialize
679o LANG-637:  There should be a DifferenceBuilder with a
680             ReflectionDifferenceBuilder implementation
681o LANG-944:  Add the Jaro-Winkler string distance algorithm to StringUtils.
682             Thanks to Rekha Joshi.
683o LANG-417:  New class ClassPathUtils with methods for turning FQN into
684             resource path
685o LANG-834:  Validate: add inclusiveBetween and exclusiveBetween overloads
686             for primitive types
687o LANG-900:  New RandomUtils class. Thanks to Duncan Jones.
688o LANG-966:  Add IBM OS/400 detection
689
690FIXED BUGS
691============
692
693o LANG-621:  ReflectionToStringBuilder.toString does not debug 3rd party object
694             fields within 3rd party object. Thanks to Philip Hodges,
695             Thomas Neidhart.
696o LANG-977:  NumericEntityEscaper incorrectly encodes supplementary characters.
697             Thanks to Chris Karcher.
698o LANG-973:  Make some private fields final
699o LANG-971:  NumberUtils#isNumber(String) fails to reject invalid Octal numbers
700o LANG-972:  NumberUtils#isNumber does not allow for hex 0XABCD
701o LANG-969:  StringUtils.toEncodedString(byte[], Charset) needlessly throws
702             UnsupportedEncodingException. Thanks to Matt Bishop.
703o LANG-946:  ConstantInitializerTest fails when building with IBM JDK 7
704o LANG-954:  uncaught PatternSyntaxException in FastDateFormat on Android.
705             Thanks to Michael Keppler.
706o LANG-936:  StringUtils.getLevenshteinDistance with too big of a threshold
707             returns wrong result. Thanks to Yaniv Kunda, Eli Lindsey.
708o LANG-943:  Test DurationFormatUtilsTest.testEdgeDuration fails in
709             JDK 1.6, 1.7 and 1.8, BRST time zone
710o LANG-613:  ConstructorUtils.getAccessibleConstructor() Does Not Check the
711             Accessibility of Enclosing Classes
712o LANG-951:  Fragments are wrong by 1 day when using fragment YEAR or MONTH.
713             Thanks to Sebastian Götz.
714o LANG-950:  FastDateParser does not handle two digit year parsing like
715             SimpleDateFormat
716o LANG-949:  FastDateParserTest.testParses does not test FastDateParser
717o LANG-915:  Wrong locale handling in LocaleUtils.toLocale().
718             Thanks to Sergio Fernández.
719
720CHANGES
721=========
722
723o LANG-961:  org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field)
724             does not clean up after itself
725o LANG-958:  FastDateParser javadoc incorrectly states that SimpleDateFormat
726             is used internally
727o LANG-956:  Improve Javadoc of WordUtils.wrap methods
728o LANG-939:  Move Documentation from user guide to package-info files
729o LANG-953:  Convert package.html files to package-info.java files
730o LANG-940:  Fix deprecation warnings
731o LANG-819:  EnumUtils.generateBitVector needs a "? extends"
732
733=============================================================================
734
735                        Release Notes for version 3.2.1
736
737BUG FIXES
738===========
739
740o LANG-937:  Fix missing Hamcrest dependency in Ant Build
741o LANG-941:  Test failure in LocaleUtilsTest when building with JDK 8
742o LANG-942:  Test failure in FastDateParserTest and FastDateFormat_ParserTest
743             when building with JDK8. Thanks to Bruno P. Kinoshita,
744             Henri Yandell.
745o LANG-938:  Build fails with test failures when building with JDK 8
746
747=============================================================================
748
749                        Release Notes for version 3.2
750
751COMPATIBILITY WITH 3.1
752========================
753
754This release introduces backwards incompatible changes in
755org.apache.commons.lang3.time.FastDateFormat:
756o Method 'protected java.util.List parsePattern()' has been removed
757o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has
758  been removed
759o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule
760  selectNumberRule(int, int)' has been removed
761
762These changes were the result of [LANG-462]. It is assumed that this change
763will not break clients as Charles Honton pointed out on 25/Jan/12:
764"
765 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and
766    "List<Rule> parsePattern()" couldn't have been overridden because
767    NumberRule and Rule were private to FastDateFormat.
768 2. Due to the factory pattern used, it's unlikely other two methods would have
769    been overridden.
770 3. The four methods are highly implementation specific. I consider it a
771    mistake that the methods were exposed.
772"
773For more information see https://issues.apache.org/jira/browse/LANG-462.
774
775NEW FEATURES
776==============
777
778o LANG-934:  Add removeFinalModifier to FieldUtils
779o LANG-863:  Method returns number of inheritance hops between parent and
780             subclass. Thanks to Daneel S. Yaitskov.
781o LANG-774:  Added isStarted, isSuspended and isStopped to StopWatch.
782             Thanks to Erhan Bagdemir.
783o LANG-848:  Added StringUtils.isBlank/isEmpty CharSequence... methods.
784             Thanks to Alexander Muthmann.
785o LANG-926:  Added ArrayUtils.reverse(array, from, to) methods.
786o LANG-795:  StringUtils.toString(byte[], String) deprecated in favour of a new
787             StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla.
788o LANG-893:  StrSubstitutor now supports default values for variables.
789             Thanks to Woonsan Ko.
790o LANG-913:  Adding .gitignore to commons-lang. Thanks to Allon Mureinik.
791o LANG-837:  Add ObjectUtils.toIdentityString methods that support
792             StringBuilder, StrBuilder, and Appendable.
793o LANG-886:  Added CharSetUtils.containsAny(String, String).
794o LANG-797:  Added escape/unescapeJson to StringEscapeUtils.
795o LANG-875:  Added appendIfMissing and prependIfMissing methods to StringUtils.
796o LANG-870:  Add StringUtils.LF and StringUtils.CR values.
797o LANG-873:  Add FieldUtils getAllFields() to return all the fields defined in
798             the given class and super classes.
799o LANG-835:  StrBuilder should support StringBuilder as an input parameter.
800o LANG-857:  StringIndexOutOfBoundsException in CharSequenceTranslator.
801o LANG-856:  Code refactoring in NumberUtils.
802o LANG-855:  NumberUtils#createBigInteger does not allow for hex and octal
803             numbers.
804o LANG-854:  NumberUtils#createNumber - does not allow for hex numbers to be
805             larger than Long.
806o LANG-853:  StringUtils join APIs for primitives.
807o LANG-841:  Add StringUtils API to call String.replaceAll in DOTALL a.k.a.
808             single-line mode.
809o LANG-825:  Create StrBuilder APIs similar to
810             String.format(String, Object...).
811o LANG-675:  Add Triple class (ternary version of Pair).
812o LANG-462:  FastDateFormat supports parse methods.
813
814BUG FIXES
815===========
816
817o LANG-932:  Spelling fixes. Thanks to Ville Skyttä.
818o LANG-929:  OctalUnescaper tried to parse all of \279.
819o LANG-928:  OctalUnescaper had bugs when parsing octals starting with a zero.
820o LANG-905:  EqualsBuilder returned true when comparing arrays, even when the
821             elements are different.
822o LANG-917:  Fixed exception when combining custom and choice format in
823             ExtendedMessageFormat. Thanks to Arne Burmeister.
824o LANG-902:  RandomStringUtils.random javadoc was incorrectly promising letters
825             and numbers would, as opposed to may, appear  Issue:. Thanks to
826             Andrzej Winnicki.
827o LANG-921:  BooleanUtils.xor(boolean...) produces wrong results.
828o LANG-896:  BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks
829             to Mark Bryan Yu.
830o LANG-879:  LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese"
831             of JDK7.
832o LANG-836:  StrSubstitutor does not support StringBuilder or CharSequence.
833             Thanks to Arnaud Brunet.
834o LANG-693:  Method createNumber from NumberUtils doesn't work for floating
835             point numbers other than Float  Issue: LANG-693. Thanks to
836             Calvin Echols.
837o LANG-887:  FastDateFormat does not use the locale specific cache correctly.
838o LANG-754:  ClassUtils.getShortName(String) will now only do a reverse lookup
839             for array types.
840o LANG-881:  NumberUtils.createNumber() Javadoc says it does not work for octal
841             numbers.
842o LANG-865:  LocaleUtils.toLocale does not parse strings starting with an
843             underscore.
844o LANG-858:  StringEscapeUtils.escapeJava() and escapeEcmaScript() do not
845             output the escaped surrogate pairs that are Java parsable.
846o LANG-849:  FastDateFormat and FastDatePrinter generates Date objects
847             wastefully.
848o LANG-845:  Spelling fixes.
849o LANG-844:  Fix examples contained in javadoc of StringUtils.center methods.
850o LANG-832:  FastDateParser does not handle unterminated quotes correctly.
851o LANG-831:  FastDateParser does not handle white-space properly.
852o LANG-830:  FastDateParser could use \Q \E to quote regexes.
853o LANG-828:  FastDateParser does not handle non-Gregorian calendars properly.
854o LANG-826:  FastDateParser does not handle non-ASCII digits correctly.
855o LANG-822:  NumberUtils#createNumber - bad behavior for leading "--".
856o LANG-818:  FastDateFormat's "z" pattern does not respect timezone of Calendar
857             instances passed to format().
858o LANG-817:  Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8.
859o LANG-813:  StringUtils.equalsIgnoreCase doesn't check string reference
860             equality.
861o LANG-810:  StringUtils.join() endIndex, bugged for loop.
862o LANG-807:  RandomStringUtils throws confusing IAE when end <= start.
863o LANG-805:  RandomStringUtils.random(count, 0, 0, false, false, universe,
864             random) always throws java.lang.ArrayIndexOutOfBoundsException.
865o LANG-802:  LocaleUtils - unnecessary recursive call in SyncAvoid class.
866o LANG-800:  Javadoc bug in DateUtils#ceiling for Calendar and Object versions.
867o LANG-788:  SerializationUtils throws ClassNotFoundException when cloning
868             primitive classes.
869o LANG-786:  StringUtils equals() relies on undefined behavior.
870o LANG-783:  Documentation bug: StringUtils.split.
871o LANG-777:  jar contains velocity template of release notes.
872o LANG-776:  TypeUtilsTest contains incorrect type assignability assertion.
873o LANG-775:  TypeUtils.getTypeArguments() misses type arguments for
874             partially-assigned classes.
875o LANG-773:  ImmutablePair doc contains nonsense text.
876o LANG-772:  ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text.
877o LANG-765:  EventListenerSupport.ProxyInvocationHandler no longer defines
878             serialVersionUID.
879o LANG-764:  StrBuilder is now serializable.
880o LANG-761:  Fix Javadoc Ant warnings.
881o LANG-747:  NumberUtils does not handle Long Hex numbers.
882o LANG-743:  Javadoc bug in static inner class DateIterator.
883
884CHANGES
885=========
886
887o LANG-931:  Misleading Javadoc comment in StrBuilderReader class. Thanks
888             to Christoph Schneegans.
889o LANG-910:  StringUtils.normalizeSpace now handles non-breaking spaces
890             (Unicode 00A0). Thanks to Timur Yarosh.
891o LANG-804:  Redundant check for zero in HashCodeBuilder ctor. Thanks to
892             Allon Mureinik.
893o LANG-884:  Simplify FastDateFormat; eliminate boxing.
894o LANG-882:  LookupTranslator now works with implementations of CharSequence
895             other than String.
896o LANG-846:  Provide CharSequenceUtils.regionMatches with a proper green
897             implementation instead of inefficiently converting to Strings.
898o LANG-839:  ArrayUtils removeElements methods use unnecessary HashSet.
899o LANG-838:  ArrayUtils removeElements methods clone temporary index arrays
900             unnecessarily.
901o LANG-799:  DateUtils#parseDate uses default locale; add Locale support.
902o LANG-798:  Use generics in SerializationUtils.
903
904CHANGES WITHOUT TICKET
905========================
906
907o Fixed URLs in javadoc to point to new oracle.com pages
908
909=============================================================================
910
911                        Release Notes for version 3.1
912
913NEW FEATURES
914==============
915
916o LANG-801:  Add Conversion utility to convert between data types on byte level
917o LANG-760:  Add API StringUtils.toString(byte[] input, String charsetName)
918o LANG-756:  Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and
919             isPrimitiveOrWrapper(Class<?>)
920o LANG-695:  SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
921
922BUG FIXES
923===========
924
925o LANG-749:  Incorrect Bundle-SymbolicName in Manifest
926o LANG-746:  NumberUtils does not handle upper-case hex: 0X and -0X
927o LANG-744:  StringUtils throws java.security.AccessControlException on Google
928             App Engine
929o LANG-741:  Ant build has wrong component.name
930o LANG-698:  Document that the Mutable numbers don't work as expected with
931             String.format
932
933CHANGES
934=========
935
936o LANG-758:  Add an example with whitespace in StringUtils.defaultIfEmpty
937o LANG-752:  Fix createLong() so it behaves like createInteger()
938o LANG-751:  Include the actual type in the Validate.isInstance and
939             isAssignableFrom exception messages
940o LANG-748:  Deprecating chomp(String, String)
941o LANG-736:  CharUtils static final array CHAR_STRING is not needed to compute
942             CHAR_STRING_ARRAY
943
944=============================================================================
945
946                        Release Notes for version 3.0
947
948ADDITIONS
949===========
950
951o LANG-276:  MutableBigDecimal and MutableBigInteger.
952o LANG-285:  Wish : method unaccent.
953o LANG-358:  ObjectUtils.coalesce.
954o LANG-386:  LeftOf/RightOfNumber in Range convenience methods necessary.
955o LANG-435:  Add ClassUtils.isAssignable() variants with autoboxing.
956o LANG-444:  StringUtils.emptyToNull.
957o LANG-482:  Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
958o LANG-482:  StrSubstitutor now supports substitution in variable names.
959o LANG-496:  A generic implementation of the Lazy initialization pattern.
960o LANG-497:  Addition of ContextedException and ContextedRuntimeException.
961o LANG-498:  Add StringEscapeUtils.escapeText() methods.
962o LANG-499:  Add support for the handling of ExecutionExceptions.
963o LANG-501:  Add support for background initialization.
964o LANG-529:  Add a concurrent package.
965o LANG-533:  Validate: support for validating blank strings.
966o LANG-537:  Add ArrayUtils.toArray to create generic arrays.
967o LANG-545:  Add ability to create a Future for a constant.
968o LANG-546:  Add methods to Validate to check whether the index is valid for
969             the array/list/string.
970o LANG-553:  Add TypeUtils class to provide utility code for working with generic
971             types.
972o LANG-559:  Added isAssignableFrom and isInstanceOf validation methods.
973o LANG-559:  Added validState validation method.
974o LANG-560:  New TimedSemaphore class.
975o LANG-582:  Provide an implementation of the ThreadFactory interface.
976o LANG-588:  Create a basic Pair<L, R> class.
977o LANG-594:  DateUtils equal & compare functions up to most significant field.
978o LANG-601:  Add Builder Interface / Update Builders to Implement It.
979o LANG-609:  Support lazy initialization using atomic variables
980o LANG-610:  Extend exception handling in ConcurrentUtils to runtime exceptions.
981o LANG-614:  StringUtils.endsWithAny method
982o LANG-640:  Add normalizeSpace to StringUtils
983o LANG-644:  Provide documentation about the new concurrent package
984o LANG-649:  BooleanUtils.toBooleanObject to support single character input
985o LANG-651:  Add AnnotationUtils
986o LANG-653:  Provide a very basic ConcurrentInitializer implementation
987o LANG-655:  Add StringUtils.defaultIfBlank()
988o LANG-667:  Add a Null-safe compare() method to ObjectUtils
989o LANG-676:  Documented potential NPE if auto-boxing occurs for some BooleanUtils
990             methods
991o LANG-678:  Add support for ConcurrentMap.putIfAbsent()
992o LANG-692:  Add hashCodeMulti varargs method
993o LANG-697:  Add FormattableUtils class
994o LANG-684:  Levenshtein Distance Within a Given Threshold
995
996REMOVALS
997==========
998
999o LANG-438:  Remove @deprecateds.
1000o LANG-492:  Remove code handled now by the JDK.
1001o LANG-493:  Remove code that does not hold enough value to remain.
1002o LANG-590:  Remove JDK 1.2/1.3 bug handling in
1003             StringUtils.indexOf(String, String, int).
1004o LANG-673:  WordUtils.abbreviate() removed
1005o LANG-691:  Removed DateUtils.UTC_TIME_ZONE
1006
1007IMPROVEMENTS
1008==============
1009
1010o LANG-290:  EnumUtils for JDK 5.0.
1011o LANG-336:  Finally start using generics.
1012o LANG-355:  StrBuilder should implement CharSequence and Appendable.
1013o LANG-396:  Investigate for vararg usages.
1014o LANG-424:  Improve Javadoc for StringUtils class.
1015o LANG-458:  Refactor Validate.java to eliminate code redundancy.
1016o LANG-479:  Document where in SVN trunk is.
1017o LANG-504:  bring ArrayUtils.isEmpty to the generics world.
1018o LANG-505:  Rewrite StringEscapeUtils.
1019o LANG-507:  StringEscapeUtils.unescapeJava should support \u+ notation.
1020o LANG-510:  Convert StringUtils API to take CharSequence.
1021o LANG-513:  Better EnumUtils.
1022o LANG-528:  Mutable classes should implement an appropriately typed Mutable
1023             interface.
1024o LANG-539:  Compile commons.lang for CDC 1.1/Foundation 1.1.
1025o LANG-540:  Make NumericEntityEscaper immutable.
1026o LANG-541:  Replace StringBuffer with StringBuilder.
1027o LANG-548:  Use Iterable on API instead of Collection.
1028o LANG-551:  Replace Range classes with generic version.
1029o LANG-562:  Change Maven groupId.
1030o LANG-563:  Change Java package name.
1031o LANG-570:  Do the test cases really still require main() and suite() methods?
1032o LANG-579:  Add new Validate methods.
1033o LANG-599:  ClassUtils.getClass(): Allow Dots as Inner Class Separators.
1034o LANG-605:  DefaultExceptionContext overwrites values in recursive situations.
1035o LANG-668:  Change ObjectUtils min() & max() functions to use varargs rather
1036             than just two parameters
1037o LANG-681:  Push down WordUtils to "text" sub-package.
1038o LANG-711:  Add includeantruntime=false to javac targets to quell warnings in
1039             ant 1.8.1 and better (and modest performance gain).
1040o LANG-713:  Increase test coverage of FieldUtils read methods and tweak
1041             javadoc.
1042o LANG-718:  build.xml Java 1.5+ updates.
1043
1044BUG FIXES
1045===========
1046
1047o LANG-11:   Depend on JDK 1.5+.
1048o LANG-302:  StrBuilder does not implement clone().
1049o LANG-339:  StringEscapeUtils.escapeHtml() escapes multibyte characters like
1050             Chinese, Japanese, etc.
1051o LANG-369:  ExceptionUtils not thread-safe.
1052o LANG-418:  Javadoc incorrect for StringUtils.endsWithIgnoreCase.
1053o LANG-428:  StringUtils.isAlpha, isAlphanumeric and isNumeric now return false
1054             for ""
1055o LANG-439:  StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
1056o LANG-448:  Lower Ascii Characters don't get encoded by Entities.java.
1057o LANG-468:  JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
1058o LANG-474:  Fixes for thread safety.
1059o LANG-478:  StopWatch does not resist to system time changes.
1060o LANG-480:  StringEscapeUtils.escapeHtml incorrectly converts unicode
1061             characters above U+00FFFF into 2 characters.
1062o LANG-481:  Possible race-conditions in hashCode of the range classes.
1063o LANG-564:  Improve StrLookup API documentation.
1064o LANG-568:  @SuppressWarnings("unchecked") is used too generally.
1065o LANG-571:  ArrayUtils.add(T[:  array, T element) can create unexpected
1066             ClassCastException.
1067o LANG-585:  exception.DefaultExceptionContext.getFormattedExceptionMessage
1068             catches Throwable.
1069o LANG-596:  StrSubstitutor should also handle the default properties of a
1070             java.util.Properties class
1071o LANG-600:  Javadoc is incorrect for public static int
1072             lastIndexOf(String str, String searchStr).
1073o LANG-602:  ContextedRuntimeException no longer an 'unchecked' exception.
1074o LANG-606:  EqualsBuilder causes StackOverflowException.
1075o LANG-608:  Some StringUtils methods should take an int character instead of
1076             char to use String API features.
1077o LANG-617:  StringEscapeUtils.escapeXML() can't process UTF-16 supplementary
1078             characters
1079o LANG-624:  SystemUtils.getJavaVersionAsFloat throws
1080             StringIndexOutOfBoundsException on Android runtime/Dalvik VM
1081o LANG-629:  Charset may not be threadsafe, because the HashSet is not synch.
1082o LANG-638:  NumberUtils createNumber throws a StringIndexOutOfBoundsException
1083             when argument containing "e" and "E" is passed in
1084o LANG-643:  Javadoc StringUtils.left() claims to throw on negative len, but
1085             doesn't
1086o LANG-645:  FastDateFormat.format() outputs incorrect week of year because
1087             locale isn't respected
1088o LANG-646:  StringEscapeUtils.unescapeJava doesn't handle octal escapes and
1089             Unicode with extra u
1090o LANG-656:  Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
1091o LANG-658:  Some entities like &Ouml; are not matched properly against its
1092             ISO8859-1 representation
1093o LANG-659:  EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212
1094             ISOtech
1095o LANG-66:   StringEscaper.escapeXml() escapes characters > 0x7f.
1096o LANG-662:  org.apache.commons.lang3.math.Fraction does not reduce
1097             (Integer.MIN_VALUE, 2^k)
1098o LANG-663:  org.apache.commons.lang3.math.Fraction does not always succeed in
1099             multiplyBy and divideBy
1100o LANG-664:  NumberUtils.isNumber(String) is not right when the String is
1101             "1.1L"
1102o LANG-672:  Doc bug in DateUtils#ceiling
1103o LANG-677:  DateUtils.isSameLocalTime compares using 12 hour clock and not
1104             24 hour
1105o LANG-685:  EqualsBuilder synchronizes on HashCodeBuilder.
1106o LANG-703:  StringUtils.join throws NPE when toString returns null for one of
1107             objects in collection
1108o LANG-710:  StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
1109o LANG-714:  StringUtils doc/comment spelling fixes.
1110o LANG-715:  CharSetUtils.squeeze() speedup.
1111o LANG-716:  swapCase and *capitalize speedups.
1112
1113
1114Historical list of changes: https://commons.apache.org/lang/changes-report.html
1115
1116For complete information on Commons Lang, including instructions on how to
1117submit bug reports, patches, or suggestions for improvement, see the
1118Apache Commons Lang website:
1119
1120https://commons.apache.org/lang/
1121
1122Have fun!
1123-Apache Commons Lang team
1124
1125