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