1 package org.codehaus.plexus.archiver.zip;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.net.URL;
25
26 import java.util.ArrayList;
27 import java.util.Enumeration;
28 import java.util.List;
29
30 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
31 import org.apache.commons.compress.archivers.zip.ZipFile;
32 import org.apache.commons.compress.utils.IOUtils;
33 import org.codehaus.plexus.archiver.AbstractArchiveContentLister;
34 import org.codehaus.plexus.archiver.ArchiveContentEntry;
35
36 import org.codehaus.plexus.archiver.ArchiverException;
37 import org.codehaus.plexus.components.io.resources.PlexusIoResource;
38
39
40
41
42
43 public abstract class AbstractZipArchiveContentLister
44 extends AbstractArchiveContentLister
45 {
46 private static final String NATIVE_ENCODING = "native-encoding";
47
48 private String encoding = "UTF8";
49
50 public AbstractZipArchiveContentLister()
51 {
52 }
53
54 public AbstractZipArchiveContentLister( final File sourceFile )
55 {
56 super( sourceFile );
57 }
58
59
60
61
62
63
64
65
66 public void setEncoding( String encoding )
67 {
68 if ( NATIVE_ENCODING.equals( encoding ) )
69 {
70 encoding = null;
71 }
72 this.encoding = encoding;
73 }
74
75 private static class ZipEntryFileInfo
76 implements PlexusIoResource
77 {
78 private final ZipFile zipFile;
79
80 private final ZipArchiveEntry zipEntry;
81
82 ZipEntryFileInfo( final org.apache.commons.compress.archivers.zip.ZipFile zipFile,
83 final ZipArchiveEntry zipEntry )
84 {
85 this.zipFile = zipFile;
86 this.zipEntry = zipEntry;
87 }
88
89 public String getName()
90 {
91 return zipEntry.getName();
92 }
93
94 public boolean isDirectory()
95 {
96 return zipEntry.isDirectory();
97 }
98
99 public boolean isFile()
100 {
101 return !zipEntry.isDirectory() && !zipEntry.isUnixSymlink();
102 }
103
104 public boolean isSymbolicLink()
105 {
106 return zipEntry.isUnixSymlink();
107 }
108
109 public InputStream getContents()
110 throws IOException
111 {
112 return zipFile.getInputStream( zipEntry );
113 }
114
115 public long getLastModified()
116 {
117 final long l = zipEntry.getTime();
118 return l == 0 ? PlexusIoResource.UNKNOWN_MODIFICATION_DATE : l;
119 }
120
121 public long getSize()
122 {
123 final long l = zipEntry.getSize();
124 return l == -1 ? PlexusIoResource.UNKNOWN_RESOURCE_SIZE : l;
125 }
126
127 public URL getURL()
128 throws IOException
129 {
130 return null;
131 }
132
133 public boolean isExisting()
134 {
135 return true;
136 }
137
138 public ArchiveContentEntry asArchiveContentEntry()
139 {
140 if ( isSymbolicLink() )
141 {
142 return ArchiveContentEntry.createSymlinkEntry( getName(), this, -1 );
143 }
144 else if ( isDirectory() )
145 {
146 return ArchiveContentEntry.createDirectoryEntry( getName(), this, -1 );
147 }
148 else
149 {
150 return ArchiveContentEntry.createFileEntry( getName(), this, -1 );
151 }
152 }
153 }
154
155 protected List<ArchiveContentEntry> execute()
156 throws ArchiverException
157 {
158 ArrayList<ArchiveContentEntry> archiveContentList = new ArrayList<ArchiveContentEntry>();
159
160 getLogger().debug( "listing: " + getSourceFile() );
161 org.apache.commons.compress.archivers.zip.ZipFile zf = null;
162 try
163 {
164 zf = new org.apache.commons.compress.archivers.zip.ZipFile( getSourceFile(), encoding );
165 final Enumeration e = zf.getEntries();
166 while ( e.hasMoreElements() )
167 {
168 final ZipArchiveEntry ze = (ZipArchiveEntry) e.nextElement();
169 final ZipEntryFileInfo fileInfo = new ZipEntryFileInfo( zf, ze );
170 if ( isSelected( ze.getName(), fileInfo ) )
171 {
172 ArchiveContentEntry ae = fileInfo.asArchiveContentEntry();
173 archiveContentList.add( ae );
174 }
175 }
176 getLogger().debug( "listing complete" );
177 }
178 catch ( final IOException ioe )
179 {
180 throw new ArchiverException( "Error while listing " + getSourceFile().getAbsolutePath(), ioe );
181 }
182 finally
183 {
184 IOUtils.closeQuietly( zf );
185 }
186 return archiveContentList;
187 }
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282 }