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 2015/06/26 18:22:13 UTC

svn commit: r1687802 - in /pdfbox/trunk/pdfbox/src: main/java/org/apache/pdfbox/io/SequenceRandomAccessRead.java test/java/org/apache/pdfbox/io/TestRandomAccessBuffer.java

Author: lehmi
Date: Fri Jun 26 16:22:12 2015
New Revision: 1687802

URL: http://svn.apache.org/r1687802
Log:
PDFBOX-2301: bugfix buffer switch, improve test cases

Modified:
    pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/SequenceRandomAccessRead.java
    pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/io/TestRandomAccessBuffer.java

Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/SequenceRandomAccessRead.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/SequenceRandomAccessRead.java?rev=1687802&r1=1687801&r2=1687802&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/SequenceRandomAccessRead.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/io/SequenceRandomAccessRead.java Fri Jun 26 16:22:12 2015
@@ -91,8 +91,7 @@ public class SequenceRandomAccessRead im
     {
         if (currentIndex < maxIndex)
         {
-            currentIndex++;
-            switchBuffer(currentIndex, false);
+            switchBuffer(currentIndex + 1);
             return true;
         }
         return false;
@@ -102,24 +101,16 @@ public class SequenceRandomAccessRead im
      * Switch to buffer with the given index.
      * 
      * @param index the index of the buffer to be switched to
-     * @param calculatePosition calculate the new position if set to true
      * 
      * @throws IOException if the given index exceeds the available number of buffers
      */
-    private void switchBuffer(int index, boolean calculatePosition) throws IOException
+    private void switchBuffer(int index) throws IOException
     {
+        currentIndex = index;
         currentBuffer = source.get(index);
         currentBufferPosition = 0;
-        currentBuffer.seek(currentBufferPosition);
         currentBufferLength = sourceLength.get(index);
-        if (calculatePosition)
-        {
-            currentPosition = 0;
-            for (int i = 0; i < index; i++)
-            {
-                currentPosition += sourceLength.get(i);
-            }
-        }
+        currentBuffer.seek(currentBufferPosition);
     }
 
     /** Returns offset in file at which next byte would be read. */
@@ -144,7 +135,7 @@ public class SequenceRandomAccessRead im
         // new position beyond EOF
         if (newPosition >= bufferLength)
         {
-            switchBuffer(maxIndex, false);
+            switchBuffer(maxIndex);
             currentBufferPosition = sourceLength.get(currentIndex);
             currentPosition = newPosition;
             currentBuffer.seek(currentBufferPosition);
@@ -159,8 +150,13 @@ public class SequenceRandomAccessRead im
             }
             if (currentIndex != index)
             {
-                switchBuffer(index, true);
-                currentBufferPosition = newPosition - currentPosition;
+                switchBuffer(index);
+                long startPostion = 0;
+                for (int i = 0; i < index; i++)
+                {
+                    startPostion += sourceLength.get(i);
+                }
+                currentBufferPosition = newPosition - startPostion;
             }
             else
             {
@@ -211,7 +207,7 @@ public class SequenceRandomAccessRead im
         int bytesRead = bytesReadTotal;
         while (bytesReadTotal < len && bytesRead > 0)
         {
-            bytesRead = read(b, bytesRead, len - bytesRead);
+            bytesRead = read(b, off + bytesRead, len - bytesRead);
             bytesReadTotal += bytesRead;
         }
         return bytesReadTotal;

Modified: pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/io/TestRandomAccessBuffer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/io/TestRandomAccessBuffer.java?rev=1687802&r1=1687801&r2=1687802&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/io/TestRandomAccessBuffer.java (original)
+++ pdfbox/trunk/pdfbox/src/test/java/org/apache/pdfbox/io/TestRandomAccessBuffer.java Fri Jun 26 16:22:12 2015
@@ -287,15 +287,18 @@ public class TestRandomAccessBuffer exte
     public void testSequenceRandomAccessRead() throws IOException
     {
         RandomAccessBuffer buffer1 = new RandomAccessBuffer();
-        buffer1.write(new byte[] {1,2,3});
+        buffer1.write(new byte[] {0,1,2,3});
         RandomAccessBuffer buffer2 = new RandomAccessBuffer();
-        buffer2.write(new byte[] {4,5,6,7});
+        buffer2.write(new byte[] {4});
         RandomAccessBuffer buffer3 = new RandomAccessBuffer();
-        buffer3.write(new byte[] {8,9,10,11,12});
+        buffer3.write(new byte[] {5,6,7});
+        RandomAccessBuffer buffer4 = new RandomAccessBuffer();
+        buffer4.write(new byte[] {8,9,10,11,12});
         Vector<RandomAccessRead> buffers = new Vector<RandomAccessRead>();
         buffers.add(buffer1);
         buffers.add(buffer2);
         buffers.add(buffer3);
+        buffers.add(buffer4);
         // read the whole buffer
         SequenceRandomAccessRead sequenceBuffer = new SequenceRandomAccessRead(buffers);
         int byteRead = -1;
@@ -310,6 +313,7 @@ public class TestRandomAccessBuffer exte
         buffers.add(buffer1);
         buffers.add(buffer2);
         buffers.add(buffer3);
+        buffers.add(buffer4);
         // read parts of the buffer
         sequenceBuffer = new SequenceRandomAccessRead(buffers);
         sequenceBuffer.seek(2);
@@ -320,17 +324,30 @@ public class TestRandomAccessBuffer exte
         {
             sum += element;
         }
-        assertEquals(18, sum);
+        assertEquals(14, sum);
         // seek beyond EOF
         sequenceBuffer.seek(sequenceBuffer.length()+1);
         // check isEOF
         assertTrue(sequenceBuffer.isEOF());
         // check read
         assertEquals(-1, sequenceBuffer.read());
+
+        // test some read/rewind stuff
+        sequenceBuffer.seek(3);
+        assertEquals(3, sequenceBuffer.read());
+        assertEquals(4, sequenceBuffer.read());
+        sequenceBuffer.rewind(1);
+        assertEquals(4, sequenceBuffer.read());
+        assertEquals(5, sequenceBuffer.read());
+        sequenceBuffer.rewind(1);
+        assertEquals(5, sequenceBuffer.read());
+        
+        // close
         sequenceBuffer.close();
         buffer1.close();
         buffer2.close();
         buffer3.close();
+        buffer4.close();
     }
     
     public void testPDFBOX1490() throws Exception