It might not matter here but in general I've stopped using foreach over arrays because it creates an iterator, which means more garbage.
You're probably right that a foreach would be better just for this class. Gary On May 14, 2016 3:17 AM, "sebb" <seb...@gmail.com> wrote: > Why does the code not use generic for loops? > > If there is a good reason for this, it should be documented. > > If not, the code should use the new generic loop as it's simpler and > less prone to errors (cannot use wrong index). > > On 14 May 2016 at 02:47, <ggreg...@apache.org> wrote: > > 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); > > + } > > +} > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: dev-unsubscr...@commons.apache.org > For additional commands, e-mail: dev-h...@commons.apache.org > >