Revision: 57442
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at May 26, 2012 07:47 by dwijnand
Initial Code
/** Identifies throwables by creating a checksum (using a message digest, such as MD5 or SHA1) of its stack trace. */ public final class ThrowableIdentifier { private static final Logger LOGGER = Logger.getLogger(ThrowableIdentifier.class.getName()); private ThrowableIdentifier() { /* Utility class */} /** * Returns the checksum of the specified throwable, using a specific message digest, which is reset at the end. The returned * byte array can be converted into a string by using {@link Strings#toHexString(byte[])}. */ public static byte[] getChecksum(final Throwable throwable, final MessageDigest messageDigest) throws IOException { return getChecksum(newStackTraceBytesStream(throwable), messageDigest); } /** * Returns the checksum of the specified input stream, using a specific message digest, which is reset at the end. The * returned byte array can be converted into a string by using {@link Strings#toHexString(byte[])}. */ public static byte[] getChecksum(final InputStream in, final MessageDigest messageDigest) throws IOException { try { final byte[] buffer = new byte[0x1000]; for (int count = in.read(buffer); count != -1; count = in.read(buffer)) messageDigest.update(buffer, 0, count); return messageDigest.digest(); } finally { messageDigest.reset(); if (in != null) { try { in.close(); } catch (IOException e) { LOGGER.log(Level.WARNING, "IOException thrown while closing InputStream", e); } } } } /** Returns the hexadecimal string form of the specified byte array. */ public static String toHexString(final byte... bytes) { final StringBuilder builder = new StringBuilder(2 * bytes.length); for (final byte b : bytes) builder.append(padStart(Integer.toHexString(0xff & b), 2, '0')); return builder.toString(); } /** Returns the specified string, if necessary padded with the specified character until the desired length is reached. */ public static String padStart(String s, final int length, final char c) { if (s.length() < length) { final StringBuilder sb = new StringBuilder(length); for (int i = s.length(); i < length; i++) { sb.append(c); } s = sb.append(s).toString(); } return s; } /** Returns an input stream of the specified throwable's stack trace. */ public static InputStream newStackTraceBytesStream(final Throwable throwable) { return new ByteArrayInputStream(getStackTrace(throwable).getBytes(Charset.forName("UTF-8"))); } /** Returns the specified throwable's stack trace. */ public static String getStackTrace(final Throwable throwable) { final StringWriter stringWriter = new StringWriter(); final PrintWriter printWriter = new PrintWriter(stringWriter); try { throwable.printStackTrace(printWriter); } finally { printWriter.close(); } return stringWriter.toString(); } }
Initial URL
Initial Description
A useful utility class to identify Throwables by creating a checksum (using a message digest, such as MD5 or SHA1) of its stack trace
Initial Title
Throwable Identifier
Initial Tags
java
Initial Language
Java