xref: /aosp_15_r20/external/apache-commons-lang/src/site/resources/release-notes/RELEASE-NOTES-3.4.txt (revision 455610af95f3bf5f4bc8a9eda520f57e389a4c42)
1Licensed to the Apache Software Foundation (ASF) under one or more
2contributor license agreements.  See the NOTICE file distributed with
3this work for additional information regarding copyright ownership.
4The ASF licenses this file to You under the Apache License, Version 2.0
5(the "License"); you may not use this file except in compliance with
6the License.  You may obtain a copy of the License at
7
8http://www.apache.org/licenses/LICENSE-2.0
9
10Unless required by applicable law or agreed to in writing, software
11distributed under the License is distributed on an "AS IS" BASIS,
12WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13See the License for the specific language governing permissions and
14limitations under the License.
15
16=============================================================================
17
18                           Apache Commons Lang
19                               Version 3.4
20                              Release Notes
21
22
23INTRODUCTION:
24
25This document contains the release notes for the 3.4 version of
26Apache Commons Lang. Commons Lang is a set of utility functions and reusable
27components that should be of use in any Java environment. Commons Lang 3.4
28at least requires Java 6.0.
29
30For the advice on upgrading from 2.x to 3.x, see the following page:
31
32    https://commons.apache.org/lang/article3_0.html
33
34
35COMPATIBILITY
36=============
37
38Commons Lang 3.4 is fully binary compatible to the last release and can
39therefore be used as a drop in replacement for 3.3.2. Note that the value of
40org.apache.commons.lang3.time.DurationFormatUtils.ISO_EXTENDED_FORMAT_PATTERN
41has changed, which may affect clients using the constant. Furthermore the
42constant is used internally in
43o DurationFormatUtils.formatDurationISO(long)
44o DurationFormatUtils.formatPeriodISO(long, long)
45
46For more information see https://issues.apache.org/jira/browse/LANG-1000.
47
48NEW FEATURES
49==============
50
51o LANG-821:  Support OS X versions in SystemUtils. Thanks to Timo Kockert.
52o LANG-1103: Add SystemUtils.IS_JAVA_1_9
53o LANG-1093: Add ClassUtils.getAbbreviatedName(). Thanks to Fabian Lange.
54o LANG-1082: Add option to disable the "objectsTriviallyEqual" test in
55             DiffBuilder. Thanks to Jonathan Baker.
56o LANG-1015: Add JsonToStringStyle implementation to ToStringStyle. Thanks to
57             Thiago Andrade.
58o LANG-1080: Add NoClassNameToStringStyle implementation of ToStringStyle.
59             Thanks to Innokenty Shuvalov.
60o LANG-883:  Add StringUtils.containsAny(CharSequence, CharSequence...) method.
61             Thanks to Daniel Stewart.
62o LANG-1052: Multiline recursive to string style. Thanks to Jan Matèrne.
63o LANG-536:  Add isSorted() to ArrayUtils. Thanks to James Sawle.
64o LANG-1033: Add StringUtils.countMatches(CharSequence, char)
65o LANG-1021: Provide methods to retrieve all fields/methods annotated with a
66             specific type. Thanks to Alexander Müller.
67o LANG-1016: NumberUtils#isParsable method(s). Thanks to
68             Juan Pablo Santos Rodríguez.
69o LANG-999:  Add fuzzy String matching logic to StringUtils. Thanks to
70             Ben Ripkens.
71o LANG-994:  Add zero copy read method to StrBuilder. Thanks to
72             Mikhail Mazursky.
73o LANG-993:  Add zero copy write method to StrBuilder. Thanks to
74             Mikhail Mazursky.
75o LANG-1044: Add method MethodUtils.invokeExactMethod(Object, String)
76o LANG-1045: Add method MethodUtils.invokeMethod(Object, String)
77
78FIXED BUGS
79============
80
81o LANG-794:  SystemUtils.IS_OS_WINDOWS_2008, VISTA are incorrect. Thanks to
82             Timo Kockert.
83o LANG-1104: Parse test fails for TimeZone America/Sao_Paulo
84o LANG-948:  Exception while using ExtendedMessageFormat and escaping braces.
85             Thanks to Andrey Khobnya.
86o LANG-1092: Wrong formatting of time zones with daylight saving time in
87             FastDatePrinter
88o LANG-1090: FastDateParser does not set error indication in ParsePosition
89o LANG-1089: FastDateParser does not handle excess hours as per
90             SimpleDateFormat
91o LANG-1061: FastDateParser error - timezones not handled correctly. Thanks to
92             dmeneses.
93o LANG-1087: NumberUtils#createNumber() returns positive BigDecimal when
94             negative Float is expected. Thanks to Renat Zhilkibaev.
95o LANG-1081: DiffBuilder.append(String, Object left, Object right) does not do
96             a left.equals(right) check. Thanks to Jonathan Baker.
97o LANG-1055: StrSubstitutor.replaceSystemProperties does not work consistently.
98             Thanks to Jonathan Baker.
99o LANG-1083: Add (T) casts to get unit tests to pass in old JDK. Thanks to
100             Jonathan Baker.
101o LANG-1073: Read wrong component type of array in add in ArrayUtils.
102             Thanks to haiyang li.
103o LANG-1077: StringUtils.ordinalIndexOf("aaaaaa", "aa", 2) != 3 in StringUtils.
104             Thanks to haiyang li.
105o LANG-1072: Duplicated "0x" check in createBigInteger in NumberUtils. Thanks
106             to haiyang li.
107o LANG-1064: StringUtils.abbreviate description doesn't agree with the
108             examples. Thanks to B.J. Herbison.
109o LANG-1041: Fix MethodUtilsTest so it does not depend on JDK method ordering.
110             Thanks to Alexandre Bartel.
111o LANG-1000: ParseException when trying to parse UTC dates with Z as zone
112             designator using DateFormatUtils.ISO_DATETIME_TIME_ZONE_FORMAT
113o LANG-1035: Javadoc for EqualsBuilder.reflectionEquals() is unclear
114o LANG-1001: ISO 8601 misspelled throughout the Javadocs. Thanks to
115             Michael Osipov.
116o LANG-1088: FastDateParser should be case-insensitive
117o LANG-995:  Fix bug with stripping spaces on last line in WordUtils.wrap().
118             Thanks to Andrey Khobnya.
119
120CHANGES
121=========
122
123o LANG-1102: Make logic for comparing OS versions in SystemUtils smarter
124o LANG-1091: Shutdown thread pools in test cases. Thanks to Fabian Lange.
125o LANG-1101: FastDateParser and FastDatePrinter support 'X' format
126o LANG-1100: Avoid memory allocation when using date formatting to StringBuffer.
127             Thanks to mbracher.
128o LANG-935:  Possible performance improvement on string escape functions.
129             Thanks to Fabian Lange, Thomas Neidhart.
130o LANG-1098: Avoid String allocation in StrBuilder.append(CharSequence). Thanks
131             to Mikhail Mazurskiy, Fabian Lange.
132o LANG-1098: Update maven-checkstyle-plugin to 2.14. Thanks to Micha? Kordas.
133o LANG-1097: Update org.easymock:easymock to 3.3.1. Thanks to Micha? Kordas.
134o LANG-1096: Update maven-pmd-plugin to 3.4. Thanks to Micha? Kordas.
135o LANG-1095: Update maven-antrun-plugin to 1.8. Thanks to Micha? Kordas.
136o LANG-877:  Performance improvements for StringEscapeUtils. Thanks to
137             Fabian Lange.
138o LANG-1071: Fix wrong examples in Javadoc of
139             StringUtils.replaceEachRepeatedly(...),
140             StringUtils.replaceEach(...) Thanks to Arno Noordover.
141o LANG-827:  CompareToBuilder's doc doesn't specify precedence of fields it
142             uses in performing comparisons
143o LANG-1020: Improve performance of normalize space. Thanks to Libor Ondrusek.
144o LANG-1027: org.apache.commons.lang3.SystemUtils#isJavaVersionAtLeast should
145             return true by default
146o LANG-1026: Bring static method references in StringUtils to consistent style.
147             Thanks to Alex Yursha.
148o LANG-1017: Use non-ASCII digits in Javadoc examples for
149             StringUtils.isNumeric. Thanks to Christoph Schneegans.
150o LANG-1008: Change min/max methods in NumberUtils/IEEE754rUtils from array
151             input parameters to varargs. Thanks to Thiago Andrade.
152o LANG-1006: Add wrap (with String or char) to StringUtils. Thanks to
153             Thiago Andrade.
154o LANG-1005: Extend DurationFormatUtils#formatDurationISO default pattern to
155             match #formatDurationHMS. Thanks to Michael Osipov.
156o LANG-1007: Fixing NumberUtils JAVADoc comments for max methods. Thanks to
157             Thiago Andrade.
158o LANG-731:  Better Javadoc for BitField class
159o LANG-1004: DurationFormatUtils#formatDurationHMS implementation does not
160             correspond to Javadoc and vice versa. Thanks to Michael Osipov.
161o LANG-1003: DurationFormatUtils are not able to handle negative
162             durations/periods
163o LANG-998:  Javadoc is not clear on preferred pattern to instantiate
164             FastDateParser / FastDatePrinter
165
166                        Release Notes for version 3.3.2
167
168NEW FEATURES
169==============
170
171o LANG-989:  Add org.apache.commons.lang3.SystemUtils.IS_JAVA_1_8
172
173FIXED BUGS
174============
175
176o LANG-992:  NumberUtils#isNumber() returns false for "0.0", "0.4790", et al
177
178                        Release Notes for version 3.3.1
179
180FIXED BUGS
181============
182
183o LANG-987:  DateUtils.getFragmentInDays(Date, Calendar.MONTH) returns wrong
184             days
185o LANG-983:  DurationFormatUtils does not describe format string fully
186o LANG-981:  DurationFormatUtils#lexx does not detect unmatched quote char
187o LANG-984:  DurationFormatUtils does not handle large durations correctly
188o LANG-982:  DurationFormatUtils.formatDuration(61999, "s.SSSS") - ms field
189             size should be 4 digits
190o LANG-978:  Failing tests with Java 8 b128
191
192                        Release Notes for version 3.3
193
194NEW FEATURES
195==============
196
197o LANG-955:  Add methods for removing all invalid characters according to
198             XML 1.0 and XML 1.1 in an input string to StringEscapeUtils.
199             Thanks to Adam Hooper.
200o LANG-970:  Add APIs MutableBoolean setTrue() and setFalse()
201o LANG-962:  Add SerializationUtils.roundtrip(T extends Serializable) to
202             serialize then deserialize
203o LANG-637:  There should be a DifferenceBuilder with a
204             ReflectionDifferenceBuilder implementation
205o LANG-944:  Add the Jaro-Winkler string distance algorithm to StringUtils.
206             Thanks to Rekha Joshi.
207o LANG-417:  New class ClassPathUtils with methods for turning FQN into
208             resource path
209o LANG-834:  Validate: add inclusiveBetween and exclusiveBetween overloads
210             for primitive types
211o LANG-900:  New RandomUtils class. Thanks to Duncan Jones.
212o LANG-966:  Add IBM OS/400 detection
213
214FIXED BUGS
215============
216
217o LANG-621:  ReflectionToStringBuilder.toString does not debug 3rd party object
218             fields within 3rd party object. Thanks to Philip Hodges,
219             Thomas Neidhart.
220o LANG-977:  NumericEntityEscaper incorrectly encodes supplementary characters.
221             Thanks to Chris Karcher.
222o LANG-973:  Make some private fields final
223o LANG-971:  NumberUtils#isNumber(String) fails to reject invalid Octal numbers
224o LANG-972:  NumberUtils#isNumber does not allow for hex 0XABCD
225o LANG-969:  StringUtils.toEncodedString(byte[], Charset) needlessly throws
226             UnsupportedEncodingException. Thanks to Matt Bishop.
227o LANG-946:  ConstantInitializerTest fails when building with IBM JDK 7
228o LANG-954:  uncaught PatternSyntaxException in FastDateFormat on Android.
229             Thanks to Michael Keppler.
230o LANG-936:  StringUtils.getLevenshteinDistance with too big of a threshold
231             returns wrong result. Thanks to Yaniv Kunda, Eli Lindsey.
232o LANG-943:  Test DurationFormatUtilsTest.testEdgeDuration fails in
233             JDK 1.6, 1.7 and 1.8, BRST time zone
234o LANG-613:  ConstructorUtils.getAccessibleConstructor() Does Not Check the
235             Accessibility of Enclosing Classes
236o LANG-951:  Fragments are wrong by 1 day when using fragment YEAR or MONTH.
237             Thanks to Sebastian Götz.
238o LANG-950:  FastDateParser does not handle two digit year parsing like
239             SimpleDateFormat
240o LANG-949:  FastDateParserTest.testParses does not test FastDateParser
241o LANG-915:  Wrong locale handling in LocaleUtils.toLocale().
242             Thanks to Sergio Fernández.
243
244CHANGES
245=========
246
247o LANG-961:  org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field)
248             does not clean up after itself
249o LANG-958:  FastDateParser javadoc incorrectly states that SimpleDateFormat
250             is used internally
251o LANG-956:  Improve Javadoc of WordUtils.wrap methods
252o LANG-939:  Move Documentation from user guide to package-info files
253o LANG-953:  Convert package.html files to package-info.java files
254o LANG-940:  Fix deprecation warnings
255o LANG-819:  EnumUtils.generateBitVector needs a "? extends"
256
257                        Release Notes for version 3.2.1
258
259BUG FIXES
260===========
261
262o LANG-937:  Fix missing Hamcrest dependency in Ant Build
263o LANG-941:  Test failure in LocaleUtilsTest when building with JDK 8
264o LANG-942:  Test failure in FastDateParserTest and FastDateFormat_ParserTest
265             when building with JDK8. Thanks to Bruno P. Kinoshita,
266             Henri Yandell.
267o LANG-938:  Build fails with test failures when building with JDK 8
268
269                        Release Notes for version 3.2
270
271COMPATIBILITY WITH 3.1
272========================
273
274This release introduces backwards incompatible changes in
275org.apache.commons.lang3.time.FastDateFormat:
276o Method 'protected java.util.List parsePattern()' has been removed
277o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has
278  been removed
279o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule
280  selectNumberRule(int, int)' has been removed
281
282These changes were the result of [LANG-462]. It is assumed that this change
283will not break clients as Charles Honton pointed out on 25/Jan/12:
284"
285 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and
286    "List<Rule> parsePattern()" couldn't have been overridden because
287    NumberRule and Rule were private to FastDateFormat.
288 2. Due to the factory pattern used, it's unlikely other two methods would have
289    been overridden.
290 3. The four methods are highly implementation specific. I consider it a
291    mistake that the methods were exposed.
292"
293For more information see https://issues.apache.org/jira/browse/LANG-462.
294
295NEW FEATURES
296==============
297
298o LANG-934:  Add removeFinalModifier to FieldUtils
299o LANG-863:  Method returns number of inheritance hops between parent and
300             subclass. Thanks to Daneel S. Yaitskov.
301o LANG-774:  Added isStarted, isSuspended and isStopped to StopWatch.
302             Thanks to Erhan Bagdemir.
303o LANG-848:  Added StringUtils.isBlank/isEmpty CharSequence... methods.
304             Thanks to Alexander Muthmann.
305o LANG-926:  Added ArrayUtils.reverse(array, from, to) methods.
306o LANG-795:  StringUtils.toString(byte[], String) deprecated in favour of a new
307             StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla.
308o LANG-893:  StrSubstitutor now supports default values for variables.
309             Thanks to Woonsan Ko.
310o LANG-913:  Adding .gitignore to commons-lang. Thanks to Allon Mureinik.
311o LANG-837:  Add ObjectUtils.toIdentityString methods that support
312             StringBuilder, StrBuilder, and Appendable.
313o LANG-886:  Added CharSetUtils.containsAny(String, String).
314o LANG-797:  Added escape/unescapeJson to StringEscapeUtils.
315o LANG-875:  Added appendIfMissing and prependIfMissing methods to StringUtils.
316o LANG-870:  Add StringUtils.LF and StringUtils.CR values.
317o LANG-873:  Add FieldUtils getAllFields() to return all the fields defined in
318             the given class and super classes.
319o LANG-835:  StrBuilder should support StringBuilder as an input parameter.
320o LANG-857:  StringIndexOutOfBoundsException in CharSequenceTranslator.
321o LANG-856:  Code refactoring in NumberUtils.
322o LANG-855:  NumberUtils#createBigInteger does not allow for hex and octal
323             numbers.
324o LANG-854:  NumberUtils#createNumber - does not allow for hex numbers to be
325             larger than Long.
326o LANG-853:  StringUtils join APIs for primitives.
327o LANG-841:  Add StringUtils API to call String.replaceAll in DOTALL a.k.a.
328             single-line mode.
329o LANG-825:  Create StrBuilder APIs similar to
330             String.format(String, Object...).
331o LANG-675:  Add Triple class (ternary version of Pair).
332o LANG-462:  FastDateFormat supports parse methods.
333
334BUG FIXES
335===========
336
337o LANG-932:  Spelling fixes. Thanks to Ville Skyttä.
338o LANG-929:  OctalUnescaper tried to parse all of \279.
339o LANG-928:  OctalUnescaper had bugs when parsing octals starting with a zero.
340o LANG-905:  EqualsBuilder returned true when comparing arrays, even when the
341             elements are different.
342o LANG-917:  Fixed exception when combining custom and choice format in
343             ExtendedMessageFormat. Thanks to Arne Burmeister.
344o LANG-902:  RandomStringUtils.random javadoc was incorrectly promising letters
345             and numbers would, as opposed to may, appear  Issue:. Thanks to
346             Andrzej Winnicki.
347o LANG-921:  BooleanUtils.xor(boolean...) produces wrong results.
348o LANG-896:  BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks
349             to Mark Bryan Yu.
350o LANG-879:  LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese"
351             of JDK7.
352o LANG-836:  StrSubstitutor does not support StringBuilder or CharSequence.
353             Thanks to Arnaud Brunet.
354o LANG-693:  Method createNumber from NumberUtils doesn't work for floating
355             point numbers other than Float  Issue: LANG-693. Thanks to
356             Calvin Echols.
357o LANG-887:  FastDateFormat does not use the locale specific cache correctly.
358o LANG-754:  ClassUtils.getShortName(String) will now only do a reverse lookup
359             for array types.
360o LANG-881:  NumberUtils.createNumber() Javadoc says it does not work for octal
361             numbers.
362o LANG-865:  LocaleUtils.toLocale does not parse strings starting with an
363             underscore.
364o LANG-858:  StringEscapeUtils.escapeJava() and escapeEcmaScript() do not
365             output the escaped surrogate pairs that are Java parsable.
366o LANG-849:  FastDateFormat and FastDatePrinter generates Date objects
367             wastefully.
368o LANG-845:  Spelling fixes.
369o LANG-844:  Fix examples contained in javadoc of StringUtils.center methods.
370o LANG-832:  FastDateParser does not handle unterminated quotes correctly.
371o LANG-831:  FastDateParser does not handle white-space properly.
372o LANG-830:  FastDateParser could use \Q \E to quote regexes.
373o LANG-828:  FastDateParser does not handle non-Gregorian calendars properly.
374o LANG-826:  FastDateParser does not handle non-ASCII digits correctly.
375o LANG-822:  NumberUtils#createNumber - bad behavior for leading "--".
376o LANG-818:  FastDateFormat's "z" pattern does not respect timezone of Calendar
377             instances passed to format().
378o LANG-817:  Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8.
379o LANG-813:  StringUtils.equalsIgnoreCase doesn't check string reference
380             equality.
381o LANG-810:  StringUtils.join() endIndex, bugged for loop.
382o LANG-807:  RandomStringUtils throws confusing IAE when end <= start.
383o LANG-805:  RandomStringUtils.random(count, 0, 0, false, false, universe,
384             random) always throws java.lang.ArrayIndexOutOfBoundsException.
385o LANG-802:  LocaleUtils - unnecessary recursive call in SyncAvoid class.
386o LANG-800:  Javadoc bug in DateUtils#ceiling for Calendar and Object versions.
387o LANG-788:  SerializationUtils throws ClassNotFoundException when cloning
388             primitive classes.
389o LANG-786:  StringUtils equals() relies on undefined behavior.
390o LANG-783:  Documentation bug: StringUtils.split.
391o LANG-777:  jar contains velocity template of release notes.
392o LANG-776:  TypeUtilsTest contains incorrect type assignability assertion.
393o LANG-775:  TypeUtils.getTypeArguments() misses type arguments for
394             partially-assigned classes.
395o LANG-773:  ImmutablePair doc contains nonsense text.
396o LANG-772:  ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text.
397o LANG-765:  EventListenerSupport.ProxyInvocationHandler no longer defines
398             serialVersionUID.
399o LANG-764:  StrBuilder is now serializable.
400o LANG-761:  Fix Javadoc Ant warnings.
401o LANG-747:  NumberUtils does not handle Long Hex numbers.
402o LANG-743:  Javadoc bug in static inner class DateIterator.
403
404CHANGES
405=========
406
407o LANG-931:  Misleading Javadoc comment in StrBuilderReader class. Thanks
408             to Christoph Schneegans.
409o LANG-910:  StringUtils.normalizeSpace now handles non-breaking spaces
410             (Unicode 00A0). Thanks to Timur Yarosh.
411o LANG-804:  Redundant check for zero in HashCodeBuilder ctor. Thanks to
412             Allon Mureinik.
413o LANG-884:  Simplify FastDateFormat; eliminate boxing.
414o LANG-882:  LookupTranslator now works with implementations of CharSequence
415             other than String.
416o LANG-846:  Provide CharSequenceUtils.regionMatches with a proper green
417             implementation instead of inefficiently converting to Strings.
418o LANG-839:  ArrayUtils removeElements methods use unnecessary HashSet.
419o LANG-838:  ArrayUtils removeElements methods clone temporary index arrays
420             unnecessarily.
421o LANG-799:  DateUtils#parseDate uses default locale; add Locale support.
422o LANG-798:  Use generics in SerializationUtils.
423
424CHANGES WITHOUT TICKET
425========================
426
427o Fixed URLs in javadoc to point to new oracle.com pages
428
429
430                        Release Notes for version 3.1
431
432NEW FEATURES
433==============
434
435o LANG-801:  Add Conversion utility to convert between data types on byte level
436o LANG-760:  Add API StringUtils.toString(byte[] input, String charsetName)
437o LANG-756:  Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and
438             isPrimitiveOrWrapper(Class<?>)
439o LANG-695:  SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system
440
441BUG FIXES
442===========
443
444o LANG-749:  Incorrect Bundle-SymbolicName in Manifest
445o LANG-746:  NumberUtils does not handle upper-case hex: 0X and -0X
446o LANG-744:  StringUtils throws java.security.AccessControlException on Google
447             App Engine
448o LANG-741:  Ant build has wrong component.name
449o LANG-698:  Document that the Mutable numbers don't work as expected with
450             String.format
451
452CHANGES
453=========
454
455o LANG-758:  Add an example with whitespace in StringUtils.defaultIfEmpty
456o LANG-752:  Fix createLong() so it behaves like createInteger()
457o LANG-751:  Include the actual type in the Validate.isInstance and
458             isAssignableFrom exception messages
459o LANG-748:  Deprecating chomp(String, String)
460o LANG-736:  CharUtils static final array CHAR_STRING is not needed to compute
461             CHAR_STRING_ARRAY
462
463
464                        Release Notes for version 3.0
465
466ADDITIONS
467===========
468
469o LANG-276:  MutableBigDecimal and MutableBigInteger.
470o LANG-285:  Wish : method unaccent.
471o LANG-358:  ObjectUtils.coalesce.
472o LANG-386:  LeftOf/RightOfNumber in Range convenience methods necessary.
473o LANG-435:  Add ClassUtils.isAssignable() variants with autoboxing.
474o LANG-444:  StringUtils.emptyToNull.
475o LANG-482:  Enhance StrSubstitutor to support nested ${var-${subvr}} expansion
476o LANG-482:  StrSubstitutor now supports substitution in variable names.
477o LANG-496:  A generic implementation of the Lazy initialization pattern.
478o LANG-497:  Addition of ContextedException and ContextedRuntimeException.
479o LANG-498:  Add StringEscapeUtils.escapeText() methods.
480o LANG-499:  Add support for the handling of ExecutionExceptions.
481o LANG-501:  Add support for background initialization.
482o LANG-529:  Add a concurrent package.
483o LANG-533:  Validate: support for validating blank strings.
484o LANG-537:  Add ArrayUtils.toArray to create generic arrays.
485o LANG-545:  Add ability to create a Future for a constant.
486o LANG-546:  Add methods to Validate to check whether the index is valid for
487             the array/list/string.
488o LANG-553:  Add TypeUtils class to provide utility code for working with generic
489             types.
490o LANG-559:  Added isAssignableFrom and isInstanceOf validation methods.
491o LANG-559:  Added validState validation method.
492o LANG-560:  New TimedSemaphore class.
493o LANG-582:  Provide an implementation of the ThreadFactory interface.
494o LANG-588:  Create a basic Pair<L, R> class.
495o LANG-594:  DateUtils equal & compare functions up to most significant field.
496o LANG-601:  Add Builder Interface / Update Builders to Implement It.
497o LANG-609:  Support lazy initialization using atomic variables
498o LANG-610:  Extend exception handling in ConcurrentUtils to runtime exceptions.
499o LANG-614:  StringUtils.endsWithAny method
500o LANG-640:  Add normalizeSpace to StringUtils
501o LANG-644:  Provide documentation about the new concurrent package
502o LANG-649:  BooleanUtils.toBooleanObject to support single character input
503o LANG-651:  Add AnnotationUtils
504o LANG-653:  Provide a very basic ConcurrentInitializer implementation
505o LANG-655:  Add StringUtils.defaultIfBlank()
506o LANG-667:  Add a Null-safe compare() method to ObjectUtils
507o LANG-676:  Documented potential NPE if auto-boxing occurs for some BooleanUtils
508             methods
509o LANG-678:  Add support for ConcurrentMap.putIfAbsent()
510o LANG-692:  Add hashCodeMulti varargs method
511o LANG-697:  Add FormattableUtils class
512o LANG-684:  Levenshtein Distance Within a Given Threshold
513
514REMOVALS
515==========
516
517o LANG-438:  Remove @deprecateds.
518o LANG-492:  Remove code handled now by the JDK.
519o LANG-493:  Remove code that does not hold enough value to remain.
520o LANG-590:  Remove JDK 1.2/1.3 bug handling in
521             StringUtils.indexOf(String, String, int).
522o LANG-673:  WordUtils.abbreviate() removed
523o LANG-691:  Removed DateUtils.UTC_TIME_ZONE
524
525IMPROVEMENTS
526==============
527
528o LANG-290:  EnumUtils for JDK 5.0.
529o LANG-336:  Finally start using generics.
530o LANG-355:  StrBuilder should implement CharSequence and Appendable.
531o LANG-396:  Investigate for vararg usages.
532o LANG-424:  Improve Javadoc for StringUtils class.
533o LANG-458:  Refactor Validate.java to eliminate code redundancy.
534o LANG-479:  Document where in SVN trunk is.
535o LANG-504:  bring ArrayUtils.isEmpty to the generics world.
536o LANG-505:  Rewrite StringEscapeUtils.
537o LANG-507:  StringEscapeUtils.unescapeJava should support \u+ notation.
538o LANG-510:  Convert StringUtils API to take CharSequence.
539o LANG-513:  Better EnumUtils.
540o LANG-528:  Mutable classes should implement an appropriately typed Mutable
541             interface.
542o LANG-539:  Compile commons.lang for CDC 1.1/Foundation 1.1.
543o LANG-540:  Make NumericEntityEscaper immutable.
544o LANG-541:  Replace StringBuffer with StringBuilder.
545o LANG-548:  Use Iterable on API instead of Collection.
546o LANG-551:  Replace Range classes with generic version.
547o LANG-562:  Change Maven groupId.
548o LANG-563:  Change Java package name.
549o LANG-570:  Do the test cases really still require main() and suite() methods?
550o LANG-579:  Add new Validate methods.
551o LANG-599:  ClassUtils.getClass(): Allow Dots as Inner Class Separators.
552o LANG-605:  DefaultExceptionContext overwrites values in recursive situations.
553o LANG-668:  Change ObjectUtils min() & max() functions to use varargs rather
554             than just two parameters
555o LANG-681:  Push down WordUtils to "text" sub-package.
556o LANG-711:  Add includeantruntime=false to javac targets to quell warnings in
557             ant 1.8.1 and better (and modest performance gain).
558o LANG-713:  Increase test coverage of FieldUtils read methods and tweak
559             javadoc.
560o LANG-718:  build.xml Java 1.5+ updates.
561
562BUG FIXES
563===========
564
565o LANG-11:   Depend on JDK 1.5+.
566o LANG-302:  StrBuilder does not implement clone().
567o LANG-339:  StringEscapeUtils.escapeHtml() escapes multibyte characters like
568             Chinese, Japanese, etc.
569o LANG-369:  ExceptionUtils not thread-safe.
570o LANG-418:  Javadoc incorrect for StringUtils.endsWithIgnoreCase.
571o LANG-428:  StringUtils.isAlpha, isAlphanumeric and isNumeric now return false
572             for ""
573o LANG-439:  StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20).
574o LANG-448:  Lower Ascii Characters don't get encoded by Entities.java.
575o LANG-468:  JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder).
576o LANG-474:  Fixes for thread safety.
577o LANG-478:  StopWatch does not resist to system time changes.
578o LANG-480:  StringEscapeUtils.escapeHtml incorrectly converts unicode
579             characters above U+00FFFF into 2 characters.
580o LANG-481:  Possible race-conditions in hashCode of the range classes.
581o LANG-564:  Improve StrLookup API documentation.
582o LANG-568:  @SuppressWarnings("unchecked") is used too generally.
583o LANG-571:  ArrayUtils.add(T[:  array, T element) can create unexpected
584             ClassCastException.
585o LANG-585:  exception.DefaultExceptionContext.getFormattedExceptionMessage
586             catches Throwable.
587o LANG-596:  StrSubstitutor should also handle the default properties of a
588             java.util.Properties class
589o LANG-600:  Javadoc is incorrect for public static int
590             lastIndexOf(String str, String searchStr).
591o LANG-602:  ContextedRuntimeException no longer an 'unchecked' exception.
592o LANG-606:  EqualsBuilder causes StackOverflowException.
593o LANG-608:  Some StringUtils methods should take an int character instead of
594             char to use String API features.
595o LANG-617:  StringEscapeUtils.escapeXML() can't process UTF-16 supplementary
596             characters
597o LANG-624:  SystemUtils.getJavaVersionAsFloat throws
598             StringIndexOutOfBoundsException on Android runtime/Dalvik VM
599o LANG-629:  Charset may not be threadsafe, because the HashSet is not synch.
600o LANG-638:  NumberUtils createNumber throws a StringIndexOutOfBoundsException
601             when argument containing "e" and "E" is passed in
602o LANG-643:  Javadoc StringUtils.left() claims to throw on negative len, but
603             doesn't
604o LANG-645:  FastDateFormat.format() outputs incorrect week of year because
605             locale isn't respected
606o LANG-646:  StringEscapeUtils.unescapeJava doesn't handle octal escapes and
607             Unicode with extra u
608o LANG-656:  Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect
609o LANG-658:  Some entities like &Ouml; are not matched properly against its
610             ISO8859-1 representation
611o LANG-659:  EntityArrays typo: {"\u2122", "&minus;"}, // minus sign, U+2212
612             ISOtech
613o LANG-66:   StringEscaper.escapeXml() escapes characters > 0x7f.
614o LANG-662:  org.apache.commons.lang3.math.Fraction does not reduce
615             (Integer.MIN_VALUE, 2^k)
616o LANG-663:  org.apache.commons.lang3.math.Fraction does not always succeed in
617             multiplyBy and divideBy
618o LANG-664:  NumberUtils.isNumber(String) is not right when the String is
619             "1.1L"
620o LANG-672:  Doc bug in DateUtils#ceiling
621o LANG-677:  DateUtils.isSameLocalTime compares using 12-hour clock and not
622             24-hour
623o LANG-685:  EqualsBuilder synchronizes on HashCodeBuilder.
624o LANG-703:  StringUtils.join throws NPE when toString returns null for one of
625             objects in collection
626o LANG-710:  StringIndexOutOfBoundsException when calling unescapeHtml4("&#03")
627o LANG-714:  StringUtils doc/comment spelling fixes.
628o LANG-715:  CharSetUtils.squeeze() speedup.
629o LANG-716:  swapCase and *capitalize speedups.
630
631
632Historical list of changes: https://commons.apache.org/lang/changes-report.html
633
634For complete information on Commons Lang, including instructions on how to
635submit bug reports, patches, or suggestions for improvement, see the
636Apache Commons Lang website:
637
638https://commons.apache.org/lang/
639
640Have fun!
641-Apache Commons Lang team
642
643