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