blob: 142f8ba38da313d40f0b199647b3561e09e30d4a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.cocoon.components.language.markup.xsp;
import java.io.IOException;
import java.io.InputStream;
import java.io.Reader;
import java.lang.reflect.InvocationTargetException;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import org.apache.avalon.framework.CascadingRuntimeException;
/**
* This is a helper class to remove redundant code in
* esql pages.
*
* Based on the orginal esql.xsl.
*
* @author <a href="mailto:tcurdt@dff.st">Torsten Curdt</a>
* @version CVS $Id$
*/
public class EsqlHelper {
private static void close(Object lob) {
if (lob == null) {
return;
}
// ORACLE 'temporary lob' problem patch start
Class clazz = lob.getClass();
String name = clazz.getName();
if (name.equals("oracle.sql.BLOB") || name.equals("oracle.sql.CLOB")) {
try {
if (clazz.getMethod("isTemporary", new Class[0]).invoke(lob, new Object[0]).equals(Boolean.TRUE)) {
clazz.getMethod("freeTemporary", new Class[0]).invoke(lob, new Object[0]);
}
} catch (IllegalAccessException e) {
/* ignored */
} catch (InvocationTargetException e) {
/* ignored */
} catch (NoSuchMethodException e) {
/* ignored */
}
}
}
private static byte[] readBytes(Blob blob, byte[] defaultValue)
throws SQLException, IOException {
if (blob == null) {
return defaultValue;
}
InputStream is = null;
try {
int length = (int) blob.length();
if (length == 0) {
return defaultValue;
}
byte[] buffer = new byte[length];
is = blob.getBinaryStream();
is.read(buffer);
return buffer;
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) { /* ignored */ }
close(blob);
}
}
private static String readAscii(Clob clob, String defaultValue)
throws SQLException, IOException {
if (clob == null) {
return defaultValue;
}
InputStream is = null;
try {
int length = (int) clob.length();
if (length == 0) {
return defaultValue;
}
byte[] buffer = new byte[length];
is = clob.getAsciiStream();
is.read(buffer);
return new String(buffer, 0, length);
} finally {
try {
if (is != null) {
is.close();
}
} catch (IOException e) { /* ignored */ }
close(clob);
}
}
private static String read(Clob clob, String defaultValue)
throws SQLException, IOException {
if (clob == null) {
return defaultValue;
}
Reader r = null;
try {
int length = (int) clob.length();
if (length == 0) {
return defaultValue;
}
char[] buffer = new char[length];
r = clob.getCharacterStream();
r.read(buffer);
return new String(buffer, 0, length);
} finally {
try {
if (r != null) {
r.close();
}
} catch (IOException e) { /* ignored */ }
close(clob);
}
}
/** returns byte array from BLOB */
public static byte[] getBlob(ResultSet set, String column)
throws RuntimeException {
try {
return EsqlHelper.getBlob(set, set.findColumn(column));
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting blob data for column " + column, e);
}
}
/** returns byte array from BLOB */
public static byte[] getBlob(ResultSet set, int column)
throws Exception {
try {
if (set.getMetaData().getColumnType(column) == java.sql.Types.BLOB) {
return readBytes(set.getBlob(column), null);
} else {
String value = set.getString(column);
if (value == null) {
return null;
}
return value.getBytes();
}
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting blob data for column " + column, e);
}
}
/** returns byte array from BLOB */
public static byte[] getBlob(CallableStatement cs, int column, String defaultString)
throws Exception {
byte[] defaultValue = null;
if (defaultString != null && !defaultString.equals("_null_")) {
defaultValue = defaultString.getBytes();
}
try {
if (cs.getMetaData().getColumnType(column) == java.sql.Types.BLOB) {
return readBytes(cs.getBlob(column), defaultValue);
} else {
String value = cs.getString(column);
if (value == null) {
return defaultValue;
}
return value.getBytes();
}
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting blob data for column " + column, e);
}
}
/** returns Unicode encoded string from CLOB or String column */
public static String getStringOrClob(ResultSet set, String column, String defaultString)
throws RuntimeException {
try {
return EsqlHelper.getStringOrClob(set, set.findColumn(column), defaultString);
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting text from column " + column, e);
}
}
/** returns Unicode encoded string from CLOB or String column */
public static String getStringOrClob(ResultSet set, int column, String defaultString)
throws Exception {
if (defaultString != null && defaultString.equals("_null_")) {
defaultString = null;
}
try {
if (set.getMetaData().getColumnType(column) == java.sql.Types.CLOB) {
return read(set.getClob(column), defaultString);
} else {
String result = set.getString(column);
if (result == null) {
result = defaultString;
}
return result;
}
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting text from column " + column, e);
}
}
/** returns Unicode encoded string from CLOB or String column */
public static String getStringOrClob(CallableStatement cs,
int column,
String defaultString)
throws Exception {
if (defaultString != null && defaultString.equals("_null_")) {
defaultString = null;
}
try {
return read(cs.getClob(column), defaultString);
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting text from column " + column, e);
}
}
/** returns ascii string from CLOB or String column */
public static String getAscii(ResultSet set, String column, String defaultString)
throws RuntimeException {
try {
int colIndex = set.findColumn(column);
return EsqlHelper.getAscii(set, colIndex, defaultString);
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting ascii data for column " + column, e);
}
}
/** returns ascii string from CLOB or String column */
public static String getAscii(ResultSet set, int column, String defaultString) {
if (defaultString != null && defaultString.equals("_null_")) {
defaultString = null;
}
try {
if (set.getMetaData().getColumnType(column) == Types.CLOB) {
return readAscii(set.getClob(column), defaultString);
} else {
String result = set.getString(column);
if (result == null) {
result = defaultString;
}
return result;
}
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting ascii data from column " + column, e);
}
}
/** returns ascii string from CLOB or String column */
public static String getAscii(CallableStatement cs, int column, String defaultString) {
try {
return readAscii(cs.getClob(column), defaultString);
} catch (Exception e) {
throw new CascadingRuntimeException("Error getting ascii data for column " + column, e);
}
}
public static String getStringFromByteArray(byte[] bytes,
String encoding,
String defaultString) {
if (bytes != null) {
try {
return new String(bytes, encoding);
} catch (java.io.UnsupportedEncodingException uee) {
throw new CascadingRuntimeException("Unsupported Encoding Exception", uee);
}
} else {
if (defaultString != null && !defaultString.equals("_null_")) {
return defaultString;
} else {
return null; /* before was "" but null is more consequent */
}
}
}
}