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, ""));
