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 f = getFile();
28          if (f == null) {
29              throw new IOException("The tar archive file has not been set.");
30          }
31          final ZipFile zipFile = new ZipFile(f, charset != null ? charset.name() : "UTF8");
32          return new CloseableIterator(zipFile);
33      }
34  
35      @Override
36      public boolean isConcurrentAccessSupported() {
37          // Well maybe someday investigate if we can do concurrent zip
38          return false;
39      }
40  
41      class CloseableIterator implements Iterator<PlexusIoResource>, Closeable {
42  
43          final Enumeration<ZipArchiveEntry> en;
44  
45          private final ZipFile zipFile;
46  
47          public CloseableIterator(ZipFile zipFile) {
48              this.en = zipFile.getEntriesInPhysicalOrder();
49              this.zipFile = zipFile;
50          }
51  
52          @Override
53          public boolean hasNext() {
54              return en.hasMoreElements();
55          }
56  
57          @Override
58          public PlexusIoResource next() {
59              final ZipArchiveEntry entry = en.nextElement();
60              return entry.isUnixSymlink()
61                      ? new ZipSymlinkResource(zipFile, entry, getStreamTransformer())
62                      : new ZipResource(zipFile, entry, getStreamTransformer());
63          }
64  
65          @Override
66          public void remove() {
67              throw new UnsupportedOperationException("Removing isn't implemented.");
68          }
69  
70          @Override
71          public void close() throws IOException {
72              zipFile.close();
73          }
74      }
75  
76      @Override
77      public void setEncoding(Charset charset) {
78          this.charset = charset;
79      }
80  }