diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/proxy/BlobProxy.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/proxy/BlobProxy.java index bd054beaac..953cf49481 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/proxy/BlobProxy.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/proxy/BlobProxy.java @@ -67,6 +67,7 @@ public final class BlobProxy implements Blob, BlobImplementer { return getUnderlyingStream().getInputStream(); } + @Override public BinaryStream getUnderlyingStream() throws SQLException { resetIfNeeded(); return binaryStream; @@ -172,15 +173,14 @@ public final class BlobProxy implements Blob, BlobImplementer { throw new SQLException( "Start position [" + start + "] cannot exceed overall CLOB length [" + length() + "]" ); } if ( length > Integer.MAX_VALUE ) { - throw new SQLException( "Can't deal with Blobs larger than Integer.MAX_VALUE" ); + throw new SQLException( "Can't deal with Blobs larger than 'Integer.MAX_VALUE'" ); } - final int intLength = (int)length; - if ( intLength < 0 ) { - // java docs specifically say for getBinaryStream(long,int) that the start+length must not exceed the - // total length, however that is at odds with the getBytes(long,int) behavior. + if ( length < 0 ) { + // javadoc for getBinaryStream(long,int) specifies that the start+length must not exceed the + // total length (this is at odds with the behavior of getBytes(long,int)) throw new SQLException( "Length must be great-than-or-equal to zero." ); } - return DataHelper.subStream( getStream(), start-1, intLength ); + return DataHelper.subStream( getStream(), start-1, (int)length ); } private static UnsupportedOperationException notSupported() { diff --git a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/proxy/ClobProxy.java b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/proxy/ClobProxy.java index 3142106b59..277f8244d3 100644 --- a/hibernate-core/src/main/java/org/hibernate/engine/jdbc/proxy/ClobProxy.java +++ b/hibernate-core/src/main/java/org/hibernate/engine/jdbc/proxy/ClobProxy.java @@ -92,34 +92,35 @@ public class ClobProxy implements Clob, ClobImplementer { @Override public long position(Clob searchstr, long start) throws SQLException { - throw new UnsupportedOperationException("Clob may not be manipulated from creating session"); + throw notSupported(); } @Override public int setString(long pos, String str) throws SQLException { - throw new UnsupportedOperationException("Clob may not be manipulated from creating session"); + throw notSupported(); } @Override public int setString(long pos, String str, int offset, int len) throws SQLException { - throw new UnsupportedOperationException("Clob may not be manipulated from creating session"); + throw notSupported(); } @Override public OutputStream setAsciiStream(long pos) { - throw new UnsupportedOperationException("Clob may not be manipulated from creating session"); + throw notSupported(); } @Override public Writer setCharacterStream(long pos) { - throw new UnsupportedOperationException("Clob may not be manipulated from creating session"); + throw notSupported(); } @Override public void truncate(long len) throws SQLException { - throw new UnsupportedOperationException("Clob may not be manipulated from creating session"); + throw notSupported(); } + @Override public String getSubString(long start, int length) throws SQLException { if ( start < 1 ) { throw new SQLException( "Start position 1-based; must be 1 or more." ); @@ -143,8 +144,11 @@ public class ClobProxy implements Clob, ClobImplementer { if ( start > length() + 1 ) { throw new SQLException( "Start position [" + start + "] cannot exceed overall CLOB length [" + length() + "]" ); } + if ( length > Integer.MAX_VALUE ) { + throw new SQLException( "Can't deal with Clobs larger than 'Integer.MAX_VALUE'" ); + } if ( length < 0 ) { - // javadoc for getCharacterStream(long,int) specify that the start+length must not exceed the + // javadoc for getCharacterStream(long,int) specifies that the start+length must not exceed the // total length (this is at odds with the behavior of getSubString(long,int)) throw new SQLException( "Length must be greater than or equal to zero" ); } @@ -190,4 +194,8 @@ public class ClobProxy implements Clob, ClobImplementer { public static Clob generateProxy(Reader reader, long length) { return new ClobProxy( reader, length ); } + + private static UnsupportedOperationException notSupported() { + return new UnsupportedOperationException("Clob may not be manipulated from creating session"); + } }