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

svn commit: r1879062 - in /pdfbox/branches/issue45/fontbox/src: main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java main/java/org/apache/fontbox/ttf/TTFDataStream.java test/java/org/apache/fontbox/ttf/BufferedRandomAccessFileTest.java

Author: tilman
Date: Sun Jun 21 09:15:38 2020
New Revision: 1879062

URL: http://svn.apache.org/viewvc?rev=1879062&view=rev
Log:
PDFBOX-4890: remove recursion; add test; close and delete file of existing test and use better name

Modified:
    pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java
    pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java
    pdfbox/branches/issue45/fontbox/src/test/java/org/apache/fontbox/ttf/BufferedRandomAccessFileTest.java

Modified: pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java?rev=1879062&r1=1879061&r2=1879062&view=diff
==============================================================================
--- pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java (original)
+++ pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/BufferedRandomAccessFile.java Sun Jun 21 09:15:38 2020
@@ -148,25 +148,37 @@ public class BufferedRandomAccessFile ex
     @Override
     public int read(byte[] b, int off, int len) throws IOException
     {
-        int leftover = bufend - bufpos;
-        if (len <= leftover)
-        {
-            System.arraycopy(buffer, bufpos, b, off, len);
-            bufpos += len;
-            return len;
-        }
-        System.arraycopy(buffer, bufpos, b, off, leftover);
-        bufpos += leftover;
-        if (fillBuffer() > 0)
+        int curLen = len; // length of what is left to read (shrinks)
+        int curOff = off; // offset where to put read data (grows)
+        int totalRead = 0;
+
+        while (true)
         {
-            //TODO PDFBOX-4890 remove recursive call. When done, remove Math.min() in TTFDataStream.read()
-            int bytesRead = read(b, off + leftover, len - leftover);
-            if (bytesRead > 0)
+            int leftover = bufend - bufpos;
+            if (curLen <= leftover)
+            {
+                System.arraycopy(buffer, bufpos, b, curOff, curLen);
+                bufpos += curLen;
+                return totalRead + curLen;
+            }
+            // curLen > leftover, we need to read more than what remains in buffer
+            System.arraycopy(buffer, bufpos, b, curOff, leftover);
+            totalRead += leftover;
+            bufpos += leftover;
+            if (fillBuffer() > 0)
+            {
+                curOff += leftover;
+                curLen -= leftover;
+            }
+            else
             {
-                leftover += bytesRead;
+                if (totalRead == 0)
+                {
+                    return -1;
+                }
+                return totalRead;
             }
         }
-        return leftover > 0 ? leftover : -1;
     }
 
     /**

Modified: pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java?rev=1879062&r1=1879061&r2=1879062&view=diff
==============================================================================
--- pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java (original)
+++ pdfbox/branches/issue45/fontbox/src/main/java/org/apache/fontbox/ttf/TTFDataStream.java Sun Jun 21 09:15:38 2020
@@ -252,8 +252,7 @@ abstract class TTFDataStream implements
         int totalAmountRead = 0;
         // read at most numberOfBytes bytes from the stream.
         while (totalAmountRead < numberOfBytes
-               //TODO PDFBOX-4890: remove Math.min() after removing recursive call from BufferedRandomAccessFile.read
-                && (amountRead = read(data, totalAmountRead, Math.min(numberOfBytes - totalAmountRead, 65536))) != -1)
+                && (amountRead = read(data, totalAmountRead, numberOfBytes - totalAmountRead)) != -1)
         {
             totalAmountRead += amountRead;
         }

Modified: pdfbox/branches/issue45/fontbox/src/test/java/org/apache/fontbox/ttf/BufferedRandomAccessFileTest.java
URL: http://svn.apache.org/viewvc/pdfbox/branches/issue45/fontbox/src/test/java/org/apache/fontbox/ttf/BufferedRandomAccessFileTest.java?rev=1879062&r1=1879061&r2=1879062&view=diff
==============================================================================
--- pdfbox/branches/issue45/fontbox/src/test/java/org/apache/fontbox/ttf/BufferedRandomAccessFileTest.java (original)
+++ pdfbox/branches/issue45/fontbox/src/test/java/org/apache/fontbox/ttf/BufferedRandomAccessFileTest.java Sun Jun 21 09:15:38 2020
@@ -26,6 +26,7 @@ import org.junit.Test;
 
 /**
  * @author Cameron Rollhieser
+ * @author Tilman Hausherr
  */
 public class BufferedRandomAccessFileTest
 {
@@ -47,14 +48,108 @@ public class BufferedRandomAccessFileTes
         outputStream.close();
 
         final byte[] readBuffer = new byte[2];
-        final BufferedRandomAccessFile buffer = new BufferedRandomAccessFile(file, "r", 4);
+        final BufferedRandomAccessFile braf = new BufferedRandomAccessFile(file, "r", 4);
 
         int amountRead;
         int totalAmountRead = 0;
-        while ((amountRead = buffer.read(readBuffer, 0, 2)) != -1)
+        while ((amountRead = braf.read(readBuffer, 0, 2)) != -1)
         {
             totalAmountRead += amountRead;
         }
         Assert.assertEquals(10, totalAmountRead);
+        braf.close();
+        file.delete();
+    }
+
+    /**
+     * Test several reading patterns, both reading within a buffer and across buffer.
+     *
+     * @throws IOException
+     */
+    @Test
+    public void testReadBuffer() throws IOException
+    {
+        final File file = File.createTempFile("apache-pdfbox", ".dat");
+
+        OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
+        final String content = "012345678A012345678B012345678C012345678D";
+        outputStream.write(content.getBytes("UTF-8"));
+        outputStream.flush();
+        outputStream.close();
+
+        final byte[] readBuffer = new byte[40];
+        final BufferedRandomAccessFile braf = new BufferedRandomAccessFile(file, "r", 10);
+
+        int count = 4;
+        int bytesRead = braf.read(readBuffer, 0, count);
+        Assert.assertEquals(4, braf.getFilePointer());
+        Assert.assertEquals(count, bytesRead);
+        Assert.assertEquals("0123", new String(readBuffer, 0, count));
+
+        count = 6;
+        bytesRead = braf.read(readBuffer, 0, count);
+        Assert.assertEquals(10, braf.getFilePointer());
+        Assert.assertEquals(count, bytesRead);
+        Assert.assertEquals("45678A", new String(readBuffer, 0, count));
+
+        count = 10;
+        bytesRead = braf.read(readBuffer, 0, count);
+        Assert.assertEquals(20, braf.getFilePointer());
+        Assert.assertEquals(count, bytesRead);
+        Assert.assertEquals("012345678B", new String(readBuffer, 0, count));
+
+        count = 10;
+        bytesRead = braf.read(readBuffer, 0, count);
+        Assert.assertEquals(30, braf.getFilePointer());
+        Assert.assertEquals(count, bytesRead);
+        Assert.assertEquals("012345678C", new String(readBuffer, 0, count));
+
+        count = 10;
+        bytesRead = braf.read(readBuffer, 0, count);
+        Assert.assertEquals(40, braf.getFilePointer());
+        Assert.assertEquals(count, bytesRead);
+        Assert.assertEquals("012345678D", new String(readBuffer, 0, count));
+        
+        Assert.assertEquals(-1, braf.read());
+
+        braf.seek(0);
+        braf.read(readBuffer, 0, 7);
+        Assert.assertEquals(7, braf.getFilePointer());
+        
+        count = 16;
+        bytesRead = braf.read(readBuffer, 0, count);
+        Assert.assertEquals(23, braf.getFilePointer());
+        Assert.assertEquals(count, bytesRead);
+        Assert.assertEquals("78A012345678B012", new String(readBuffer, 0, count));
+
+        bytesRead = braf.read(readBuffer, 0, 99);
+        Assert.assertEquals(40, braf.getFilePointer());
+        Assert.assertEquals(17, bytesRead);
+        Assert.assertEquals("345678C012345678D", new String(readBuffer, 0, 17));
+
+        Assert.assertEquals(-1, braf.read());
+
+        braf.seek(0);
+        braf.read(readBuffer, 0, 7);
+        Assert.assertEquals(7, braf.getFilePointer());
+
+        count = 23;
+        bytesRead = braf.read(readBuffer, 0, count);
+        Assert.assertEquals(30, braf.getFilePointer());
+        Assert.assertEquals(count, bytesRead);
+        Assert.assertEquals("78A012345678B012345678C", new String(readBuffer, 0, count));
+
+        braf.seek(0);
+        braf.read(readBuffer, 0, 10);
+        Assert.assertEquals(10, braf.getFilePointer());
+        count = 23;
+        bytesRead = braf.read(readBuffer, 0, count);
+        Assert.assertEquals(33, braf.getFilePointer());
+        Assert.assertEquals(count, bytesRead);
+        Assert.assertEquals("012345678B012345678C012", new String(readBuffer, 0, count));
+
+        braf.close();
+
+        file.delete();
     }
 }