/*
* Copyright (C) 2015
* heaven7(donshine723@gmail.com)
*
* 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.heaven7.scrap.util;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.TreeSet;
/**
* comes from spring
*/
public abstract class StringUtils {
private static final String FOLDER_SEPARATOR = "/";
private static final String WINDOWS_FOLDER_SEPARATOR = "\\";
private static final String TOP_PATH = "..";
private static final String CURRENT_PATH = ".";
private static final char EXTENSION_SEPARATOR = '.';
public static boolean hasLength(CharSequence str) {
return (str != null) && (str.length() > 0);
}
public static boolean hasLength(String str) {
return (str != null) && (str.length() > 0);
}
public static boolean hasText(CharSequence 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;
}
public static boolean hasText(String str) {
return hasText(str);
}
public static boolean containsWhitespace(CharSequence 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;
}
public static String trimWhitespace(String str) {
if (!hasLength(str)) {
return str;
}
StringBuilder sb = new StringBuilder(str);
while ((sb.length() > 0) && (Character.isWhitespace(sb.charAt(0)))) {
sb.deleteCharAt(0);
}
while ((sb.length() > 0)
&& (Character.isWhitespace(sb.charAt(sb.length() - 1)))) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
public static String trimAllWhitespace(String str) {
if (!hasLength(str)) {
return str;
}
StringBuilder sb = new StringBuilder(str);
int index = 0;
while (sb.length() > index) {
if (Character.isWhitespace(sb.charAt(index))) {
sb.deleteCharAt(index);
} else {
index++;
}
}
return sb.toString();
}
public static String trimLeadingWhitespace(String str) {
if (!hasLength(str)) {
return str;
}
StringBuilder sb = new StringBuilder(str);
while ((sb.length() > 0) && (Character.isWhitespace(sb.charAt(0)))) {
sb.deleteCharAt(0);
}
return sb.toString();
}
public static String trimTrailingWhitespace(String str) {
if (!hasLength(str)) {
return str;
}
StringBuilder sb = new StringBuilder(str);
while ((sb.length() > 0)
&& (Character.isWhitespace(sb.charAt(sb.length() - 1)))) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
public static String trimLeadingCharacter(String str, char leadingCharacter) {
if (!hasLength(str)) {
return str;
}
StringBuilder sb = new StringBuilder(str);
while ((sb.length() > 0) && (sb.charAt(0) == leadingCharacter)) {
sb.deleteCharAt(0);
}
return sb.toString();
}
public static String trimTrailingCharacter(String str,
char trailingCharacter) {
if (!hasLength(str)) {
return str;
}
StringBuilder sb = new StringBuilder(str);
while ((sb.length() > 0)
&& (sb.charAt(sb.length() - 1) == trailingCharacter)) {
sb.deleteCharAt(sb.length() - 1);
}
return sb.toString();
}
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);
}
public static boolean endsWithIgnoreCase(String str, String suffix) {
if ((str == null) || (suffix == null)) {
return false;
}
if (str.endsWith(suffix)) {
return true;
}
if (str.length() < suffix.length()) {
return false;
}
String lcStr = str.substring(str.length() - suffix.length())
.toLowerCase();
String lcSuffix = suffix.toLowerCase();
return lcStr.equals(lcSuffix);
}
public static boolean substringMatch(CharSequence str, int index,
CharSequence substring) {
for (int j = 0; j < substring.length(); j++) {
int i = index + j;
if ((i >= str.length()) || (str.charAt(i) != substring.charAt(j))) {
return false;
}
}
return true;
}
public static int countOccurrencesOf(String str, String sub) {
if ((str == null) || (sub == null) || (str.length() == 0)
|| (sub.length() == 0)) {
return 0;
}
int count = 0;
int pos = 0;
int idx;
while ((idx = str.indexOf(sub, pos)) != -1) {
count++;
pos = idx + sub.length();
}
return count;
}
public static String replace(String inString, String oldPattern,
String newPattern) {
if ((!hasLength(inString)) || (!hasLength(oldPattern))
|| (newPattern == null)) {
return inString;
}
StringBuilder sb = new StringBuilder();
int pos = 0;
int index = inString.indexOf(oldPattern);
int oldPatternLen = oldPattern.length();
while (index >= 0) {
sb.append(inString.substring(pos, index));
sb.append(newPattern);
pos = index + oldPatternLen;
index = inString.indexOf(oldPattern, pos);
}
sb.append(inString.substring(pos));
return sb.toString();
}
public static String delete(String inString, String pattern) {
return replace(inString, pattern, "");
}
public static String deleteAny(String inString, String charsToDelete) {
if ((!hasLength(inString)) || (!hasLength(charsToDelete))) {
return inString;
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < inString.length(); i++) {
char c = inString.charAt(i);
if (charsToDelete.indexOf(c) == -1) {
sb.append(c);
}
}
return sb.toString();
}
public static String quote(String str) {
return str != null ? new StringBuilder().append("'").append(str)
.append("'").toString() : null;
}
public static Object quoteIfString(Object obj) {
return (obj instanceof String) ? quote((String) obj) : obj;
}
public static String unqualify(String qualifiedName) {
return unqualify(qualifiedName, EXTENSION_SEPARATOR);
}
public static String unqualify(String qualifiedName, char separator) {
return qualifiedName
.substring(qualifiedName.lastIndexOf(separator) + 1);
}
public static String capitalize(String str) {
return changeFirstCharacterCase(str, true);
}
public static String uncapitalize(String str) {
return changeFirstCharacterCase(str, false);
}
private static String changeFirstCharacterCase(String str,
boolean capitalize) {
if ((str == null) || (str.length() == 0)) {
return str;
}
StringBuilder sb = new StringBuilder(str.length());
if (capitalize) {
sb.append(Character.toUpperCase(str.charAt(0)));
} else {
sb.append(Character.toLowerCase(str.charAt(0)));
}
sb.append(str.substring(1));
return sb.toString();
}
public static String getFilename(String path) {
if (path == null) {
return null;
}
int separatorIndex = path.lastIndexOf(FOLDER_SEPARATOR);
return separatorIndex != -1 ? path.substring(separatorIndex + 1) : path;
}
public static String getFilenameExtension(String path) {
if (path == null) {
return null;
}
int extIndex = path.lastIndexOf(46);
if (extIndex == -1) {
return null;
}
int folderIndex = path.lastIndexOf(FOLDER_SEPARATOR);
if (folderIndex > extIndex) {
return null;
}
return path.substring(extIndex + 1);
}
public static String stripFilenameExtension(String path) {
if (path == null) {
return null;
}
int extIndex = path.lastIndexOf(46);
if (extIndex == -1) {
return path;
}
int folderIndex = path.lastIndexOf(FOLDER_SEPARATOR);
if (folderIndex > extIndex) {
return path;
}
return path.substring(0, extIndex);
}
public static String applyRelativePath(String path, String relativePath) {
int separatorIndex = path.lastIndexOf(FOLDER_SEPARATOR);
if (separatorIndex != -1) {
String newPath = path.substring(0, separatorIndex);
if (!relativePath.startsWith(FOLDER_SEPARATOR)) {
newPath = new StringBuilder().append(newPath)
.append(FOLDER_SEPARATOR).toString();
}
return new StringBuilder().append(newPath).append(relativePath)
.toString();
}
return relativePath;
}
public static Locale parseLocaleString(String localeString) {
String[] parts = tokenizeToStringArray(localeString, "_ ", false, false);
String language = parts.length > 0 ? parts[0] : "";
String country = parts.length > 1 ? parts[1] : "";
validateLocalePart(language);
validateLocalePart(country);
String variant = "";
if (parts.length >= 2) {
int endIndexOfCountryCode = localeString.indexOf(country)
+ country.length();
variant = trimLeadingWhitespace(localeString
.substring(endIndexOfCountryCode));
if (variant.startsWith("_")) {
variant = trimLeadingCharacter(variant, '_');
}
}
return language.length() > 0 ? new Locale(language, country, variant)
: null;
}
private static void validateLocalePart(String localePart) {
for (int i = 0; i < localePart.length(); i++) {
char ch = localePart.charAt(i);
if ((ch != '_') && (ch != ' ') && (!Character.isLetterOrDigit(ch)))
throw new IllegalArgumentException(new StringBuilder()
.append("Locale part \"").append(localePart)
.append("\" contains invalid characters").toString());
}
}
public static String toLanguageTag(Locale locale) {
return new StringBuilder()
.append(locale.getLanguage())
.append(hasText(locale.getCountry()) ? new StringBuilder()
.append("-").append(locale.getCountry()).toString()
: "").toString();
}
public static String[] toStringArray(Collection<String> collection) {
if (collection == null) {
return null;
}
return (String[]) collection.toArray(new String[collection.size()]);
}
public static String[] toStringArray(Enumeration<String> enumeration) {
if (enumeration == null) {
return null;
}
List<String> list = Collections.list(enumeration);
return (String[]) list.toArray(new String[list.size()]);
}
public static String[] split(String toSplit, String delimiter) {
if ((!hasLength(toSplit)) || (!hasLength(delimiter))) {
return null;
}
int offset = toSplit.indexOf(delimiter);
if (offset < 0) {
return null;
}
String beforeDelimiter = toSplit.substring(0, offset);
String afterDelimiter = toSplit.substring(offset + delimiter.length());
return new String[] { beforeDelimiter, afterDelimiter };
}
public static String[] tokenizeToStringArray(String str, String delimiters) {
return tokenizeToStringArray(str, delimiters, true, true);
}
public static String[] tokenizeToStringArray(String str, String delimiters,
boolean trimTokens, boolean ignoreEmptyTokens) {
if (str == null) {
return null;
}
StringTokenizer st = new StringTokenizer(str, delimiters);
List<String> tokens = new ArrayList<String>();
while (st.hasMoreTokens()) {
String token = st.nextToken();
if (trimTokens) {
token = token.trim();
}
if ((!ignoreEmptyTokens) || (token.length() > 0)) {
tokens.add(token);
}
}
return toStringArray(tokens);
}
public static String[] delimitedListToStringArray(String str,
String delimiter) {
return delimitedListToStringArray(str, delimiter, null);
}
public static String[] delimitedListToStringArray(String str,
String delimiter, String charsToDelete) {
if (str == null) {
return new String[0];
}
if (delimiter == null) {
return new String[] { str };
}
List<String> result = new ArrayList<String>();
if ("".equals(delimiter)) {
for (int i = 0; i < str.length(); i++)
result.add(deleteAny(str.substring(i, i + 1), charsToDelete));
} else {
int pos = 0;
int delPos;
while ((delPos = str.indexOf(delimiter, pos)) != -1) {
result.add(deleteAny(str.substring(pos, delPos), charsToDelete));
pos = delPos + delimiter.length();
}
if ((str.length() > 0) && (pos <= str.length())) {
result.add(deleteAny(str.substring(pos), charsToDelete));
}
}
return toStringArray(result);
}
public static String[] commaDelimitedListToStringArray(String str) {
return delimitedListToStringArray(str, ",");
}
public static Set<String> commaDelimitedListToSet(String str) {
Set<String> set = new TreeSet<String>();
String[] tokens = commaDelimitedListToStringArray(str);
for (String token : tokens) {
set.add(token);
}
return set;
}
}