From 7cd7ea8d6dbf6ad98b9b1fa201116840c791c630 Mon Sep 17 00:00:00 2001 From: Daniel Wegener Date: Fri, 1 Jul 2016 13:57:09 +0200 Subject: [PATCH] Add fixedEntryModificationTime attribute to AbstractZipArchiver to override zipEntry times globally. closes #48 --- .../archiver/zip/AbstractZipArchiver.java | 26 ++++++++++++++++++- .../plexus/archiver/zip/ZipArchiverTest.java | 18 +++++++++++++ 2 files changed, 43 insertions(+), 1 deletion(-) 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 c69f69c2c..16cdbf43d 100755 --- a/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java +++ b/src/main/java/org/codehaus/plexus/archiver/zip/AbstractZipArchiver.java @@ -56,6 +56,11 @@ public abstract class AbstractZipArchiver extends AbstractArchiver { + /** + * The minimum value for MS-DOS time format: 01 Jan 1980 00:00:00 UTC + **/ + private static final Long MIN_MS_DOS_TIME = 315532800000L; + private String comment; /** @@ -132,6 +137,12 @@ public abstract class AbstractZipArchiver protected ZipArchiveOutputStream zipArchiveOutputStream; + /** + * Will always use the given modification time for zipEntries if set. + * The given modification time will be rounded up to {@link AbstractZipArchiver#MIN_MS_DOS_TIME}. + */ + private Long fixedEntryModificationTime; + private static int getJavaVersion() { String javaSpecVersion = System.getProperty( "java.specification.version" ); @@ -212,6 +223,14 @@ public boolean isFilesonly() return doFilesonly; } + public Long getFixedEntryModificationTime() { + return fixedEntryModificationTime; + } + + public void setFixedEntryModificationTime(Long fixedEntryModificationTime) { + this.fixedEntryModificationTime = fixedEntryModificationTime; + } + @Override protected void execute() throws ArchiverException, IOException @@ -578,7 +597,12 @@ public InputStream get() private void setTime( java.util.zip.ZipEntry zipEntry, long lastModified ) { - zipEntry.setTime( lastModified + ( isJava7OrLower ? 1999 : 0 ) ); + + if (fixedEntryModificationTime != null) { + zipEntry.setTime(Math.max(MIN_MS_DOS_TIME, fixedEntryModificationTime)); + } else { + zipEntry.setTime( lastModified + ( isJava7OrLower ? 1999 : 0 ) ); + } /* Consider adding extended file stamp support..... 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 615e59226..64fbc2046 100644 --- a/src/test/java/org/codehaus/plexus/archiver/zip/ZipArchiverTest.java +++ b/src/test/java/org/codehaus/plexus/archiver/zip/ZipArchiverTest.java @@ -797,4 +797,22 @@ public void testForcedFileModes() } } + public void testFixedEntryModificationTime() + throws IOException + { + final long almostMinDosTime = 315532802000L; + final File zipFile = getTestFile( "target/output/zip-with-fixed-entry-modification-times.zip" ); + final ZipArchiver archiver = getZipArchiver( zipFile ); + archiver.setFixedEntryModificationTime(almostMinDosTime); + archiver.addDirectory(new File( "src/test/resources/zip-timestamp")); + archiver.createArchive(); + + assertTrue( zipFile.exists() ); + final ZipFile zf = new ZipFile( zipFile ); + assertEquals(new Date(almostMinDosTime), zf.getEntry( "file-with-even-time.txt" ).getLastModifiedDate()); + assertEquals(new Date(almostMinDosTime), zf.getEntry( "file-with-odd-time.txt" ).getLastModifiedDate()); + assertEquals(new Date(almostMinDosTime), zf.getEntry( "foo/" ).getLastModifiedDate()); + } + } +