package pl.project13.janbanery.android.util; import java.io.*; import java.security.InvalidParameterException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; /** * This is a subset of the Strings class available in <strong>RoboGuice</strong>. * It's licensed under the Apache License 2.0. * * @see <a href="http://code.google.com/p/roboguice/source/browse/roboguice/src/main/java/roboguice/util/Strings.java">http://code.google.com/p/roboguice</a> */ public class Strings { private static final int DEFAULT_BUFFER_SIZE = 1024 * 4; /** * Like join, but allows for a distinct final delimiter. For english sentences such * as "Alice, Bob and Charlie" use ", " and " and " as the delimiters. * * @param delimiter usually ", " * @param lastDelimiter usually " and " * @param objs the objects * @param <T> the type * @return a string */ public static <T> String joinAnd(final String delimiter, final String lastDelimiter, final Collection<T> objs) { if (objs == null || objs.isEmpty()) { return ""; } final Iterator<T> iter = objs.iterator(); final StringBuffer buffer = new StringBuffer(Strings.toString(iter.next())); int i = 1; while (iter.hasNext()) { final T obj = iter.next(); if (notEmpty(obj)) { buffer.append(++i == objs.size() ? lastDelimiter : delimiter).append(Strings.toString(obj)); } } return buffer.toString(); } public static <T> String joinAnd(final String delimiter, final String lastDelimiter, final T... objs) { return joinAnd(delimiter, lastDelimiter, Arrays.asList(objs)); } public static <T> String join(final String delimiter, final Collection<T> objs) { if (objs == null || objs.isEmpty()) { return ""; } final Iterator<T> iter = objs.iterator(); final StringBuffer buffer = new StringBuffer(Strings.toString(iter.next())); while (iter.hasNext()) { final T obj = iter.next(); if (notEmpty(obj)) { buffer.append(delimiter).append(Strings.toString(obj)); } } return buffer.toString(); } public static <T> String join(final String delimiter, final T... objects) { return join(delimiter, Arrays.asList(objects)); } public static String toString(InputStream input) { StringWriter sw = new StringWriter(); copy(new InputStreamReader(input), sw); return sw.toString(); } public static String toString(Reader input) { StringWriter sw = new StringWriter(); copy(input, sw); return sw.toString(); } public static int copy(Reader input, Writer output) { long count = copyLarge(input, output); return count > Integer.MAX_VALUE ? -1 : (int) count; } public static long copyLarge(Reader input, Writer output) throws RuntimeException { try { char[] buffer = new char[DEFAULT_BUFFER_SIZE]; long count = 0; int n; while (-1 != (n = input.read(buffer))) { output.write(buffer, 0, n); count += n; } return count; } catch (IOException e) { throw new RuntimeException(e); } } public static String toString(final Object o) { return toString(o, ""); } public static String toString(final Object o, final String def) { return o == null ? def : o instanceof InputStream ? toString((InputStream) o) : o instanceof Reader ? toString((Reader) o) : o instanceof Object[] ? Strings.join(", ", (Object[]) o) : o instanceof Collection ? Strings.join(", ", (Collection<?>) o) : o.toString(); } public static boolean isEmpty(final Object o) { return toString(o).trim().length() == 0; } public static boolean notEmpty(final Object o) { return toString(o).trim().length() != 0; } public static String md5(String s) { try { // Create MD5 Hash final MessageDigest digest = java.security.MessageDigest.getInstance("MD5"); digest.update(s.getBytes()); final byte messageDigest[] = digest.digest(); // Create Hex String final StringBuffer hexString = new StringBuffer(); for (byte aMessageDigest : messageDigest) { hexString.append(Integer.toHexString(0xFF & aMessageDigest)); } return hexString.toString(); } catch (NoSuchAlgorithmException e) { throw new RuntimeException(e); } } public static String capitalize(String s) { final String c = Strings.toString(s); return c.length() >= 2 ? c.substring(0, 1).toUpperCase() + c.substring(1) : c.length() >= 1 ? c.toUpperCase() : c; } public static boolean equals(Object a, Object b) { return Strings.toString(a).equals(Strings.toString(b)); } public static boolean equalsIgnoreCase(Object a, Object b) { return Strings.toString(a).toLowerCase().equals(Strings.toString(b).toLowerCase()); } public static String[] chunk(String str, int chunkSize) { if (isEmpty(str) || chunkSize == 0) { return new String[0]; } final int len = str.length(); final int arrayLen = ((len - 1) / chunkSize) + 1; final String[] array = new String[arrayLen]; for (int i = 0; i < arrayLen; ++i) { array[i] = str.substring(i * chunkSize, (i * chunkSize) + chunkSize < len ? (i * chunkSize) + chunkSize : len); } return array; } public static String namedFormat(String str, Map<String, String> substitutions) { for (String key : substitutions.keySet()) { str = str.replace('$' + key, substitutions.get(key)); } return str; } public static String namedFormat(String str, Object... nameValuePairs) { if (nameValuePairs.length % 2 != 0) { throw new InvalidParameterException("You must include one value for each parameter"); } final HashMap<String, String> map = new HashMap<String, String>(nameValuePairs.length / 2); for (int i = 0; i < nameValuePairs.length; i += 2) { map.put(Strings.toString(nameValuePairs[i]), Strings.toString(nameValuePairs[i + 1])); } return namedFormat(str, map); } }