[ 
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)

Reply via email to