Author: sebb
Date: Wed May 18 23:36:48 2016
New Revision: 1744467

URL: http://svn.apache.org/viewvc?rev=1744467&view=rev
Log:
CODEC-220 Fluent interface for DigestUtils

Modified:
    
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
    
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java

Modified: 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java?rev=1744467&r1=1744466&r2=1744467&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
 (original)
+++ 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
 Wed May 18 23:36:48 2016
@@ -45,8 +45,8 @@ import org.apache.commons.codec.binary.S
  * <pre>
  * import static 
org.apache.commons.codec.digest.MessageDigestAlgorithms.SHA_224;
  * ...
- * byte [] digest = DigestUtils.digest(SHA_224, dataToDigest);
- * byte [] pommed = DigestUtils.digest(SHA_224, new File("pom.xml"));
+ * byte [] digest = DigestUtils.with(SHA_224).update(dataToDigest).done();
+ * String hdigest = DigestUtils.with(SHA_224).update(new 
File("pom.xml")).asHex();
  * </pre>
  * </code>
  * @see MessageDigestAlgorithms
@@ -80,8 +80,7 @@ public class DigestUtils {
      * @param data
      *            Data to digest
      * @return the digest
-     * @throws IOException
-     *             On error reading from the stream
+     *
      * @since 1.11
      */
     public static byte[] digest(final MessageDigest messageDigest, final 
ByteBuffer data) {
@@ -122,72 +121,6 @@ public class DigestUtils {
     }
 
     /**
-     * Reads through a byte array and returns the digest for the data.
-     *
-     * @param digestName
-     *            The name of the algorithm to use (e.g. 
MessageDigestAlgoriths.MD5 or "MD5")
-     * @param data
-     *            Data to digest
-     * @return the digest
-     * @throws IOException
-     *             On error reading from the stream
-     * @since 1.11
-     */
-    public static byte[] digest(final String digestName, final byte[] data) {
-        return digest(getDigest(digestName), data);
-    }
-
-    /**
-     * Reads through a ByteBuffer and returns the digest for the data
-     *
-     * @param digestName
-     *            The name of the algorithm to use (e.g. 
MessageDigestAlgoriths.MD5 or "MD5")
-     * @param data
-     *            Data to digest
-     * @return the digest
-     * @throws IOException
-     *             On error reading from the stream
-     * @since 1.11
-     */
-    public static byte[] digest(final String digestName, final ByteBuffer 
data) {
-        MessageDigest messageDigest = getDigest(digestName);
-        messageDigest .update(data);
-        return messageDigest.digest();
-    }
-
-    /**
-     * Reads through a File and returns the digest for the data
-     *
-     * @param digestName
-     *            The name of the algorithm to use (e.g. 
MessageDigestAlgoriths.MD5 or "MD5")
-     * @param data
-     *            Data to digest
-     * @return the digest
-     * @throws IOException
-     *             On error reading from the stream
-     * @since 1.11
-     */
-    public static byte[] digest(final String digestName, final File data) 
throws IOException {
-        return updateDigest(getDigest(digestName), data).digest();
-    }
-
-    /**
-     * Reads through an InputStream and returns the digest for the data
-     *
-     * @param digestName
-     *            The name of the algorithm to use (e.g. 
MessageDigestAlgoriths.MD5 or "MD5")
-     * @param data
-     *            Data to digest
-     * @return the digest
-     * @throws IOException
-     *             On error reading from the stream
-     * @since 1.11
-     */
-    public static byte[] digest(final String digestName, final InputStream 
data) throws IOException {
-        return updateDigest(getDigest(digestName), data).digest();
-    }
-
-    /**
      * Returns a <code>MessageDigest</code> for the given 
<code>algorithm</code>.
      *
      * @param algorithm
@@ -1030,4 +963,142 @@ public static byte[] sha(final byte[] da
         return getDigest(messageDigestAlgorithm, null) != null;
     }
 
+    // Fluent interface
+    
+    private final MessageDigest messageDigest;
+
+    DigestUtils() {
+        this.messageDigest = null;
+    }
+
+    private DigestUtils(MessageDigest digest) {
+        this.messageDigest = digest;
+    }
+
+    /**
+     * Returns a fluent instance for the digest algorithm.
+     * Does not reset the digest before use.
+     * @param digest the digest instance to use
+     * @return
+     */
+    public static DigestUtils with(MessageDigest digest) {
+        return new DigestUtils(digest);
+    }
+
+    /**
+     * Creates a {@link MessageDigest} and returns a fluent instance.
+     *
+     * @param name the name of digest algorithm to create, e.g. {@link 
MessageDigestAlgorithms#MD5}
+     * @return
+     */
+    public static DigestUtils with(String name) {
+        return new DigestUtils(getDigest(name));
+    }
+
+    /**
+     * Returns the message digest instance.
+     * @return the message digest instance
+     */
+    public MessageDigest getMessageDigest() {
+        return messageDigest;
+    }
+
+    /**
+     * Completes the hash computation and returns the hash
+     * accumulated by one or more invocations of an update method.
+     *
+     * @return the hash as a byte array
+     *
+     * @since 1.11
+     */
+    public byte[] done() {
+        return messageDigest.digest();
+    }
+
+    /**
+     * Completes the hash computation and returns the hash
+     * accumulated by one or more invocations of an update method.
+     *
+     * @return the hash as a hex String
+     *
+     * @since 1.11
+     */
+    public String asHex() {
+        return Hex.encodeHexString(messageDigest.digest());
+    }
+
+    /**
+     * Updates the {@link MessageDigest} in the {@link DigestUtils} instance
+     *
+     * @param valueToDigest
+     *            the value to update the {@link MessageDigest} with
+     * @return the updated {@link DigestUtils}
+     * @since 1.11
+     */
+    public DigestUtils update(final byte[] data) throws IOException {
+        messageDigest.update(data);
+        return this;
+    }
+
+    /**
+     * Updates the {@link MessageDigest} in the {@link DigestUtils} instance
+     *
+     * @param valueToDigest
+     *            the value to update the {@link MessageDigest} with
+     * @return the updated {@link DigestUtils}
+     * @since 1.11
+     */
+    public DigestUtils update(final ByteBuffer data) throws IOException {
+        messageDigest.update(data);
+        return this;
+    }
+
+    /**
+     * Updates the {@link MessageDigest} in the {@link DigestUtils} instance
+     *
+     * @param valueToDigest
+     *            the value to update the {@link MessageDigest} with
+     * @return the updated {@link DigestUtils}
+     * @since 1.11
+     */
+    public DigestUtils update(final String data) throws IOException {
+        messageDigest.update(StringUtils.getBytesUtf8(data));
+        return this;
+    }
+
+    /**
+     * Updates the {@link MessageDigest} in the {@link DigestUtils} instance
+     *
+     * @param valueToDigest
+     *            the value to update the {@link MessageDigest} with
+     * @return the updated {@link DigestUtils}
+     * @since 1.11
+     */
+    public DigestUtils update(final InputStream data) throws IOException {
+        final byte[] buffer = new byte[STREAM_BUFFER_LENGTH];
+        int read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);
+
+        while (read > -1) {
+            messageDigest.update(buffer, 0, read);
+            read = data.read(buffer, 0, STREAM_BUFFER_LENGTH);
+        }
+        return this;
+    }
+
+    /**
+     * Updates the {@link MessageDigest} in the {@link DigestUtils} instance
+     *
+     * @param valueToDigest
+     *            the value to update the {@link MessageDigest} with
+     * @return the updated {@link DigestUtils}
+     * @since 1.11
+     */
+    public DigestUtils update(final File data) throws IOException {
+        final BufferedInputStream stream = new BufferedInputStream(new 
FileInputStream(data));
+        try {
+            return update(stream);
+        } finally {
+            stream.close();
+        }
+    }
 }

Modified: 
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java?rev=1744467&r1=1744466&r2=1744467&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java
 (original)
+++ 
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java
 Wed May 18 23:36:48 2016
@@ -263,10 +263,11 @@ public class DigestUtilsTest {
 
     @Test
     public void testSha224() throws IOException {
-        assumeJava8();        
assertEquals("d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
-                
Hex.encodeHexString(DigestUtils.digest(MessageDigestAlgorithms.SHA_224,StringUtils.getBytesUtf8(""))));
+        assumeJava8();
+        
assertEquals("d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f",
+                
DigestUtils.with(MessageDigestAlgorithms.SHA_224).update(("")).asHex());
         
assertEquals("730e109bd7a8a32b1cb9d9a09aa2325d2430587ddbc0c38bad911525",
-                
Hex.encodeHexString(DigestUtils.digest(MessageDigestAlgorithms.SHA_224,StringUtils.getBytesUtf8("The
 quick brown fox jumps over the lazy dog"))));
+                DigestUtils.with(MessageDigestAlgorithms.SHA_224).update("The 
quick brown fox jumps over the lazy dog").asHex());
 
         // Examples from FIPS 180-4?
     }


Reply via email to