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