com.ovea.tadjin.util.StringUtils Maven / Gradle / Ivy
/** * Copyright (C) 2011 Ovea
*/ public static final char DEFAULT_QUOTE_CHAR = '"'; /** * Check whether the given String has actual text. * More specifically, returns* * Licensed 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 com.ovea.tadjin.util; import java.text.ParseException; import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.StringTokenizer; /** * Simple utility class for String operations useful across the tadjin. *
*Some methods in this class were copied from the Spring Framework so we didn't have to re-invent the wheel, * and in these cases, we have retained all license, copyright and author information. * * @since 0.9 */ public class StringUtils { /** * Constant representing the empty string, equal to "" */ public static final String EMPTY_STRING = ""; /** * Constant representing the default delimiter character (comma), equal to
','
*/ public static final char DEFAULT_DELIMITER_CHAR = ','; /** * Constant representing the default quote character (double quote), equal to '"'true
if the string notnull
, * its length is greater than 0, and it contains at least one non-whitespace character. * *StringUtils.hasText(null) == false
* *
* StringUtils.hasText("") == false
* StringUtils.hasText(" ") == false
* StringUtils.hasText("12345") == true
* StringUtils.hasText(" 12345 ") == trueCopied from the Spring Framework while retaining all license, copyright and author information. * * @param str the String to check (may be
*null
) * @returntrue
if the String is notnull
, its length is * greater than 0, and it does not contain whitespace only * @see Character#isWhitespace */ public static boolean hasText(String str) { if (!hasLength(str)) { return false; } int strLen = str.length(); for (int i = 0; i < strLen; i++) { if (!Character.isWhitespace(str.charAt(i))) { return true; } } return false; } /** * Check that the given String is neithernull
nor of length 0. * Note: Will returntrue
for a String that purely consists of whitespace. *StringUtils.hasLength(null) == false
* * Copied from the Spring Framework while retaining all license, copyright and author information. * * @param str the String to check (may be
* StringUtils.hasLength("") == false
* StringUtils.hasLength(" ") == true
* StringUtils.hasLength("Hello") == truenull
) * @returntrue
if the String is not null and has length * @see #hasText(String) */ public static boolean hasLength(String str) { return (str != null && str.length() > 0); } /** * Test if the given String starts with the specified prefix, * ignoring upper/lower case. * *Copied from the Spring Framework while retaining all license, copyright and author information. * * @param str the String to check * @param prefix the prefix to look for * @return
*true
starts with the specified prefix (ignoring case),false
if it does not. * @see String#startsWith */ public static boolean startsWithIgnoreCase(String str, String prefix) { if (str == null || prefix == null) { return false; } if (str.startsWith(prefix)) { return true; } if (str.length() < prefix.length()) { return false; } String lcStr = str.substring(0, prefix.length()).toLowerCase(); String lcPrefix = prefix.toLowerCase(); return lcStr.equals(lcPrefix); } /** * Returns a 'cleaned' representation of the specified argument. 'Cleaned' is defined as the following: **
* * Therefore this method always ensures that any given string has trimmed text, and if it doesn't,- If the specified
*String
isnull
, returnnull
- If not
*null
, {@link String#trim() trim()} it.- If the trimmed string is equal to the empty String (i.e. ""), return
*null
- If the trimmed string is not the empty string, return the trimmed version
. *null
* is returned. * * @param in the input String to clean. * @return a populated-but-trimmed String ornull
otherwise */ public static String clean(String in) { String out = in; if (in != null) { out = in.trim(); if (out.equals(EMPTY_STRING)) { out = null; } } return out; } /** * Returns the specified array as a comma-delimited (',') string. * * @param array the array whose contents will be converted to a string. * @return the array's contents as a comma-delimited (',') string. * @since 1.0 */ public static String toString(Object[] array) { return toDelimitedString(array, ","); } public static String toString(List> array) { return toDelimitedString(array, ","); } /** * Returns the array's contents as a string, with each element delimited by the specified * {@code delimiter} argument. Useful for {@code toString()} implementations and log messages. * * @param array the array whose contents will be converted to a string * @param delimiter the delimiter to use between each element * @return a single string, delimited by the specified {@code delimiter}. * @since 1.0 */ public static String toDelimitedString(Object[] array, String delimiter) { if (array == null || array.length == 0) { return EMPTY_STRING; } StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.length; i++) { if (i > 0) { sb.append(delimiter); } sb.append(array[i]); } return sb.toString(); } public static String toDelimitedString(List> array, String delimiter) { if (array == null || array.isEmpty()) { return EMPTY_STRING; } StringBuffer sb = new StringBuffer(); for (int i = 0; i < array.size(); i++) { if (i > 0) { sb.append(delimiter); } sb.append(array.get(i)); } return sb.toString(); } /** * Tokenize the given String into a String array via a StringTokenizer. * Trims tokens and omits empty tokens. *The given delimiters string is supposed to consist of any number of * delimiter characters. Each of those characters can be used to separate * tokens. A delimiter is always a single character; for multi-character * delimiters, consider using
*delimitedListToStringArray
*Copied from the Spring Framework while retaining all license, copyright and author information. * * @param str the String to tokenize * @param delimiters the delimiter characters, assembled as String * (each of those characters is individually considered as delimiter). * @return an array of the tokens * @see java.util.StringTokenizer * @see String#trim() */ public static String[] tokenizeToStringArray(String str, String delimiters) { return tokenizeToStringArray(str, delimiters, true, true); } /** * Tokenize the given String into a String array via a StringTokenizer. *
The given delimiters string is supposed to consist of any number of * delimiter characters. Each of those characters can be used to separate * tokens. A delimiter is always a single character; for multi-character * delimiters, consider using
*delimitedListToStringArray
*Copied from the Spring Framework while retaining all license, copyright and author information. * * @param str the String to tokenize * @param delimiters the delimiter characters, assembled as String * (each of those characters is individually considered as delimiter) * @param trimTokens trim the tokens via String's
*trim
* @param ignoreEmptyTokens omit empty tokens from the result array * (only applies to tokens that are empty after trimming; StringTokenizer * will not consider subsequent delimiters as token in the first place). * @return an array of the tokens (null
if the input String * wasnull
) * @see java.util.StringTokenizer * @see String#trim() */ @SuppressWarnings({"unchecked"}) public static String[] tokenizeToStringArray( String str, String delimiters, boolean trimTokens, boolean ignoreEmptyTokens) { if (str == null) { return null; } StringTokenizer st = new StringTokenizer(str, delimiters); List tokens = new ArrayList(); while (st.hasMoreTokens()) { String token = st.nextToken(); if (trimTokens) { token = token.trim(); } if (!ignoreEmptyTokens || token.length() > 0) { tokens.add(token); } } return toStringArray(tokens); } /** * Copy the given Collection into a String array. * The Collection must contain String elements only. *Copied from the Spring Framework while retaining all license, copyright and author information. * * @param collection the Collection to copy * @return the String array (
*null
if the passed-in * Collection wasnull
) */ @SuppressWarnings({"unchecked"}) public static String[] toStringArray(Collection collection) { if (collection == null) { return null; } return (String[]) collection.toArray(new String[collection.size()]); } public static String[] splitKeyValue(String aLine) throws ParseException { String line = clean(aLine); if (line == null) { return null; } String[] split = line.split(" ", 2); if (split.length != 2) { //fallback to checking for an equals sign split = line.split("=", 2); if (split.length != 2) { String msg = "Unable to determine Key/Value pair from line [" + line + "]. There is no space from " + "which the split location could be determined."; throw new ParseException(msg, 0); } } split[0] = clean(split[0]); split[1] = clean(split[1]); if (split[1].startsWith("=")) { //they used spaces followed by an equals followed by zero or more spaces to split the key/value pair, so //remove the equals sign to result in only the key and values in the split[1] = clean(split[1].substring(1)); } if (split[0] == null) { String msg = "No valid key could be found in line [" + line + "] to form a key/value pair."; throw new ParseException(msg, 0); } if (split[1] == null) { String msg = "No corresponding value could be found in line [" + line + "] for key [" + split[0] + "]"; throw new ParseException(msg, 0); } return split; } public static String[] split(String line) { return split(line, DEFAULT_DELIMITER_CHAR); } public static String[] split(String line, char delimiter) { return split(line, delimiter, DEFAULT_QUOTE_CHAR); } public static String[] split(String line, char delimiter, char quoteChar) { return split(line, delimiter, quoteChar, quoteChar); } public static String[] split(String line, char delimiter, char beginQuoteChar, char endQuoteChar) { return split(line, delimiter, beginQuoteChar, endQuoteChar, false, true); } /** * Splits the specified delimited String into tokens, supporting quoted tokens so that quoted strings themselves * won't be tokenized. *This method's implementation is very loosely based (with significant modifications) on * Glen Smith's open-source * CSVReader.java * file. *
*That file is Apache 2.0 licensed as well, making Glen's code a great starting point for us to modify to * our needs. * * @param aLine the String to parse * @param delimiter the delimiter by which the line argument is to be split * @param beginQuoteChar the character signifying the start of quoted text (so the quoted text will not be split) * @param endQuoteChar the character signifying the end of quoted text * @param retainQuotes if the quotes themselves should be retained when constructing the corresponding token * @param trimTokens if leading and trailing whitespace should be trimmed from discovered tokens. * @return the tokens discovered from parsing the given delimited line. */ public static String[] split(String aLine, char delimiter, char beginQuoteChar, char endQuoteChar, boolean retainQuotes, boolean trimTokens) { String line = clean(aLine); if (line == null) { return null; } List
tokens = new ArrayList (); StringBuffer sb = new StringBuffer(); boolean inQuotes = false; for (int i = 0; i < line.length(); i++) { char c = line.charAt(i); if (c == beginQuoteChar) { // this gets complex... the quote may end a quoted block, or escape another quote. // do a 1-char lookahead: if (inQuotes // we are in quotes, therefore there can be escaped quotes in here. && line.length() > (i + 1) // there is indeed another character to check. && line.charAt(i + 1) == beginQuoteChar) { // ..and that char. is a quote also. // we have two quote chars in a row == one quote char, so consume them both and // put one on the token. we do *not* exit the quoted text. sb.append(line.charAt(i + 1)); i++; } else { inQuotes = !inQuotes; if (retainQuotes) { sb.append(c); } } } else if (c == endQuoteChar) { inQuotes = !inQuotes; if (retainQuotes) { sb.append(c); } } else if (c == delimiter && !inQuotes) { String s = sb.toString(); if (trimTokens) { s = s.trim(); } tokens.add(s); sb = new StringBuffer(); // start work on next token } else { sb.append(c); } } String s = sb.toString(); if (trimTokens) { s = s.trim(); } tokens.add(s); return tokens.toArray(new String[tokens.size()]); } }