Skip to content

Commit b215734

Browse files
committed
Moved PlexusIoZipFileResourceCollection from p-io
1 parent 5ad33c9 commit b215734

File tree

7 files changed

+269
-34
lines changed

7 files changed

+269
-34
lines changed
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package org.codehaus.plexus.archiver.zip;
2+
3+
import java.io.Closeable;
4+
import java.io.File;
5+
import java.io.IOException;
6+
import java.nio.charset.Charset;
7+
import java.util.Enumeration;
8+
import java.util.Iterator;
9+
10+
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
11+
import org.apache.commons.compress.archivers.zip.ZipFile;
12+
import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection;
13+
import org.codehaus.plexus.components.io.resources.EncodingSupported;
14+
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
15+
16+
public class PlexusArchiverZipFileResourceCollection
17+
extends AbstractPlexusIoArchiveResourceCollection implements EncodingSupported
18+
{
19+
20+
/**
21+
* The zip file resource collections role hint.
22+
*/
23+
public static final String ROLE_HINT = "zip";
24+
25+
private Charset charset = Charset.forName( "UTF-8" );
26+
27+
protected Iterator<PlexusIoResource> getEntries()
28+
throws IOException
29+
{
30+
final File f = getFile();
31+
if ( f == null )
32+
{
33+
throw new IOException( "The tar archive file has not been set." );
34+
}
35+
final ZipFile zipFile = new ZipFile( f, charset != null ? charset.name() : "UTF8");
36+
return new CloseableIterator( zipFile );
37+
}
38+
39+
class CloseableIterator
40+
implements Iterator<PlexusIoResource>, Closeable
41+
{
42+
final Enumeration en;
43+
44+
private final ZipFile zipFile;
45+
46+
public CloseableIterator( ZipFile zipFile )
47+
{
48+
this.en = zipFile.getEntriesInPhysicalOrder();
49+
this.zipFile = zipFile;
50+
}
51+
52+
public boolean hasNext ( ) {
53+
return en.hasMoreElements();
54+
}
55+
56+
public PlexusIoResource next()
57+
{
58+
final ZipArchiveEntry entry = (ZipArchiveEntry) en.nextElement();
59+
60+
return new ZipResource( zipFile, entry, getStreamTransformer() );
61+
}
62+
63+
public void remove()
64+
{
65+
throw new UnsupportedOperationException( "Removing isn't implemented." );
66+
}
67+
68+
public void close()
69+
throws IOException
70+
{
71+
zipFile.close();
72+
}
73+
}
74+
75+
public void setEncoding( Charset charset )
76+
{
77+
this.charset = charset;
78+
}
79+
}
Lines changed: 87 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,130 @@
11
package org.codehaus.plexus.archiver.zip;
22

3+
/*
4+
* Copyright 2007 The Codehaus Foundation.
5+
*
6+
* Licensed under the Apache License, Version 2.0 (the "License");
7+
* you may not use this file except in compliance with the License.
8+
* You may obtain a copy of the License at
9+
*
10+
* http://www.apache.org/licenses/LICENSE-2.0
11+
*
12+
* Unless required by applicable law or agreed to in writing, software
13+
* distributed under the License is distributed on an "AS IS" BASIS,
14+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15+
* See the License for the specific language governing permissions and
16+
* limitations under the License.
17+
*/
18+
19+
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
20+
import org.apache.commons.compress.archivers.zip.ZipFile;
21+
import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection;
22+
import org.codehaus.plexus.components.io.resources.EncodingSupported;
23+
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
24+
import org.codehaus.plexus.components.io.resources.PlexusIoURLResource;
25+
326
import java.io.Closeable;
427
import java.io.File;
528
import java.io.IOException;
29+
import java.net.URL;
30+
import java.net.URLClassLoader;
631
import java.nio.charset.Charset;
732
import java.util.Enumeration;
833
import java.util.Iterator;
934

10-
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
11-
import org.apache.commons.compress.archivers.zip.ZipFile;
12-
import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection;
13-
import org.codehaus.plexus.components.io.resources.EncodingSupported;
14-
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
1535

1636
public class PlexusIoZipFileResourceCollection
17-
extends AbstractPlexusIoArchiveResourceCollection implements EncodingSupported
37+
extends AbstractPlexusIoArchiveResourceCollection
38+
implements EncodingSupported
1839
{
19-
2040
/**
2141
* The zip file resource collections role hint.
2242
*/
23-
public static final String ROLE_HINT = "zip";
43+
public static final String ROLE_HINT = "zipFile";
2444

25-
private Charset charset = Charset.forName( "UTF-8" );
45+
/**
46+
* The zip file resource collections role hint for jar files.
47+
*/
48+
public static final String JAR_ROLE_HINT = "jarFile";
49+
50+
private Charset charset = Charset.forName("UTF-8");
51+
52+
public PlexusIoZipFileResourceCollection()
53+
{
54+
55+
}
2656

2757
protected Iterator<PlexusIoResource> getEntries()
2858
throws IOException
2959
{
3060
final File f = getFile();
3161
if ( f == null )
3262
{
33-
throw new IOException( "The tar archive file has not been set." );
63+
throw new IOException( "The zip file has not been set." );
3464
}
65+
final URLClassLoader urlClassLoader = new URLClassLoader( new URL[]{ f.toURI().toURL() }, null )
66+
{
67+
public URL getResource( String name )
68+
{
69+
return findResource( name );
70+
}
71+
};
72+
73+
final URL url = new URL( "jar:" + f.toURI().toURL() + "!/" );
3574
final ZipFile zipFile = new ZipFile( f, charset != null ? charset.name() : "UTF8");
36-
return new CloseableIterator( zipFile );
75+
final Enumeration<ZipArchiveEntry> en = zipFile.getEntriesInPhysicalOrder();
76+
return new ZipFileResourceIterator( en, url, zipFile, urlClassLoader );
3777
}
3878

39-
class CloseableIterator
79+
private static class ZipFileResourceIterator
4080
implements Iterator<PlexusIoResource>, Closeable
4181
{
42-
final Enumeration en;
82+
private final Enumeration<ZipArchiveEntry> en;
83+
84+
private final URL url;
4385

4486
private final ZipFile zipFile;
4587

46-
public CloseableIterator( ZipFile zipFile )
88+
private final URLClassLoader urlClassLoader;
89+
90+
public ZipFileResourceIterator( Enumeration<ZipArchiveEntry> en, URL url, ZipFile zipFile, URLClassLoader urlClassLoader )
4791
{
48-
this.en = zipFile.getEntriesInPhysicalOrder();
92+
this.en = en;
93+
this.url = url;
4994
this.zipFile = zipFile;
95+
this.urlClassLoader = urlClassLoader;
5096
}
5197

52-
public boolean hasNext ( ) {
98+
public boolean hasNext()
99+
{
53100
return en.hasMoreElements();
54101
}
55102

56103
public PlexusIoResource next()
57104
{
58-
final ZipArchiveEntry entry = (ZipArchiveEntry) en.nextElement();
105+
final ZipArchiveEntry entry = en.nextElement();
106+
long l = entry.getTime();
107+
final long lastModified = l == -1 ? PlexusIoResource.UNKNOWN_MODIFICATION_DATE : l;
108+
final boolean dir = entry.isDirectory();
109+
final long size = dir ? PlexusIoResource.UNKNOWN_RESOURCE_SIZE : entry.getSize();
59110

60-
return new ZipResource( zipFile, entry, getStreamTransformer() );
111+
return new PlexusIoURLResource( entry.getName(), lastModified, size, !dir, dir, true )
112+
{
113+
public URL getURL()
114+
throws IOException
115+
{
116+
String spec = getName();
117+
if ( spec.startsWith( "/" ) )
118+
{
119+
// Code path for PLXCOMP-170. Note that urlClassloader does not seem to produce correct
120+
// urls for this. Which again means files loaded via this path cannot have file names
121+
// requiring url encoding
122+
spec = "./" + spec;
123+
return new URL( url, spec );
124+
}
125+
return urlClassLoader.getResource( spec );
126+
}
127+
};
61128
}
62129

63130
public void remove()
@@ -74,6 +141,6 @@ public void close()
74141

75142
public void setEncoding( Charset charset )
76143
{
77-
this.charset = charset;
144+
this.charset = charset;
78145
}
79-
}
146+
}

src/main/resources/META-INF/plexus/components.xml

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -256,70 +256,70 @@
256256
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
257257
<role-hint>jar</role-hint>
258258
<!-- there is no implementation of PlexusIoJarFileResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
259-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
259+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
260260
<instantiation-strategy>per-lookup</instantiation-strategy>
261261
</component>
262262
<component>
263263
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
264264
<role-hint>war</role-hint>
265265
<!-- there is no implementation of PlexusIoWarFileResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
266-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
266+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
267267
<instantiation-strategy>per-lookup</instantiation-strategy>
268268
</component>
269269
<component>
270270
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
271271
<role-hint>ear</role-hint>
272272
<!-- there is no implementation of PlexusIoEarResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
273-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
273+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
274274
<instantiation-strategy>per-lookup</instantiation-strategy>
275275
</component>
276276
<component>
277277
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
278278
<role-hint>swc</role-hint>
279279
<!-- there is no implementation of PlexusIoSWCFileResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
280-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
280+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
281281
<instantiation-strategy>per-lookup</instantiation-strategy>
282282
</component>
283283
<component>
284284
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
285285
<role-hint>nar</role-hint>
286286
<!-- there is no implementation of PlexusIoNarResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
287-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
287+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
288288
<instantiation-strategy>per-lookup</instantiation-strategy>
289289
</component>
290290
<component>
291291
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
292292
<role-hint>esb</role-hint>
293293
<!-- there is no implementation of PlexusIoESBFileResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
294-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
294+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
295295
<instantiation-strategy>per-lookup</instantiation-strategy>
296296
</component>
297297
<component>
298298
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
299299
<role-hint>sar</role-hint>
300300
<!-- there is no implementation of PlexusIoSarResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
301-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
301+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
302302
<instantiation-strategy>per-lookup</instantiation-strategy>
303303
</component>
304304
<component>
305305
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
306306
<role-hint>car</role-hint>
307307
<!-- there is no implementation of PlexusIoCarFileResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
308-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
308+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
309309
<instantiation-strategy>per-lookup</instantiation-strategy>
310310
</component>
311311
<component>
312312
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
313313
<role-hint>Par</role-hint>
314314
<!-- there is no implementation of PlexusIoParResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
315-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
315+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
316316
<instantiation-strategy>per-lookup</instantiation-strategy>
317317
</component>
318318
<component>
319319
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
320320
<role-hint>rar</role-hint>
321321
<!-- there is no implementation of PlexusIoRarResourceCollection, but PlexusIoZipFileResourceCollection will do the job -->
322-
<implementation>org.codehaus.plexus.components.io.resources.PlexusIoZipFileResourceCollection</implementation>
322+
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
323323
<instantiation-strategy>per-lookup</instantiation-strategy>
324324
</component>
325325

@@ -352,7 +352,7 @@
352352
<component>
353353
<role>org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection</role>
354354
<role-hint>zip</role-hint>
355-
<implementation>org.codehaus.plexus.archiver.zip.PlexusIoZipFileResourceCollection</implementation>
355+
<implementation>org.codehaus.plexus.archiver.zip.PlexusArchiverZipFileResourceCollection</implementation>
356356
<instantiation-strategy>per-lookup</instantiation-strategy>
357357
</component>
358358
</components>

src/test/jars/namelessrootfolder.jar

167 Bytes
Binary file not shown.
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
package org.codehaus.plexus.archiver.zip;
2+
3+
import org.codehaus.plexus.PlexusTestCase;
4+
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
5+
6+
import java.io.File;
7+
import java.io.InputStream;
8+
import java.util.HashSet;
9+
import java.util.Iterator;
10+
import java.util.Set;
11+
12+
public class PlexusArchiverZipFileResourceCollectionTest
13+
extends PlexusTestCase
14+
{
15+
16+
public void testFilesWithIllegalHtmlChars()
17+
throws Exception
18+
{
19+
File testZip = new File( getBasedir(), "src/test/resources/archiveWithIllegalHtmlFileName.zip" );
20+
Set<String> seen = new HashSet<String>( );
21+
seen.add( "AFileThatNeedsHtmlEsc%3F&gt" );
22+
seen.add( "Afile&lt;Yo&gt;.txt" );
23+
seen.add( "File With Space.txt" );
24+
seen.add( "FileWith%.txt" );
25+
PlexusArchiverZipFileResourceCollection prc = new PlexusArchiverZipFileResourceCollection();
26+
prc.setFile( testZip );
27+
final Iterator<PlexusIoResource> entries = prc.getEntries();
28+
while (entries.hasNext()){
29+
final PlexusIoResource next = entries.next();
30+
assertTrue( next.getName() + "was not present", seen.remove( next.getName() ) );
31+
final InputStream contents = next.getContents();
32+
contents.close();
33+
}
34+
}
35+
36+
}

0 commit comments

Comments
 (0)