From 4e3227441b994838822357767f7339225138916d Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Wed, 1 Sep 2010 18:09:29 +0000 Subject: [PATCH] DefaultLobHandler's "wrapAsLob" mode works with PostgreSQL's getAsciiStream() requirement (SPR-7487) --- .../jdbc/support/lob/DefaultLobHandler.java | 13 ++--- .../jdbc/support/lob/LobCreator.java | 12 ++-- .../jdbc/support/lob/PassThroughBlob.java | 4 +- .../jdbc/support/lob/PassThroughClob.java | 57 ++++++++++++++++--- 4 files changed, 64 insertions(+), 22 deletions(-) diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/DefaultLobHandler.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/DefaultLobHandler.java index 7ba52c53e5..41c480ade1 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/DefaultLobHandler.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/DefaultLobHandler.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -237,7 +237,7 @@ public class DefaultLobHandler extends AbstractLobHandler { } public void setClobAsString(PreparedStatement ps, int paramIndex, String content) - throws SQLException { + throws SQLException { if (streamAsLob) { if (content != null) { @@ -266,17 +266,16 @@ public class DefaultLobHandler extends AbstractLobHandler { public void setClobAsAsciiStream( PreparedStatement ps, int paramIndex, InputStream asciiStream, int contentLength) - throws SQLException { + throws SQLException { if (streamAsLob || wrapAsLob) { if (asciiStream != null) { try { - Reader reader = new InputStreamReader(asciiStream, "US-ASCII"); if (streamAsLob) { - ps.setClob(paramIndex, reader, contentLength); + ps.setClob(paramIndex, new InputStreamReader(asciiStream, "US-ASCII"), contentLength); } else { - ps.setClob(paramIndex, new PassThroughClob(reader, contentLength)); + ps.setClob(paramIndex, new PassThroughClob(asciiStream, contentLength)); } } catch (UnsupportedEncodingException ex) { @@ -298,7 +297,7 @@ public class DefaultLobHandler extends AbstractLobHandler { public void setClobAsCharacterStream( PreparedStatement ps, int paramIndex, Reader characterStream, int contentLength) - throws SQLException { + throws SQLException { if (streamAsLob) { if (characterStream != null) { diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/LobCreator.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/LobCreator.java index 1d667d41a9..be54c09684 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/LobCreator.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/LobCreator.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -69,7 +69,7 @@ public interface LobCreator { * @see java.sql.PreparedStatement#setBytes */ void setBlobAsBytes(PreparedStatement ps, int paramIndex, byte[] content) - throws SQLException; + throws SQLException; /** * Set the given content as binary stream on the given statement, using the given @@ -83,7 +83,7 @@ public interface LobCreator { */ void setBlobAsBinaryStream( PreparedStatement ps, int paramIndex, InputStream contentStream, int contentLength) - throws SQLException; + throws SQLException; /** * Set the given content as String on the given statement, using the given @@ -96,7 +96,7 @@ public interface LobCreator { * @see java.sql.PreparedStatement#setBytes */ void setClobAsString(PreparedStatement ps, int paramIndex, String content) - throws SQLException; + throws SQLException; /** * Set the given content as ASCII stream on the given statement, using the given @@ -110,7 +110,7 @@ public interface LobCreator { */ void setClobAsAsciiStream( PreparedStatement ps, int paramIndex, InputStream asciiStream, int contentLength) - throws SQLException; + throws SQLException; /** * Set the given content as character stream on the given statement, using the given @@ -124,7 +124,7 @@ public interface LobCreator { */ void setClobAsCharacterStream( PreparedStatement ps, int paramIndex, Reader characterStream, int contentLength) - throws SQLException; + throws SQLException; /** * Close this LobCreator session and free its temporarily created BLOBs and CLOBs. diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/PassThroughBlob.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/PassThroughBlob.java index d065bb6de9..822b3e48cd 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/PassThroughBlob.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/PassThroughBlob.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -91,7 +91,7 @@ class PassThroughBlob implements Blob { } public void free() throws SQLException { - throw new UnsupportedOperationException(); + // no-op } } diff --git a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/PassThroughClob.java b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/PassThroughClob.java index 57210b485a..1effc342b0 100644 --- a/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/PassThroughClob.java +++ b/org.springframework.jdbc/src/main/java/org/springframework/jdbc/support/lob/PassThroughClob.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2008 the original author or authors. + * Copyright 2002-2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -16,14 +16,20 @@ package org.springframework.jdbc.support.lob; +import java.io.ByteArrayInputStream; +import java.io.IOException; import java.io.InputStream; +import java.io.InputStreamReader; import java.io.OutputStream; import java.io.Reader; import java.io.StringReader; +import java.io.UnsupportedEncodingException; import java.io.Writer; import java.sql.Clob; import java.sql.SQLException; +import org.springframework.util.FileCopyUtils; + /** * Simple JDBC {@link Clob} adapter that exposes a given String or character stream. * Optionally used by {@link DefaultLobHandler}. @@ -37,6 +43,8 @@ class PassThroughClob implements Clob { private Reader characterStream; + private InputStream asciiStream; + private long contentLength; @@ -50,13 +58,52 @@ class PassThroughClob implements Clob { this.contentLength = contentLength; } + public PassThroughClob(InputStream asciiStream, long contentLength) { + this.asciiStream = asciiStream; + this.contentLength = contentLength; + } + public long length() throws SQLException { return this.contentLength; } public Reader getCharacterStream() throws SQLException { - return (this.content != null ? new StringReader(this.content) : this.characterStream); + try { + if (this.content != null) { + return new StringReader(this.content); + } + else if (this.characterStream != null) { + return this.characterStream; + } + else { + return new InputStreamReader(this.asciiStream, "US-ASCII"); + } + } + catch (UnsupportedEncodingException ex) { + throw new SQLException("US-ASCII encoding not supported: " + ex); + } + } + + public InputStream getAsciiStream() throws SQLException { + try { + if (this.content != null) { + return new ByteArrayInputStream(this.content.getBytes("US-ASCII")); + } + else if (this.characterStream != null) { + String tempContent = FileCopyUtils.copyToString(this.characterStream); + return new ByteArrayInputStream(tempContent.getBytes("US-ASCII")); + } + else { + return this.asciiStream; + } + } + catch (UnsupportedEncodingException ex) { + throw new SQLException("US-ASCII encoding not supported: " + ex); + } + catch (IOException ex) { + throw new SQLException("Failed to read stream content: " + ex); + } } @@ -68,10 +115,6 @@ class PassThroughClob implements Clob { throw new UnsupportedOperationException(); } - public InputStream getAsciiStream() throws SQLException { - return null; - } - public OutputStream setAsciiStream(long pos) throws SQLException { throw new UnsupportedOperationException(); } @@ -101,7 +144,7 @@ class PassThroughClob implements Clob { } public void free() throws SQLException { - throw new UnsupportedOperationException(); + // no-op } } -- GitLab