You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@commons.apache.org by pe...@apache.org on 2021/01/09 03:20:36 UTC

[commons-compress] 03/13: COMPRESS-540: Implement storage of data offset in tar entries via EntryStreamOffsets instead of reinventing it

This is an automated email from the ASF dual-hosted git repository.

peterlee pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git

commit 9f7c5aa03075bda181a7a06ea47d110665979eb8
Author: theobisproject <th...@gmail.com>
AuthorDate: Fri Jul 24 10:21:07 2020 +0200

    COMPRESS-540: Implement storage of data offset in tar entries via EntryStreamOffsets instead of reinventing it
---
 .../compress/archivers/tar/TarArchiveEntry.java    | 38 +++++++++++++---------
 .../commons/compress/archivers/tar/TarFile.java    | 12 +++----
 2 files changed, 29 insertions(+), 21 deletions(-)

diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
index d4eb2ed..37e76c9 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarArchiveEntry.java
@@ -40,6 +40,7 @@ import java.util.Set;
 import java.util.concurrent.TimeUnit;
 
 import org.apache.commons.compress.archivers.ArchiveEntry;
+import org.apache.commons.compress.archivers.EntryStreamOffsets;
 import org.apache.commons.compress.archivers.zip.ZipEncoding;
 import org.apache.commons.compress.utils.ArchiveUtils;
 import org.apache.commons.compress.utils.IOUtils;
@@ -158,8 +159,7 @@ import org.apache.commons.compress.utils.IOUtils;
  * @NotThreadSafe
  */
 
-public class TarArchiveEntry implements ArchiveEntry, TarConstants {
-
+public class TarArchiveEntry implements ArchiveEntry, TarConstants, EntryStreamOffsets {
     private static final TarArchiveEntry[] EMPTY_TAR_ARCHIVE_ENTRIES = new TarArchiveEntry[0];
 
     /**
@@ -256,7 +256,7 @@ public class TarArchiveEntry implements ArchiveEntry, TarConstants {
     /** Convert millis to seconds */
     public static final int MILLIS_PER_SECOND = 1000;
 
-    private long dataPosition = -1;
+    private long dataOffset = EntryStreamOffsets.OFFSET_UNKNOWN;
 
     /**
      * Construct an empty entry and prepares the header values.
@@ -560,15 +560,15 @@ public class TarArchiveEntry implements ArchiveEntry, TarConstants {
      * @param encoding encoding to use for file names
      * @param lenient when set to true illegal values for group/userid, mode, device numbers and timestamp will be
      * ignored and the fields set to {@link #UNKNOWN}. When set to false such illegal fields cause an exception instead.
-     * @param dataPosition Position of the entry data in the random access file
+     * @param dataOffset Position of the entry data in the random access file
      * @since 1.21
      * @throws IllegalArgumentException if any of the numeric fields have an invalid format
      * @throws IOException on error
      */
     public TarArchiveEntry(final byte[] headerBuf, final ZipEncoding encoding, final boolean lenient,
-            final long dataPosition) throws IOException {
+            final long dataOffset) throws IOException {
         this(headerBuf, encoding, lenient);
-        this.dataPosition = dataPosition;
+        this.dataOffset = dataOffset;
     }
 
     /**
@@ -1203,22 +1203,30 @@ public class TarArchiveEntry implements ArchiveEntry, TarConstants {
     }
 
     /**
-     * Data position of the archive entry in a random access tar
-     * @return position of the data in the tar file. If the entry is created from a stream and therefore the data
-     * position is unknown this will return -1.
+     * {@inheritDoc}
+     * @since 1.21
+     */
+    @Override
+    public long getDataOffset() {
+        return dataOffset;
+    }
+
+    /**
+     * Set the offset of the data for the tar entry.
+     * @param dataOffset the position of the data in the tar
      * @since 1.21
      */
-    public long getDataPosition() {
-        return dataPosition;
+    public void setDataOffset(final long dataOffset) {
+        this.dataOffset = dataOffset;
     }
 
     /**
-     * Set the position of the data for the tar entry.
-     * @param dataPosition the position of the data in the tar
+     * {@inheritDoc}
      * @since 1.21
      */
-    public void setDataPosition(final long dataPosition) {
-        this.dataPosition = dataPosition;
+    @Override
+    public boolean isStreamContiguous() {
+        return true;
     }
 
     /**
diff --git a/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java b/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
index 714ff8a..c33ba2e 100644
--- a/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
+++ b/src/main/java/org/apache/commons/compress/archivers/tar/TarFile.java
@@ -233,7 +233,7 @@ public class TarFile implements Closeable {
 
         if (currEntry != null) {
             // Skip to the end of the entry
-            archive.position(currEntry.getDataPosition() + currEntry.getSize());
+            archive.position(currEntry.getDataOffset() + currEntry.getSize());
 
             skipRecordPadding();
         }
@@ -315,7 +315,7 @@ public class TarFile implements Closeable {
                 }
                 entry = new TarArchiveSparseEntry(headerBuf.array());
                 currEntry.getSparseHeaders().addAll(entry.getSparseHeaders());
-                currEntry.setDataPosition(currEntry.getDataPosition() + recordSize);
+                currEntry.setDataOffset(currEntry.getDataOffset() + recordSize);
             } while (entry.isExtended());
         }
 
@@ -373,7 +373,7 @@ public class TarFile implements Closeable {
                 // only store the input streams with non-zero size
                 if (sparseHeader.getNumbytes() > 0) {
                     long start =
-                            currEntry.getDataPosition() + sparseHeader.getOffset() - numberOfZeroBytesInSparseEntry;
+                            currEntry.getDataOffset() + sparseHeader.getOffset() - numberOfZeroBytesInSparseEntry;
                     streams.add(new BoundedSeekableByteChannelInputStream(start, sparseHeader.getNumbytes(), archive));
                 }
 
@@ -443,7 +443,7 @@ public class TarFile implements Closeable {
             }
             currEntry.setSparseHeaders(sparseHeaders);
             // data of the entry is after the pax gnu entry. So we need to update the data position once again
-            currEntry.setDataPosition(currEntry.getDataPosition() + recordSize);
+            currEntry.setDataOffset(currEntry.getDataOffset() + recordSize);
         }
 
         // sparse headers are all done reading, we need to build
@@ -620,7 +620,7 @@ public class TarFile implements Closeable {
         private int currentSparseInputStreamIndex;
 
         BoundedTarEntryInputStream(final TarArchiveEntry entry, final SeekableByteChannel channel) {
-            super(entry.getDataPosition(), entry.isSparse() ? entry.getRealSize() : entry.getSize());
+            super(entry.getDataOffset(), entry.isSparse() ? entry.getRealSize() : entry.getSize());
             this.entry = entry;
             this.channel = channel;
         }
@@ -660,7 +660,7 @@ public class TarFile implements Closeable {
             // if there are no actual input streams, just read from the original archive
             final List<InputStream> entrySparseInputStreams = sparseInputStreams.get(entry.getName());
             if (entrySparseInputStreams == null || entrySparseInputStreams.isEmpty()) {
-                return readArchive(entry.getDataPosition() + pos, buf);
+                return readArchive(entry.getDataOffset() + pos, buf);
             }
 
             if (currentSparseInputStreamIndex >= entrySparseInputStreams.size()) {