From 5d3d455e47365834d203facfde2a2de07e668d4d Mon Sep 17 00:00:00 2001
From: brinn <brinn>
Date: Tue, 29 Mar 2011 20:31:49 +0000
Subject: [PATCH] [LMS-2170] bug in ByteBufferRandomAccessFile.read()

SVN: 20557
---
 .../base/io/ByteBufferRandomAccessFile.java   | 20 ++++++++++++--
 .../cisd/base/convert/NativeDataTests.java    |  1 +
 .../io/ByteBufferRandomAccessFileTests.java   |  8 +++++-
 ...Tests.java => IRandomAccessFileTests.java} | 26 ++++++++++++++++++-
 .../base/io/RandomAccessFileImplTests.java    | 11 +++++++-
 5 files changed, 61 insertions(+), 5 deletions(-)
 rename base/sourceTest/java/ch/systemsx/cisd/base/io/{IRandomAccerssFileTests.java => IRandomAccessFileTests.java} (82%)

diff --git a/base/source/java/ch/systemsx/cisd/base/io/ByteBufferRandomAccessFile.java b/base/source/java/ch/systemsx/cisd/base/io/ByteBufferRandomAccessFile.java
index 5af0a91371b..d5d6a0eb56c 100644
--- a/base/source/java/ch/systemsx/cisd/base/io/ByteBufferRandomAccessFile.java
+++ b/base/source/java/ch/systemsx/cisd/base/io/ByteBufferRandomAccessFile.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.base.io;
 
+import java.io.EOFException;
 import java.io.UnsupportedEncodingException;
 import java.nio.ByteBuffer;
 import java.nio.ByteOrder;
@@ -121,7 +122,13 @@ public class ByteBufferRandomAccessFile implements IRandomAccessFile
 
     public void readFully(byte[] b, int off, int len) throws IOExceptionUnchecked
     {
-        buf.get(b, off, len);
+        if (available0() == -1)
+        {
+            throw new IOExceptionUnchecked(new EOFException());
+        } else
+        {
+            buf.get(b, off, len);
+        }
     }
 
     public int skipBytes(int n) throws IOExceptionUnchecked
@@ -154,7 +161,11 @@ public class ByteBufferRandomAccessFile implements IRandomAccessFile
 
     public int read(byte[] b, int off, int len) throws IOExceptionUnchecked
     {
-        final int bytesRead = Math.min(available(), len);
+        final int bytesRead = Math.min(available0(), len);
+        if (bytesRead < 0)
+        {
+            return bytesRead;
+        }
         buf.get(b, off, bytesRead);
         return bytesRead;
     }
@@ -167,6 +178,11 @@ public class ByteBufferRandomAccessFile implements IRandomAccessFile
         }
         return skipBytes((int) n);
     }
+    
+    private int available0() throws IOExceptionUnchecked
+    {
+        return (buf.remaining() == 0) ? -1 : buf.remaining();
+    }
 
     public int available() throws IOExceptionUnchecked
     {
diff --git a/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java b/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
index 18a88a2f4c0..2d2800b7798 100644
--- a/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
+++ b/base/sourceTest/java/ch/systemsx/cisd/base/convert/NativeDataTests.java
@@ -421,6 +421,7 @@ public class NativeDataTests
     {
     }
 
+    @SuppressWarnings("null")
     public static void main(String[] args) throws Throwable
     {
         System.out.println(BuildAndEnvironmentInfo.INSTANCE);
diff --git a/base/sourceTest/java/ch/systemsx/cisd/base/io/ByteBufferRandomAccessFileTests.java b/base/sourceTest/java/ch/systemsx/cisd/base/io/ByteBufferRandomAccessFileTests.java
index ee868610854..cd8f0f16aa8 100644
--- a/base/sourceTest/java/ch/systemsx/cisd/base/io/ByteBufferRandomAccessFileTests.java
+++ b/base/sourceTest/java/ch/systemsx/cisd/base/io/ByteBufferRandomAccessFileTests.java
@@ -21,7 +21,7 @@ package ch.systemsx.cisd.base.io;
  *
  * @author Bernd Rinn
  */
-public class ByteBufferRandomAccessFileTests extends IRandomAccerssFileTests
+public class ByteBufferRandomAccessFileTests extends IRandomAccessFileTests
 {
 
     @Override
@@ -30,4 +30,10 @@ public class ByteBufferRandomAccessFileTests extends IRandomAccerssFileTests
         return new ByteBufferRandomAccessFile(4096);
     }
 
+    @Override
+    protected IRandomAccessFile createRandomAccessFile(String name, byte[] content)
+    {
+        return new ByteBufferRandomAccessFile(content);
+    }
+
 }
diff --git a/base/sourceTest/java/ch/systemsx/cisd/base/io/IRandomAccerssFileTests.java b/base/sourceTest/java/ch/systemsx/cisd/base/io/IRandomAccessFileTests.java
similarity index 82%
rename from base/sourceTest/java/ch/systemsx/cisd/base/io/IRandomAccerssFileTests.java
rename to base/sourceTest/java/ch/systemsx/cisd/base/io/IRandomAccessFileTests.java
index c0cdd2d41fe..676d078ff1f 100644
--- a/base/sourceTest/java/ch/systemsx/cisd/base/io/IRandomAccerssFileTests.java
+++ b/base/sourceTest/java/ch/systemsx/cisd/base/io/IRandomAccessFileTests.java
@@ -16,8 +16,10 @@
 
 package ch.systemsx.cisd.base.io;
 
+import java.io.IOException;
 import java.nio.ByteOrder;
 
+import org.apache.commons.io.IOUtils;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.base.convert.NativeData;
@@ -28,11 +30,13 @@ import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
  * 
  * @author Bernd Rinn
  */
-public abstract class IRandomAccerssFileTests extends AbstractFileSystemTestCase
+public abstract class IRandomAccessFileTests extends AbstractFileSystemTestCase
 {
 
     abstract protected IRandomAccessFile createRandomAccessFile(String name);
 
+    abstract protected IRandomAccessFile createRandomAccessFile(String name, byte[] content);
+
     @Test
     public void testSkip()
     {
@@ -159,4 +163,24 @@ public abstract class IRandomAccerssFileTests extends AbstractFileSystemTestCase
                         ch.systemsx.cisd.base.convert.NativeData.ByteOrder.BIG_ENDIAN)));
     }
 
+    @Test
+    public void testReadLine() throws IOException
+    {
+        final byte[] bytes = "hello world".getBytes();
+        final IRandomAccessFile raf = createRandomAccessFile("testWriteReadStringChars", bytes);
+        final AdapterIInputStreamToInputStream is = new AdapterIInputStreamToInputStream(raf);
+
+        assertEquals("[hello world]", IOUtils.readLines(is).toString());
+    }
+
+    @Test
+    public void testToByteArray() throws IOException
+    {
+        final byte[] bytes = "hello world".getBytes();
+        final IRandomAccessFile raf = createRandomAccessFile("testWriteReadStringChars", bytes);
+        final AdapterIInputStreamToInputStream is = new AdapterIInputStreamToInputStream(raf);
+
+        assertEquals(bytes, IOUtils.toByteArray(is));
+    }
+
 }
diff --git a/base/sourceTest/java/ch/systemsx/cisd/base/io/RandomAccessFileImplTests.java b/base/sourceTest/java/ch/systemsx/cisd/base/io/RandomAccessFileImplTests.java
index 5951bdaca5c..e725bad6b7d 100644
--- a/base/sourceTest/java/ch/systemsx/cisd/base/io/RandomAccessFileImplTests.java
+++ b/base/sourceTest/java/ch/systemsx/cisd/base/io/RandomAccessFileImplTests.java
@@ -21,7 +21,7 @@ package ch.systemsx.cisd.base.io;
  *
  * @author Bernd Rinn
  */
-public class RandomAccessFileImplTests extends IRandomAccerssFileTests
+public class RandomAccessFileImplTests extends IRandomAccessFileTests
 {
 
     @Override
@@ -30,4 +30,13 @@ public class RandomAccessFileImplTests extends IRandomAccerssFileTests
         return new RandomAccessFileImpl(create(name), "rw");
     }
 
+    @Override
+    protected IRandomAccessFile createRandomAccessFile(String name, byte[] content)
+    {
+        final IRandomAccessFile f = new RandomAccessFileImpl(create(name), "rw");
+        f.write(content);
+        f.seek(0L);
+        return f;
+    }
+
 }
-- 
GitLab