You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by pa...@apache.org on 2016/06/05 19:29:56 UTC
[1/2] [lang] LANG-1013: Add StringUtils.truncate() (closes #137)
Repository: commons-lang
Updated Branches:
refs/heads/master de0819cb8 -> 6838ba320
LANG-1013: Add StringUtils.truncate() (closes #137)
Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/c6fac966
Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/c6fac966
Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/c6fac966
Branch: refs/heads/master
Commit: c6fac966ab314769d27e117bab05aee1a72df760
Parents: de0819c
Author: Thiago Andrade <th...@gmail.com>
Authored: Sun Apr 24 14:34:48 2016 -0300
Committer: pascalschumacher <pa...@gmx.net>
Committed: Sun Jun 5 21:25:18 2016 +0200
----------------------------------------------------------------------
.../org/apache/commons/lang3/StringUtils.java | 115 ++++++++++++
.../apache/commons/lang3/StringUtilsTest.java | 177 +++++++++++++++++++
2 files changed, 292 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-lang/blob/c6fac966/src/main/java/org/apache/commons/lang3/StringUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/lang3/StringUtils.java b/src/main/java/org/apache/commons/lang3/StringUtils.java
index d4fdcf2..e2e928a 100644
--- a/src/main/java/org/apache/commons/lang3/StringUtils.java
+++ b/src/main/java/org/apache/commons/lang3/StringUtils.java
@@ -460,6 +460,121 @@ public class StringUtils {
return str == null ? EMPTY : str.trim();
}
+ /**
+ * <p>Truncates a String. This will turn
+ * "Now is the time for all good men" into "Now is the time for".</p>
+ *
+ * <p>Specifically:</p>
+ * <ul>
+ * <li>If {@code str} is less than {@code maxWidth} characters
+ * long, return it.</li>
+ * <li>Else truncate it to {@code substring(str, 0, maxWidth)}.</li>
+ * <li>If {@code maxWidth} is less than {@code 0}, throw an
+ * {@code IllegalArgumentException}.</li>
+ * <li>In no case will it return a String of length greater than
+ * {@code maxWidth}.</li>
+ * </ul>
+ *
+ * <pre>
+ * StringUtils.truncate(null, 0) = null
+ * StringUtils.truncate(null, 2) = null
+ * StringUtils.truncate("", 4) = ""
+ * StringUtils.truncate("abcdefg", 4) = "abcd"
+ * StringUtils.truncate("abcdefg", 6) = "abcdef"
+ * StringUtils.truncate("abcdefg", 7) = "abcdefg"
+ * StringUtils.truncate("abcdefg", 8) = "abcdefg"
+ * StringUtils.truncate("abcdefg", -1) = throws an IllegalArgumentException
+ * </pre>
+ *
+ * @param str the String to truncate, may be null
+ * @param maxWidth maximum length of result String, must be positive
+ * @return truncated String, {@code null} if null String input
+ * @since 3.5
+ */
+ public static String truncate(final String str, int maxWidth) {
+ return truncate(str, 0, maxWidth);
+ }
+
+ /**
+ * <p>Truncates a String. This will turn
+ * "Now is the time for all good men" into "is the time for all".</p>
+ *
+ * <p>Works like {@code truncate(String, int)}, but allows you to specify
+ * a "left edge" offset.
+ *
+ * <p>Specifically:</p>
+ * <ul>
+ * <li>If {@code str} is less than {@code maxWidth} characters
+ * long, return it.</li>
+ * <li>Else truncate it to {@code substring(str, offset, maxWidth)}.</li>
+ * <li>If {@code maxWidth} is less than {@code 0}, throw an
+ * {@code IllegalArgumentException}.</li>
+ * <li>If {@code offset} is less than {@code 0}, throw an
+ * {@code IllegalArgumentException}.</li>
+ * <li>In no case will it return a String of length greater than
+ * {@code maxWidth}.</li>
+ * </ul>
+ *
+ * <pre>
+ * StringUtils.truncate(null, 0, 0) = null
+ * StringUtils.truncate(null, 2, 4) = null
+ * StringUtils.truncate("", 0, 10) = ""
+ * StringUtils.truncate("", 2, 10) = ""
+ * StringUtils.truncate("abcdefghij", 0, 3) = "abc"
+ * StringUtils.truncate("abcdefghij", 5, 6) = "fghij"
+ * StringUtils.truncate("raspberry peach", 10, 15) = "peach"
+ * StringUtils.truncate("abcdefghijklmno", 0, 10) = "abcdefghij"
+ * StringUtils.truncate("abcdefghijklmno", -1, 10) = throws an IllegalArgumentException
+ * StringUtils.truncate("abcdefghijklmno", Integer.MIN_VALUE, 10) = "abcdefghij"
+ * StringUtils.truncate("abcdefghijklmno", Integer.MIN_VALUE, Integer.MAX_VALUE) = "abcdefghijklmno"
+ * StringUtils.truncate("abcdefghijklmno", 0, Integer.MAX_VALUE) = "abcdefghijklmno"
+ * StringUtils.truncate("abcdefghijklmno", 1, 10) = "bcdefghijk"
+ * StringUtils.truncate("abcdefghijklmno", 2, 10) = "cdefghijkl"
+ * StringUtils.truncate("abcdefghijklmno", 3, 10) = "defghijklm"
+ * StringUtils.truncate("abcdefghijklmno", 4, 10) = "efghijklmn"
+ * StringUtils.truncate("abcdefghijklmno", 5, 10) = "fghijklmno"
+ * StringUtils.truncate("abcdefghijklmno", 5, 5) = "fghij"
+ * StringUtils.truncate("abcdefghijklmno", 5, 3) = "fgh"
+ * StringUtils.truncate("abcdefghijklmno", 10, 3) = "klm"
+ * StringUtils.truncate("abcdefghijklmno", 10, Integer.MAX_VALUE) = "klmno"
+ * StringUtils.truncate("abcdefghijklmno", 13, 1) = "n"
+ * StringUtils.truncate("abcdefghijklmno", 13, Integer.MAX_VALUE) = "no"
+ * StringUtils.truncate("abcdefghijklmno", 14, 1) = "o"
+ * StringUtils.truncate("abcdefghijklmno", 14, Integer.MAX_VALUE) = "o"
+ * StringUtils.truncate("abcdefghijklmno", 15, 1) = ""
+ * StringUtils.truncate("abcdefghijklmno", 15, Integer.MAX_VALUE) = ""
+ * StringUtils.truncate("abcdefghijklmno", Integer.MAX_VALUE, Integer.MAX_VALUE) = ""
+ * StringUtils.truncate("abcdefghij", 3, -1) = throws an IllegalArgumentException
+ * StringUtils.truncate("abcdefghij", -2, 4) = throws an IllegalArgumentException
+ * </pre>
+ *
+ * @param str the String to check, may be null
+ * @param offset left edge of source String
+ * @param maxWidth maximum length of result String, must be positive
+ * @return truncated String, {@code null} if null String input
+ * @since 3.5
+ */
+ public static String truncate(final String str, int offset, int maxWidth) {
+ if (offset < 0) {
+ throw new IllegalArgumentException("offset cannot be negative");
+ }
+ if (maxWidth < 0) {
+ throw new IllegalArgumentException("maxWith cannot be negative");
+ }
+ if (str == null) {
+ return null;
+ }
+ if (offset > str.length()) {
+ return EMPTY;
+ }
+ if (str.length() > maxWidth) {
+ int ix = offset + maxWidth > str.length() ? str.length() : offset + maxWidth;
+ return str.substring(offset, ix);
+ } else {
+ return str.substring(offset);
+ }
+ }
+
// Stripping
//-----------------------------------------------------------------------
/**
http://git-wip-us.apache.org/repos/asf/commons-lang/blob/c6fac966/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
index 6c92193..0f14764 100644
--- a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
@@ -2045,6 +2045,183 @@ public class StringUtilsTest {
assertEquals("ab.ef", StringUtils.abbreviateMiddle("abcdef", ".", 5));
}
+ @Test
+ public void testTruncate_StringInt() {
+ assertNull(StringUtils.truncate(null, 12));
+ try {
+ StringUtils.truncate(null, -1);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate(null, -10);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate(null, Integer.MIN_VALUE);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ assertEquals("", StringUtils.truncate("", 10));
+ assertEquals("", StringUtils.truncate("", 10));
+ assertEquals("abc", StringUtils.truncate("abcdefghij", 3));
+ assertEquals("abcdef", StringUtils.truncate("abcdefghij", 6));
+ assertEquals("", StringUtils.truncate("abcdefghij", 0));
+ try {
+ StringUtils.truncate("abcdefghij", -1);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", -100);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", Integer.MIN_VALUE);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ assertEquals("abcdefghij", StringUtils.truncate("abcdefghijklmno", 10));
+ assertEquals("abcdefghijklmno", StringUtils.truncate("abcdefghijklmno", Integer.MAX_VALUE));
+ assertEquals("abcde", StringUtils.truncate("abcdefghijklmno", 5));
+ assertEquals("abc", StringUtils.truncate("abcdefghijklmno", 3));
+ }
+
+ @Test
+ public void testTruncate_StringIntInt() {
+ assertNull(StringUtils.truncate(null, 0, 12));
+ try {
+ StringUtils.truncate(null, -1, 0);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate(null, -10, -4);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate(null, Integer.MIN_VALUE, Integer.MIN_VALUE);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ assertNull(StringUtils.truncate(null, 10, 12));
+ assertEquals("", StringUtils.truncate("", 0, 10));
+ assertEquals("", StringUtils.truncate("", 2, 10));
+ assertEquals("abc", StringUtils.truncate("abcdefghij", 0, 3));
+ assertEquals("fghij", StringUtils.truncate("abcdefghij", 5, 6));
+ assertEquals("", StringUtils.truncate("abcdefghij", 0, 0));
+ try {
+ StringUtils.truncate("abcdefghij", 0, -1);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", 0, -10);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", 0, -100);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", 1, -100);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", 0, Integer.MIN_VALUE);
+ fail("maxWith cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", -1, 0);
+ fail("offset cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", -10, 0);
+ fail("offset cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", -100, 1);
+ fail("offset cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", Integer.MIN_VALUE, 0);
+ fail("offset cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", -1, -1);
+ fail("offset cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", -10, -10);
+ fail("offset cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", -100, -100);
+ fail("offset cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ try {
+ StringUtils.truncate("abcdefghij", Integer.MIN_VALUE, Integer.MIN_VALUE);
+ fail("offset cannot be negative");
+ } catch (Exception e) {
+ assertTrue(e instanceof IllegalArgumentException);
+ }
+ final String raspberry = "raspberry peach";
+ assertEquals("peach", StringUtils.truncate(raspberry, 10, 15));
+ assertEquals("abcdefghij", StringUtils.truncate("abcdefghijklmno", 0, 10));
+ assertEquals("abcdefghijklmno", StringUtils.truncate("abcdefghijklmno", 0, Integer.MAX_VALUE));
+ assertEquals("bcdefghijk", StringUtils.truncate("abcdefghijklmno", 1, 10));
+ assertEquals("cdefghijkl", StringUtils.truncate("abcdefghijklmno", 2, 10));
+ assertEquals("defghijklm", StringUtils.truncate("abcdefghijklmno", 3, 10));
+ assertEquals("efghijklmn", StringUtils.truncate("abcdefghijklmno", 4, 10));
+ assertEquals("fghijklmno", StringUtils.truncate("abcdefghijklmno", 5, 10));
+ assertEquals("fghij", StringUtils.truncate("abcdefghijklmno", 5, 5));
+ assertEquals("fgh", StringUtils.truncate("abcdefghijklmno", 5, 3));
+ assertEquals("klm", StringUtils.truncate("abcdefghijklmno", 10, 3));
+ assertEquals("klmno", StringUtils.truncate("abcdefghijklmno", 10, Integer.MAX_VALUE));
+ assertEquals("n", StringUtils.truncate("abcdefghijklmno", 13, 1));
+ assertEquals("no", StringUtils.truncate("abcdefghijklmno", 13, Integer.MAX_VALUE));
+ assertEquals("o", StringUtils.truncate("abcdefghijklmno", 14, 1));
+ assertEquals("o", StringUtils.truncate("abcdefghijklmno", 14, Integer.MAX_VALUE));
+ assertEquals("", StringUtils.truncate("abcdefghijklmno", 15, 1));
+ assertEquals("", StringUtils.truncate("abcdefghijklmno", 15, Integer.MAX_VALUE));
+ assertEquals("", StringUtils.truncate("abcdefghijklmno", Integer.MAX_VALUE, Integer.MAX_VALUE));
+ }
+
//-----------------------------------------------------------------------
@Test
public void testDifference_StringString() {
[2/2] [lang] LANG-1013: add changes.xml entry
Posted by pa...@apache.org.
LANG-1013: add changes.xml entry
Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/6838ba32
Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/6838ba32
Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/6838ba32
Branch: refs/heads/master
Commit: 6838ba320657b36d2433b88deb79456f6a2ec794
Parents: c6fac96
Author: pascalschumacher <pa...@gmx.net>
Authored: Sun Jun 5 21:24:57 2016 +0200
Committer: pascalschumacher <pa...@gmx.net>
Committed: Sun Jun 5 21:25:41 2016 +0200
----------------------------------------------------------------------
src/changes/changes.xml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/commons-lang/blob/6838ba32/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 1b4ad50..c1980a7 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -46,7 +46,8 @@ The <action> type attribute can be add,update,fix,remove.
<body>
<release version="3.5" date="tba" description="tba">
- <action issue="LANG-1195" type="fix" dev="pschumacher" due-to="Derek C. Ashmore">Enhance MethodUtils to allow invocation of private methods</action>
+ <action issue="LANG-1013" type="add" dev="pschumacher" due-to="Thiago Andrade">Add StringUtils.truncate()</action>
+ <action issue="LANG-1195" type="add" dev="pschumacher" due-to="Derek C. Ashmore">Enhance MethodUtils to allow invocation of private methods</action>
<action issue="LANG-1199" type="fix" dev="pschumacher" due-to="M. Steiger">Fix implementation of StringUtils.getJaroWinklerDistance()</action>
<action issue="LANG-1244" type="fix" dev="pschumacher" due-to="jjbankert">Fix dead links in StringUtils.getLevenshteinDistance() javadoc</action>
<action issue="LANG-1242" type="fix" dev="pschumacher" due-to="Neal Stewart">"\u2284":"⊄" mapping missing from EntityArrays#HTML40_EXTENDED_ESCAPE</action>