Docjar: A Java Source and Docuemnt Enginecom.*    java.*    javax.*    org.*    all    new    plug-in

Quick Search    Search Deep

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  }