View Javadoc
1   package org.codehaus.plexus.archiver.zip;
2   
3   import javax.inject.Named;
4   
5   import java.io.Closeable;
6   import java.io.File;
7   import java.io.IOException;
8   import java.nio.charset.Charset;
9   import java.nio.charset.StandardCharsets;
10  import java.util.Enumeration;
11  import java.util.Iterator;
12  
13  import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
14  import org.apache.commons.compress.archivers.zip.ZipFile;
15  import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection;
16  import org.codehaus.plexus.components.io.resources.EncodingSupported;
17  import org.codehaus.plexus.components.io.resources.PlexusIoResource;
18  
19  @Named("zip")
20  public class PlexusArchiverZipFileResourceCollection extends AbstractPlexusIoArchiveResourceCollection
21          implements EncodingSupported {
22  
23      private Charset charset = StandardCharsets.UTF_8;
24  
25      @Override
26      protected Iterator<PlexusIoResource> getEntries() throws IOException {
27          final File file = getFile();
28          if (file == null) {
29              throw new IOException("The tar archive file has not been set.");
30          }
31  
32          final ZipFile zipFile = ZipFile.builder()
33                  .setFile(file)
34                  .setCharset(charset != null ? charset : StandardCharsets.UTF_8)
35                  .get();
36          return new CloseableIterator(zipFile);
37      }
38  
39      @Override
40      public boolean isConcurrentAccessSupported() {
41          // Well maybe someday investigate if we can do concurrent zip
42          return false;
43      }
44  
45      class CloseableIterator implements Iterator<PlexusIoResource>, Closeable {
46  
47          final Enumeration<ZipArchiveEntry> en;
48  
49          private final ZipFile zipFile;
50  
51          public CloseableIterator(ZipFile zipFile) {
52              this.en = zipFile.getEntriesInPhysicalOrder();
53              this.zipFile = zipFile;
54          }
55  
56          @Override
57          public boolean hasNext() {
58              return en.hasMoreElements();
59          }
60  
61          @Override
62          public PlexusIoResource next() {
63              final ZipArchiveEntry entry = en.nextElement();
64              return entry.isUnixSymlink()
65                      ? new ZipSymlinkResource(zipFile, entry, getStreamTransformer())
66                      : new ZipResource(zipFile, entry, getStreamTransformer());
67          }
68  
69          @Override
70          public void remove() {
71              throw new UnsupportedOperationException("Removing isn't implemented.");
72          }
73  
74          @Override
75          public void close() throws IOException {
76              zipFile.close();
77          }
78      }
79  
80      @Override
81      public void setEncoding(Charset charset) {
82          this.charset = charset;
83      }
84  }