diff --git a/pom.xml b/pom.xml
index fbe31d35b..ac222aafc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -51,7 +51,7 @@
org.codehaus.plexus
plexus-utils
- 3.0.23
+ 3.0.24
org.codehaus.plexus
diff --git a/src/main/java/org/codehaus/plexus/archiver/jar/JdkManifestFactory.java b/src/main/java/org/codehaus/plexus/archiver/jar/JdkManifestFactory.java
index cefa73de0..c0d5eba8c 100644
--- a/src/main/java/org/codehaus/plexus/archiver/jar/JdkManifestFactory.java
+++ b/src/main/java/org/codehaus/plexus/archiver/jar/JdkManifestFactory.java
@@ -16,7 +16,7 @@
* limitations under the License.
*/
-import java.io.InputStream;
+import java.io.IOException;
import java.util.Map;
import java.util.Properties;
import java.util.jar.Attributes;
@@ -33,25 +33,33 @@ class JdkManifestFactory
public static java.util.jar.Manifest getDefaultManifest()
throws ArchiverException
{
- final java.util.jar.Manifest defaultManifest = new java.util.jar.Manifest();
- defaultManifest.getMainAttributes().putValue( "Manifest-Version", "1.0" );
+ try
+ {
+ final java.util.jar.Manifest defaultManifest = new java.util.jar.Manifest();
+ defaultManifest.getMainAttributes().putValue( "Manifest-Version", "1.0" );
- String createdBy = "Plexus Archiver";
+ String createdBy = "Plexus Archiver";
- InputStream inputStream = JdkManifestFactory.class.getResourceAsStream( "/META-INF/"
- + "maven/org.codehaus.plexus/plexus-archiver/pom.properties" );
- Properties properties = PropertyUtils.loadProperties( inputStream );
- if ( properties != null )
- {
- String plexusArchiverVersion = properties.getProperty( "version" );
- if ( plexusArchiverVersion != null )
+ final Properties properties = PropertyUtils.loadProperties( JdkManifestFactory.class.getResourceAsStream(
+ "/META-INF/maven/org.codehaus.plexus/plexus-archiver/pom.properties" ) );
+
+ if ( properties != null )
{
- createdBy += " " + plexusArchiverVersion;
+ String plexusArchiverVersion = properties.getProperty( "version" );
+ if ( plexusArchiverVersion != null )
+ {
+ createdBy += " " + plexusArchiverVersion;
+ }
}
- }
- defaultManifest.getMainAttributes().putValue( "Created-By", createdBy );
- return defaultManifest;
+ defaultManifest.getMainAttributes().putValue( "Created-By", createdBy );
+
+ return defaultManifest;
+ }
+ catch ( final IOException e )
+ {
+ throw new ArchiverException( "Failure reading default manifest.", e );
+ }
}
public static void merge( java.util.jar.Manifest target, java.util.jar.Manifest other, boolean overwriteMain )
diff --git a/src/main/java/org/codehaus/plexus/archiver/jar/Manifest.java b/src/main/java/org/codehaus/plexus/archiver/jar/Manifest.java
index b36f73024..7e2adc0d8 100644
--- a/src/main/java/org/codehaus/plexus/archiver/jar/Manifest.java
+++ b/src/main/java/org/codehaus/plexus/archiver/jar/Manifest.java
@@ -735,25 +735,32 @@ public Iterator iterator()
public static Manifest getDefaultManifest()
throws ArchiverException
{
- final Manifest defaultManifest = new Manifest();
- defaultManifest.getMainAttributes().putValue( "Manifest-Version", "1.0" );
+ try
+ {
+ final Manifest defaultManifest = new Manifest();
+ defaultManifest.getMainAttributes().putValue( "Manifest-Version", "1.0" );
- String createdBy = "Plexus Archiver";
+ String createdBy = "Plexus Archiver";
- InputStream inputStream = Manifest.class.getResourceAsStream( "/META-INF/"
- + "maven/org.codehaus.plexus/plexus-archiver/pom.properties" );
- Properties properties = PropertyUtils.loadProperties( inputStream );
- if ( properties != null )
- {
- String plexusArchiverVersion = properties.getProperty( "version" );
- if ( plexusArchiverVersion != null )
+ final Properties properties = PropertyUtils.loadProperties( Manifest.class.getResourceAsStream(
+ "/META-INF/maven/org.codehaus.plexus/plexus-archiver/pom.properties" ) );
+
+ if ( properties != null )
{
- createdBy += " " + plexusArchiverVersion;
+ String plexusArchiverVersion = properties.getProperty( "version" );
+ if ( plexusArchiverVersion != null )
+ {
+ createdBy += " " + plexusArchiverVersion;
+ }
}
- }
- defaultManifest.getMainAttributes().putValue( "Created-By", createdBy );
+ defaultManifest.getMainAttributes().putValue( "Created-By", createdBy );
- return defaultManifest;
+ return defaultManifest;
+ }
+ catch ( final IOException e )
+ {
+ throw new ArchiverException( "Failure reading default manifest.", e );
+ }
}
/**
diff --git a/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java b/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java
index 8f0ed829c..f18c88db5 100755
--- a/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java
+++ b/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java
@@ -22,6 +22,7 @@
import org.apache.commons.compress.archivers.zip.ZipEncoding;
import org.apache.commons.compress.archivers.zip.ZipEncodingHelper;
import org.apache.commons.compress.parallel.InputStreamSupplier;
+import org.apache.commons.compress.utils.Charsets;
import org.codehaus.plexus.archiver.AbstractArchiver;
import org.codehaus.plexus.archiver.ArchiveEntry;
import org.codehaus.plexus.archiver.Archiver;
@@ -41,6 +42,7 @@
import java.io.InputStream;
import java.io.OutputStream;
import java.io.SequenceInputStream;
+import java.nio.charset.Charset;
import java.util.Hashtable;
import java.util.Stack;
import java.util.concurrent.ExecutionException;
@@ -208,7 +210,6 @@ public boolean isFilesonly()
return doFilesonly;
}
-
protected void execute()
throws ArchiverException, IOException
{
@@ -315,8 +316,7 @@ private void createArchiveMain()
zipArchiveOutputStream =
new ZipArchiveOutputStream( bufferedOutputStream( fileOutputStream( zipFile, "zip" ) ) );
zipArchiveOutputStream.setEncoding( encoding );
- zipArchiveOutputStream.setCreateUnicodeExtraFields(
- ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE );
+ zipArchiveOutputStream.setCreateUnicodeExtraFields( this.getUnicodeExtraFieldPolicy() );
zipArchiveOutputStream.setMethod(
doCompress ? ZipArchiveOutputStream.DEFLATED : ZipArchiveOutputStream.STORED );
@@ -339,6 +339,45 @@ private void createArchiveMain()
success = true;
}
+ /**
+ * Gets the {@code UnicodeExtraFieldPolicy} to apply.
+ *
+ * @return {@link ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE}, if the effective encoding is
+ * UTF-8; {@link ZipArchiveOutputStream.UnicodeExtraFieldPolicy.ALWAYS}, if the effective encoding is not
+ * UTF-8.
+ *
+ * @see #getEncoding()
+ */
+ private ZipArchiveOutputStream.UnicodeExtraFieldPolicy getUnicodeExtraFieldPolicy()
+ {
+ // Copied from ZipEncodingHelper.isUTF8()
+ String effectiveEncoding = this.getEncoding();
+
+ if ( effectiveEncoding == null )
+ {
+ effectiveEncoding = Charset.defaultCharset().name();
+ }
+
+ boolean utf8 = Charsets.UTF_8.name().equalsIgnoreCase( effectiveEncoding );
+
+ if ( !utf8 )
+ {
+ for ( String alias : Charsets.UTF_8.aliases() )
+ {
+ if ( alias.equalsIgnoreCase( effectiveEncoding ) )
+ {
+ utf8 = true;
+ break;
+ }
+ }
+ }
+
+ return utf8
+ ? ZipArchiveOutputStream.UnicodeExtraFieldPolicy.NOT_ENCODEABLE
+ : ZipArchiveOutputStream.UnicodeExtraFieldPolicy.ALWAYS;
+
+ }
+
/**
* Add the given resources.
*
diff --git a/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipUnArchiver.java b/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipUnArchiver.java
index cad3a10c5..8e5864df4 100644
--- a/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipUnArchiver.java
+++ b/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipUnArchiver.java
@@ -20,19 +20,21 @@
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
+import java.io.UnsupportedEncodingException;
import java.net.URL;
import java.util.Date;
import java.util.Enumeration;
+import javax.annotation.Nonnull;
+import org.apache.commons.compress.archivers.zip.UnicodePathExtraField;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.compress.utils.IOUtils;
+
import org.codehaus.plexus.archiver.AbstractUnArchiver;
import org.codehaus.plexus.archiver.ArchiverException;
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
-import javax.annotation.Nonnull;
-
/**
* @author Emmanuel Venisse
* @version $Id$
@@ -84,7 +86,20 @@ private static class ZipEntryFileInfo
public String getName()
{
- return zipEntry.getName();
+ try
+ {
+ final UnicodePathExtraField unicodePath =
+ (UnicodePathExtraField) zipEntry.getExtraField( UnicodePathExtraField.UPATH_ID );
+
+ return unicodePath != null
+ ? new String( unicodePath.getUnicodeName(), "UTF-8" )
+ : zipEntry.getName();
+
+ }
+ catch ( final UnsupportedEncodingException e )
+ {
+ throw new AssertionError( e );
+ }
}
public boolean isDirectory()
@@ -141,27 +156,30 @@ protected void execute()
InputStream in = null;
try
{
- zf = new org.apache.commons.compress.archivers.zip.ZipFile( getSourceFile(), encoding );
- final Enumeration e = zf.getEntries();
+ zf = new org.apache.commons.compress.archivers.zip.ZipFile( getSourceFile(), encoding, true );
+ final Enumeration e = zf.getEntriesInPhysicalOrder();
while ( e.hasMoreElements() )
{
final ZipArchiveEntry ze = (ZipArchiveEntry) e.nextElement();
final ZipEntryFileInfo fileInfo = new ZipEntryFileInfo( zf, ze );
- if ( isSelected( ze.getName(), fileInfo ) )
+ if ( isSelected( fileInfo.getName(), fileInfo ) )
{
- in = zf.getInputStream( ze );
- extractFileIfIncluded(getSourceFile(), getDestDirectory(), in, ze.getName(),
- new Date(ze.getTime()), ze.isDirectory(), ze.getUnixMode() != 0 ? ze.getUnixMode() : null,
- resolveSymlink( zf, ze ) );
+ in = zf.getInputStream( ze );
+
+ extractFileIfIncluded( getSourceFile(), getDestDirectory(), in, fileInfo.getName(),
+ new Date( ze.getTime() ), ze.isDirectory(),
+ ze.getUnixMode() != 0 ? ze.getUnixMode() : null,
+ resolveSymlink( zf, ze ) );
+
in.close();
in = null;
- }
-
- }
+ }
+ }
- getLogger().debug( "expand complete" );
zf.close();
zf = null;
+
+ getLogger().debug( "expand complete" );
}
catch ( final IOException ioe )
{
@@ -197,9 +215,9 @@ protected void execute( final String path, final File outputDirectory )
InputStream in = null;
try
{
- zipFile = new org.apache.commons.compress.archivers.zip.ZipFile( getSourceFile(), encoding );
+ zipFile = new org.apache.commons.compress.archivers.zip.ZipFile( getSourceFile(), encoding, true );
- final Enumeration e = zipFile.getEntries();
+ final Enumeration e = zipFile.getEntriesInPhysicalOrder();
while ( e.hasMoreElements() )
{
@@ -213,9 +231,12 @@ protected void execute( final String path, final File outputDirectory )
if ( ze.getName().startsWith( path ) )
{
in = zipFile.getInputStream( ze );
+
extractFileIfIncluded( getSourceFile(), outputDirectory, in,
ze.getName(), new Date( ze.getTime() ), ze.isDirectory(),
- ze.getUnixMode() != 0 ? ze.getUnixMode() : null, resolveSymlink( zipFile, ze ) );
+ ze.getUnixMode() != 0 ? ze.getUnixMode() : null,
+ resolveSymlink( zipFile, ze ) );
+
in.close();
in = null;
}
diff --git a/src/test/java/org/codehaus/plexus/archiver/jar/DirectoryArchiverUnpackJarTest.java b/src/test/java/org/codehaus/plexus/archiver/jar/DirectoryArchiverUnpackJarTest.java
index be29210f2..67abcecb9 100644
--- a/src/test/java/org/codehaus/plexus/archiver/jar/DirectoryArchiverUnpackJarTest.java
+++ b/src/test/java/org/codehaus/plexus/archiver/jar/DirectoryArchiverUnpackJarTest.java
@@ -3,7 +3,6 @@
import org.codehaus.plexus.PlexusTestCase;
import org.codehaus.plexus.archiver.Archiver;
import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
-import org.codehaus.plexus.components.io.attributes.Java7AttributeUtils;
import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
import org.codehaus.plexus.components.io.resources.PlexusIoResource;
@@ -12,6 +11,9 @@
import java.io.IOException;
import java.io.InputStream;
import java.nio.charset.Charset;
+import org.codehaus.plexus.archiver.util.ArchiveEntryUtils;
+import org.codehaus.plexus.logging.Logger;
+import org.codehaus.plexus.logging.console.ConsoleLogger;
public class DirectoryArchiverUnpackJarTest
extends PlexusTestCase
@@ -52,12 +54,13 @@ public void test_dependency_sets_depSet_unpacked_rdonly()
archiver.createArchive();
assertTrue( new File( "target/depset_unpack/child-1/META-INF/MANIFEST.MF" ).exists() );
+ final Logger logger = new ConsoleLogger( Logger.LEVEL_DEBUG, this.getClass().getName() );
// make them writeable or mvn clean will fail
- Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/META-INF"), 0777);
- Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/META-INF/maven"), 0777);
- Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/META-INF/maven/test"), 0777);
- Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/META-INF/maven/test/child1"), 0777);
- Java7AttributeUtils.chmod( new File("target/depset_unpack/child-1/assembly-resources"), 0777);
+ ArchiveEntryUtils.chmod( new File( "target/depset_unpack/child-1/META-INF" ), 0777, logger );
+ ArchiveEntryUtils.chmod( new File( "target/depset_unpack/child-1/META-INF/maven" ), 0777, logger );
+ ArchiveEntryUtils.chmod( new File( "target/depset_unpack/child-1/META-INF/maven/test" ), 0777, logger );
+ ArchiveEntryUtils.chmod( new File( "target/depset_unpack/child-1/META-INF/maven/test/child1" ), 0777, logger );
+ ArchiveEntryUtils.chmod( new File( "target/depset_unpack/child-1/assembly-resources" ), 0777, logger );
}
}