commons-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Stefan Bodewig (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (COMPRESS-486) Expander causes "Cleaning up unclosed ZipFile" to be written to stderr
Date Sun, 12 May 2019 10:29:00 GMT

    [ https://issues.apache.org/jira/browse/COMPRESS-486?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16838038#comment-16838038
] 

Stefan Bodewig commented on COMPRESS-486:
-----------------------------------------

The reason here is the {{ZipFile}} instance gets created in the {{expand}} overload that expects
a {{SeekableByteChannel}} and we explicitly don't close the {{ZipFile}} as this would close
the channel which - in general - is not owned by {{Expander}}.

This is easily solved for the case where the channel-arg expand is called from one of the
{{File}}-arg versions but not in the general case.


> Expander causes "Cleaning up unclosed ZipFile" to be written to stderr
> ----------------------------------------------------------------------
>
>                 Key: COMPRESS-486
>                 URL: https://issues.apache.org/jira/browse/COMPRESS-486
>             Project: Commons Compress
>          Issue Type: Bug
>    Affects Versions: 1.18
>         Environment: Java 1.8, Windows 10, IntelliJ 2018.2.7
>            Reporter: Jordan Piscitelli
>            Priority: Minor
>
> Using the Expander, I found that it will create a zip file that is not closed which results
in an error message being written to std-err when garbage collection (and finalization) occurs. 
> I believe it is [line 140 of the Expander|https://github.com/apache/commons-compress/blob/master/src/main/java/org/apache/commons/compress/archivers/examples/Expander.java#L140]
as it creates a zip file that does not appear to be closed.
> {code:java}
> 140: expand(new ZipFile(archive), targetDirectory);{code}
> I have created a test that demonstrates the behavior. It runs Expander.expand(file, file) followed
by garbage collection and finalize, and passes if stderr was not written to. 
> Currently the test fails as "Cleaning up unclosed ZipFile for archive unknown archive"
is written to stderr.
> {code:java}
> import java.io.ByteArrayOutputStream;
> import java.io.File;
> import java.io.FileOutputStream;
> import java.io.IOException;
> import java.io.OutputStream;
> import java.io.PrintStream;
> import java.nio.charset.StandardCharsets;
> import org.apache.commons.compress.archivers.ArchiveException;
> import org.apache.commons.compress.archivers.ArchiveOutputStream;
> import org.apache.commons.compress.archivers.ArchiveStreamFactory;
> import org.apache.commons.compress.archivers.examples.Expander;
> import org.codehaus.plexus.util.StringUtils;
> import org.junit.jupiter.api.Test;
> import org.springframework.util.Assert;
> public class ExpanderCloseTest {
>     @Test
>     public void testExpanderClosesZipFile() {
>         final ByteArrayOutputStream errOutputStream = new ByteArrayOutputStream();
>         try {
>             final File sourceArchiveFile = createSampleZip();
>             final File targetExpansionDirectory = File.createTempFile("dest.zip", null);
>             try (PrintStream ps = new PrintStream(errOutputStream, true, "UTF-8")) {
>                 System.setErr(ps);
>                 Expander expander = new Expander();
>                 expander.expand(sourceArchiveFile, targetExpansionDirectory);
>                 System.gc();
>                 System.runFinalization();
>             }
>         } catch (Exception e) {
>             throw new RuntimeException(e);
>         }
>         String stderr = new String(errOutputStream.toByteArray(), StandardCharsets.UTF_8);
>         Assert.isTrue(StringUtils.isBlank(stderr), "Nothing should have been written
to stderr, but this was: " + stderr);
>     }
>     private File createSampleZip() throws IOException, ArchiveException {
>         final File sourceArchiveFile = File.createTempFile("example.zip", null);
>         OutputStream archiveStream = new FileOutputStream(sourceArchiveFile);
>         ArchiveOutputStream archive = new ArchiveStreamFactory().createArchiveOutputStream(ArchiveStreamFactory.ZIP,
archiveStream);
>         archive.finish();
>         archiveStream.close();
>         return sourceArchiveFile;
>     }
> }
> {code}



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Mime
View raw message