Author: ggregory
Date: Sat May 14 01:33:23 2016
New Revision: 1743778

URL: http://svn.apache.org/viewvc?rev=1743778&view=rev
Log:
[CODEC-211] Create enum MessageDigestAlgorithm and deprecate class 
MessageDigestAlgorithms

Added:
    
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java
    
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java
Modified:
    commons/proper/codec/trunk/src/changes/changes.xml
    
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/DigestUtils.java
    
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java
    
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/DigestUtilsTest.java

Modified: commons/proper/codec/trunk/src/changes/changes.xml
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/changes/changes.xml?rev=1743778&r1=1743777&r2=1743778&view=diff
==============================================================================
--- commons/proper/codec/trunk/src/changes/changes.xml (original)
+++ commons/proper/codec/trunk/src/changes/changes.xml Sat May 14 01:33:23 2016
@@ -47,6 +47,7 @@ The <action> type attribute can be add,u
       <action dev="ggregory" type="fix" issue="CODEC-207" due-to="Gary 
Gregory">Charsets Javadoc breaks build when using Java 8</action>         
       <action dev="ggregory" type="fix" issue="CODEC-199" due-to="Yossi 
Tamari">Bug in HW rule in Soundex</action>         
       <action dev="ggregory" type="fix" issue="CODEC-209" due-to="Gary 
Gregory">Javadoc for SHA-224 DigestUtils methods should mention Java 1.8.0 
restriction instead of 1.4.0.</action>         
+      <action dev="ggregory" type="add" issue="CODEC-211" due-to="Gary 
Gregory">Create enum MessageDigestAlgorithm and deprecate class 
MessageDigestAlgorithms</action>         
       <action dev="ggregory" type="add" issue="CODEC-210" due-to="Gary 
Gregory">Add DigestUtils.getDigest(String, MessageDigest)</action>         
       <action dev="ggregory" type="add" issue="CODEC-208" due-to="Gary 
Gregory">Make some DigestUtils APIs public</action>         
       <action dev="ggregory" type="add" issue="CODEC-206" due-to="Gary 
Gregory">Add java.io.File APIs to DigestUtils</action>         

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=1743778&r1=1743777&r2=1743778&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
 Sat May 14 01:33:23 2016
@@ -40,6 +40,22 @@ public class DigestUtils {
     private static final int STREAM_BUFFER_LENGTH = 1024;
 
     /**
+     * Read through an ByteBuffer and returns the digest for the data. 
Provided for symmetry with other methods.
+     *
+     * @param messageDigest
+     *            The MessageDigest to use (e.g. 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 MessageDigest messageDigest, final 
byte[] data) {
+        return messageDigest.digest(data);
+    }
+
+    /**
      * Read through an ByteBuffer and returns the digest for the data
      *
      * @param messageDigest
@@ -110,14 +126,16 @@ public class DigestUtils {
     }
 
     /**
-     * Returns a <code>MessageDigest</code> for the given 
<code>algorithm</code> or a default if there is a problem getting the algorithm.
+     * Returns a <code>MessageDigest</code> for the given 
<code>algorithm</code> or a default if there is a problem
+     * getting the algorithm.
      *
      * @param algorithm
-     *            the name of the algorithm requested. See <a
-     *            
href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#AppA";
-     *            >Appendix A in the Java Cryptography Architecture Reference 
Guide</a> for information about standard
+     *            the name of the algorithm requested. See
+     *            <a 
href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#AppA";
 >
+     *            Appendix A in the Java Cryptography Architecture Reference 
Guide</a> for information about standard
      *            algorithm names.
-     * @param defaultMessageDigest The default MessageDigest.
+     * @param defaultMessageDigest
+     *            The default MessageDigest.
      * @return A digest instance.
      * @see MessageDigest#getInstance(String)
      * @throws IllegalArgumentException
@@ -143,7 +161,7 @@ public class DigestUtils {
      * @since 1.7
      */
     public static MessageDigest getMd2Digest() {
-        return getDigest(MessageDigestAlgorithms.MD2);
+        return MessageDigestAlgorithm.MD2.getMessageDigest();
     }
 
     /**
@@ -156,7 +174,7 @@ public class DigestUtils {
      * @see MessageDigestAlgorithms#MD5
      */
     public static MessageDigest getMd5Digest() {
-        return getDigest(MessageDigestAlgorithms.MD5);
+        return MessageDigestAlgorithm.MD5.getMessageDigest();
     }
 
     /**
@@ -170,7 +188,7 @@ public class DigestUtils {
      * @since 1.7
      */
     public static MessageDigest getSha1Digest() {
-        return getDigest(MessageDigestAlgorithms.SHA_1);
+        return MessageDigestAlgorithm.SHA_1.getMessageDigest();
     }
 
     /**
@@ -186,7 +204,7 @@ public class DigestUtils {
      * @see MessageDigestAlgorithms#SHA_224
      */
     public static MessageDigest getSha224Digest() {
-        return getDigest(MessageDigestAlgorithms.SHA_224);
+        return MessageDigestAlgorithm.SHA_224.getMessageDigest();
     }
 
     /**
@@ -202,7 +220,7 @@ public class DigestUtils {
      * @see MessageDigestAlgorithms#SHA_256
      */
     public static MessageDigest getSha256Digest() {
-        return getDigest(MessageDigestAlgorithms.SHA_256);
+        return MessageDigestAlgorithm.SHA_256.getMessageDigest();
     }
 
     /**
@@ -218,7 +236,7 @@ public class DigestUtils {
      * @see MessageDigestAlgorithms#SHA_384
      */
     public static MessageDigest getSha384Digest() {
-        return getDigest(MessageDigestAlgorithms.SHA_384);
+        return MessageDigestAlgorithm.SHA_384.getMessageDigest();
     }
 
     /**
@@ -234,7 +252,7 @@ public class DigestUtils {
      * @see MessageDigestAlgorithms#SHA_512
      */
     public static MessageDigest getSha512Digest() {
-        return getDigest(MessageDigestAlgorithms.SHA_512);
+        return MessageDigestAlgorithm.SHA_512.getMessageDigest();
     }
 
     /**

Added: 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java?rev=1743778&view=auto
==============================================================================
--- 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java
 (added)
+++ 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithm.java
 Sat May 14 01:33:23 2016
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.commons.codec.digest;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.ByteBuffer;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+/**
+ * Standard {@link MessageDigest} algorithm names from the <cite>Java 
Cryptography Architecture Standard Algorithm Name
+ * Documentation</cite>.
+ * <p>
+ * This enum is immutable and thread-safe.
+ * </p>
+ *
+ * @see <a 
href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html";>Java
 Cryptography
+ *      Architecture Standard Algorithm Name Documentation</a>
+ * @since 1.11
+ * @version $Id: MessageDigestAlgorithm.java 1637936 2014-11-10 16:47:29Z 
ggregory $
+ */
+public enum MessageDigestAlgorithm {
+
+    /**
+     * The MD2 message digest algorithm defined in RFC 1319.
+     */
+    MD2("MD2"),
+
+    /**
+     * The MD5 message digest algorithm defined in RFC 1321.
+     */
+    MD5("MD5"),
+
+    /**
+     * The SHA-1 hash algorithm defined in the FIPS PUB 180-2.
+     */
+    SHA_1("SHA-1"),
+
+    /**
+     * The SHA-224 hash algorithm defined in the FIPS PUB 180-4.
+     * <p>
+     * Java 8 only.
+     * </p>
+     */
+    SHA_224("SHA-224"),
+
+    /**
+     * The SHA-256 hash algorithm defined in the FIPS PUB 180-2.
+     */
+    SHA_256("SHA-256"),
+
+    /**
+     * The SHA-384 hash algorithm defined in the FIPS PUB 180-2.
+     */
+    SHA_384("SHA-384"),
+
+    /**
+     * The SHA-512 hash algorithm defined in the FIPS PUB 180-2.
+     */
+    SHA_512("SHA-512");
+
+    private final String algorithm;
+
+    private MessageDigestAlgorithm(String algorithm) {
+        this.algorithm = algorithm;
+    }
+
+    /**
+     * Read through a byte[] and returns the digest for the data
+     *
+     * @param data
+     *            Data to digest
+     * @return the digest
+     * @throws IOException
+     *             On error reading from the stream
+     */
+    public byte[] digest(byte[] data) throws IOException {
+        return getMessageDigest().digest(data);
+    }
+
+    /**
+     * Read through a ByteBuffer and returns the digest for the data
+     *
+     * @param data
+     *            Data to digest
+     * @return the digest
+     * @throws IOException
+     *             On error reading from the stream
+     */
+    public byte[] digest(ByteBuffer data) throws IOException {
+        return DigestUtils.digest(getMessageDigest(), data);
+    }
+
+    /**
+     * Read through a File and returns the digest for the data
+     *
+     * @param data
+     *            Data to digest
+     * @return the digest
+     * @throws IOException
+     *             On error reading from the stream
+     */
+    public byte[] digest(File data) throws IOException {
+        return DigestUtils.digest(getMessageDigest(), data);
+    }
+
+    /**
+     * Read through an InputStream and returns the digest for the data
+     *
+     * @param data
+     *            Data to digest
+     * @return the digest
+     * @throws IOException
+     *             On error reading from the stream
+     */
+    public byte[] digest(InputStream data) throws IOException {
+        return DigestUtils.digest(getMessageDigest(), data);
+    }
+
+    /**
+     * Gets the algorithm name.
+     *
+     * @return the algorithm name.
+     */
+    public String getAlgorithm() {
+        return algorithm;
+    }
+
+    /**
+     * Returns a <code>MessageDigest</code> for this <code>algorithm</code>.
+     *
+     * @return A digest instance.
+     * @see MessageDigest#getInstance(String)
+     * @throws IllegalArgumentException
+     *             when a {@link NoSuchAlgorithmException} is caught.
+     */
+    public MessageDigest getMessageDigest() {
+        return DigestUtils.getDigest(algorithm);
+    }
+
+    /**
+     * Whether a MessageDigest for this algorithm can be created.
+     *
+     * @return Whether a MessageDigest for this algorithm can be created.
+     */
+    public boolean isAvailable() {
+        return DigestUtils.getDigest(algorithm, null) != null;
+    }
+
+}

Modified: 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java?rev=1743778&r1=1743777&r2=1743778&view=diff
==============================================================================
--- 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java
 (original)
+++ 
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/MessageDigestAlgorithms.java
 Sat May 14 01:33:23 2016
@@ -25,13 +25,14 @@ import java.security.MessageDigest;
  * <p>
  * This class is immutable and thread-safe.
  * </p>
- * TODO 2.0 This should be an enum.
  *
  * @see <a 
href="http://docs.oracle.com/javase/6/docs/technotes/guides/security/StandardNames.html";>Java
 Cryptography
  *      Architecture Standard Algorithm Name Documentation</a>
  * @since 1.7
+ * @deprecated Use the enum {@link MessageDigestAlgorithm}.
  * @version $Id$
  */
+@Deprecated
 public class MessageDigestAlgorithms {
 
     private MessageDigestAlgorithms() {
@@ -54,11 +55,11 @@ public class MessageDigestAlgorithms {
     public static final String SHA_1 = "SHA-1";
 
     /**
-     * The SHA-224 hash algorithm defined in the FIPS PUB 180-4. 
+     * The SHA-224 hash algorithm defined in the FIPS PUB 180-4.
      * <p>
      * Java 8 only.
      * </p>
-     * 
+     *
      * @since 1.11
      */
     public static final String SHA_224 = "SHA-224";

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=1743778&r1=1743777&r2=1743778&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
 Sat May 14 01:33:23 2016
@@ -50,6 +50,18 @@ public class DigestUtilsTest {
     
     private File testFile;
 
+    private void assumeJava8() {
+        
Assume.assumeTrue(SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));
+    }
+
+    byte[] getTestData() {
+        return testData;
+    }
+
+    File getTestFile() {
+        return testFile;
+    }
+
     @Before
     public void setUp() throws Exception {
         new Random().nextBytes(testData);
@@ -311,10 +323,6 @@ public class DigestUtilsTest {
         // Examples from FIPS 180-4?
     }
 
-    private void assumeJava8() {
-        
Assume.assumeTrue(SystemUtils.isJavaVersionAtLeast(JavaVersion.JAVA_1_8));
-    }
-
     @Test
     public void testSha224HexFile() throws IOException {
         assumeJava8();

Added: 
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java
URL: 
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java?rev=1743778&view=auto
==============================================================================
--- 
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java
 (added)
+++ 
commons/proper/codec/trunk/src/test/java/org/apache/commons/codec/digest/MessageDigestAlgorithmTest.java
 Sat May 14 01:33:23 2016
@@ -0,0 +1,128 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.commons.codec.digest;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.IOException;
+import java.nio.ByteBuffer;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Assume;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Tests {@link MessageDigestAlgorithm}.
+ *
+ * @since 1.11
+ */
+@RunWith(Parameterized.class)
+public class MessageDigestAlgorithmTest {
+
+    @Parameters(name = "{0}")
+    public static Object[] data() {
+        return MessageDigestAlgorithm.values();
+    }
+
+    private DigestUtilsTest digestUtilsTest;
+
+    private final MessageDigestAlgorithm messageDigestAlgorithm;
+
+    public MessageDigestAlgorithmTest(MessageDigestAlgorithm 
messageDigestAlgorithm) {
+        this.messageDigestAlgorithm = messageDigestAlgorithm;
+    }
+
+    private byte[] digestTestData() throws IOException {
+        return messageDigestAlgorithm.digest(getTestData());
+    }
+
+    private byte[] getTestData() {
+        return digestUtilsTest.getTestData();
+    }
+
+    private File getTestFile() {
+        return digestUtilsTest.getTestFile();
+    }
+
+    @Before
+    public void setUp() throws Exception {
+        digestUtilsTest = new DigestUtilsTest();
+        digestUtilsTest.setUp();
+    }
+
+    @After
+    public void tearDown() throws Exception {
+        digestUtilsTest.tearDown();
+        digestUtilsTest = null;
+    }
+
+    @Test
+    public void testAlgorithm() throws IOException, NoSuchAlgorithmException {
+        final String algorithm = messageDigestAlgorithm.getAlgorithm();
+        Assert.assertNotNull(algorithm);
+        Assert.assertFalse(algorithm.isEmpty());
+        Assume.assumeTrue(messageDigestAlgorithm.isAvailable());
+        MessageDigest.getInstance(algorithm);
+    }
+
+    @Test
+    public void testDigestByteArray() throws IOException {
+        Assume.assumeTrue(messageDigestAlgorithm.isAvailable());
+        Assert.assertArrayEquals(digestTestData(),
+                DigestUtils.digest(messageDigestAlgorithm.getMessageDigest(), 
getTestData()));
+        Assert.assertArrayEquals(digestTestData(), 
messageDigestAlgorithm.digest(getTestData()));
+    }
+
+    @Test
+    public void testDigestByteBuffer() throws IOException {
+        Assume.assumeTrue(messageDigestAlgorithm.isAvailable());
+        Assert.assertArrayEquals(digestTestData(),
+                DigestUtils.digest(messageDigestAlgorithm.getMessageDigest(), 
ByteBuffer.wrap(getTestData())));
+        Assert.assertArrayEquals(digestTestData(), 
messageDigestAlgorithm.digest(ByteBuffer.wrap(getTestData())));
+    }
+
+    @Test
+    public void testDigestFile() throws IOException {
+        Assume.assumeTrue(messageDigestAlgorithm.isAvailable());
+        Assert.assertArrayEquals(digestTestData(),
+                DigestUtils.digest(messageDigestAlgorithm.getMessageDigest(), 
getTestFile()));
+        Assert.assertArrayEquals(digestTestData(), 
messageDigestAlgorithm.digest(getTestFile()));
+    }
+
+    @Test
+    public void testDigestInputStream() throws IOException {
+        Assume.assumeTrue(messageDigestAlgorithm.isAvailable());
+        Assert.assertArrayEquals(digestTestData(),
+                DigestUtils.digest(messageDigestAlgorithm.getMessageDigest(), 
new ByteArrayInputStream(getTestData())));
+        Assert.assertArrayEquals(digestTestData(), 
messageDigestAlgorithm.digest(new ByteArrayInputStream(getTestData())));
+    }
+
+    @Test
+    public void testGetMessageDigest() throws IOException, 
NoSuchAlgorithmException {
+        Assume.assumeTrue(messageDigestAlgorithm.isAvailable());
+        final MessageDigest messageDigest = 
messageDigestAlgorithm.getMessageDigest();
+        Assert.assertEquals(messageDigestAlgorithm.getAlgorithm(), 
messageDigest.getAlgorithm());
+    }
+
+}


Reply via email to