This is an automated email from the ASF dual-hosted git repository. ggregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
commit 11cf79432a8ae9c85400def9d28a1b042ed7316d Author: Gary Gregory <garydgreg...@gmail.com> AuthorDate: Sun Dec 11 01:29:20 2022 -0500 Use try-with-resources --- .../archivers/tar/TarArchiveInputStreamTest.java | 93 ++--- .../archivers/tar/TarArchiveOutputStreamTest.java | 431 ++++++++++----------- .../commons/compress/archivers/tar/TarLister.java | 20 +- 3 files changed, 251 insertions(+), 293 deletions(-) diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStreamTest.java index 7120ea5c..0c07dd0a 100644 --- a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStreamTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveInputStreamTest.java @@ -105,22 +105,20 @@ public class TarArchiveInputStreamTest extends AbstractTestCase { final String name = "1234567890123456789012345678901234567890123456789" + "01234567890123456789012345678901234567890123456789" + "01234567890\u00e4"; - final TarArchiveOutputStream tos = - new TarArchiveOutputStream(bos, encoding); - tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); - TarArchiveEntry t = new TarArchiveEntry(name); - t.setSize(1); - tos.putArchiveEntry(t); - tos.write(30); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, encoding)) { + tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + TarArchiveEntry t = new TarArchiveEntry(name); + t.setSize(1); + tos.putArchiveEntry(t); + tos.write(30); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); final ByteArrayInputStream bis = new ByteArrayInputStream(data); - final TarArchiveInputStream tis = - new TarArchiveInputStream(bis, encoding); - t = tis.getNextTarEntry(); - assertEquals(name, t.getName()); - tis.close(); + try (TarArchiveInputStream tis = new TarArchiveInputStream(bis, encoding)) { + TarArchiveEntry t = tis.getNextTarEntry(); + assertEquals(name, t.getName()); + } } /** @@ -128,35 +126,31 @@ public class TarArchiveInputStreamTest extends AbstractTestCase { */ @Test public void shouldConsumeArchiveCompletely() throws Exception { - final InputStream is = TarArchiveInputStreamTest.class - .getResourceAsStream("/archive_with_trailer.tar"); - final TarArchiveInputStream tar = new TarArchiveInputStream(is); - while (tar.getNextTarEntry() != null) { - // just consume the archive + try (InputStream is = TarArchiveInputStreamTest.class.getResourceAsStream("/archive_with_trailer.tar"); + TarArchiveInputStream tar = new TarArchiveInputStream(is)) { + while (tar.getNextTarEntry() != null) { + // just consume the archive + } + final byte[] expected = { 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n' }; + final byte[] actual = new byte[expected.length]; + is.read(actual); + assertArrayEquals(expected, actual); } - final byte[] expected = { - 'H', 'e', 'l', 'l', 'o', ',', ' ', 'w', 'o', 'r', 'l', 'd', '!', '\n' - }; - final byte[] actual = new byte[expected.length]; - is.read(actual); - assertArrayEquals(expected, actual); - tar.close(); } @Test public void readsArchiveCompletely_COMPRESS245() { - try (InputStream is = TarArchiveInputStreamTest.class - .getResourceAsStream("/COMPRESS-245.tar.gz")) { + try (InputStream is = TarArchiveInputStreamTest.class.getResourceAsStream("/COMPRESS-245.tar.gz")) { final InputStream gin = new GZIPInputStream(is); - final TarArchiveInputStream tar = new TarArchiveInputStream(gin); - int count = 0; - TarArchiveEntry entry = tar.getNextTarEntry(); - while (entry != null) { - count++; - entry = tar.getNextTarEntry(); + try (TarArchiveInputStream tar = new TarArchiveInputStream(gin)) { + int count = 0; + TarArchiveEntry entry = tar.getNextTarEntry(); + while (entry != null) { + count++; + entry = tar.getNextTarEntry(); + } + assertEquals(31, count); } - assertEquals(31, count); - tar.close(); } catch (final IOException e) { fail("COMPRESS-245: " + e.getMessage()); } @@ -185,22 +179,21 @@ public class TarArchiveInputStreamTest extends AbstractTestCase { @Test public void shouldReadBigGid() throws Exception { final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos); - tos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX); - TarArchiveEntry t = new TarArchiveEntry("name"); - t.setGroupId(4294967294L); - t.setSize(1); - tos.putArchiveEntry(t); - tos.write(30); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos)) { + tos.setBigNumberMode(TarArchiveOutputStream.BIGNUMBER_POSIX); + TarArchiveEntry t = new TarArchiveEntry("name"); + t.setGroupId(4294967294L); + t.setSize(1); + tos.putArchiveEntry(t); + tos.write(30); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); final ByteArrayInputStream bis = new ByteArrayInputStream(data); - final TarArchiveInputStream tis = - new TarArchiveInputStream(bis); - t = tis.getNextTarEntry(); - assertEquals(4294967294L, t.getLongGroupId()); - tis.close(); + try (final TarArchiveInputStream tis = new TarArchiveInputStream(bis)) { + TarArchiveEntry t = tis.getNextTarEntry(); + assertEquals(4294967294L, t.getLongGroupId()); + } } /** diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java index 6a46becb..4beeb258 100644 --- a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java @@ -66,15 +66,15 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { final TarArchiveEntry sEntry = new TarArchiveEntry(file1, file1.getName()); tarOut.putArchiveEntry(sEntry); - final InputStream in = Files.newInputStream(file1.toPath()); - final byte[] buf = new byte[8192]; + try (final InputStream in = Files.newInputStream(file1.toPath())) { + final byte[] buf = new byte[8192]; - int read = 0; - while ((read = in.read(buf)) > 0) { - tarOut.write(buf, 0, read); - } + int read = 0; + while ((read = in.read(buf)) > 0) { + tarOut.write(buf, 0, read); + } - in.close(); + } tarOut.closeArchiveEntry(); tarOut.close(); @@ -102,8 +102,9 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { final TarArchiveEntry t = new TarArchiveEntry("foo"); t.setSize(0100000000000L); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos); - assertThrows(IllegalArgumentException.class, () -> tos.putArchiveEntry(t)); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos)) { + assertThrows(IllegalArgumentException.class, () -> tos.putArchiveEntry(t)); + } } @Test @@ -117,16 +118,11 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { // make sure header is written to byte array tos.write(new byte[10 * 1024]); final byte[] data = bos.toByteArray(); - assertEquals(0x80, - data[TarConstants.NAMELEN - + TarConstants.MODELEN - + TarConstants.UIDLEN - + TarConstants.GIDLEN] & 0x80); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(0100000000000L, e.getSize()); - tin.close(); + assertEquals(0x80, data[TarConstants.NAMELEN + TarConstants.MODELEN + TarConstants.UIDLEN + TarConstants.GIDLEN] & 0x80); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals(0100000000000L, e.getSize()); + } // generates IOE because of unclosed entries. // However we don't really want to create such large entries. closeQuietly(tos); @@ -150,11 +146,10 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { + TarConstants.UIDLEN + TarConstants.GIDLEN, 12, UTF_8)); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(0100000000000L, e.getSize()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals(0100000000000L, e.getSize()); + } // generates IOE because of unclosed entries. // However we don't really want to create such large entries. closeQuietly(tos); @@ -214,43 +209,41 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { private byte[] writePaxHeader(final Map<String, String> m) throws Exception { final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.writePaxHeaders(new TarArchiveEntry("x"), "foo", m); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.writePaxHeaders(new TarArchiveEntry("x"), "foo", m); - // add a dummy entry so data gets written - final TarArchiveEntry t = new TarArchiveEntry("foo"); - t.setSize(10 * 1024); - tos.putArchiveEntry(t); - tos.write(new byte[10 * 1024]); - tos.closeArchiveEntry(); - tos.close(); + // add a dummy entry so data gets written + final TarArchiveEntry t = new TarArchiveEntry("foo"); + t.setSize(10 * 1024); + tos.putArchiveEntry(t); + tos.write(new byte[10 * 1024]); + tos.closeArchiveEntry(); + } return bos.toByteArray(); } @Test public void testWriteLongFileNamePosixMode() throws Exception { - final String n = "01234567890123456789012345678901234567890123456789" - + "01234567890123456789012345678901234567890123456789" - + "01234567890123456789012345678901234567890123456789"; - final TarArchiveEntry t = - new TarArchiveEntry(n); + // @formatter:off + final String n = "01234567890123456789012345678901234567890123456789" + + "01234567890123456789012345678901234567890123456789" + + "01234567890123456789012345678901234567890123456789"; + // @formatter:on + final TarArchiveEntry t = new TarArchiveEntry(n); t.setSize(10 * 1024); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX); - tos.putArchiveEntry(t); - tos.write(new byte[10 * 1024]); - tos.closeArchiveEntry(); - final byte[] data = bos.toByteArray(); - assertEquals("160 path=" + n + "\n", - new String(data, 512, 160, UTF_8)); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(n, e.getName()); - tin.close(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_POSIX); + tos.putArchiveEntry(t); + tos.write(new byte[10 * 1024]); + tos.closeArchiveEntry(); + final byte[] data = bos.toByteArray(); + assertEquals("160 path=" + n + "\n", new String(data, 512, 160, UTF_8)); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + assertEquals(n, tin.getNextTarEntry().getName()); + } + } } @Test @@ -271,14 +264,13 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { + TarConstants.UIDLEN + TarConstants.GIDLEN + TarConstants.SIZELEN]); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.set(1969, 11, 31, 23, 59, 59); - cal.set(Calendar.MILLISECOND, 0); - assertEquals(cal.getTime(), e.getLastModifiedDate()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + cal.set(1969, 11, 31, 23, 59, 59); + cal.set(Calendar.MILLISECOND, 0); + assertEquals(cal.getTime(), e.getLastModifiedDate()); + } // generates IOE because of unclosed entries. // However we don't really want to create such large entries. closeQuietly(tos); @@ -304,14 +296,13 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { + TarConstants.GIDLEN + TarConstants.SIZELEN, 12, UTF_8)); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); - cal.set(1969, 11, 31, 23, 59, 59); - cal.set(Calendar.MILLISECOND, 0); - assertEquals(cal.getTime(), e.getLastModifiedDate()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + final Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("GMT")); + cal.set(1969, 11, 31, 23, 59, 59); + cal.set(Calendar.MILLISECOND, 0); + assertEquals(cal.getTime(), e.getLastModifiedDate()); + } // generates IOE because of unclosed entries. // However we don't really want to create such large entries. closeQuietly(tos); @@ -322,14 +313,9 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { final TarArchiveEntry t = new TarArchiveEntry("foo"); t.setSize(Integer.MAX_VALUE); t.setModTime(-1000); - final TarArchiveOutputStream tos = - new TarArchiveOutputStream(new ByteArrayOutputStream()); - try { - tos.putArchiveEntry(t); - fail("Should have generated RuntimeException"); - } catch (final RuntimeException expected) { + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(new ByteArrayOutputStream())) { + assertThrows(RuntimeException.class, () -> tos.putArchiveEntry(t)); } - tos.close(); } @Test @@ -338,20 +324,18 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { final TarArchiveEntry t = new TarArchiveEntry(n); t.setSize(10 * 1024); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos); - tos.setAddPaxHeadersForNonAsciiNames(true); - tos.putArchiveEntry(t); - tos.write(new byte[10 * 1024]); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos)) { + tos.setAddPaxHeadersForNonAsciiNames(true); + tos.putArchiveEntry(t); + tos.write(new byte[10 * 1024]); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - assertEquals("11 path=" + n + "\n", - new String(data, 512, 11, UTF_8)); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(n, e.getName()); - tin.close(); + assertEquals("11 path=" + n + "\n", new String(data, 512, 11, UTF_8)); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals(n, e.getName()); + } } @Test @@ -361,20 +345,18 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { t.setSize(10 * 1024); t.setLinkName(n); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos); - tos.setAddPaxHeadersForNonAsciiNames(true); - tos.putArchiveEntry(t); - tos.write(new byte[10 * 1024]); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos)) { + tos.setAddPaxHeadersForNonAsciiNames(true); + tos.putArchiveEntry(t); + tos.write(new byte[10 * 1024]); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - assertEquals("15 linkpath=" + n + "\n", - new String(data, 512, 15, UTF_8)); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(n, e.getLinkName()); - tin.close(); + assertEquals("15 linkpath=" + n + "\n", new String(data, 512, 15, UTF_8)); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals(n, e.getLinkName()); + } } /** @@ -394,24 +376,21 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { } private void testRoundtripWith67CharFileName(final int mode) throws Exception { - final String n = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" - + "AAAAAAA"; + final String n = "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; assertEquals(67, n.length()); final TarArchiveEntry t = new TarArchiveEntry(n); t.setSize(10 * 1024); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.setLongFileMode(mode); - tos.putArchiveEntry(t); - tos.write(new byte[10 * 1024]); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.setLongFileMode(mode); + tos.putArchiveEntry(t); + tos.write(new byte[10 * 1024]); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(n, e.getName()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + assertEquals(n, tin.getNextTarEntry().getName()); + } } @Test @@ -423,11 +402,11 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { try { final TarArchiveEntry t = new TarArchiveEntry(n); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_ERROR); - tos.putArchiveEntry(t); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_ERROR); + tos.putArchiveEntry(t); + tos.closeArchiveEntry(); + } fail("Truncated name didn't throw an exception"); } catch (final RuntimeException e) { @@ -442,18 +421,17 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { + "01234567890123456789012345678901234567890123456789/"; final TarArchiveEntry t = new TarArchiveEntry(n); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_TRUNCATE); - tos.putArchiveEntry(t); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_TRUNCATE); + tos.putArchiveEntry(t); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals("Entry name", n.substring(0, TarConstants.NAMELEN) + "/", e.getName()); - assertTrue("The entry is not a directory", e.isDirectory()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals("Entry name", n.substring(0, TarConstants.NAMELEN) + "/", e.getName()); + assertTrue("The entry is not a directory", e.isDirectory()); + } } /** @@ -478,18 +456,17 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { + "01234567890123456789012345678901234567890123456789/"; final TarArchiveEntry t = new TarArchiveEntry(n); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.setLongFileMode(mode); - tos.putArchiveEntry(t); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.setLongFileMode(mode); + tos.putArchiveEntry(t); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(n, e.getName()); - assertTrue(e.isDirectory()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals(n, e.getName()); + assertTrue(e.isDirectory()); + } } /** @@ -500,18 +477,17 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { final String n = "f\u00f6\u00f6/"; final TarArchiveEntry t = new TarArchiveEntry(n); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos); - tos.setAddPaxHeadersForNonAsciiNames(true); - tos.putArchiveEntry(t); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos)) { + tos.setAddPaxHeadersForNonAsciiNames(true); + tos.putArchiveEntry(t); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(n, e.getName()); - assertTrue(e.isDirectory()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals(n, e.getName()); + assertTrue(e.isDirectory()); + } } /** @@ -522,18 +498,17 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { final String n = "f\u00f6\u00f6\u00dc"; final TarArchiveEntry t = new TarArchiveEntry(n); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos); - tos.setAddPaxHeadersForNonAsciiNames(true); - tos.putArchiveEntry(t); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos)) { + tos.setAddPaxHeadersForNonAsciiNames(true); + tos.putArchiveEntry(t); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - final TarArchiveInputStream tin = - new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals(n, e.getName()); - assertFalse(e.isDirectory()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals(n, e.getName()); + assertFalse(e.isDirectory()); + } } /** @@ -549,11 +524,11 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { try { final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_ERROR); - tos.putArchiveEntry(entry); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_ERROR); + tos.putArchiveEntry(entry); + tos.closeArchiveEntry(); + } fail("Truncated link name didn't throw an exception"); } catch (final RuntimeException e) { @@ -570,17 +545,17 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { entry.setLinkName(linkname); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_TRUNCATE); - tos.putArchiveEntry(entry); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.setLongFileMode(TarArchiveOutputStream.LONGFILE_TRUNCATE); + tos.putArchiveEntry(entry); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - final TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals("Link name", linkname.substring(0, TarConstants.NAMELEN), e.getLinkName()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals("Link name", linkname.substring(0, TarConstants.NAMELEN), e.getLinkName()); + } } /** @@ -610,19 +585,19 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { entry.setLinkName(linkname); final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII"); - tos.setLongFileMode(mode); - tos.putArchiveEntry(entry); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos, "ASCII")) { + tos.setLongFileMode(mode); + tos.putArchiveEntry(entry); + tos.closeArchiveEntry(); + } final byte[] data = bos.toByteArray(); - final TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data)); - final TarArchiveEntry e = tin.getNextTarEntry(); - assertEquals("Entry name", "test", e.getName()); - assertEquals("Link name", linkname, e.getLinkName()); - assertTrue("The entry is not a symbolic link", e.isSymbolicLink()); - tin.close(); + try (TarArchiveInputStream tin = new TarArchiveInputStream(new ByteArrayInputStream(data))) { + final TarArchiveEntry e = tin.getNextTarEntry(); + assertEquals("Entry name", "test", e.getName()); + assertEquals("Link name", linkname, e.getLinkName()); + assertTrue("The entry is not a symbolic link", e.isSymbolicLink()); + } } @SuppressWarnings("deprecation") @@ -709,29 +684,28 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { @Test public void testPutGlobalPaxHeaderEntry() throws IOException { + final String x = "If at first you don't succeed, give up"; final ByteArrayOutputStream bos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tos = new TarArchiveOutputStream(bos); - final int pid = 73; - final int globCount = 1; - final byte lfPaxGlobalExtendedHeader = TarConstants.LF_PAX_GLOBAL_EXTENDED_HEADER; - final TarArchiveEntry globalHeader = new TarArchiveEntry("/tmp/GlobalHead." + pid + "." + globCount, - lfPaxGlobalExtendedHeader); - globalHeader.addPaxHeader("SCHILLY.xattr.user.org.apache.weasels", "global-weasels"); - tos.putArchiveEntry(globalHeader); - TarArchiveEntry entry = new TarArchiveEntry("message"); - final String x = "If at first you don't succeed, give up"; - entry.setSize(x.length()); - tos.putArchiveEntry(entry); - tos.write(x.getBytes()); - tos.closeArchiveEntry(); - entry = new TarArchiveEntry("counter-message"); - final String y = "Nothing succeeds like excess"; - entry.setSize(y.length()); - entry.addPaxHeader("SCHILLY.xattr.user.org.apache.weasels.species", "unknown"); - tos.putArchiveEntry(entry); - tos.write(y.getBytes()); - tos.closeArchiveEntry(); - tos.close(); + try (TarArchiveOutputStream tos = new TarArchiveOutputStream(bos)) { + final int pid = 73; + final int globCount = 1; + final byte lfPaxGlobalExtendedHeader = TarConstants.LF_PAX_GLOBAL_EXTENDED_HEADER; + final TarArchiveEntry globalHeader = new TarArchiveEntry("/tmp/GlobalHead." + pid + "." + globCount, lfPaxGlobalExtendedHeader); + globalHeader.addPaxHeader("SCHILLY.xattr.user.org.apache.weasels", "global-weasels"); + tos.putArchiveEntry(globalHeader); + TarArchiveEntry entry = new TarArchiveEntry("message"); + entry.setSize(x.length()); + tos.putArchiveEntry(entry); + tos.write(x.getBytes()); + tos.closeArchiveEntry(); + entry = new TarArchiveEntry("counter-message"); + final String y = "Nothing succeeds like excess"; + entry.setSize(y.length()); + entry.addPaxHeader("SCHILLY.xattr.user.org.apache.weasels.species", "unknown"); + tos.putArchiveEntry(entry); + tos.write(y.getBytes()); + tos.closeArchiveEntry(); + } final TarArchiveInputStream in = new TarArchiveInputStream(new ByteArrayInputStream(bos.toByteArray())); TarArchiveEntry entryIn = in.getNextTarEntry(); assertNotNull(entryIn); @@ -775,14 +749,12 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { // do I still have the correct modification date? // let a second elapse so we don't get the current time Thread.sleep(1000); - final TarArchiveInputStream tarIn = new TarArchiveInputStream( - new ByteArrayInputStream(archive2)); - final ArchiveEntry nextEntry = tarIn.getNextEntry(); - assertEquals(longFileName, nextEntry.getName()); - // tar archive stores modification time to second granularity only (floored) - assertEquals(modificationDate.getTime() / 1000, - nextEntry.getLastModifiedDate().getTime() / 1000); - tarIn.close(); + try (TarArchiveInputStream tarIn = new TarArchiveInputStream(new ByteArrayInputStream(archive2))) { + final ArchiveEntry nextEntry = tarIn.getNextEntry(); + assertEquals(longFileName, nextEntry.getName()); + // tar archive stores modification time to second granularity only (floored) + assertEquals(modificationDate.getTime() / 1000, nextEntry.getLastModifiedDate().getTime() / 1000); + } } @Test @@ -795,19 +767,18 @@ public class TarArchiveOutputStreamTest extends AbstractTestCase { assertThrows(IllegalArgumentException.class, () -> tos.putArchiveEntry(t)); } - private static byte[] createTarArchiveContainingOneDirectory(final String fname, - final Date modificationDate) throws IOException { + private static byte[] createTarArchiveContainingOneDirectory(final String fname, final Date modificationDate) throws IOException { final ByteArrayOutputStream baos = new ByteArrayOutputStream(); - final TarArchiveOutputStream tarOut = new TarArchiveOutputStream(baos, 1024); - tarOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); - final TarArchiveEntry tarEntry = new TarArchiveEntry("d"); - tarEntry.setModTime(modificationDate); - tarEntry.setMode(TarArchiveEntry.DEFAULT_DIR_MODE); - tarEntry.setModTime(modificationDate.getTime()); - tarEntry.setName(fname); - tarOut.putArchiveEntry(tarEntry); - tarOut.closeArchiveEntry(); - tarOut.close(); + try (TarArchiveOutputStream tarOut = new TarArchiveOutputStream(baos, 1024)) { + tarOut.setLongFileMode(TarArchiveOutputStream.LONGFILE_GNU); + final TarArchiveEntry tarEntry = new TarArchiveEntry("d"); + tarEntry.setModTime(modificationDate); + tarEntry.setMode(TarArchiveEntry.DEFAULT_DIR_MODE); + tarEntry.setModTime(modificationDate.getTime()); + tarEntry.setName(fname); + tarOut.putArchiveEntry(tarEntry); + tarOut.closeArchiveEntry(); + } return baos.toByteArray(); } diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/TarLister.java b/src/test/java/org/apache/commons/compress/archivers/tar/TarLister.java index 3bfb5c2f..3a25475f 100644 --- a/src/test/java/org/apache/commons/compress/archivers/tar/TarLister.java +++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarLister.java @@ -43,20 +43,14 @@ public final class TarLister { if (!f.isFile()) { System.err.println(f + " doesn't exist or is a directory"); } - final InputStream fis = new BufferedInputStream(Files.newInputStream(f.toPath())); - final TarArchiveInputStream ais; - if (args.length > 1) { - ais = new TarArchiveInputStream(fis, args[1]); - } else { - ais = new TarArchiveInputStream(fis); - } - System.out.println("Created " + ais); - TarArchiveEntry ae; - while((ae=ais.getNextTarEntry()) != null){ - log(ae); + try (InputStream fis = new BufferedInputStream(Files.newInputStream(f.toPath())); + TarArchiveInputStream ais = args.length > 1 ? new TarArchiveInputStream(fis, args[1]) : new TarArchiveInputStream(fis)) { + System.out.println("Created " + ais); + TarArchiveEntry ae; + while ((ae = ais.getNextTarEntry()) != null) { + log(ae); + } } - ais.close(); - fis.close(); } private static void usage() {