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
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 }