Author: scolebourne
Date: Tue Aug 29 16:05:22 2006
New Revision: 438281

URL: http://svn.apache.org/viewvc?rev=438281&view=rev
Log:
IO-54 - Add FileUtils.checksum / FileUtils.checksumCRC32 to simplify 
calculating checksums
from Emmanuel Bourg

Modified:
    jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt
    jakarta/commons/proper/io/trunk/project.xml
    
jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
    
jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java

Modified: jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt?rev=438281&r1=438280&r2=438281&view=diff
==============================================================================
--- jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt (original)
+++ jakarta/commons/proper/io/trunk/RELEASE-NOTES.txt Tue Aug 29 16:05:22 2006
@@ -110,6 +110,8 @@
   - add methods to check if a file is older (i.e. isFileOlder()) - counterparts
     to the existing isFileNewer() methods.
 
+- FileUtils.checksum, FileUtils.checksumCRC32
+  - add methods to create a checksum of a file
 
 
 Feedback

Modified: jakarta/commons/proper/io/trunk/project.xml
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/io/trunk/project.xml?rev=438281&r1=438280&r2=438281&view=diff
==============================================================================
--- jakarta/commons/proper/io/trunk/project.xml (original)
+++ jakarta/commons/proper/io/trunk/project.xml Tue Aug 29 16:05:22 2006
@@ -187,6 +187,9 @@
       <name>Nathan Beyer</name>
     </contributor>
     <contributor>
+      <name>Emmanuel Bourg</name>
+    </contributor>
+    <contributor>
       <name>Chris Eldredge</name>
     </contributor>
     <contributor>

Modified: 
jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java?rev=438281&r1=438280&r2=438281&view=diff
==============================================================================
--- 
jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java 
(original)
+++ 
jakarta/commons/proper/io/trunk/src/java/org/apache/commons/io/FileUtils.java 
Tue Aug 29 16:05:22 2006
@@ -30,6 +30,9 @@
 import java.util.Date;
 import java.util.Iterator;
 import java.util.List;
+import java.util.zip.CRC32;
+import java.util.zip.CheckedInputStream;
+import java.util.zip.Checksum;
 
 import org.apache.commons.io.filefilter.DirectoryFileFilter;
 import org.apache.commons.io.filefilter.FalseFileFilter;
@@ -37,6 +40,7 @@
 import org.apache.commons.io.filefilter.IOFileFilter;
 import org.apache.commons.io.filefilter.SuffixFileFilter;
 import org.apache.commons.io.filefilter.TrueFileFilter;
+import org.apache.commons.io.output.NullOutputStream;
 
 /**
  * General file manipulation utilities.
@@ -52,6 +56,7 @@
  * <li>listing files and directories by filter and extension
  * <li>comparing file content
  * <li>file last changed date
+ * <li>calculating a checksum
  * </ul>
  * <p>
  * Origin of code: Excalibur, Alexandria, Commons-Utils
@@ -1358,4 +1363,53 @@
         }
         return file.lastModified() < timeMillis;
     }
+
+    //-----------------------------------------------------------------------
+    /**
+     * Computes the checksum of a file using the CRC32 checksum routine.
+     * The value of the checksum is returned.
+     *
+     * @param file  the file to checksum, not null
+     * @param checksum  the checksum object to be used, not null
+     * @return the checksum value
+     * @throws NullPointerException if the file or checksum is null
+     * @throws IllegalArgumentException if the file is a directory
+     * @since Commons IO 1.3
+     */
+    public static long checksumCRC32(File file) throws IOException {
+        CRC32 crc = new CRC32();
+        checksum(file, crc);
+        return crc.getValue();
+    }
+
+    /**
+     * Computes the checksum of a file using the specified checksum object.
+     * Multiple files may be checked using one <code>Checksum</code> instance
+     * if desired simply by reusing the same checksum object.
+     * For example:
+     * <pre>
+     *   long csum = FileUtils.checksum(file, new CRC32()).getValue();
+     * </pre>
+     *
+     * @param file  the file to checksum, not null
+     * @param checksum  the checksum object to be used, not null
+     * @return the checksum specified, updated with the content of the file
+     * @throws NullPointerException if the file or checksum is null
+     * @throws IllegalArgumentException if the file is a directory
+     * @since Commons IO 1.3
+     */
+    public static Checksum checksum(File file, Checksum checksum) throws 
IOException {
+        if (file.isDirectory()) {
+            throw new IllegalArgumentException("Checksums can't be computed on 
directories");
+        }
+        InputStream in = null;
+        try {
+            in = new CheckedInputStream(new FileInputStream(file), checksum);
+            IOUtils.copy(in, new NullOutputStream());
+        } finally {
+            IOUtils.closeQuietly(in);
+        }
+        return checksum;
+    }
+
 }

Modified: 
jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
URL: 
http://svn.apache.org/viewvc/jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java?rev=438281&r1=438280&r2=438281&view=diff
==============================================================================
--- 
jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
 (original)
+++ 
jakarta/commons/proper/io/trunk/src/test/org/apache/commons/io/FileUtilsTestCase.java
 Tue Aug 29 16:05:22 2006
@@ -30,6 +30,8 @@
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
+import java.util.zip.CRC32;
+import java.util.zip.Checksum;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -944,6 +946,101 @@
             IOUtils.LINE_SEPARATOR + "some text" + IOUtils.LINE_SEPARATOR;
         String actual = FileUtils.readFileToString(file, "US-ASCII");
         assertEquals(expected, actual);
+    }
+
+    //-----------------------------------------------------------------------
+    public void testChecksumCRC32() throws Exception {
+        // create a test file
+        String text = "Imagination is more important than knowledge - 
Einstein";
+        File file = new File(getTestDirectory(), "checksum-test.txt");
+        FileUtils.writeStringToFile(file, text, "US-ASCII");
+        
+        // compute the expected checksum
+        Checksum expectedChecksum = new CRC32();
+        expectedChecksum.update(text.getBytes("US-ASCII"), 0, text.length());
+        long expectedValue = expectedChecksum.getValue();
+        
+        // compute the checksum of the file
+        long resultValue = FileUtils.checksumCRC32(file);
+        
+        assertEquals(expectedValue, resultValue);
+    }
+
+    public void testChecksum() throws Exception {
+        // create a test file
+        String text = "Imagination is more important than knowledge - 
Einstein";
+        File file = new File(getTestDirectory(), "checksum-test.txt");
+        FileUtils.writeStringToFile(file, text, "US-ASCII");
+        
+        // compute the expected checksum
+        Checksum expectedChecksum = new CRC32();
+        expectedChecksum.update(text.getBytes("US-ASCII"), 0, text.length());
+        long expectedValue = expectedChecksum.getValue();
+        
+        // compute the checksum of the file
+        Checksum testChecksum = new CRC32();
+        Checksum resultChecksum = FileUtils.checksum(file, testChecksum);
+        long resultValue = resultChecksum.getValue();
+        
+        assertSame(testChecksum, resultChecksum);
+        assertEquals(expectedValue, resultValue);
+    }
+
+    public void testChecksumOnNullFile() throws Exception {
+        try {
+            FileUtils.checksum((File) null, new CRC32());
+            fail();
+        } catch (NullPointerException ex) {
+            // expected
+        }
+    }
+
+    public void testChecksumOnNullChecksum() throws Exception {
+        // create a test file
+        String text = "Imagination is more important than knowledge - 
Einstein";
+        File file = new File(getTestDirectory(), "checksum-test.txt");
+        FileUtils.writeStringToFile(file, text, "US-ASCII");
+        try {
+            FileUtils.checksum(file, (Checksum) null);
+            fail();
+        } catch (NullPointerException ex) {
+            // expected
+        }
+    }
+
+    public void testChecksumOnDirectory() throws Exception {
+        try {
+            FileUtils.checksum(new File("."), new CRC32());
+            fail();
+        } catch (IllegalArgumentException ex) {
+            // expected
+        }
+    }
+
+    public void testChecksumDouble() throws Exception {
+        // create a test file
+        String text1 = "Imagination is more important than knowledge - 
Einstein";
+        File file1 = new File(getTestDirectory(), "checksum-test.txt");
+        FileUtils.writeStringToFile(file1, text1, "US-ASCII");
+        
+        // create a second test file
+        String text2 = "To be or not to be - Shakespeare";
+        File file2 = new File(getTestDirectory(), "checksum-test2.txt");
+        FileUtils.writeStringToFile(file2, text2, "US-ASCII");
+        
+        // compute the expected checksum
+        Checksum expectedChecksum = new CRC32();
+        expectedChecksum.update(text1.getBytes("US-ASCII"), 0, text1.length());
+        expectedChecksum.update(text2.getBytes("US-ASCII"), 0, text2.length());
+        long expectedValue = expectedChecksum.getValue();
+        
+        // compute the checksum of the file
+        Checksum testChecksum = new CRC32();
+        FileUtils.checksum(file1, testChecksum);
+        FileUtils.checksum(file2, testChecksum);
+        long resultValue = testChecksum.getValue();
+        
+        assertEquals(expectedValue, resultValue);
     }
 
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to