This is an automated email from the ASF dual-hosted git repository. garydgregory pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/commons-compress.git
commit 09adf7138eaaca6a29c279843b850bcbc187300b Author: Gary Gregory <[email protected]> AuthorDate: Sun Aug 9 18:47:36 2026 -0400 Add and use CpioArchiveEntry.setTimeMillis(long) Use TimeUnit.MILLISECONDS.toSeconds(long). --- src/changes/changes.xml | 1 + .../commons/compress/archivers/ar/ArArchiveEntry.java | 7 ++++--- .../commons/compress/archivers/cpio/CpioArchiveEntry.java | 15 +++++++++++++-- .../compress/archivers/cpio/CpioArchiveOutputStream.java | 2 +- .../compress/archivers/zip/X5455_ExtendedTimestamp.java | 9 +++++---- .../commons/compress/harmony/pack200/FileBands.java | 3 ++- .../org/apache/commons/compress/archivers/CpioTest.java | 6 +++--- .../compress/archivers/lha/LhaArchiveInputStreamTest.java | 3 ++- .../archivers/tar/TarArchiveOutputStreamTest.java | 4 +++- .../archivers/zip/X5455_ExtendedTimestampTest.java | 3 ++- 10 files changed, 36 insertions(+), 17 deletions(-) diff --git a/src/changes/changes.xml b/src/changes/changes.xml index 955b3500c..40688e169 100644 --- a/src/changes/changes.xml +++ b/src/changes/changes.xml @@ -199,6 +199,7 @@ The <action> type attribute can be add,update,fix,remove. <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use ArchiveException.requireNonNegative(long, String).</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use ArchiveException.requireNonNull(T, String).</action> <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use CompressException.requireNonNull(Class, T, String).</action> + <action type="add" dev="ggregory" due-to="Gary Gregory">Add and use CpioArchiveEntry.setTimeMillis(long).</action> <!-- UPDATE --> <action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-parent from 85 to 103 #707, #752.</action> <action type="update" dev="ggregory" due-to="Gary Gregory">Bump org.apache.commons:commons-lang3 from 3.18.0 to 3.20.0.</action> diff --git a/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveEntry.java index efe95ff1d..efe49bb22 100644 --- a/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveEntry.java +++ b/src/main/java/org/apache/commons/compress/archivers/ar/ArArchiveEntry.java @@ -26,6 +26,7 @@ import java.nio.file.Path; import java.util.Date; import java.util.Objects; +import java.util.concurrent.TimeUnit; import org.apache.commons.compress.archivers.ArchiveEntry; @@ -88,7 +89,7 @@ public class ArArchiveEntry implements ArchiveEntry { */ public ArArchiveEntry(final File inputFile, final String entryName) { // TODO sort out mode - this(entryName, inputFile.isFile() ? inputFile.length() : 0, 0, 0, DEFAULT_MODE, inputFile.lastModified() / 1000); + this(entryName, inputFile.isFile() ? inputFile.length() : 0, 0, 0, DEFAULT_MODE, TimeUnit.MILLISECONDS.toSeconds(inputFile.lastModified())); } /** @@ -102,7 +103,7 @@ public ArArchiveEntry(final File inputFile, final String entryName) { */ public ArArchiveEntry(final Path inputPath, final String entryName, final LinkOption... options) throws IOException { this(entryName, Files.isRegularFile(inputPath, options) ? Files.size(inputPath) : 0, 0, 0, DEFAULT_MODE, - Files.getLastModifiedTime(inputPath, options).toMillis() / 1000); + Files.getLastModifiedTime(inputPath, options).to(TimeUnit.SECONDS)); } /** @@ -116,7 +117,7 @@ public ArArchiveEntry(final Path inputPath, final String entryName, final LinkOp * @param length length of the entry in bytes. */ public ArArchiveEntry(final String name, final long length) { - this(name, length, 0, 0, DEFAULT_MODE, System.currentTimeMillis() / 1000); + this(name, length, 0, 0, DEFAULT_MODE, TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())); } /** diff --git a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java index 2b4e6c7f2..aede81125 100644 --- a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java +++ b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java @@ -27,6 +27,7 @@ import java.nio.file.attribute.FileTime; import java.util.Date; import java.util.Objects; +import java.util.concurrent.TimeUnit; import org.apache.commons.compress.archivers.ArchiveEntry; import org.apache.commons.compress.archivers.ArchiveException; @@ -294,7 +295,7 @@ public CpioArchiveEntry(final short format, final File inputFile, final String e throw new IllegalArgumentException("Cannot determine type of file " + inputFile.getName()); } // TODO set other fields as needed - setTime(inputFile.lastModified() / 1000); + setTimeMillis(inputFile.lastModified()); } /** @@ -931,12 +932,22 @@ public void setTime(final FileTime time) { /** * Sets the time in seconds. * - * @param time The time to set. + * @param time The time to set in seconds. */ public void setTime(final long time) { this.mtime = time; } + /** + * Sets the time in milliseconds. + * + * @param time The time to set in milliseconds. + * @since 1.29.0 + */ + public void setTimeMillis(final long time) { + this.mtime = TimeUnit.MILLISECONDS.toSeconds(time); + } + /** * Sets the user id. * diff --git a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java index d627e52b7..cd20b3427 100644 --- a/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java +++ b/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveOutputStream.java @@ -291,7 +291,7 @@ public void putArchiveEntry(final CpioArchiveEntry entry) throws IOException { closeArchiveEntry(); // close previous entry } if (entry.getTime() == -1) { - entry.setTime(System.currentTimeMillis() / 1000); + entry.setTimeMillis(System.currentTimeMillis()); } final short format = entry.getFormat(); if (format != this.entryFormat) { diff --git a/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java b/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java index e23ad1eb3..3e6059124 100644 --- a/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java +++ b/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java @@ -23,6 +23,7 @@ import java.util.Arrays; import java.util.Date; import java.util.Objects; +import java.util.concurrent.TimeUnit; import java.util.zip.ZipException; import org.apache.commons.io.file.attribute.FileTimes; @@ -103,14 +104,14 @@ public class X5455_ExtendedTimestamp implements ZipExtraField, Cloneable, Serial * <p/> * Also makes sure the converted ZipLong is not too big to fit in 32 unsigned bits. * - * @param d java.util.Date to convert to ZipLong. + * @param date java.util.Date to convert to ZipLong. * @return ZipLong. */ - private static ZipLong dateToZipLong(final Date d) { - if (d == null) { + private static ZipLong dateToZipLong(final Date date) { + if (date == null) { return null; } - return unixTimeToZipLong(d.getTime() / 1000); + return unixTimeToZipLong(TimeUnit.MILLISECONDS.toSeconds(date.getTime())); } /** diff --git a/src/main/java/org/apache/commons/compress/harmony/pack200/FileBands.java b/src/main/java/org/apache/commons/compress/harmony/pack200/FileBands.java index 5a2e1efe9..b9adaeec1 100644 --- a/src/main/java/org/apache/commons/compress/harmony/pack200/FileBands.java +++ b/src/main/java/org/apache/commons/compress/harmony/pack200/FileBands.java @@ -25,6 +25,7 @@ import java.util.List; import java.util.Set; import java.util.TimeZone; +import java.util.concurrent.TimeUnit; import org.apache.commons.compress.harmony.pack200.Archive.PackingFile; import org.apache.commons.compress.harmony.pack200.Archive.SegmentUnit; @@ -101,7 +102,7 @@ public FileBands(final CpBands cpBands, final SegmentHeader segmentHeader, final file_size[i] = bytes.length; totalSize = Pack200Exception.addExact(totalSize, file_size[i]); // update modification time - modtime = (packingFile.getModtime() + TimeZone.getDefault().getRawOffset()) / 1000L; + modtime = TimeUnit.MILLISECONDS.toSeconds(packingFile.getModtime() + TimeZone.getDefault().getRawOffset()); file_modtime[i] = (int) (modtime - archiveModtime); if (isLatest && latestModtime < file_modtime[i]) { latestModtime = file_modtime[i]; diff --git a/src/test/java/org/apache/commons/compress/archivers/CpioTest.java b/src/test/java/org/apache/commons/compress/archivers/CpioTest.java index 72efa86a8..716330fa9 100644 --- a/src/test/java/org/apache/commons/compress/archivers/CpioTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/CpioTest.java @@ -138,7 +138,7 @@ void testExplicitDirectoryEntry() throws Exception { try (CpioArchiveOutputStream tos = new CpioArchiveOutputStream(Files.newOutputStream(archive.toPath()))) { beforeArchiveWrite = getTempDirFile().lastModified(); final CpioArchiveEntry in = new CpioArchiveEntry("foo/"); - in.setTime(beforeArchiveWrite / 1000); + in.setTimeMillis(beforeArchiveWrite); in.setMode(CpioConstants.C_ISDIR); tos.putArchiveEntry(in); tos.closeArchiveEntry(); @@ -160,7 +160,7 @@ void testExplicitFileEntry() throws Exception { final File archive = createTempFile("test.", ".cpio"); try (CpioArchiveOutputStream tos = new CpioArchiveOutputStream(Files.newOutputStream(archive.toPath()))) { final CpioArchiveEntry in = new CpioArchiveEntry("foo"); - in.setTime(tmp.lastModified() / 1000); + in.setTimeMillis(tmp.lastModified()); in.setSize(tmp.length()); in.setMode(CpioConstants.C_ISREG); tos.putArchiveEntry(in); @@ -211,7 +211,7 @@ void testSymbolicLinkFileEntry() throws Exception { final Charset charset = StandardCharsets.UTF_8; try (CpioArchiveOutputStream tos = new CpioArchiveOutputStream(Files.newOutputStream(archive.toPath()))) { final CpioArchiveEntry entry = new CpioArchiveEntry(name); - entry.setTime(tmp.lastModified() / 1000); + entry.setTimeMillis(tmp.lastModified()); entry.setSize(nameLink.length()); entry.setMode(CpioConstants.C_ISLNK); assertTrue(entry.isSymbolicLink()); diff --git a/src/test/java/org/apache/commons/compress/archivers/lha/LhaArchiveInputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/lha/LhaArchiveInputStreamTest.java index 2b25da5fb..56ef47c23 100644 --- a/src/test/java/org/apache/commons/compress/archivers/lha/LhaArchiveInputStreamTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/lha/LhaArchiveInputStreamTest.java @@ -40,6 +40,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.concurrent.TimeUnit; import org.apache.commons.compress.AbstractTest; import org.apache.commons.compress.archivers.ArchiveException; @@ -633,7 +634,7 @@ void testParseExtendedHeaderUnixTimestamp() throws IOException { // Valid final LhaArchiveEntry.Builder entryBuilder = LhaArchiveEntry.builder(); archive.parseExtendedHeader(toByteBuffer(0x54, 0x5c, 0x73, 0x9c, 0x68, 0x00, 0x00), entryBuilder); - assertEquals(0x689c735cL, entryBuilder.get().getLastModifiedDate().getTime() / 1000); + assertEquals(0x689c735cL, TimeUnit.MILLISECONDS.toSeconds(entryBuilder.get().getLastModifiedDate().getTime())); // Invalid length try { archive.parseExtendedHeader(toByteBuffer(0x54, 0x5c, 0x73, 0x9c, 0x00, 0x00), entryBuilder); diff --git a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java index 137f9eb1e..38097564f 100644 --- a/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/tar/TarArchiveOutputStreamTest.java @@ -41,6 +41,7 @@ import java.util.Date; import java.util.HashMap; import java.util.Map; +import java.util.concurrent.TimeUnit; import org.apache.commons.compress.AbstractTest; import org.apache.commons.compress.archivers.ArchiveEntry; @@ -212,7 +213,8 @@ void testLongNameMd5Hash() throws Exception { final ArchiveEntry nextEntry = tarIn.getNextEntry(); assertEquals(longFileName, nextEntry.getName()); // tar archive stores modification time to second granularity only (floored) - assertEquals(modificationDate.getTime() / 1000, nextEntry.getLastModifiedDate().getTime() / 1000); + assertEquals(TimeUnit.MILLISECONDS.toSeconds(modificationDate.getTime()), + TimeUnit.MILLISECONDS.toSeconds(nextEntry.getLastModifiedDate().getTime())); } } diff --git a/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java b/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java index a25017642..c329087bb 100644 --- a/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java +++ b/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java @@ -40,6 +40,7 @@ import java.util.Date; import java.util.Enumeration; import java.util.TimeZone; +import java.util.concurrent.TimeUnit; import java.util.zip.ZipException; import org.apache.commons.compress.AbstractTest; @@ -193,7 +194,7 @@ void testGettersSetters() { cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); final long timeMillis = cal.getTimeInMillis(); - final ZipLong time = new ZipLong(timeMillis / 1000); + final ZipLong time = new ZipLong(TimeUnit.MILLISECONDS.toSeconds(timeMillis)); // set too big // Java time is 1000 x larger (milliseconds).
