package org.teiid.test.framework.datasource; import java.lang.reflect.InvocationHandler; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.XAConnection; import org.teiid.test.framework.exception.QueryTestFailedException; /** * DataSource represents a single database that was configured by a connection.properties file. * @author vanhalbert * */ @SuppressWarnings("nls") public class DataSource { public static final String CONNECTOR_TYPE="db.connectortype"; public static final String DB_TYPE="db.type"; private Properties props; private String name; private String group; private String dbtype; // The connections are stored in the datasource and are reused // for the duration of all tests so thats there's not // disconnect/connect being performed over and over private Connection conn=null; private Connection proxyconn = null; private XAConnection xaconn=null; private XAConnection proxyxaconn=null; public DataSource(String name, String group, Properties properties) { this.name = name; this.group = group; this.props = properties; this.dbtype = this.props.getProperty(DB_TYPE); } public String getName() { return name; } public String getGroup() { return group; } public String getConnectorType() { return props.getProperty(CONNECTOR_TYPE); } public String getProperty(String propName) { return props.getProperty(propName); } public Properties getProperties() { return this.props; } public String getDBType() { return this.dbtype; } public Connection getConnection() throws QueryTestFailedException { if (this.conn == null) return null; try { if (this.conn.isClosed()) { this.conn = null; this.proxyconn = null; } } catch (SQLException e) { this.conn = null; this.proxyconn = null; } return this.proxyconn; } public void setConnection(Connection c) { this.conn = c; this.proxyconn = (Connection) Proxy.newProxyInstance(Thread.currentThread() .getContextClassLoader(), new Class[] { java.sql.Connection.class }, new CloseInterceptor(conn)); } public XAConnection getXAConnection() throws QueryTestFailedException { return this.proxyxaconn; } public void setXAConnection(XAConnection xaconn) { this.xaconn = xaconn; this.proxyxaconn = (XAConnection) Proxy.newProxyInstance(Thread.currentThread() .getContextClassLoader(), new Class[] { XAConnection.class }, new CloseInterceptor(xaconn)); } public void shutdown() { if (this.conn != null) { try { this.conn.close(); } catch (Exception e) { // ignore } } this.conn = null; if (this.xaconn != null) { try { this.xaconn.close(); } catch (Exception e) { // ignore.. } } this.xaconn = null; } class CloseInterceptor implements InvocationHandler { Connection conn; XAConnection xaconn; CloseInterceptor(Object conn) { if (conn instanceof Connection) { this.conn = (Connection) conn; } else { this.xaconn = (XAConnection) conn; } } public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if (method.getName().equals("close")) { //$NON-NLS-1$ return null; } try { return method.invoke(this.conn, args); } catch (InvocationTargetException e) { throw e.getTargetException(); } } } }