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