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