/*
 * 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.commons.dbcp2;

import java.io.InputStream;
import java.io.Reader;
import java.math.BigDecimal;
import java.net.URL;
import java.sql.Array;
import java.sql.Blob;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.Date;
import java.sql.Ref;
import java.sql.ResultSet;
import java.sql.RowId;
import java.sql.SQLException;
import java.sql.SQLFeatureNotSupportedException;
import java.sql.SQLXML;
import java.sql.Statement;
import java.sql.Time;
import java.sql.Timestamp;
import java.util.concurrent.Executor;
import java.util.logging.Logger;

import javax.sql.CommonDataSource;

Defines bridge methods to JDBC 4.1 (Java 7) methods to allow call sites to operate safely (without AbstractMethodError) when using a JDBC driver written for JDBC 4.0 (Java 6).
Since:2.6.0
/** * Defines bridge methods to JDBC 4.1 (Java 7) methods to allow call sites to operate safely (without * {@link AbstractMethodError}) when using a JDBC driver written for JDBC 4.0 (Java 6). * * @since 2.6.0 */
public class Jdbc41Bridge {
Delegates to Connection.abort(Executor) without throwing an AbstractMethodError.

If the JDBC driver does not implement Connection.abort(Executor), then call Connection.close().

Params:
Throws:
See Also:
/** * Delegates to {@link Connection#abort(Executor)} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link Connection#abort(Executor)}, then call {@link Connection#close()}. * </p> * * @param connection * the receiver * @param executor * See {@link Connection#abort(Executor)}. * @throws SQLException * See {@link Connection#abort(Executor)}. * @see Connection#abort(Executor) */
public static void abort(final Connection connection, final Executor executor) throws SQLException { try { connection.abort(executor); } catch (final AbstractMethodError e) { connection.close(); } }
Delegates to DatabaseMetaData.generatedKeyAlwaysReturned() without throwing a AbstractMethodError.

If the JDBC driver does not implement DatabaseMetaData.generatedKeyAlwaysReturned(), then return false.

Params:
Throws:
See Also:
Returns:See DatabaseMetaData.generatedKeyAlwaysReturned()
/** * Delegates to {@link DatabaseMetaData#generatedKeyAlwaysReturned()} without throwing a * {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link DatabaseMetaData#generatedKeyAlwaysReturned()}, then return false. * </p> * * @param databaseMetaData * See {@link DatabaseMetaData#generatedKeyAlwaysReturned()} * @return See {@link DatabaseMetaData#generatedKeyAlwaysReturned()} * @throws SQLException * See {@link DatabaseMetaData#generatedKeyAlwaysReturned()} * @see DatabaseMetaData#generatedKeyAlwaysReturned() */
public static boolean generatedKeyAlwaysReturned(final DatabaseMetaData databaseMetaData) throws SQLException { try { return databaseMetaData.generatedKeyAlwaysReturned(); } catch (final AbstractMethodError e) { // do nothing return false; } }
Delegates to Connection.getNetworkTimeout() without throwing an AbstractMethodError.

If the JDBC driver does not implement Connection.getNetworkTimeout(), then return 0.

Params:
  • connection – the receiver
Throws:
See Also:
Returns:See Connection.getNetworkTimeout()
/** * Delegates to {@link Connection#getNetworkTimeout()} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link Connection#getNetworkTimeout()}, then return 0. * </p> * * @param connection * the receiver * @return See {@link Connection#getNetworkTimeout()} * @throws SQLException * See {@link Connection#getNetworkTimeout()} * @see Connection#getNetworkTimeout() */
public static int getNetworkTimeout(final Connection connection) throws SQLException { try { return connection.getNetworkTimeout(); } catch (final AbstractMethodError e) { return 0; } }
Delegates to ResultSet.getObject(int, Class<Object>) without throwing an AbstractMethodError.

If the JDBC driver does not implement ResultSet.getObject(int, Class<Object>), then return 0.

Params:
Type parameters:
Throws:
See Also:
Returns:See ResultSet.getObject(int, Class<Object>)
/** * Delegates to {@link ResultSet#getObject(int, Class)} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link ResultSet#getObject(int, Class)}, then return 0. * </p> * * @param <T> * See {@link ResultSet#getObject(int, Class)} * @param resultSet * See {@link ResultSet#getObject(int, Class)} * @param columnIndex * See {@link ResultSet#getObject(int, Class)} * @param type * See {@link ResultSet#getObject(int, Class)} * @return See {@link ResultSet#getObject(int, Class)} * @throws SQLException * See {@link ResultSet#getObject(int, Class)} * @see ResultSet#getObject(int, Class) */
@SuppressWarnings("unchecked") public static <T> T getObject(final ResultSet resultSet, final int columnIndex, final Class<T> type) throws SQLException { try { return resultSet.getObject(columnIndex, type); } catch (final AbstractMethodError e) { if (type == String.class) { return (T) resultSet.getString(columnIndex); } // Numbers if (type == Integer.class) { return (T) Integer.valueOf(resultSet.getInt(columnIndex)); } if (type == Long.class) { return (T) Long.valueOf(resultSet.getLong(columnIndex)); } if (type == Double.class) { return (T) Double.valueOf(resultSet.getDouble(columnIndex)); } if (type == Float.class) { return (T) Float.valueOf(resultSet.getFloat(columnIndex)); } if (type == Short.class) { return (T) Short.valueOf(resultSet.getShort(columnIndex)); } if (type == BigDecimal.class) { return (T) resultSet.getBigDecimal(columnIndex); } if (type == Byte.class) { return (T) Byte.valueOf(resultSet.getByte(columnIndex)); } // Dates if (type == Date.class) { return (T) resultSet.getDate(columnIndex); } if (type == Time.class) { return (T) resultSet.getTime(columnIndex); } if (type == Timestamp.class) { return (T) resultSet.getTimestamp(columnIndex); } // Streams if (type == InputStream.class) { return (T) resultSet.getBinaryStream(columnIndex); } if (type == Reader.class) { return (T) resultSet.getCharacterStream(columnIndex); } // Other if (type == Object.class) { return (T) resultSet.getObject(columnIndex); } if (type == Boolean.class) { return (T) Boolean.valueOf(resultSet.getBoolean(columnIndex)); } if (type == Array.class) { return (T) resultSet.getArray(columnIndex); } if (type == Blob.class) { return (T) resultSet.getBlob(columnIndex); } if (type == Clob.class) { return (T) resultSet.getClob(columnIndex); } if (type == Ref.class) { return (T) resultSet.getRef(columnIndex); } if (type == RowId.class) { return (T) resultSet.getRowId(columnIndex); } if (type == SQLXML.class) { return (T) resultSet.getSQLXML(columnIndex); } if (type == URL.class) { return (T) resultSet.getURL(columnIndex); } throw new SQLFeatureNotSupportedException( String.format("resultSet=%s, columnIndex=%,d, type=%s", resultSet, columnIndex, type)); } }
Params:
Type parameters:
Throws:
See Also:
Returns:See ResultSet.getObject(String, Class<Object>)
/** * Delegates to {@link ResultSet#getObject(String, Class)} without throwing an {@link AbstractMethodError}. * * @param <T> * See {@link ResultSet#getObject(String, Class)} * @param resultSet * See {@link ResultSet#getObject(String, Class)} * @param columnLabel * See {@link ResultSet#getObject(String, Class)} * @param type * See {@link ResultSet#getObject(String, Class)} * @return See {@link ResultSet#getObject(String, Class)} * @throws SQLException * See {@link ResultSet#getObject(String, Class)} * @see ResultSet#getObject(int, Class) */
@SuppressWarnings("unchecked") public static <T> T getObject(final ResultSet resultSet, final String columnLabel, final Class<T> type) throws SQLException { try { return resultSet.getObject(columnLabel, type); } catch (final AbstractMethodError e) { // Numbers if (type == Integer.class) { return (T) Integer.valueOf(resultSet.getInt(columnLabel)); } if (type == Long.class) { return (T) Long.valueOf(resultSet.getLong(columnLabel)); } if (type == Double.class) { return (T) Double.valueOf(resultSet.getDouble(columnLabel)); } if (type == Float.class) { return (T) Float.valueOf(resultSet.getFloat(columnLabel)); } if (type == Short.class) { return (T) Short.valueOf(resultSet.getShort(columnLabel)); } if (type == BigDecimal.class) { return (T) resultSet.getBigDecimal(columnLabel); } if (type == Byte.class) { return (T) Byte.valueOf(resultSet.getByte(columnLabel)); } // Dates if (type == Date.class) { return (T) resultSet.getDate(columnLabel); } if (type == Time.class) { return (T) resultSet.getTime(columnLabel); } if (type == Timestamp.class) { return (T) resultSet.getTimestamp(columnLabel); } // Streams if (type == InputStream.class) { return (T) resultSet.getBinaryStream(columnLabel); } if (type == Reader.class) { return (T) resultSet.getCharacterStream(columnLabel); } // Other if (type == Object.class) { return (T) resultSet.getObject(columnLabel); } if (type == Boolean.class) { return (T) Boolean.valueOf(resultSet.getBoolean(columnLabel)); } if (type == Array.class) { return (T) resultSet.getArray(columnLabel); } if (type == Blob.class) { return (T) resultSet.getBlob(columnLabel); } if (type == Clob.class) { return (T) resultSet.getClob(columnLabel); } if (type == Ref.class) { return (T) resultSet.getRef(columnLabel); } if (type == RowId.class) { return (T) resultSet.getRowId(columnLabel); } if (type == SQLXML.class) { return (T) resultSet.getSQLXML(columnLabel); } if (type == URL.class) { return (T) resultSet.getURL(columnLabel); } throw new SQLFeatureNotSupportedException( String.format("resultSet=%s, columnLabel=%s, type=%s", resultSet, columnLabel, type)); } }
Params:
Throws:
See Also:
Returns:See DatabaseMetaData.getPseudoColumns(String, String, String, String)
/** * Delegates to {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)} without throwing a * {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)}, * then return null. * </p> * * @param databaseMetaData * the receiver * @param catalog * See {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)} * @param schemaPattern * See {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)} * @param tableNamePattern * See {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)} * @param columnNamePattern * See {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)} * @return See {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)} * @throws SQLException * See {@link DatabaseMetaData#getPseudoColumns(String, String, String, String)} * @see DatabaseMetaData#getPseudoColumns(String, String, String, String) */
public static ResultSet getPseudoColumns(final DatabaseMetaData databaseMetaData, final String catalog, final String schemaPattern, final String tableNamePattern, final String columnNamePattern) throws SQLException { try { return databaseMetaData.getPseudoColumns(catalog, schemaPattern, tableNamePattern, columnNamePattern); } catch (final AbstractMethodError e) { // do nothing return null; } }
Delegates to Connection.getSchema() without throwing an AbstractMethodError.

If the JDBC driver does not implement Connection.getSchema(), then return null.

Params:
  • connection – the receiver
Throws:
See Also:
Returns:null for a JDBC 4 driver or a value per Connection.getSchema().
/** * Delegates to {@link Connection#getSchema()} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link Connection#getSchema()}, then return null. * </p> * * @param connection * the receiver * @return null for a JDBC 4 driver or a value per {@link Connection#getSchema()}. * @throws SQLException * See {@link Connection#getSchema()}. * @see Connection#getSchema() */
public static String getSchema(final Connection connection) throws SQLException { try { return connection.getSchema(); } catch (final AbstractMethodError e) { // do nothing return null; } }
Delegates to Connection.setNetworkTimeout(Executor, int) without throwing an AbstractMethodError.

If the JDBC driver does not implement Connection.setNetworkTimeout(Executor, int), then do nothing.

Params:
Throws:
See Also:
/** * Delegates to {@link Connection#setNetworkTimeout(Executor, int)} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link Connection#setNetworkTimeout(Executor, int)}, then do nothing. * </p> * * @param connection * the receiver * @param executor * See {@link Connection#setNetworkTimeout(Executor, int)} * @param milliseconds * {@link Connection#setNetworkTimeout(Executor, int)} * @throws SQLException * {@link Connection#setNetworkTimeout(Executor, int)} * @see Connection#setNetworkTimeout(Executor, int) */
public static void setNetworkTimeout(final Connection connection, final Executor executor, final int milliseconds) throws SQLException { try { connection.setNetworkTimeout(executor, milliseconds); } catch (final AbstractMethodError e) { // do nothing } }
Delegates to Connection.setSchema(String) without throwing an AbstractMethodError.

If the JDBC driver does not implement Connection.setSchema(String), then do nothing.

Params:
Throws:
See Also:
/** * Delegates to {@link Connection#setSchema(String)} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link Connection#setSchema(String)}, then do nothing. * </p> * * @param connection * the receiver * @param schema * See {@link Connection#setSchema(String)}. * @throws SQLException * See {@link Connection#setSchema(String)}. * @see Connection#setSchema(String) */
public static void setSchema(final Connection connection, final String schema) throws SQLException { try { connection.setSchema(schema); } catch (final AbstractMethodError e) { // do nothing } }
Delegates to Statement.closeOnCompletion() without throwing an AbstractMethodError.

If the JDBC driver does not implement Statement.closeOnCompletion(), then just check that the connection is closed to then throw an SQLException.

Params:
Throws:
See Also:
/** * Delegates to {@link Statement#closeOnCompletion()} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link Statement#closeOnCompletion()}, then just check that the connection * is closed to then throw an SQLException. * </p> * * @param statement * See {@link Statement#closeOnCompletion()} * @throws SQLException * See {@link Statement#closeOnCompletion()} * @see Statement#closeOnCompletion() */
public static void closeOnCompletion(final Statement statement) throws SQLException { try { statement.closeOnCompletion(); } catch (final AbstractMethodError e) { if (statement.isClosed()) { throw new SQLException("Statement closed"); } } }
Delegates to Statement.isCloseOnCompletion() without throwing an AbstractMethodError.

If the JDBC driver does not implement Statement.isCloseOnCompletion(), then just check that the connection is closed to then throw an SQLException.

Params:
Throws:
See Also:
Returns:See Statement.isCloseOnCompletion()
/** * Delegates to {@link Statement#isCloseOnCompletion()} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link Statement#isCloseOnCompletion()}, then just check that the * connection is closed to then throw an SQLException. * </p> * * @param statement * See {@link Statement#isCloseOnCompletion()} * @return See {@link Statement#isCloseOnCompletion()} * @throws SQLException * See {@link Statement#isCloseOnCompletion()} * @see Statement#closeOnCompletion() */
public static boolean isCloseOnCompletion(final Statement statement) throws SQLException { try { return statement.isCloseOnCompletion(); } catch (final AbstractMethodError e) { if (statement.isClosed()) { throw new SQLException("Statement closed"); } return false; } }
Delegates to CommonDataSource.getParentLogger() without throwing an AbstractMethodError.

If the JDBC driver does not implement CommonDataSource.getParentLogger(), then return null.

Params:
Throws:
Returns:See CommonDataSource.getParentLogger()
/** * Delegates to {@link CommonDataSource#getParentLogger()} without throwing an {@link AbstractMethodError}. * <p> * If the JDBC driver does not implement {@link CommonDataSource#getParentLogger()}, then return null. * </p> * * @param commonDataSource * See {@link CommonDataSource#getParentLogger()} * @return See {@link CommonDataSource#getParentLogger()} * @throws SQLFeatureNotSupportedException * See {@link CommonDataSource#getParentLogger()} */
public static Logger getParentLogger(final CommonDataSource commonDataSource) throws SQLFeatureNotSupportedException { try { return commonDataSource.getParentLogger(); } catch (final AbstractMethodError e) { throw new SQLFeatureNotSupportedException("javax.sql.CommonDataSource#getParentLogger()"); } } }