/* * 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; } }