Skip to content

Commit e6681b2

Browse files
committed
Merge remote-tracking branch 'plexus/master'
2 parents 1a75e20 + fa35437 commit e6681b2

File tree

7 files changed

+130
-30
lines changed

7 files changed

+130
-30
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
</parent>
1111

1212
<artifactId>plexus-archiver</artifactId>
13-
<version>3.0.3-SNAPSHOT</version>
13+
<version>3.0.4-SNAPSHOT</version>
1414
<name>Plexus Archiver Component</name>
1515

1616
<scm>

src/main/java/org/codehaus/plexus/archiver/zip/ConcurrentJarCreator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ public void addArchiveEntry(final ZipArchiveEntry zipArchiveEntry, final InputSt
8686
final ByteArrayInputStream payload = new ByteArrayInputStream(new byte[]{});
8787
directories.addArchiveEntry(createZipArchiveEntryRequest(zipArchiveEntry, createInputStreamSupplier(payload)));
8888
payload.close();
89-
} else if ("META-INF".equals(zipArchiveEntry.getName())) {
89+
} else if ("META-INF".equals(zipArchiveEntry.getName()) || "META-INF/".equals(zipArchiveEntry.getName()) ) {
9090
InputStream payload = source.get();
9191
if (zipArchiveEntry.isDirectory()) zipArchiveEntry.setMethod(ZipEntry.STORED);
9292
metaInfDir.addArchiveEntry(

src/main/java/org/codehaus/plexus/archiver/zip/PlexusIoZipFileResourceCollection.java

Lines changed: 57 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818

1919
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
2020
import org.apache.commons.compress.archivers.zip.ZipFile;
21+
import org.codehaus.plexus.components.io.functions.SymlinkDestinationSupplier;
2122
import org.codehaus.plexus.components.io.resources.AbstractPlexusIoArchiveResourceCollection;
2223
import org.codehaus.plexus.components.io.resources.EncodingSupported;
2324
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
@@ -86,6 +87,59 @@ public URL getResource( String name )
8687
private static class ZipFileResourceIterator
8788
implements Iterator<PlexusIoResource>, Closeable
8889
{
90+
private class ZipFileResource
91+
extends PlexusIoURLResource
92+
{
93+
private ZipFileResource( ZipArchiveEntry entry )
94+
{
95+
super( entry.getName(), entry.getTime() == -1 ? PlexusIoResource.UNKNOWN_MODIFICATION_DATE : entry.getTime(),
96+
entry.isDirectory() ? PlexusIoResource.UNKNOWN_RESOURCE_SIZE : entry.getSize(),
97+
!entry.isDirectory(), entry.isDirectory(), true );
98+
}
99+
100+
public URL getURL()
101+
throws IOException
102+
{
103+
String spec = getName();
104+
if ( spec.startsWith( "/" ) )
105+
{
106+
// Code path for PLXCOMP-170. Note that urlClassloader does not seem to produce correct
107+
// urls for this. Which again means files loaded via this path cannot have file names
108+
// requiring url encoding
109+
spec = "./" + spec;
110+
return new URL( url, spec );
111+
}
112+
return urlClassLoader.getResource( spec );
113+
}
114+
}
115+
116+
private class ZipFileSymlinkResource
117+
extends ZipFileResource
118+
implements SymlinkDestinationSupplier
119+
{
120+
private final ZipArchiveEntry entry;
121+
122+
private ZipFileSymlinkResource( ZipArchiveEntry entry )
123+
{
124+
super( entry );
125+
126+
this.entry = entry;
127+
}
128+
129+
@Override
130+
public String getSymlinkDestination()
131+
throws IOException
132+
{
133+
return zipFile.getUnixSymlink( entry );
134+
}
135+
136+
@Override
137+
public boolean isSymbolicLink()
138+
{
139+
return true;
140+
}
141+
}
142+
89143
private final Enumeration<ZipArchiveEntry> en;
90144

91145
private final URL url;
@@ -110,28 +164,10 @@ public boolean hasNext()
110164
public PlexusIoResource next()
111165
{
112166
final ZipArchiveEntry entry = en.nextElement();
113-
long l = entry.getTime();
114-
final long lastModified = l == -1 ? PlexusIoResource.UNKNOWN_MODIFICATION_DATE : l;
115-
final boolean dir = entry.isDirectory();
116-
final long size = dir ? PlexusIoResource.UNKNOWN_RESOURCE_SIZE : entry.getSize();
117167

118-
return new PlexusIoURLResource( entry.getName(), lastModified, size, !dir, dir, true )
119-
{
120-
public URL getURL()
121-
throws IOException
122-
{
123-
String spec = getName();
124-
if ( spec.startsWith( "/" ) )
125-
{
126-
// Code path for PLXCOMP-170. Note that urlClassloader does not seem to produce correct
127-
// urls for this. Which again means files loaded via this path cannot have file names
128-
// requiring url encoding
129-
spec = "./" + spec;
130-
return new URL( url, spec );
131-
}
132-
return urlClassLoader.getResource( spec );
133-
}
134-
};
168+
return entry.isUnixSymlink()
169+
? new ZipFileSymlinkResource( entry )
170+
: new ZipFileResource( entry );
135171
}
136172

137173
public void remove()

src/main/java/org/codehaus/plexus/archiver/zip/ZipResource.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,15 @@ private static long getLastModofied( ZipArchiveEntry entry )
4545

4646
public synchronized PlexusIoResourceAttributes getAttributes()
4747
{
48-
int mode = entry.getUnixMode();
49-
if ( ( mode & UnixStat.FILE_FLAG ) == UnixStat.FILE_FLAG )
48+
int mode = -1;
49+
if (entry.getPlatform() == ZipArchiveEntry.PLATFORM_UNIX)
5050
{
51-
mode = mode & ~UnixStat.FILE_FLAG;
52-
}
53-
else
54-
{
55-
mode = mode & ~UnixStat.DIR_FLAG;
51+
mode = entry.getUnixMode();
52+
if ((mode & UnixStat.FILE_FLAG) == UnixStat.FILE_FLAG) {
53+
mode = mode & ~UnixStat.FILE_FLAG;
54+
} else {
55+
mode = mode & ~UnixStat.DIR_FLAG;
56+
}
5657
}
5758

5859
if ( attributes == null )

src/test/java/org/codehaus/plexus/archiver/zip/PlexusArchiverZipFileResourceCollectionTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,16 @@
11
package org.codehaus.plexus.archiver.zip;
22

33
import org.codehaus.plexus.PlexusTestCase;
4+
import org.codehaus.plexus.components.io.functions.ResourceAttributeSupplier;
45
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
56

67
import java.io.File;
8+
import java.io.IOException;
79
import java.io.InputStream;
10+
import java.util.HashMap;
811
import java.util.HashSet;
912
import java.util.Iterator;
13+
import java.util.Map;
1014
import java.util.Set;
1115

1216
public class PlexusArchiverZipFileResourceCollectionTest
@@ -33,4 +37,25 @@ public void testFilesWithIllegalHtmlChars()
3337
}
3438
}
3539

40+
public void testFileModes()
41+
throws IOException
42+
{
43+
File testZip = new File( getBasedir(), "src/test/resources/zeroFileMode/mixed-file-mode.zip" );
44+
Map<String, Integer> originalUnixModes = new HashMap<String, Integer>();
45+
originalUnixModes.put( "platform-fat", -1 );
46+
originalUnixModes.put( "zero-unix-mode", 0 );
47+
// ---xrw-r-- the crazy permissions are on purpose so we don't hit some default value
48+
originalUnixModes.put( "non-zero-unix-mode", 0164 );
49+
PlexusArchiverZipFileResourceCollection prc = new PlexusArchiverZipFileResourceCollection();
50+
prc.setFile( testZip );
51+
Iterator<PlexusIoResource> entries = prc.getEntries();
52+
while ( entries.hasNext() )
53+
{
54+
PlexusIoResource entry = entries.next();
55+
int entryUnixMode = ( (ResourceAttributeSupplier) entry ).getAttributes().getOctalMode();
56+
int originalUnixMode = (int) originalUnixModes.get( entry.getName() );
57+
assertEquals( originalUnixMode, entryUnixMode );
58+
}
59+
}
60+
3661
}

src/test/java/org/codehaus/plexus/archiver/zip/PlexusIoZipFileResourceCollectionTest.java

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,18 @@
22

33
import org.apache.commons.io.IOUtils;
44
import org.codehaus.plexus.PlexusTestCase;
5+
import org.codehaus.plexus.components.io.functions.SymlinkDestinationSupplier;
56
import org.codehaus.plexus.components.io.resources.*;
67

78
import java.io.BufferedReader;
89
import java.io.File;
910
import java.io.InputStream;
1011
import java.io.InputStreamReader;
1112
import java.net.URL;
13+
import java.util.HashMap;
1214
import java.util.HashSet;
1315
import java.util.Iterator;
16+
import java.util.Map;
1417
import java.util.Set;
1518

1619
public class PlexusIoZipFileResourceCollectionTest
@@ -87,4 +90,39 @@ public void testFilesThatAreNotThere()
8790
}
8891
}
8992

93+
public void testSymlinkEntries()
94+
throws Exception
95+
{
96+
File testZip = new File( getBasedir(), "src/test/resources/symlinks/symlinks.zip" );
97+
Map<String, String> symLinks = new HashMap<String, String>();
98+
symLinks.put( "symDir", "targetDir/" );
99+
symLinks.put( "symLinkToDirOnTheOutside", "../dirOnTheOutside/" );
100+
symLinks.put( "symLinkToTheOutside", "../onTheOutside.txt" );
101+
symLinks.put( "symR", "fileR.txt" );
102+
symLinks.put( "symW", "fileW.txt" );
103+
symLinks.put( "symX", "fileX.txt" );
104+
PlexusIoZipFileResourceCollection
105+
prc = new PlexusIoZipFileResourceCollection();
106+
prc.setFile( testZip );
107+
final Iterator<PlexusIoResource> entries = prc.getEntries();
108+
while ( entries.hasNext() )
109+
{
110+
final PlexusIoResource next = entries.next();
111+
String symLinkTarget = symLinks.remove( next.getName() );
112+
if ( symLinkTarget != null )
113+
{
114+
assertTrue( next.getName() + " must be symlink", next.isSymbolicLink() );
115+
assertTrue( next instanceof SymlinkDestinationSupplier );
116+
assertEquals( symLinkTarget,
117+
( (SymlinkDestinationSupplier) next ).getSymlinkDestination() );
118+
}
119+
else
120+
{
121+
assertFalse( next.getName() + " must not be symlink", next.isSymbolicLink() );
122+
}
123+
}
124+
125+
assertTrue( symLinks.isEmpty() );
126+
}
127+
90128
}
1.83 KB
Binary file not shown.

0 commit comments

Comments
 (0)