As of 2.11.0, file entries added via putNextEntry have a last modified date of 1980 when ZipParameters are passed with the default lastModifiedFileTime == 0 value. 0f99010 removed some conditional logic from FileHeaderFactory.generateFileHeader:
- if (zipParameters.getLastModifiedFileTime() > 0) {
- fileHeader.setLastModifiedTime(Zip4jUtil.epochToExtendedDosTime(zipParameters.getLastModifiedFileTime()));
- } else {
- fileHeader.setLastModifiedTime(Zip4jUtil.epochToExtendedDosTime(System.currentTimeMillis()));
- }
+ fileHeader.setLastModifiedTime(Zip4jUtil.epochToExtendedDosTime(zipParameters.getLastModifiedFileTime()));
This logic was added to putNextEntry instead, but only for directory entries:
if (isZipEntryDirectory(zipParameters.getFileNameInZip())) {
clonedZipParameters.setWriteExtendedLocalFileHeader(false);
clonedZipParameters.setCompressionMethod(CompressionMethod.STORE);
clonedZipParameters.setEncryptFiles(false);
clonedZipParameters.setEntrySize(0);
+
+ if (zipParameters.getLastModifiedFileTime() <= 0) {
+ clonedZipParameters.setLastModifiedFileTime(System.currentTimeMillis());
+ }
}
As a result, the following test, which passes for 2.10.0, fails for 2.11.0 and 2.11.1:
@Test
public void recentLastModifiedTime() throws IOException {
long currentTime = System.currentTimeMillis();
ByteArrayOutputStream zip = new ByteArrayOutputStream();
try (ZipOutputStream zos = new ZipOutputStream(zip)) {
ZipParameters params = new ZipParameters();
params.setFileNameInZip("test");
zos.putNextEntry(params);
zos.write(new byte[0]);
zos.closeEntry();
}
try (ZipInputStream zis = new ZipInputStream(new ByteArrayInputStream(zip.toByteArray()))) {
ZipEntry e = zis.getNextEntry();
long zipTime = e.getTime();
// ZIP only has 2 second precision, so adjust for potential rounding.
assertTrue(currentTime < zipTime + 2000,
String.format("ZIP entry modified time (%d) should be near current time (%d)",
zipTime, currentTime));
}
}
Was this change intended as part of the fix to #434, or was this an unintended side effect?
The documentation for ZipParameters.setLastModifiedTime says:
Set the last modified time recorded in the ZIP file for the added files. If less than 0, the last modified time is cleared and the current time is used
but the current time is not being used for file entries when zipParams.getLastModifiedFileTime() <= 0 like it used to.
(I noticed a separate potential bug where ZipParameters.setLastModifiedTime just returns when lastModifiedFileTime <= 0. It doesn't actually clear the current value as the documentation indicates.)
As of 2.11.0, file entries added via
putNextEntryhave a last modified date of 1980 whenZipParametersare passed with the defaultlastModifiedFileTime == 0value. 0f99010 removed some conditional logic fromFileHeaderFactory.generateFileHeader:This logic was added to
putNextEntryinstead, but only for directory entries:if (isZipEntryDirectory(zipParameters.getFileNameInZip())) { clonedZipParameters.setWriteExtendedLocalFileHeader(false); clonedZipParameters.setCompressionMethod(CompressionMethod.STORE); clonedZipParameters.setEncryptFiles(false); clonedZipParameters.setEntrySize(0); + + if (zipParameters.getLastModifiedFileTime() <= 0) { + clonedZipParameters.setLastModifiedFileTime(System.currentTimeMillis()); + } }As a result, the following test, which passes for 2.10.0, fails for 2.11.0 and 2.11.1:
Was this change intended as part of the fix to #434, or was this an unintended side effect?
The documentation for
ZipParameters.setLastModifiedTimesays:but the current time is not being used for file entries when
zipParams.getLastModifiedFileTime() <= 0like it used to.(I noticed a separate potential bug where
ZipParameters.setLastModifiedTimejust returns whenlastModifiedFileTime <= 0. It doesn't actually clear the current value as the documentation indicates.)