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>