| Home >> All >> org >> esau >> ptarmigan >> [ util Javadoc ] |
Source code: org/esau/ptarmigan/util/HelperDigest.java
1 /* $Header: /cvsroot/ptarmigan/ptarmigan/src/java/org/esau/ptarmigan/util/HelperDigest.java,v 1.1 2002/09/10 06:24:34 reedesau Exp $ */ 2 3 package org.esau.ptarmigan.util; 4 5 import java.io.File; 6 import java.io.IOException; 7 import java.io.FileInputStream; 8 import java.security.DigestInputStream; 9 import java.security.MessageDigest; 10 import java.security.NoSuchAlgorithmException; 11 12 import org.apache.commons.logging.Log; 13 import org.apache.commons.logging.LogFactory; 14 import org.apache.commons.httpclient.Base64; 15 16 /** 17 * Compute checksum/digest for the range of a file 18 * 19 * @author Reed Esau 20 * @version $Revision: 1.1 $ $Date: 2002/09/10 06:24:34 $ 21 */ 22 public final class HelperDigest { 23 24 /** use the internal File and Range to build an MD5 digest for the audio data */ 25 public static String getDigest(String algorithm, Range range, File file) 26 throws IOException, NoSuchAlgorithmException { 27 28 if (file == null || range.isValid() == false) 29 throw new IllegalArgumentException(); 30 31 final int BLOCK_SIZE = 8192; 32 33 long start = 0; 34 if (log.isDebugEnabled()) { 35 start = System.currentTimeMillis(); 36 log.debug("getDigest: len=" + file.length() + " range=" + range); 37 } 38 39 FileInputStream fis = null; 40 try { 41 fis = new FileInputStream(file); 42 43 long offset = range.getOffset(); 44 long length = range.getLength(); 45 46 MessageDigest md = MessageDigest.getInstance(algorithm); 47 DigestInputStream dis = new DigestInputStream(fis, md); 48 49 dis.skip(offset); // move past the metadata 50 51 byte[] buf = new byte[BLOCK_SIZE]; 52 53 long remaining = length; 54 while (remaining > 0) { 55 56 int to_read = (remaining < BLOCK_SIZE //min 57 ? (int)remaining 58 : BLOCK_SIZE ); 59 60 log.debug("to_read=" + to_read + " remaining=" + remaining); 61 62 int bytes_read = dis.read(buf, 0, to_read); 63 64 if (bytes_read <= 0) 65 throw new IOException("unexpected end"); 66 67 log.debug(" bytes_read=" + bytes_read); 68 69 remaining -= bytes_read; 70 } 71 72 String retval = new String(Base64.encode(md.digest())); 73 74 if (log.isDebugEnabled()) { 75 long diff = System.currentTimeMillis() - start; 76 log.debug("getDigest: timer=" + diff); 77 } 78 79 return retval; 80 } 81 finally { 82 HelperIO.safeClose(fis); 83 } 84 } 85 86 /** 87 * logging object 88 */ 89 static Log log = LogFactory.getLog(HelperDigest.class); 90 }