/*
* Copyright 2012 James Moger
*
* 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 org.moxie.utils;
import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.text.MessageFormat;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
/**
* Utility class of string functions.
*
* @author James Moger
*
*/
public class StringUtils {
/**
* Returns true if the string is null or empty.
*
* @param value
* @return true if string is null or empty
*/
public static boolean isEmpty(String value) {
return value == null || value.trim().length() == 0;
}
/**
* Replaces carriage returns and line feeds with html line breaks.
*
* @param string
* @return plain text with html line breaks
*/
public static String breakLinesForHtml(String string) {
return string.replace("\r\n", "<br/>").replace("\r", "<br/>")
.replace("\n", "<br/>");
}
/**
* Prepare text for html presentation. Replace sensitive characters with
* html entities.
*
* @param inStr
* @param changeSpace
* @return plain text escaped for html
*/
public static String escapeForHtml(String inStr, boolean changeSpace) {
StringBuilder retStr = new StringBuilder();
int i = 0;
while (i < inStr.length()) {
if (inStr.charAt(i) == '&') {
retStr.append("&");
} else if (inStr.charAt(i) == '<') {
retStr.append("<");
} else if (inStr.charAt(i) == '>') {
retStr.append(">");
} else if (inStr.charAt(i) == '\"') {
retStr.append(""");
} else if (changeSpace && inStr.charAt(i) == ' ') {
retStr.append(" ");
} else if (changeSpace && inStr.charAt(i) == '\t') {
retStr.append(" ");
} else {
retStr.append(inStr.charAt(i));
}
i++;
}
return retStr.toString();
}
/**
* Left pad a string with the specified character, if the string length is
* less than the specified length.
*
* @param input
* @param length
* @param pad
* @return left-padded string
*/
public static String leftPad(String input, int length, char pad) {
if (input.length() < length) {
StringBuilder sb = new StringBuilder();
for (int i = 0, len = length - input.length(); i < len; i++) {
sb.append(pad);
}
sb.append(input);
return sb.toString();
}
return input;
}
public static String createBlank(int length) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < length; i++) {
sb.append(' ');
}
return sb.toString();
}
/**
* Calculates the SHA1 of the string.
*
* @param text
* @return sha1 of the string
*/
public static String getSHA1(String text) {
try {
byte[] bytes = text.getBytes("iso-8859-1");
return getSHA1(bytes);
} catch (UnsupportedEncodingException u) {
throw new RuntimeException(u);
}
}
/**
* Calculates the SHA1 of the byte array.
*
* @param bytes
* @return sha1 of the byte array
*/
public static String getSHA1(byte[] bytes) {
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(bytes, 0, bytes.length);
byte[] digest = md.digest();
return toHex(digest);
} catch (NoSuchAlgorithmException t) {
throw new RuntimeException(t);
}
}
/**
* Calculates the MD5 of the string.
*
* @param string
* @return md5 of the string
*/
public static String getMD5(String string) {
try {
byte [] bytes = string.getBytes("iso-8859-1");
return getMD5(bytes);
} catch (UnsupportedEncodingException u) {
throw new RuntimeException(u);
}
}
/**
* Calculates the MD5 of the bytes.
*
* @param string
* @return md5 of the string
*/
public static String getMD5(byte [] bytes) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.reset();
md.update(bytes);
byte[] digest = md.digest();
return toHex(digest);
} catch (NoSuchAlgorithmException t) {
throw new RuntimeException(t);
}
}
/**
* Returns the hex representation of the byte array.
*
* @param bytes
* @return byte array as hex string
*/
private static String toHex(byte[] bytes) {
StringBuilder sb = new StringBuilder(bytes.length * 2);
for (int i = 0; i < bytes.length; i++) {
if (((int) bytes[i] & 0xff) < 0x10) {
sb.append('0');
}
sb.append(Long.toString((int) bytes[i] & 0xff, 16));
}
return sb.toString();
}
/**
* Flatten the list of strings into a single string with a space separator.
*
* @param values
* @return flattened list
*/
public static String flattenStrings(Collection<String> values) {
return flattenStrings(values, " ");
}
/**
* Flatten the list of strings into a single string with the specified
* separator.
*
* @param values
* @param separator
* @return flattened list
*/
public static String flattenStrings(Collection<String> values,
String separator) {
StringBuilder sb = new StringBuilder();
for (String value : values) {
sb.append(value).append(separator);
}
if (sb.length() > 0) {
// truncate trailing separator
sb.setLength(sb.length() - separator.length());
}
return sb.toString().trim();
}
/**
* Join a base path and a resource into a single well-formed url.
*
* @param baseUrl
* @param resource
* @return a url
*/
public static String makeUrl(String baseUrl, String resource) {
if (baseUrl.charAt(baseUrl.length() - 1) != '/') {
baseUrl = baseUrl += "/";
}
if (resource.charAt(0) == '/') {
resource = resource.substring(1);
}
return baseUrl + resource;
}
/**
* Returns the path remainder after subtracting the basePath from the
* fullPath.
*
* @param basePath
* @param fullPath
* @return the relative path
*/
public static String getRelativePath(String basePath, String fullPath) {
if (basePath.equals(fullPath)) {
return "";
}
if (fullPath.startsWith(basePath)) {
String relativePath = fullPath.substring(basePath.length()).replace(
'\\', '/');
if (relativePath.charAt(0) == '/') {
relativePath = relativePath.substring(1);
}
return relativePath;
} return null;
}
/**
* Strip surrounding quotes from a string.
*
* @param value
* @return the string without leading or trailing quotes
*/
public static String stripQuotes(String value) {
if ((value.charAt(0) == '\"') || (value.charAt(0) == '\'')) {
// strip leading quote
value = value.substring(1);
}
if ((value.charAt(value.length() - 1) == '\"') ||
(value.charAt(value.length() - 1) == '\'')) {
// strip trailing quote
value = value.substring(0, value.length() - 1);
}
return value;
}
public static String quote(String value) {
if (value == null) {
return "";
}
return "'" + value + "'";
}
/**
* Breaks the CSV line into strings.
*
* @param value
* @return a list of strings
*/
public static List<String> breakCSV(String value) {
List<String> array = new ArrayList<String>();
// http://www.programmersheaven.com/user/Jonathan/blog/73-Splitting-CSV-with-regex
for (String field : value
.split(",(?=(?:[^\\\"]*\\\"[^\\\"]*[\\\"^,]*\\\")*(?![^\\\"]*\\\"))")) {
array.add(stripQuotes(field.trim()).trim());
}
return array;
}
/**
* Creates an XML node for the field, if the value is not null.
*
* @param field
* @param value
* @return
*/
public static <K> String toXML(String field, K value) {
if (value != null) {
return MessageFormat.format(" <{0}>{1}</{0}>\n", field, value);
}
return "";
}
public static String insertHardTab(String content) {
return insertAtLineBegin(content, "\t");
}
public static String insertSoftTab(String content) {
return insertAtLineBegin(content, " ");
}
public static String insertHalfTab(String content) {
return insertAtLineBegin(content, " ");
}
public static String insertAtLineBegin(String content, String insert) {
StringBuilder sb = new StringBuilder();
for (String line : content.split("\n")) {
sb.append(insert);
sb.append(line).append('\n');
}
return sb.toString();
}
/**
* Converts a url into a folder name by elimating the protocol and replacing
* forward slashes with underscores.
* e.g. http://repo1.apache.org/maven2 = repo1.apache.org_maven2
* @param url
* @return
*/
public static String urlToFolder(String url) {
String val = url.substring(url.indexOf("://") + 3);
val = val.replace('/', '_');
val = val.replace(':', '-');
return val;
}
/**
* Returns the hostname or ip address portion of a url.
*
* @param url
* @return a hostname or ip address
*/
public static String getHost(String url) {
try {
URL u = new URL(url);
return u.getHost();
} catch (Exception e) {
}
return url;
}
/**
* Returns a string trimmed to a maximum length with trailing ellipses. If
* the string length is shorter than the max, the original string is
* returned.
*
* @param value
* @param max
* @return trimmed string
*/
public static String trimString(String value, int max) {
if (value.length() <= max) {
return value;
}
return value.substring(0, max - 3) + "...";
}
}