You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by ch...@apache.org on 2017/06/19 11:54:55 UTC

[1/3] [text] TEXT-85:Added CaseUtils class with camel case conversion

Repository: commons-text
Updated Branches:
  refs/heads/master 2035ed14f -> 9f6e5e45e


TEXT-85:Added CaseUtils class with camel case conversion


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

Branch: refs/heads/master
Commit: f2626183fcf7d92fd51be24da92f033c8c22f957
Parents: 5f498c0
Author: Arun Vinud <ar...@capitalone.com>
Authored: Fri Jun 16 01:09:06 2017 -0400
Committer: Arun Vinud <ar...@capitalone.com>
Committed: Fri Jun 16 01:09:06 2017 -0400

----------------------------------------------------------------------
 .../java/org/apache/commons/text/CaseUtils.java | 140 +++++++++++++++++++
 .../org/apache/commons/text/CaseUtilsTest.java  |  80 +++++++++++
 2 files changed, 220 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-text/blob/f2626183/src/main/java/org/apache/commons/text/CaseUtils.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/commons/text/CaseUtils.java b/src/main/java/org/apache/commons/text/CaseUtils.java
new file mode 100644
index 0000000..0e313a4
--- /dev/null
+++ b/src/main/java/org/apache/commons/text/CaseUtils.java
@@ -0,0 +1,140 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.text;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.HashSet;
+import java.util.Set;
+
+/**
+ * <p>Case manipulation operations on Strings that contain words.</p>
+ *
+ * <p>This class tries to handle <code>null</code> input gracefully.
+ * An exception will not be thrown for a <code>null</code> input.
+ * Each method documents its behaviour in more detail.</p>
+ *
+ * @since 1.0
+ */
+public class CaseUtils {
+
+    /**
+     * <p><code>CaseUtils</code> instances should NOT be constructed in
+     * standard programming. Instead, the class should be used as
+     * <code>CaseUtils.toCamelCase("foo bar", true, new char[]{'-'});</code>.</p>
+     * <p>
+     * <p>This constructor is public to permit tools that require a JavaBean
+     * instance to operate.</p>
+     */
+    public CaseUtils() {
+        super();
+    }
+
+    // Camel Case
+    //-----------------------------------------------------------------------
+    /**
+     * <p>Converts all the delimiter separated words in a String into camelCase,
+     * that is each word is made up of a titlecase character and then a series of
+     * lowercase characters. The  </p>
+     *
+     * <p>The delimiters represent a set of characters understood to separate words.
+     * The first non-delimiter character after a delimiter will be capitalized. The first String
+     * character may or may not be capitalized and it's determined by the user input for capitalizeFirstLetter
+     * variable.</p>
+     *
+     * <p>A <code>null</code> input String returns <code>null</code>.
+     * Capitalization uses the Unicode title case, normally equivalent to
+     * upper case and cannot perform locale-sensitive mappings.</p>
+     *
+     * <pre>
+     * CaseUtils.toCamelCase(null, false)                                 = null
+     * CaseUtils.toCamelCase("", false, *)                                = ""
+     * CaseUtils.toCamelCase(*, false, null)                              = *
+     * CaseUtils.toCamelCase(*, true, new char[0])                        = *
+     * CaseUtils.toCamelCase("To.Camel.Case", false, new char[]{'.'})     = "toCamelCase"
+     * CaseUtils.toCamelCase(" to @ Camel case", true, new char[]{'@'})   = "ToCamelCase"
+     * CaseUtils.toCamelCase(" @to @ Camel case", false, new char[]{'@'}) = "toCamelCase"
+     * </pre>
+     *
+     * @param str  the String to be converted to camelCase, may be null
+     * @param capitalizeFirstLetter boolean that determines if the first character of first word should be title case.
+     * @param delimiters  set of characters to determine capitalization, null and/or empty array means whitespace
+     * @return camelCase of String, <code>null</code> if null String input
+     */
+    public static String toCamelCase(String str, final boolean capitalizeFirstLetter, final char... delimiters) {
+        if (StringUtils.isEmpty(str)) {
+            return str;
+        }
+        str = str.toLowerCase();
+        int strLen = str.length();
+        int [] newCodePoints = new int[strLen];
+        int outOffset = 0;
+        Set<Integer> delimiterSet = generateDelimiterSet(delimiters);
+        boolean capitalizeNext = false;
+        if (capitalizeFirstLetter) {
+            capitalizeNext = true;
+        }
+        for (int index = 0; index < strLen;) {
+            final int codePoint = str.codePointAt(index);
+
+            if (delimiterSet.contains(codePoint)) {
+                capitalizeNext = true;
+                if (outOffset == 0) {
+                    capitalizeNext = false;
+                }
+                index += Character.charCount(codePoint);
+            } else if (capitalizeNext || outOffset == 0 && capitalizeFirstLetter) {
+                int titleCaseCodePoint = Character.toTitleCase(codePoint);
+                newCodePoints[outOffset++] = titleCaseCodePoint;
+                index += Character.charCount(titleCaseCodePoint);
+                capitalizeNext = false;
+            } else {
+                newCodePoints[outOffset++] = codePoint;
+                index += Character.charCount(codePoint);
+            }
+        }
+        if (outOffset != 0) {
+            return new String(newCodePoints, 0, outOffset);
+        } else {
+            return str;
+        }
+
+    }
+
+    /**
+     * <p>Converts an array of delimiters to a hash set of code points. Code point of space(32) is added
+     * as the default value. The generated hash set provides O(1)
+     * lookup time .</p>
+     *
+     * @param delimiters  set of characters to determine capitalization, null means whitespace
+     * @return Set<Integer>
+     */
+    private static Set<Integer> generateDelimiterSet(final char[] delimiters) {
+        Set<Integer> delimiterHashSet = new HashSet<Integer>();
+        delimiterHashSet.add(Character.codePointAt(new char[]{' '}, 0));
+        if (delimiters == null || delimiters.length == 0) {
+            return delimiterHashSet;
+        }
+
+        for (int index = 0; index < delimiters.length; index++) {
+            delimiterHashSet.add(Character.codePointAt(delimiters, index));
+        }
+        return delimiterHashSet;
+
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/commons-text/blob/f2626183/src/test/java/org/apache/commons/text/CaseUtilsTest.java
----------------------------------------------------------------------
diff --git a/src/test/java/org/apache/commons/text/CaseUtilsTest.java b/src/test/java/org/apache/commons/text/CaseUtilsTest.java
new file mode 100644
index 0000000..0f3cabf
--- /dev/null
+++ b/src/test/java/org/apache/commons/text/CaseUtilsTest.java
@@ -0,0 +1,80 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.text;
+
+import org.junit.Test;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.Modifier;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+/**
+ * Unit tests for {@link CaseUtils} class.
+ */
+public class CaseUtilsTest {
+
+    //-----------------------------------------------------------------------
+    @Test
+    public void testConstructor() {
+        assertNotNull(new CaseUtils());
+        final Constructor<?>[] cons = CaseUtils.class.getDeclaredConstructors();
+        assertEquals(1, cons.length);
+        assertTrue(Modifier.isPublic(cons[0].getModifiers()));
+        assertTrue(Modifier.isPublic(CaseUtils.class.getModifiers()));
+        assertFalse(Modifier.isFinal(CaseUtils.class.getModifiers()));
+    }
+
+    //------------------------------------------------------------------------
+    @Test
+    public void testToCamelCase() throws Exception {
+        assertEquals(null, CaseUtils.toCamelCase(null, false,null));
+        assertEquals("", CaseUtils.toCamelCase("", true, null));
+        assertEquals("  ", CaseUtils.toCamelCase("  ", false, null));
+        assertEquals("aBC@def", CaseUtils.toCamelCase("a  b  c  @def", false, null));
+        assertEquals("ABC@def", CaseUtils.toCamelCase("a b c @def", true, new char[]{}));
+        assertEquals("ABC@def", CaseUtils.toCamelCase("a b c @def", true, new char[]{'-'}));
+        assertEquals("ABC@def", CaseUtils.toCamelCase("a b c @def", true, new char[]{'-'}));
+
+        char[] chars = new char[] { '-', '+', ' ', '@' };
+        assertEquals("-+@ ", CaseUtils.toCamelCase("-+@ ", true, chars));
+        assertEquals("toCamelCase", CaseUtils.toCamelCase("   to-CAMEL-cASE", false, chars));
+        assertEquals("ToCamelCase", CaseUtils.toCamelCase("@@@@   to+CAMEL@cASE ", true, chars));
+        assertEquals("ToCaMeLCase", CaseUtils.toCamelCase("To+CA+ME L@cASE", true, chars));
+
+        assertEquals("toCamelCase", CaseUtils.toCamelCase("To.Camel.Case", false, new char[]{'.'}));
+        assertEquals("toCamelCase", CaseUtils.toCamelCase("To.Camel-Case", false, new char[]{'-', '.'}));
+        assertEquals("toCamelCase", CaseUtils.toCamelCase(" to @ Camel case", false, new char[]{'-', '@'}));
+        assertEquals("ToCamelCase", CaseUtils.toCamelCase(" @to @ Camel case", true, new char[]{'-', '@'}));
+
+        assertEquals("ToCamelCase", CaseUtils.toCamelCase("TO CAMEL CASE", true, null));
+        assertEquals("toCamelCase", CaseUtils.toCamelCase("TO CAMEL CASE", false, null));
+        assertEquals("toCamelCase", CaseUtils.toCamelCase("TO CAMEL CASE", false, null));
+        assertEquals("tocamelcase", CaseUtils.toCamelCase("tocamelcase", false, null));
+        assertEquals("Tocamelcase", CaseUtils.toCamelCase("tocamelcase", true, null));
+        assertEquals("tocamelcase", CaseUtils.toCamelCase("Tocamelcase", false, null));
+
+        assertEquals("Tocamelcase", CaseUtils.toCamelCase("tocamelcase", true));
+        assertEquals("tocamelcase", CaseUtils.toCamelCase("tocamelcase", false));
+
+        assertEquals("\uD800\uDF00\uD800\uDF02", CaseUtils.toCamelCase("\uD800\uDF00 \uD800\uDF02", true));
+        assertEquals("\uD800\uDF00\uD800\uDF01\uD800\uDF02\uD800\uDF03", CaseUtils.toCamelCase("\uD800\uDF00\uD800\uDF01\uD800\uDF14\uD800\uDF02\uD800\uDF03", true, new char[]{'\uD800', '\uDF14'}));
+    }
+}
\ No newline at end of file


[2/3] [text] Merge branch 'TEXT-85' of https://github.com/arunvinudss/commons-text

Posted by ch...@apache.org.
Merge branch 'TEXT-85' of https://github.com/arunvinudss/commons-text


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

Branch: refs/heads/master
Commit: 72d54ae8be46867769f90b7cd86cf10f85f3b28c
Parents: 2035ed1 f262618
Author: Rob Tompkins <ch...@apache.org>
Authored: Mon Jun 19 07:52:25 2017 -0400
Committer: Rob Tompkins <ch...@apache.org>
Committed: Mon Jun 19 07:52:25 2017 -0400

----------------------------------------------------------------------
 .../java/org/apache/commons/text/CaseUtils.java | 140 +++++++++++++++++++
 .../org/apache/commons/text/CaseUtilsTest.java  |  80 +++++++++++
 2 files changed, 220 insertions(+)
----------------------------------------------------------------------



[3/3] [text] TEXT-85: Thanks Arun

Posted by ch...@apache.org.
TEXT-85: Thanks Arun


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

Branch: refs/heads/master
Commit: 9f6e5e45e925511d0fdbf59bb264aafa6b91f997
Parents: 72d54ae
Author: Rob Tompkins <ch...@apache.org>
Authored: Mon Jun 19 07:54:14 2017 -0400
Committer: Rob Tompkins <ch...@apache.org>
Committed: Mon Jun 19 07:54:14 2017 -0400

----------------------------------------------------------------------
 src/changes/changes.xml | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/commons-text/blob/9f6e5e45/src/changes/changes.xml
----------------------------------------------------------------------
diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index a97b474..f6c5b8f 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="1.2" date="tbd" description="tbd">
+    <action issue="TEXT-85" type="add" dev="chtompki" due-to="Arun Vinud S S">Added CaseUtils class with camel case conversion support</action>
     <action issue="TEXT-91" type="add" dev="pschumacher">RandomStringGenerator should be able to generate a String with a random length</action>
     <action issue="TEXT-92" type="update" dev="pschumacher">Update commons-lang dependency to version 3.6</action>
     <action issue="TEXT-83" type="update" dev="chtompki" due-to="Amey Jadiye">Document that commons-csv should be used in preference to CsvTranslators</action>