package de.invesdwin.util.lang;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.annotation.concurrent.Immutable;
import org.apache.commons.lang3.builder.ReflectionToStringBuilder;
import de.invesdwin.norva.apt.staticfacade.StaticFacadeDefinition;
import de.invesdwin.norva.beanpath.BeanPathStrings;
import de.invesdwin.util.lang.internal.AStringsStaticFacade;
import de.invesdwin.util.lang.internal.CheckedCastStrings;
import de.invesdwin.util.lang.internal.DefaultToStringStyle;
import de.invesdwin.util.lang.internal.MultilineToStringStyle;
@Immutable
@StaticFacadeDefinition(name = "de.invesdwin.util.lang.internal.AStringsStaticFacade", targets = {
CheckedCastStrings.class, BeanPathStrings.class })
public final class Strings extends AStringsStaticFacade {
public static final ADelegateComparator<String> COMPARATOR = new ADelegateComparator<String>() {
@Override
protected Comparable<?> getCompareCriteria(final String e) {
return e;
}
};
public static final String EMPTY = org.apache.commons.lang3.StringUtils.EMPTY;
private static final Map<String, String> SYMBOL_ESCAPEDHTML = new HashMap<String, String>();
static {
SYMBOL_ESCAPEDHTML.put("ä", "ä");
SYMBOL_ESCAPEDHTML.put("Ä", "Ä");
SYMBOL_ESCAPEDHTML.put("ö", "ö");
SYMBOL_ESCAPEDHTML.put("Ö", "Ö");
SYMBOL_ESCAPEDHTML.put("ü", "ü");
SYMBOL_ESCAPEDHTML.put("Ü", "Ü");
SYMBOL_ESCAPEDHTML.put("ß", "ß");
SYMBOL_ESCAPEDHTML.put("€", "€");
SYMBOL_ESCAPEDHTML.put("©", "©");
SYMBOL_ESCAPEDHTML.put("•", "•");
SYMBOL_ESCAPEDHTML.put("™", "™");
SYMBOL_ESCAPEDHTML.put("®", "®");
SYMBOL_ESCAPEDHTML.put("§", "§");
}
private Strings() {}
public static String escapeHtmlSymbolsWithoutDestroyingMarkup(final String str) {
String escapedValue = str;
if (escapedValue != null) {
for (final Entry<String, String> entry : SYMBOL_ESCAPEDHTML.entrySet()) {
escapedValue = escapedValue.replace(entry.getKey(), entry.getValue());
}
}
return escapedValue;
}
public static String removeLeading(final String s, final String leading) {
String removed = s;
while (removed.startsWith(leading)) {
removed = removeStart(removed, leading.length());
}
return removed;
}
public static String removeTrailing(final String s, final String trailing) {
String removed = s;
while (removed.endsWith(trailing)) {
removed = removeEnd(removed, trailing.length());
}
return removed;
}
public static String removeStart(final String s, final int countCharacters) {
return s.substring(countCharacters, s.length());
}
public static String removeAnyEnd(final String s, final String... ends) {
for (final String end : ends) {
if (s.endsWith(end)) {
return removeEnd(s, end);
}
}
return s;
}
public static boolean isEmpty(final StringBuilder s) {
return s == null || s.length() == 0;
}
/**
* Removes all non ASCII characters from the string.
*
* @see <a href=
* "http://stackoverflow.com/questions/123336/how-can-you-strip-non-ascii-characters-from-a-string-in-c">
* stackoverflow.com</a>
*/
public static String stripNonAscii(final String s) {
if (Strings.isBlank(s)) {
return s;
} else {
return s.replaceAll("[^\u0000-\u007F]", "");
}
}
/**
*
* @see <a href=
* "http://stackoverflow.com/questions/1176904/php-how-to-remove-all-non-printable-characters-in-a-string">
* stackoverflow.com</a>
*/
public static String stripNonPrintableAscii(final String s) {
if (Strings.isBlank(s)) {
return s;
} else {
return s.replaceAll("[^\\x0A\\x20-\\x7E]", "");
}
}
public static String stripNonAlphanumeric(final String s) {
if (Strings.isEmpty(s)) {
return s;
} else {
return s.replaceAll("[^A-Za-z0-9]", "");
}
}
public static String asString(final List<String> list, final String delimiter) {
if (list == null) {
return null;
}
final StringBuilder sb = new StringBuilder();
for (final String e : list) {
sb.append(e);
sb.append(delimiter);
}
Strings.removeEnd(sb, delimiter);
return sb.toString();
}
/**
* Calls o.toString(). Returns <null> if o is null.
*/
public static String asStringNullText(final Object o) {
if (o == null) {
return DefaultToStringStyle.INSTANCE.getNullText();
} else {
return o.toString();
}
}
public static String asStringEmptyText(final Object o) {
if (o == null) {
return "";
} else {
return o.toString();
}
}
/**
* Calls ReflectionToStringBuilder.toString() with DefaultToStringStyle.
*/
public static String asStringReflective(final Object o) {
return ReflectionToStringBuilder.toString(o, DefaultToStringStyle.INSTANCE);
}
/**
* Calls ReflectionToStringBuilder.toString() with MultilineToStringStyle.
*/
public static String asStringReflectiveMultiline(final Object o) {
return ReflectionToStringBuilder.toString(o, MultilineToStringStyle.INSTANCE);
}
public static String asStringIdentity(final Object o) {
if (o == null) {
return null;
} else {
return o.getClass().getName() + "@" + Integer.toHexString(System.identityHashCode(o));
}
}
public static String stripBlankLines(final String s) {
return s.replaceAll("(?m)^\\s*", "").trim();
}
public static int countLines(final String s) {
//There always exists 1 line, thus +1
return countMatches(s, "\n") + 1;
}
/**
* Counts characters in the longest line available in the string.
*/
public static int countMaxLineLength(final String s) {
if (s == null) {
return 0;
}
final String[] lines = Strings.split(s, "\n");
int maxLength = 0;
for (int i = 0; i < lines.length; i++) {
maxLength = Math.max(maxLength, lines[i].length());
}
return maxLength;
}
public static String extractLongestLine(final String s) {
if (s == null) {
return null;
}
final String[] lines = Strings.split(s, "\n");
String longestLine = "";
for (int i = 0; i < lines.length; i++) {
if (longestLine.length() < lines[i].length()) {
longestLine = lines[i];
}
}
return longestLine;
}
public static String rightPad(final Object obj, final int size) {
return rightPad(asString(obj), size);
}
public static String rightPad(final Object obj, final int size, final char padChar) {
return rightPad(asString(obj), size, padChar);
}
public static String rightPad(final Object obj, final int size, final String padStr) {
return rightPad(asString(obj), size, padStr);
}
public static String leftPad(final Object obj, final int size) {
return leftPad(asString(obj), size);
}
public static String leftPad(final Object obj, final int size, final char padChar) {
return leftPad(asString(obj), size, padChar);
}
public static String leftPad(final Object obj, final int size, final String padStr) {
return leftPad(asString(obj), size, padStr);
}
/**
* @see <a href="http://code.activestate.com/recipes/435882-normalizing-newlines-between-windowsunixmacs/">Source
* </a>
*/
public static String normalizeNewlines(final String s) {
return s.replace("\r\n", "\n").replace("\r", "\n");
}
public static String replaceRange(final String s, final int start, final int end, final String replaceStr) {
final String anfang = s.substring(0, start) + replaceStr;
if (end + 1 > s.length() - 1) {
return anfang;
} else {
return anfang + s.substring(end + 1);
}
}
public static String removeRange(final String s, final int start, final int end) {
return replaceRange(s, start, end, "");
}
public static String replaceNewlines(final String s, final String newlineReplacement) {
final String normalized = normalizeNewlines(s);
return normalized.replace("\n", newlineReplacement);
}
public static boolean matchesAny(final String string, final String... searchRegexes) {
for (final String regex : searchRegexes) {
if (string.matches(regex)) {
return true;
}
}
return false;
}
public static boolean containsAny(final String string, final String... searchStrings) {
if (string == null) {
return false;
}
for (final String search : searchStrings) {
if (string.contains(search)) {
return true;
}
}
return false;
}
public static boolean containsAnyIgnoreCase(final String string, final String... searchStrings) {
if (string == null) {
return false;
}
for (final String search : searchStrings) {
if (containsIgnoreCase(string, search)) {
return true;
}
}
return false;
}
/**
* "a/b/c.txt" with suffix "_1" results in "a/b/c_1.txt"
*/
public static String addSuffixToFileName(final String fileName, final String suffix) {
if (fileName.contains(".")) {
return Strings.substringBeforeLast(fileName, ".") + suffix + "."
+ Strings.substringAfterLast(fileName, ".");
} else {
return fileName + suffix;
}
}
}