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.3.1 20 Release Notes 21 22 23INTRODUCTION: 24 25This document contains the release notes for the 3.3.1 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.3.1 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 34FIXED BUGS 35============ 36 37o LANG-987: DateUtils.getFragmentInDays(Date, Calendar.MONTH) returns wrong 38 days 39o LANG-983: DurationFormatUtils does not describe format string fully 40o LANG-981: DurationFormatUtils#lexx does not detect unmatched quote char 41o LANG-984: DurationFormatUtils does not handle large durations correctly 42o LANG-982: DurationFormatUtils.formatDuration(61999, "s.SSSS") - ms field 43 size should be 4 digits 44o LANG-978: Failing tests with Java 8 b128 45 46 Release Notes for version 3.3 47 48NEW FEATURES 49============== 50 51o LANG-955: Add methods for removing all invalid characters according to 52 XML 1.0 and XML 1.1 in an input string to StringEscapeUtils. 53 Thanks to Adam Hooper. 54o LANG-970: Add APIs MutableBoolean setTrue() and setFalse() 55o LANG-962: Add SerializationUtils.roundtrip(T extends Serializable) to 56 serialize then deserialize 57o LANG-637: There should be a DifferenceBuilder with a 58 ReflectionDifferenceBuilder implementation 59o LANG-944: Add the Jaro-Winkler string distance algorithm to StringUtils. 60 Thanks to Rekha Joshi. 61o LANG-417: New class ClassPathUtils with methods for turning FQN into 62 resource path 63o LANG-834: Validate: add inclusiveBetween and exclusiveBetween overloads 64 for primitive types 65o LANG-900: New RandomUtils class. Thanks to Duncan Jones. 66o LANG-966: Add IBM OS/400 detection 67 68FIXED BUGS 69============ 70 71o LANG-621: ReflectionToStringBuilder.toString does not debug 3rd party object 72 fields within 3rd party object. Thanks to Philip Hodges, 73 Thomas Neidhart. 74o LANG-977: NumericEntityEscaper incorrectly encodes supplementary characters. 75 Thanks to Chris Karcher. 76o LANG-973: Make some private fields final 77o LANG-971: NumberUtils#isNumber(String) fails to reject invalid Octal numbers 78o LANG-972: NumberUtils#isNumber does not allow for hex 0XABCD 79o LANG-969: StringUtils.toEncodedString(byte[], Charset) needlessly throws 80 UnsupportedEncodingException. Thanks to Matt Bishop. 81o LANG-946: ConstantInitializerTest fails when building with IBM JDK 7 82o LANG-954: uncaught PatternSyntaxException in FastDateFormat on Android. 83 Thanks to Michael Keppler. 84o LANG-936: StringUtils.getLevenshteinDistance with too big of a threshold 85 returns wrong result. Thanks to Yaniv Kunda, Eli Lindsey. 86o LANG-943: Test DurationFormatUtilsTest.testEdgeDuration fails in 87 JDK 1.6, 1.7 and 1.8, BRST time zone 88o LANG-613: ConstructorUtils.getAccessibleConstructor() Does Not Check the 89 Accessibility of Enclosing Classes 90o LANG-951: Fragments are wrong by 1 day when using fragment YEAR or MONTH. 91 Thanks to Sebastian Götz. 92o LANG-950: FastDateParser does not handle two digit year parsing like 93 SimpleDateFormat 94o LANG-949: FastDateParserTest.testParses does not test FastDateParser 95o LANG-915: Wrong locale handling in LocaleUtils.toLocale(). 96 Thanks to Sergio Fernández. 97 98CHANGES 99========= 100 101o LANG-961: org.apache.commons.lang3.reflect.FieldUtils.removeFinalModifier(Field) 102 does not clean up after itself 103o LANG-958: FastDateParser javadoc incorrectly states that SimpleDateFormat 104 is used internally 105o LANG-956: Improve Javadoc of WordUtils.wrap methods 106o LANG-939: Move Documentation from user guide to package-info files 107o LANG-953: Convert package.html files to package-info.java files 108o LANG-940: Fix deprecation warnings 109o LANG-819: EnumUtils.generateBitVector needs a "? extends" 110 111 Release Notes for version 3.2.1 112 113BUG FIXES 114=========== 115 116o LANG-937: Fix missing Hamcrest dependency in Ant Build 117o LANG-941: Test failure in LocaleUtilsTest when building with JDK 8 118o LANG-942: Test failure in FastDateParserTest and FastDateFormat_ParserTest 119 when building with JDK8. Thanks to Bruno P. Kinoshita, 120 Henri Yandell. 121o LANG-938: Build fails with test failures when building with JDK 8 122 123 Release Notes for version 3.2 124 125COMPATIBILITY WITH 3.1 126======================== 127 128This release introduces backwards incompatible changes in 129org.apache.commons.lang3.time.FastDateFormat: 130o Method 'protected java.util.List parsePattern()' has been removed 131o Method 'protected java.lang.String parseToken(java.lang.String, int[])' has 132 been removed 133o Method 'protected org.apache.commons.lang3.time.FastDateFormat$NumberRule 134 selectNumberRule(int, int)' has been removed 135 136These changes were the result of [LANG-462]. It is assumed that this change 137will not break clients as Charles Honton pointed out on 25/Jan/12: 138" 139 1. Methods "FastDateFormat$NumberRule selectNumberRule(int, int)" and 140 "List<Rule> parsePattern()" couldn't have been overridden because 141 NumberRule and Rule were private to FastDateFormat. 142 2. Due to the factory pattern used, it's unlikely other two methods would have 143 been overridden. 144 3. The four methods are highly implementation specific. I consider it a 145 mistake that the methods were exposed. 146" 147For more information see https://issues.apache.org/jira/browse/LANG-462. 148 149NEW FEATURES 150============== 151 152o LANG-934: Add removeFinalModifier to FieldUtils 153o LANG-863: Method returns number of inheritance hops between parent and 154 subclass. Thanks to Daneel S. Yaitskov. 155o LANG-774: Added isStarted, isSuspended and isStopped to StopWatch. 156 Thanks to Erhan Bagdemir. 157o LANG-848: Added StringUtils.isBlank/isEmpty CharSequence... methods. 158 Thanks to Alexander Muthmann. 159o LANG-926: Added ArrayUtils.reverse(array, from, to) methods. 160o LANG-795: StringUtils.toString(byte[], String) deprecated in favour of a new 161 StringUtils.toString(byte[], CharSet). Thanks to Aaron Digulla. 162o LANG-893: StrSubstitutor now supports default values for variables. 163 Thanks to Woonsan Ko. 164o LANG-913: Adding .gitignore to commons-lang. Thanks to Allon Mureinik. 165o LANG-837: Add ObjectUtils.toIdentityString methods that support 166 StringBuilder, StrBuilder, and Appendable. 167o LANG-886: Added CharSetUtils.containsAny(String, String). 168o LANG-797: Added escape/unescapeJson to StringEscapeUtils. 169o LANG-875: Added appendIfMissing and prependIfMissing methods to StringUtils. 170o LANG-870: Add StringUtils.LF and StringUtils.CR values. 171o LANG-873: Add FieldUtils getAllFields() to return all the fields defined in 172 the given class and super classes. 173o LANG-835: StrBuilder should support StringBuilder as an input parameter. 174o LANG-857: StringIndexOutOfBoundsException in CharSequenceTranslator. 175o LANG-856: Code refactoring in NumberUtils. 176o LANG-855: NumberUtils#createBigInteger does not allow for hex and octal 177 numbers. 178o LANG-854: NumberUtils#createNumber - does not allow for hex numbers to be 179 larger than Long. 180o LANG-853: StringUtils join APIs for primitives. 181o LANG-841: Add StringUtils API to call String.replaceAll in DOTALL a.k.a. 182 single-line mode. 183o LANG-825: Create StrBuilder APIs similar to 184 String.format(String, Object...). 185o LANG-675: Add Triple class (ternary version of Pair). 186o LANG-462: FastDateFormat supports parse methods. 187 188BUG FIXES 189=========== 190 191o LANG-932: Spelling fixes. Thanks to Ville Skyttä. 192o LANG-929: OctalUnescaper tried to parse all of \279. 193o LANG-928: OctalUnescaper had bugs when parsing octals starting with a zero. 194o LANG-905: EqualsBuilder returned true when comparing arrays, even when the 195 elements are different. 196o LANG-917: Fixed exception when combining custom and choice format in 197 ExtendedMessageFormat. Thanks to Arne Burmeister. 198o LANG-902: RandomStringUtils.random javadoc was incorrectly promising letters 199 and numbers would, as opposed to may, appear Issue:. Thanks to 200 Andrzej Winnicki. 201o LANG-921: BooleanUtils.xor(boolean...) produces wrong results. 202o LANG-896: BooleanUtils.toBoolean(String str) javadoc is not updated. Thanks 203 to Mark Bryan Yu. 204o LANG-879: LocaleUtils test fails with new Locale "ja_JP_JP_#u-ca-japanese" 205 of JDK7. 206o LANG-836: StrSubstitutor does not support StringBuilder or CharSequence. 207 Thanks to Arnaud Brunet. 208o LANG-693: Method createNumber from NumberUtils doesn't work for floating 209 point numbers other than Float Issue: LANG-693. Thanks to 210 Calvin Echols. 211o LANG-887: FastDateFormat does not use the locale specific cache correctly. 212o LANG-754: ClassUtils.getShortName(String) will now only do a reverse lookup 213 for array types. 214o LANG-881: NumberUtils.createNumber() Javadoc says it does not work for octal 215 numbers. 216o LANG-865: LocaleUtils.toLocale does not parse strings starting with an 217 underscore. 218o LANG-858: StringEscapeUtils.escapeJava() and escapeEcmaScript() do not 219 output the escaped surrogate pairs that are Java parsable. 220o LANG-849: FastDateFormat and FastDatePrinter generates Date objects 221 wastefully. 222o LANG-845: Spelling fixes. 223o LANG-844: Fix examples contained in javadoc of StringUtils.center methods. 224o LANG-832: FastDateParser does not handle unterminated quotes correctly. 225o LANG-831: FastDateParser does not handle white-space properly. 226o LANG-830: FastDateParser could use \Q \E to quote regexes. 227o LANG-828: FastDateParser does not handle non-Gregorian calendars properly. 228o LANG-826: FastDateParser does not handle non-ASCII digits correctly. 229o LANG-822: NumberUtils#createNumber - bad behavior for leading "--". 230o LANG-818: FastDateFormat's "z" pattern does not respect timezone of Calendar 231 instances passed to format(). 232o LANG-817: Add org.apache.commons.lang3.SystemUtils.IS_OS_WINDOWS_8. 233o LANG-813: StringUtils.equalsIgnoreCase doesn't check string reference 234 equality. 235o LANG-810: StringUtils.join() endIndex, bugged for loop. 236o LANG-807: RandomStringUtils throws confusing IAE when end <= start. 237o LANG-805: RandomStringUtils.random(count, 0, 0, false, false, universe, 238 random) always throws java.lang.ArrayIndexOutOfBoundsException. 239o LANG-802: LocaleUtils - unnecessary recursive call in SyncAvoid class. 240o LANG-800: Javadoc bug in DateUtils#ceiling for Calendar and Object versions. 241o LANG-788: SerializationUtils throws ClassNotFoundException when cloning 242 primitive classes. 243o LANG-786: StringUtils equals() relies on undefined behavior. 244o LANG-783: Documentation bug: StringUtils.split. 245o LANG-777: jar contains velocity template of release notes. 246o LANG-776: TypeUtilsTest contains incorrect type assignability assertion. 247o LANG-775: TypeUtils.getTypeArguments() misses type arguments for 248 partially-assigned classes. 249o LANG-773: ImmutablePair doc contains nonsense text. 250o LANG-772: ClassUtils.PACKAGE_SEPARATOR Javadoc contains garbage text. 251o LANG-765: EventListenerSupport.ProxyInvocationHandler no longer defines 252 serialVersionUID. 253o LANG-764: StrBuilder is now serializable. 254o LANG-761: Fix Javadoc Ant warnings. 255o LANG-747: NumberUtils does not handle Long Hex numbers. 256o LANG-743: Javadoc bug in static inner class DateIterator. 257 258CHANGES 259========= 260 261o LANG-931: Misleading Javadoc comment in StrBuilderReader class. Thanks 262 to Christoph Schneegans. 263o LANG-910: StringUtils.normalizeSpace now handles non-breaking spaces 264 (Unicode 00A0). Thanks to Timur Yarosh. 265o LANG-804: Redundant check for zero in HashCodeBuilder ctor. Thanks to 266 Allon Mureinik. 267o LANG-884: Simplify FastDateFormat; eliminate boxing. 268o LANG-882: LookupTranslator now works with implementations of CharSequence 269 other than String. 270o LANG-846: Provide CharSequenceUtils.regionMatches with a proper green 271 implementation instead of inefficiently converting to Strings. 272o LANG-839: ArrayUtils removeElements methods use unnecessary HashSet. 273o LANG-838: ArrayUtils removeElements methods clone temporary index arrays 274 unnecessarily. 275o LANG-799: DateUtils#parseDate uses default locale; add Locale support. 276o LANG-798: Use generics in SerializationUtils. 277 278CHANGES WITHOUT TICKET 279======================== 280 281o Fixed URLs in javadoc to point to new oracle.com pages 282 283 284 Release Notes for version 3.1 285 286NEW FEATURES 287============== 288 289o LANG-801: Add Conversion utility to convert between data types on byte level 290o LANG-760: Add API StringUtils.toString(byte[] input, String charsetName) 291o LANG-756: Add APIs ClassUtils.isPrimitiveWrapper(Class<?>) and 292 isPrimitiveOrWrapper(Class<?>) 293o LANG-695: SystemUtils.IS_OS_UNIX doesn't recognize FreeBSD as a Unix system 294 295BUG FIXES 296=========== 297 298o LANG-749: Incorrect Bundle-SymbolicName in Manifest 299o LANG-746: NumberUtils does not handle upper-case hex: 0X and -0X 300o LANG-744: StringUtils throws java.security.AccessControlException on Google 301 App Engine 302o LANG-741: Ant build has wrong component.name 303o LANG-698: Document that the Mutable numbers don't work as expected with 304 String.format 305 306CHANGES 307========= 308 309o LANG-758: Add an example with whitespace in StringUtils.defaultIfEmpty 310o LANG-752: Fix createLong() so it behaves like createInteger() 311o LANG-751: Include the actual type in the Validate.isInstance and 312 isAssignableFrom exception messages 313o LANG-748: Deprecating chomp(String, String) 314o LANG-736: CharUtils static final array CHAR_STRING is not needed to compute 315 CHAR_STRING_ARRAY 316 317 318 Release Notes for version 3.0 319 320ADDITIONS 321=========== 322 323o LANG-276: MutableBigDecimal and MutableBigInteger. 324o LANG-285: Wish : method unaccent. 325o LANG-358: ObjectUtils.coalesce. 326o LANG-386: LeftOf/RightOfNumber in Range convenience methods necessary. 327o LANG-435: Add ClassUtils.isAssignable() variants with autoboxing. 328o LANG-444: StringUtils.emptyToNull. 329o LANG-482: Enhance StrSubstitutor to support nested ${var-${subvr}} expansion 330o LANG-482: StrSubstitutor now supports substitution in variable names. 331o LANG-496: A generic implementation of the Lazy initialization pattern. 332o LANG-497: Addition of ContextedException and ContextedRuntimeException. 333o LANG-498: Add StringEscapeUtils.escapeText() methods. 334o LANG-499: Add support for the handling of ExecutionExceptions. 335o LANG-501: Add support for background initialization. 336o LANG-529: Add a concurrent package. 337o LANG-533: Validate: support for validating blank strings. 338o LANG-537: Add ArrayUtils.toArray to create generic arrays. 339o LANG-545: Add ability to create a Future for a constant. 340o LANG-546: Add methods to Validate to check whether the index is valid for 341 the array/list/string. 342o LANG-553: Add TypeUtils class to provide utility code for working with generic 343 types. 344o LANG-559: Added isAssignableFrom and isInstanceOf validation methods. 345o LANG-559: Added validState validation method. 346o LANG-560: New TimedSemaphore class. 347o LANG-582: Provide an implementation of the ThreadFactory interface. 348o LANG-588: Create a basic Pair<L, R> class. 349o LANG-594: DateUtils equal & compare functions up to most significant field. 350o LANG-601: Add Builder Interface / Update Builders to Implement It. 351o LANG-609: Support lazy initialization using atomic variables 352o LANG-610: Extend exception handling in ConcurrentUtils to runtime exceptions. 353o LANG-614: StringUtils.endsWithAny method 354o LANG-640: Add normalizeSpace to StringUtils 355o LANG-644: Provide documentation about the new concurrent package 356o LANG-649: BooleanUtils.toBooleanObject to support single character input 357o LANG-651: Add AnnotationUtils 358o LANG-653: Provide a very basic ConcurrentInitializer implementation 359o LANG-655: Add StringUtils.defaultIfBlank() 360o LANG-667: Add a Null-safe compare() method to ObjectUtils 361o LANG-676: Documented potential NPE if auto-boxing occurs for some BooleanUtils 362 methods 363o LANG-678: Add support for ConcurrentMap.putIfAbsent() 364o LANG-692: Add hashCodeMulti varargs method 365o LANG-697: Add FormattableUtils class 366o LANG-684: Levenshtein Distance Within a Given Threshold 367 368REMOVALS 369========== 370 371o LANG-438: Remove @deprecateds. 372o LANG-492: Remove code handled now by the JDK. 373o LANG-493: Remove code that does not hold enough value to remain. 374o LANG-590: Remove JDK 1.2/1.3 bug handling in 375 StringUtils.indexOf(String, String, int). 376o LANG-673: WordUtils.abbreviate() removed 377o LANG-691: Removed DateUtils.UTC_TIME_ZONE 378 379IMPROVEMENTS 380============== 381 382o LANG-290: EnumUtils for JDK 5.0. 383o LANG-336: Finally start using generics. 384o LANG-355: StrBuilder should implement CharSequence and Appendable. 385o LANG-396: Investigate for vararg usages. 386o LANG-424: Improve Javadoc for StringUtils class. 387o LANG-458: Refactor Validate.java to eliminate code redundancy. 388o LANG-479: Document where in SVN trunk is. 389o LANG-504: bring ArrayUtils.isEmpty to the generics world. 390o LANG-505: Rewrite StringEscapeUtils. 391o LANG-507: StringEscapeUtils.unescapeJava should support \u+ notation. 392o LANG-510: Convert StringUtils API to take CharSequence. 393o LANG-513: Better EnumUtils. 394o LANG-528: Mutable classes should implement an appropriately typed Mutable 395 interface. 396o LANG-539: Compile commons.lang for CDC 1.1/Foundation 1.1. 397o LANG-540: Make NumericEntityEscaper immutable. 398o LANG-541: Replace StringBuffer with StringBuilder. 399o LANG-548: Use Iterable on API instead of Collection. 400o LANG-551: Replace Range classes with generic version. 401o LANG-562: Change Maven groupId. 402o LANG-563: Change Java package name. 403o LANG-570: Do the test cases really still require main() and suite() methods? 404o LANG-579: Add new Validate methods. 405o LANG-599: ClassUtils.getClass(): Allow Dots as Inner Class Separators. 406o LANG-605: DefaultExceptionContext overwrites values in recursive situations. 407o LANG-668: Change ObjectUtils min() & max() functions to use varargs rather 408 than just two parameters 409o LANG-681: Push down WordUtils to "text" sub-package. 410o LANG-711: Add includeantruntime=false to javac targets to quell warnings in 411 ant 1.8.1 and better (and modest performance gain). 412o LANG-713: Increase test coverage of FieldUtils read methods and tweak 413 javadoc. 414o LANG-718: build.xml Java 1.5+ updates. 415 416BUG FIXES 417=========== 418 419o LANG-11: Depend on JDK 1.5+. 420o LANG-302: StrBuilder does not implement clone(). 421o LANG-339: StringEscapeUtils.escapeHtml() escapes multibyte characters like 422 Chinese, Japanese, etc. 423o LANG-369: ExceptionUtils not thread-safe. 424o LANG-418: Javadoc incorrect for StringUtils.endsWithIgnoreCase. 425o LANG-428: StringUtils.isAlpha, isAlphanumeric and isNumeric now return false 426 for "" 427o LANG-439: StringEscapeUtils.escapeHTML() does not escape chars (0x00-0x20). 428o LANG-448: Lower Ascii Characters don't get encoded by Entities.java. 429o LANG-468: JDK 1.5 build/runtime failure on LANG-393 (EqualsBuilder). 430o LANG-474: Fixes for thread safety. 431o LANG-478: StopWatch does not resist to system time changes. 432o LANG-480: StringEscapeUtils.escapeHtml incorrectly converts unicode 433 characters above U+00FFFF into 2 characters. 434o LANG-481: Possible race-conditions in hashCode of the range classes. 435o LANG-564: Improve StrLookup API documentation. 436o LANG-568: @SuppressWarnings("unchecked") is used too generally. 437o LANG-571: ArrayUtils.add(T[: array, T element) can create unexpected 438 ClassCastException. 439o LANG-585: exception.DefaultExceptionContext.getFormattedExceptionMessage 440 catches Throwable. 441o LANG-596: StrSubstitutor should also handle the default properties of a 442 java.util.Properties class 443o LANG-600: Javadoc is incorrect for public static int 444 lastIndexOf(String str, String searchStr). 445o LANG-602: ContextedRuntimeException no longer an 'unchecked' exception. 446o LANG-606: EqualsBuilder causes StackOverflowException. 447o LANG-608: Some StringUtils methods should take an int character instead of 448 char to use String API features. 449o LANG-617: StringEscapeUtils.escapeXML() can't process UTF-16 supplementary 450 characters 451o LANG-624: SystemUtils.getJavaVersionAsFloat throws 452 StringIndexOutOfBoundsException on Android runtime/Dalvik VM 453o LANG-629: Charset may not be threadsafe, because the HashSet is not synch. 454o LANG-638: NumberUtils createNumber throws a StringIndexOutOfBoundsException 455 when argument containing "e" and "E" is passed in 456o LANG-643: Javadoc StringUtils.left() claims to throw on negative len, but 457 doesn't 458o LANG-645: FastDateFormat.format() outputs incorrect week of year because 459 locale isn't respected 460o LANG-646: StringEscapeUtils.unescapeJava doesn't handle octal escapes and 461 Unicode with extra u 462o LANG-656: Example StringUtils.indexOfAnyBut("zzabyycdxx", '') = 0 incorrect 463o LANG-658: Some entities like Ö are not matched properly against its 464 ISO8859-1 representation 465o LANG-659: EntityArrays typo: {"\u2122", "−"}, // minus sign, U+2212 466 ISOtech 467o LANG-66: StringEscaper.escapeXml() escapes characters > 0x7f. 468o LANG-662: org.apache.commons.lang3.math.Fraction does not reduce 469 (Integer.MIN_VALUE, 2^k) 470o LANG-663: org.apache.commons.lang3.math.Fraction does not always succeed in 471 multiplyBy and divideBy 472o LANG-664: NumberUtils.isNumber(String) is not right when the String is 473 "1.1L" 474o LANG-672: Doc bug in DateUtils#ceiling 475o LANG-677: DateUtils.isSameLocalTime compares using 12-hour clock and not 476 24-hour 477o LANG-685: EqualsBuilder synchronizes on HashCodeBuilder. 478o LANG-703: StringUtils.join throws NPE when toString returns null for one of 479 objects in collection 480o LANG-710: StringIndexOutOfBoundsException when calling unescapeHtml4("") 481o LANG-714: StringUtils doc/comment spelling fixes. 482o LANG-715: CharSetUtils.squeeze() speedup. 483o LANG-716: swapCase and *capitalize speedups. 484 485 486Historical list of changes: https://commons.apache.org/lang/changes-report.html 487 488For complete information on Commons Lang, including instructions on how to 489submit bug reports, patches, or suggestions for improvement, see the 490Apache Commons Lang website: 491 492https://commons.apache.org/lang/ 493 494Have fun! 495-Apache Commons Lang team 496 497