
org.apache.empire.commons.StringUtils Maven / Gradle / Ivy
The newest version!
/* * 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.empire.commons; import java.math.BigDecimal; import java.util.Collection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * This class contains common functions for comparing and converting values of type String. * */ public class StringUtils { // Logger private static final Logger log = LoggerFactory.getLogger(StringUtils.class); /** * ObjectStringifier * Converts an object to a String */ public static class ObjectStringifier { /** * Returns whether or not to ignore empty values in arrays * @param separator the list separator * @return true if empty values should be treated as non-existent or false otherwise */ public boolean isIgnoreEmpty(String separator) { return SPACE.equals(separator); } /** * Convert a single root element * @param value the value to convert * @param defValue the default value * @return the value string */ public String toString(Object value, String defValue) { return toString(value, DEFAULT_ITEM_SEPARATOR, defValue); } /** * Convert a single element inside an array or collection * @param value the value to convert * @param listTemplate the list template * @param defValue the default value * @return the value string */ public String toString(Object value, String listTemplate, String defValue) { // Collections if (value instanceof Object[]) value = arrayToString((Object[])value, listTemplate, (defValue!=null ? defValue : EMPTY), this); else if (value instanceof Collection>) value = listToString((Collection>)value, listTemplate, (defValue!=null ? defValue : EMPTY), this); // default return ((value!=null) ? value.toString() : defValue); } /** * Estimates the buffer size required for the target String * This function should be fast and rather estimate to much than to little * @param value the value for which to estimate * @param defValueLength the length of the default value * @return the estimated buffer size */ public int estimateBufferSize(Object value, int defValueLength) { if (value instanceof String) return ((String)value).length(); else if (value instanceof BigDecimal) { BigDecimal bd = (BigDecimal)value; return bd.precision()+1; } else if (value instanceof Number) { long lval =((Number)value).longValue(); long temp = 1; int len =0; while (temp <= lval) { len++; temp *= 10; } if ((value instanceof Double) || (value instanceof Float)) len += 5; // add 4 for decimal places plus separator return len; } else if (value instanceof Character) return 1; else if (value instanceof Enum>) return value.toString().length(); // assume this is quick else return 20; // Unknown type } } /** * StringUtils constructor * No instances allowed */ private StringUtils() { // Static Function only // No instance may be created } /** * Empty String */ public static final String EMPTY = ""; /** * Single Space */ public static final String SPACE = " "; /** * Null String */ public static final String NULL = "null"; /** * Default Item Separator */ public static String DEFAULT_ITEM_SEPARATOR = "|"; /** * Default List Template */ public static String LIST_TEMPLATE = "[*|*]"; public static char TEMPLATE_SEP_CHAR = '*'; private static ObjectStringifier defaultStringifier = new ObjectStringifier(); public static ObjectStringifier getObjectStringifier() { return defaultStringifier; } public static ObjectStringifier setObjectStringifier(ObjectStringifier stringifier) { ObjectStringifier prev = defaultStringifier; defaultStringifier = stringifier; return prev; } /** * Converts a value to a string. * If the value is null then the default value is returned. * * @param value the value to convert * @param listTemplate the list template or item separator to be used for arrays and lists * @param defValue default value which to return if value is null * @return returns a string for the object or the defValue if null public static String toString(Object value, String listTemplate, String defValue) { // Collections if (value instanceof Object[]) value = arrayToString((Object[])value, listTemplate, (defValue!=null ? defValue : EMPTY)); else if (value instanceof Collection>) value = listToString((Collection>)value, listTemplate, (defValue!=null ? defValue : EMPTY)); // default return ((value!=null) ? value.toString() : defValue); } */ /** * Converts a value to a string. * If the value is null then the default value is returned. * * @param value the value to convert * @param defValue default value which to return if value is null * @return returns a string for the object or the defValue if null */ public static String toString(Object value, String defValue) { return defaultStringifier.toString(value, defValue); } /** * Converts a value to a string. * If the value is null then null will be returned. * * @param value the value to convert * @return returns a string for the object or null */ public static String toString(Object value) { return toString(value, null); } /** * Converts a value to a string. * if the value is null an empty string is returned. * * @param value the value to convert * @return returns a string for the object or an empty string if null */ public static String valueOf(Object value) { return toString(value, EMPTY); } /** * Converts a value to a string. * Almost same as toString() but Lists and Arrays are wrapped with the standard list template (LIST_TEMPLATE) * if the value is null an empty string is returned. * * @param value the value to convert * @return returns a string for the object or an empty string if null */ public static String asString(Object value) { if (value==null) return EMPTY; // array or list if (value.getClass().isArray() || (value instanceof Collection>)) return defaultStringifier.toString(value, LIST_TEMPLATE, EMPTY); // single value return defaultStringifier.toString(value, EMPTY); } /** * Returns the length of a String * @param value the string value * @return length of the string value or 0 */ public static int length(String value) { return (value!=null ? value.length() : 0); } /** * Returns the preferred String if it is not empty * ot the alternative String otherwise. * * @param preferred the preferred String * @param alternative the alternative String if the preferred String is not valid * @return the preferred String if it is not empty ot the alternative String otherwise */ public static String coalesce(String preferred, String alternative) { return isEmpty(preferred) ? alternative : preferred; } /** * Returns null if the value supplied is null or an empty String. * * @param value the value to check * @return null if the value supplied is null or an empty String or the value as a string otherwise */ public static String nullIfEmpty(Object value) { if (value==null) return null; String strval = value.toString(); return (isEmpty(strval) ? null : strval); } /** * Returns true if the given substring is part of the string provided by value * * @param value the value to check * @param substring the substring * @return true if the given substring is part of the string provided by value */ public static boolean contains(String value, String substring) { if (value==null || substring==null) return false; return ((value.indexOf(substring))>=0); } /** * Returns true if the given substring is part of the string provided by value * * @param value the value to check * @param substring the substring * @return true if the given substring is part of the string provided by value */ public static boolean notContains(String value, String substring) { if (value==null || substring==null) return true; return ((value.indexOf(substring))<0); } /** * Returns the first index of any of the given characters in value starting from the beginning * * @param value the value to check * @param chars the characters to search * @return the index */ public static int indexOfAny(String value, char... chars) { if (value==null || chars.length==0) return -1; // search for (int i=0; i
*/ public static boolean isEmpty(String s) { if (s!=null) { // check for any non-space character for (int i=0; i=0; i--) { char c = value.charAt(i); for (int j=0; j 1 || tbeg>0) { // build the list int tend =(tbeg>=0 ? template.lastIndexOf(TEMPLATE_SEP_CHAR) : -1); String separator = ((tbeg>0) ? (tend>tbeg ? template.substring(tbeg+1, tend) : DEFAULT_ITEM_SEPARATOR) : template); // create StringBuilder boolean ignoreEmpty = stringifier.isIgnoreEmpty(separator); int bufferLen = estimateArrayBufferSize(array, stringifier, length(separator), length(defItemValue), ignoreEmpty); if (template!=null && template.length()>separator.length()) { // template extra if (tbeg>0) bufferLen += tbeg; if (tend>0) bufferLen += (template.length()-tend-1); } StringBuilder buf = new StringBuilder(bufferLen); if (tend>0) buf.append(template.substring(0, tbeg)); // add template prefix boolean isEmpty = true; boolean hasValue = false; for (int i = 0; i < array.length; i++) { // append separator if (hasValue && separator!=null) buf.append(separator); // append value String value = stringifier.toString(array[i], template, defItemValue); hasValue = (value!=null && !(ignoreEmpty && StringUtils.isEmpty(value))); isEmpty &= !hasValue; if (hasValue) buf.append(value); } if (hasValue==false && !isEmpty && separator!=null) buf.setLength(buf.length()-separator.length()); // remove last separator if (tend>0) buf.append(template.substring(tend+1)); // add template suffix if (buf.length()!=bufferLen) log.debug("estimateArrayBufferSize returned {} but string length is {}", bufferLen, buf.length()); return buf.toString(); } // Only one member String value = stringifier.toString(array[0], template, defItemValue); if (stringifier.isIgnoreEmpty(template) && StringUtils.isEmpty(value)) return defItemValue; return value; } /** * Converts an array of objects to a string. * * @param array array of objects * @param template the list template or item separator * @param defItemValue the default item value * @return returns a String or null if the array is null or empty */ public static String arrayToString(Object[] array, String template, String defItemValue) { return arrayToString(array, template, defItemValue, defaultStringifier); } /** * Converts an array of objects to a string. * * @param array array of objects * @param separator the separator to put between the object strings * @return returns a String */ public static String arrayToString(Object[] array, String separator) { return arrayToString(array, separator, EMPTY); } /** * Converts an array of objects to a string. * * @param array array of objects * @return returns a String */ public static String arrayToString(Object[] array) { return arrayToString(array, DEFAULT_ITEM_SEPARATOR, EMPTY); } /** * Estimates the buffer size needed to convert an Array into a String * @param array the array * @param stringifier interface to convert an object to a string * @param separatorLength the separator length * @param defValueLength the default length * @param ignoreEmpty flag whether to ignore empty parts * @return the estimated length of the collection parts */ public static int estimateArrayBufferSize(Object[] array, ObjectStringifier stringifier, int separatorLength, int defValueLength, boolean ignoreEmpty) { int estimate = 0; for (int i = 0; i < array.length; i++) { Object item = array[i]; int len = 0; if (item instanceof String) { // when ignoreEmpty check string for emptyness if (ignoreEmpty && StringUtils.isEmpty(((String)item))) len=0; else len = ((String)item).length(); } else if (item instanceof Object[]) len = estimateArrayBufferSize((Object[])item, stringifier, separatorLength, defValueLength, ignoreEmpty) + 2; else if (item instanceof Collection>) len = estimateListBufferSize((Collection>)item, stringifier, separatorLength, defValueLength, ignoreEmpty) + 2; else if (item!=null) len = stringifier.estimateBufferSize(item, defValueLength); else len = defValueLength; // the default when null // adjust estimate if (i>0 && (len>0 || !ignoreEmpty)) estimate += separatorLength; estimate += len; } return estimate; } /** * Converts a list (Collection) of objects to a string. * * @param list the collection of objects * @param template the list template or item separator * @param defItemValue the default item value * @param stringifier interface to convert an object to a string * @return returns a String or null if the list is null */ public static String listToString(Collection> list, String template, String defItemValue, ObjectStringifier stringifier) { if (list==null || list.isEmpty()) return null; // check int tbeg = (template!=null ? template.indexOf(TEMPLATE_SEP_CHAR) : -1); if (list.size()>1 || tbeg>0) { // build the list int tend =(tbeg>=0 ? template.lastIndexOf(TEMPLATE_SEP_CHAR) : -1); String separator = ((tbeg>0) ? (tend>tbeg ? template.substring(tbeg+1, tend) : DEFAULT_ITEM_SEPARATOR) : template); // create StringBuilder boolean ignoreEmpty = stringifier.isIgnoreEmpty(separator); int bufferLen = estimateListBufferSize(list, stringifier, length(separator), length(defItemValue), ignoreEmpty); if (template!=null && template.length()>separator.length()) { // template extra if (tbeg>0) bufferLen += tbeg; if (tend>0) bufferLen += (template.length()-tend-1); } StringBuilder buf = new StringBuilder(bufferLen); if (tend>0) buf.append(template.substring(0, tbeg)); // add template prefix boolean isEmpty = true; boolean hasValue = false; for (Object item : list) { // append separator if (hasValue && separator!=null) buf.append(separator); // append value String value = stringifier.toString(item, template, defItemValue); hasValue = (value!=null && !(ignoreEmpty && StringUtils.isEmpty(value))); isEmpty &= !hasValue; if (hasValue) buf.append(value); } if (hasValue==false && !isEmpty && separator!=null) buf.setLength(buf.length()-separator.length()); // remove last separator if (tend>0) buf.append(template.substring(tend+1)); // add template suffix if (buf.length()!=bufferLen) log.debug("estimateListBufferSize returned {} but string length is {}", bufferLen, buf.length()); return buf.toString(); } // Only one member String value = stringifier.toString(list.iterator().next(), template, defItemValue); if (stringifier.isIgnoreEmpty(template) && StringUtils.isEmpty(value)) return defItemValue; return value; } /** * Converts a list (Collection) of objects to a string. * * @param list the collection of objects * @param template the list template or item separator * @param defItemValue the default item value * @return returns a String */ public static String listToString(Collection> list, String template, String defItemValue) { return listToString(list, template, defItemValue, defaultStringifier); } /** * Converts a list (Collection) of objects to a string. * * @param list the collection of objects * @param separator the separator to put between the object strings * @return returns a String */ public static String listToString(Collection> list, String separator) { return listToString(list, separator, EMPTY); } /** * Converts a list (Collection) of objects to a string. * * @param list the collection of objects * @return returns a String */ public static String listToString(Collection> list) { return listToString(list, DEFAULT_ITEM_SEPARATOR, EMPTY); } /** * Estimates the buffer size needed to convert a Collection into a String * @param list the list to estimate * @param stringifier interface to convert an object to a string * @param separatorLength the separator length * @param defValueLength the default length * @param ignoreEmpty flag whether to ignore empty parts * @return the estimated length of the collection parts */ public static int estimateListBufferSize(Collection> list, ObjectStringifier stringifier, int separatorLength, int defValueLength, boolean ignoreEmpty) { boolean first = true; int estimate = 0; for (Object item : list) { int len = 0; if (item instanceof String) { // when ignoreEmpty check string for emptyness if (ignoreEmpty && StringUtils.isEmpty(((String)item))) len=0; else len = ((String)item).length(); } else if (item instanceof Object[]) len = estimateArrayBufferSize((Object[])item, stringifier, separatorLength, defValueLength, ignoreEmpty) + 2; else if (item instanceof Collection>) len = estimateListBufferSize((Collection>)item, stringifier, separatorLength, defValueLength, ignoreEmpty) + 2; else if (item!=null) len = stringifier.estimateBufferSize(item, defValueLength); else len = defValueLength; // the default when null // adjust estimate if (!first && (len>0 || !ignoreEmpty)) estimate += separatorLength; estimate += len; first = false; } return estimate; } /** * Assembles a string from parts with a separator char * * @param separator the separator to put between the object strings * @param params array of objects * @return returns a String */ public static String concatItems(char separator, Object... params) { return arrayToString(params, String.valueOf(separator)); } /** * Assembles a string from several parts * * @param parts the parts to concatenate * @return returns a String */ public static String concat(String... parts) { int totalLength=0; for (int i=0; i null ' ') return false; } // empty return true; } /** * Checks if a string is not null or empty * * @param s the string to validate * * @return true if valid */ public static boolean isNotEmpty(String s) { return !isEmpty(s); } /** * Compares two Strings with each other - either with or without character case. Both arguments may be null. * @param s1 the first String * @param s2 the second String * @param ignoreCase whether to ignore the character casing or not * @return true if the two strings supplied are equal */ public static boolean compareEqual(String s1, String s2, boolean ignoreCase) { // Empty if (isEmpty(s1)) return isEmpty(s2); else if (isEmpty(s2)) return false; // Compare return (ignoreCase) ? s1.equalsIgnoreCase(s2) : s1.equals(s2); } /** * Compares two Strings with each other - either with or without character case. Both arguments may be null. * @param s1 the first String * @param s2 the second String * @return true if the two strings supplied are equal */ public static boolean compareEqual(String s1, String s2) { // Empty if (isEmpty(s1)) return isEmpty(s2); else if (isEmpty(s2)) return false; // Compare return s1.equals(s2); } /** * Compares two Strings with each other - either with or without character case. Both arguments may be null. * @param s1 the first String * @param s2 the second String * @param ignoreCase whether to ignore the character casing or not * @return true if the two strings supplied are not equal */ public static boolean compareNotEqual(String s1, String s2, boolean ignoreCase) { return !compareEqual(s1, s2, ignoreCase); } /** * Compares two Strings with each other - either with or without character case. Both arguments may be null. * @param s1 the first String * @param s2 the second String * @return true if the two strings supplied are not equal */ public static boolean compareNotEqual(String s1, String s2) { return !compareEqual(s1, s2); } /** * Validates a given string. If the string is empty then null is returned. * Otherwise the trimmed string is returned. * * @param s the string to validate * @return the string or null if s was empty. */ public static String validate(String s) { if (s==null) return null; s = s.trim(); if (s.length()==0) return null; return s; } /** * Replaces all occurrences of find in source by replace. * * @param source the original String. * @param find the String to be replaced * @param replace the replacement string * * @return a new string with all occurrences of find
insource
replaced byreplace
*/ public static String replace(String source, String find, String replace) { // Check params if (source == null || find == null || find.length()==0) return source; // Find the character int index = source.indexOf(find); if (index < 0) return source; if (replace==null) replace=""; // replace and find again int len = find.length(); return concat(source.substring(0,index), replace, replace(source.substring(index+len), find, replace)); } /** * Returns a String with all occurrences offrom
withinorig
replaced withto
. * Iforig
contains no occurrences offrom
, or iffrom
is equal to *to
,orig
itself is returned rather than a copy being made. If orig isnull
, *null
is returned. * * @param s the original String. * @param find the String to be replaced * @param replace the replacement string * * @return a new string with all occurrences offind
insource
replaced byreplace
*/ public static String replaceAll(String s, String find, String replace) { if (s == null) return null; if (replace == null) replace = ""; if (find == null || "".equals(find) || find.equals(replace)) { // Nothing to find return s; } int start = s.indexOf(find); if (start < 0) { // Nothing to replace return s; } // Rebuild string StringBuilder b = new StringBuilder(s.length()); char[] origChars = s.toCharArray(); int findLength = find.length(); int copyFrom = 0; while (start>= 0) { // append part b.append(origChars, copyFrom, start - copyFrom); if (replace.length()>0) b.append(replace); copyFrom = start + findLength; start = s.indexOf(find, copyFrom); } // append the rest if (origChars.length > copyFrom) b.append(origChars, copyFrom, origChars.length - copyFrom); // done return b.toString(); } /** * Removes all occurrences of remove from s * @param s the source string * @param remove the string to remove * @return the result string */ public static String remove(String s, String remove) { return replaceAll(s, remove, null); } /** * Removes all occurrences of c from s * @param s the source string * @param c the character to remove * @return the result string */ public static String remove(String s, char c) { return replaceAll(s, String.valueOf(c), null); } /** * removes all blanks from s * @param s the source string * @return the result string */ public static String removeBlanks(String s) { return remove(s, " "); } /** * returns true if the character c is between the characters beg and end * @param c the source character * @param beg the lower end character * @param end the higher end character * @return true if the c is between beg and end, or false otherwise */ public static boolean isCharBetween(char c, char beg, char end) { return (c>=beg && c<=end); } /** * returns true if the character c is a number digit ('0'-'9') * @param c the source character * @return true if the c is between 0 and 9 */ public static boolean isNumber(char c) { return (c>='0' && c<='9'); } /** * returns true if the string s is a number (contains only the characters 0 to 9) * @param s the source string * @return true if s contains only the characters 0 to 9 */ public static boolean isNumber(String s) { if (isEmpty(s)) return false; // check all chars for (int i=0; i0) return false; if (!isNumeric(c, decimal)) return false; } return true; } /** * returns true if the character c is an upper case character ('A'-'Z') * @param c the character * @return true if c is an upper case character */ public static boolean isUpper(char c) { return (c>='A' && c<='Z') || (c>='À' && c<='Ý'); } /** * returns true if the first count characters of s are all upper case (or other non-case sensitive characters) * @param s the source string * @param count number of characters to check * @return true if the first count characters of s are all upper case */ public static boolean isUpper(String s, int count) { if (isEmpty(s)) return false; if (count>s.length()) count=s.length(); for (int i=0; i ='a' && c<='z') || (c>='ß' && c<='ÿ'); } /** * returns true if the first count characters of s are all lower case (or other non-case sensitive characters) * @param s the source string * @param count number of characters to check * @return true if the first count characters of s are all lower case */ public static boolean isLower(String s, int count) { if (isEmpty(s)) return false; if (count>s.length()) count=s.length(); for (int i=0; i =size) return s; // padding required int padCount = size-s.length(); if (padCount==1) return String.valueOf(padChar)+s; // more than one StringBuilder b = new StringBuilder(size); while (b.length() =size) return s; // padding required if (size-s.length()==1) return s+String.valueOf(padChar); // more than one StringBuilder b = new StringBuilder(size); b.append(s); while (b.length() =0) text = text.trim().replace(' ', '_'); // begin StringBuilder b = new StringBuilder(text.length()); int beg=0; while (beg beg) { if (b.length()==0 && !firstCharUpper) { // begin with all lower cases b.append(text.substring(beg, end).toLowerCase()); } else { // add word where first letter is upper case b.append(text.substring(beg, beg+1).toUpperCase()); if (end-beg>1) { b.append(text.substring(beg+1, end).toLowerCase()); } } } // next beg = end + 1; } // Result return b.toString(); } }
© 2015 - 2025 Weber Informatics LLC | Privacy Policy