| @@ -490,19 +490,13 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener { | |||
| + pathComponent.lastModified() + "-" + pathComponent.length(); | |||
| String classpath = pathMap.get(absPathPlusTimeAndLength); | |||
| if (classpath == null) { | |||
| JarFile jarFile = null; | |||
| try { | |||
| jarFile = new JarFile(pathComponent); | |||
| try (JarFile jarFile = new JarFile(pathComponent)) { | |||
| final Manifest manifest = jarFile.getManifest(); | |||
| if (manifest == null) { | |||
| return; | |||
| } | |||
| classpath = manifest.getMainAttributes() | |||
| .getValue(Attributes.Name.CLASS_PATH); | |||
| } finally { | |||
| if (jarFile != null) { | |||
| jarFile.close(); | |||
| } | |||
| } | |||
| if (classpath == null) { | |||
| classpath = ""; | |||
| @@ -1602,8 +1596,7 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener { | |||
| } | |||
| private static boolean readFully(final File f, final byte[] b) throws IOException { | |||
| final FileInputStream fis = new FileInputStream(f); | |||
| try { | |||
| try (FileInputStream fis = new FileInputStream(f)) { | |||
| final int len = b.length; | |||
| int count = 0, x = 0; | |||
| while (count != len) { | |||
| @@ -1614,8 +1607,6 @@ public class AntClassLoader extends ClassLoader implements SubBuildListener { | |||
| count += x; | |||
| } | |||
| return count == len; | |||
| } finally { | |||
| fis.close(); | |||
| } | |||
| } | |||
| @@ -349,13 +349,7 @@ public class Jar extends Zip { | |||
| } | |||
| return null; | |||
| } finally { | |||
| if (zf != null) { | |||
| try { | |||
| zf.close(); | |||
| } catch (IOException e) { | |||
| // TODO - log an error? throw an exception? | |||
| } | |||
| } | |||
| FileUtils.close(zf); | |||
| } | |||
| } | |||
| @@ -388,13 +382,7 @@ public class Jar extends Zip { | |||
| } | |||
| return false; | |||
| } finally { | |||
| if (zf != null) { | |||
| try { | |||
| zf.close(); | |||
| } catch (IOException e) { | |||
| // TODO - log an error? throw an exception? | |||
| } | |||
| } | |||
| FileUtils.close(zf); | |||
| } | |||
| } | |||
| @@ -1144,9 +1132,7 @@ public class Jar extends Zip { | |||
| protected static void grabFilesAndDirs(String file, List<String> dirs, | |||
| List<String> files) | |||
| throws IOException { | |||
| org.apache.tools.zip.ZipFile zf = null; | |||
| try { | |||
| zf = new org.apache.tools.zip.ZipFile(file, "utf-8"); | |||
| 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>(); | |||
| while (entries.hasMoreElements()) { | |||
| @@ -1166,10 +1152,6 @@ public class Jar extends Zip { | |||
| } | |||
| } | |||
| dirs.addAll(dirSet); | |||
| } finally { | |||
| if (zf != null) { | |||
| zf.close(); | |||
| } | |||
| } | |||
| } | |||
| @@ -1420,8 +1420,7 @@ public class Javac extends MatchingTask { | |||
| continue; | |||
| } | |||
| log("Creating empty " + pkgInfoClass); | |||
| final OutputStream os = new FileOutputStream(pkgInfoClass); | |||
| try { | |||
| try (OutputStream os = new FileOutputStream(pkgInfoClass)) { | |||
| os.write(PACKAGE_INFO_CLASS_HEADER); | |||
| final byte[] name = pkg.getBytes("UTF-8"); | |||
| final int length = name.length + /* "/package-info" */ 13; | |||
| @@ -1429,8 +1428,6 @@ public class Javac extends MatchingTask { | |||
| os.write((byte) length % 256); | |||
| os.write(name); | |||
| os.write(PACKAGE_INFO_CLASS_FOOTER); | |||
| } finally { | |||
| os.close(); | |||
| } | |||
| } | |||
| } | |||
| @@ -177,11 +177,8 @@ public abstract class Pack extends Task { | |||
| */ | |||
| protected void zipResource(Resource resource, OutputStream zOut) | |||
| throws IOException { | |||
| InputStream rIn = resource.getInputStream(); | |||
| try { | |||
| try (InputStream rIn = resource.getInputStream()) { | |||
| zipFile(rIn, zOut); | |||
| } finally { | |||
| rIn.close(); | |||
| } | |||
| } | |||
| @@ -533,13 +533,8 @@ public class Property extends Task { | |||
| Properties props = new Properties(); | |||
| log("Loading " + url, Project.MSG_VERBOSE); | |||
| try { | |||
| InputStream is = url.openStream(); | |||
| try { | |||
| try (InputStream is = url.openStream()) { | |||
| loadProperties(props, is, url.getFile().endsWith(".xml")); | |||
| } finally { | |||
| if (is != null) { | |||
| is.close(); | |||
| } | |||
| } | |||
| addProperties(props); | |||
| } catch (IOException ex) { | |||
| @@ -354,7 +354,7 @@ public class Replace extends MatchingTask { | |||
| * a StringBuffer. Compatible with the Replacefilter. | |||
| * @since 1.7 | |||
| */ | |||
| private class FileInput /* JDK 5: implements Closeable */ { | |||
| private class FileInput implements AutoCloseable { | |||
| private StringBuffer outputBuffer; | |||
| private final InputStream is; | |||
| private Reader reader; | |||
| @@ -418,7 +418,7 @@ public class Replace extends MatchingTask { | |||
| * Replacefilter. | |||
| * @since 1.7 | |||
| */ | |||
| private class FileOutput /* JDK 5: implements Closeable */ { | |||
| private class FileOutput implements AutoCloseable { | |||
| private StringBuffer inputBuffer; | |||
| private final OutputStream os; | |||
| private Writer writer; | |||
| @@ -667,10 +667,8 @@ public class Replace extends MatchingTask { | |||
| File temp = FILE_UTILS.createTempFile("rep", ".tmp", | |||
| src.getParentFile(), false, true); | |||
| try { | |||
| FileInput in = new FileInput(src); | |||
| try { | |||
| FileOutput out = new FileOutput(temp); | |||
| try { | |||
| try (FileInput in = new FileInput(src); | |||
| FileOutput out = new FileOutput(temp)) { | |||
| out.setInputBuffer(buildFilterChain(in.getOutputBuffer())); | |||
| while (in.readChunk()) { | |||
| @@ -682,11 +680,6 @@ public class Replace extends MatchingTask { | |||
| flushFilterChain(); | |||
| out.flush(); | |||
| } finally { | |||
| out.close(); | |||
| } | |||
| } finally { | |||
| in.close(); | |||
| } | |||
| boolean changes = (replaceCount != repCountStart); | |||
| if (changes) { | |||
| @@ -834,13 +834,7 @@ public class SQLExec extends JDBCTask { | |||
| throw e; | |||
| } | |||
| } finally { | |||
| if (resultSet != null) { | |||
| try { | |||
| resultSet.close(); | |||
| } catch (SQLException e) { | |||
| //ignore | |||
| } | |||
| } | |||
| FileUtils.close(resultSet); | |||
| } | |||
| } | |||
| @@ -854,13 +848,8 @@ public class SQLExec extends JDBCTask { | |||
| */ | |||
| @Deprecated | |||
| protected void printResults(PrintStream out) throws SQLException { | |||
| ResultSet rs = getStatement().getResultSet(); | |||
| try { | |||
| try (ResultSet rs = getStatement().getResultSet()) { | |||
| printResults(rs, out); | |||
| } finally { | |||
| if (rs != null) { | |||
| rs.close(); | |||
| } | |||
| } | |||
| } | |||
| @@ -1911,14 +1911,11 @@ public class Zip extends MatchingTask { | |||
| getLocation()); | |||
| } | |||
| final FileInputStream fIn = new FileInputStream(file); | |||
| try { | |||
| try (FileInputStream fIn = new FileInputStream(file)) { | |||
| // ZIPs store time with a granularity of 2 seconds, round up | |||
| zipFile(fIn, zOut, vPath, | |||
| file.lastModified() + (roundUp ? ROUNDUP_MILLIS : 0), | |||
| null, mode); | |||
| } finally { | |||
| fIn.close(); | |||
| } | |||
| } | |||
| @@ -126,17 +126,13 @@ public class Message extends ProjectComponent { | |||
| : new BufferedWriter(new OutputStreamWriter(ps)); | |||
| if (messageSource != null) { | |||
| // Read message from a file | |||
| Reader freader = getReader(messageSource); | |||
| try { | |||
| BufferedReader in = new BufferedReader(freader); | |||
| try (Reader freader = getReader(messageSource); | |||
| BufferedReader in = new BufferedReader(freader)) { | |||
| String line = null; | |||
| while ((line = in.readLine()) != null) { | |||
| out.write(getProject().replaceProperties(line)); | |||
| out.newLine(); | |||
| } | |||
| } finally { | |||
| freader.close(); | |||
| } | |||
| } else { | |||
| out.write(getProject().replaceProperties(buffer.substring(0))); | |||
| @@ -147,16 +147,13 @@ class PlainMailer extends Mailer { | |||
| int length; | |||
| final int maxBuf = 1024; | |||
| byte[] buf = new byte[maxBuf]; | |||
| FileInputStream finstr = new FileInputStream(file); | |||
| try { | |||
| BufferedInputStream in = new BufferedInputStream(finstr, buf.length); | |||
| try (FileInputStream finstr = new FileInputStream(file); | |||
| BufferedInputStream in = new BufferedInputStream(finstr, buf.length)) { | |||
| while ((length = in.read(buf)) != -1) { | |||
| out.write(buf, 0, length); | |||
| } | |||
| } finally { | |||
| finstr.close(); | |||
| } | |||
| } | |||
| @@ -40,16 +40,11 @@ class UUMailer extends PlainMailer { | |||
| + "readable."); | |||
| } | |||
| FileInputStream finstr = new FileInputStream(file); | |||
| try { | |||
| BufferedInputStream in = new BufferedInputStream(finstr); | |||
| try (FileInputStream finstr = new FileInputStream(file); | |||
| BufferedInputStream in = new BufferedInputStream(finstr)) { | |||
| UUEncoder encoder = new UUEncoder(file.getName()); | |||
| encoder.encode(in, out); | |||
| } finally { | |||
| finstr.close(); | |||
| } | |||
| } | |||
| } | |||
| @@ -192,27 +192,16 @@ public class PropertyFile extends Task { | |||
| if (propertyfile.exists()) { | |||
| log("Updating property file: " | |||
| + propertyfile.getAbsolutePath()); | |||
| FileInputStream fis = null; | |||
| try { | |||
| fis = new FileInputStream(propertyfile); | |||
| BufferedInputStream bis = new BufferedInputStream(fis); | |||
| try (FileInputStream fis = new FileInputStream(propertyfile); | |||
| BufferedInputStream bis = new BufferedInputStream(fis)) { | |||
| properties.load(bis); | |||
| } finally { | |||
| if (fis != null) { | |||
| fis.close(); | |||
| } | |||
| } | |||
| } else { | |||
| log("Creating new property file: " | |||
| + propertyfile.getAbsolutePath()); | |||
| FileOutputStream out = null; | |||
| try { | |||
| out = new FileOutputStream(propertyfile.getAbsolutePath()); | |||
| try (FileOutputStream out = | |||
| new FileOutputStream(propertyfile.getAbsolutePath())) { | |||
| out.flush(); | |||
| } finally { | |||
| if (out != null) { | |||
| out.close(); | |||
| } | |||
| } | |||
| } | |||
| } catch (IOException ioe) { | |||
| @@ -356,13 +356,13 @@ public class ReplaceRegExp extends Task { | |||
| try { | |||
| boolean changes = false; | |||
| InputStream is = new FileInputStream(f); | |||
| try { | |||
| Reader r = encoding != null ? new InputStreamReader(is, encoding) : new InputStreamReader(is); | |||
| OutputStream os = new FileOutputStream(temp); | |||
| try (InputStream is = new FileInputStream(f); | |||
| OutputStream os = new FileOutputStream(temp)) { | |||
| Reader r = null; | |||
| Writer w = null; | |||
| try { | |||
| Writer w = encoding != null ? new OutputStreamWriter(os, encoding) : new OutputStreamWriter(os); | |||
| r = encoding != null ? new InputStreamReader(is, encoding) : new InputStreamReader(is); | |||
| w = encoding != null ? new OutputStreamWriter(os, encoding) : new OutputStreamWriter(os); | |||
| log("Replacing pattern '" + regex.getPattern(getProject()) | |||
| + "' with '" + subs.getExpression(getProject()) | |||
| + "' in '" + f.getPath() + "'" + (byline ? " by line" : "") | |||
| @@ -426,15 +426,10 @@ public class ReplaceRegExp extends Task { | |||
| } else { | |||
| changes = multilineReplace(r, w, options); | |||
| } | |||
| r.close(); | |||
| w.close(); | |||
| } finally { | |||
| os.close(); | |||
| FileUtils.close(r); | |||
| FileUtils.close(w); | |||
| } | |||
| } finally { | |||
| is.close(); | |||
| } | |||
| if (changes) { | |||
| log("File has changed; saving the updated file", Project.MSG_VERBOSE); | |||
| @@ -293,17 +293,11 @@ public class TraXLiaison implements XSLTLiaison4, ErrorListener, XSLTLoggerAware | |||
| // and avoid keeping the handle until the object is garbaged. | |||
| // (always keep control), otherwise you won't be able to delete | |||
| // the file quickly on windows. | |||
| InputStream xslStream = null; | |||
| try { | |||
| xslStream | |||
| = new BufferedInputStream(stylesheet.getInputStream()); | |||
| try (InputStream xslStream = | |||
| new BufferedInputStream(stylesheet.getInputStream())) { | |||
| templatesModTime = stylesheet.getLastModified(); | |||
| final Source src = getSource(xslStream, stylesheet); | |||
| templates = getFactory().newTemplates(src); | |||
| } finally { | |||
| if (xslStream != null) { | |||
| xslStream.close(); | |||
| } | |||
| } | |||
| } | |||
| @@ -96,9 +96,7 @@ public class AntAnalyzer extends AbstractAnalyzer { | |||
| } | |||
| } finally { | |||
| FileUtils.close(inStream); | |||
| if (zipFile != null) { | |||
| zipFile.close(); | |||
| } | |||
| FileUtils.close(zipFile); | |||
| } | |||
| } catch (IOException ioe) { | |||
| // ignore | |||
| @@ -866,30 +866,11 @@ public class WeblogicDeploymentTool extends GenericDeploymentTool { | |||
| throw new BuildException(msg, ioe); | |||
| } finally { | |||
| // need to close files and perhaps rename output | |||
| if (genericJar != null) { | |||
| try { | |||
| genericJar.close(); | |||
| } catch (IOException closeException) { | |||
| // empty | |||
| } | |||
| } | |||
| if (wlJar != null) { | |||
| try { | |||
| wlJar.close(); | |||
| } catch (IOException closeException) { | |||
| // empty | |||
| } | |||
| } | |||
| FileUtils.close(genericJar); | |||
| FileUtils.close(wlJar); | |||
| FileUtils.close(newJarStream); | |||
| if (newJarStream != null) { | |||
| try { | |||
| newJarStream.close(); | |||
| } catch (IOException closeException) { | |||
| // empty | |||
| } | |||
| try { | |||
| FILE_UTILS.rename(newWLJarFile, weblogicJarFile); | |||
| } catch (IOException renameException) { | |||
| @@ -832,29 +832,11 @@ public class WebsphereDeploymentTool extends GenericDeploymentTool { | |||
| throw new BuildException(msg, ioe); | |||
| } finally { | |||
| // need to close files and perhaps rename output | |||
| if (genericJar != null) { | |||
| try { | |||
| genericJar.close(); | |||
| } catch (IOException closeException) { | |||
| // Ignore | |||
| } | |||
| } | |||
| if (wasJar != null) { | |||
| try { | |||
| wasJar.close(); | |||
| } catch (IOException closeException) { | |||
| // Ignore | |||
| } | |||
| } | |||
| FileUtils.close(genericJar); | |||
| FileUtils.close(wasJar); | |||
| FileUtils.close(newJarStream); | |||
| if (newJarStream != null) { | |||
| try { | |||
| newJarStream.close(); | |||
| } catch (IOException closeException) { | |||
| // Ignore | |||
| } | |||
| try { | |||
| FILE_UTILS.rename(newwasJarFile, websphereJarFile); | |||
| } catch (IOException renameException) { | |||
| @@ -168,12 +168,9 @@ public class AggregateTransformer { | |||
| protected void setXmlfile(File xmlfile) throws BuildException { | |||
| try { | |||
| DocumentBuilder builder = privateDBFactory.newDocumentBuilder(); | |||
| InputStream in = new FileInputStream(xmlfile); | |||
| try { | |||
| try (InputStream in = new FileInputStream(xmlfile)) { | |||
| Document doc = builder.parse(in); | |||
| setXmlDocument(doc); | |||
| } finally { | |||
| in.close(); | |||
| } | |||
| } catch (Exception e) { | |||
| throw new BuildException("Error while parsing document: " + xmlfile, e); | |||
| @@ -213,9 +213,8 @@ public class XMLResultAggregator extends Task implements XMLConstants { | |||
| * @throws IOException thrown if there is an error while writing the content. | |||
| */ | |||
| protected void writeDOMTree(Document doc, File file) throws IOException { | |||
| OutputStream os = new FileOutputStream(file); | |||
| try { | |||
| PrintWriter wri = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(os), "UTF8")); | |||
| try (OutputStream os = new FileOutputStream(file); | |||
| PrintWriter wri = new PrintWriter(new OutputStreamWriter(new BufferedOutputStream(os), "UTF8"))) { | |||
| wri.write("<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n"); | |||
| (new DOMElementWriter()).write(doc.getDocumentElement(), wri, 0, " "); | |||
| wri.flush(); | |||
| @@ -223,8 +222,6 @@ public class XMLResultAggregator extends Task implements XMLConstants { | |||
| if (wri.checkError()) { | |||
| throw new IOException("Error while writing DOM content"); | |||
| } | |||
| } finally { | |||
| os.close(); | |||
| } | |||
| } | |||
| @@ -495,9 +495,7 @@ public class SSHExec extends SSHBase { | |||
| */ | |||
| private void writeToFile(final String from, final boolean append, final File to) | |||
| throws IOException { | |||
| FileWriter out = null; | |||
| try { | |||
| out = new FileWriter(to.getAbsolutePath(), append); | |||
| try (FileWriter out = new FileWriter(to.getAbsolutePath(), append)) { | |||
| final StringReader in = new StringReader(from); | |||
| final char[] buffer = new char[BUFFER_SIZE]; | |||
| int bytesRead; | |||
| @@ -509,10 +507,6 @@ public class SSHExec extends SSHBase { | |||
| out.write(buffer, 0, bytesRead); | |||
| } | |||
| out.flush(); | |||
| } finally { | |||
| if (out != null) { | |||
| out.close(); | |||
| } | |||
| } | |||
| } | |||
| @@ -1445,13 +1445,7 @@ public class FileUtils { | |||
| * @param device output writer, can be null. | |||
| */ | |||
| public static void close(Writer device) { | |||
| if (null != device) { | |||
| try { | |||
| device.close(); | |||
| } catch (IOException e) { | |||
| //ignore | |||
| } | |||
| } | |||
| close((AutoCloseable) device); | |||
| } | |||
| /** | |||
| @@ -1461,13 +1455,7 @@ public class FileUtils { | |||
| * @param device Reader, can be null. | |||
| */ | |||
| public static void close(Reader device) { | |||
| if (null != device) { | |||
| try { | |||
| device.close(); | |||
| } catch (IOException e) { | |||
| //ignore | |||
| } | |||
| } | |||
| close((AutoCloseable) device); | |||
| } | |||
| /** | |||
| @@ -1477,13 +1465,7 @@ public class FileUtils { | |||
| * @param device stream, can be null. | |||
| */ | |||
| public static void close(OutputStream device) { | |||
| if (null != device) { | |||
| try { | |||
| device.close(); | |||
| } catch (IOException e) { | |||
| //ignore | |||
| } | |||
| } | |||
| close((AutoCloseable) device); | |||
| } | |||
| /** | |||
| @@ -1493,13 +1475,7 @@ public class FileUtils { | |||
| * @param device stream, can be null. | |||
| */ | |||
| public static void close(InputStream device) { | |||
| if (null != device) { | |||
| try { | |||
| device.close(); | |||
| } catch (IOException e) { | |||
| //ignore | |||
| } | |||
| } | |||
| close((AutoCloseable) device); | |||
| } | |||
| /** | |||
| @@ -1510,13 +1486,7 @@ public class FileUtils { | |||
| * @since Ant 1.8.0 | |||
| */ | |||
| public static void close(Channel device) { | |||
| if (null != device) { | |||
| try { | |||
| device.close(); | |||
| } catch (IOException e) { | |||
| //ignore | |||
| } | |||
| } | |||
| close((AutoCloseable) device); | |||
| } | |||
| /** | |||
| @@ -1543,6 +1513,24 @@ public class FileUtils { | |||
| } | |||
| } | |||
| /** | |||
| * Close an {@link AutoCloseable} without throwing any exception | |||
| * if something went wrong. Do not attempt to close it if the | |||
| * argument is null. | |||
| * | |||
| * @param ac AutoCloseable, can be null. | |||
| * @since Ant 1.10.0 | |||
| */ | |||
| public static void close(AutoCloseable ac) { | |||
| if (null != ac) { | |||
| try { | |||
| ac.close(); | |||
| } catch (Exception e) { | |||
| //ignore | |||
| } | |||
| } | |||
| } | |||
| /** | |||
| * Delete the file with {@link File#delete()} if the argument is not null. | |||
| * Do nothing on a null argument. | |||
| @@ -72,7 +72,7 @@ import java.util.zip.ZipException; | |||
| * </ul> | |||
| * | |||
| */ | |||
| public class ZipFile { | |||
| public class ZipFile implements AutoCloseable { | |||
| private static final int HASH_SIZE = 509; | |||
| static final int NIBLET_MASK = 0x0f; | |||
| static final int BYTE_SHIFT = 8; | |||