/*
* Copyright (C) 2011 eXo Platform SAS.
*
* This is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This software is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
*/
package org.exoplatform.services.jdbc.impl;
import org.exoplatform.services.log.ExoLogger;
import org.exoplatform.services.log.Log;
import java.lang.reflect.Method;
import java.sql.Array;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Clob;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.NClob;
import java.sql.PreparedStatement;
import java.sql.SQLClientInfoException;
import java.sql.SQLException;
import java.sql.SQLWarning;
import java.sql.SQLXML;
import java.sql.Savepoint;
import java.sql.Statement;
import java.sql.Struct;
import java.util.Map;
import java.util.Properties;
import java.util.concurrent.Executor;
/**
* This classes wraps a jdbc connection in order to prevent any forbidden
* actions such as explicit commit/rollback.
*
* @author <a href="mailto:nfilotto@exoplatform.com">Nicolas Filotto</a>
* @version $Id$
*
*/
public class ManagedConnection implements Connection
{
/**
* The logger
*/
private static final Log LOG = ExoLogger.getLogger("exo.kernel.component.common.ManagedConnection");
/**
* The nested connection
*/
private final Connection con;
/**
* default constructor
*/
public ManagedConnection(Connection con)
{
this.con = con;
}
/**
* @see java.sql.Wrapper#isWrapperFor(java.lang.Class)
*/
public boolean isWrapperFor(Class<?> iface) throws SQLException
{
return con.isWrapperFor(iface);
}
/**
* @see java.sql.Wrapper#unwrap(java.lang.Class)
*/
public <T> T unwrap(Class<T> iface) throws SQLException
{
return con.unwrap(iface);
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String)
*/
public PreparedStatement prepareStatement(String sql) throws SQLException
{
return con.prepareStatement(sql);
}
/**
* @see java.sql.Connection#prepareCall(java.lang.String)
*/
public CallableStatement prepareCall(String sql) throws SQLException
{
return con.prepareCall(sql);
}
/**
* @see java.sql.Connection#nativeSQL(java.lang.String)
*/
public String nativeSQL(String sql) throws SQLException
{
return con.nativeSQL(sql);
}
/**
* @see java.sql.Connection#setAutoCommit(boolean)
*/
public void setAutoCommit(boolean autoCommit) throws SQLException
{
con.setAutoCommit(autoCommit);
}
/**
* @see java.sql.Connection#commit()
*/
public void commit() throws SQLException
{
// We cannot call commit explicitly, it will be done by the AS itself
}
/**
* @see java.sql.Connection#rollback()
*/
public void rollback() throws SQLException
{
// We cannot call rollback explicitly, it will be done by the AS itself
}
/**
* @see java.sql.Connection#close()
*/
public void close() throws SQLException
{
con.close();
}
/**
* @see java.sql.Connection#setReadOnly(boolean)
*/
public void setReadOnly(boolean readOnly) throws SQLException
{
con.setReadOnly(readOnly);
}
/**
* @see java.sql.Connection#setCatalog(java.lang.String)
*/
public void setCatalog(String catalog) throws SQLException
{
con.setCatalog(catalog);
}
/**
* @see java.sql.Connection#setTransactionIsolation(int)
*/
public void setTransactionIsolation(int level) throws SQLException
{
con.setTransactionIsolation(level);
}
/**
* @see java.sql.Connection#clearWarnings()
*/
public void clearWarnings() throws SQLException
{
con.clearWarnings();
}
/**
* @see java.sql.Connection#createArrayOf(java.lang.String, java.lang.Object[])
*/
public Array createArrayOf(String typeName, Object[] elements) throws SQLException
{
return con.createArrayOf(typeName, elements);
}
/**
* @see java.sql.Connection#createBlob()
*/
public Blob createBlob() throws SQLException
{
return con.createBlob();
}
/**
* @see java.sql.Connection#createClob()
*/
public Clob createClob() throws SQLException
{
return con.createClob();
}
/**
* @see java.sql.Connection#createNClob()
*/
public NClob createNClob() throws SQLException
{
return con.createNClob();
}
/**
* @see java.sql.Connection#createSQLXML()
*/
public SQLXML createSQLXML() throws SQLException
{
return con.createSQLXML();
}
/**
* @see java.sql.Connection#createStatement()
*/
public Statement createStatement() throws SQLException
{
return con.createStatement();
}
/**
* @see java.sql.Connection#createStatement(int, int)
*/
public Statement createStatement(int resultSetType, int resultSetConcurrency) throws SQLException
{
return con.createStatement(resultSetType, resultSetConcurrency);
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, int, int)
*/
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
throws SQLException
{
return con.prepareStatement(sql, resultSetType, resultSetConcurrency);
}
/**
* @see java.sql.Connection#prepareCall(java.lang.String, int, int)
*/
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency) throws SQLException
{
return con.prepareCall(sql, resultSetType, resultSetConcurrency);
}
/**
* @see java.sql.Connection#setTypeMap(java.util.Map)
*/
public void setTypeMap(Map<String, Class<?>> map) throws SQLException
{
con.setTypeMap(map);
}
/**
* @see java.sql.Connection#setSavepoint()
*/
public Savepoint setSavepoint() throws SQLException
{
return con.setSavepoint();
}
/**
* @see java.sql.Connection#setSavepoint(java.lang.String)
*/
public Savepoint setSavepoint(String name) throws SQLException
{
return con.setSavepoint(name);
}
/**
* @see java.sql.Connection#rollback(java.sql.Savepoint)
*/
public void rollback(Savepoint savepoint) throws SQLException
{
// We cannot call rollback explicitly, it will be done by the AS itself
}
/**
* @see java.sql.Connection#releaseSavepoint(java.sql.Savepoint)
*/
public void releaseSavepoint(Savepoint savepoint) throws SQLException
{
con.releaseSavepoint(savepoint);
}
/**
* @see java.sql.Connection#createStatement(int, int, int)
*/
public Statement createStatement(int resultSetType, int resultSetConcurrency, int resultSetHoldability)
throws SQLException
{
return con.createStatement(resultSetType, resultSetConcurrency, resultSetHoldability);
}
/**
* @see java.sql.Connection#createStruct(java.lang.String, java.lang.Object[])
*/
public Struct createStruct(String typeName, Object[] attributes) throws SQLException
{
return con.createStruct(typeName, attributes);
}
/**
* @see java.sql.Connection#getAutoCommit()
*/
public boolean getAutoCommit() throws SQLException
{
return con.getAutoCommit();
}
/**
* @see java.sql.Connection#isClosed()
*/
public boolean isClosed() throws SQLException
{
return con.isClosed();
}
/**
* @see java.sql.Connection#isReadOnly()
*/
public boolean isReadOnly() throws SQLException
{
return con.isReadOnly();
}
/**
* @see java.sql.Connection#getCatalog()
*/
public String getCatalog() throws SQLException
{
return con.getCatalog();
}
/**
* @see java.sql.Connection#getClientInfo()
*/
public Properties getClientInfo() throws SQLException
{
return con.getClientInfo();
}
/**
* @see java.sql.Connection#getClientInfo(java.lang.String)
*/
public String getClientInfo(String name) throws SQLException
{
return con.getClientInfo(name);
}
/**
* @see java.sql.Connection#getMetaData()
*/
public DatabaseMetaData getMetaData() throws SQLException
{
return con.getMetaData();
}
/**
* @see java.sql.Connection#getTransactionIsolation()
*/
public int getTransactionIsolation() throws SQLException
{
return con.getTransactionIsolation();
}
/**
* @see java.sql.Connection#getWarnings()
*/
public SQLWarning getWarnings() throws SQLException
{
return con.getWarnings();
}
/**
* @see java.sql.Connection#getTypeMap()
*/
public Map<String, Class<?>> getTypeMap() throws SQLException
{
return con.getTypeMap();
}
/**
* @see java.sql.Connection#getHoldability()
*/
public int getHoldability() throws SQLException
{
return con.getHoldability();
}
/**
* @see java.sql.Connection#isValid(int)
*/
public boolean isValid(int timeout) throws SQLException
{
return con.isValid(timeout);
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, int, int, int)
*/
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException
{
return con.prepareStatement(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
}
/**
* @see java.sql.Connection#prepareCall(java.lang.String, int, int, int)
*/
public CallableStatement prepareCall(String sql, int resultSetType, int resultSetConcurrency,
int resultSetHoldability) throws SQLException
{
return con.prepareCall(sql, resultSetType, resultSetConcurrency, resultSetHoldability);
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, int)
*/
public PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) throws SQLException
{
return con.prepareStatement(sql, autoGeneratedKeys);
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, int[])
*/
public PreparedStatement prepareStatement(String sql, int[] columnIndexes) throws SQLException
{
return con.prepareStatement(sql, columnIndexes);
}
/**
* @see java.sql.Connection#prepareStatement(java.lang.String, java.lang.String[])
*/
public PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException
{
return con.prepareStatement(sql, columnNames);
}
/**
* @see java.sql.Connection#setClientInfo(java.util.Properties)
*/
public void setClientInfo(Properties properties) throws SQLClientInfoException
{
con.setClientInfo(properties);
}
/**
* @see java.sql.Connection#setClientInfo(java.lang.String, java.lang.String)
*/
public void setClientInfo(String name, String value) throws SQLClientInfoException
{
con.setClientInfo(name, value);
}
/**
* @see java.sql.Connection#setHoldability(int)
*/
public void setHoldability(int holdability) throws SQLException
{
con.setHoldability(holdability);
}
/**
* @see java.sql.Connection#setSchema(java.lang.String)
*/
public void setSchema(String schema) throws SQLException
{
try
{
Method m = con.getClass().getMethod("setSchema", String.class);
m.invoke(con, schema);
}
catch (NoSuchMethodException e)
{
LOG.debug("The method setSchema cannot be found in the class " + con.getClass() +
", so we assume it is not supported");
}
catch (Exception e)
{
throw new SQLException(e);
}
}
/**
* @see java.sql.Connection#getSchema()
*/
public String getSchema() throws SQLException
{
try
{
Method m = con.getClass().getMethod("getSchema");
return (String)m.invoke(con);
}
catch (NoSuchMethodException e)
{
LOG.debug("The method getSchema cannot be found in the class " + con.getClass() +
", so we assume it is not supported");
}
catch (Exception e)
{
throw new SQLException(e);
}
return null;
}
/**
* @see java.sql.Connection#abort(java.util.concurrent.Executor)
*/
public void abort(Executor executor) throws SQLException
{
try
{
Method m = con.getClass().getMethod("abort", Executor.class);
m.invoke(con, executor);
}
catch (NoSuchMethodException e)
{
LOG.debug("The method abort cannot be found in the class " + con.getClass() +
", so we assume it is not supported");
}
catch (Exception e)
{
throw new SQLException(e);
}
}
/**
* @see java.sql.Connection#setNetworkTimeout(java.util.concurrent.Executor, int)
*/
public void setNetworkTimeout(Executor executor, int milliseconds) throws SQLException
{
try
{
Method m = con.getClass().getMethod("setNetworkTimeout", Executor.class, int.class);
m.invoke(con, executor, milliseconds);
}
catch (NoSuchMethodException e)
{
LOG.debug("The method setNetworkTimeout cannot be found in the class " + con.getClass() +
", so we assume it is not supported");
}
catch (Exception e)
{
throw new SQLException(e);
}
}
/**
* @see java.sql.Connection#getNetworkTimeout()
*/
public int getNetworkTimeout() throws SQLException
{
try
{
Method m = con.getClass().getMethod("getNetworkTimeout");
return (Integer)m.invoke(con);
}
catch (NoSuchMethodException e)
{
LOG.debug("The method getNetworkTimeout cannot be found in the class " + con.getClass() +
", so we assume it is not supported");
}
catch (Exception e)
{
throw new SQLException(e);
}
return 0;
}
}