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 Ö are not matched properly against its 610 ISO8859-1 representation 611o LANG-659: EntityArrays typo: {"\u2122", "−"}, // 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("") 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