Author: ggregory
Date: Sat May 14 01:47:35 2016
New Revision: 1743780
URL: http://svn.apache.org/viewvc?rev=1743780&view=rev
Log:
[CODEC-212] Create a minimal Digest command line utility:
org.apache.commons.codec.digest.Digest.
Added:
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/Digest.java
Modified:
commons/proper/codec/trunk/src/changes/changes.xml
Modified: commons/proper/codec/trunk/src/changes/changes.xml
URL:
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/changes/changes.xml?rev=1743780&r1=1743779&r2=1743780&view=diff
==============================================================================
--- commons/proper/codec/trunk/src/changes/changes.xml (original)
+++ commons/proper/codec/trunk/src/changes/changes.xml Sat May 14 01:47:35 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-212" due-to="Gary
Gregory">Create a minimal Digest command line utility:
org.apache.commons.codec.digest.Digest</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>
Added:
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/Digest.java
URL:
http://svn.apache.org/viewvc/commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/Digest.java?rev=1743780&view=auto
==============================================================================
---
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/Digest.java
(added)
+++
commons/proper/codec/trunk/src/main/java/org/apache/commons/codec/digest/Digest.java
Sat May 14 01:47:35 2016
@@ -0,0 +1,120 @@
+/*
+ * 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.security.MessageDigest;
+
+import org.apache.commons.codec.binary.Hex;
+
+/**
+ * A minimal command line to run digest over files.
+ *
+ * @see #main(String[])
+ */
+public class Digest {
+
+ /**
+ * Runs the digest algorithm in {@code args[0]} on the file in {@code
args[1]}. If there is no {@code args[1]}, use
+ * standard input.
+ *
+ * <p>
+ * The algorithm can also be {@code ALL} or {@code *} to output one line
for each known algorithm.
+ * </p>
+ *
+ * @param args
+ * {@code args[0]} is one of {@link MessageDigestAlgorithm}
name, {@link MessageDigest} name, {@code ALL}
+ * , or {@code *}. {@code args[1]} is a FILE.
+ * @throws IOException
+ */
+ public static void main(String[] args) throws IOException {
+ new Digest(args).run();
+ }
+
+ private final String algorithm;
+ private final String[] args;
+ private final String source;
+
+ private Digest(final String[] args) {
+ if (args == null) {
+ throw new IllegalArgumentException("args");
+ }
+ if (args.length == 0) {
+ throw new IllegalArgumentException(
+ String.format("Usage: java %s [algorithm]
[FILE|DIRECTORY]", Digest.class.getName()));
+ }
+ this.args = args;
+ algorithm = args[0];
+ source = args.length == 1 ? null : args[1];
+ }
+
+ private void println(String prefix, final byte[] digest) {
+ final String sourceDesc = source == null ? "-" : source;
+ System.out.println(prefix + Hex.encodeHexString(digest) + " " +
sourceDesc);
+ }
+
+ private void run() throws IOException {
+ if (algorithm.equalsIgnoreCase("ALL") || algorithm.equals("*")) {
+ run(MessageDigestAlgorithm.values());
+ return;
+ }
+ final MessageDigest messageDigest = DigestUtils.getDigest(algorithm,
null);
+ if (messageDigest != null) {
+ run("", messageDigest);
+ } else {
+ run("",
MessageDigestAlgorithm.valueOf(algorithm).getMessageDigest());
+ }
+ }
+
+ private void run(MessageDigestAlgorithm[] digestAlgorithms) throws
IOException {
+ for (int i = 0; i < digestAlgorithms.length; i++) {
+ final MessageDigestAlgorithm messageDigestAlgorithm =
digestAlgorithms[i];
+ if (messageDigestAlgorithm.isAvailable()) {
+ run(messageDigestAlgorithm.getAlgorithm() + " ",
messageDigestAlgorithm);
+ }
+ }
+ }
+
+ private void run(String prefix, final MessageDigest messageDigest) throws
IOException {
+ if (source == null) {
+ println(prefix, DigestUtils.digest(messageDigest, System.in));
+ return;
+ }
+ final File file = new File(source);
+ if (file.isFile()) {
+ println(prefix, DigestUtils.digest(messageDigest, file));
+ } else if (file.isDirectory()) {
+ run(prefix, messageDigest, file.listFiles());
+ }
+ }
+
+ private void run(String prefix, MessageDigest messageDigest, File[] files)
throws IOException {
+ for (int i = 0; i < files.length; i++) {
+ println(prefix, DigestUtils.digest(messageDigest, files[i]));
+ }
+ }
+
+ private void run(String prefix, final MessageDigestAlgorithm
messageDigestAlgorithm) throws IOException {
+ run(prefix, messageDigestAlgorithm.getMessageDigest());
+ }
+
+ @Override
+ public String toString() {
+ return String.format("%s[%s]", super.toString(), args);
+ }
+}