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:14 UTC

[14/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/junit/FailureRecorder.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java
index bfcbfed..26ef424 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/FailureRecorder.java
@@ -23,12 +23,11 @@ import java.io.FileWriter;
 import java.io.IOException;
 import java.io.OutputStream;
 import java.text.SimpleDateFormat;
+import java.util.Comparator;
 import java.util.Date;
 import java.util.Iterator;
 import java.util.SortedSet;
 import java.util.TreeSet;
-import java.util.Vector;
-
 import junit.framework.AssertionFailedError;
 import junit.framework.Test;
 
@@ -89,7 +88,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
     private static final String LOG_PREFIX = "    [junit]";
 
     /** Class names of failed tests without duplicates. */
-    private static SortedSet/*<TestInfos>*/ failedTests = new TreeSet();
+    private static SortedSet<TestInfos> failedTests = new TreeSet<>();
 
     /** A writer for writing the generated source to. */
     private BufferedWriter writer;
@@ -146,20 +145,13 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * @param project
      *            project reference
      */
+    @Override
     public void setProject(Project project) {
         // store project reference for logging
         super.setProject(project);
         // check if already registered
-        boolean alreadyRegistered = false;
-        Vector allListeners = project.getBuildListeners();
-        final int size = allListeners.size();
-        for (int i = 0; i < size; i++) {
-            Object listener = allListeners.get(i);
-            if (listener instanceof FailureRecorder) {
-                alreadyRegistered = true;
-                break;
-            }
-        }
+        boolean alreadyRegistered = project.getBuildListeners().stream()
+            .anyMatch(FailureRecorder.class::isInstance);
         // register if needed
         if (!alreadyRegistered) {
             verbose("Register FailureRecorder (@" + this.hashCode() + ") as BuildListener");
@@ -173,6 +165,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void endTestSuite(JUnitTest suite) throws BuildException {
     }
 
@@ -182,6 +175,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * @param throwable the reason it errored.
      * @see junit.framework.TestListener#addError(junit.framework.Test, java.lang.Throwable)
      */
+    @Override
     public void addError(Test test, Throwable throwable) {
         failedTests.add(new TestInfos(test));
     }
@@ -194,6 +188,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * @see junit.framework.TestListener#addFailure(junit.framework.Test, junit.framework.AssertionFailedError)
      */
     // CheckStyle:LineLengthCheck ON
+    @Override
     public void addFailure(Test test, AssertionFailedError error) {
         failedTests.add(new TestInfos(test));
     }
@@ -202,6 +197,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void setOutput(OutputStream out) {
         // unused, close output file so it can be deleted before the VM exits
         if (out != System.out) {
@@ -213,6 +209,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void setSystemError(String err) {
     }
 
@@ -220,6 +217,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void setSystemOutput(String out) {
     }
 
@@ -227,6 +225,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void startTestSuite(JUnitTest suite) throws BuildException {
     }
 
@@ -234,6 +233,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void endTest(Test test) {
     }
 
@@ -241,6 +241,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void startTest(Test test) {
     }
 
@@ -248,7 +249,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
 
     private void writeJavaClass() {
         try {
-            File sourceFile = new File((getLocationName() + ".java"));
+            File sourceFile = new File(getLocationName() + ".java");
             verbose("Write collector class to '" + sourceFile.getAbsolutePath() + "'");
 
             if (sourceFile.exists() && !sourceFile.delete()) {
@@ -299,8 +300,8 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
         writer.newLine();
         writer.write("        TestSuite suite = new TestSuite();");
         writer.newLine();
-        for (Iterator iter = failedTests.iterator(); iter.hasNext();) {
-            TestInfos testInfos = (TestInfos) iter.next();
+        for (Iterator<TestInfos> iter = failedTests.iterator(); iter.hasNext();) {
+            TestInfos testInfos = iter.next();
             writer.write("        suite.addTest(");
             writer.write(String.valueOf(testInfos));
             writer.write(");");
@@ -323,6 +324,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Logging facade in INFO-mode.
      * @param message Log-message
      */
+    @Override
     public void log(String message) {
         getProject().log(LOG_PREFIX + " " + message, Project.MSG_INFO);
     }
@@ -338,7 +340,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
     /**
      * TestInfos holds information about a given test for later use.
      */
-    public static class TestInfos implements Comparable {
+    public static class TestInfos implements Comparable<TestInfos> {
 
         /** The class name of the test. */
         private final String className;
@@ -363,6 +365,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
          * @see java.lang.Object#toString()
          * @see FailureRecorder#createSuiteMethod()
          */
+        @Override
         public String toString() {
             return "new " + className + "(\"" + methodName + "\")";
         }
@@ -374,17 +377,18 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
          * @see java.lang.Comparable#compareTo
          * @see SortedSet#comparator()
          */
-        public int compareTo(Object other) {
-            if (other instanceof TestInfos) {
-                TestInfos otherInfos = (TestInfos) other;
-                return toString().compareTo(otherInfos.toString());
-            } else {
-                return -1;
-            }
+        @Override
+        public int compareTo(TestInfos other) {
+            return Comparator.comparing(Object::toString).compare(this, other);
         }
+
+        @Override
         public boolean equals(Object obj) {
-            return obj instanceof TestInfos && toString().equals(obj.toString());
+            return obj == this || obj instanceof TestInfos
+                && toString().equals(obj.toString());
         }
+
+        @Override
         public int hashCode() {
             return toString().hashCode();
         }
@@ -396,6 +400,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void buildFinished(BuildEvent event) {
     }
 
@@ -403,6 +408,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void buildStarted(BuildEvent event) {
     }
 
@@ -410,6 +416,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void messageLogged(BuildEvent event) {
     }
 
@@ -417,6 +424,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void targetFinished(BuildEvent event) {
     }
 
@@ -424,6 +432,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void targetStarted(BuildEvent event) {
     }
 
@@ -433,6 +442,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * @param event  not used
      * @see org.apache.tools.ant.BuildListener#taskFinished(org.apache.tools.ant.BuildEvent)
      */
+    @Override
     public void taskFinished(BuildEvent event) {
         if (!failedTests.isEmpty()) {
             writeJavaClass();
@@ -443,6 +453,7 @@ public class FailureRecorder extends ProjectComponent implements JUnitResultForm
      * Not used
      * {@inheritDoc}
      */
+    @Override
     public void taskStarted(BuildEvent event) {
     }
 

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java
index 6587b1d..81841a0 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/FormatterElement.java
@@ -31,6 +31,7 @@ import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.PropertyHelper;
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.taskdefs.optional.junit.JUnitTaskMirror.JUnitResultFormatterMirror;
 import org.apache.tools.ant.types.EnumeratedAttribute;
 import org.apache.tools.ant.util.KeepAliveOutputStream;
 
@@ -58,6 +59,18 @@ import org.apache.tools.ant.util.KeepAliveOutputStream;
  * @see JUnitResultFormatter
  */
 public class FormatterElement {
+    /** xml formatter class */
+    public static final String XML_FORMATTER_CLASS_NAME =
+        "org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter";
+    /** brief formatter class */
+    public static final String BRIEF_FORMATTER_CLASS_NAME =
+        "org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter";
+    /** plain formatter class */
+    public static final String PLAIN_FORMATTER_CLASS_NAME =
+        "org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter";
+    /** failure recorder class */
+    public static final String FAILURE_RECORDER_CLASS_NAME =
+        "org.apache.tools.ant.taskdefs.optional.junit.FailureRecorder";
 
     private String classname;
     private String extension;
@@ -73,19 +86,6 @@ public class FormatterElement {
      */
     private Project project;
 
-    /** xml formatter class */
-    public static final String XML_FORMATTER_CLASS_NAME =
-        "org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter";
-    /** brief formatter class */
-    public static final String BRIEF_FORMATTER_CLASS_NAME =
-        "org.apache.tools.ant.taskdefs.optional.junit.BriefJUnitResultFormatter";
-    /** plain formatter class */
-    public static final String PLAIN_FORMATTER_CLASS_NAME =
-        "org.apache.tools.ant.taskdefs.optional.junit.PlainJUnitResultFormatter";
-    /** failure recorder class */
-    public static final String FAILURE_RECORDER_CLASS_NAME =
-        "org.apache.tools.ant.taskdefs.optional.junit.FailureRecorder";
-
     /**
      * <p> Quick way to use a standard formatter.
      *
@@ -102,18 +102,19 @@ public class FormatterElement {
      * @param type the enumerated value to use.
      */
     public void setType(TypeAttribute type) {
-        if ("xml".equals(type.getValue())) {
+        switch (type.getValue()) {
+        case "xml":
             setClassname(XML_FORMATTER_CLASS_NAME);
-        } else {
-            if ("brief".equals(type.getValue())) {
-                setClassname(BRIEF_FORMATTER_CLASS_NAME);
-            } else {
-                if ("failure".equals(type.getValue())) {
-                    setClassname(FAILURE_RECORDER_CLASS_NAME);
-                } else { // must be plain, ensured by TypeAttribute
-                    setClassname(PLAIN_FORMATTER_CLASS_NAME);
-                }
-            }
+            break;
+        case "brief":
+            setClassname(BRIEF_FORMATTER_CLASS_NAME);
+            break;
+        case "failure":
+            setClassname(FAILURE_RECORDER_CLASS_NAME);
+            break;
+        default:
+            setClassname(PLAIN_FORMATTER_CLASS_NAME);
+            break;
         }
     }
 
@@ -125,12 +126,18 @@ public class FormatterElement {
      */
     public void setClassname(String classname) {
         this.classname = classname;
-        if (XML_FORMATTER_CLASS_NAME.equals(classname)) {
-           setExtension(".xml");
-        } else if (PLAIN_FORMATTER_CLASS_NAME.equals(classname)) {
-           setExtension(".txt");
-        } else if (BRIEF_FORMATTER_CLASS_NAME.equals(classname)) {
-           setExtension(".txt");
+        if (classname != null) {
+            switch (classname) {
+            case XML_FORMATTER_CLASS_NAME:
+                setExtension(".xml");
+                break;
+            case PLAIN_FORMATTER_CLASS_NAME:
+                setExtension(".txt");
+                break;
+            case BRIEF_FORMATTER_CLASS_NAME:
+                setExtension(".txt");
+                break;
+            }
         }
     }
 
@@ -266,7 +273,6 @@ public class FormatterElement {
         this.project = project;
     }
 
-
     /**
      * @since Ant 1.6
      */
@@ -279,7 +285,7 @@ public class FormatterElement {
         //although this code appears to duplicate that of ClasspathUtils.newInstance,
         //we cannot use that because this formatter may run in a forked process,
         //without that class.
-        Class f = null;
+        Class<?> f;
         try {
             if (loader == null) {
                 f = Class.forName(classname);
@@ -296,26 +302,21 @@ public class FormatterElement {
                 + ": " + e, e);
         }
 
-        Object o = null;
+        JUnitResultFormatterMirror r;
         try {
-            o = f.newInstance();
-        } catch (InstantiationException e) {
-            throw new BuildException(e);
-        } catch (IllegalAccessException e) {
+            r = f.asSubclass(JUnitResultFormatterMirror.class).newInstance();
+        } catch (ClassCastException e) {
+            throw new BuildException("%s is not a JUnitResultFormatter",
+                classname);
+        } catch (InstantiationException | IllegalAccessException e) {
             throw new BuildException(e);
         }
 
-        if (!(o instanceof JUnitTaskMirror.JUnitResultFormatterMirror)) {
-            throw new BuildException(classname + " is not a JUnitResultFormatter");
-        }
-        JUnitTaskMirror.JUnitResultFormatterMirror r =
-            (JUnitTaskMirror.JUnitResultFormatterMirror) o;
         if (useFile && outFile != null) {
             out = new DelayedFileOutputStream(outFile);
         }
         r.setOutput(out);
 
-
         boolean needToSetProjectReference = true;
         try {
             Field field = r.getClass().getField("project");
@@ -333,8 +334,8 @@ public class FormatterElement {
         if (needToSetProjectReference) {
             Method setter;
             try {
-                setter = r.getClass().getMethod("setProject", new Class[] {Project.class});
-                setter.invoke(r, new Object[] {project});
+                setter = r.getClass().getMethod("setProject", Project.class);
+                setter.invoke(r, project);
             } catch (NoSuchMethodException e) {
                 // no setProject to invoke; just ignore
             } catch (IllegalAccessException e) {
@@ -354,8 +355,9 @@ public class FormatterElement {
      */
     public static class TypeAttribute extends EnumeratedAttribute {
         /** {@inheritDoc}. */
+        @Override
         public String[] getValues() {
-            return new String[] {"plain", "xml", "brief", "failure"};
+            return new String[] { "plain", "xml", "brief", "failure" };
         }
     }
 

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/IgnoredTestResult.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/IgnoredTestResult.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/IgnoredTestResult.java
index c3bb18d..ef51fff 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/IgnoredTestResult.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/IgnoredTestResult.java
@@ -33,15 +33,15 @@ import junit.framework.TestResult;
 public class IgnoredTestResult extends TestResult {
 
 
-    private List<IgnoredTestListener> listeners = new ArrayList<IgnoredTestListener>();
-    private List<TestIgnored> ignored = new ArrayList<TestIgnored>();
-    private List<TestIgnored> skipped = new ArrayList<TestIgnored>();
+    private List<IgnoredTestListener> listeners = new ArrayList<>();
+    private List<TestIgnored> ignored = new ArrayList<>();
+    private List<TestIgnored> skipped = new ArrayList<>();
 
     public IgnoredTestResult() {
         super();
     }
 
-
+    @Override
     public synchronized void addListener(TestListener listener) {
         if (listener instanceof IgnoredTestListener) {
             listeners.add((IgnoredTestListener)listener);
@@ -49,6 +49,7 @@ public class IgnoredTestResult extends TestResult {
         super.addListener(listener);
     }
 
+    @Override
     public synchronized  void removeListener(TestListener listener) {
         if (listener instanceof IgnoredTestListener) {
             listeners.remove(listener);

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter.java
index f03a409..c797a87 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnit4TestMethodAdapter.java
@@ -18,8 +18,8 @@
 
 package org.apache.tools.ant.taskdefs.optional.junit;
 
-import java.util.Iterator;
 import java.util.List;
+import java.util.function.Predicate;
 
 import junit.framework.Test;
 import junit.framework.TestResult;
@@ -41,7 +41,7 @@ import org.junit.runner.manipulation.Filter;
  */
 public class JUnit4TestMethodAdapter implements Test {
 
-    private final Class testClass;
+    private final Class<?> testClass;
     private final String[] methodNames;
     private final Runner runner;
     private final CustomJUnit4TestAdapterCache cache;
@@ -55,7 +55,7 @@ public class JUnit4TestMethodAdapter implements Test {
      *             if any of the arguments is {@code null}
      *             or if any of the given method names is {@code null} or empty
      */
-    public JUnit4TestMethodAdapter(final Class testClass,
+    public JUnit4TestMethodAdapter(final Class<?> testClass,
                                    final String[] methodNames) {
         if (testClass == null) {
             throw new IllegalArgumentException("testClass is <null>");
@@ -87,6 +87,7 @@ public class JUnit4TestMethodAdapter implements Test {
         runner = request.getRunner();
     }
 
+    @Override
     public int countTestCases() {
         return runner.testCount();
     }
@@ -95,14 +96,15 @@ public class JUnit4TestMethodAdapter implements Test {
         return runner.getDescription();
     }
 
-    public List/*<Test>*/ getTests() {
+    public List<Test> getTests() {
         return cache.asTestList(getDescription());
     }
 
-    public Class getTestClass() {
+    public Class<?> getTestClass() {
         return testClass;
     }
 
+    @Override
     public void run(final TestResult result) {
         runner.run(cache.getNotifier(result));
     }
@@ -126,10 +128,10 @@ public class JUnit4TestMethodAdapter implements Test {
     private static final class MultipleMethodsFilter extends Filter {
 
         private final Description methodsListDescription;
-        private final Class testClass;
+        private final Class<?> testClass;
         private final String[] methodNames;
 
-        private MultipleMethodsFilter(Class testClass, String[] methodNames) {
+        private MultipleMethodsFilter(Class<?> testClass, String[] methodNames) {
             if (testClass == null) {
                 throw new IllegalArgumentException("testClass is <null>");
             }
@@ -151,23 +153,10 @@ public class JUnit4TestMethodAdapter implements Test {
                 return false;
             }
             if (description.isTest()) {
-                Iterator/*<Description>*/ it = methodsListDescription.getChildren().iterator();
-                while (it.hasNext()) {
-                    Description methodDescription = (Description) it.next();
-                    if (methodDescription.equals(description)) {
-                        return true;
-                    }
-                }
-            } else {
-                Iterator/*<Description>*/ it = description.getChildren().iterator();
-                while (it.hasNext()) {
-                    Description each = (Description) it.next();
-                    if (shouldRun(each)) {
-                        return true;
-                    }
-                }
+                return methodsListDescription.getChildren().stream()
+                    .anyMatch(Predicate.isEqual(description));
             }
-            return false;
+            return description.getChildren().stream().anyMatch(this::shouldRun);
         }
 
         @Override
@@ -189,5 +178,4 @@ public class JUnit4TestMethodAdapter implements Test {
 
     }
 
-
 }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java
index dcb2a98..e32403c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTask.java
@@ -33,6 +33,7 @@ import java.security.AccessController;
 import java.security.PrivilegedAction;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.Hashtable;
@@ -135,10 +136,26 @@ public class JUnitTask extends Task {
     private static final String LINE_SEP
         = System.getProperty("line.separator");
     private static final String CLASSPATH = "CLASSPATH";
+
+    private static final int STRING_BUFFER_SIZE = 128;
+    /**
+     * @since Ant 1.7
+     */
+    public static final String TESTLISTENER_PREFIX =
+        "junit.framework.TestListener: ";
+
+    /**
+     * Name of magic property that enables test listener events.
+     */
+    public static final String ENABLE_TESTLISTENER_EVENTS =
+        "ant.junit.enabletestlistenerevents";
+
+    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
+
     private CommandlineJava commandline;
-    private final Vector<JUnitTest> tests = new Vector<JUnitTest>();
-    private final Vector<BatchTest> batchTests = new Vector<BatchTest>();
-    private final Vector<FormatterElement> formatters = new Vector<FormatterElement>();
+    private final List<JUnitTest> tests = new Vector<>();
+    private final List<BatchTest> batchTests = new Vector<>();
+    private final Vector<FormatterElement> formatters = new Vector<>();
     private File dir = null;
 
     private Integer timeout = null;
@@ -186,21 +203,6 @@ public class JUnitTask extends Task {
     private String  failureProperty;
     private String  errorProperty;
 
-    private static final int STRING_BUFFER_SIZE = 128;
-    /**
-     * @since Ant 1.7
-     */
-    public static final String TESTLISTENER_PREFIX =
-        "junit.framework.TestListener: ";
-
-    /**
-     * Name of magic property that enables test listener events.
-     */
-    public static final String ENABLE_TESTLISTENER_EVENTS =
-        "ant.junit.enabletestlistenerevents";
-
-    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
-
     /**
      * If true, force ant to re-classload all classes for each JUnit TestCase
      *
@@ -368,8 +370,8 @@ public class JUnitTask extends Task {
          */
         @Override
         public String[] getValues() {
-            return new String[] {"true", "yes", "false", "no",
-                                 "on", "off", "withOutAndErr"};
+            return new String[] { "true", "yes", "false", "no", "on", "off",
+                "withOutAndErr" };
         }
 
         /**
@@ -584,7 +586,7 @@ public class JUnitTask extends Task {
      * @since Ant 1.2
      */
     public void addTest(final JUnitTest test) {
-        tests.addElement(test);
+        tests.add(test);
         preConfigure(test);
     }
 
@@ -598,7 +600,7 @@ public class JUnitTask extends Task {
      */
     public BatchTest createBatchTest() {
         final BatchTest test = new BatchTest(getProject());
-        batchTests.addElement(test);
+        batchTests.add(test);
         preConfigure(test);
         return test;
     }
@@ -610,7 +612,7 @@ public class JUnitTask extends Task {
      * @since Ant 1.2
      */
     public void addFormatter(final FormatterElement fe) {
-        formatters.addElement(fe);
+        formatters.add(fe);
     }
 
     /**
@@ -714,11 +716,9 @@ public class JUnitTask extends Task {
      * @since Ant 1.6
      */
     public void setTempdir(final File tmpDir) {
-        if (tmpDir != null) {
-            if (!tmpDir.exists() || !tmpDir.isDirectory()) {
-                throw new BuildException(tmpDir.toString()
-                                         + " is not a valid temp directory");
-            }
+        if (tmpDir != null && (!tmpDir.exists() || !tmpDir.isDirectory())) {
+            throw new BuildException("%s is not a valid temp directory",
+                tmpDir);
         }
         this.tmpDir = tmpDir;
     }
@@ -776,12 +776,12 @@ public class JUnitTask extends Task {
                     e, task.getLocation());
         }
         try {
-            final Class c = loader.loadClass(JUnitTaskMirror.class.getName() + "Impl");
+            final Class<? extends JUnitTaskMirror> c = loader.loadClass(JUnitTaskMirror.class.getName() + "Impl").asSubclass(JUnitTaskMirror.class);
             if (c.getClassLoader() != loader) {
                 throw new BuildException("Overdelegating loader", task.getLocation());
             }
-            final Constructor cons = c.getConstructor(new Class[] {JUnitTask.class});
-            return (JUnitTaskMirror) cons.newInstance(new Object[] {task});
+            final Constructor<? extends JUnitTaskMirror> cons = c.getConstructor(JUnitTask.class);
+            return cons.newInstance(task);
         } catch (final Exception e) {
             throw new BuildException(e, task.getLocation());
         }
@@ -807,28 +807,19 @@ public class JUnitTask extends Task {
             if (extra != null && !hasJunit(path)) {
                 path.add(expandModulePath(extra));
             }
-            mirrorLoader = (ClassLoader) AccessController.doPrivileged(new PrivilegedAction() {
-                public Object run() {
-                    return new SplitClassLoader(myLoader, path, getProject(),
-                                     new String[] {
-                                         "BriefJUnitResultFormatter",
-                                         "JUnit4TestMethodAdapter",
-                                         "JUnitResultFormatter",
-                                         "JUnitTaskMirrorImpl",
-                                         "JUnitTestRunner",
-                                         "JUnitVersionHelper",
-                                         "OutErrSummaryJUnitResultFormatter",
-                                         "PlainJUnitResultFormatter",
-                                         "SummaryJUnitResultFormatter",
-                                         "TearDownOnVmCrash",
-                                         "XMLJUnitResultFormatter",
-                                         "IgnoredTestListener",
-                                         "IgnoredTestResult",
-                                         "CustomJUnit4TestAdapterCache",
-                                         "TestListenerWrapper"
-                                     });
-                }
-            });
+            mirrorLoader = AccessController.doPrivileged(
+                (PrivilegedAction<ClassLoader>) () -> new SplitClassLoader(
+                    myLoader, path, getProject(),
+                    new String[] { "BriefJUnitResultFormatter",
+                        "JUnit4TestMethodAdapter", "JUnitResultFormatter",
+                        "JUnitTaskMirrorImpl", "JUnitTestRunner",
+                        "JUnitVersionHelper",
+                        "OutErrSummaryJUnitResultFormatter",
+                        "PlainJUnitResultFormatter",
+                        "SummaryJUnitResultFormatter", "TearDownOnVmCrash",
+                        "XMLJUnitResultFormatter", "IgnoredTestListener",
+                        "IgnoredTestResult", "CustomJUnit4TestAdapterCache",
+                        "TestListenerWrapper" }));
         } else {
             mirrorLoader = myLoader;
         }
@@ -847,25 +838,22 @@ public class JUnitTask extends Task {
         checkModules();
         setupJUnitDelegate();
 
-        final List<List> testLists = new ArrayList<List>();
+        final List<List<JUnitTest>> testLists = new ArrayList<>();
         /* parallel test execution is only supported for multi-process execution */
         final int threads = ((!fork) || (forkMode.getValue().equals(ForkMode.ONCE))
                        ? 1
                        : this.threads);
 
-        final boolean forkPerTest = forkMode.getValue().equals(ForkMode.PER_TEST);
-        if (forkPerTest || forkMode.getValue().equals(ForkMode.ONCE)) {
+        final boolean forkPerTest = ForkMode.PER_TEST.equals(forkMode.getValue());
+        if (forkPerTest || ForkMode.ONCE.equals(forkMode.getValue())) {
             testLists.addAll(executeOrQueue(getIndividualTests(),
                                             forkPerTest));
         } else { /* forkMode.getValue().equals(ForkMode.PER_BATCH) */
-            final int count = batchTests.size();
-            for (int i = 0; i < count; i++) {
-                final BatchTest batchtest = batchTests.elementAt(i);
-                testLists.addAll(executeOrQueue(batchtest.elements(), false));
-            }
-            testLists.addAll(executeOrQueue(tests.elements(), forkPerTest));
+            batchTests.stream().map(b -> executeOrQueue(b.elements(), false))
+                .forEach(testLists::addAll);
+            testLists.addAll(
+                executeOrQueue(Collections.enumeration(tests), forkPerTest));
         }
-
         try {
             /* prior to parallel the code in 'oneJunitThread' used to be here. */
             runTestsInThreads(testLists, threads);
@@ -890,12 +878,13 @@ public class JUnitTask extends Task {
      */
     private class JunitTestThread implements Runnable {
 
-        JunitTestThread(final JUnitTask master, final Iterator<List> iterator, final int id) {
+        JunitTestThread(final JUnitTask master, final Iterator<List<JUnitTest>> iterator, final int id) {
             this.masterTask = master;
             this.iterator = iterator;
             this.id = id;
         }
 
+        @Override
         public void run() {
             try {
                 masterTask.oneJunitThread(iterator, id);
@@ -906,7 +895,7 @@ public class JUnitTask extends Task {
         }
 
         private final JUnitTask masterTask;
-        private final Iterator<List> iterator;
+        private final Iterator<List<JUnitTest>> iterator;
         private final int id;
     }
 
@@ -917,8 +906,8 @@ public class JUnitTask extends Task {
      * threads get the same test, or two threads simultaneously pop the list so that a test
      * gets skipped!
      */
-    private List getNextTest(final Iterator<List> iter) {
-        synchronized(iter) {
+    private List<JUnitTest> getNextTest(final Iterator<List<JUnitTest>> iter) {
+        synchronized (iter) {
             if (iter.hasNext()) {
                 return iter.next();
             }
@@ -937,14 +926,14 @@ public class JUnitTask extends Task {
      * fatal reason, no new tests/batches will be started but the running threads will be
      * permitted to complete.  Additional tests may start in already-running batch-test threads.
      */
-    private void oneJunitThread(final Iterator<List> iter, final int threadId) {
+    private void oneJunitThread(final Iterator<List<JUnitTest>> iter, final int threadId) {
 
-        List l;
+        List<JUnitTest> l;
         log("Starting test thread " + threadId, Project.MSG_VERBOSE);
         while ((caughtBuildException == null) && ((l = getNextTest(iter)) != null)) {
             log("Running test " + l.get(0).toString() + "(" + l.size() + ") in thread " + threadId, Project.MSG_VERBOSE);
             if (l.size() == 1) {
-                execute((JUnitTest) l.get(0), threadId);
+                execute(l.get(0), threadId);
             } else {
                 execute(l, threadId);
             }
@@ -953,9 +942,9 @@ public class JUnitTask extends Task {
     }
 
 
-    private void runTestsInThreads(final List<List> testList, final int numThreads) {
+    private void runTestsInThreads(final List<List<JUnitTest>> testList, final int numThreads) {
 
-        Iterator<List> iter = testList.iterator();
+        Iterator<List<JUnitTest>> iter = testList.iterator();
 
         if (numThreads == 1) {
             /* with just one thread just run the test - don't create any threads */
@@ -968,24 +957,25 @@ public class JUnitTask extends Task {
             /* Need to split apart tests, which are still grouped in batches */
             /* is there a simpler Java mechanism to do this? */
             /* I assume we don't want to do this with "per batch" forking. */
-            List<List> newlist = new ArrayList<List>();
+            List<List<JUnitTest>> newlist = new ArrayList<>();
             if (forkMode.getValue().equals(ForkMode.PER_TEST)) {
-                final Iterator<List> i1 = testList.iterator();
+                final Iterator<List<JUnitTest>> i1 = testList.iterator();
                 while (i1.hasNext()) {
-                    final List l = i1.next();
+                    final List<JUnitTest> l = i1.next();
                     if (l.size() == 1) {
-                         newlist.add(l);
+                        newlist.add(l);
                     } else {
-                         final Iterator i2 = l.iterator();
-                         while (i2.hasNext()) {
-                             final List tmpSingleton = new ArrayList();
-                             tmpSingleton.add(i2.next());
-                             newlist.add(tmpSingleton);
-                         }
+                        final Iterator<JUnitTest> i2 = l.iterator();
+                        while (i2.hasNext()) {
+                            final List<JUnitTest> tmpSingleton =
+                                new ArrayList<>();
+                            tmpSingleton.add(i2.next());
+                            newlist.add(tmpSingleton);
+                        }
                     }
                 }
             } else {
-                 newlist = testList;
+                newlist = testList;
             }
             iter = newlist.iterator();
 
@@ -1028,7 +1018,7 @@ public class JUnitTask extends Task {
     protected void execute(final JUnitTest arg, final int thread) throws BuildException {
         validateTestName(arg.getName());
 
-        final JUnitTest test = (JUnitTest) arg.clone();
+        final JUnitTest test = arg.clone();
         test.setThread(thread);
 
         // set the default values if not specified
@@ -1042,13 +1032,13 @@ public class JUnitTask extends Task {
         }
 
         // execute the test and get the return code
-        TestResultHolder result = null;
-        if (!test.getFork()) {
-            result = executeInVM(test);
-        } else {
+        TestResultHolder result;
+        if (test.getFork()) {
             final ExecuteWatchdog watchdog = createWatchdog();
             result = executeAsForked(test, watchdog, null);
             // null watchdog means no timeout, you'd better not check with null
+        } else {
+            result = executeInVM(test);
         }
         actOnTestResult(result, test, "Test " + test.getName());
     }
@@ -1070,8 +1060,8 @@ public class JUnitTask extends Task {
      * @throws BuildException if <code>testName</code> is not a valid test name
      */
     private void validateTestName(final String testName) throws BuildException {
-        if (testName == null || testName.length() == 0
-            || testName.equals("null")) {
+        if (testName == null || testName.isEmpty()
+            || "null".equals(testName)) {
             throw new BuildException("test name must be specified");
         }
     }
@@ -1082,23 +1072,21 @@ public class JUnitTask extends Task {
      * @param thread Identifies which thread is test running in (0 for single-threaded runs)
      * @throws BuildException on error.
      */
-    protected void execute(final List testList, final int thread) throws BuildException {
-        JUnitTest test = null;
+    protected void execute(final List<JUnitTest> testList, final int thread) throws BuildException {
         // Create a temporary file to pass the test cases to run to
         // the runner (one test case per line)
         final File casesFile = createTempPropertiesFile("junittestcases");
-        BufferedWriter writer = null;
-        try {
-            writer = new BufferedWriter(new FileWriter(casesFile));
+        try (BufferedWriter writer =
+            new BufferedWriter(new FileWriter(casesFile))) {
 
             log("Creating casesfile '" + casesFile.getAbsolutePath()
                 + "' with content: ", Project.MSG_VERBOSE);
             final PrintStream logWriter =
                 new PrintStream(new LogOutputStream(this, Project.MSG_VERBOSE));
 
-            final Iterator iter = testList.iterator();
-            while (iter.hasNext()) {
-                test = (JUnitTest) iter.next();
+            JUnitTest test = null;
+            for (JUnitTest t : testList) {
+                test = t;
                 test.setThread(thread);
                 printDual(writer, logWriter, test.getName());
                 if (test.getMethods() != null) {
@@ -1119,8 +1107,6 @@ public class JUnitTask extends Task {
                 }
             }
             writer.flush();
-            writer.close();
-            writer = null;
 
             // execute the test and get the return code
             final ExecuteWatchdog watchdog = createWatchdog();
@@ -1131,8 +1117,6 @@ public class JUnitTask extends Task {
             log(e.toString(), Project.MSG_ERR);
             throw new BuildException(e);
         } finally {
-            FileUtils.close(writer);
-
             try {
                 FILE_UTILS.tryHardToDelete(casesFile);
             } catch (final Exception e) {
@@ -1146,7 +1130,7 @@ public class JUnitTask extends Task {
      * @param testList the list of tests to execute.
      * @throws BuildException on error.
      */
-    protected void execute(final List testList) throws BuildException {
+    protected void execute(final List<JUnitTest> testList) throws BuildException {
         execute(testList, 0);
     }
 
@@ -1177,7 +1161,7 @@ public class JUnitTask extends Task {
 
         CommandlineJava cmd;
         try {
-            cmd = (CommandlineJava) (getCommandline().clone());
+            cmd = getCommandline().clone();
         } catch (final CloneNotSupportedException e) {
             throw new BuildException("This shouldn't happen", e, getLocation());
         }
@@ -1213,7 +1197,7 @@ public class JUnitTask extends Task {
         cmd.createArgument().setValue(Constants.LOGTESTLISTENEREVENTS
                                       + String.valueOf(getEnableTestListenerEvents()));
 
-        StringBuffer formatterArg = new StringBuffer(STRING_BUFFER_SIZE);
+        StringBuilder formatterArg = new StringBuilder(STRING_BUFFER_SIZE);
         final FormatterElement[] feArray = mergeFormatters(test);
         for (int i = 0; i < feArray.length; i++) {
             final FormatterElement fe = feArray[i];
@@ -1226,7 +1210,7 @@ public class JUnitTask extends Task {
                     formatterArg.append(outFile);
                 }
                 cmd.createArgument().setValue(formatterArg.toString());
-                formatterArg = new StringBuffer();
+                formatterArg = new StringBuilder();
             }
         }
 
@@ -1236,17 +1220,14 @@ public class JUnitTask extends Task {
         final File propsFile = createTempPropertiesFile("junit");
         cmd.createArgument().setValue(Constants.PROPSFILE
                                       + propsFile.getAbsolutePath());
-        final Hashtable p = getProject().getProperties();
+        final Hashtable<String, Object> p = getProject().getProperties();
         final Properties props = new Properties();
-        for (final Enumeration e = p.keys(); e.hasMoreElements();) {
-            final Object key = e.nextElement();
-            props.put(key, p.get(key));
-        }
+        p.forEach(props::put);
         try {
             final OutputStream outstream = Files.newOutputStream(propsFile.toPath());
             props.store(outstream, "Ant JUnitTask generated properties file");
             outstream.close();
-        } catch (final java.io.IOException e) {
+        } catch (final IOException e) {
             FILE_UTILS.tryHardToDelete(propsFile);
             throw new BuildException("Error creating temporary properties "
                                      + "file.", e, getLocation());
@@ -1328,9 +1309,9 @@ public class JUnitTask extends Task {
                     + propsFile.getAbsolutePath() + "'.";
                 if (success) {
                     throw new BuildException(msg); //NOSONAR
-                } else { // don't hide inner exception
-                    log(msg, Project.MSG_ERR);
                 }
+                // don't hide inner exception
+                log(msg, Project.MSG_ERR);
             }
         }
 
@@ -1343,8 +1324,8 @@ public class JUnitTask extends Task {
      */
     private void checkIncludeAntRuntime(final CommandlineJava cmd) {
         if (includeAntRuntime) {
-            final Map/*<String, String>*/ env = Execute.getEnvironmentVariables();
-            final String cp = (String) env.get(CLASSPATH);
+            final Map<String, String> env = Execute.getEnvironmentVariables();
+            final String cp = env.get(CLASSPATH);
             if (cp != null) {
                 cmd.createClasspath(getProject()).createPath()
                     .append(new Path(getProject(), cp));
@@ -1356,7 +1337,6 @@ public class JUnitTask extends Task {
         }
     }
 
-
     /**
      * check for the parameter being "withoutanderr" in a locale-independent way.
      * @param summaryOption the summary option -can be null
@@ -1400,9 +1380,9 @@ public class JUnitTask extends Task {
                 LoaderUtils.classNameToResource(Project.class.getName());
             URL previous = null;
             try {
-                for (final Enumeration e = loader.getResources(projectResourceName);
+                for (final Enumeration<URL> e = loader.getResources(projectResourceName);
                      e.hasMoreElements();) {
-                    final URL current = (URL) e.nextElement();
+                    final URL current = e.nextElement();
                     if (previous != null && !urlEquals(current, previous)) {
                         log("WARNING: multiple versions of ant detected "
                             + "in path for junit "
@@ -1501,9 +1481,8 @@ public class JUnitTask extends Task {
         throws IOException {
         if (runner != null) {
             return runner.handleInput(buffer, offset, length);
-        } else {
-            return super.handleInput(buffer, offset, length);
         }
+        return super.handleInput(buffer, offset, length);
     }
 
 
@@ -1580,7 +1559,7 @@ public class JUnitTask extends Task {
             setupJUnitDelegate();
         }
 
-        final JUnitTest test = (JUnitTest) arg.clone();
+        final JUnitTest test = arg.clone();
         test.setProperties(getProject().getProperties());
         if (dir != null) {
             log("dir attribute ignored if running in the same VM",
@@ -1691,12 +1670,14 @@ public class JUnitTask extends Task {
      */
     protected Enumeration<JUnitTest> getIndividualTests() {
         final int count = batchTests.size();
-        final Enumeration[] enums = new Enumeration[ count + 1];
+        @SuppressWarnings("unchecked")
+        final Enumeration<JUnitTest>[] enums = new Enumeration[ count + 1];
+        
         for (int i = 0; i < count; i++) {
-            final BatchTest batchtest = batchTests.elementAt(i);
+            final BatchTest batchtest = batchTests.get(i);
             enums[i] = batchtest.elements();
         }
-        enums[enums.length - 1] = tests.elements();
+        enums[enums.length - 1] = Collections.enumeration(tests);
         return Enumerations.fromCompound(enums);
     }
 
@@ -1713,10 +1694,7 @@ public class JUnitTask extends Task {
         if (tests.isEmpty()) {
             return;
         }
-
-        final Enumeration<JUnitTest> testsEnum = tests.elements();
-        while (testsEnum.hasMoreElements()) {
-            final JUnitTest test = testsEnum.nextElement();
+        for (JUnitTest test : tests) {
             if (test.hasMethodsSpecified() && test.shouldRun(getProject())) {
                 test.resolveMethods();
             }
@@ -1730,15 +1708,10 @@ public class JUnitTask extends Task {
     private void checkModules() {
         if (hasPath(getCommandline().getModulepath()) ||
             hasPath(getCommandline().getUpgrademodulepath())) {
-            for (int i = 0, count = batchTests.size(); i < count; i++) {
-                if(!batchTests.elementAt(i).getFork()) {
-                    throw new BuildException("The module path requires fork attribute to be set to true.");
-                }
-            }
-            for (int i = 0, count = tests.size(); i < count; i++) {
-                if (!tests.elementAt(i).getFork()) {
-                    throw new BuildException("The module path requires fork attribute to be set to true.");
-                }
+            if (!(batchTests.stream().allMatch(BaseTest::getFork)
+                && tests.stream().allMatch(BaseTest::getFork))) {
+                throw new BuildException(
+                    "The module path requires fork attribute to be set to true.");
             }
         }
     }
@@ -1775,7 +1748,8 @@ public class JUnitTask extends Task {
         for (String path : modulePath.list()) {
             final File modulePathEntry = getProject().resolveFile(path);
             if (modulePathEntry.isDirectory() && !hasModuleInfo(modulePathEntry)) {
-                final File[] modules = modulePathEntry.listFiles((dir,name)->name.toLowerCase(Locale.ENGLISH).endsWith(".jar"));
+                final File[] modules = modulePathEntry.listFiles((dir,
+                    name) -> name.toLowerCase(Locale.ENGLISH).endsWith(".jar"));
                 if (modules != null) {
                     for (File module : modules) {
                         expanded.add(new Path(getProject(), String.format(
@@ -1797,9 +1771,9 @@ public class JUnitTask extends Task {
      * @return enumeration
      * @since Ant 1.3
      */
-    protected Enumeration<JUnitTest> allTests() {
-        final Enumeration[] enums = {tests.elements(), batchTests.elements()};
-        return Enumerations.fromCompound(enums);
+    protected Enumeration<BaseTest> allTests() {
+        return Enumerations.fromCompound(Collections.enumeration(tests),
+            Collections.enumeration(batchTests));
     }
 
     /**
@@ -1808,6 +1782,7 @@ public class JUnitTask extends Task {
      * @since Ant 1.3
      */
     private FormatterElement[] mergeFormatters(final JUnitTest test) {
+        @SuppressWarnings("unchecked")
         final Vector<FormatterElement> feVector = (Vector<FormatterElement>) formatters.clone();
         test.addFormattersTo(feVector);
         final FormatterElement[] feArray = new FormatterElement[feVector.size()];
@@ -2181,7 +2156,7 @@ public class JUnitTask extends Task {
         /** {@inheritDoc}. */
         @Override
         public String[] getValues() {
-            return new String[] {ONCE, PER_TEST, PER_BATCH};
+            return new String[] { ONCE, PER_TEST, PER_BATCH };
         }
     }
 
@@ -2195,9 +2170,10 @@ public class JUnitTask extends Task {
      * @return a list of tasks to be executed.
      * @since 1.6.2
      */
-    protected Collection<List> executeOrQueue(final Enumeration<JUnitTest> testList,
-                                        final boolean runIndividual) {
-        final Map<ForkedTestConfiguration, List> testConfigurations = new HashMap<ForkedTestConfiguration, List>();
+    protected Collection<List<JUnitTest>> executeOrQueue(
+        final Enumeration<JUnitTest> testList, final boolean runIndividual) {
+        final Map<ForkedTestConfiguration, List<JUnitTest>> testConfigurations =
+            new HashMap<>();
         while (testList.hasMoreElements()) {
             final JUnitTest test = testList.nextElement();
             if (test.shouldRun(getProject())) {
@@ -2206,14 +2182,10 @@ public class JUnitTask extends Task {
                 if ((runIndividual || !test.getFork()) && (threads == 1)) {
                     execute(test, 0);
                 } else {
-                    final ForkedTestConfiguration c =
-                        new ForkedTestConfiguration(test);
-                    List<JUnitTest> l = testConfigurations.get(c);
-                    if (l == null) {
-                        l = new ArrayList<JUnitTest>();
-                        testConfigurations.put(c, l);
-                    }
-                    l.add(test);
+                    testConfigurations
+                        .computeIfAbsent(new ForkedTestConfiguration(test),
+                            k -> new ArrayList<>())
+                        .add(test);
                 }
             }
         }
@@ -2361,7 +2333,7 @@ public class JUnitTask extends Task {
      * @see "https://issues.apache.org/bugzilla/show_bug.cgi?id=45227"
      */
     private static JUnitTest createDummyTestForBatchTest(final JUnitTest test) {
-        final JUnitTest t = (JUnitTest) test.clone();
+        final JUnitTest t = test.clone();
         final int index = test.getName().lastIndexOf('.');
         // make sure test looks as if it was in the same "package" as
         // the last test of the batch

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskMirrorImpl.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskMirrorImpl.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskMirrorImpl.java
index c7dae25..894b6a0 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskMirrorImpl.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTaskMirrorImpl.java
@@ -35,6 +35,7 @@ import org.apache.tools.ant.AntClassLoader;
  */
 public final class JUnitTaskMirrorImpl implements JUnitTaskMirror {
 
+    @SuppressWarnings("unused")
     private final JUnitTask task;
 
     /**
@@ -46,6 +47,7 @@ public final class JUnitTaskMirrorImpl implements JUnitTaskMirror {
     }
 
     /** {@inheritDoc}. */
+    @Override
     public void addVmExit(JUnitTest test, JUnitTaskMirror.JUnitResultFormatterMirror aFormatter,
             OutputStream out, String message, String testCase) {
         JUnitResultFormatter formatter = (JUnitResultFormatter) aFormatter;
@@ -61,6 +63,7 @@ public final class JUnitTaskMirrorImpl implements JUnitTaskMirror {
     }
 
     /** {@inheritDoc}. */
+    @Override
     public JUnitTaskMirror.JUnitTestRunnerMirror newJUnitTestRunner(JUnitTest test,
             String[] methods,
             boolean haltOnError, boolean filterTrace, boolean haltOnFailure,
@@ -70,6 +73,7 @@ public final class JUnitTaskMirrorImpl implements JUnitTaskMirror {
     }
 
     /** {@inheritDoc}. */
+    @Override
     public JUnitTaskMirror.SummaryJUnitResultFormatterMirror newSummaryJUnitResultFormatter() {
         return new SummaryJUnitResultFormatter();
     }
@@ -86,14 +90,17 @@ public final class JUnitTaskMirrorImpl implements JUnitTaskMirror {
             testCase = aTestCase;
         }
 
+        @Override
         public int countTestCases() {
             return 1;
         }
 
+        @Override
         public void run(TestResult r) {
             throw new AssertionFailedError(message);
         }
 
+        @Override
         public String getName() {
             return testCase;
         }
@@ -102,6 +109,7 @@ public final class JUnitTaskMirrorImpl implements JUnitTaskMirror {
             return test.getName();
         }
 
+        @Override
         public String toString() {
             return test.getName() + ":" + testCase;
         }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTest.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTest.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTest.java
index 835c013..2ec5653 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTest.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTest.java
@@ -18,7 +18,6 @@
 
 package org.apache.tools.ant.taskdefs.optional.junit;
 
-import java.util.Enumeration;
 import java.util.Hashtable;
 import java.util.Properties;
 import java.util.Vector;
@@ -228,7 +227,7 @@ public class JUnitTest extends BaseTest implements Cloneable {
             } else if (methods.length == 1) {
                 methodsList = methods[0];
             } else {
-                StringBuffer buf = new StringBuffer(methods.length * 16);
+                StringBuilder buf = new StringBuilder(methods.length * 16);
                 buf.append(methods[0]);
                 for (int i = 1; i < methods.length; i++) {
                     buf.append(',').append(methods[i]);
@@ -482,12 +481,9 @@ public class JUnitTest extends BaseTest implements Cloneable {
      * @param p the properties.
      *          This is a copy of the projects ant properties.
      */
-    public void setProperties(Hashtable p) {
+    public void setProperties(Hashtable<?,?> p) {
         props = new Properties();
-        for (Enumeration e = p.keys(); e.hasMoreElements();) {
-            Object key = e.nextElement();
-            props.put(key, p.get(key));
-        }
+        p.forEach(props::put);
     }
 
     /**
@@ -516,7 +512,7 @@ public class JUnitTest extends BaseTest implements Cloneable {
     /**
      * Convenient method to add formatters to a vector
      */
-    void addFormattersTo(Vector v) {
+    void addFormattersTo(Vector<? super FormatterElement> v) {
         final int count = formatters.size();
         for (int i = 0; i < count; i++) {
             v.addElement(formatters.elementAt(i));
@@ -527,12 +523,13 @@ public class JUnitTest extends BaseTest implements Cloneable {
      * @since Ant 1.5
      * @return a clone of this test.
      */
+    @SuppressWarnings("unchecked")
     @Override
-    public Object clone() {
+    public JUnitTest clone() {
         try {
             JUnitTest t = (JUnitTest) super.clone();
             t.props = props == null ? null : (Properties) props.clone();
-            t.formatters = (Vector) formatters.clone();
+            t.formatters = (Vector<FormatterElement>) formatters.clone();
             return t;
         } catch (CloneNotSupportedException e) {
             // plain impossible

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
index ea7524d..4009666 100644
--- a/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
+++ b/src/main/org/apache/tools/ant/taskdefs/optional/junit/JUnitTestRunner.java
@@ -29,12 +29,12 @@ import java.io.OutputStream;
 import java.io.PrintStream;
 import java.io.StringReader;
 import java.io.StringWriter;
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Enumeration;
-import java.util.Hashtable;
 import java.util.Properties;
 import java.util.StringTokenizer;
 import java.util.Vector;
@@ -73,21 +73,49 @@ import org.apache.tools.ant.util.TeeOutputStream;
  */
 
 public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestRunnerMirror {
+    private static final String JUNIT_4_TEST_ADAPTER
+    = "junit.framework.JUnit4TestAdapter";
+
+    private static final String[] DEFAULT_TRACE_FILTERS = new String[] {
+            "junit.framework.TestCase",
+            "junit.framework.TestResult",
+            "junit.framework.TestSuite",
+            "junit.framework.Assert.", // don't filter AssertionFailure
+            "junit.swingui.TestRunner",
+            "junit.awtui.TestRunner",
+            "junit.textui.TestRunner",
+            "java.lang.reflect.Method.invoke(",
+            "sun.reflect.",
+            "org.apache.tools.ant.",
+            // JUnit 4 support:
+            "org.junit.",
+            "junit.framework.JUnit4TestAdapter",
+            " more",
+    };
 
     /**
-     * Holds the registered formatters.
+     * Do we filter junit.*.* stack frames out of failure and error exceptions.
      */
-    private final Vector<JUnitTaskMirror.JUnitResultFormatterMirror> formatters = new Vector();
+    private static boolean filtertrace = true;
+
+    /** Running more than one test suite? */
+    private static boolean multipleTests = false;
 
     /**
-     * Collects TestResults.
+     * The file used to indicate that the build crashed.
+     * File will be empty in case the build did not crash.
      */
-    private IgnoredTestResult res;
+    private static String crashFile = null;
 
     /**
-     * Do we filter junit.*.* stack frames out of failure and error exceptions.
+     * Holds the registered formatters.
      */
-    private static boolean filtertrace = true;
+    private final Vector<JUnitTaskMirror.JUnitResultFormatterMirror> formatters = new Vector<>();
+
+    /**
+     * Collects TestResults.
+     */
+    private IgnoredTestResult res;
 
     /**
      * Do we send output to System.out/.err in addition to the formatters?
@@ -101,27 +129,6 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      */
     private Permissions perm = null;
 
-    private static final String JUNIT_4_TEST_ADAPTER
-        = "junit.framework.JUnit4TestAdapter";
-
-    private static final String[] DEFAULT_TRACE_FILTERS = new String[] {
-                "junit.framework.TestCase",
-                "junit.framework.TestResult",
-                "junit.framework.TestSuite",
-                "junit.framework.Assert.", // don't filter AssertionFailure
-                "junit.swingui.TestRunner",
-                "junit.awtui.TestRunner",
-                "junit.textui.TestRunner",
-                "java.lang.reflect.Method.invoke(",
-                "sun.reflect.",
-                "org.apache.tools.ant.",
-                // JUnit 4 support:
-                "org.junit.",
-                "junit.framework.JUnit4TestAdapter",
-                " more",
-        };
-
-
     /**
      * Do we stop on errors.
      */
@@ -151,9 +158,6 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
     /** is this runner running in forked mode? */
     private boolean forked = false;
 
-    /** Running more than one test suite? */
-    private static boolean multipleTests = false;
-
     /** ClassLoader passed in in non-forked mode. */
     private final ClassLoader loader;
 
@@ -163,12 +167,6 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
     /** Turned on if we are using JUnit 4 for this test suite. see #38811 */
     private boolean junit4;
 
-    /**
-     * The file used to indicate that the build crashed.
-     * File will be empty in case the build did not crash.
-     */
-    private static String crashFile = null;
-
     /** Names of test methods to execute */
     private String[] methods = null;
 
@@ -357,6 +355,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
     /**
      * Run the test.
      */
+    @Override
     public void run() {
         res = new IgnoredTestResult();
         res.addListener(wrapListener(this));
@@ -377,7 +376,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
         try {
 
             try {
-                Class testClass = null;
+                Class<?> testClass;
                 if (loader == null) {
                     testClass = Class.forName(junitTest.getName());
                 } else {
@@ -391,24 +390,24 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
                 // JUnit 4
                 Method suiteMethod = null;
                 if (!testMethodsSpecified) {
-                try {
-                    // check if there is a suite method
-                    suiteMethod = testClass.getMethod("suite", new Class[0]);
-                } catch (final NoSuchMethodException e) {
-                    // no appropriate suite method found. We don't report any
-                    // error here since it might be perfectly normal.
-                }
+                    try {
+                        // check if there is a suite method
+                        suiteMethod = testClass.getMethod("suite");
+                    } catch (final NoSuchMethodException e) {
+                        // no appropriate suite method found. We don't report any
+                        // error here since it might be perfectly normal.
+                    }
                 }
 
                 if (suiteMethod != null) {
                     // if there is a suite method available, then try
                     // to extract the suite from it. If there is an error
                     // here it will be caught below and reported.
-                    suite = (Test) suiteMethod.invoke(null, new Object[0]);
+                    suite = (Test) suiteMethod.invoke(null);
 
                 } else {
-                    Class junit4TestAdapterClass = null;
-                    Class junit4TestAdapterCacheClass = null;
+                    Class<?> junit4TestAdapterClass = null;
+                    Class<?> junit4TestAdapterCacheClass = null;
                     boolean useSingleMethodAdapter = false;
 
                     if (junit.framework.TestCase.class.isAssignableFrom(testClass)) {
@@ -434,64 +433,69 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
                     // In that case first C.fN will fail with CNFE and we
                     // will avoid UnsupportedClassVersionError.
 
-                    try {
-                        Class.forName("java.lang.annotation.Annotation");
-                        junit4TestAdapterCacheClass = Class.forName("org.apache.tools.ant.taskdefs.optional.junit.CustomJUnit4TestAdapterCache");
-                        if (loader == null) {
-                            junit4TestAdapterClass =
-                                Class.forName(JUNIT_4_TEST_ADAPTER);
-                            if (testMethodsSpecified) {
-                                /*
-                                 * We cannot try to load the JUnit4TestAdapter
-                                 * before trying to load JUnit4TestMethodAdapter
-                                 * because it might fail with
-                                 * NoClassDefFoundException, instead of plain
-                                 * ClassNotFoundException.
-                                 */
-                                junit4TestAdapterClass = Class.forName(
-                                    "org.apache.tools.ant.taskdefs.optional.junit.JUnit4TestMethodAdapter");
-                                useSingleMethodAdapter = true;
-                            }
-                        } else {
-                            junit4TestAdapterClass =
-                                Class.forName(JUNIT_4_TEST_ADAPTER,
-                                              true, loader);
-                            if (testMethodsSpecified) {
+                        try {
+                            Class.forName("java.lang.annotation.Annotation");
+                            junit4TestAdapterCacheClass = Class.forName(
+                                "org.apache.tools.ant.taskdefs.optional.junit.CustomJUnit4TestAdapterCache");
+                            if (loader == null) {
                                 junit4TestAdapterClass =
-                                    Class.forName(
-                                        "org.apache.tools.ant.taskdefs.optional.junit.JUnit4TestMethodAdapter",
-                                        true, loader);
-                                useSingleMethodAdapter = true;
+                                    Class.forName(JUNIT_4_TEST_ADAPTER);
+                                if (testMethodsSpecified) {
+                                    /*
+                                     * We cannot try to load the JUnit4TestAdapter
+                                     * before trying to load JUnit4TestMethodAdapter
+                                     * because it might fail with
+                                     * NoClassDefFoundException, instead of plain
+                                     * ClassNotFoundException.
+                                     */
+                                    junit4TestAdapterClass = Class.forName(
+                                        "org.apache.tools.ant.taskdefs.optional.junit.JUnit4TestMethodAdapter");
+                                    useSingleMethodAdapter = true;
+                                }
+                            } else {
+                                junit4TestAdapterClass =
+                                    Class.forName(JUNIT_4_TEST_ADAPTER,
+                                                  true, loader);
+                                if (testMethodsSpecified) {
+                                    junit4TestAdapterClass =
+                                        Class.forName(
+                                            "org.apache.tools.ant.taskdefs.optional.junit.JUnit4TestMethodAdapter",
+                                            true, loader);
+                                    useSingleMethodAdapter = true;
+                                }
                             }
+                        } catch (final ClassNotFoundException e) {
+                            // OK, fall back to JUnit 3.
                         }
-                    } catch (final ClassNotFoundException e) {
-                        // OK, fall back to JUnit 3.
-                    }
                     }
                     junit4 = junit4TestAdapterClass != null;
 
-                    if (junitTest.isSkipNonTests()) {
-                       if (!containsTests(testClass, junit4)) {
-                           return;
-                       }
+                    if (junitTest.isSkipNonTests()
+                        && !containsTests(testClass, junit4)) {
+                        return;
                     }
 
-
                     if (junit4) {
                         // Let's use it!
-                        Class[] formalParams;
+                        Class<?>[] formalParams;
                         Object[] actualParams;
                         if (useSingleMethodAdapter) {
-                            formalParams = new Class[] {Class.class, String[].class};
-                            actualParams = new Object[] {testClass, methods};
+                            formalParams =
+                                new Class[] { Class.class, String[].class };
+                            actualParams = new Object[] { testClass, methods };
                         } else {
-                            formalParams = new Class[] {Class.class, Class.forName("junit.framework.JUnit4TestAdapterCache")};
-                            actualParams = new Object[] {testClass, junit4TestAdapterCacheClass.getMethod("getInstance").invoke(null)};
+                            formalParams =
+                                new Class[] { Class.class, Class.forName(
+                                    "junit.framework.JUnit4TestAdapterCache") };
+                            actualParams =
+                                new Object[] { testClass,
+                                    junit4TestAdapterCacheClass
+                                        .getMethod("getInstance")
+                                        .invoke(null) };
                         }
-                        suite =
-                            (Test) junit4TestAdapterClass
-                            .getConstructor(formalParams).
-                            newInstance(actualParams);
+                        suite = junit4TestAdapterClass.asSubclass(Test.class)
+                            .getConstructor(formalParams)
+                            .newInstance(actualParams);
                     } else {
                         // Use JUnit 3.
 
@@ -511,9 +515,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
                             suite = testSuite;
                         }
                     }
-
                 }
-
             } catch (final Throwable e) {
                 retCode = ERRORS;
                 exception = e;
@@ -588,12 +590,13 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
     }
 
     private static boolean containsTests(final Class<?> testClass, final boolean isJUnit4) {
-        Class testAnnotation = null;
-        Class suiteAnnotation = null;
-        Class runWithAnnotation = null;
+        Class<? extends Annotation> testAnnotation = null;
+        Class<? extends Annotation> suiteAnnotation = null;
+        Class<? extends Annotation> runWithAnnotation = null;
 
         try {
-            testAnnotation = Class.forName("org.junit.Test");
+            testAnnotation =
+                Class.forName("org.junit.Test").asSubclass(Annotation.class);
         } catch (final ClassNotFoundException e) {
             if (isJUnit4) {
                 // odd - we think we're JUnit4 but don't support the test annotation. We therefore can't have any tests!
@@ -603,17 +606,18 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
         }
 
         try {
-            suiteAnnotation = Class.forName("org.junit.Suite.SuiteClasses");
+            suiteAnnotation = Class.forName("org.junit.Suite.SuiteClasses")
+                .asSubclass(Annotation.class);
         } catch(final ClassNotFoundException ex) {
             // ignore - we don't have this annotation so make sure we don't check for it
         }
         try {
-            runWithAnnotation = Class.forName("org.junit.runner.RunWith");
+            runWithAnnotation = Class.forName("org.junit.runner.RunWith")
+                .asSubclass(Annotation.class);
         } catch(final ClassNotFoundException ex) {
             // also ignore as this annotation doesn't exist so tests can't use it
         }
 
-
         if (!isJUnit4 && !TestCase.class.isAssignableFrom(testClass)) {
             //a test we think is JUnit3 but does not extend TestCase. Can't really be a test.
             return false;
@@ -621,22 +625,26 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
 
         // check if we have any inner classes that contain suitable test methods
         for (final Class<?> innerClass : testClass.getDeclaredClasses()) {
-            if (containsTests(innerClass, isJUnit4) || containsTests(innerClass, !isJUnit4)) {
+            if (containsTests(innerClass, isJUnit4)
+                || containsTests(innerClass, !isJUnit4)) {
                 return true;
             }
         }
 
-        if (Modifier.isAbstract(testClass.getModifiers()) || Modifier.isInterface(testClass.getModifiers())) {
+        if (Modifier.isAbstract(testClass.getModifiers())
+            || Modifier.isInterface(testClass.getModifiers())) {
             // can't instantiate class and no inner classes are tests either
             return false;
         }
 
         if (isJUnit4) {
-             if (suiteAnnotation != null && testClass.getAnnotation(suiteAnnotation) != null) {
+            if (suiteAnnotation != null
+                && testClass.getAnnotation(suiteAnnotation) != null) {
                 // class is marked as a suite. Let JUnit try and work its magic on it.
                 return true;
-             }
-            if (runWithAnnotation != null && testClass.getAnnotation(runWithAnnotation) != null) {
+            }
+            if (runWithAnnotation != null
+                && testClass.getAnnotation(runWithAnnotation) != null) {
                 /* Class is marked with @RunWith. If this class is badly written (no test methods, multiple
                  * constructors, private constructor etc) then the class is automatically run and fails in the
                  * IDEs I've tried... so I'm happy handing the class to JUnit to try and run, and let JUnit
@@ -656,16 +664,19 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
                 }
             } else {
                 // check if JUnit3 class have public or protected no-args methods starting with names starting with test
-                if (m.getName().startsWith("test") && m.getParameterTypes().length == 0
-                        && (Modifier.isProtected(m.getModifiers()) || Modifier.isPublic(m.getModifiers()))) {
+                if (m.getName().startsWith("test")
+                    && m.getParameterTypes().length == 0
+                    && (Modifier.isProtected(m.getModifiers())
+                        || Modifier.isPublic(m.getModifiers()))) {
                     return true;
                 }
             }
             // check if JUnit3 or JUnit4 test have a public or protected, static,
             // no-args 'suite' method
-            if (m.getName().equals("suite") && m.getParameterTypes().length == 0
-                    && (Modifier.isProtected(m.getModifiers()) || Modifier.isPublic(m.getModifiers()))
-                    && Modifier.isStatic(m.getModifiers())) {
+            if ("suite".equals(m.getName()) && m.getParameterTypes().length == 0
+                && (Modifier.isProtected(m.getModifiers())
+                    || Modifier.isPublic(m.getModifiers()))
+                && Modifier.isStatic(m.getModifiers())) {
                 return true;
             }
         }
@@ -679,6 +690,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      *
      * @return 2 if errors occurred, 1 if tests failed else 0.
      */
+    @Override
     public int getRetCode() {
         return retCode;
     }
@@ -689,6 +701,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      * <p>A new Test is started.
      * @param t the test.
      */
+    @Override
     public void startTest(final Test t) {
         final String testName = JUnitVersionHelper.getTestCaseName(t);
         logTestListenerEvent("startTest(" + testName + ")");
@@ -700,6 +713,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      * <p>A Test is finished.
      * @param test the test.
      */
+    @Override
     public void endTest(final Test test) {
         final String testName = JUnitVersionHelper.getTestCaseName(test);
         logTestListenerEvent("endTest(" + testName + ")");
@@ -709,10 +723,8 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
         if (logTestListenerEvents) {
             final PrintStream out = savedOut != null ? savedOut : System.out;
             out.flush();
-            if (msg == null) {
-                msg = "null";
-            }
-            final StringTokenizer msgLines = new StringTokenizer(msg, "\r\n", false);
+            final StringTokenizer msgLines =
+                new StringTokenizer(String.valueOf(msg), "\r\n", false);
             while (msgLines.hasMoreTokens()) {
                 out.println(JUnitTask.TESTLISTENER_PREFIX
                             + msgLines.nextToken());
@@ -743,6 +755,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      * @param test the test.
      * @param t    the assertion thrown by the test.
      */
+    @Override
     public void addFailure(final Test test, final AssertionFailedError t) {
         addFailure(test, (Throwable) t);
     }
@@ -754,6 +767,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      * @param test the test.
      * @param t    the error thrown by the test.
      */
+    @Override
     public void addError(final Test test, final Throwable t) {
         final String testName = JUnitVersionHelper.getTestCaseName(test);
         logTestListenerEvent("addError(" + testName + ", " + t.getMessage() + ")");
@@ -767,6 +781,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      * @since Ant 1.6
      * @param permissions the permissions to use.
      */
+    @Override
     public void setPermissions(final Permissions permissions) {
         perm = permissions;
     }
@@ -775,6 +790,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      * Handle a string destined for standard output.
      * @param output the string to output
      */
+    @Override
     public void handleOutput(final String output) {
         if (!logTestListenerEvents && output.startsWith(JUnitTask.TESTLISTENER_PREFIX)) {
             // ignore
@@ -794,12 +810,14 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
      *
      * @since Ant 1.6
      */
+    @Override
     public int handleInput(final byte[] buffer, final int offset, final int length)
         throws IOException {
         return -1;
     }
 
     /** {@inheritDoc}. */
+    @Override
     public void handleErrorOutput(final String output) {
         if (systemError != null) {
             systemError.print(output);
@@ -807,6 +825,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
     }
 
     /** {@inheritDoc}. */
+    @Override
     public void handleFlush(final String output) {
         if (systemOut != null) {
             systemOut.print(output);
@@ -814,6 +833,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
     }
 
     /** {@inheritDoc}. */
+    @Override
     public void handleErrorFlush(final String output) {
         if (systemError != null) {
             systemError.print(output);
@@ -824,7 +844,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
         final int size = formatters.size();
         for (int i = 0; i < size; i++) {
             final JUnitResultFormatter formatter =
-                ((JUnitResultFormatter) formatters.elementAt(i));
+                (JUnitResultFormatter) formatters.get(i);
 
             formatter.setSystemOutput(out);
             formatter.setSystemError(err);
@@ -856,6 +876,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
     }
 
     /** {@inheritDoc}. */
+    @Override
     public void addFormatter(final JUnitTaskMirror.JUnitResultFormatterMirror f) {
         formatters.addElement(f);
     }
@@ -966,19 +987,13 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
         }
 
         // Add/overlay system properties on the properties from the Ant project
-        final Hashtable p = System.getProperties();
-        for (final Enumeration e = p.keys(); e.hasMoreElements();) {
-            final Object key = e.nextElement();
-            props.put(key, p.get(key));
-        }
+        System.getProperties().forEach(props::put);
 
         int returnCode = SUCCESS;
         if (multipleTests) {
-            try {
-                final java.io.BufferedReader reader =
-                    new java.io.BufferedReader(new java.io.FileReader(args[0]));
-                String testCaseName;
-                String[] testMethodNames;
+            try (
+                final BufferedReader reader =
+                    new BufferedReader(new java.io.FileReader(args[0]))){
                 int code = 0;
                 boolean errorOccurred = false;
                 boolean failureOccurred = false;
@@ -987,6 +1002,8 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
                     final StringTokenizer st = new StringTokenizer(line, ",");
                     final String testListSpec = st.nextToken();
                     final int colonIndex = testListSpec.indexOf(':');
+                    String testCaseName;
+                    String[] testMethodNames;
                     if (colonIndex == -1) {
                         testCaseName = testListSpec;
                         testMethodNames = null;
@@ -1041,43 +1058,52 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
         System.exit(returnCode);
     }
 
-    private static Vector fromCmdLine = new Vector();
+    private static Vector<FormatterElement> fromCmdLine = new Vector<>();
 
     private static void transferFormatters(final JUnitTestRunner runner,
                                            final JUnitTest test) {
         runner.addFormatter(new JUnitResultFormatter() {
 
+            @Override
             public void startTestSuite(final JUnitTest suite) throws BuildException {
             }
 
+            @Override
             public void endTestSuite(final JUnitTest suite) throws BuildException {
             }
 
+            @Override
             public void setOutput(final OutputStream out) {
             }
 
+            @Override
             public void setSystemOutput(final String out) {
             }
 
+            @Override
             public void setSystemError(final String err) {
             }
 
+            @Override
             public void addError(final Test arg0, final Throwable arg1) {
             }
 
+            @Override
             public void addFailure(final Test arg0, final AssertionFailedError arg1) {
             }
 
+            @Override
             public void endTest(final Test arg0) {
             }
 
+            @Override
             public void startTest(final Test arg0) {
                 registerTestCase(JUnitVersionHelper.getTestCaseName(arg0));
             }
         });
         final int size = fromCmdLine.size();
         for (int i = 0; i < size; i++) {
-            final FormatterElement fe = (FormatterElement) fromCmdLine.elementAt(i);
+            final FormatterElement fe = fromCmdLine.elementAt(i);
             if (multipleTests && fe.getUseFile()) {
                 final File destFile =
                     new File(test.getTodir(),
@@ -1279,14 +1305,19 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
     private int[] findJUnit4FailureErrorCount(final TestResult result) {
         int failures = 0;
         int errors = 0;
-        Enumeration e = result.failures();
-        while (e.hasMoreElements()) {
-            e.nextElement();
-            failures++;
+        {
+            @SuppressWarnings("unchecked")
+            Enumeration<TestFailure> e = result.failures();
+            while (e.hasMoreElements()) {
+                e.nextElement();
+                failures++;
+            }
         }
-        e = result.errors();
+        @SuppressWarnings("unchecked")
+        Enumeration<TestFailure> e = result.errors();
         while (e.hasMoreElements()) {
-            final Throwable t = ((TestFailure) e.nextElement()).thrownException();
+            final Throwable t =
+                e.nextElement().thrownException();
             if (t instanceof AssertionFailedError
                 || t instanceof AssertionError) {
                 failures++;
@@ -1294,7 +1325,7 @@ public class JUnitTestRunner implements TestListener, JUnitTaskMirror.JUnitTestR
                 errors++;
             }
         }
-        return new int[] {failures, errors};
+        return new int[] { failures, errors };
     }
 
 } // JUnitTestRunner