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

[29/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/Exit.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Exit.java b/src/main/org/apache/tools/ant/taskdefs/Exit.java
index f48f248..7d7bfbe 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Exit.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Exit.java
@@ -50,12 +50,13 @@ import org.apache.tools.ant.taskdefs.condition.ConditionBase;
 public class Exit extends Task {
 
     private static class NestedCondition extends ConditionBase implements Condition {
+        @Override
         public boolean eval() {
             if (countConditions() != 1) {
                 throw new BuildException(
                     "A single nested condition is required.");
             }
-            return ((Condition) (getConditions().nextElement())).eval();
+            return getConditions().nextElement().eval();
         }
     }
 
@@ -131,12 +132,13 @@ public class Exit extends Task {
      * the if and unless parameters (if present).
      * @throws BuildException on error
      */
+    @Override
     public void execute() throws BuildException {
         boolean fail = (nestedConditionPresent()) ? testNestedCondition()
                      : (testIfCondition() && testUnlessCondition());
         if (fail) {
             String text = null;
-            if (message != null && message.trim().length() > 0) {
+            if (!(message == null || message.trim().isEmpty())) {
                 text = message.trim();
             } else {
                 if (ifCondition != null && !"".equals(ifCondition)
@@ -154,15 +156,13 @@ public class Exit extends Task {
                 }
                 if (nestedConditionPresent()) {
                     text = "condition satisfied";
-                } else {
-                    if (text == null) {
-                        text = "No message";
-                    }
+                } else if (text == null) {
+                    text = "No message";
                 }
             }
             log("failing due to " + text, Project.MSG_DEBUG);
-            throw ((status == null) ? new BuildException(text)
-             : new ExitStatusException(text, status.intValue()));
+            throw status == null ? new BuildException(text)
+                : new ExitStatusException(text, status.intValue());
         }
     }
 
@@ -217,8 +217,8 @@ public class Exit extends Task {
         boolean result = nestedConditionPresent();
 
         if (result && ifCondition != null || unlessCondition != null) {
-            throw new BuildException("Nested conditions "
-                + "not permitted in conjunction with if/unless attributes");
+            throw new BuildException(
+                "Nested conditions not permitted in conjunction with if/unless attributes");
         }
 
         return result && nestedCondition.eval();

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/Expand.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Expand.java b/src/main/org/apache/tools/ant/taskdefs/Expand.java
index 6dd3c92..62fc196 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Expand.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Expand.java
@@ -28,6 +28,7 @@ import java.util.Date;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import java.util.Vector;
 
@@ -59,25 +60,26 @@ import org.apache.tools.zip.ZipFile;
  *           name="unwar"
  */
 public class Expand extends Task {
+    public static final String NATIVE_ENCODING = "native-encoding";
+    
+    /** Error message when more that one mapper is defined */
+    public static final String ERROR_MULTIPLE_MAPPERS = "Cannot define more than one mapper";
+    
+    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
+    
     private static final int BUFFER_SIZE = 1024;
     private File dest; //req
     private File source; // req
     private boolean overwrite = true;
     private Mapper mapperElement = null;
-    private Vector<PatternSet> patternsets = new Vector<PatternSet>();
+    private List<PatternSet> patternsets = new Vector<>();
     private Union resources = new Union();
     private boolean resourcesSpecified = false;
     private boolean failOnEmptyArchive = false;
     private boolean stripAbsolutePathSpec = false;
     private boolean scanForUnicodeExtraFields = true;
 
-    public static final String NATIVE_ENCODING = "native-encoding";
-
     private String encoding;
-    /** Error message when more that one mapper is defined */
-    public static final String ERROR_MULTIPLE_MAPPERS = "Cannot define more than one mapper";
-
-    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
 
     /**
      * Creates an Expand instance and sets encoding to UTF-8.
@@ -118,14 +120,15 @@ public class Expand extends Task {
      *
      * @exception BuildException Thrown in unrecoverable error.
      */
+    @Override
     public void execute() throws BuildException {
         if ("expand".equals(getTaskType())) {
             log("!! expand is deprecated. Use unzip instead. !!");
         }
 
         if (source == null && !resourcesSpecified) {
-            throw new BuildException("src attribute and/or resources must be "
-                                     + "specified");
+            throw new BuildException(
+                "src attribute and/or resources must be specified");
         }
 
         if (dest == null) {
@@ -141,13 +144,14 @@ public class Expand extends Task {
             if (source.isDirectory()) {
                 throw new BuildException("Src must not be a directory."
                     + " Use nested filesets instead.", getLocation());
-            } else if (!source.exists()) {
+            }
+            if (!source.exists()) {
                 throw new BuildException("src '" + source + "' doesn't exist.");
-            } else if (!source.canRead()) {
+            }
+            if (!source.canRead()) {
                 throw new BuildException("src '" + source + "' cannot be read.");
-            } else {
-                expandFile(FILE_UTILS, source, dest);
             }
+            expandFile(FILE_UTILS, source, dest);
         }
         for (Resource r : resources) {
             if (!r.isExists()) {
@@ -173,7 +177,6 @@ public class Expand extends Task {
      */
     protected void expandFile(FileUtils fileUtils, File srcF, File dir) {
         log("Expanding: " + srcF + " into " + dir, Project.MSG_INFO);
-        ZipFile zf = null;
         FileNameMapper mapper = getMapper();
         if (!srcF.exists()) {
             throw new BuildException("Unable to expand "
@@ -181,8 +184,9 @@ public class Expand extends Task {
                     + " as the file does not exist",
                     getLocation());
         }
-        try {
-            zf = new ZipFile(srcF, encoding, scanForUnicodeExtraFields);
+        try (
+            ZipFile 
+            zf = new ZipFile(srcF, encoding, scanForUnicodeExtraFields)){
             boolean empty = true;
             Enumeration<ZipEntry> e = zf.getEntries();
             while (e.hasMoreElements()) {
@@ -200,7 +204,7 @@ public class Expand extends Task {
                 }
             }
             if (empty && getFailOnEmptyArchive()) {
-                throw new BuildException("archive '" + srcF + "' is empty");
+                throw new BuildException("archive '%s' is empty", srcF);
             }
             log("expand complete", Project.MSG_VERBOSE);
         } catch (IOException ioe) {
@@ -208,8 +212,6 @@ public class Expand extends Task {
                 "Error while expanding " + srcF.getPath()
                 + "\n" + ioe.toString(),
                 ioe);
-        } finally {
-            ZipFile.closeQuietly(zf);
         }
     }
 
@@ -220,8 +222,8 @@ public class Expand extends Task {
      * @param dir       the destination directory
      */
     protected void expandResource(Resource srcR, File dir) {
-        throw new BuildException("only filesystem based resources are"
-                                 + " supported by this task.");
+        throw new BuildException(
+            "only filesystem based resources are supported by this task.");
     }
 
     /**
@@ -229,13 +231,10 @@ public class Expand extends Task {
      * @return a filenamemapper for a file
      */
     protected FileNameMapper getMapper() {
-        FileNameMapper mapper = null;
         if (mapperElement != null) {
-            mapper = mapperElement.getImplementation();
-        } else {
-            mapper = new IdentityMapper();
+            return mapperElement.getImplementation();
         }
-        return mapper;
+        return new IdentityMapper();
     }
 
     // CheckStyle:ParameterNumberCheck OFF - bc
@@ -257,7 +256,7 @@ public class Expand extends Task {
                                boolean isDirectory, FileNameMapper mapper)
                                throws IOException {
 
-        if (stripAbsolutePathSpec && entryName.length() > 0
+        if (stripAbsolutePathSpec && !entryName.isEmpty()
             && (entryName.charAt(0) == File.separatorChar
                 || entryName.charAt(0) == '/'
                 || entryName.charAt(0) == '\\')) {
@@ -266,16 +265,16 @@ public class Expand extends Task {
             entryName = entryName.substring(1);
         }
 
-        if (patternsets != null && patternsets.size() > 0) {
+        if (!(patternsets == null || patternsets.isEmpty())) {
             String name = entryName.replace('/', File.separatorChar)
                 .replace('\\', File.separatorChar);
 
             boolean included = false;
-            Set<String> includePatterns = new HashSet<String>();
-            Set<String> excludePatterns = new HashSet<String>();
+            Set<String> includePatterns = new HashSet<>();
+            Set<String> excludePatterns = new HashSet<>();
             final int size = patternsets.size();
             for (int v = 0; v < size; v++) {
-                PatternSet p = patternsets.elementAt(v);
+                PatternSet p = patternsets.get(v);
                 String[] incls = p.getIncludePatterns(getProject());
                 if (incls == null || incls.length == 0) {
                     // no include pattern implicitly means includes="**"
@@ -350,20 +349,11 @@ public class Expand extends Task {
                 f.mkdirs();
             } else {
                 byte[] buffer = new byte[BUFFER_SIZE];
-                int length = 0;
-                OutputStream fos = null;
-                try {
-                    fos = Files.newOutputStream(f.toPath());
-
-                    while ((length =
-                            compressedInputStream.read(buffer)) >= 0) {
+                try (OutputStream fos = Files.newOutputStream(f.toPath())) {
+                    int length;
+                    while ((length = compressedInputStream.read(buffer)) >= 0) {
                         fos.write(buffer, 0, length);
                     }
-
-                    fos.close();
-                    fos = null;
-                } finally {
-                    FileUtils.close(fos);
                 }
             }
 
@@ -410,7 +400,7 @@ public class Expand extends Task {
      * @param set a pattern set
      */
     public void addPatternset(PatternSet set) {
-        patternsets.addElement(set);
+        patternsets.add(set);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/Filter.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Filter.java b/src/main/org/apache/tools/ant/taskdefs/Filter.java
index 390ba5b..da4b350 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Filter.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Filter.java
@@ -69,6 +69,7 @@ public class Filter extends Task {
      * Execute the task.
      * @throws BuildException on error
      */
+    @Override
     public void execute() throws BuildException {
         boolean isFiltersFromFile =
             filtersFile != null && token == null && value == null;
@@ -76,9 +77,9 @@ public class Filter extends Task {
             filtersFile == null && token != null && value != null;
 
         if (!isFiltersFromFile && !isSingleFilter) {
-            throw new BuildException("both token and value parameters, or "
-                                     + "only a filtersFile parameter is "
-                                     + "required", getLocation());
+            throw new BuildException(
+                "both token and value parameters, or only a filtersFile parameter is required",
+                getLocation());
         }
 
         if (isSingleFilter) {

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java b/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
index af2a21f..806c814 100644
--- a/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
+++ b/src/main/org/apache/tools/ant/taskdefs/FixCRLF.java
@@ -115,6 +115,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
      * @return a Reader.
      * @since Ant 1.7?
      */
+    @Override
     public final Reader chain(final Reader rdr) {
         return filter.chain(rdr);
     }
@@ -181,15 +182,16 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
      * @deprecated since 1.4.x.
      *             Use {@link #setEol setEol} instead.
      */
+    @Deprecated
     public void setCr(AddAsisRemove attr) {
         log("DEPRECATED: The cr attribute has been deprecated,",
             Project.MSG_WARN);
         log("Please use the eol attribute instead", Project.MSG_WARN);
         String option = attr.getValue();
         CrLf c = new CrLf();
-        if (option.equals("remove")) {
+        if ("remove".equals(option)) {
             c.setValue("lf");
-        } else if (option.equals("asis")) {
+        } else if ("asis".equals(option)) {
             c.setValue("asis");
         } else {
             // must be "add"
@@ -282,6 +284,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
      * Executes the task.
      * @throws BuildException on error.
      */
+    @Override
     public void execute() throws BuildException {
         // first off, make sure that we've got a srcdir and destdir
         validate();
@@ -322,22 +325,21 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
         }
         if (!srcDir.exists()) {
             throw new BuildException(
-                FIXCRLF_ERROR + "srcdir does not exist: '" + srcDir + "'");
+                FIXCRLF_ERROR + "srcdir does not exist: '%s'", srcDir);
         }
         if (!srcDir.isDirectory()) {
             throw new BuildException(
-                FIXCRLF_ERROR + "srcdir is not a directory: '" + srcDir + "'");
+                FIXCRLF_ERROR + "srcdir is not a directory: '%s'", srcDir);
         }
         if (destDir != null) {
             if (!destDir.exists()) {
                 throw new BuildException(
-                    FIXCRLF_ERROR + "destdir does not exist: '"
-                    + destDir + "'");
+                    FIXCRLF_ERROR + "destdir does not exist: '%s'", destDir);
             }
             if (!destDir.isDirectory()) {
                 throw new BuildException(
-                    FIXCRLF_ERROR + "destdir is not a directory: '"
-                    + destDir + "'");
+                    FIXCRLF_ERROR + "destdir is not a directory: '%s'",
+                    destDir);
             }
         }
     }
@@ -350,7 +352,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
         if (fcv == null) {
             FilterChain fc = new FilterChain();
             fc.add(filter);
-            fcv = new Vector<FilterChain>(1);
+            fcv = new Vector<>(1);
             fcv.add(fc);
         }
         File tmpFile = FILE_UTILS.createTempFile("fixcrlf", "", null, true, true);
@@ -391,6 +393,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
      * Deprecated, the functionality has been moved to filters.FixCrLfFilter.
      * @deprecated since 1.7.0.
      */
+    @Deprecated
     protected class OneLiner implements Enumeration<Object> {
         private static final int UNDEF = -1;
         private static final int NOTJAVA = 0;
@@ -549,6 +552,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
         /**
          * @return true if there is more elements.
          */
+        @Override
         public boolean hasMoreElements() {
             return !reachedEof;
         }
@@ -558,6 +562,7 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
          * @return the next element.
          * @throws NoSuchElementException if there is no more.
          */
+        @Override
         public Object nextElement()
             throws NoSuchElementException {
             if (!hasMoreElements()) {
@@ -673,22 +678,24 @@ public class FixCRLF extends MatchingTask implements ChainableReader {
      */
     public static class AddAsisRemove extends EnumeratedAttribute {
         /** {@inheritDoc}. */
+        @Override
         public String[] getValues() {
-            return new String[] {"add", "asis", "remove"};
+            return new String[] { "add", "asis", "remove" };
         }
     }
 
     /**
-     * Enumerated attribute with the values "asis", "cr", "lf" and "crlf".
+     * Enumerated attribute with the values "asis", "cr", "lf", "crlf", "mac", "unix" and "dos.
      */
     public static class CrLf extends EnumeratedAttribute {
         /**
          * @see EnumeratedAttribute#getValues
          */
         /** {@inheritDoc}. */
+        @Override
         public String[] getValues() {
-            return new String[] {"asis", "cr", "lf", "crlf",
-                                 "mac", "unix", "dos"};
+            return new String[] { "asis", "cr", "lf", "crlf", "mac", "unix",
+                "dos" };
         }
     }
 

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/GUnzip.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/GUnzip.java b/src/main/org/apache/tools/ant/taskdefs/GUnzip.java
index 94f08d7..d0fe4b0 100644
--- a/src/main/org/apache/tools/ant/taskdefs/GUnzip.java
+++ b/src/main/org/apache/tools/ant/taskdefs/GUnzip.java
@@ -19,13 +19,11 @@
 package org.apache.tools.ant.taskdefs;
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 import java.nio.file.Files;
 import java.util.zip.GZIPInputStream;
 
 import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.util.FileUtils;
 
 /**
  * Expands a file that has been compressed with the GZIP
@@ -45,6 +43,7 @@ public class GUnzip extends Unpack {
      * Get the default extension.
      * @return the value ".gz"
      */
+    @Override
     protected String getDefaultExtension() {
         return DEFAULT_EXTENSION;
     }
@@ -52,18 +51,14 @@ public class GUnzip extends Unpack {
     /**
      * Implement the gunzipping.
      */
+    @Override
     protected void extract() {
         if (srcResource.getLastModified() > dest.lastModified()) {
             log("Expanding " + srcResource.getName() + " to "
                         + dest.getAbsolutePath());
-
-            OutputStream out = null;
-            GZIPInputStream zIn = null;
-            InputStream fis = null;
-            try {
-                out = Files.newOutputStream(dest.toPath());
-                fis = srcResource.getInputStream();
-                zIn = new GZIPInputStream(fis);
+            try (OutputStream out = Files.newOutputStream(dest.toPath());
+                    GZIPInputStream zIn =
+                        new GZIPInputStream(srcResource.getInputStream())) {
                 byte[] buffer = new byte[BUFFER_SIZE];
                 int count = 0;
                 do {
@@ -73,10 +68,6 @@ public class GUnzip extends Unpack {
             } catch (IOException ioe) {
                 String msg = "Problem expanding gzip " + ioe.getMessage();
                 throw new BuildException(msg, ioe, getLocation());
-            } finally {
-                FileUtils.close(fis);
-                FileUtils.close(out);
-                FileUtils.close(zIn);
             }
         }
     }
@@ -92,6 +83,7 @@ public class GUnzip extends Unpack {
      * @return true if this task supports non file resources.
      * @since Ant 1.7
      */
+    @Override
     protected boolean supportsNonFileResources() {
         return getClass().equals(GUnzip.class);
     }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/GZip.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/GZip.java b/src/main/org/apache/tools/ant/taskdefs/GZip.java
index 4d7be1f..8803647 100644
--- a/src/main/org/apache/tools/ant/taskdefs/GZip.java
+++ b/src/main/org/apache/tools/ant/taskdefs/GZip.java
@@ -19,12 +19,10 @@
 package org.apache.tools.ant.taskdefs;
 
 import java.io.IOException;
-import java.io.OutputStream;
 import java.nio.file.Files;
 import java.util.zip.GZIPOutputStream;
 
 import org.apache.tools.ant.BuildException;
-import org.apache.tools.ant.util.FileUtils;
 
 /**
  * Compresses a file with the GZIP algorithm. Normally used to compress
@@ -39,16 +37,14 @@ public class GZip extends Pack {
     /**
      * perform the GZip compression operation.
      */
+    @Override
     protected void pack() {
-        GZIPOutputStream zOut = null;
-        try {
-            zOut = new GZIPOutputStream(Files.newOutputStream(zipFile.toPath()));
+        try (GZIPOutputStream zOut =
+            new GZIPOutputStream(Files.newOutputStream(zipFile.toPath()))) {
             zipResource(getSrcResource(), zOut);
         } catch (IOException ioe) {
             String msg = "Problem creating gzip " + ioe.getMessage();
             throw new BuildException(msg, ioe, getLocation());
-        } finally {
-            FileUtils.close(zOut);
         }
     }
 
@@ -63,6 +59,7 @@ public class GZip extends Pack {
      * @return true if this case supports non file resources.
      * @since Ant 1.7
      */
+    @Override
     protected boolean supportsNonFileResources() {
         return getClass().equals(GZip.class);
     }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/GenerateKey.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/GenerateKey.java b/src/main/org/apache/tools/ant/taskdefs/GenerateKey.java
index c26ac36..7270e67 100644
--- a/src/main/org/apache/tools/ant/taskdefs/GenerateKey.java
+++ b/src/main/org/apache/tools/ant/taskdefs/GenerateKey.java
@@ -17,8 +17,12 @@
  */
 package org.apache.tools.ant.taskdefs;
 
+import java.util.Collections;
 import java.util.Enumeration;
+import java.util.List;
 import java.util.Vector;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Task;
@@ -83,7 +87,7 @@ public class GenerateKey extends Task {
      * A class corresponding to the dname nested element.
      */
     public static class DistinguishedName {
-        private Vector<DnameParam> params = new Vector<DnameParam>();
+        private List<DnameParam> params = new Vector<>();
 
         /**
          * Create a param nested element.
@@ -91,8 +95,7 @@ public class GenerateKey extends Task {
          */
         public Object createParam() {
             DnameParam param = new DnameParam();
-            params.addElement(param);
-
+            params.add(param);
             return param;
         }
 
@@ -101,7 +104,7 @@ public class GenerateKey extends Task {
          * @return an enumeration of the nested parameters.
          */
         public Enumeration<DnameParam> getParams() {
-            return params.elements();
+            return Collections.enumeration(params);
         }
 
         /**
@@ -111,26 +114,10 @@ public class GenerateKey extends Task {
          * This is used on the command line.
          * @return a string rep of this name
          */
+        @Override
         public String toString() {
-            final int size = params.size();
-            final StringBuffer sb = new StringBuffer();
-            boolean firstPass = true;
-
-            for (int i = 0; i < size; i++) {
-                if (!firstPass) {
-                    sb.append(" ,");
-                }
-                firstPass = false;
-
-                final DnameParam param = (DnameParam) params.elementAt(i);
-                if (param.isComplete()) {
-                    sb.append(encode(param.getName()));
-                    sb.append('=');
-                    sb.append(encode(param.getValue()));
-                }
-            }
-
-            return sb.toString();
+            return params.stream().map(p -> p.getName() + "=" + p.getValue())
+                .collect(Collectors.joining(", "));
         }
 
         /**
@@ -141,26 +128,8 @@ public class GenerateKey extends Task {
          * @return the encoded value.
          */
         public String encode(final String string) {
-            int end = string.indexOf(',');
-
-            if (-1 == end) {
-              return string;
-            }
-
-            final StringBuffer sb = new StringBuffer();
-
-            int start = 0;
-
-            while (-1 != end) {
-                sb.append(string.substring(start, end));
-                sb.append("\\,");
-                start = end + 1;
-                end = string.indexOf(',', start);
-            }
-
-            sb.append(string.substring(start));
-
-            return sb.toString();
+            return Stream.of(string.split(","))
+                .collect(Collectors.joining("\\,"));
         }
     }
 
@@ -197,12 +166,11 @@ public class GenerateKey extends Task {
      */
     public DistinguishedName createDname() throws BuildException {
         if (null != expandedDname) {
-            throw new BuildException("DName sub-element can only be "
-                                     + "specified once.");
+            throw new BuildException("DName sub-element can only be specified once.");
         }
         if (null != dname) {
-            throw new BuildException("It is not possible to specify dname "
-                                    + " both as attribute and element.");
+            throw new BuildException(
+                "It is not possible to specify dname  both as attribute and element.");
         }
         expandedDname = new DistinguishedName();
         return expandedDname;
@@ -215,8 +183,8 @@ public class GenerateKey extends Task {
      */
     public void setDname(final String dname) {
         if (null != expandedDname) {
-            throw new BuildException("It is not possible to specify dname "
-                                    + " both as attribute and element.");
+            throw new BuildException(
+                "It is not possible to specify dname  both as attribute and element.");
         }
         this.dname = dname;
     }
@@ -324,6 +292,7 @@ public class GenerateKey extends Task {
      * Execute the task.
      * @throws BuildException on error
      */
+    @Override
     public void execute() throws BuildException {
 
         if (null == alias) {
@@ -338,7 +307,7 @@ public class GenerateKey extends Task {
             throw new BuildException("dname must be set");
         }
 
-        final StringBuffer sb = new StringBuffer();
+        final StringBuilder sb = new StringBuilder();
 
         sb.append("-genkey ");
 
@@ -400,7 +369,6 @@ public class GenerateKey extends Task {
             sb.append("\" ");
         }
 
-
         if (0 < keysize) {
             sb.append("-keysize \"");
             sb.append(keysize);

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/Get.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Get.java b/src/main/org/apache/tools/ant/taskdefs/Get.java
index 9b92f00..7e79128 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Get.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Get.java
@@ -96,7 +96,7 @@ public class Get extends Task {
                            + Main.getShortAntVersion());
 
     // Store headers as key/value pair without duplicate in keyz
-    private Map<String, String> headers = new LinkedHashMap<String, String>();
+    private Map<String, String> headers = new LinkedHashMap<>();
 
     /**
      * Does the work.
@@ -118,7 +118,7 @@ public class Get extends Task {
                     if (path.endsWith("/")) {
                         path = path.substring(0, path.length() - 1);
                     }
-                    final int slash = path.lastIndexOf("/");
+                    final int slash = path.lastIndexOf('/');
                     if (slash > -1) {
                         path = path.substring(slash + 1);
                     }
@@ -130,11 +130,13 @@ public class Get extends Task {
                         log("skipping " + r + " - mapper can't handle it",
                             Project.MSG_WARN);
                         continue;
-                    } else if (d.length == 0) {
+                    }
+                    if (d.length == 0) {
                         log("skipping " + r + " - mapper returns no file name",
                             Project.MSG_WARN);
                         continue;
-                    } else if (d.length > 1) {
+                    }
+                    if (d.length > 1) {
                         log("skipping " + r + " - mapper returns multiple file"
                             + " names", Project.MSG_WARN);
                         continue;
@@ -288,8 +290,8 @@ public class Get extends Task {
         for (final Resource r : sources) {
             final URLProvider up = r.as(URLProvider.class);
             if (up == null) {
-                throw new BuildException("Only URLProvider resources are"
-                                         + " supported", getLocation());
+                throw new BuildException(
+                    "Only URLProvider resources are supported", getLocation());
             }
         }
 
@@ -299,9 +301,8 @@ public class Get extends Task {
 
         if (destination.exists() && sources.size() > 1
             && !destination.isDirectory()) {
-            throw new BuildException("The specified destination is not a"
-                                     + " directory",
-                                     getLocation());
+            throw new BuildException(
+                "The specified destination is not a directory", getLocation());
         }
 
         if (destination.exists() && !destination.canWrite()) {
@@ -391,7 +392,6 @@ public class Get extends Task {
         useTimestamp = v;
     }
 
-
     /**
      * Username for basic auth.
      *
@@ -566,6 +566,7 @@ public class Get extends Task {
         /**
          * begin a download
          */
+        @Override
         public void beginDownload() {
         }
 
@@ -573,12 +574,14 @@ public class Get extends Task {
          * tick handler
          *
          */
+        @Override
         public void onTick() {
         }
 
         /**
          * end a download
          */
+        @Override
         public void endDownload() {
         }
     }
@@ -603,6 +606,7 @@ public class Get extends Task {
         /**
          * begin a download
          */
+        @Override
         public void beginDownload() {
             dots = 0;
         }
@@ -611,6 +615,7 @@ public class Get extends Task {
          * tick handler
          *
          */
+        @Override
         public void onTick() {
             out.print(".");
             if (dots++ > DOTS_PER_LINE) {
@@ -622,6 +627,7 @@ public class Get extends Task {
         /**
          * end a download
          */
+        @Override
         public void endDownload() {
             out.println();
             out.flush();
@@ -699,9 +705,8 @@ public class Get extends Task {
                 if (ignoreErrors) {
                     log(message, logLevel);
                     return false;
-                } else {
-                    throw new BuildException(message);
                 }
+                throw new BuildException(message);
             }
 
             redirections++;
@@ -711,12 +716,9 @@ public class Get extends Task {
                 if (ignoreErrors) {
                     log(message, logLevel);
                     return false;
-                } else {
-                    throw new BuildException(message);
                 }
+                throw new BuildException(message);
             }
-
-
             return true;
         }
 
@@ -749,14 +751,12 @@ public class Get extends Task {
                 connection.setRequestProperty("Accept-Encoding", GZIP_CONTENT_ENCODING);
             }
 
-
             for (final Map.Entry<String, String> header : headers.entrySet()) {
                 //we do not log the header value as it may contain sensitive data like passwords
                 log(String.format("Adding header '%s' ", header.getKey()));
                 connection.setRequestProperty(header.getKey(), header.getValue());
             }
 
-
             if (connection instanceof HttpURLConnection) {
                 ((HttpURLConnection) connection)
                         .setInstanceFollowRedirects(false);
@@ -804,9 +804,8 @@ public class Get extends Task {
                     if (ignoreErrors) {
                         log(message, logLevel);
                         return null;
-                    } else {
-                        throw new BuildException(message);
                     }
+                    throw new BuildException(message);
                 }
             }
 

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/HostInfo.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/HostInfo.java b/src/main/org/apache/tools/ant/taskdefs/HostInfo.java
index 43a1211..af36afc 100644
--- a/src/main/org/apache/tools/ant/taskdefs/HostInfo.java
+++ b/src/main/org/apache/tools/ant/taskdefs/HostInfo.java
@@ -105,8 +105,9 @@ public class HostInfo extends Task {
      * @throws BuildException
      *             on error.
      */
+    @Override
     public void execute() throws BuildException {
-        if (host == null || "".equals(host)) {
+        if (host == null || host.isEmpty()) {
             executeLocal();
         } else {
             executeRemote();
@@ -115,7 +116,7 @@ public class HostInfo extends Task {
 
     private void executeLocal() {
         try {
-            inetAddrs = new LinkedList<InetAddress>();
+            inetAddrs = new LinkedList<>();
             Enumeration<NetworkInterface> interfaces = NetworkInterface.getNetworkInterfaces();
             while (interfaces.hasMoreElements()) {
                 NetworkInterface currentif = interfaces.nextElement();
@@ -175,34 +176,32 @@ public class HostInfo extends Task {
         if (best == null) {
             // none selected so far, so this one is better.
             best = current;
+        } else if (current == null || current.isLoopbackAddress()) {
+            // definitely not better than the previously selected address.
+        } else if (current.isLinkLocalAddress()) {
+            // link local considered better than loopback
+            if (best.isLoopbackAddress()) {
+                best = current;
+            }
+        } else if (current.isSiteLocalAddress()) {
+            // site local considered better than link local (and loopback)
+            // address with hostname resolved considered better than
+            // address without hostname
+            if (best.isLoopbackAddress()
+                    || best.isLinkLocalAddress()
+                    || (best.isSiteLocalAddress() && !hasHostName(best))) {
+                best = current;
+            }
         } else {
-            if (current == null || current.isLoopbackAddress()) {
-                // definitely not better than the previously selected address.
-            } else if (current.isLinkLocalAddress()) {
-                // link local considered better than loopback
-                if (best.isLoopbackAddress()) {
-                    best = current;
-                }
-            } else if (current.isSiteLocalAddress()) {
-                // site local considered better than link local (and loopback)
-                // address with hostname resolved considered better than
-                // address without hostname
-                if (best.isLoopbackAddress()
-                        || best.isLinkLocalAddress()
-                        || (best.isSiteLocalAddress() && !hasHostName(best))) {
-                    best = current;
-                }
-            } else {
-                // current is a "Global address", considered better than
-                // site local (and better than link local, loopback)
-                // address with hostname resolved considered better than
-                // address without hostname
-                if (best.isLoopbackAddress()
-                        || best.isLinkLocalAddress()
-                        || best.isSiteLocalAddress()
-                        || !hasHostName(best)) {
-                    best = current;
-                }
+            // current is a "Global address", considered better than
+            // site local (and better than link local, loopback)
+            // address with hostname resolved considered better than
+            // address without hostname
+            if (best.isLoopbackAddress()
+                    || best.isLinkLocalAddress()
+                    || best.isSiteLocalAddress()
+                    || !hasHostName(best)) {
+                best = current;
             }
         }
         return best;

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/ImportTask.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/ImportTask.java b/src/main/org/apache/tools/ant/taskdefs/ImportTask.java
index 63adf71..98bf4b3 100644
--- a/src/main/org/apache/tools/ant/taskdefs/ImportTask.java
+++ b/src/main/org/apache/tools/ant/taskdefs/ImportTask.java
@@ -63,12 +63,13 @@ import org.apache.tools.ant.util.FileUtils;
  * @ant.task category="control"
  */
 public class ImportTask extends Task {
+    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
+
     private String file;
     private boolean optional;
     private String targetPrefix = ProjectHelper.USE_PROJECT_NAME_AS_TARGET_PREFIX;
     private String prefixSeparator = ".";
     private final Union resources = new Union();
-    private static final FileUtils FILE_UTILS = FileUtils.getFileUtils();
 
     public ImportTask() {
         resources.setCache(true);
@@ -123,18 +124,18 @@ public class ImportTask extends Task {
         resources.add(r);
     }
 
+    @Override
     public void execute() {
-        if (file == null && resources.size() == 0) {
-            throw new BuildException("import requires file attribute or"
-                                     + " at least one nested resource");
+        if (file == null && resources.isEmpty()) {
+            throw new BuildException(
+                "import requires file attribute or at least one nested resource");
         }
         if (getOwningTarget() == null
-            || !"".equals(getOwningTarget().getName())) {
+            || !getOwningTarget().getName().isEmpty()) {
             throw new BuildException("import only allowed as a top-level task");
         }
 
-        ProjectHelper helper =
-                (ProjectHelper) getProject().
+        ProjectHelper helper = getProject().
                     getReference(ProjectHelper.PROJECTHELPER_REFERENCE);
 
         if (helper == null) {
@@ -142,9 +143,7 @@ public class ImportTask extends Task {
             throw new BuildException("import requires support in ProjectHelper");
         }
 
-        Vector<Object> importStack = helper.getImportStack();
-
-        if (importStack.size() == 0) {
+        if (helper.getImportStack().isEmpty()) {
             // this happens if ant is used with a project
             // helper that doesn't set the import.
             throw new BuildException("import requires support in ProjectHelper");
@@ -166,8 +165,6 @@ public class ImportTask extends Task {
 
     private void importResource(ProjectHelper helper,
                                 Resource importedResource) {
-        Vector<Object> importStack = helper.getImportStack();
-
         getProject().log("Importing file " + importedResource + " from "
                          + getLocation().getFileName(), Project.MSG_VERBOSE);
 
@@ -178,13 +175,12 @@ public class ImportTask extends Task {
             if (optional) {
                 getProject().log(message, Project.MSG_VERBOSE);
                 return;
-            } else {
-                throw new BuildException(message);
             }
+            throw new BuildException(message);
         }
 
-        if (!isInIncludeMode() &&
-            hasAlreadyBeenImported(importedResource, importStack)) {
+        if (!isInIncludeMode() && hasAlreadyBeenImported(importedResource,
+            helper.getImportStack())) {
             getProject().log(
                 "Skipped already imported file:\n   "
                 + importedResource + "\n", Project.MSG_VERBOSE);
@@ -203,10 +199,10 @@ public class ImportTask extends Task {
                 prefix = oldPrefix + oldSep + targetPrefix;
             } else if (isInIncludeMode()) {
                 prefix = targetPrefix;
-            } else if (!ProjectHelper.USE_PROJECT_NAME_AS_TARGET_PREFIX.equals(targetPrefix)) {
-                prefix = targetPrefix;
-            } else {
+            } else if (ProjectHelper.USE_PROJECT_NAME_AS_TARGET_PREFIX.equals(targetPrefix)) {
                 prefix = oldPrefix;
+            } else {
+                prefix = targetPrefix;
             }
             setProjectHelperProps(prefix, prefixSeparator,
                                   isInIncludeMode());
@@ -260,9 +256,8 @@ public class ImportTask extends Task {
             } catch (MalformedURLException ex) {
                 log(ex.toString(), Project.MSG_VERBOSE);
             }
-            throw new BuildException("failed to resolve " + file
-                                     + " relative to "
-                                     + getLocation().getFileName());
+            throw new BuildException("failed to resolve %s relative to %s",
+                file, getLocation().getFileName());
         }
         return null;
     }
@@ -274,22 +269,14 @@ public class ImportTask extends Task {
 
     private boolean hasAlreadyBeenImported(Resource importedResource,
                                            Vector<Object> importStack) {
-        File importedFile = null;
-        FileProvider fp = importedResource.as(FileProvider.class);
-        if (fp != null) {
-            importedFile = fp.getFile();
-        }
-        URL importedURL = null;
-        URLProvider up = importedResource.as(URLProvider.class);
-        if (up != null) {
-            importedURL = up.getURL();
-        }
-        for (Object o : importStack) {
-            if (isOneOf(o, importedResource, importedFile, importedURL)) {
-                return true;
-            }
-        }
-        return false;
+        File importedFile = importedResource.asOptional(FileProvider.class)
+            .map(FileProvider::getFile).orElse(null);
+
+        URL importedURL = importedResource.asOptional(URLProvider.class)
+            .map(URLProvider::getURL).orElse(null);
+
+        return importStack.stream().anyMatch(
+            o -> isOneOf(o, importedResource, importedFile, importedURL));
     }
 
     private boolean isOneOf(Object o, Resource importedResource,

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/Input.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Input.java b/src/main/org/apache/tools/ant/taskdefs/Input.java
index ed05131..c7a5ec8 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Input.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Input.java
@@ -18,8 +18,7 @@
 
 package org.apache.tools.ant.taskdefs;
 
-import java.util.Vector;
-
+import java.util.List;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.Task;
 import org.apache.tools.ant.input.DefaultInputHandler;
@@ -59,6 +58,7 @@ public class Input extends Task {
         public void setRefid(final String refid) {
             this.refid = refid;
         }
+
         /**
          * Get the refid of this Handler.
          * @return String refid.
@@ -66,6 +66,7 @@ public class Input extends Task {
         public String getRefid() {
             return refid;
         }
+
         /**
          * Set the InputHandler classname.
          * @param classname the String classname.
@@ -73,6 +74,7 @@ public class Input extends Task {
         public void setClassname(final String classname) {
             this.classname = classname;
         }
+
         /**
          * Get the classname of the InputHandler.
          * @return String classname.
@@ -80,6 +82,7 @@ public class Input extends Task {
         public String getClassname() {
             return classname;
         }
+
         /**
          * Set the handler type.
          * @param type a HandlerType.
@@ -87,6 +90,7 @@ public class Input extends Task {
         public void setType(final HandlerType type) {
             this.type = type;
         }
+
         /**
          * Get the handler type.
          * @return a HandlerType object.
@@ -94,6 +98,7 @@ public class Input extends Task {
         public HandlerType getType() {
             return type;
         }
+
         private InputHandler getInputHandler() {
             if (type != null) {
                return type.getInputHandler();
@@ -107,8 +112,8 @@ public class Input extends Task {
                }
             }
             if (classname != null) {
-               return (InputHandler) (ClasspathUtils.newInstance(classname,
-                   createLoader(), InputHandler.class));
+               return ClasspathUtils.newInstance(classname,
+                   createLoader(), InputHandler.class);
             }
             throw new BuildException(
                 "Must specify refid, classname or type");
@@ -120,19 +125,21 @@ public class Input extends Task {
      * "default", "propertyfile", "greedy", "secure" (since Ant 1.8).
      */
     public static class HandlerType extends EnumeratedAttribute {
-        private static final String[] VALUES = {"default", "propertyfile", "greedy", "secure"};
+        private static final String[] VALUES =
+            { "default", "propertyfile", "greedy", "secure" };
 
         private static final InputHandler[] HANDLERS
-            = {new DefaultInputHandler(),
-               new PropertyFileInputHandler(),
-               new GreedyInputHandler(),
-               new SecureInputHandler()};
+            = { new DefaultInputHandler(),
+                new PropertyFileInputHandler(),
+                new GreedyInputHandler(),
+                new SecureInputHandler() };
 
         /** {@inheritDoc} */
         @Override
         public String[] getValues() {
             return VALUES;
         }
+
         private InputHandler getInputHandler() {
             return HANDLERS[getIndex()];
         }
@@ -193,19 +200,13 @@ public class Input extends Task {
      * @param msg The message to be displayed.
      */
     public void addText(final String msg) {
-        if (messageAttribute && "".equals(msg.trim())) {
+        if (messageAttribute && msg.trim().isEmpty()) {
             return;
         }
         message += getProject().replaceProperties(msg);
     }
 
     /**
-     * No arg constructor.
-     */
-    public Input () {
-    }
-
-    /**
      * Actual method executed by ant.
      * @throws BuildException on error
      */
@@ -220,7 +221,7 @@ public class Input extends Task {
 
         InputRequest request = null;
         if (validargs != null) {
-            final Vector<String> accept = StringUtils.split(validargs, ',');
+            final List<String> accept = StringUtils.split(validargs, ',');
             request = new MultipleChoiceInputRequest(message, accept);
         } else {
             request = new InputRequest(message);
@@ -234,7 +235,7 @@ public class Input extends Task {
         h.handleInput(request);
 
         String value = request.getInput();
-        if ((value == null || value.trim().length() == 0)
+        if ((value == null || value.trim().isEmpty())
             && defaultvalue != null) {
             value = defaultvalue;
         }

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/JDBCTask.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/JDBCTask.java b/src/main/org/apache/tools/ant/taskdefs/JDBCTask.java
index 2ca6e22..3674586 100644
--- a/src/main/org/apache/tools/ant/taskdefs/JDBCTask.java
+++ b/src/main/org/apache/tools/ant/taskdefs/JDBCTask.java
@@ -24,7 +24,6 @@ import java.sql.Driver;
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Hashtable;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Locale;
 import java.util.Properties;
@@ -98,7 +97,7 @@ public abstract class JDBCTask extends Task {
      * getting an OutOfMemoryError when calling this task
      * multiple times in a row.
      */
-    private static Hashtable<String, AntClassLoader> LOADER_MAP = new Hashtable<String, AntClassLoader>(HASH_TABLE_SIZE);
+    private static Hashtable<String, AntClassLoader> LOADER_MAP = new Hashtable<>(HASH_TABLE_SIZE);
 
     private boolean caching = true;
 
@@ -152,7 +151,7 @@ public abstract class JDBCTask extends Task {
      *
      * @since Ant 1.8.0
      */
-    private List<Property> connectionProperties = new ArrayList<Property>();
+    private List<Property> connectionProperties = new ArrayList<>();
 
     /**
      * Sets the classpath for loading the driver.
@@ -342,20 +341,17 @@ public abstract class JDBCTask extends Task {
             throw new BuildException("Url attribute must be set!", getLocation());
         }
         try {
-
             log("connecting to " + getUrl(), Project.MSG_VERBOSE);
             Properties info = new Properties();
             info.put("user", getUserId());
             info.put("password", getPassword());
 
-            for (Iterator<Property> props = connectionProperties.iterator();
-                 props.hasNext();) {
-                Property p = props.next();
-                String name = p.getName();
-                String value = p.getValue();
+            for (Property p : connectionProperties) {
+            String name = p.getName();
+            String value = p.getValue();
                 if (name == null || value == null) {
-                    log("Only name/value pairs are supported as connection"
-                        + " properties.", Project.MSG_WARN);
+                    log("Only name/value pairs are supported as connection properties.",
+                        Project.MSG_WARN);
                 } else {
                     log("Setting connection property " + name + " to " + value,
                         Project.MSG_VERBOSE);
@@ -374,14 +370,12 @@ public abstract class JDBCTask extends Task {
             return conn;
         } catch (SQLException e) {
             // failed to connect
-            if (!failOnConnectionError) {
-                log("Failed to connect: " + e.getMessage(), Project.MSG_WARN);
-                return null;
-            } else {
+            if (failOnConnectionError) {
                 throw new BuildException(e, getLocation());
             }
+            log("Failed to connect: " + e.getMessage(), Project.MSG_WARN);
+            return null;
         }
-
     }
 
     /**
@@ -395,9 +389,9 @@ public abstract class JDBCTask extends Task {
             throw new BuildException("Driver attribute must be set!", getLocation());
         }
 
-        Driver driverInstance = null;
+        Driver driverInstance;
         try {
-            Class<?> dc;
+            Class<? extends Driver> dc;
             if (classpath != null) {
                 // check first that it is not already loaded otherwise
                 // consecutive runs seems to end into an OutOfMemoryError
@@ -423,13 +417,13 @@ public abstract class JDBCTask extends Task {
                                 Project.MSG_VERBOSE);
                     }
                 }
-                dc = loader.loadClass(driver);
+                dc = loader.loadClass(driver).asSubclass(Driver.class);
             } else {
                 log("Loading " + driver + " using system loader.",
                     Project.MSG_VERBOSE);
-                dc = Class.forName(driver);
+                dc = Class.forName(driver).asSubclass(Driver.class);
             }
-            driverInstance = (Driver) dc.newInstance();
+            driverInstance = dc.newInstance();
         } catch (ClassNotFoundException e) {
             throw new BuildException(
                     "Class Not Found: JDBC driver " + driver + " could not be loaded",
@@ -449,7 +443,6 @@ public abstract class JDBCTask extends Task {
         return driverInstance;
     }
 
-
     /**
      * Set the caching attribute.
      * @param value a <code>boolean</code> value

http://git-wip-us.apache.org/repos/asf/ant/blob/b7d1e9bd/src/main/org/apache/tools/ant/taskdefs/Jar.java
----------------------------------------------------------------------
diff --git a/src/main/org/apache/tools/ant/taskdefs/Jar.java b/src/main/org/apache/tools/ant/taskdefs/Jar.java
index 7902075..26f844c 100644
--- a/src/main/org/apache/tools/ant/taskdefs/Jar.java
+++ b/src/main/org/apache/tools/ant/taskdefs/Jar.java
@@ -28,6 +28,7 @@ import java.io.OutputStreamWriter;
 import java.io.PrintWriter;
 import java.io.Reader;
 import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
 import java.nio.file.Files;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -35,6 +36,8 @@ import java.util.Comparator;
 import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+import java.util.SortedMap;
 import java.util.StringTokenizer;
 import java.util.TreeMap;
 import java.util.Vector;
@@ -74,7 +77,7 @@ public class Jar extends Zip {
     /**
      * List of all known SPI Services
      */
-    private List<Service> serviceList = new ArrayList<Service>();
+    private List<Service> serviceList = new ArrayList<>();
 
     /** merged manifests added through addConfiguredManifest */
     private Manifest configuredManifest;
@@ -138,7 +141,7 @@ public class Jar extends Zip {
      *
      * @since Ant 1.6
      */
-    private Vector<String> rootEntries;
+    private List<String> rootEntries;
 
     /**
      * Path containing jars that shall be indexed in addition to this archive.
@@ -182,7 +185,7 @@ public class Jar extends Zip {
         emptyBehavior = "create";
         setEncoding("UTF8");
         setZip64Mode(Zip64ModeAttribute.NEVER);
-        rootEntries = new Vector<String>();
+        rootEntries = new Vector<>();
     }
 
     /**
@@ -190,6 +193,7 @@ public class Jar extends Zip {
      * @param we not used
      * @ant.attribute ignore="true"
      */
+    @Override
     public void setWhenempty(WhenEmpty we) {
         log("JARs are never empty, they contain at least a manifest file",
             Project.MSG_WARN);
@@ -225,6 +229,7 @@ public class Jar extends Zip {
      * @deprecated since 1.5.x.
      *             Use setDestFile(File) instead.
      */
+    @Deprecated
     public void setJarfile(File jarFile) {
         setDestFile(jarFile);
     }
@@ -301,29 +306,13 @@ public class Jar extends Zip {
     }
 
     private Manifest getManifest(File manifestFile) {
-
-        Manifest newManifest = null;
-        InputStream fis = null;
-        InputStreamReader isr = null;
-        try {
-            fis = Files.newInputStream(manifestFile.toPath());
-            if (manifestEncoding == null) {
-                isr = new InputStreamReader(fis);
-            } else {
-                isr = new InputStreamReader(fis, manifestEncoding);
-            }
-            newManifest = getManifest(isr);
-        } catch (UnsupportedEncodingException e) {
-            throw new BuildException("Unsupported encoding while reading manifest: "
-                                     + e.getMessage(), e);
+        try (InputStreamReader isr = new InputStreamReader(
+            Files.newInputStream(manifestFile.toPath()), getManifestCharset())) {
+            return getManifest(isr);
         } catch (IOException e) {
             throw new BuildException("Unable to read manifest file: "
-                                     + manifestFile
-                                     + " (" + e.getMessage() + ")", e);
-        } finally {
-            FileUtils.close(isr);
+                + manifestFile + " (" + e.getMessage() + ")", e);
         }
-        return newManifest;
     }
 
     /**
@@ -332,32 +321,27 @@ public class Jar extends Zip {
      * @since Ant 1.5.2
      */
     private Manifest getManifestFromJar(File jarFile) throws IOException {
-        ZipFile zf = null;
-        try {
-            zf = new ZipFile(jarFile);
+        try (ZipFile zf = new ZipFile(jarFile)) {
 
             // must not use getEntry as "well behaving" applications
             // must accept the manifest in any capitalization
             Enumeration<? extends ZipEntry> e = zf.entries();
             while (e.hasMoreElements()) {
                 ZipEntry ze = e.nextElement();
-                if (ze.getName().equalsIgnoreCase(MANIFEST_NAME)) {
-                    InputStreamReader isr =
-                        new InputStreamReader(zf.getInputStream(ze), "UTF-8");
-                    return getManifest(isr);
+                if (MANIFEST_NAME.equalsIgnoreCase(ze.getName())) {
+                    try (InputStreamReader isr =
+                        new InputStreamReader(zf.getInputStream(ze), "UTF-8")) {
+                        return getManifest(isr);
+                    }
                 }
             }
             return null;
-        } finally {
-            FileUtils.close(zf);
         }
     }
 
     private Manifest getManifest(Reader r) {
-
-        Manifest newManifest = null;
         try {
-            newManifest = new Manifest(r);
+            return new Manifest(r);
         } catch (ManifestException e) {
             log("Manifest is invalid: " + e.getMessage(), Project.MSG_ERR);
             throw new BuildException("Invalid Manifest: " + manifestFile,
@@ -366,23 +350,18 @@ public class Jar extends Zip {
             throw new BuildException("Unable to read manifest file"
                                      + " (" + e.getMessage() + ")", e);
         }
-        return newManifest;
     }
 
     private boolean jarHasIndex(File jarFile) throws IOException {
-        ZipFile zf = null;
-        try {
-            zf = new ZipFile(jarFile);
+        try (ZipFile zf = new ZipFile(jarFile)) {
             Enumeration<? extends ZipEntry> e = zf.entries();
             while (e.hasMoreElements()) {
                 ZipEntry ze = e.nextElement();
-                if (ze.getName().equalsIgnoreCase(INDEX_NAME)) {
+                if (INDEX_NAME.equalsIgnoreCase(ze.getName())) {
                     return true;
                 }
             }
             return false;
-        } finally {
-            FileUtils.close(zf);
         }
     }
 
@@ -404,7 +383,7 @@ public class Jar extends Zip {
         mergeManifestsMain = config != null && "merge".equals(config.getValue());
 
         if (filesetManifestConfig != null
-            && !filesetManifestConfig.getValue().equals("skip")) {
+            && !"skip".equals(filesetManifestConfig.getValue())) {
 
             doubleFilePass = true;
         }
@@ -449,19 +428,12 @@ public class Jar extends Zip {
      */
     private void writeServices(ZipOutputStream zOut) throws IOException {
         for (Service service : serviceList) {
-           InputStream is = null;
-           try {
-               is = service.getAsStream();
-               //stolen from writeManifest
+            try (InputStream is = service.getAsStream()) {
+                //stolen from writeManifest
                super.zipFile(is, zOut,
                              "META-INF/services/" + service.getType(),
                              System.currentTimeMillis(), null,
                              ZipFileSet.DEFAULT_FILE_MODE);
-           } finally {
-               // technically this is unnecessary since
-               // Service.getAsStream returns a ByteArrayInputStream
-               // and not closing it wouldn't do any harm.
-               FileUtils.close(is);
            }
         }
     }
@@ -491,6 +463,7 @@ public class Jar extends Zip {
      * @throws IOException on I/O errors
      * @throws BuildException on other errors
      */
+    @Override
     protected void initZipOutputStream(ZipOutputStream zOut)
         throws IOException, BuildException {
 
@@ -504,12 +477,10 @@ public class Jar extends Zip {
     private Manifest createManifest()
         throws BuildException {
         try {
-            if (manifest == null) {
-                if (manifestFile != null) {
-                    // if we haven't got the manifest yet, attempt to
-                    // get it now and have manifest be the final merge
-                    manifest = getManifest(manifestFile);
-                }
+            if (manifest == null && manifestFile != null) {
+                // if we haven't got the manifest yet, attempt to
+                // get it now and have manifest be the final merge
+                manifest = getManifest(manifestFile);
             }
 
             // fileset manifest must come even before the default
@@ -598,6 +569,7 @@ public class Jar extends Zip {
      * @throws IOException on I/O errors
      * @throws BuildException on other errors
      */
+    @Override
     protected void finalizeZipOutputStream(ZipOutputStream zOut)
         throws IOException, BuildException {
 
@@ -667,14 +639,10 @@ public class Jar extends Zip {
             throw new IOException("Encountered an error writing jar index");
         }
         writer.close();
-        ByteArrayInputStream bais =
-            new ByteArrayInputStream(baos.toByteArray());
-        try {
+        try (ByteArrayInputStream bais =
+            new ByteArrayInputStream(baos.toByteArray())) {
             super.zipFile(bais, zOut, INDEX_NAME, System.currentTimeMillis(),
                           null, ZipFileSet.DEFAULT_FILE_MODE);
-        } finally {
-            // not really required
-            FileUtils.close(bais);
         }
     }
 
@@ -690,6 +658,7 @@ public class Jar extends Zip {
      * @param mode the Unix permissions to set.
      * @throws IOException on error
      */
+    @Override
     protected void zipFile(InputStream is, ZipOutputStream zOut, String vPath,
                            long lastModified, File fromArchive, int mode)
         throws IOException {
@@ -703,8 +672,8 @@ public class Jar extends Zip {
                            + " be replaced by a newly generated one.",
                            Project.MSG_WARN);
         } else {
-            if (index && vPath.indexOf("/") == -1) {
-                rootEntries.addElement(vPath);
+            if (index && vPath.indexOf('/') == -1) {
+                rootEntries.add(vPath);
             }
             super.zipFile(is, zOut, vPath, lastModified, fromArchive, mode);
         }
@@ -715,40 +684,29 @@ public class Jar extends Zip {
             // If this is the same name specified in 'manifest', this
             // is the manifest to use
             log("Found manifest " + file, Project.MSG_VERBOSE);
-            try {
-                if (is != null) {
-                    InputStreamReader isr;
-                    if (manifestEncoding == null) {
-                        isr = new InputStreamReader(is);
-                    } else {
-                        isr = new InputStreamReader(is, manifestEncoding);
-                    }
+            if (is == null) {
+                manifest = getManifest(file);
+            } else {
+                try (InputStreamReader isr =
+                    new InputStreamReader(is, getManifestCharset())) {
                     manifest = getManifest(isr);
-                } else {
-                    manifest = getManifest(file);
                 }
-            } catch (UnsupportedEncodingException e) {
-                throw new BuildException("Unsupported encoding while reading "
-                    + "manifest: " + e.getMessage(), e);
             }
         } else if (filesetManifestConfig != null
-                    && !filesetManifestConfig.getValue().equals("skip")) {
+                    && !"skip".equals(filesetManifestConfig.getValue())) {
             // we add this to our group of fileset manifests
             logWhenWriting("Found manifest to merge in file " + file,
                            Project.MSG_VERBOSE);
 
             try {
-                Manifest newManifest = null;
-                if (is != null) {
-                    InputStreamReader isr;
-                    if (manifestEncoding == null) {
-                        isr = new InputStreamReader(is);
-                    } else {
-                        isr = new InputStreamReader(is, manifestEncoding);
-                    }
-                    newManifest = getManifest(isr);
-                } else {
+                Manifest newManifest;
+                if (is == null) {
                     newManifest = getManifest(file);
+                } else {
+                    try (InputStreamReader isr =
+                        new InputStreamReader(is, getManifestCharset())) {
+                        newManifest = getManifest(isr);
+                    }
                 }
 
                 if (filesetManifest == null) {
@@ -804,6 +762,7 @@ public class Jar extends Zip {
      *
      * @exception BuildException if it likes
      */
+    @Override
     protected ArchiveState getResourcesToAdd(ResourceCollection[] rcs,
                                              File zipFile,
                                              boolean needsUpdate)
@@ -874,33 +833,32 @@ public class Jar extends Zip {
      * @return true for historic reasons
      * @throws BuildException on error
      */
+    @Override
     protected boolean createEmptyZip(File zipFile) throws BuildException {
         if (!createEmpty) {
             return true;
         }
 
-        if (emptyBehavior.equals("skip")) {
+        if ("skip".equals(emptyBehavior)) {
             if (!skipWriting) {
                 log("Warning: skipping " + archiveType + " archive "
                     + zipFile + " because no files were included.",
                     Project.MSG_WARN);
             }
             return true;
-        } else if (emptyBehavior.equals("fail")) {
+        }
+        if ("fail".equals(emptyBehavior)) {
             throw new BuildException("Cannot create " + archiveType
                                      + " archive " + zipFile
                                      + ": no files were included.",
                                      getLocation());
         }
 
-        ZipOutputStream zOut = null;
-        try {
-            if (!skipWriting) {
-                log("Building MANIFEST-only jar: "
+        if (!skipWriting) {
+            log("Building MANIFEST-only jar: "
                     + getDestFile().getAbsolutePath());
-            }
-            zOut = new ZipOutputStream(getDestFile());
-
+        }
+        try (ZipOutputStream zOut = new ZipOutputStream(getDestFile())) {
             zOut.setEncoding(getEncoding());
             zOut.setUseZip64(getZip64Mode().getMode());
             if (isCompress()) {
@@ -915,8 +873,6 @@ public class Jar extends Zip {
                                      + " (" + ioe.getMessage() + ")", ioe,
                                      getLocation());
         } finally {
-            // Close the output stream.
-            FileUtils.close(zOut);
             createEmpty = false;
         }
         return true;
@@ -928,6 +884,7 @@ public class Jar extends Zip {
      *
      * @see Zip#cleanUp
      */
+    @Override
     protected void cleanUp() {
         super.cleanUp();
         checkJarSpec();
@@ -939,7 +896,7 @@ public class Jar extends Zip {
             filesetManifest = null;
             originalManifest = null;
         }
-        rootEntries.removeAllElements();
+        rootEntries.clear();
     }
 
     // CheckStyle:LineLength OFF - Link is too long.
@@ -950,7 +907,7 @@ public class Jar extends Zip {
     // CheckStyle:LineLength ON
     private void checkJarSpec() {
         String br = System.getProperty("line.separator");
-        StringBuffer message = new StringBuffer();
+        StringBuilder message = new StringBuilder();
         Section mainSection = (configuredManifest == null)
                             ? null
                             : configuredManifest.getMainSection();
@@ -975,11 +932,10 @@ public class Jar extends Zip {
             message.append(br);
             message.append("Location: ").append(getLocation());
             message.append(br);
-            if (strict.getValue().equalsIgnoreCase("fail")) {
+            if ("fail".equalsIgnoreCase(strict.getValue())) {
                 throw new BuildException(message.toString(), getLocation());
-            } else {
-                logWhenWriting(message.toString(), strict.getLogLevel());
             }
+            logWhenWriting(message.toString(), strict.getLogLevel());
         }
     }
 
@@ -990,6 +946,7 @@ public class Jar extends Zip {
      *
      * @since 1.44, Ant 1.5
      */
+    @Override
     public void reset() {
         super.reset();
         emptyBehavior = "create";
@@ -1008,8 +965,9 @@ public class Jar extends Zip {
          * Get the list of valid strings.
          * @return the list of values - "skip", "merge" and "mergewithoutmain"
          */
+        @Override
         public String[] getValues() {
-            return new String[] {"skip", "merge", "mergewithoutmain"};
+            return new String[] { "skip", "merge", "mergewithoutmain" };
         }
     }
 
@@ -1056,9 +1014,7 @@ public class Jar extends Zip {
             writer.println(dir);
         }
 
-        for (String file : files) {
-            writer.println(file);
-        }
+        files.forEach(writer::println);
     }
 
     /**
@@ -1084,39 +1040,27 @@ public class Jar extends Zip {
     protected static String findJarName(String fileName,
                                               String[] classpath) {
         if (classpath == null) {
-            return (new File(fileName)).getName();
+            return new File(fileName).getName();
         }
         fileName = fileName.replace(File.separatorChar, '/');
-        TreeMap<String, String> matches = new TreeMap<String, String>(new Comparator<Object>() {
-                // longest match comes first
-                public int compare(Object o1, Object o2) {
-                    if (o1 instanceof String && o2 instanceof String) {
-                        return ((String) o2).length()
-                            - ((String) o1).length();
-                    }
-                    return 0;
+        SortedMap<String, String> matches = new TreeMap<>(Comparator
+            .<String> comparingInt(s -> s == null ? 0 : s.length()).reversed());
+
+        for (String element : classpath) {
+            String candidate = element;
+            while (true) {
+                if (fileName.endsWith(candidate)) {
+                    matches.put(candidate, element);
+                    break;
                 }
-            });
-
-        for (int i = 0; i < classpath.length; i++) {
-            if (fileName.endsWith(classpath[i])) {
-                matches.put(classpath[i], classpath[i]);
-            } else {
-                int slash = classpath[i].indexOf("/");
-                String candidate = classpath[i];
-                while (slash > -1) {
-                    candidate = candidate.substring(slash + 1);
-                    if (fileName.endsWith(candidate)) {
-                        matches.put(candidate, classpath[i]);
-                        break;
-                    }
-                    slash = candidate.indexOf("/");
+                int slash = candidate.indexOf('/');
+                if (slash < 0) {
+                    break;
                 }
+                candidate = candidate.substring(slash + 1);
             }
         }
-
-        return matches.size() == 0
-            ? null : (String) matches.get(matches.firstKey());
+        return matches.isEmpty() ? null : matches.get(matches.firstKey());
     }
 
     /**
@@ -1133,21 +1077,21 @@ public class Jar extends Zip {
         throws IOException {
         try (org.apache.tools.zip.ZipFile zf = new org.apache.tools.zip.ZipFile(file, "utf-8")) {
             Enumeration<org.apache.tools.zip.ZipEntry> entries = zf.getEntries();
-            HashSet<String> dirSet = new HashSet<String>();
+            Set<String> dirSet = new HashSet<>();
             while (entries.hasMoreElements()) {
                 org.apache.tools.zip.ZipEntry ze =
                     entries.nextElement();
                 String name = ze.getName();
                 if (ze.isDirectory()) {
                     dirSet.add(name);
-                } else if (name.indexOf("/") == -1) {
+                } else if (name.indexOf('/') == -1) {
                     files.add(name);
                 } else {
                     // a file, not in the root
                     // since the jar may be one without directory
                     // entries, add the parent dir of this file as
                     // well.
-                    dirSet.add(name.substring(0, name.lastIndexOf("/") + 1));
+                    dirSet.add(name.substring(0, name.lastIndexOf('/') + 1));
                 }
             }
             dirs.addAll(dirSet);
@@ -1157,13 +1101,12 @@ public class Jar extends Zip {
     private Resource[][] grabManifests(ResourceCollection[] rcs) {
         Resource[][] manifests = new Resource[rcs.length][];
         for (int i = 0; i < rcs.length; i++) {
-            Resource[][] resources = null;
+            Resource[][] resources;
             if (rcs[i] instanceof FileSet) {
-                resources = grabResources(new FileSet[] {(FileSet) rcs[i]});
+                resources = grabResources(new FileSet[] { (FileSet) rcs[i] });
             } else {
-                resources = grabNonFileSetResources(new ResourceCollection[] {
-                        rcs[i]
-                    });
+                resources = grabNonFileSetResources(
+                    new ResourceCollection[] { rcs[i] });
             }
             for (int j = 0; j < resources[0].length; j++) {
                 String name = resources[0][j].getName().replace('\\', '/');
@@ -1179,7 +1122,7 @@ public class Jar extends Zip {
                         name = prefix + name;
                     }
                 }
-                if (name.equalsIgnoreCase(MANIFEST_NAME)) {
+                if (MANIFEST_NAME.equalsIgnoreCase(name)) {
                     manifests[i] = new Resource[] {resources[0][j]};
                     break;
                 }
@@ -1191,11 +1134,26 @@ public class Jar extends Zip {
         return manifests;
     }
 
+    private Charset getManifestCharset() {
+        if (manifestEncoding == null) {
+            return Charset.defaultCharset();
+        }
+        try {
+            return Charset.forName(manifestEncoding);
+        } catch (IllegalArgumentException e) {
+            throw new BuildException(
+                "Unsupported encoding while reading manifest: "
+                    + e.getMessage(),
+                e);
+        }
+    }
+
     /** The strict enumerated type. */
     public static class StrictMode extends EnumeratedAttribute {
         /** Public no arg constructor. */
         public StrictMode() {
         }
+
         /**
          * Constructor with an arg.
          * @param value the enumerated value as a string.
@@ -1203,18 +1161,21 @@ public class Jar extends Zip {
         public StrictMode(String value) {
             setValue(value);
         }
+
         /**
          * Get List of valid strings.
          * @return the list of values.
          */
+        @Override
         public String[] getValues() {
-            return new String[]{"fail", "warn", "ignore"};
+            return new String[] { "fail", "warn", "ignore" };
         }
+
         /**
          * @return The log level according to the strict mode.
          */
         public int getLogLevel() {
-            return (getValue().equals("ignore")) ? Project.MSG_VERBOSE : Project.MSG_WARN;
+            return "ignore".equals(getValue()) ? Project.MSG_VERBOSE : Project.MSG_WARN;
         }
     }
 }