From 13a0cc63cdf11ebb98c748599a2b06eeb27e21a2 Mon Sep 17 00:00:00 2001 From: Henri Yandell Date: Tue, 20 Oct 2009 06:10:10 +0000 Subject: [PATCH] Applying Robert Scholte's patch from LANG-422, adding a appendSeparator with an alternative default separator if the StrBuilder is currently empty git-svn-id: https://svn.apache.org/repos/asf/commons/proper/lang/trunk@826969 13f79535-47bb-0310-9956-ffa450edef68 --- .../apache/commons/lang/text/StrBuilder.java | 57 ++++++++++++++++++- .../lang/text/StrBuilderAppendInsertTest.java | 35 +++++++++++- 2 files changed, 89 insertions(+), 3 deletions(-) diff --git a/src/java/org/apache/commons/lang/text/StrBuilder.java b/src/java/org/apache/commons/lang/text/StrBuilder.java index 4b274452a..6aaece999 100644 --- a/src/java/org/apache/commons/lang/text/StrBuilder.java +++ b/src/java/org/apache/commons/lang/text/StrBuilder.java @@ -68,6 +68,7 @@ * the interface. * * @author Stephen Colebourne + * @author Robert Scholte * @since 2.2 * @version $Id$ */ @@ -1096,8 +1097,40 @@ public StrBuilder appendWithSeparators(Iterator it, String separator) { * @since 2.3 */ public StrBuilder appendSeparator(String separator) { - if (separator != null && size() > 0) { - append(separator); + return appendSeparator(separator, null); + } + + /** + * Appends one of both separators to the StrBuilder. + * If the builder is currently empty it will append the defaultIfEmpty-separator + * Otherwise it will append the standard-separator + * + * Appending a null separator will have no effect. + * The separator is appended using {@link #append(String)}. + *

+ * This method is for example useful for constructing queries + *

+     * StrBuilder whereClause = new StrBuilder();
+     * if(searchCommand.getPriority() != null) {
+     *  whereClause.appendSeparator(" and", " where");
+     *  whereClause.append(" priority = ?")
+     * }
+     * if(searchCommand.getComponent() != null) {
+     *  whereClause.appendSeparator(" and", " where");
+     *  whereClause.append(" component = ?")
+     * }
+     * selectClause.append(whereClause)
+     * 
+ * + * @param standard the separator if builder is not empty, null means no separator + * @param defaultIfEmpty the separator if builder is empty, null means no separator + * @return this, to enable chaining + * @since 3.0 + */ + public StrBuilder appendSeparator(String standard, String defaultIfEmpty) { + String str = isEmpty() ? defaultIfEmpty : standard; + if (str != null) { + append(str); } return this; } @@ -1128,6 +1161,26 @@ public StrBuilder appendSeparator(char separator) { return this; } + /** + * Append one of both separators to the builder + * If the builder is currently empty it will append the defaultIfEmpty-separator + * Otherwise it will append the standard-separator + * + * The separator is appended using {@link #append(char)}. + * @param standard the separator if builder is not empty + * @param defaultIfEmpty the separator if builder is empty + * @return this, to enable chaining + * @since 3.0 + */ + public StrBuilder appendSeparator(char standard, char defaultIfEmpty) { + if (size() > 0) { + append(standard); + } + else { + append(defaultIfEmpty); + } + return this; + } /** * Appends a separator to the builder if the loop index is greater than zero. * Appending a null separator will have no effect. diff --git a/src/test/org/apache/commons/lang/text/StrBuilderAppendInsertTest.java b/src/test/org/apache/commons/lang/text/StrBuilderAppendInsertTest.java index 1b9386e7b..6a513cc41 100644 --- a/src/test/org/apache/commons/lang/text/StrBuilderAppendInsertTest.java +++ b/src/test/org/apache/commons/lang/text/StrBuilderAppendInsertTest.java @@ -993,6 +993,28 @@ public void testAppendSeparator_String() { sb.appendSeparator(","); assertEquals("foo,", sb.toString()); } + + //----------------------------------------------------------------------- + public void testAppendSeparator_String_String() { + StrBuilder sb = new StrBuilder(); + final String startSeparator = "order by "; + final String standardSeparator = ","; + final String foo = "foo"; + sb.appendSeparator(null, null); + assertEquals("", sb.toString()); + sb.appendSeparator(standardSeparator, null); + assertEquals("", sb.toString()); + sb.appendSeparator(standardSeparator, startSeparator); + assertEquals(startSeparator, sb.toString()); + sb.appendSeparator(null, null); + assertEquals(startSeparator, sb.toString()); + sb.appendSeparator(null, startSeparator); + assertEquals(startSeparator, sb.toString()); + sb.append(foo); + assertEquals(startSeparator + foo, sb.toString()); + sb.appendSeparator(standardSeparator, startSeparator); + assertEquals(startSeparator + foo + standardSeparator, sb.toString()); + } //----------------------------------------------------------------------- public void testAppendSeparator_char() { @@ -1004,6 +1026,18 @@ public void testAppendSeparator_char() { sb.appendSeparator(','); assertEquals("foo,", sb.toString()); } + public void testAppendSeparator_char_char() { + StrBuilder sb = new StrBuilder(); + final char startSeparator = ':'; + final char standardSeparator = ','; + final String foo = "foo"; + sb.appendSeparator(standardSeparator, startSeparator); // no effect + assertEquals(String.valueOf(startSeparator), sb.toString()); + sb.append(foo); + assertEquals(String.valueOf(startSeparator) + foo, sb.toString()); + sb.appendSeparator(standardSeparator, startSeparator); + assertEquals(String.valueOf(startSeparator) + foo + standardSeparator, sb.toString()); + } //----------------------------------------------------------------------- public void testAppendSeparator_String_int() { @@ -1356,5 +1390,4 @@ public void testInsertWithNullText() { sb.insert(0, (char[]) null, 0, 0); assertEquals("nullnullfoonullbarbaz", sb.toString()); } - }