You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@ant.apache.org by mb...@apache.org on 2017/04/13 15:16:15 UTC

[15/34] ant git commit: java 5-8

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java
index c608583..abc52e3 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jdepend/JDependTask.java
@@ -24,9 +24,12 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.lang.reflect.Constructor;
 import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
 import java.util.Map;
-import java.util.Vector;
-
+import java.util.Optional;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.Task;
@@ -42,6 +45,8 @@ import org.apache.tools.ant.types.Reference;
 import org.apache.tools.ant.util.FileUtils;
 import org.apache.tools.ant.util.LoaderUtils;
 
+import jdepend.textui.JDepend;
+
 /**
  * Runs JDepend tests.
  *
@@ -53,7 +58,6 @@ import org.apache.tools.ant.util.LoaderUtils;
  *
  */
 public class JDependTask extends Task {
-    //private CommandlineJava commandline = new CommandlineJava();
 
     // required attributes
     private Path sourcesPath; // Deprecated!
@@ -71,7 +75,7 @@ public class JDependTask extends Task {
     private String format = "text";
     private PatternSet defaultPatterns = new PatternSet();
 
-    private static Constructor packageFilterC;
+    private static Constructor<?> packageFilterC;
     private static Method setFilter;
 
     private boolean includeRuntime = false;
@@ -79,13 +83,12 @@ public class JDependTask extends Task {
 
     static {
         try {
-            Class packageFilter =
+            Class<?> packageFilter =
                 Class.forName("jdepend.framework.PackageFilter");
             packageFilterC =
-                packageFilter.getConstructor(new Class[] {java.util.Collection.class});
+                packageFilter.getConstructor(Collection.class);
             setFilter =
-                jdepend.textui.JDepend.class.getDeclaredMethod("setFilter",
-                                                               new Class[] {packageFilter});
+                JDepend.class.getDeclaredMethod("setFilter", packageFilter);
         } catch (Throwable t) {
             if (setFilter == null) {
                 packageFilterC = null;
@@ -189,6 +192,7 @@ public class JDependTask extends Task {
      * @return a source path
      * @deprecated since 1.6.x.
      */
+    @Deprecated
     public Path createSourcespath() {
         if (sourcesPath == null) {
             sourcesPath = new Path(getProject());
@@ -201,6 +205,7 @@ public class JDependTask extends Task {
      * @return the sources path
      * @deprecated since 1.6.x.
      */
+    @Deprecated
     public Path getSourcespath() {
         return sourcesPath;
     }
@@ -320,11 +325,12 @@ public class JDependTask extends Task {
      * @see EnumeratedAttribute
      */
     public static class FormatAttribute extends EnumeratedAttribute {
-        private String [] formats = new String[]{"xml", "text"};
+        private String[] formats = new String[] { "xml", "text" };
 
         /**
          * @return the enumerated values
          */
+        @Override
         public String[] getValues() {
             return formats;
         }
@@ -368,11 +374,11 @@ public class JDependTask extends Task {
 
         File f = LoaderUtils.getResourceSource(getClass().getClassLoader(),
                                                resource);
-        if (f != null) {
+        if (f == null) {
+            log("Couldn\'t find " + resource, Project.MSG_DEBUG);
+        } else {
             log("Found " + f.getAbsolutePath(), Project.MSG_DEBUG);
             runtimeClasses.createPath().setLocation(f);
-        } else {
-            log("Couldn\'t find " + resource, Project.MSG_DEBUG);
         }
     }
 
@@ -381,31 +387,29 @@ public class JDependTask extends Task {
      *
      * @exception BuildException if an error occurs
      */
+    @Override
     public void execute() throws BuildException {
 
         CommandlineJava commandline = new CommandlineJava();
 
         if ("text".equals(format)) {
             commandline.setClassname("jdepend.textui.JDepend");
-        } else
-            if ("xml".equals(format)) {
-                commandline.setClassname("jdepend.xmlui.JDepend");
-            }
+        } else if ("xml".equals(format)) {
+            commandline.setClassname("jdepend.xmlui.JDepend");
+        }
 
         if (jvm != null) {
             commandline.setVm(jvm);
         }
         if (getSourcespath() == null && getClassespath() == null) {
             throw new BuildException("Missing classespath required argument");
-        } else if (getClassespath() == null) {
-            String msg =
-                "sourcespath is deprecated in JDepend >= 2.5 "
-                + "- please convert to classespath";
-            log(msg);
+        }
+        if (getClassespath() == null) {
+            log("sourcespath is deprecated in JDepend >= 2.5 - please convert to classespath");
         }
 
         // execute the test and get the return code
-        int exitValue = JDependTask.ERRORS;
+        int exitValue;
         boolean wasKilled = false;
         if (!getFork()) {
             exitValue = executeInVM(commandline);
@@ -426,11 +430,10 @@ public class JDependTask extends Task {
             String errorMessage = "JDepend FAILED"
                 + (wasKilled ? " - Timed out" : "");
 
-            if  (getHaltonerror()) {
+            if (getHaltonerror()) {
                 throw new BuildException(errorMessage, getLocation());
-            } else {
-                log(errorMessage, Project.MSG_ERR);
             }
+            log(errorMessage, Project.MSG_ERR);
         }
     }
 
@@ -471,15 +474,10 @@ public class JDependTask extends Task {
             log("Output to be stored in " + getOutputFile().getPath());
         }
 
-
         try {
-            if (getClassespath() != null) {
-                // This is the new, better way - use classespath instead
-                // of sourcespath.  The code is currently the same - you
-                // need class files in a directory to use this or jar files.
-                String[] cP = getClassespath().list();
-                for (int i = 0; i < cP.length; i++) {
-                    File f = new File(cP[i]);
+            getWorkingPath().ifPresent(path -> {
+                for (String filepath : path.list()) {
+                    File f = new File(filepath);
                     // not necessary as JDepend would fail, but why loose
                     // some time?
                     if (!f.exists()) {
@@ -500,48 +498,17 @@ public class JDependTask extends Task {
                         throw new BuildException(msg);
                     }
                 }
-
-            } else if (getSourcespath() != null) {
-
-                // This is the old way and is deprecated - classespath is
-                // the right way to do this and is above
-                String[] sP = getSourcespath().list();
-                for (int i = 0; i < sP.length; i++) {
-                    File f = new File(sP[i]);
-
-                    // not necessary as JDepend would fail, but why loose
-                    // some time?
-                    if (!f.exists() || !f.isDirectory()) {
-                        String msg = "\""
-                            + f.getPath()
-                            + "\" does not represent a valid"
-                            + " directory. JDepend would fail.";
-                        log(msg);
-                        throw new BuildException(msg);
-                    }
-                    try {
-                        jdepend.addDirectory(f.getPath());
-                    } catch (IOException e) {
-                        String msg =
-                            "JDepend Failed when adding a source directory: "
-                            + e.getMessage();
-                        log(msg);
-                        throw new BuildException(msg);
-                    }
-                }
-            }
+            });
 
             // This bit turns <exclude> child tags into patters to ignore
             String[] patterns = defaultPatterns.getExcludePatterns(getProject());
             if (patterns != null && patterns.length > 0) {
                 if (setFilter != null) {
-                    Vector v = new Vector();
-                    for (int i = 0; i < patterns.length; i++) {
-                        v.addElement(patterns[i]);
-                    }
+                    List<String> v = new ArrayList<>();
+                    Collections.addAll(v, patterns);
                     try {
-                        Object o = packageFilterC.newInstance(new Object[] {v});
-                        setFilter.invoke(jdepend, new Object[] {o});
+                        Object o = packageFilterC.newInstance(v);
+                        setFilter.invoke(jdepend, o);
                     } catch (Throwable e) {
                         log("excludes will be ignored as JDepend doesn't like me: "
                             + e.getMessage(), Project.MSG_WARN);
@@ -554,8 +521,8 @@ public class JDependTask extends Task {
 
             jdepend.analyze();
             if (pw != null && pw.checkError()) {
-                throw new IOException("Encountered an error writing JDepend"
-                                      + " output");
+                throw new IOException(
+                    "Encountered an error writing JDepend output");
             }
         } catch (IOException ex) {
             throw new BuildException(ex);
@@ -566,7 +533,6 @@ public class JDependTask extends Task {
         return SUCCESS;
     }
 
-
     /**
      * Execute the task by forking a new JVM. The command will block until
      * it finishes. To know if the process was destroyed or not, use the
@@ -594,8 +560,8 @@ public class JDependTask extends Task {
         }
 
         if (includeRuntime) {
-            Map/*<String, String>*/ env = Execute.getEnvironmentVariables();
-            String cp = (String) env.get("CLASSPATH");
+            Map<String, String> env = Execute.getEnvironmentVariables();
+            String cp = env.get("CLASSPATH");
             if (cp != null) {
                 commandline.createClasspath(getProject()).createPath()
                     .append(new Path(getProject(), cp));
@@ -615,42 +581,20 @@ public class JDependTask extends Task {
             // we have to find a cleaner way to put this output
         }
 
-        if (getSourcespath() != null) {
-            // This is deprecated - use classespath in the future
-            String[] sP = getSourcespath().list();
-            for (int i = 0; i < sP.length; i++) {
-                File f = new File(sP[i]);
-
+        getWorkingPath().ifPresent(path -> {
+            for (String filepath : path.list()) {
+                File f = new File(filepath);
+                
                 // not necessary as JDepend would fail, but why loose
                 // some time?
                 if (!f.exists() || !f.isDirectory()) {
-                    throw new BuildException("\"" + f.getPath()
-                                             + "\" does not represent a valid"
-                                             + " directory. JDepend would"
-                                             + " fail.");
-                }
-                commandline.createArgument().setValue(f.getPath());
-            }
-        }
-
-        if (getClassespath() != null) {
-            // This is the new way - use classespath - code is the
-            // same for now
-            String[] cP = getClassespath().list();
-            for (int i = 0; i < cP.length; i++) {
-                File f = new File(cP[i]);
-                // not necessary as JDepend would fail, but why loose
-                // some time?
-                if (!f.exists()) {
-                    throw new BuildException("\"" + f.getPath()
-                                             + "\" does not represent a valid"
-                                             + " file or directory. JDepend would"
-                                             + " fail.");
+                    throw new BuildException(
+                        "\"%s\" does not represent a valid directory. JDepend would fail.",
+                        f.getPath());
                 }
                 commandline.createArgument().setValue(f.getPath());
             }
-        }
-
+        });
         Execute execute = new Execute(new LogStreamHandler(this,
             Project.MSG_INFO, Project.MSG_WARN), watchdog);
         execute.setCommandline(commandline.getCommandline());
@@ -681,4 +625,17 @@ public class JDependTask extends Task {
         }
         return new ExecuteWatchdog(getTimeout().longValue());
     }
+
+    private Optional<Path> getWorkingPath() {
+        Optional<Path> result = Optional.ofNullable(getClassespath());
+        if (result.isPresent()) {
+            return result;
+        }
+        result = Optional.ofNullable(getSourcespath());
+        if (result.isPresent()) {
+            log("nested sourcespath is deprecated; please use classespath");
+        }
+        return result;
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java
index 20e9fc5..7609c2f 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/ClassNameReader.java
@@ -49,8 +49,8 @@ class ConstantPool {
         super();
 
         int count = data.readUnsignedShort();
-        types = new byte [ count ];
-        values = new Object [ count ];
+        types = new byte[count];
+        values = new Object[count];
         // read in all constant pool entries.
         for (int i = 1; i < count; i++) {
             byte type = data.readByte();
@@ -64,33 +64,33 @@ class ConstantPool {
                 break;
 
             case INTEGER :
-                values[i] = new Integer(data.readInt());
+                values[i] = Integer.valueOf(data.readInt());
                 break;
 
             case FLOAT :
-                values[i] = new Float(data.readFloat());
+                values[i] = Float.valueOf(data.readFloat());
                 break;
 
             case LONG :
-                values[i] = new Long(data.readLong());
+                values[i] = Long.valueOf(data.readLong());
                 ++i;
                 break;
 
             case DOUBLE :
-                values[i] = new Double(data.readDouble());
+                values[i] = Double.valueOf(data.readDouble());
                 ++i;
                 break;
 
             case CLASS :
             case STRING :
-                values[i] = new Integer(data.readUnsignedShort());
+                values[i] = Integer.valueOf(data.readUnsignedShort());
                 break;
 
             case FIELDREF :
             case METHODREF :
             case INTERFACEMETHODREF :
             case NAMEANDTYPE :
-                values[i] = new Integer(data.readInt());
+                values[i] = Integer.valueOf(data.readInt());
                 break;
             default:
                 // Do nothing
@@ -133,7 +133,6 @@ public class ClassNameReader extends Object {
         return className;
     }
 
-
 }
 
 

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java
index f5767e6..4e4b0aa 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/JlinkTask.java
@@ -54,11 +54,19 @@ import org.apache.tools.ant.types.Path;
  */
 public class JlinkTask extends MatchingTask {
 
+    private File outfile = null;
+
+    private Path mergefiles = null;
+
+    private Path addfiles = null;
+
+    private boolean compress = false;
+
     /**
      * The output file for this run of jlink. Usually a jar or zip file.
      * @param outfile the output file
      */
-    public  void setOutfile(File outfile) {
+    public void setOutfile(File outfile) {
         this.outfile = outfile;
     }
 
@@ -67,7 +75,7 @@ public class JlinkTask extends MatchingTask {
      * be merged into the output.
      * @return a path to be configured
      */
-    public  Path createMergefiles() {
+    public Path createMergefiles() {
         if (this.mergefiles == null) {
             this.mergefiles = new Path(getProject());
         }
@@ -78,7 +86,7 @@ public class JlinkTask extends MatchingTask {
      * Sets the files to be merged into the output.
      * @param mergefiles a path
      */
-    public  void setMergefiles(Path mergefiles) {
+    public void setMergefiles(Path mergefiles) {
         if (this.mergefiles == null) {
             this.mergefiles = mergefiles;
         } else {
@@ -91,7 +99,7 @@ public class JlinkTask extends MatchingTask {
      * be added to the output.
      * @return a path to be configured
      */
-    public  Path createAddfiles() {
+    public Path createAddfiles() {
         if (this.addfiles == null) {
             this.addfiles = new Path(getProject());
         }
@@ -102,7 +110,7 @@ public class JlinkTask extends MatchingTask {
      * Sets the files to be added into the output.
      * @param addfiles a path
      */
-    public  void setAddfiles(Path addfiles) {
+    public void setAddfiles(Path addfiles) {
         if (this.addfiles == null) {
             this.addfiles = addfiles;
         } else {
@@ -114,7 +122,7 @@ public class JlinkTask extends MatchingTask {
      * Defines whether or not the output should be compacted.
      * @param compress a <code>boolean</code> value
      */
-    public  void setCompress(boolean compress) {
+    public void setCompress(boolean compress) {
         this.compress = compress;
     }
 
@@ -122,15 +130,16 @@ public class JlinkTask extends MatchingTask {
      * Does the adding and merging.
      * @throws BuildException on error
      */
-    public  void execute() throws BuildException {
+    @Override
+    public void execute() throws BuildException {
         //Be sure everything has been set.
         if (outfile == null) {
-            throw new BuildException("outfile attribute is required! "
-                + "Please set.");
+            throw new BuildException(
+                "outfile attribute is required! Please set.");
         }
         if (!haveAddFiles() && !haveMergeFiles()) {
-            throw new BuildException("addfiles or mergefiles required! "
-                + "Please set.");
+            throw new BuildException(
+                "addfiles or mergefiles required! Please set.");
         }
         log("linking:     " + outfile.getPath());
         log("compression: " + compress, Project.MSG_VERBOSE);
@@ -161,23 +170,6 @@ public class JlinkTask extends MatchingTask {
     }
 
     private boolean haveEntries(Path p) {
-        if (p == null) {
-            return false;
-        }
-        if (p.size() > 0) {
-            return true;
-        }
-        return false;
+        return !(p == null || p.isEmpty());
     }
-
-    private  File outfile = null;
-
-    private  Path mergefiles = null;
-
-    private  Path addfiles = null;
-
-    private  boolean compress = false;
-
 }
-
-

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java
index 4f3cff9..0d4895c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jlink/jlink.java
@@ -29,6 +29,7 @@ import java.io.InputStream;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.Vector;
 import java.util.zip.CRC32;
 import java.util.zip.Deflater;
@@ -37,8 +38,6 @@ import java.util.zip.ZipException;
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
 
-import org.apache.tools.ant.util.FileUtils;
-
 // CheckStyle:TypeNameCheck OFF - bc
 /**
  * jlink links together multiple .jar files.
@@ -49,9 +48,9 @@ public class jlink {
 
     private String outfile = null;
 
-    private Vector mergefiles = new Vector(VECTOR_INIT_SIZE);
+    private List<String> mergefiles = new Vector<>(VECTOR_INIT_SIZE);
 
-    private Vector addfiles = new Vector(VECTOR_INIT_SIZE);
+    private List<String> addfiles = new Vector<>(VECTOR_INIT_SIZE);
 
     private boolean compression = false;
 
@@ -71,7 +70,6 @@ public class jlink {
         this.outfile = outfile;
     }
 
-
     /**
      * Adds a file to be merged into the output.
      * @param fileToMerge the file to merge into the output.
@@ -80,10 +78,9 @@ public class jlink {
         if (fileToMerge == null) {
             return;
         }
-        mergefiles.addElement(fileToMerge);
+        mergefiles.add(fileToMerge);
     }
 
-
     /** Adds a file to be added into the output.
      * @param fileToAdd the file to add to the output.
      */
@@ -91,38 +88,35 @@ public class jlink {
         if (fileToAdd == null) {
             return;
         }
-        addfiles.addElement(fileToAdd);
+        addfiles.add(fileToAdd);
     }
 
-
     /**
      * Adds several files to be merged into the output.
      * @param filesToMerge an array of files to merge into the output.
      */
-    public void addMergeFiles(String[] filesToMerge) {
+    public void addMergeFiles(String... filesToMerge) {
         if (filesToMerge == null) {
             return;
         }
-        for (int i = 0; i < filesToMerge.length; i++) {
-            addMergeFile(filesToMerge[i]);
+        for (String element : filesToMerge) {
+            addMergeFile(element);
         }
     }
 
-
     /**
-     * Adds several file to be added into the output.
+     * Adds several files to be added into the output.
      * @param filesToAdd an array of files to add to the output.
      */
-    public void addAddFiles(String[] filesToAdd) {
+    public void addAddFiles(String... filesToAdd) {
         if (filesToAdd == null) {
             return;
         }
-        for (int i = 0; i < filesToAdd.length; i++) {
-            addAddFile(filesToAdd[i]);
+        for (String element : filesToAdd) {
+            addAddFile(element);
         }
     }
 
-
     /**
      * Determines whether output will be compressed.
      * @param compress if true use compression.
@@ -131,7 +125,6 @@ public class jlink {
         this.compression = compress;
     }
 
-
     /**
      * Performs the linking of files. Addfiles are added to the output as-is.
      * For example, a jar file is added to the output as a jar file. However,
@@ -145,48 +138,40 @@ public class jlink {
      * @throws Exception on error.
      */
     public void link() throws Exception { //NOSONAR
-        ZipOutputStream output = new ZipOutputStream(Files.newOutputStream(Paths.get(outfile)));
+        try (ZipOutputStream output =
+            new ZipOutputStream(Files.newOutputStream(Paths.get(outfile)))) {
 
-        if (compression) {
-            output.setMethod(ZipOutputStream.DEFLATED);
-            output.setLevel(Deflater.DEFAULT_COMPRESSION);
-        } else {
-            output.setMethod(ZipOutputStream.STORED);
-        }
-
-        Enumeration merges = mergefiles.elements();
-
-        while (merges.hasMoreElements()) {
-            String path = (String) merges.nextElement();
-            File f = new File(path);
-
-            if (f.getName().endsWith(".jar") || f.getName().endsWith(".zip")) {
-                //Do the merge
-                mergeZipJarContents(output, f);
+            if (compression) {
+                output.setMethod(ZipOutputStream.DEFLATED);
+                output.setLevel(Deflater.DEFAULT_COMPRESSION);
             } else {
-                //Add this file to the addfiles Vector and add it
-                //later at the top level of the output file.
-                addAddFile(path);
+                output.setMethod(ZipOutputStream.STORED);
             }
-        }
-
-        Enumeration adds = addfiles.elements();
-
-        while (adds.hasMoreElements()) {
-            String name = (String) adds.nextElement();
-            File f = new File(name);
+            for (String path : mergefiles) {
+                File f = new File(path);
+
+                if (f.getName().endsWith(".jar")
+                    || f.getName().endsWith(".zip")) {
+                    //Do the merge
+                    mergeZipJarContents(output, f);
+                } else {
+                    //Add this file to the addfiles Vector and add it
+                    //later at the top level of the output file.
+                    addAddFile(path);
+                }
+            }
+            for (String name : addfiles) {
+                File f = new File(name);
 
-            if (f.isDirectory()) {
-                //System.out.println("in jlink: adding directory contents of " + f.getPath());
-                addDirContents(output, f, f.getName() + '/', compression);
-            } else {
-                addFile(output, f, "", compression);
+                if (f.isDirectory()) {
+                    addDirContents(output, f, f.getName() + '/', compression);
+                } else {
+                    addFile(output, f, "", compression);
+                }
             }
         }
-        FileUtils.close(output);
     }
 
-
     /**
      * The command line entry point for jlink.
      * @param args an array of arguments
@@ -212,7 +197,6 @@ public class jlink {
         }
     }
 
-
     /*
      * Actually performs the merging of f into the output.
      * f should be a zip or jar file.
@@ -223,10 +207,10 @@ public class jlink {
             return;
         }
         try (ZipFile zipf = new ZipFile(f)) {
-            Enumeration entries = zipf.entries();
+            Enumeration<? extends ZipEntry> entries = zipf.entries();
 
             while (entries.hasMoreElements()) {
-                ZipEntry inputEntry = (ZipEntry) entries.nextElement();
+                ZipEntry inputEntry = entries.nextElement();
                 //Ignore manifest entries.  They're bound to cause conflicts between
                 //files that are being merged.  User should supply their own
                 //manifest file when doing the merge.
@@ -244,33 +228,29 @@ public class jlink {
                         //entry from another mergefile was called "com".
                         //In that case, just ignore the error and go on to the
                         //next entry.
-                        String mess = ex.getMessage();
-
-                        if (mess.indexOf("duplicate") >= 0) {
+                        if (ex.getMessage().indexOf("duplicate") >= 0) {
                             //It was the duplicate entry.
                             continue;
-                        } else {
-                            // I hate to admit it, but we don't know what happened
-                            // here.  Throw the Exception.
-                            throw ex;
                         }
+                        // I hate to admit it, but we don't know what happened
+                        // here.  Throw the Exception.
+                        throw ex;
                     }
 
-                    InputStream in = zipf.getInputStream(inputEntry);
-                    int len = buffer.length;
-                    int count = -1;
+                    try (InputStream in = zipf.getInputStream(inputEntry)) {
+                        int len = buffer.length;
+                        int count = -1;
 
-                    while ((count = in.read(buffer, 0, len)) > 0) {
-                        output.write(buffer, 0, count);
+                        while ((count = in.read(buffer, 0, len)) > 0) {
+                            output.write(buffer, 0, count);
+                        }
+                        output.closeEntry();
                     }
-                    in.close();
-                    output.closeEntry();
                 }
             }
         }
     }
 
-
     /*
      * Adds contents of a directory to the output.
      */
@@ -290,7 +270,6 @@ public class jlink {
         }
     }
 
-
     /*
      * Gets the name of an entry in the file.  This is the real name
      * which for a class is the name of the package with the class
@@ -301,9 +280,7 @@ public class jlink {
 
         if (!name.endsWith(".class")) {
             // see if the file is in fact a .class file, and determine its actual name.
-            InputStream input = null;
-            try {
-                input = Files.newInputStream(file.toPath());
+            try (InputStream input = Files.newInputStream(file.toPath())) {
                 String className = ClassNameReader.getClassName(input);
 
                 if (className != null) {
@@ -311,13 +288,12 @@ public class jlink {
                 }
             } catch (IOException ioe) {
                 //do nothing
-            } finally {
-                FileUtils.close(input);
             }
         }
-        System.out.println("From " + file.getPath() + " and prefix " + prefix
-                           + ", creating entry " + prefix + name);
-        return (prefix + name);
+        System.out.printf(
+            "From %1$s and prefix %2$s, creating entry %2$s%3$s%n",
+            file.getPath(), prefix, name);
+        return prefix + name;
     }
 
 
@@ -337,12 +313,9 @@ public class jlink {
         if (!compress) {
             entry.setCrc(calcChecksum(file));
         }
-        InputStream input = Files.newInputStream(file.toPath());
-
-        addToOutputStream(output, input, entry);
+        addToOutputStream(output, Files.newInputStream(file.toPath()), entry);
     }
 
-
     /*
      * A convenience method that several other methods might call.
      */
@@ -356,7 +329,7 @@ public class jlink {
             return;
         }
 
-        int numBytes = -1;
+        int numBytes;
 
         while ((numBytes = input.read(buffer)) > 0) {
             output.write(buffer, 0, numBytes);
@@ -365,7 +338,6 @@ public class jlink {
         input.close();
     }
 
-
     /*
      * A method that does the work on a given entry in a mergefile.
      * The big deal is to set the right parameters in the ZipEntry
@@ -387,11 +359,9 @@ public class jlink {
         String name = inputEntry.getName();
 
         if (!(inputEntry.isDirectory() || name.endsWith(".class"))) {
-            try {
-                InputStream input = zip.getInputStream(zip.getEntry(name));
+            try (InputStream input = zip.getInputStream(zip.getEntry(name))) {
                 String className = ClassNameReader.getClassName(input);
 
-                input.close();
                 if (className != null) {
                     name = className.replace('.', '/') + ".class";
                 }
@@ -416,18 +386,15 @@ public class jlink {
         return outputEntry;
     }
 
-
     /*
      * Necessary in the case where you add a entry that
      * is not compressed.
      */
     private long calcChecksum(File f) throws IOException {
-        BufferedInputStream in = new BufferedInputStream(Files.newInputStream(f.toPath()));
-
-        return calcChecksum(in);
+        return calcChecksum(
+            new BufferedInputStream(Files.newInputStream(f.toPath())));
     }
 
-
     /*
      * Necessary in the case where you add a entry that
      * is not compressed.
@@ -435,18 +402,15 @@ public class jlink {
     private long calcChecksum(InputStream in) throws IOException {
         CRC32 crc = new CRC32();
         int len = buffer.length;
-        int count = -1;
-        int haveRead = 0;
+        int count;
 
         while ((count = in.read(buffer, 0, len)) > 0) {
-            haveRead += count;
             crc.update(buffer, 0, count);
         }
         in.close();
         return crc.getValue();
     }
 
-
 }
 
 

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jsp/Jasper41Mangler.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/Jasper41Mangler.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/Jasper41Mangler.java
index 609938c..d863715 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/Jasper41Mangler.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/Jasper41Mangler.java
@@ -27,19 +27,18 @@ import java.io.File;
  */
 public class Jasper41Mangler implements JspMangler {
 
-
     /**
      * map from a jsp file to a java filename; does not do packages
      *
      * @param jspFile file
      * @return java filename
      */
+    @Override
     public String mapJspToJavaName(File jspFile) {
         String jspUri = jspFile.getAbsolutePath();
         int start = jspUri.lastIndexOf(File.separatorChar) + 1;
         int end = jspUri.length();
-        StringBuffer modifiedClassName;
-        modifiedClassName = new StringBuffer(jspUri.length() - start);
+        StringBuilder modifiedClassName = new StringBuilder(jspUri.length() - start);
         if (!Character.isJavaIdentifierStart(jspUri.charAt(start))
             || jspUri.charAt(start) == '_') {
             // If the first char is not a start of Java identifier or is _
@@ -78,7 +77,6 @@ public class Jasper41Mangler implements JspMangler {
         // CheckStyle:MagicNumber ON
     }
 
-
     /**
      * taking in the substring representing the path relative to the source dir
      * return a new string representing the destination path
@@ -86,6 +84,7 @@ public class Jasper41Mangler implements JspMangler {
      * @return null as this is not implemented.
      * @todo
      */
+    @Override
     public String mapPath(String path) {
         return null;
     }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java
index 9832e3e..4af9f3d 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspC.java
@@ -19,8 +19,7 @@
 package org.apache.tools.ant.taskdefs.optional.jsp;
 
 import java.io.File;
-import java.util.Date;
-import java.util.Enumeration;
+import java.time.Instant;
 import java.util.Vector;
 
 import org.apache.tools.ant.AntClassLoader;
@@ -80,8 +79,8 @@ public class JspC extends MatchingTask {
     private boolean mapped;
     private int verbose = 0;
     // CheckStyle:VisibilityModifier OFF - bc
-    protected Vector compileList = new Vector();
-    Vector javaFiles = new Vector();
+    protected Vector<String> compileList = new Vector<>();
+    Vector<File> javaFiles = new Vector<>();
 
     /**
      *  flag to control action on execution trouble
@@ -209,6 +208,7 @@ public class JspC extends MatchingTask {
     public String getIeplugin() {
         return iepluginid;
     }
+
     /**
      * Java Plugin CLASSID for Internet Explorer
      * @param iepluginid the id to use.
@@ -272,7 +272,6 @@ public class JspC extends MatchingTask {
         return uriroot;
     }
 
-
     /**
      * Set the classpath to be used for this compilation.
      * @param cp the path to be used.
@@ -413,7 +412,7 @@ public class JspC extends MatchingTask {
      * get the list of files to compile
      * @return the list of files.
      */
-    public Vector getCompileList() {
+    public Vector<String> getCompileList() {
         return compileList;
     }
 
@@ -422,6 +421,7 @@ public class JspC extends MatchingTask {
      * have changed and hand them off to a jsp compiler
      * @throws BuildException on error.
      */
+    @Override
     public void execute()
         throws BuildException {
 
@@ -496,7 +496,7 @@ public class JspC extends MatchingTask {
             log("compiling " + compileList.size() + " files",
                 Project.MSG_VERBOSE);
 
-            if (compileList.size() > 0) {
+            if (!compileList.isEmpty()) {
 
                 log("Compiling " + compileList.size() + " source file"
                     + (compileList.size() == 1 ? "" : "s")
@@ -504,12 +504,10 @@ public class JspC extends MatchingTask {
                     + dest);
                 doCompilation(compiler);
 
+            } else if (filecount == 0) {
+                log("there were no files to compile", Project.MSG_INFO);
             } else {
-                if (filecount == 0) {
-                    log("there were no files to compile", Project.MSG_INFO);
-                } else {
-                    log("all files are up to date", Project.MSG_VERBOSE);
-                }
+                log("all files are up to date", Project.MSG_VERBOSE);
             }
         }
     }
@@ -519,15 +517,11 @@ public class JspC extends MatchingTask {
      * this is destDir or it id destDir + the package name
      */
     private File getActualDestDir() {
-        File dest = null;
         if (packageName == null) {
-            dest = destDir;
-        } else {
-            String path = destDir.getPath() + File.separatorChar
-                + packageName.replace('.', File.separatorChar);
-            dest = new File(path);
+            return destDir;
         }
-        return dest;
+        return new File(destDir.getPath() + File.separatorChar
+            + packageName.replace('.', File.separatorChar));
     }
 
     /**
@@ -542,9 +536,8 @@ public class JspC extends MatchingTask {
         if (!compiler.execute()) {
             if (failOnError) {
                 throw new BuildException(FAIL_MSG, getLocation());
-            } else {
-                log(FAIL_MSG, Project.MSG_ERR);
             }
+            log(FAIL_MSG, Project.MSG_ERR);
         }
     }
 
@@ -566,23 +559,19 @@ public class JspC extends MatchingTask {
     protected void scanDir(File srcDir, File dest, JspMangler mangler,
                            String[] files) {
 
-        long now = (new Date()).getTime();
+        long now = Instant.now().toEpochMilli();
 
-        for (int i = 0; i < files.length; i++) {
-            String filename = files[i];
+        for (String filename : files) {
             File srcFile = new File(srcDir, filename);
             File javaFile = mapToJavaFile(mangler, srcFile, srcDir, dest);
             if (javaFile == null) {
                 continue;
             }
-
             if (srcFile.lastModified() > now) {
                 log("Warning: file modified in the future: " + filename,
                     Project.MSG_WARN);
             }
-            boolean shouldCompile = false;
-            shouldCompile = isCompileNeeded(srcFile, javaFile);
-            if (shouldCompile) {
+            if (isCompileNeeded(srcFile, javaFile)) {
                 compileList.addElement(srcFile.getAbsolutePath());
                 javaFiles.addElement(javaFile);
             }
@@ -612,26 +601,21 @@ public class JspC extends MatchingTask {
             log("Compiling " + srcFile.getPath()
                 + " because java file " + javaFile.getPath()
                 + " does not exist", Project.MSG_VERBOSE);
-        } else {
-            if (srcFile.lastModified() > javaFile.lastModified()) {
-                shouldCompile = true;
-                log("Compiling " + srcFile.getPath()
-                    + " because it is out of date with respect to "
-                    + javaFile.getPath(),
-                    Project.MSG_VERBOSE);
-            } else {
-                if (javaFile.length() == 0) {
-                    shouldCompile = true;
-                    log("Compiling " + srcFile.getPath()
-                        + " because java file " + javaFile.getPath()
-                        + " is empty", Project.MSG_VERBOSE);
-                }
-            }
+        } else if (srcFile.lastModified() > javaFile.lastModified()) {
+            shouldCompile = true;
+            log("Compiling " + srcFile.getPath()
+                + " because it is out of date with respect to "
+                + javaFile.getPath(),
+                Project.MSG_VERBOSE);
+        } else if (javaFile.length() == 0) {
+            shouldCompile = true;
+            log("Compiling " + srcFile.getPath()
+                + " because java file " + javaFile.getPath()
+                + " is empty", Project.MSG_VERBOSE);
         }
         return shouldCompile;
     }
 
-
     /**
      * get a filename from our jsp file.
      * @param mangler the jsp filename manager.
@@ -647,7 +631,6 @@ public class JspC extends MatchingTask {
             return null;
         }
         String javaFileName = mangler.mapJspToJavaName(srcFile);
-        //        String srcFileDir=srcFile.getParent();
         return new File(dest, javaFileName);
     }
 
@@ -658,9 +641,7 @@ public class JspC extends MatchingTask {
      */
     public void deleteEmptyJavaFiles() {
         if (javaFiles != null) {
-            Enumeration e = javaFiles.elements();
-            while (e.hasMoreElements()) {
-                File file = (File) e.nextElement();
+            for (File file : javaFiles) {
                 if (file.exists() && file.length() == 0) {
                     log("deleting empty output file " + file);
                     file.delete();
@@ -694,9 +675,6 @@ public class JspC extends MatchingTask {
         public void setBaseDir(File directory) {
             this.directory = directory;
         }
-        //end inner class
     }
 
-
-    //end class
 }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java
index 850c6bc..4cde079 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/JspNameMangler.java
@@ -58,6 +58,7 @@ public class JspNameMangler implements JspMangler {
      * @param jspFile file
      * @return java filename
      */
+    @Override
     public String mapJspToJavaName(File jspFile) {
         return mapJspToBaseName(jspFile) + ".java";
     }
@@ -70,20 +71,19 @@ public class JspNameMangler implements JspMangler {
      * @return exensionless potentially remapped name
      */
     private String mapJspToBaseName(File jspFile) {
-        String className;
-        className = stripExtension(jspFile);
+        String className = stripExtension(jspFile);
 
         // since we don't mangle extensions like the servlet does,
         // we need to check for keywords as class names
-        for (int i = 0; i < keywords.length; ++i) {
-            if (className.equals(keywords[i])) {
+        for (String keyword : keywords) {
+            if (className.equals(keyword)) {
                 className += "%";
                 break;
             }
         }
 
         // Fix for invalid characters. If you think of more add to the list.
-        StringBuffer modifiedClassName = new StringBuffer(className.length());
+        StringBuilder modifiedClassName = new StringBuilder(className.length());
         // first char is more restrictive than the rest
         char firstChar = className.charAt(0);
         if (Character.isJavaIdentifierStart(firstChar)) {
@@ -148,6 +148,7 @@ public class JspNameMangler implements JspMangler {
      * @param path not used
      * @return null always.
      */
+    @Override
     public String mapPath(String path) {
         return null;
     }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jsp/WLJspc.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/WLJspc.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/WLJspc.java
index 45a427a..779b01b 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/WLJspc.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/WLJspc.java
@@ -19,7 +19,8 @@ package org.apache.tools.ant.taskdefs.optional.jsp;
 
 //apache/ant imports
 import java.io.File;
-import java.util.Date;
+import java.time.Instant;
+import java.util.List;
 import java.util.StringTokenizer;
 import java.util.Vector;
 
@@ -98,21 +99,22 @@ public class WLJspc extends MatchingTask {
     //private String compilerPath; //fully qualified name for the compiler executable
 
     private String pathToPackage = "";
-    private Vector filesToDo = new Vector();
+    private List<String> filesToDo = new Vector<>();
 
     /**
      * Run the task.
      * @throws BuildException if there is an error.
      */
+    @Override
     public void execute() throws BuildException {
         if (!destinationDirectory.isDirectory()) {
-            throw new BuildException("destination directory "
-                + destinationDirectory.getPath() + " is not valid");
+            throw new BuildException("destination directory %s is not valid",
+                destinationDirectory.getPath());
         }
 
         if (!sourceDirectory.isDirectory()) {
-            throw new BuildException("src directory "
-                + sourceDirectory.getPath() + " is not valid");
+            throw new BuildException("src directory %s is not valid",
+                sourceDirectory.getPath());
         }
 
         if (destinationPackage == null) {
@@ -120,7 +122,6 @@ public class WLJspc extends MatchingTask {
                                      getLocation());
         }
 
-
         pathToPackage
             = this.destinationPackage.replace('.', File.separatorChar);
         // get all the files in the sourceDirectory
@@ -146,8 +147,6 @@ public class WLJspc extends MatchingTask {
         String[] args = new String[12];
         // CheckStyle:MagicNumber ON
 
-        File jspFile = null;
-        String parents = "";
         int j = 0;
         //TODO  this array stuff is a remnant of prev trials.. gotta remove.
         args[j++] = "-d";
@@ -168,24 +167,21 @@ public class WLJspc extends MatchingTask {
         this.scanDir(files);
         log("Compiling " + filesToDo.size() + " JSP files");
 
-        final int size = filesToDo.size();
-        for (int i = 0; i < size; i++) {
+        for (String filename : filesToDo) {
             //TODO
             // All this to get package according to weblogic standards
             // Can be written better... this is too hacky!
-            // Careful.. similar code in scanDir , but slightly different!!
-            String filename = (String) filesToDo.elementAt(i);
-            jspFile = new File(filename);
+            // Careful.. similar code in scanDir, but slightly different!!
+            File jspFile = new File(filename);
             args[j] = "-package";
-            parents = jspFile.getParent();
-            if ((parents != null)  && (!("").equals(parents))) {
-                parents =  this.replaceString(parents, File.separator, "_.");
-                args[j + 1] = destinationPackage + "." + "_" + parents;
-            } else {
+            String parents = jspFile.getParent();
+            if (parents == null || "".equals(parents)) {
                 args[j + 1] = destinationPackage;
+            } else {
+                parents = this.replaceString(parents, File.separator, "_.");
+                args[j + 1] = destinationPackage + "." + "_" + parents;
             }
 
-
             args[j + 2] =  sourceDirectory + File.separator + filename;
             helperTask.clearArgs();
 
@@ -202,8 +198,6 @@ public class WLJspc extends MatchingTask {
         }
     }
 
-
-
     /**
      * Set the classpath to be used for this compilation.
      * @param classpath the classpath to use.
@@ -234,7 +228,6 @@ public class WLJspc extends MatchingTask {
      * @param dirName the directory containg the source jsp's
      */
     public void setSrc(File dirName) {
-
         sourceDirectory = dirName;
     }
 
@@ -245,7 +238,6 @@ public class WLJspc extends MatchingTask {
      * @param dirName the directory containg the source jsp's
      */
     public void setDest(File dirName) {
-
         destinationDirectory = dirName;
     }
 
@@ -255,7 +247,6 @@ public class WLJspc extends MatchingTask {
      * @param packageName the package name for the classes
      */
     public void setPackage(String packageName) {
-
         destinationPackage = packageName;
     }
 
@@ -265,52 +256,48 @@ public class WLJspc extends MatchingTask {
      * @param files the files to scan.
      */
     protected void scanDir(String[] files) {
-
-        long now = (new Date()).getTime();
-        File jspFile = null;
-        String parents = null;
-        String pack = "";
-        for (int i = 0; i < files.length; i++) {
-            File srcFile = new File(this.sourceDirectory, files[i]);
+        long now = Instant.now().toEpochMilli();
+        for (String file : files) {
+            File srcFile = new File(this.sourceDirectory, file);
             //TODO
             // All this to convert source to destination directory according
             // to weblogic standards Can be written better... this is too hacky!
-            jspFile = new File(files[i]);
-            parents = jspFile.getParent();
+            File jspFile = new File(file);
+            String parents = jspFile.getParent();
 
-            if ((parents != null)  && (!("").equals(parents))) {
+            String pack;
+            if (parents == null || "".equals(parents)) {
+                pack = pathToPackage;
+            } else {
                 parents =  this.replaceString(parents, File.separator, "_/");
                 pack = pathToPackage + File.separator + "_" + parents;
-            } else {
-                pack = pathToPackage;
             }
 
             String filePath = pack + File.separator + "_";
-            int startingIndex = files[i].lastIndexOf(File.separator) != -1
-                    ? files[i].lastIndexOf(File.separator) + 1 : 0;
-            int endingIndex = files[i].indexOf(".jsp");
+            int startingIndex = file.lastIndexOf(File.separator) != -1
+                    ? file.lastIndexOf(File.separator) + 1 : 0;
+            int endingIndex = file.indexOf(".jsp");
             if (endingIndex == -1) {
-                log("Skipping " + files[i] + ". Not a JSP",
+                log("Skipping " + file + ". Not a JSP",
                     Project.MSG_VERBOSE);
                 continue;
             }
 
-            filePath += files[i].substring(startingIndex, endingIndex);
+            filePath += file.substring(startingIndex, endingIndex);
             filePath += ".class";
             File classFile = new File(this.destinationDirectory, filePath);
 
             if (srcFile.lastModified() > now) {
                 log("Warning: file modified in the future: "
-                    + files[i], Project.MSG_WARN);
+                    + file, Project.MSG_WARN);
             }
             if (srcFile.lastModified() > classFile.lastModified()) {
-                filesToDo.addElement(files[i]);
-                log("Recompiling File " + files[i], Project.MSG_VERBOSE);
+                filesToDo.add(file);
+                log("Recompiling File " + file, Project.MSG_VERBOSE);
             }
         }
     }
 
-
     /**
      * Replace occurrences of a string with a replacement string.
      * @param inpString the string to convert.
@@ -321,9 +308,8 @@ public class WLJspc extends MatchingTask {
     protected String replaceString(String inpString, String escapeChars,
                                    String replaceChars) {
         String localString = "";
-        int numTokens = 0;
         StringTokenizer st = new StringTokenizer(inpString, escapeChars, true);
-        numTokens = st.countTokens();
+        int numTokens = st.countTokens();
         for (int i = 0; i < numTokens; i++) {
             String test = st.nextToken();
             test = (test.equals(escapeChars) ? replaceChars : test);

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/DefaultJspCompilerAdapter.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/DefaultJspCompilerAdapter.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/DefaultJspCompilerAdapter.java
index 5c4d0e3..303ef6f 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/DefaultJspCompilerAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/DefaultJspCompilerAdapter.java
@@ -19,8 +19,8 @@
 package org.apache.tools.ant.taskdefs.optional.jsp.compilers;
 
 import java.io.File;
-import java.util.Enumeration;
 import java.util.Vector;
+import java.util.stream.Collectors;
 
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.taskdefs.optional.jsp.JspC;
@@ -35,7 +35,7 @@ import org.apache.tools.ant.types.CommandlineJava;
 public abstract class DefaultJspCompilerAdapter
     implements JspCompilerAdapter {
 
-    private static String lSep = System.getProperty("line.separator");
+    private static String lSep = System.lineSeparator();
 
     /**
      * Logs the compilation parameters, adds the files to compile and logs the
@@ -45,27 +45,18 @@ public abstract class DefaultJspCompilerAdapter
      * @param cmd the command line used
      */
     protected void logAndAddFilesToCompile(JspC jspc,
-                                           Vector compileList,
+                                           Vector<String> compileList,
                                            CommandlineJava cmd) {
         jspc.log("Compilation " + cmd.describeJavaCommand(),
                  Project.MSG_VERBOSE);
 
-        StringBuffer niceSourceList = new StringBuffer("File");
-        if (compileList.size() != 1) {
-            niceSourceList.append("s");
-        }
-        niceSourceList.append(" to be compiled:");
-
-        niceSourceList.append(lSep);
-
-        Enumeration e = compileList.elements();
-        while (e.hasMoreElements()) {
-            String arg = (String) e.nextElement();
-            cmd.createArgument().setValue(arg);
-            niceSourceList.append("    ");
-            niceSourceList.append(arg);
-            niceSourceList.append(lSep);
-        }
+        StringBuilder niceSourceList =
+            new StringBuilder(compileList.size() == 1 ? "File" : "Files")
+                .append(" to be compiled:").append(lSep)
+                .append(compileList.stream()
+                    .peek(arg -> cmd.createArgument().setValue(arg))
+                    .map(arg -> "    " + arg)
+                    .collect(Collectors.joining(lSep)));
 
         jspc.log(niceSourceList.toString(), Project.MSG_VERBOSE);
     }
@@ -83,6 +74,7 @@ public abstract class DefaultJspCompilerAdapter
      * set the owner
      * @param owner the owner JspC compiler
      */
+    @Override
     public void setJspc(JspC owner) {
         this.owner = owner;
     }
@@ -94,7 +86,6 @@ public abstract class DefaultJspCompilerAdapter
         return owner;
     }
 
-
     /**
      *  add an argument oneple to the argument list, if the value aint null
      * @param cmd the command line
@@ -138,6 +129,7 @@ public abstract class DefaultJspCompilerAdapter
      * @return true if the compiler wants to do its own
      * depends
      */
+    @Override
     public boolean implementsOwnDependencyChecking() {
         return false;
     }
@@ -150,4 +142,3 @@ public abstract class DefaultJspCompilerAdapter
         return getJspc().getProject();
     }
 }
-

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java
index 80ed601..46644dd 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JasperC.java
@@ -59,6 +59,7 @@ public class JasperC extends DefaultJspCompilerAdapter {
      * @return true if successful
      * @throws BuildException on error
      */
+    @Override
     public boolean execute()
         throws BuildException {
         getJspc().log("Using jasper compiler", Project.MSG_VERBOSE);
@@ -80,9 +81,8 @@ public class JasperC extends DefaultJspCompilerAdapter {
             java.setDir(getProject().getBaseDir());
             java.setClassname("org.apache.jasper.JspC");
             //this is really irritating; we need a way to set stuff
-            String []args = cmd.getJavaCommand().getArguments();
-            for (int i = 0; i < args.length; i++) {
-                java.createArg().setValue(args[i]);
+            for (String arg : cmd.getJavaCommand().getArguments()) {
+                java.createArg().setValue(arg);
             }
             java.setFailonerror(getJspc().getFailonerror());
             //we are forking here to be sure that if JspC calls
@@ -94,17 +94,14 @@ public class JasperC extends DefaultJspCompilerAdapter {
         } catch (Exception ex) {
             if (ex instanceof BuildException) {
                 throw (BuildException) ex;
-            } else {
-                throw new BuildException("Error running jsp compiler: ",
-                                         ex, getJspc().getLocation());
             }
+            throw new BuildException("Error running jsp compiler: ",
+                                         ex, getJspc().getLocation());
         } finally {
             getJspc().deleteEmptyJavaFiles();
         }
     }
 
-
-
     /**
      * build up a command line
      * @return a command line for jasper
@@ -144,7 +141,7 @@ public class JasperC extends DefaultJspCompilerAdapter {
     /**
      * @return an instance of the mangler this compiler uses
      */
-
+    @Override
     public JspMangler createMangler() {
         return mangler;
     }
@@ -157,9 +154,8 @@ public class JasperC extends DefaultJspCompilerAdapter {
         if (p == null) {
             p = new Path(getProject());
             return p.concatSystemClasspath("only");
-        } else {
-            return p.concatSystemClasspath("ignore");
         }
+        return p.concatSystemClasspath("ignore");
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java
index 2876ba0..a172340 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/jsp/compilers/JspCompilerAdapterFactory.java
@@ -80,11 +80,11 @@ public final class JspCompilerAdapterFactory {
                                                  AntClassLoader loader)
         throws BuildException {
 
-        if (compilerType.equalsIgnoreCase("jasper")) {
+        if ("jasper".equalsIgnoreCase(compilerType)) {
             //tomcat4.0 gets the old mangler
             return new JasperC(new JspNameMangler());
         }
-        if (compilerType.equalsIgnoreCase("jasper41")) {
+        if ("jasper41".equalsIgnoreCase(compilerType)) {
             //tomcat4.1 gets the new one
             return new JasperC(new Jasper41Mangler());
         }
@@ -104,9 +104,8 @@ public final class JspCompilerAdapterFactory {
                                                        AntClassLoader classloader)
         throws BuildException {
         try {
-            Class c = classloader.findClass(className);
-            Object o = c.newInstance();
-            return (JspCompilerAdapter) o;
+            Class<? extends JspCompilerAdapter> c = classloader.findClass(className).asSubclass(JspCompilerAdapter.class);
+            return c.newInstance();
         } catch (ClassNotFoundException cnfe) {
             throw new BuildException(className + " can\'t be found.", cnfe);
         } catch (ClassCastException cce) {

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java
index 026412f..b229d56 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/AggregateTransformer.java
@@ -23,10 +23,6 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.net.URL;
 import java.nio.file.Files;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Vector;
-
 import javax.xml.parsers.DocumentBuilder;
 import javax.xml.parsers.DocumentBuilderFactory;
 import javax.xml.transform.TransformerFactory;
@@ -75,12 +71,27 @@ public class AggregateTransformer {
          * list authorized values.
          * @return authorized values.
          */
+        @Override
         public String[] getValues() {
             return new String[]{FRAMES, NOFRAMES};
         }
     }
 
+    private static final String JDK_INTERNAL_FACTORY =
+            "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl";
+
     // CheckStyle:VisibilityModifier OFF - bc
+    /** XML Parser factory */
+    private static DocumentBuilderFactory privateDBFactory;
+
+    /** XML Parser factory accessible to subclasses */
+    protected static DocumentBuilderFactory dbfactory;
+
+    static {
+       privateDBFactory = DocumentBuilderFactory.newInstance();
+       dbfactory = privateDBFactory;
+    }
+
     /** Task */
     protected Task task;
 
@@ -120,16 +131,6 @@ public class AggregateTransformer {
     /** the format to use for the report. Must be <tt>FRAMES</tt> or <tt>NOFRAMES</tt> */
     protected String format = FRAMES;
 
-    /** XML Parser factory */
-    private static DocumentBuilderFactory privateDBFactory;
-
-    /** XML Parser factory accessible to subclasses */
-    protected static DocumentBuilderFactory dbfactory;
-
-    static {
-       privateDBFactory = DocumentBuilderFactory.newInstance();
-       dbfactory = privateDBFactory;
-    }
     // CheckStyle:VisibilityModifier ON
 
     /**
@@ -257,8 +258,8 @@ public class AggregateTransformer {
 
         // acrobatic cast.
         xsltTask.setIn(((XMLResultAggregator) task).getDestinationFile());
-        File outputFile = null;
-        if (format.equals(FRAMES)) {
+        File outputFile;
+        if (FRAMES.equals(format)) {
             String tempFileProperty = getClass().getName() + String.valueOf(counter++); //NOSONAR
             File tmp = FILE_UTILS.resolveFile(project.getBaseDir(), project
                     .getProperty("java.io.tmpdir"));
@@ -352,8 +353,6 @@ public class AggregateTransformer {
         return JAXPUtils.getSystemId(file);
     }
 
-    private static final String JDK_INTERNAL_FACTORY = "com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl";
-
     /**
      * If we end up using the JDK's own TraX factory on Java 9+, then
      * set the features and attributes necessary to allow redirect
@@ -372,8 +371,9 @@ public class AggregateTransformer {
         }
         if (JDK_INTERNAL_FACTORY.equals(factoryName)
             && JavaEnvUtils.isAtLeastJavaVersion(JavaEnvUtils.JAVA_9)) {
-            factory.addFeature(new XSLTProcess.Factory.Feature("http://www.oracle.com/xml/jaxp/properties/enableExtensionFunctions",
-                                                               true));
+            factory.addFeature(new XSLTProcess.Factory.Feature(
+                "http://www.oracle.com/xml/jaxp/properties/enableExtensionFunctions",
+                true));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/BaseTest.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/BaseTest.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/BaseTest.java
index 55e7a5d..0462969 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/BaseTest.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/BaseTest.java
@@ -33,7 +33,7 @@ public abstract class BaseTest {
     protected boolean fork = false;
     protected String ifProperty = null;
     protected String unlessProperty = null;
-    protected Vector formatters = new Vector();
+    protected Vector<FormatterElement> formatters = new Vector<>();
     /** destination directory */
     protected File destDir = null;
 

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/BatchTest.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/BatchTest.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/BatchTest.java
index f41b96f..fb5d44b 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/BatchTest.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/BatchTest.java
@@ -22,6 +22,7 @@ package org.apache.tools.ant.taskdefs.optional.junit;
 import java.io.File;
 import java.util.Enumeration;
 import java.util.Vector;
+import java.util.stream.Stream;
 
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.types.FileSet;
@@ -79,7 +80,6 @@ public final class BatchTest extends BaseTest {
         }
     }
 
-
     /**
      * Add a new ResourceCollection instance to this
      * batchtest. Whatever the collection is, only names that are
@@ -98,7 +98,7 @@ public final class BatchTest extends BaseTest {
      * @return  an enumeration of all elements of this batchtest that are
      * a <tt>JUnitTest</tt> instance.
      */
-    public Enumeration elements() {
+    public Enumeration<JUnitTest> elements() {
         JUnitTest[] tests = createAllJUnitTest();
         return Enumerations.fromArray(tests);
     }
@@ -109,7 +109,7 @@ public final class BatchTest extends BaseTest {
      * @param v the vector to which should be added all individual tests of this
      * batch test.
      */
-    void addTestsTo(Vector v) {
+    void addTestsTo(Vector<? super JUnitTest> v) {
         JUnitTest[] tests = createAllJUnitTest();
         v.ensureCapacity(v.size() + tests.length);
         for (int i = 0; i < tests.length; i++) {
@@ -123,13 +123,8 @@ public final class BatchTest extends BaseTest {
      * @return the array of all <tt>JUnitTest</tt>s that belongs to this batch.
      */
     private JUnitTest[] createAllJUnitTest() {
-        String[] filenames = getFilenames();
-        JUnitTest[] tests = new JUnitTest[filenames.length];
-        for (int i = 0; i < tests.length; i++) {
-            String classname = javaToClass(filenames[i]);
-            tests[i] = createJUnitTest(classname);
-        }
-        return tests;
+        return Stream.of(getFilenames()).map(BatchTest::javaToClass)
+            .map(this::createJUnitTest).toArray(JUnitTest[]::new);
     }
 
     /**
@@ -143,21 +138,11 @@ public final class BatchTest extends BaseTest {
      * For the class <tt>org/apache/Whatever.class</tt> it will return <tt>org/apache/Whatever</tt>.
      */
     private String[] getFilenames() {
-        Vector v = new Vector();
-        for (Resource r : resources) {
-            if (r.isExists()) {
-                String pathname = r.getName();
-                if (pathname.endsWith(".java")) {
-                    v.addElement(pathname.substring(0, pathname.length() - ".java".length()));
-                } else if (pathname.endsWith(".class")) {
-                    v.addElement(pathname.substring(0, pathname.length() - ".class".length()));
-                }
-            }
-        }
-
-        String[] files = new String[v.size()];
-        v.copyInto(files);
-        return files;
+        return resources.stream().filter(Resource::isExists)
+            .map(Resource::getName)
+            .filter(name -> name.endsWith(".java") || name.endsWith(".class"))
+            .map(name -> name.substring(0, name.lastIndexOf('.')))
+            .toArray(String[]::new);
     }
 
     /**
@@ -192,10 +177,7 @@ public final class BatchTest extends BaseTest {
         test.setFailureProperty(failureProperty);
         test.setErrorProperty(errorProperty);
         test.setSkipNonTests(isSkipNonTests());
-        Enumeration list = this.formatters.elements();
-        while (list.hasMoreElements()) {
-            test.addFormatter((FormatterElement) list.nextElement());
-        }
+        this.formatters.forEach(test::addFormatter);
         return test;
     }
 

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java
index 46d6c61..975de68 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/BriefJUnitResultFormatter.java
@@ -89,6 +89,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * Sets the stream the formatter is supposed to write its results to.
      * @param out the output stream to write to
      */
+    @Override
     public void setOutput(OutputStream out) {
         this.out = out;
         output = new BufferedWriter(new java.io.OutputStreamWriter(out));
@@ -98,6 +99,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * @see JUnitResultFormatter#setSystemOutput(String)
      */
     /** {@inheritDoc}. */
+    @Override
     public void setSystemOutput(String out) {
         systemOutput = out;
     }
@@ -106,6 +108,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * @see JUnitResultFormatter#setSystemError(String)
      */
     /** {@inheritDoc}. */
+    @Override
     public void setSystemError(String err) {
         systemError = err;
     }
@@ -115,15 +118,15 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * The whole testsuite started.
      * @param suite the test suite
      */
+    @Override
     public void startTestSuite(JUnitTest suite) {
         if (output == null) {
             return; // Quick return - no output do nothing.
         }
-        StringBuffer sb = new StringBuffer("Testsuite: ");
-        sb.append(suite.getName());
-        sb.append(StringUtils.LINE_SEP);
         try {
-            output.write(sb.toString());
+            output
+                .write(new StringBuilder("Testsuite: ").append(suite.getName())
+                    .append(StringUtils.LINE_SEP).toString());
             output.flush();
         } catch (IOException ex) {
             throw new BuildException(ex);
@@ -134,8 +137,9 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * The whole testsuite ended.
      * @param suite the test suite
      */
+    @Override
     public void endTestSuite(JUnitTest suite) {
-        StringBuffer sb = new StringBuffer("Tests run: ");
+        StringBuilder sb = new StringBuilder("Tests run: ");
         sb.append(suite.runCount());
         sb.append(", Failures: ");
         sb.append(suite.failureCount());
@@ -190,6 +194,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * A test started.
      * @param test a test
      */
+    @Override
     public void startTest(Test test) {
     }
 
@@ -197,6 +202,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * A test ended.
      * @param test a test
      */
+    @Override
     public void endTest(Test test) {
     }
 
@@ -218,6 +224,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * @param test a test
      * @param t    the assertion failed by the test
      */
+    @Override
     public void addFailure(Test test, AssertionFailedError t) {
         addFailure(test, (Throwable) t);
     }
@@ -227,6 +234,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
      * @param test  a test
      * @param error the error thrown by the test
      */
+    @Override
     public void addError(Test test, Throwable error) {
         formatError("\tCaused an ERROR", test, error);
     }
@@ -239,9 +247,8 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
     protected String formatTest(Test test) {
         if (test == null) {
             return "Null Test: ";
-        } else {
-            return "Testcase: " + test.toString() + ":";
         }
+        return "Testcase: " + test.toString() + ":";
     }
 
     /**
@@ -271,6 +278,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
     }
 
 
+    @Override
     public void testIgnored(Test test) {
         formatSkip(test, JUnitVersionHelper.getIgnoreMessage(test));
     }
@@ -294,6 +302,7 @@ public class BriefJUnitResultFormatter implements JUnitResultFormatter, IgnoredT
 
     }
 
+    @Override
     public void testAssumptionFailure(Test test, Throwable cause) {
         formatSkip(test, cause.getMessage());
     }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache.java
index 8ad40dd..5b04c37 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/CustomJUnit4TestAdapterCache.java
@@ -34,7 +34,7 @@ import org.junit.runner.notification.RunNotifier;
  *
  */
 public class CustomJUnit4TestAdapterCache extends JUnit4TestAdapterCache {
-
+    private static final long serialVersionUID = 1L;
     private static final CustomJUnit4TestAdapterCache INSTANCE = new CustomJUnit4TestAdapterCache();
 
     public static CustomJUnit4TestAdapterCache getInstance() {
@@ -45,6 +45,7 @@ public class CustomJUnit4TestAdapterCache extends JUnit4TestAdapterCache {
         super();
     }
 
+    @Override
     public RunNotifier getNotifier(final TestResult result, final JUnit4TestAdapter adapter) {
         return getNotifier(result);
     }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/DOMUtil.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/DOMUtil.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/DOMUtil.java
index 325f44c..39d0ab3 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/DOMUtil.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/DOMUtil.java
@@ -86,13 +86,14 @@ public final class DOMUtil {
     }
 
     /** custom implementation of a nodelist */
-    public static class NodeListImpl extends Vector implements NodeList {
+    public static class NodeListImpl extends Vector<Node> implements NodeList {
         private static final long serialVersionUID = 3175749150080946423L;
 
         /**
          * Get the number of nodes in the list.
          * @return the length of the list.
          */
+        @Override
         public int getLength() {
             return size();
         }
@@ -101,9 +102,10 @@ public final class DOMUtil {
          * @param i the index of the node to get.
          * @return the node if the index is in bounds, null otherwise.
          */
+        @Override
         public Node item(int i) {
             try {
-                return (Node) elementAt(i);
+                return elementAt(i);
             } catch (ArrayIndexOutOfBoundsException e) {
                 return null; // conforming to NodeList interface
             }
@@ -164,9 +166,9 @@ public final class DOMUtil {
      * @return  the cloned node that is appended to <tt>parent</tt>
      */
     public static Node importNode(Node parent, Node child) {
-        Node copy = null;
         final Document doc = parent.getOwnerDocument();
 
+        Node copy;
         switch (child.getNodeType()) {
         case Node.CDATA_SECTION_NODE:
             copy = doc.createCDATASection(((CDATASection) child).getData());

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/Enumerations.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/Enumerations.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/Enumerations.java
index 327547e..1ca4a0c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/Enumerations.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/Enumerations.java
@@ -17,6 +17,8 @@
  */
 package org.apache.tools.ant.taskdefs.optional.junit;
 
+import java.util.Arrays;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.NoSuchElementException;
 
@@ -28,78 +30,33 @@ import java.util.NoSuchElementException;
  */
 public final class Enumerations {
 
-        private Enumerations() {
-        }
+    private Enumerations() {
+    }
 
-        /**
-         * creates an enumeration from an array of objects.
-         * @param       array   the array of object to enumerate.
-         * @return the enumeration over the array of objects.
-         */
-        public static Enumeration fromArray(Object[] array) {
-                return new ArrayEnumeration(array);
-        }
+    /**
+     * creates an enumeration from an array of objects.
+     * @param       array   the array of object to enumerate.
+     * @return the enumeration over the array of objects.
+     */
+    @SafeVarargs
+    public static <T> Enumeration<T> fromArray(T... array) {
+        return Collections.enumeration(Arrays.asList(array));
+    }
 
-        /**
-        * creates an enumeration from an array of enumeration. The created enumeration
-        * will sequentially enumerate over all elements of each enumeration and skip
-        * <tt>null</tt> enumeration elements in the array.
-        * @param        enums   the array of enumerations.
-        * @return the enumeration over the array of enumerations.
-         */
-        public static Enumeration fromCompound(Enumeration[] enums) {
-                return new CompoundEnumeration(enums);
-        }
+    /**
+    * creates an enumeration from an array of enumeration. The created enumeration
+    * will sequentially enumerate over all elements of each enumeration and skip
+    * <tt>null</tt> enumeration elements in the array.
+    * @param        enums   the array of enumerations.
+    * @return the enumeration over the array of enumerations.
+     */
+    @SafeVarargs
+    public static <T> Enumeration<T> fromCompound(Enumeration<? extends T>... enums) {
+        return new CompoundEnumeration<>(enums);
+    }
 
 }
 
-
-/**
- * Convenient enumeration over an array of objects.
- */
-class ArrayEnumeration implements Enumeration {
-
-        /** object array */
-        private Object[] array;
-
-        /** current index */
-        private int pos;
-
-        /**
-         * Initialize a new enumeration that wraps an array.
-         * @param       array   the array of object to enumerate.
-         */
-        public ArrayEnumeration(Object[] array) {
-                this.array = array;
-                this.pos = 0;
-        }
-        /**
-         * Tests if this enumeration contains more elements.
-         *
-         * @return  <code>true</code> if and only if this enumeration object
-         *           contains at least one more element to provide;
-         *          <code>false</code> otherwise.
-         */
-        public boolean hasMoreElements() {
-                return (pos < array.length);
-        }
-
-        /**
-         * Returns the next element of this enumeration if this enumeration
-         * object has at least one more element to provide.
-         *
-         * @return     the next element of this enumeration.
-         * @throws  NoSuchElementException  if no more elements exist.
-         */
-        public Object nextElement() throws NoSuchElementException {
-                if (hasMoreElements()) {
-                        Object o = array[pos];
-                        pos++;
-                        return o;
-                }
-                throw new NoSuchElementException();
-        }
-}
 /**
  * Convenient enumeration over an array of enumeration. For example:
  * <pre>
@@ -130,48 +87,49 @@ class ArrayEnumeration implements Enumeration {
  * }
  * </pre>
  */
- class CompoundEnumeration implements Enumeration {
+ class CompoundEnumeration<T> implements Enumeration<T> {
 
-        /** enumeration array */
-        private Enumeration[] enumArray;
+    /** enumeration array */
+    private Enumeration<? extends T>[] enumArray;
 
-        /** index in the enums array */
-        private int index = 0;
+    /** index in the enums array */
+    private int index = 0;
 
-    public CompoundEnumeration(Enumeration[] enumarray) {
-                this.enumArray = enumarray;
+    @SafeVarargs
+    public CompoundEnumeration(Enumeration<? extends T>... enumarray) {
+        this.enumArray = enumarray;
     }
 
-        /**
-         * Tests if this enumeration contains more elements.
-         *
-         * @return  <code>true</code> if and only if this enumeration object
-         *           contains at least one more element to provide;
-         *          <code>false</code> otherwise.
-         */
+    /**
+     * Tests if this enumeration contains more elements.
+     *
+     * @return  <code>true</code> if and only if this enumeration object
+     *           contains at least one more element to provide;
+     *          <code>false</code> otherwise.
+     */
+    @Override
     public boolean hasMoreElements() {
-                while (index < enumArray.length) {
-                        if (enumArray[index] != null && enumArray[index].hasMoreElements()) {
-                                return true;
-                        }
-                        index++;
-                }
-                return false;
+        while (index < enumArray.length) {
+            if (enumArray[index] != null && enumArray[index].hasMoreElements()) {
+                    return true;
+            }
+            index++;
+        }
+        return false;
     }
 
-        /**
-         * Returns the next element of this enumeration if this enumeration
-         * object has at least one more element to provide.
-         *
-         * @return     the next element of this enumeration.
-         * @throws  NoSuchElementException  if no more elements exist.
-         */
-    public Object nextElement() throws NoSuchElementException {
-                if (hasMoreElements()) {
-                        return enumArray[index].nextElement();
-                }
-                throw new NoSuchElementException();
+    /**
+     * Returns the next element of this enumeration if this enumeration
+     * object has at least one more element to provide.
+     *
+     * @return     the next element of this enumeration.
+     * @throws  NoSuchElementException  if no more elements exist.
+     */
+    @Override
+    public T nextElement() throws NoSuchElementException {
+        if (hasMoreElements()) {
+            return enumArray[index].nextElement();
+        }
+        throw new NoSuchElementException();
     }
 }
-
-