Apache Commons Text
Version 1.9
Release Notes


INTRODUCTION:

This document contains the release notes for the 1.9 version of Apache Commons Text.
Commons Text is a set of utility functions and reusable components for the purpose of processing
and manipulating text that should be of use in a Java environment.


Apache Commons Text is a library focused on algorithms working on strings.

Release 1.9. Requires Java 8.

Changes in this version include:

New features:
o Add StringMatcher.size(). Thanks to Gary Gregory.
o Refactor TextStringBuilder.readFrom(Readable), extracting readFrom(CharBuffer) and readFrom(Reader). Thanks to Gary Gregory.
o Add BiStringLookup and implementation BiFunctionStringLookup. Thanks to Gary Gregory.
o Add org.apache.commons.text.StringSubstitutor.StringSubstitutor(StringSubstitutor). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.TextStringBuilder(CharSequence). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.drainChar(int). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.drainChars(int, int, char[]. int). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.isNotEmpty(). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.isReallocated(). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.readFrom(Reader, int). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.set(String). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.wrap(char[]). Thanks to Gary Gregory.
o Add org.apache.commons.text.TextStringBuilder.wrap(char[], int). Thanks to Gary Gregory.
o Add org.apache.commons.text.io.StringSubstitutorReader. Thanks to Gary Gregory.
o Add org.apache.commons.text.lookup.StringLookupFactory.functionStringLookup(Function<String, V>). Thanks to Gary Gregory.
o Add org.apache.commons.text.matcher.StringMatcher.isMatch(CharSequence, int). Thanks to Gary Gregory.
o Add org.apache.commons.text.matcher.StringMatcher.isMatch(CharSequence, int, int, int). Thanks to Gary Gregory.
o Add org.apache.commons.text.matcher.StringMatcherFactory.andMatcher(StringMatcher...). Thanks to Gary Gregory.
o Add org.apache.commons.text.matcher.StringMatcherFactory.stringMatcher(char...). Thanks to Gary Gregory.

Fixed Bugs:
o TEXT-166:  Removed non-existing parameter from Javadocs and spelled out parameters in throws. Thanks to Mikko Maunu.
o TEXT-149:  StringEscapeUtils.unescapeCsv doesn't remove quotes at begin and end of string. Thanks to Yuji Konishi.
o TEXT-174:  ScriptStringLookup does not accept ":" #126. Thanks to furkilic.
o TEXT-178:  StringSubstitutor incorrectly removes some escape characters. Thanks to Gary Gregory.
o TEXT-181:  Fix Javadocs #135. Thanks to XenoAmess.
o TEXT-182:  Fix typos #137. Thanks to XenoAmess.
o TEXT-183:  Make ConstantStringLookup.constantCache final #136. Thanks to XenoAmess.
o TEXT-184:  Simplify if in CaseUtils #134. Thanks to XenoAmess.

Changes:
o [javadoc] Fix compiler warnings in Java code example in Javadoc #124. Thanks to Johan Hammar.
o TEXT-177:  Update from Apache Commons Lang 3.9 to 3.11. Thanks to Gary Gregory.
o [build] Skip clirr since we use JApiCmp. Thanks to Gary Gregory.
o [test] junit-jupiter 5.5.1 -> 5.5.2. Thanks to Gary Gregory.
o [test] org.assertj:assertj-core 3.13.2 -> 3.16.1. Thanks to Gary Gregory.
o [build] com.puppycrawl.tools:checkstyle 8.23 -> 8.34. Thanks to Gary Gregory.
o [build] Update JUnit from 5.5.2 to 5.6.2. Thanks to Gary Gregory.
o [build] commons.jacoco.version 0.8.4 -> 0.8.5. Thanks to Gary Gregory.
o [build] commons.javadoc.version 3.1.1 -> 3.2.0. Thanks to Gary Gregory.
o [build] commons.japicmp.version 0.14.1 -> 0.14.3. Thanks to Gary Gregory.
o [build] checkstyle.plugin.version 3.1.0 -> 3.1.1. Thanks to Gary Gregory.
o [build] checkstyle.version 8.27 -> 8.33. Thanks to Gary Gregory.
o [build] org.apache.commons:commons-parent 48 -> 51. Thanks to Gary Gregory.
o [build] maven-pmd-plugin 3.12.0 -> 3.13.0. Thanks to Gary Gregory.
o [build] org.mockito 3.3.3 -> 3.4.4. Thanks to Gary Gregory.


Historical list of changes: https://commons.apache.org/proper/commons-text/changes-report.html

For complete information on Apache Commons Text, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Text website:

https://commons.apache.org/proper/commons-text

Download page: https://commons.apache.org/proper/commons-text/download_text.cgi

Have fun!
-Apache Commons Team

=============================================================================

Apache Commons Text
Version 1.8
Release Notes


INTRODUCTION:

This document contains the release notes for the 1.8 version of Apache Commons Text.
Commons Text is a set of utility functions and reusable components for the purpose of processing
and manipulating text that should be of use in a Java environment.


Apache Commons Text is a library focused on algorithms working on strings.

Release 1.8

Changes in this version include:

- New Features
  o TEXT-169: Add helper factory method org.apache.commons.text.StringSubstitutor.createInterpolator(). Thanks to Gary Gregory.
  o TEXT-170: Add String lookup for host names and IP addresses (DnsStringLookup). Thanks to Gary Gregory.
    
- Fixed Bugs
  o TEXT-167: commons-text web page missing "RELEASE-NOTES-1.7.txt". Thanks to Larry West.
  o TEXT-168: (doc) Fixed wrong value for Jaro-Winkler example #117. Thanks to luksan47.
  o TEXT-171: StringLookupFactory.addDefaultStringLookups(Map) does not convert keys to lower case. Thanks to Gary Gregory.
    
- Changes
  o Expand Javadoc for StringSubstitutor and friends. Thanks to Gary Gregory.
  o [site] checkstyle.version 8.21 -> 8.23. Thanks to Gary Gregory.
    

Historical list of changes: https://commons.apache.org/proper/commons-textchanges-report.html

For complete information on Apache Commons Text, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Text website:

https://commons.apache.org/proper/commons-text

Download it from https://commons.apache.org/proper/commons-text/download_text.cgi

=============================================================================

Apache Commons Text
Version 1.7
Release Notes

INTRODUCTION:

This document contains the release notes for the 1.7 version of Apache Commons Text.
Commons Text is a set of utility functions and reusable components for the purpose of processing
and manipulating text that should be of use in a Java environment.

Apache Commons Text is a library focused on algorithms working on strings.

Changes in this version include:

New features:

o TEXT-148:  Add an enum to the lookup package that lists all StringLookups
o TEXT-127:  Add a toggle to throw an exception when a variable is unknown in StringSubstitutor Thanks to Jean-Baptiste REICH, Sebb, Don Jeba, Gary Gregory.
o TEXT-138:  TextStringBuilder append sub-sequence not consistent with Appendable. Thanks to Neal Johnson, Don Jeba.
o TEXT-152:  Fix possible infinite loop in WordUtils.wrap for a regex pattern that would trigger on a match of 0 length Thanks to @CAPS50.
o TEXT-155:  Add a generic IntersectionSimilarity measure

Fixed Bugs:

o TEXT-111:  WordUtils.wrap must calculate offset increment from wrapOn pattern length Thanks to @CAPS50.
o TEXT-151:  Fix the JaroWinklerSimilarity to use StringUtils.equals to test for CharSequence equality
o TEXT-165:  ResourceBundleStringLookup.lookup(String) throws MissingResourceException instead of returning null.

Changes:

o TEXT-104:  Jaro Winkler Distance refers to similarity Thanks to Sascha Szott.
o TEXT-153:  Make prefixSet in LookupTranslator a BitSet Thanks to amirhadadi.
o TEXT-156:  Fix the RegexTokenizer to use a static Pattern
o TEXT-157:  Remove rounding from JaccardDistance and JaccardSimilarity
o TEXT-162:  Update Apache Commons Lang from 3.8.1 to 3.9.
o Update tests from org.assertj:assertj-core 3.12.1 to 3.12.2.
o Update site from com.puppycrawl.tools:checkstyle 8.18 to 8.21.

Historical list of changes: https://commons.apache.org/proper/commons-text/changes-report.html

For complete information on Apache Commons Text, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Text website:

https://commons.apache.org/proper/commons-text

Download it from https://commons.apache.org/proper/commons-text/download_text.cgi

=============================================================================

                          Apache Commons Text
                              Version 1.6
                             Release Notes

INTRODUCTION
============

This document contains the release notes for the 1.6 version of Apache Commons
Text. Commons Text is a set of utility functions and reusable components for
the purpose of processing and manipulating text that should be of use in a Java
environment.

This component requires Java 8.

CHANGES
=======

o TEXT-144:  Add the resource string bundle string lookup to the default set of lookups
o TEXT-145:  Add StringLookupFactory methods for the URL encoder and decoder string lookups
o TEXT-146:  org.apache.commons.text.lookup.StringLookupFactory.interpolatorStringLookup() should reuse a singleton instance
o TEXT-147:  Add a Base64 encoder string lookup.

Historical list of changes: https://commons.apache.org/proper/commons-text/changes-report.html

For complete information on Apache Commons Text, including instructions on how to submit bug reports,
patches, or suggestions for improvement, see the Apache Apache Commons Text website:

https://commons.apache.org/proper/commons-text

=============================================================================

                          Apache Commons Text
                              Version 1.5
                             Release Notes

INTRODUCTION
============

This document contains the release notes for the 1.5 version of Apache Commons
Text. Commons Text is a set of utility functions and reusable components for 
the purpose of processing and manipulating text that should be of use in a Java
environment.

This component requires Java 8.

NEW FEATURES
============

o TEXT-133:  Add a XML file XPath string lookup.
o TEXT-134:  Add a Properties file string lookup.
o TEXT-135:  Add a script string lookup.
o TEXT-136:  Add a file string lookup.
o TEXT-137:  Add a URL string lookup.
o TEXT-140:  Add a Base64 string lookup.
o TEXT-141:  Add org.apache.commons.text.lookup.StringLookupFactory.resourceBundleStringLookup(String).
o TEXT-142:  Add URL encoder and decoder string lookups.
o TEXT-143:  Add constant string lookup like the one in Apache Commons Configuration.

FIXED BUGS
==========

o TEXT-139:  Improve JaccardSimilarity computational cost Thanks to Nick Wong.
o TEXT-118:  JSON escaping incorrect for the delete control character Thanks to Nandor Kollar.
o TEXT-130:  Fixes JaroWinklerDistance: Wrong results due to precision of transpositions Thanks to Jan Martin Keil.
o TEXT-131:  JaroWinklerDistance: Calculation deviates from definition Thanks to Jan Martin Keil.

CHANGES
=======

o TEXT-132:  Update Apache Commons Lang from 3.7 to 3.8.1

=============================================================================

                          Apache Commons Text
                              Version 1.4
                             Release Notes

INTRODUCTION
============

This document contains the release notes for the 1.4 version of Apache Commons
Text. Commons Text is a set of utility functions and reusable components for 
the purpose of processing and manipulating text that should be of use in a Java
environment.

This component requires Java 8.


Changes in this version include:
    
Fixed Bugs:
o TEXT-120:  StringEscapeUtils#unescapeJson does not unescape double quotes and forward slash.
o TEXT-119:  Remove mention of SQL escaping from user guide.
o TEXT-123:  WordUtils.wrap throws StringIndexOutOfBoundsException when wrapLength is Integer.MAX_VALUE. Thanks to Takanobu Asanuma.
                
Changes:
o TEXT-121:  Update Java requirement from version 7 to 8. Thanks to pschumacher.
o TEXT-122:  Allow full customization with new API org.apache.commons.text.lookup.StringLookupFactory.interpolatorStringLookup(Map<String, StringLookup>, StringLookup, boolean).

=============================================================================

                          Apache Commons Text
                              Version 1.3
                             Release Notes

INTRODUCTION
============

This document contains the release notes for the 1.3 version of Apache Commons
Text. Commons Text is a set of utility functions and reusable components for 
the purpose of processing and manipulating text that should be of use in a Java
environment.

This component requires Java 7.

NEW FEATURES
=============

o Add Automatic-Module-Name MANIFEST entry for Java 9 compatibility  Issue: TEXT-110. 
o Add an interpolator string lookup: StringLookupFactory#interpolatorStringLookup()  Issue: TEXT-113. 
o Add a StrSubstitutor replacement based on interfaces: StringSubstitutor  Issue: TEXT-114. 
o Add a StrBuilder replacement based on the StringMatcher interface: TextStringBuilder  Issue: TEXT-115. 
o Add a StrTokenizer replacement based on the StringMatcher interface: StringTokenizer  Issue: TEXT-116. 
o Add a local host string lookup: LocalHostStringLookup  Issue: TEXT-117. 

FIXED BUGS
==========

o Build failure with java 9-ea+159  Issue: TEXT-70. 
o StrLookup API confusing  Issue: TEXT-80. 

=============================================================================

                          Apache Commons Text
                              Version 1.2
                             Release Notes

INTRODUCTION
============

This document contains the release notes for the 1.2 version of Apache Commons
Text. Commons Text is a set of utility functions and reusable components for 
the purpose of processing and manipulating text that should be of use in a Java
environment.

This component requires Java 7.

JAVA 9 SUPPORT
==============

At our time of release of 1.1, our build succeeds with Java 9-ea build 159,
and we believe all of our features to be Java 9 compatible. However, when we
run "mvn clean site" we have failures.

NEW FEATURES
=============

o TEXT-74:   StrSubstitutor: Ability to turn off substitution in values. Thanks to Ioannis Sermetziadis.
o TEXT-97:   RandomStringGenerator able to pass multiple ranges to .withinRange(). Thanks to Amey Jadiye.
o TEXT-89:   WordUtils.initials support for UTF-16 surrogate pairs. Thanks to Arun Vinud S S.
o TEXT-90:   Add CharacterPredicates for ASCII letters (uppercase/lowercase) and arabic numerals.
o TEXT-85:   Added CaseUtils class with camel case conversion support. Thanks to Arun Vinud S S.
o TEXT-91:   RandomStringGenerator should be able to generate a String with a random length.
o TEXT-102:  Add StrLookup.resourceBundleLookup(ResourceBundle).

FIXED BUGS
==========

o TEXT-106:  Exception thrown in ExtendedMessageFormat using quotes with custom registry. Thanks to Benoit Moreau.
o TEXT-100:  StringEscapeUtils#UnEscapeJson doesn't recognize escape signs correctly. Thanks to Don Jeba.
o TEXT-105:  Typo in LongestCommonSubsequence#logestCommonSubsequence. Thanks to Abrasha.

CHANGES
=======

o TEXT-107:  Upversion commons-lang to 3.7.
o TEXT-98:   Deprecate isDelimiter and use HashSets for delimiter checks. Thanks to Arun Vinud S S.
o TEXT-88:   WordUtils should treat an empty delimiter array as no delimiters. Thanks to Amey Jadiye.
o TEXT-93:   Update RandomStringGenerator to accept a list of valid characters. Thanks to Amey Jadiye.
o TEXT-92:   Update commons-lang dependency to version 3.6.
o TEXT-83:   Document that commons-csv should be used in preference to CsvTranslators. Thanks to Amey Jadiye.
o TEXT-67:   NumericEntityUnescaper.options - fix TODO.
o TEXT-84:   RandomStringGenerator claims to be immutable, but isn't.

=============================================================================

                        Release Notes for version 1.1

JAVA 9 SUPPORT
==============

At our time of release of 1.1, our build succeeds with Java 9-ea build 159,
and we believe all of our features to be Java 9 compatible. However, when we 
run "mvn clean site" we have failures.

NEW FEATURES
============

o TEXT-41:   WordUtils.abbreviate support Thanks to Amey Jadiye.
o TEXT-82:   Putting WordUtils back in to the codebase Thanks to Amey Jadiye.
o TEXT-81:   Add RandomStringGenerator Thanks to djones.
o TEXT-36:   RandomStringGenerator: allow users to provide source of randomness
             Thanks to Raymond DeCampo.
                
FIXED BUGS
==========

o TEXT-76:   Correct round issue in Jaro Winkler implementation
o TEXT-72:   Similar to LANG-1025, clirr fails site build.
                
CHANGES
=======

o TEXT-39:   WordUtils should use toXxxxCase(int) rather than toXxxxCase(char) 
             Thanks to Amey Jadiye.

=============================================================================

                        Release Notes for version 1.0

INCOMPATIBLE CHANGES
====================

All package names changed from org.apache.commons.text.beta in 1.0-beta-1 to
org.apache.commons.text in 1.0.

Methods StringEscapeUtils#escapeHtml3Once and StringEscapeUtils#escapeHtml4Once
have been removed; see TEXT-40

JAVA 9 SUPPORT
==============

At our time of release of 1.0, our build succeeds with Java 9-ea build 158,
and we believe all of our features to be Java 9 compatible. However, when we run
"mvn clean site" we have failures.

FIXED BUGS
==========

o TEXT-64:   Investigate locale issue in ExtendedMessageFormatTest. Thanks to
             chtompki.
o TEXT-69:   Resolve PMD/CMD Violations
o TEXT-65:   Fixing the 200 checkstyle errors present in 1.0-beta-1.
o TEXT-63:   Mutable fields should be private.

REMOVED
=======

o TEXT-40:   Escape HTML characters only once: revert.

=============================================================================

                        Release Notes for version 1.0-beta-1


A NOTE ON THE HISTORY OF THE CODE
=================================

The codebase began in the fall of 2014 as a location for housing algorithms for
operating on Strings that seemed to have a more complex nature than those which
would be considered a needed extension to java.lang. Thus, a new component,
different from Apache Commons Lang was warranted. As the project evolved, it was
noticed that Commons Lang had considerable more text manipulation tools than
the average Java application developer would need or even want. So, we have
decided to move the more esoteric String processing algorithms out of Commons
Lang into Commons Text.

JAVA 9 SUPPORT
==============

At our time of release of 1.0-beta-1, our build succeeds with Java 9-ea build 153,
and we believe all of our features to be Java 9 compatible.

NEW FEATURES
============

o TEXT-56:   Move CvsTranslators out of StringEscapeUtils and make them DRY
             Thanks to Jarek Strzeleck.
o TEXT-40:   Escape HTML characters only once Thanks to Sampanna Kahu.
o TEXT-32:   Add LCS similarity and distance
o TEXT-34:   Add class to generate random strings
o TEXT-29:   Add a builder to StringEscapeUtils
o TEXT-28:   Add shell/XSI escape/unescape support
o TEXT-2:    Add Jaccard Index and Jaccard Distance Thanks to Don Jeba.
o TEXT-27:   Move org.apache.commons.lang3.StringEscapeUtils.java into text
o TEXT-23:   Moving from commons-lang, the package org.apache.commons.lang3.text
o TEXT-10:   A more complex Levenshtein distance Thanks to Don Jeba.
o TEXT-24:   Add coveralls and Travis.ci integration
o TEXT-19:   Add alphabet converter Thanks to Eyal Allweil.
o TEXT-13:   Create Commons Text logo
o TEXT-7:    Write user guide
o TEXT-15:   Human name parser
o TEXT-3:    Add Cosine Similarity and Cosine Distance
o TEXT-4:    Port Myers algorithm from [collections]
o TEXT-1:    Add Hamming distance
o TEXT-9:    Incorporate String algorithms from Commons Lang Thanks to britter.

FIXED BUGS
==========

Note. We recognize the curiosity of a new component having "fixed bugs," but a
considerable number of files were migrated over from Commons Lang, some of which
needed fixes.

o TEXT-62:   Incorporate suggestions from RC2 into 1.0 release.
o TEXT-60:   Upgrading Jacoco for Java 9-ea compatibility. Thanks to Lee Adcock.
o TEXT-52:   Possible attacks through StringEscapeUtils.escapeEcmaScrip better
             javadoc
o TEXT-37:   Global vs local source of randomness
o TEXT-38:   Fluent API in "RandomStringBuilder"
o TEXT-26:   Fix JaroWinklerDistance in the manner of LUCENE-1297
o TEXT-35:   Unfinished class Javadoc for CosineDistance
o TEXT-22:   LevenshteinDistance reduce memory consumption
o TEXT-5:    IP clearance for the names package
o TEXT-11:   Work on the string metric, distance, and similarity definitions for
             the project
o TEXT-12:   Create StringDistanceFrom class that contains a StringMetric and
             the "left" side string. This would have a method that accepts the
             "right" side string to test. Thanks to Jonathan baker.
o TEXT-8:    Change (R) StringMetric.compare(CS left, CS right) to "apply" so
             that it is consistent with BiFunction. Thanks to Jonathan Baker.
o TEXT-6:    Allow extra information (e.g. Levenshtein threshold) to be stored
             as (final) fields in the StringMetric instance. Thanks to Jonathan
             Baker.

CHANGES
=======

o TEXT-61:   Naming packages org.apache.commons.text.beta Thanks to Lee Adcock.
o TEXT-58:   Refactor EntityArrays to have unmodifiableMaps in leu of String[][]
o TEXT-53:   Prepare site for 1.0 release
o TEXT-50:   Upgrade from commons-parent version 41 to version 42
o TEXT-33:   Consolidating since tags at 1.0, removing deprecated methods
o TEXT-16:   Improve HumanNameParser

REMOVED
=======

o TEXT-55:   Remove WordUtils to be added back in an upcoming 1.X release
o TEXT-51:   Remove RandomStringGenerator to be added back in the 1.1 release
o TEXT-31:   Remove org.apache.commons.text.names, for later release than 1.0


Historical list of changes: https://commons.apache.org/text/changes-report.html

For complete information on Apache Commons Text, including instructions on how
to submit bug reports, patches, or suggestions for improvement, see the Apache
Apache Commons Text website:

https://commons.apache.org/text/

Have fun!
-Apache Commons Text team