You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2020/06/02 15:39:21 UTC

svn commit: r1878398 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox: cos/ io/ pdfparser/

Author: lehmi
Date: Tue Jun  2 15:39:20 2020
New Revision: 1878398

URL: http://svn.apache.org/viewvc?rev=1878398&view=rev
Log:
PDFBOX-4836: delegate the creation of the view to the RandomAccessRead implementing classes to support optimized implementations

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/ICOSParser.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/InputStreamRandomAccessRead.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBufferedFile.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessRead.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadMemoryMappedFile.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadView.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/ScratchFileBuffer.java
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/ICOSParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/ICOSParser.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/ICOSParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/cos/ICOSParser.java Tue Jun  2 15:39:20 2020
@@ -33,12 +33,14 @@ public interface ICOSParser
     public COSBase dereferenceCOSObject(COSObject obj) throws IOException;
 
     /**
-     * Create a random access read view starting at the given position with the given length.
+     * Creates a random access read view starting at the given position with the given length.
      * 
      * @param startPosition start position within the underlying random access read
      * @param streamLength stream length
      * @return the random access read view
+     * @throws IOException if something went wrong when creating the view for the RandomAccessRead
      */
-    public RandomAccessReadView createRandomAccessReadView(long startPosition, long streamLength);
+    public RandomAccessReadView createRandomAccessReadView(long startPosition, long streamLength)
+            throws IOException;
 
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/InputStreamRandomAccessRead.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/InputStreamRandomAccessRead.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/InputStreamRandomAccessRead.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/InputStreamRandomAccessRead.java Tue Jun  2 15:39:20 2020
@@ -166,4 +166,10 @@ public final class InputStreamRandomAcce
     {
         throw new UnsupportedOperationException(getClass().getName() + ".length is not supported!");
     }
+
+    @Override
+    public RandomAccessReadView createView(long startPosition, long streamLength) throws IOException
+    {
+        throw new IOException(getClass().getName() + ".createView isn't supported.");
+    }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBufferedFile.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBufferedFile.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBufferedFile.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessBufferedFile.java Tue Jun  2 15:39:20 2020
@@ -257,4 +257,10 @@ public class RandomAccessBufferedFile im
     {
         return peek() == -1;
     }
+
+    @Override
+    public RandomAccessReadView createView(long startPosition, long streamLength) throws IOException
+    {
+        return new RandomAccessReadView(this, startPosition, streamLength);
+    }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessRead.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessRead.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessRead.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessRead.java Tue Jun  2 15:39:20 2020
@@ -194,4 +194,14 @@ public interface RandomAccessRead extend
         rewind(len);
     }
 
+    /**
+     * Creates a random access read view starting at the given position with the given length.
+     * 
+     * @param startPosition start position within the underlying random access read
+     * @param streamLength stream length
+     * @return the random access read view
+     * @throws IOException if something went wrong when creating the view for the RandomAccessRead
+     * 
+     */
+    RandomAccessReadView createView(long startPosition, long streamLength) throws IOException;
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadBuffer.java Tue Jun  2 15:39:20 2020
@@ -115,6 +115,22 @@ public class RandomAccessReadBuffer impl
         seek(0);
     }
 
+    private RandomAccessReadBuffer(RandomAccessReadBuffer parent)
+    {
+        chunkSize = parent.chunkSize;
+        size = parent.size;
+        bufferListMaxIndex = parent.bufferListMaxIndex;
+        bufferList = new ArrayList<>(parent.bufferList.size());
+        for (ByteBuffer buffer : parent.bufferList)
+        {
+            ByteBuffer newBuffer = buffer.duplicate();
+            newBuffer.rewind();
+            bufferList.add(newBuffer);
+        }
+        currentBuffer = bufferList.get(0);
+        
+    }
+
     @Override
     public RandomAccessReadBuffer clone()
     {
@@ -398,4 +414,11 @@ public class RandomAccessReadBuffer impl
         return read(b, 0, b.length);
     }
 
+    @Override
+    public RandomAccessReadView createView(long startPosition, long streamLength) throws IOException
+    {
+        return new RandomAccessReadView(new RandomAccessReadBuffer(this), startPosition,
+                streamLength);
+    }
+
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadMemoryMappedFile.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadMemoryMappedFile.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadMemoryMappedFile.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadMemoryMappedFile.java Tue Jun  2 15:39:20 2020
@@ -18,7 +18,7 @@ package org.apache.pdfbox.io;
 
 import java.io.File;
 import java.io.IOException;
-import java.nio.MappedByteBuffer;
+import java.nio.ByteBuffer;
 import java.nio.channels.FileChannel;
 import java.nio.file.StandardOpenOption;
 import java.util.EnumSet;
@@ -31,13 +31,13 @@ public class RandomAccessReadMemoryMappe
 {
 
     // mapped byte buffer
-    private MappedByteBuffer mappedByteBuffer;
+    private ByteBuffer mappedByteBuffer;
 
     // size of the whole file
     private final long size;
 
     // file channel of the file to be read
-    private final FileChannel fileChannel;
+    private FileChannel fileChannel;
 
     /**
      * Default constructor.
@@ -65,13 +65,23 @@ public class RandomAccessReadMemoryMappe
         mappedByteBuffer = fileChannel.map(FileChannel.MapMode.READ_ONLY, 0, size);
     }
 
+    private RandomAccessReadMemoryMappedFile(RandomAccessReadMemoryMappedFile parent)
+    {
+        mappedByteBuffer = parent.mappedByteBuffer.duplicate();
+        size = parent.size;
+        mappedByteBuffer.rewind();
+    }
+
     /**
      * {@inheritDoc}
      */
     @Override
     public void close() throws IOException
     {
-        fileChannel.close();
+        if (fileChannel != null)
+        {
+            fileChannel.close();
+        }
         mappedByteBuffer = null;
     }
 
@@ -156,7 +166,7 @@ public class RandomAccessReadMemoryMappe
     @Override
     public boolean isClosed()
     {
-        return !fileChannel.isOpen();
+        return mappedByteBuffer == null;
     }
 
     /**
@@ -210,4 +220,11 @@ public class RandomAccessReadMemoryMappe
     {
         return read(b, 0, b.length);
     }
+
+    @Override
+    public RandomAccessReadView createView(long startPosition, long streamLength)
+    {
+        return new RandomAccessReadView(new RandomAccessReadMemoryMappedFile(this), startPosition,
+                streamLength);
+    }
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadView.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadView.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadView.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/RandomAccessReadView.java Tue Jun  2 15:39:20 2020
@@ -215,4 +215,10 @@ public class RandomAccessReadView implem
         }
     }
 
+    @Override
+    public RandomAccessReadView createView(long startPosition, long streamLength) throws IOException
+    {
+        throw new IOException(getClass().getName() + ".createView isn't supported.");
+    }
+
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/ScratchFileBuffer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/ScratchFileBuffer.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/ScratchFileBuffer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/ScratchFileBuffer.java Tue Jun  2 15:39:20 2020
@@ -504,4 +504,11 @@ class ScratchFileBuffer implements Rando
             super.finalize();
         }
     }
+
+    @Override
+    public RandomAccessReadView createView(long startPosition, long streamLength) throws IOException
+    {
+        return new RandomAccessReadView(this, startPosition, streamLength);
+    }
+
 }

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java?rev=1878398&r1=1878397&r2=1878398&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfparser/COSParser.java Tue Jun  2 15:39:20 2020
@@ -573,8 +573,9 @@ public class COSParser extends BaseParse
 
     @Override
     public RandomAccessReadView createRandomAccessReadView(long startPosition, long streamLength)
+            throws IOException
     {
-        return new RandomAccessReadView(source, startPosition, streamLength);
+        return source.createView(startPosition, streamLength);
     }
 
     /**