| TextUtils.java |
/*
* $Id: TextUtils.java,v 1.31 2010/09/29 17:21:48 agoubard Exp $
*
* See the COPYRIGHT file for redistribution and use restrictions.
*/
package org.xins.common.text;
import java.util.Enumeration;
import java.util.Properties;
import org.xins.common.MandatoryArgumentChecker;
/**
* Text-related utility functions.
*
* @version $Revision: 1.31 $ $Date: 2010/09/29 17:21:48 $
* @author <a href="mailto:ernst@ernstdehaan.com">Ernst de Haan</a>
*
* @since XINS 1.0.0
*/
public final class TextUtils {
/**
* Constructs a new <code>TextUtils</code> object.
*/
private TextUtils() {
// empty
}
/**
* Quotes the specified string, or returns <code>"(null)"</code> if it is
* <code>null</code>.
*
* @param s
* the input string, or <code>null</code>.
*
* @return
* if <code>s != null</code> the quoted string, otherwise the string
* <code>"(null)"</code>.
*/
public static String quote(String s) {
if (s != null) {
String quoted = '"' + s + '"';
return quoted;
} else {
return "(null)";
}
}
/**
* Quotes the textual presentation (returned by <code>toString()</code>) of
* the specified object, or returns <code>"(null)"</code> if the object is
* <code>null</code>.
*
* @param o
* the object, or <code>null</code>.
*
* @return
* if <code>o != null</code> then <code>o.toString()</code> quoted,
* otherwise the string <code>"(null)"</code>.
*
* @since XINS 1.0.1
*/
public static String quote(Object o) {
String s = (o == null) ? null : o.toString();
return quote(s);
}
/**
* Determines if the specified string is <code>null</code> or an empty
* string.
*
* @param s
* the string, or <code>null</code>.
*
* @return
* <code>true</code> if <code>s == null || s.length() < 1</code>.
*
* @since XINS 1.0.1
*/
public static boolean isEmpty(String s) {
return (s == null) || (s.length() == 0);
}
/**
* Trims the specified string, or returns an empty string if the argument
* is <code>null</code>.
*
* @param s
* the string, or <code>null</code>.
*
* @param ifEmpty
* the string to return if
* <code>s == null || s.trim().length < 1</code>.
*
* @return
* the trimmed version of the string (see {@link String#trim()}) or
* <code>ifEmpty</code> if
* <code>s == null</code> or <code>s.trim().length < 1</code>.
*
* @since XINS 1.3.0
*/
public static String trim(String s, String ifEmpty) {
if (s != null) {
s = s.trim();
if (s.length() >= 1) {
return s;
}
}
return ifEmpty;
}
/**
* Replaces substrings in a string. The substrings to be replaced are
* passed in a {@link Properties} object. A prefix and a suffix can be
* specified. These are prepended/appended to each of the search keys.
*
* <p />Example: If you have a string <code>"Hello ${name}"</code> and you
* would like to replace <code>"${name}"</code> with <code>"John"</code>
* and you would like to replace <code>${surname}</code> with
* <code>"Doe"</code>, use the following code:
*
* <p /><blockquote><code>String s = "Hello ${name}";
* <br />Properties replacements = new Properties();
* <br />replacements.put("name", "John");
* <br />replacements.put("surname", "Doe");
* <br />
* <br />StringUtils.replace(s, replacements, "${", "}");</code></blockquote>
*
* <p />The result string will be <code>"Hello John"</code>.
*
* @param s
* the text string to which replacements should be applied, not <code>null</code>.
*
* @param replacements
* the replacements to apply, not <code>null</code>.
*
* @param prefix
* the optional prefix for the search keys, or <code>null</code>.
*
* @param suffix
* the optional prefix for the search keys, or <code>null</code>.
*
* @return the String with the replacements.
*
* @throws IllegalArgumentException
* if one of the mandatory arguments is missing.
*
* @since XINS 1.4.0.
*/
public static String replace(String s, Properties replacements, String prefix, String suffix)
throws IllegalArgumentException {
// Check preconditions
MandatoryArgumentChecker.check("s", s, "replacements", replacements);
// Make sure prefix and suffix are not null
prefix = (prefix == null) ? "" : prefix;
suffix = (suffix == null) ? "" : suffix;
Enumeration keys = replacements.propertyNames();
while (keys.hasMoreElements()) {
String key = (String) keys.nextElement();
String search = prefix + key + suffix;
int index = s.indexOf(search);
while (index >= 0) {
String replacement = replacements.getProperty(key);
s = s.substring(0, index) + replacement + s.substring(index + search.length());
index = s.indexOf(search);
}
}
return s;
}
/**
* Tranforms the given <code>String</code> to the similar <code>String</code>,
* but starting with an uppercase.
*
* @param text
* the text to transform, can be <code>null</code>
*
* @return
* the transformed text, the return value will start with an uppercase.
* <code>null</code> is returned if the text was <code>null</code>.
*
* @since XINS 2.0.
*/
public static String firstCharUpper(String text) {
if (text == null) {
return null;
} else if (text.length() == 0) {
return text;
} else if (!Character.isLowerCase(text.charAt(0))) {
return text;
} else if (text.length() == 1) {
return text.toUpperCase();
} else {
return text.substring(0, 1).toUpperCase() + text.substring(1);
}
}
/**
* Tranforms the given <code>String</code> to the similar <code>String</code>,
* but starting with a lowercase.
*
* @param text
* the text to transform, can be <code>null</code>
*
* @return
* the transformed text, the return value will start with a lowercase.
* <code>null</code> is returned if the text was <code>null</code>.
*
* @since XINS 2.0.
*/
public static String firstCharLower(String text) {
if (text == null) {
return null;
} else if (text.length() == 0) {
return text;
} else if (!Character.isUpperCase(text.charAt(0))) {
return text;
} else if (text.length() == 1) {
return text.toLowerCase();
} else {
return text.substring(0, 1).toLowerCase() + text.substring(1);
}
}
/**
* Removes the given character from the given <code>String</code>.
*
* @param charToRemove
* the character that should be removed from the String.
*
* @param text
* the text from which the charecter should be removed, can be <code>null</code>.
*
* @return
* the text without the character or <code>null</code> if the input text is <code>null</code>.
*
* @since XINS 2.0.
*/
public static String removeCharacter(char charToRemove, String text) {
if (text == null) {
return null;
}
if (text.indexOf(charToRemove) == -1) {
return text;
}
char[] inputText = text.toCharArray();
StringBuffer result = new StringBuffer(inputText.length);
for (int i = 0; i < inputText.length; i++) {
if (inputText[i] != charToRemove) {
result.append(inputText[i]);
}
}
if (result.length() == inputText.length) {
return text;
} else {
return result.toString();
}
}
}