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