/* * Created on Feb 4, 2006 * * TODO Nothing yet. */ package org.mbs3.juniuploader.util; /** * This class generates md5 checksums from file streams, strings, and compares * checksums with file streams. * */ import java.io.FileInputStream; import java.io.InputStream; import java.io.ByteArrayInputStream; import java.security.MessageDigest; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class CheckSummer { private static Log log = LogFactory.getLog(CheckSummer.class); /** * This class cannot be instantiated. */ protected static byte[] createChecksum(InputStream is) { log.trace("createChecksum(InputStream) called with a stream"); try { byte[] buffer = new byte[1024]; MessageDigest complete = MessageDigest.getInstance("MD5"); int numRead; do { numRead = is.read(buffer); if (numRead > 0) { complete.update(buffer, 0, numRead); } } while (numRead != -1); is.close(); return complete.digest(); } catch (Exception ex) { log.trace("createChecksum(InputStream) failed to create a proper checksum"); return new byte[0]; } } protected static byte[] ChecksumFromFile(String filename) { log.trace("createChecksumFromFile(String) for " + filename + " to compare with"); try { InputStream fis = new FileInputStream(filename); return createChecksum(fis); } catch (Exception ex) { log.error("createChecksumFromFile(String) failed to create a FileInputStream"); return new byte[0]; } } protected static byte[] ChecksumFromString(String input) throws Exception { log.trace("Creating a checksum for " + input + " to compare with"); ByteArrayInputStream bais = new ByteArrayInputStream(input.getBytes()); return createChecksum(bais); } public static boolean compareFileToChecksum(String filename, String checksum) { log.trace("Comparing a file " + filename + " with it's checksum " + checksum); boolean ret = false; try { byte [] ba = CheckSummer.ChecksumFromFile(filename); String hexString = byteArrayToString(ba); if(checksum.equals(hexString.toString())) { log.trace("Comparing a file " + filename + " passed comparison, checksum accurate"); ret = true; } } catch (Exception ex) { log.error("Creating a checksum for " + filename + " failed somewhere, bailing out", ex); ret = false; } return(ret); } public static String createChecksumFromString(String input) { String hexString = "unknown"; try { byte [] ba = CheckSummer.ChecksumFromString(input); hexString = byteArrayToString(ba); } catch (Exception ex) { log.error("getStringChecksum(String) could not process a string input"); } return(hexString); } protected static String byteArrayToString(byte [] ba) { StringBuffer hexString = new StringBuffer(); for (int i=0;i<ba.length;i++) { String s = new String(Integer.toHexString(0xFF & ba[i])); if(s.length() < 2) hexString.append("0"); hexString.append(s); } return hexString.toString(); } }