/*
* RHQ Management Platform
* Copyright 2010-2011, Red Hat Middleware LLC, and individual contributors
* as indicated by the @author tags. See the copyright.txt file in the
* distribution for a full listing of individual contributors.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
package org.rhq.coregui.client.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import com.google.gwt.safehtml.shared.SimpleHtmlSanitizer;
/**
* A collection of utility methods for working with Strings.
*
* @author Ian Springer
*/
public class StringUtility {
/**
* Split a string on delimiter boundaries, and place each element into a List.
*
* @param s String to split up
* @param delim Delimiting token, ala StringTokenizer
*
* @return a List comprised of elements split by the tokenizing
*/
public static List<String> explode(String s, String delim) {
List<String> res = new ArrayList<String>();
if (s == null)
return res;
String[] tokens = s.split(delim);
for (String token : tokens) {
res.add(token);
}
return res;
}
/**
* Converts the collection into a comma-delimited list, Use
* {@link #toString(Collection, String)} if you need a different delimiter.
*
* @param collection The collection to convert to a String
* @param <T> The type of elements in the collection
* @return A comma-delimited list as a String
*/
public static <T> String toString(Collection<T> collection) {
return toString(collection, ",");
}
/**
* Converts the collection into a delimited list with the specified delimiter.
*
* @param collection The collection to convert to a String
* @param delimiter The delimiter to use
* @param <T> The type of elements in the collection
* @return A delimited list as a String
*/
public static <T> String toString(Collection<T> collection, String delimiter) {
StringBuilder builder = new StringBuilder();
for (T obj : collection) {
builder.append(obj).append(delimiter);
}
builder.delete(builder.length() - delimiter.length(), builder.length());
return builder.toString();
}
// TODO: I18N. The logic here may need to be pluggable for different localizations.
public static String pluralize(String singularNoun) {
String pluralNoun;
if (singularNoun.endsWith("y") && !singularNoun.endsWith("ay") && !singularNoun.endsWith("ey")
&& !singularNoun.endsWith("oy")) {
pluralNoun = singularNoun.substring(0, singularNoun.length() - 1) + "ies";
} else if (!singularNoun.endsWith("s")) {
pluralNoun = singularNoun + "s";
} else {
pluralNoun = singularNoun;
}
return pluralNoun;
}
/**
* Escapes HTML in a string to eliminate cross site scripting (XSS) vulnerabilities. Note, this impl is designed
* to be highly efficient to minimize the impact on performance.
*
* @param string the string to be escaped
*
* @return the escaped string
*/
public static String escapeHtml(String string) {
if (string == null) {
return null;
}
StringBuilder buffer = null;
for (int i = 0; i < string.length(); i++) {
char c = string.charAt(i);
if (c == '&') {
if (buffer == null) {
buffer = new StringBuilder(string.substring(0, i));
}
buffer.append("&");
} else if (c == '<') {
if (buffer == null) {
buffer = new StringBuilder(string.substring(0, i));
}
buffer.append("<");
} else if (c == '>') {
if (buffer == null) {
buffer = new StringBuilder(string.substring(0, i));
}
buffer.append(">");
} else {
if (buffer != null) {
buffer.append(c);
}
}
}
return (buffer != null) ? buffer.toString() : string;
}
/**
* Sanitizes HTML (i.e. removes unsafe HTML such as SCRIPT tags) in a string to eliminate cross site scripting (XSS)
* vulnerabilities.
*
* @param string the string to be sanitized
*
* @return the sanitized string
*/
// TODO (ips, 03/31/11): Replace this lame impl with a much more robust one - easiest way would be to upgrade to GWT
// 2.1 or later and use the new Safe HTML APIs. See also
// http://tomerdoron.blogspot.com/2011/03/less-simple-safe-html-sanitizer.html.
public static String sanitizeHtml(String string) {
if (string == null) {
return null;
}
return SimpleHtmlSanitizer.sanitizeHtml(string).asString();
}
private StringUtility() {
}
}