Repository: commons-lang
Updated Branches:
  refs/heads/master 648eebba2 -> eaa9269ac


[LANG-1257] StringUtils.wrapIfMissing(String, char|String)

Project: http://git-wip-us.apache.org/repos/asf/commons-lang/repo
Commit: http://git-wip-us.apache.org/repos/asf/commons-lang/commit/eaa9269a
Tree: http://git-wip-us.apache.org/repos/asf/commons-lang/tree/eaa9269a
Diff: http://git-wip-us.apache.org/repos/asf/commons-lang/diff/eaa9269a

Branch: refs/heads/master
Commit: eaa9269ac80c2a957cabed0c46173149a4137c24
Parents: 648eebb
Author: Gary Gregory <[email protected]>
Authored: Tue Aug 16 08:22:32 2016 -0700
Committer: Gary Gregory <[email protected]>
Committed: Tue Aug 16 08:22:32 2016 -0700

----------------------------------------------------------------------
 src/changes/changes.xml                         |  1 +
 .../org/apache/commons/lang3/StringUtils.java   | 85 ++++++++++++++++++++
 .../apache/commons/lang3/StringUtilsTest.java   | 44 +++++++++-
 3 files changed, 128 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-lang/blob/eaa9269a/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index 712fd7e..dcb4885 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -46,6 +46,7 @@ The <action> type attribute can be add,update,fix,remove.
   <body>
 
   <release version="3.5" date="tba" description="tba">
+    <action issue="LANG-1257" type="add" dev="ggregory" due-to="Gary 
Gregory">Add APIs StringUtils.wrapIfMissing(String, char|String)</action>
     <action issue="LANG-1190" type="fix" dev="pschumacher" 
due-to="pschumacher">TypeUtils.isAssignable throws NullPointerException when 
fromType has type variables and toType generic superclass specifies type 
variable</action>
     <action issue="LANG-1226" type="fix" dev="pschumacher" 
due-to="pschumacher">StringUtils#normalizeSpace does not trim the string 
anymore</action>
     <action issue="LANG-1251" type="fix" dev="pschumacher" due-to="Takuya 
Ueshin">SerializationUtils.ClassLoaderAwareObjectInputStream should use static 
initializer to initialize primitiveTypes map</action>

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/eaa9269a/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 01d0f70..7fbddb1 100644
--- a/src/main/java/org/apache/commons/lang3/StringUtils.java
+++ b/src/main/java/org/apache/commons/lang3/StringUtils.java
@@ -8562,4 +8562,89 @@ public class StringUtils {
 
         return wrapWith.concat(str).concat(wrapWith);
     }
+
+    /**
+     * <p>
+     * Wraps a string with a char if that char is missing from the start or 
end of the given string.
+     * </p>
+     * 
+     * <pre>
+     * StringUtils.wrap(null, *)        = null
+     * StringUtils.wrap("", *)          = ""
+     * StringUtils.wrap("ab", '\0')     = "ab"
+     * StringUtils.wrap("ab", 'x')      = "xabx"
+     * StringUtils.wrap("ab", '\'')     = "'ab'"
+     * StringUtils.wrap("\"ab\"", '\"') = "\"ab\""
+     * StringUtils.wrap("/", '/')  = "/"
+     * StringUtils.wrap("a/b/c", '/')  = "/a/b/c/"
+     * StringUtils.wrap("/a/b/c", '/')  = "/a/b/c/"
+     * StringUtils.wrap("a/b/c/", '/')  = "/a/b/c/"
+     * </pre>
+     * 
+     * @param str
+     *            the string to be wrapped, may be {@code null}
+     * @param wrapWith
+     *            the char that will wrap {@code str}
+     * @return the wrapped string, or {@code null} if {@code str==null}
+     * @since 3.5
+     */
+    public static String wrapIfMissing(final String str, final char wrapWith) {
+        if (isEmpty(str) || wrapWith == '\0') {
+            return str;
+        }
+        StringBuilder builder = new StringBuilder(str.length() + 2);
+        if (str.charAt(0) != wrapWith) {
+            builder.append(wrapWith);
+        }
+        builder.append(str);
+        if (str.charAt(str.length() - 1) != wrapWith) {
+            builder.append(wrapWith);
+        }
+        return builder.toString();
+    }
+
+    /**
+     * <p>
+     * Wraps a string with a string if that string is missing from the start 
or end of the given string.
+     * </p>
+     * 
+     * <pre>
+     * StringUtils.wrap(null, *)         = null
+     * StringUtils.wrap("", *)           = ""
+     * StringUtils.wrap("ab", null)      = "ab"
+     * StringUtils.wrap("ab", "x")       = "xabx"
+     * StringUtils.wrap("ab", "\"")      = "\"ab\""
+     * StringUtils.wrap("\"ab\"", "\"")  = "\"ab\""
+     * StringUtils.wrap("ab", "'")       = "'ab'"
+     * StringUtils.wrap("'abcd'", "'")   = "'abcd'"
+     * StringUtils.wrap("\"abcd\"", "'") = "'\"abcd\"'"
+     * StringUtils.wrap("'abcd'", "\"")  = "\"'abcd'\""
+     * StringUtils.wrap("/", "/")  = "/"
+     * StringUtils.wrap("a/b/c", "/")  = "/a/b/c/"
+     * StringUtils.wrap("/a/b/c", "/")  = "/a/b/c/"
+     * StringUtils.wrap("a/b/c/", "/")  = "/a/b/c/"
+     * </pre>
+     * 
+     * @param str
+     *            the string to be wrapped, may be {@code null}
+     * @param wrapWith
+     *            the char that will wrap {@code str}
+     * @return the wrapped string, or {@code null} if {@code str==null}
+     * @since 3.5
+     */
+    public static String wrapIfMissing(final String str, final String 
wrapWith) {
+        if (isEmpty(str) || isEmpty(wrapWith)) {
+            return str;
+        }
+        StringBuilder builder = new StringBuilder(str.length() + 
wrapWith.length() + wrapWith.length());
+        if (!str.startsWith(wrapWith)) {
+            builder.append(wrapWith);
+        }
+        builder.append(str);
+        if (!str.endsWith(wrapWith)) {
+            builder.append(wrapWith);
+        }
+        return builder.toString();
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/commons-lang/blob/eaa9269a/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 bd1b07d..75cfa38 100644
--- a/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
+++ b/src/test/java/org/apache/commons/lang3/StringUtilsTest.java
@@ -2837,11 +2837,9 @@ public class StringUtilsTest {
 
     @Test
     public void testWrap_StringChar() {
-        assertNull(StringUtils.wrap(null, null));
         assertNull(StringUtils.wrap(null, '\0'));
         assertNull(StringUtils.wrap(null, '1'));
 
-        assertEquals(null, StringUtils.wrap(null, null));
         assertEquals("", StringUtils.wrap("", '\0'));
         assertEquals("xabx", StringUtils.wrap("ab", 'x'));
         assertEquals("\"ab\"", StringUtils.wrap("ab", '\"'));
@@ -2853,6 +2851,48 @@ public class StringUtilsTest {
     }
 
     @Test
+    public void testWrapIfMissing_StringChar() {
+        assertNull(StringUtils.wrapIfMissing(null, '\0'));
+        assertNull(StringUtils.wrapIfMissing(null, '1'));
+
+        assertEquals("", StringUtils.wrapIfMissing("", '\0'));
+        assertEquals("xabx", StringUtils.wrapIfMissing("ab", 'x'));
+        assertEquals("\"ab\"", StringUtils.wrapIfMissing("ab", '\"'));
+        assertEquals("\"ab\"", StringUtils.wrapIfMissing("\"ab\"", '\"'));
+        assertEquals("'ab'", StringUtils.wrapIfMissing("ab", '\''));
+        assertEquals("'abcd'", StringUtils.wrapIfMissing("'abcd'", '\''));
+        assertEquals("'\"abcd\"'", StringUtils.wrapIfMissing("\"abcd\"", 
'\''));
+        assertEquals("\"'abcd'\"", StringUtils.wrapIfMissing("'abcd'", '\"'));
+        assertEquals("/x/", StringUtils.wrapIfMissing("x", '/'));
+        assertEquals("/x/y/z/", StringUtils.wrapIfMissing("x/y/z", '/'));
+        assertEquals("/x/y/z/", StringUtils.wrapIfMissing("/x/y/z", '/'));
+        assertEquals("/x/y/z/", StringUtils.wrapIfMissing("x/y/z/", '/'));
+        assertEquals("/", StringUtils.wrapIfMissing("/", '/'));
+    }
+
+    @Test
+    public void testWrapIfMissing_StringString() {
+        assertNull(StringUtils.wrapIfMissing(null, "\0"));
+        assertNull(StringUtils.wrapIfMissing(null, "1"));
+
+        assertEquals("", StringUtils.wrapIfMissing("", "\0"));
+        assertEquals("xabx", StringUtils.wrapIfMissing("ab", "x"));
+        assertEquals("\"ab\"", StringUtils.wrapIfMissing("ab", "\""));
+        assertEquals("\"ab\"", StringUtils.wrapIfMissing("\"ab\"", "\""));
+        assertEquals("'ab'", StringUtils.wrapIfMissing("ab", "\'"));
+        assertEquals("'abcd'", StringUtils.wrapIfMissing("'abcd'", "\'"));
+        assertEquals("'\"abcd\"'", StringUtils.wrapIfMissing("\"abcd\"", 
"\'"));
+        assertEquals("\"'abcd'\"", StringUtils.wrapIfMissing("'abcd'", "\""));
+        assertEquals("/x/", StringUtils.wrapIfMissing("x", "/"));
+        assertEquals("/x/y/z/", StringUtils.wrapIfMissing("x/y/z", "/"));
+        assertEquals("/x/y/z/", StringUtils.wrapIfMissing("/x/y/z", "/"));
+        assertEquals("/x/y/z/", StringUtils.wrapIfMissing("x/y/z/", "/"));
+        assertEquals("/", StringUtils.wrapIfMissing("/", "/"));
+        assertEquals("ab/ab", StringUtils.wrapIfMissing("/", "ab"));
+        assertEquals("ab/ab", StringUtils.wrapIfMissing("ab/ab", "ab"));
+    }
+
+    @Test
     public void testWrap_StringString() {
         assertNull(StringUtils.wrap(null, null));
         assertNull(StringUtils.wrap(null, ""));

Reply via email to