diff --git a/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java b/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java index 9de82a720..6abf673ed 100755 --- a/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/AbstractArchiver.java @@ -22,6 +22,7 @@ import java.lang.reflect.UndeclaredThrowableException; import java.nio.charset.Charset; import java.nio.file.Files; +import java.nio.file.attribute.FileTime; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; @@ -107,10 +108,7 @@ public abstract class AbstractArchiver */ private boolean useJvmChmod = true; - /** - * @since 4.2.0 - */ - private Date lastModifiedDate; + private FileTime lastModifiedTime; /** * @since 4.2.0 @@ -1208,16 +1206,36 @@ public void setIgnorePermissions( final boolean ignorePermissions ) this.ignorePermissions = ignorePermissions; } + /** + * @deprecated Use {@link #setLastModifiedTime(FileTime)} instead. + */ @Override + @Deprecated public void setLastModifiedDate( Date lastModifiedDate ) { - this.lastModifiedDate = lastModifiedDate; + this.lastModifiedTime = lastModifiedDate != null ? FileTime.fromMillis( lastModifiedDate.getTime() ) : null; } + /** + * @deprecated Use {@link #getLastModifiedTime()} instead. + */ @Override + @Deprecated public Date getLastModifiedDate() { - return lastModifiedDate; + return lastModifiedTime != null ? new Date( lastModifiedTime.toMillis() ) : null; + } + + @Override + public void setLastModifiedTime( FileTime lastModifiedTime ) + { + this.lastModifiedTime = lastModifiedTime; + } + + @Override + public FileTime getLastModifiedTime() + { + return lastModifiedTime; } @Override @@ -1279,11 +1297,21 @@ public String getOverrideGroupName() return overrideGroupName; } + /** + * @deprecated Use {@link #configureReproducibleBuild(FileTime)} instead. + */ @Override + @Deprecated public void configureReproducible( Date lastModifiedDate ) + { + configureReproducibleBuild( FileTime.fromMillis( lastModifiedDate.getTime() ) ); + } + + @Override + public void configureReproducibleBuild( FileTime lastModifiedTime ) { // 1. force last modified date - setLastModifiedDate( normalizeLastModifiedDate( lastModifiedDate ) ); + setLastModifiedTime( normalizeLastModifiedTime ( lastModifiedTime ) ); // 2. sort filenames in each directory when scanning filesystem setFilenameComparator( new Comparator() @@ -1309,14 +1337,18 @@ public int compare( String s1, String s2 ) /** * Normalize last modified time value to get reproducible archive entries, based on - * archive binary format (tar uses UTC timestamp but zip uses local time then requires - * tweaks to make the value reproducible whatever the current timezone is). + * archive binary format. + * + *

tar uses UTC timestamp, but zip uses local time then requires + * tweaks to make the value reproducible whatever the current timezone is. + * + * @param lastModifiedTime The last modification time + * @return The normalized last modification time * - * @param lastModifiedDate - * @return + * @see #configureReproducibleBuild(FileTime) */ - protected Date normalizeLastModifiedDate( Date lastModifiedDate ) + protected FileTime normalizeLastModifiedTime( FileTime lastModifiedTime ) { - return lastModifiedDate; + return lastModifiedTime; } } diff --git a/src/main/java/org/codehaus/plexus/archiver/Archiver.java b/src/main/java/org/codehaus/plexus/archiver/Archiver.java index f325aa35f..0ba6be645 100644 --- a/src/main/java/org/codehaus/plexus/archiver/Archiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/Archiver.java @@ -19,11 +19,13 @@ import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.attribute.FileTime; import java.util.Comparator; import java.util.Date; import java.util.HashSet; import java.util.Map; import java.util.Set; + import javax.annotation.Nonnull; import org.codehaus.plexus.components.io.resources.PlexusIoResource; import org.codehaus.plexus.components.io.resources.PlexusIoResourceCollection; @@ -390,14 +392,38 @@ ResourceIterator getResources() * * @param lastModifiedDate * @since 4.2.0 + * @deprecated Use {@link #setLastModifiedTime(FileTime)} instead */ + @Deprecated void setLastModifiedDate( final Date lastModifiedDate ); /** * @since 4.2.0 + * @deprecated Use {@link #getLastModifiedTime()} instead */ + @Deprecated Date getLastModifiedDate(); + /** + * Sets the last modification time of the entries (if non null). + * + * @param lastModifiedTime to set in the archive entries + * + * @see #getLastModifiedTime() + * @since 4.3.0 + */ + void setLastModifiedTime( final FileTime lastModifiedTime ); + + /** + * Returns the last modification time of the archiver. + * + * @return The last modification time of the archiver, null if not specified + * + * @see #setLastModifiedTime(FileTime) + * @since 4.3.0 + */ + FileTime getLastModifiedTime(); + /** * Set filename comparator, used to sort file entries when scanning directories since File.list() does not * guarantee any order. @@ -446,6 +472,17 @@ ResourceIterator getResources() */ String getOverrideGroupName(); + /** + * This method is obsolete and will just call {@link #configureReproducibleBuild(FileTime)} + * with the Date transformed into FileTime. + * + * @param lastModifiedDate the date to use for archive entries last modified time + * @since 4.2.0 + * @deprecated Use {@link #configureReproducibleBuild(FileTime)} instead. + */ + @Deprecated + void configureReproducible( Date lastModifiedDate ); + /** * Configure the archiver to create archives in a reproducible way (see * Reproducible Builds). @@ -455,9 +492,11 @@ ResourceIterator getResources() *

  • defined entries timestamp
  • *
  • and reproducible entries Unix mode.
  • * - * - * @param lastModifiedDate the date to use for archive entries last modified time - * @since 4.2.0 + * + * @param lastModifiedTime The last modification time of the entries + * + * @see Reproducible Builds + * @since 4.3.0 */ - void configureReproducible( Date lastModifiedDate ); + void configureReproducibleBuild( FileTime lastModifiedTime ); } diff --git a/src/main/java/org/codehaus/plexus/archiver/diags/DelgatingArchiver.java b/src/main/java/org/codehaus/plexus/archiver/diags/DelgatingArchiver.java index e4b8a807f..f51c1b4ff 100644 --- a/src/main/java/org/codehaus/plexus/archiver/diags/DelgatingArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/diags/DelgatingArchiver.java @@ -18,6 +18,7 @@ import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.attribute.FileTime; import java.util.Comparator; import java.util.Date; import java.util.Map; @@ -333,18 +334,38 @@ public void setIgnorePermissions( boolean ignorePermissions ) target.setIgnorePermissions( ignorePermissions ); } + /** + * @deprecated Use {@link #setLastModifiedTime(FileTime)} instead. + */ @Override + @Deprecated public void setLastModifiedDate( final Date lastModifiedDate ) { target.setLastModifiedDate( lastModifiedDate ); } + /** + * @deprecated Use {@link #getLastModifiedTime()} instead. + */ @Override + @Deprecated public Date getLastModifiedDate() { return target.getLastModifiedDate(); } + @Override + public void setLastModifiedTime( final FileTime lastModifiedTime ) + { + target.setLastModifiedTime( lastModifiedTime ); + } + + @Override + public FileTime getLastModifiedTime() + { + return target.getLastModifiedTime(); + } + @Override public void setFilenameComparator( final Comparator filenameComparator ) { @@ -399,10 +420,20 @@ public String getOverrideGroupName() return target.getOverrideGroupName(); } + /** + * @deprecated Use {@link #configureReproducibleBuild(FileTime)} instead. + */ @Override + @Deprecated public void configureReproducible( Date lastModifiedDate ) { target.configureReproducible( lastModifiedDate ); } + @Override + public void configureReproducibleBuild( FileTime lastModifiedTime ) + { + target.configureReproducibleBuild( lastModifiedTime ); + } + } diff --git a/src/main/java/org/codehaus/plexus/archiver/diags/NoOpArchiver.java b/src/main/java/org/codehaus/plexus/archiver/diags/NoOpArchiver.java index 2cca73291..35d2f8a64 100644 --- a/src/main/java/org/codehaus/plexus/archiver/diags/NoOpArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/diags/NoOpArchiver.java @@ -18,6 +18,7 @@ import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.attribute.FileTime; import java.util.Collections; import java.util.Comparator; import java.util.Date; @@ -348,18 +349,38 @@ public void setIgnorePermissions( boolean ignorePermissions ) this.ignorePermissions = ignorePermissions; } + /** + * @deprecated Use {@link #setLastModifiedTime(FileTime)} instead. + */ @Override + @Deprecated public void setLastModifiedDate( final Date lastModifiedDate ) { } + /** + * @deprecated Use {@link #getLastModifiedTime()} instead. + */ @Override + @Deprecated public Date getLastModifiedDate() { return null; } + @Override + public void setLastModifiedTime( final FileTime lastModifiedTime ) + { + + } + + @Override + public FileTime getLastModifiedTime() + { + return null; + } + @Override public void setFilenameComparator( final Comparator filenameComparator ) { @@ -414,10 +435,20 @@ public String getOverrideGroupName() return null; } + /** + * @deprecated Use {@link #configureReproducibleBuild(FileTime)} instead. + */ @Override + @Deprecated public void configureReproducible( Date lastModifiedDate ) { } + @Override + public void configureReproducibleBuild( FileTime lastModifiedTime ) + { + + } + } diff --git a/src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java b/src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java index c1fb40c43..6386d4478 100644 --- a/src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/diags/TrackingArchiver.java @@ -18,16 +18,19 @@ */ package org.codehaus.plexus.archiver.diags; +import javax.annotation.Nonnull; + import java.io.File; import java.io.IOException; import java.nio.charset.Charset; +import java.nio.file.attribute.FileTime; import java.util.ArrayList; import java.util.Comparator; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import javax.annotation.Nonnull; + import org.codehaus.plexus.archiver.ArchiveEntry; import org.codehaus.plexus.archiver.ArchivedFileSet; import org.codehaus.plexus.archiver.Archiver; @@ -54,7 +57,7 @@ public class TrackingArchiver private boolean ignorePermissions; - private Date lastModified; + private FileTime lastModifiedTime; private Comparator filenameComparator; @@ -406,18 +409,37 @@ public void setIgnorePermissions( final boolean ignorePermissions ) this.ignorePermissions = ignorePermissions; } + /** + * @deprecated Use {@link #setLastModifiedTime(FileTime)} instead. + */ @Override + @Deprecated public void setLastModifiedDate( final Date lastModifiedDate ) { - this.lastModified = lastModifiedDate; + this.lastModifiedTime = lastModifiedDate != null ? FileTime.fromMillis( lastModifiedDate.getTime() ) : null; } + /** + * @deprecated Use {@link #getLastModifiedTime()} instead. + */ @Override + @Deprecated public Date getLastModifiedDate() { - return lastModified; + return lastModifiedTime != null ? new Date( lastModifiedTime.toMillis() ) : null; } + @Override + public void setLastModifiedTime( final FileTime lastModifiedTime ) + { + this.lastModifiedTime = lastModifiedTime; + } + + @Override + public FileTime getLastModifiedTime() + { + return lastModifiedTime; + } @Override public void setFilenameComparator( final Comparator filenameComparator ) @@ -425,6 +447,11 @@ public void setFilenameComparator( final Comparator filenameComparator ) this.filenameComparator = filenameComparator; } + public Comparator getFilenameComparator() + { + return filenameComparator; + } + @Override public void setOverrideUid( int uid ) { @@ -469,8 +496,17 @@ public String getOverrideGroupName() return null; } + /** + * @deprecated Use {@link #configureReproducibleBuild(FileTime)} instead. + */ @Override + @Deprecated public void configureReproducible( Date lastModifiedDate ) { } + + @Override + public void configureReproducibleBuild( FileTime lastModifiedTime ) + { + } } diff --git a/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java b/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java index d424e7d1b..b9945c39d 100644 --- a/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/dir/DirectoryArchiver.java @@ -17,6 +17,8 @@ import java.io.File; import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.attribute.FileTime; import java.util.ArrayList; import java.util.List; import org.codehaus.plexus.archiver.AbstractArchiver; @@ -173,7 +175,14 @@ else if ( !outFile.mkdirs() ) @Override public void run() { - setFileModes( entry, outFile, inLastModified ); + try + { + setFileModes( entry, outFile, inLastModified ); + } + catch ( IOException e ) + { + throw new ArchiverException( "Failed setting file attributes", e ); + } } } ); @@ -194,21 +203,23 @@ private static void makeParentDirectories( File file ) { } private void setFileModes( ArchiveEntry entry, File outFile, long inLastModified ) + throws IOException { if ( !isIgnorePermissions() ) { ArchiveEntryUtils.chmod( outFile, entry.getMode() ); } - if ( getLastModifiedDate() == null ) + if ( getLastModifiedTime() == null ) { - outFile.setLastModified( inLastModified == PlexusIoResource.UNKNOWN_MODIFICATION_DATE - ? System.currentTimeMillis() - : inLastModified ); + FileTime fromMillis = FileTime.fromMillis( inLastModified == PlexusIoResource.UNKNOWN_MODIFICATION_DATE + ? System.currentTimeMillis() + : inLastModified ); + Files.setLastModifiedTime( outFile.toPath(), fromMillis ); } else { - outFile.setLastModified( getLastModifiedDate().getTime() ); + Files.setLastModifiedTime( outFile.toPath(), getLastModifiedTime() ); } } diff --git a/src/main/java/org/codehaus/plexus/archiver/tar/TarArchiver.java b/src/main/java/org/codehaus/plexus/archiver/tar/TarArchiver.java index 46978ab9a..8d8bd85d7 100644 --- a/src/main/java/org/codehaus/plexus/archiver/tar/TarArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/tar/TarArchiver.java @@ -283,7 +283,7 @@ else if ( longFileMode.isFailMode() ) te = new TarArchiveEntry( vPath ); } - if ( getLastModifiedDate() == null ) + if ( getLastModifiedTime() == null ) { long teLastModified = entry.getResource().getLastModified(); te.setModTime( teLastModified == PlexusIoResource.UNKNOWN_MODIFICATION_DATE @@ -292,7 +292,7 @@ else if ( longFileMode.isFailMode() ) } else { - te.setModTime( getLastModifiedDate() ); + te.setModTime( getLastModifiedTime().toMillis() ); } if ( entry.getType() == ArchiveEntry.SYMLINK ) 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 ac0d56a28..136c29e43 100755 --- a/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java @@ -27,10 +27,12 @@ import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.nio.file.Files; +import java.nio.file.attribute.FileTime; import java.util.Calendar; -import java.util.Date; import java.util.Deque; import java.util.Hashtable; +import java.util.Locale; +import java.util.TimeZone; import java.util.concurrent.ExecutionException; import java.util.zip.CRC32; @@ -534,9 +536,9 @@ public InputStream get() private void setTime( java.util.zip.ZipEntry zipEntry, long lastModified ) { - if ( getLastModifiedDate() != null ) + if ( getLastModifiedTime() != null ) { - lastModified = getLastModifiedDate().getTime(); + lastModified = getLastModifiedTime().toMillis(); } // Zip archives store file modification times with a @@ -838,12 +840,12 @@ protected String getArchiveType() } @Override - protected Date normalizeLastModifiedDate( Date lastModifiedDate ) + protected FileTime normalizeLastModifiedTime( FileTime lastModifiedTime ) { // timestamp of zip entries at zip storage level ignores timezone: managed in ZipEntry.setTime, // that turns javaToDosTime: need to revert the operation here to get reproducible // zip entry time - return new Date( dosToJavaTime( lastModifiedDate.getTime() ) ); + return FileTime.fromMillis( dosToJavaTime( lastModifiedTime.toMillis() ) ); } /** @@ -854,7 +856,7 @@ protected Date normalizeLastModifiedDate( Date lastModifiedDate ) */ private static long dosToJavaTime( long dosTime ) { - Calendar cal = Calendar.getInstance(); + Calendar cal = Calendar.getInstance( TimeZone.getDefault(), Locale.ROOT ); cal.setTimeInMillis( dosTime ); return dosTime - ( cal.get( Calendar.ZONE_OFFSET ) + cal.get( Calendar.DST_OFFSET ) ); } diff --git a/src/main/java/org/codehaus/plexus/archiver/zip/ZipResource.java b/src/main/java/org/codehaus/plexus/archiver/zip/ZipResource.java index a30f1501c..2df6ac012 100644 --- a/src/main/java/org/codehaus/plexus/archiver/zip/ZipResource.java +++ b/src/main/java/org/codehaus/plexus/archiver/zip/ZipResource.java @@ -29,7 +29,7 @@ public class ZipResource extends AbstractPlexusIoResource public ZipResource( ZipFile zipFile, ZipArchiveEntry entry, InputStreamTransformer streamTransformer ) { - super( entry.getName(), getLastModofied( entry ), + super( entry.getName(), getLastModified( entry ), entry.isDirectory() ? PlexusIoResource.UNKNOWN_RESOURCE_SIZE : entry.getSize(), !entry.isDirectory(), entry.isDirectory(), true ); @@ -38,10 +38,10 @@ public ZipResource( ZipFile zipFile, ZipArchiveEntry entry, InputStreamTransform this.streamTransformer = streamTransformer; } - private static long getLastModofied( ZipArchiveEntry entry ) + private static long getLastModified( ZipArchiveEntry entry ) { - long l = entry.getLastModifiedDate().getTime(); - return l == -1 ? PlexusIoResource.UNKNOWN_MODIFICATION_DATE : l; + long time = entry.getTime(); + return time == -1 ? PlexusIoResource.UNKNOWN_MODIFICATION_DATE : time; } @Override diff --git a/src/test/java/org/codehaus/plexus/archiver/jar/BaseJarArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/jar/BaseJarArchiverTest.java index c76b842dd..16c818bf4 100644 --- a/src/test/java/org/codehaus/plexus/archiver/jar/BaseJarArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/jar/BaseJarArchiverTest.java @@ -16,23 +16,24 @@ */ package org.codehaus.plexus.archiver.jar; -import org.codehaus.plexus.archiver.ArchiverException; -import org.codehaus.plexus.util.IOUtil; -import org.junit.Test; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.nio.file.Files; import java.nio.file.Paths; +import java.util.Calendar; import java.util.Enumeration; +import java.util.Locale; +import java.util.TimeZone; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; +import org.codehaus.plexus.archiver.ArchiverException; +import org.codehaus.plexus.util.IOUtil; +import org.junit.Test; public abstract class BaseJarArchiverTest { @@ -73,6 +74,13 @@ public void testCreateJar() } } + protected static long normalizeLastModifiedTime( long dosTime ) + { + Calendar cal = Calendar.getInstance( TimeZone.getDefault(), Locale.ROOT ); + cal.setTimeInMillis( dosTime ); + return dosTime - ( cal.get( Calendar.ZONE_OFFSET ) + cal.get( Calendar.DST_OFFSET ) ); + } + protected abstract JarArchiver getJarArchiver(); } diff --git a/src/test/java/org/codehaus/plexus/archiver/jar/JarArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/jar/JarArchiverTest.java index d8fa00772..d0b9471ae 100644 --- a/src/test/java/org/codehaus/plexus/archiver/jar/JarArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/jar/JarArchiverTest.java @@ -1,10 +1,22 @@ package org.codehaus.plexus.archiver.jar; +import static org.junit.Assert.assertEquals; + import java.io.File; import java.io.IOException; import java.io.OutputStream; import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.attribute.FileTime; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.List; import java.util.Random; +import java.util.TimeZone; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import org.codehaus.plexus.archiver.ArchiverException; import org.junit.Test; @@ -76,6 +88,67 @@ public void testVeryLargeJar() archiver.createArchive(); } + @Test + public void testReproducibleBuild() + throws IOException, ManifestException, ParseException + { + String[] tzList = { "America/Managua", "America/New_York", "America/Buenos_Aires", "America/Sao_Paulo", + "America/Los_Angeles", "Africa/Cairo", "Africa/Lagos", "Africa/Nairobi", "Europe/Lisbon", "Europe/Madrid", + "Europe/Moscow", "Europe/Oslo", "Australia/Sydney", "Asia/Tokyo", "Asia/Singapore", "Asia/Qatar", + "Asia/Seoul", "Atlantic/Bermuda", "UTC", "GMT", "Etc/GMT-14" }; + for ( String tzId : tzList ) + { + // Every single run with different Time Zone should set the same modification time. + createReproducibleBuild( tzId ); + } + } + + private void createReproducibleBuild( String timeZoneId ) + throws IOException, ManifestException, ParseException + { + final TimeZone defaultTz = TimeZone.getDefault(); + TimeZone.setDefault( TimeZone.getTimeZone( timeZoneId ) ); + try + { + String tzName = timeZoneId.substring( timeZoneId.lastIndexOf( '/' ) + 1 ); + Path jarFile = Files.createTempFile( "JarArchiverTest-" + tzName + "-", ".jar" ); + jarFile.toFile().deleteOnExit(); + + Manifest manifest = new Manifest(); + Manifest.Attribute attribute = new Manifest.Attribute( "Main-Class", "com.example.app.Main" ); + manifest.addConfiguredAttribute( attribute ); + + JarArchiver archiver = getJarArchiver(); + archiver.setDestFile( jarFile.toFile() ); + archiver.addConfiguredManifest( manifest ); + archiver.addDirectory( new File( "src/test/resources/java-classes" ) ); + + SimpleDateFormat isoFormat = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssXXX" ); + long parsedTime = isoFormat.parse( "2038-01-19T03:14:08Z" ).getTime(); + FileTime lastModTime = FileTime.fromMillis( parsedTime ); + + archiver.configureReproducibleBuild( lastModTime ); + archiver.createArchive(); + + // zip 2 seconds precision, normalized to UTC + long expectedTime = normalizeLastModifiedTime( parsedTime - ( parsedTime % 2000 ) ); + try ( ZipFile zip = new ZipFile( jarFile.toFile() ) ) + { + Enumeration entries = zip.entries(); + while ( entries.hasMoreElements() ) + { + ZipEntry entry = entries.nextElement(); + long time = entry.getTime(); + assertEquals( "last modification time does not match", expectedTime, time ); + } + } + } + finally + { + TimeZone.setDefault( defaultTz ); + } + } + @Override protected JarArchiver getJarArchiver() { diff --git a/src/test/java/org/codehaus/plexus/archiver/zip/ArchiveFileComparator.java b/src/test/java/org/codehaus/plexus/archiver/zip/ArchiveFileComparator.java index 585971f13..a5be82c05 100644 --- a/src/test/java/org/codehaus/plexus/archiver/zip/ArchiveFileComparator.java +++ b/src/test/java/org/codehaus/plexus/archiver/zip/ArchiveFileComparator.java @@ -122,7 +122,7 @@ private static void assertEquals( ZipFile file1, ZipArchiveEntry entry1, { Assert.assertEquals( entry1.isDirectory(), entry2.isDirectory() ); Assert.assertEquals( entry1.isUnixSymlink(), entry2.isUnixSymlink() ); - long timeDelta = entry1.getLastModifiedDate().getTime() - entry2.getLastModifiedDate().getTime(); + long timeDelta = entry1.getTime() - entry2.getTime(); Assert.assertTrue( Math.abs( timeDelta ) <= 1000 ); final InputStream is1 = file1.getInputStream( entry1 ); diff --git a/src/test/java/org/codehaus/plexus/archiver/zip/ZipArchiverTest.java b/src/test/java/org/codehaus/plexus/archiver/zip/ZipArchiverTest.java index cca135c30..23c134366 100644 --- a/src/test/java/org/codehaus/plexus/archiver/zip/ZipArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/zip/ZipArchiverTest.java @@ -26,8 +26,6 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; -import java.io.FileInputStream; -import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.Writer; @@ -901,7 +899,7 @@ public void testFixedEntryModificationTime() final File zipFile = getTestFile( "target/output/zip-with-fixed-entry-modification-times.zip" ); final ZipArchiver archiver = getZipArchiver( zipFile ); - archiver.setLastModifiedDate( new Date( almostMinDosTime ) ); + archiver.setLastModifiedTime( FileTime.fromMillis( almostMinDosTime ) ); archiver.addDirectory( new File( "src/test/resources/zip-timestamp" ) ); archiver.createArchive();