/* * Copyright (c) 2000-2007 MetaMatrix, Inc. * All rights reserved. */ package org.teiid.test.framework.connection; import java.sql.Connection; import java.util.Properties; import javax.sql.XAConnection; import org.teiid.core.util.PropertiesUtils; import org.teiid.test.framework.ConfigPropertyLoader; import org.teiid.test.framework.datasource.DataSource; import org.teiid.test.framework.datasource.DataSourceMgr; import org.teiid.test.framework.datasource.DataStore; import org.teiid.test.framework.exception.QueryTestFailedException; import org.teiid.test.framework.exception.TransactionRuntimeException; @SuppressWarnings("nls") public abstract class ConnectionStrategy { private Properties env = null; // private DataSourceFactory dsFactory; // the useProxy is used for non-teiid connections so that the sources are // closed and reconnected all the time private boolean useProxy = false; public ConnectionStrategy(Properties props) { this.env = PropertiesUtils.clone(props); } /* * Lifecycle methods for managing the connection */ /** * Returns a connection * * @return Connection * @throws QueryTestFailedException */ public abstract Connection getConnection() throws QueryTestFailedException; public boolean useProxy() { return this.useProxy; } void setUseProxy(boolean useproxy) { this.useProxy = useproxy; } /** * @since */ public void shutdown() { } /** * @throws QueryTestFailedException */ public Connection getAdminConnection() throws QueryTestFailedException { return null; } private boolean autoCommit; public boolean getAutocommit() { return autoCommit; } /** * @throws QueryTestFailedException */ public XAConnection getXAConnection() throws QueryTestFailedException { return null; } /** * In certain testcases, the data that being provided is already * preconfigured and should not be touched by the {@link DataStore} * processing. * * @return */ public boolean isDataStoreDisabled() { return ConfigPropertyLoader.getInstance().isDataStoreDisabled(); } public Properties getEnvironment() { return env; } public void setEnvironmentProperty(String key, String value) { this.env.setProperty(key, value); } /** * @throws QueryTestFailedException */ void configure() throws QueryTestFailedException { // // if (this.isDataStoreDisabled()) { // return; // } else { // // // commenting out until embedded testing is made available and its required to configure // // the vdb and bindings in this mannder // // if (true) // return; // } // // try { // // the the driver strategy is going to be used to connection // // directly to the connector binding // // source, then no administration can be done // Admin admin = AdminFactory.getInstance().createAdmin( // this.env.getProperty("admin.user"), // this.env.getProperty("admin.password").toCharArray(), // this.env.getProperty("admin.url")); // // java.sql.Connection conn = getConnection(); // // if (!(conn instanceof ConnectionImpl)) { // TestLogger // .log("ConnectionStrategy configuration: connection is not of type MMConnection and therefore no vdb setup will be performed"); // return; // } // // // // setupVDBConnectorBindings(admin); // // // admin.restart(); // // int sleep = 5; // // TestLogger.log("Bouncing the system..(wait " + sleep + " seconds)"); //$NON-NLS-1$ // Thread.sleep(1000 * sleep); // TestLogger.log("done."); //$NON-NLS-1$ // // } catch (Throwable e) { // e.printStackTrace(); // // throw new TransactionRuntimeException(e.getMessage()); // } finally { // // need to close and flush the connection after restarting // // this.shutdown(); // // } } // protected void setupVDBConnectorBindings(Admin api) throws // QueryTestFailedException { // // try { // // VDB vdb = null; // Set<VDB> vdbs = api.getVDBs(); // if (vdbs == null || vdbs.isEmpty()) { // throw new QueryTestFailedException( // "AdminApi.GetVDBS returned no vdbs available"); // } // // String urlString = this.env.getProperty(DriverConnection.DS_URL); // JDBCURL url = new JDBCURL(urlString); // TestLogger.logDebug("Trying to match VDB : " + url.getVDBName()); // // for (Iterator<VDB> iterator = vdbs.iterator(); iterator.hasNext();) { // VDB v = (VDB) iterator.next(); // if (v.getName().equalsIgnoreCase(url.getVDBName())) { // vdb = v; // } // // } // if (vdbs == null) { // throw new QueryTestFailedException( // "GetVDBS did not return a vdb that matched " // + url.getVDBName()); // } // // List<Model> models = vdb.getModels(); // Iterator<Model> modelIt = models.iterator(); // while (modelIt.hasNext()) { // Model m = modelIt.next(); // // if (!m.isSource()) // continue; // // // get the mapping, if defined // String mappedName = this.env.getProperty(m.getName()); // // String useName = m.getName(); // if (mappedName != null) { // useName = mappedName; // } // // org.teiid.test.framework.datasource.DataSource ds = // this.dsFactory.getDatasource(useName, m.getName()); // // if (ds != null) { // // TestLogger.logInfo("Set up Connector Binding (model:mapping:type): " + m.getName() + ":" + useName + ":" + ds.getConnectorType()); //$NON-NLS-1$ // // api.addConnectorBinding(ds.getName(),ds.getConnectorType(), // ds.getProperties()); // // api.assignBindingToModel(vdb.getName(), vdb.getVersion(), m.getName(), // ds.getName(), ds.getProperty("jndi-name")); // // api.startConnectorBinding(api.getConnectorBinding(ds.getName())); // } else { // throw new QueryTestFailedException( // "Error: Unable to create binding to map to model : " // + m.getName() + ", the mapped name " // + useName // + " had no datasource properties defined"); // } // // } // // } catch (QueryTestFailedException qt) { // throw qt; // } catch (Exception t) { // t.printStackTrace(); // throw new QueryTestFailedException(t); // } // // // } public synchronized Connection createDriverConnection(String identifier) throws QueryTestFailedException { DataSource ds = null; if (identifier != null) { ds = DataSourceMgr.getInstance().getDataSource(identifier); } if (ds == null) { throw new TransactionRuntimeException( "Program Error: DataSource is not mapped to Identifier " + identifier); } Connection conn = ds.getConnection(); if (conn != null) return conn; ConnectionStrategy cs = null; if (identifier == null) { cs = new DriverConnection(ds.getProperties()); } else { cs = new DriverConnection(ds.getProperties()); } // conn = cs.getConnection(); // // conn = (Connection) Proxy.newProxyInstance(Thread.currentThread() // .getContextClassLoader(), // new Class[] { java.sql.Connection.class }, // new CloseInterceptor(conn)); ds.setConnection(cs.getConnection()); return ds.getConnection(); } public synchronized XAConnection createDataSourceConnection( String identifier) throws QueryTestFailedException { DataSource ds = null; if (identifier != null) { ds = DataSourceMgr.getInstance().getDataSource(identifier); } if (ds == null) { throw new TransactionRuntimeException( "Program Error: DataSource is not mapped to Identifier " + identifier); } XAConnection conn = ds.getXAConnection(); if (conn != null) return conn; ConnectionStrategy cs = null; if (identifier == null) { cs = new DataSourceConnection(ds.getProperties()); } else { cs = new DataSourceConnection(ds.getProperties()); } // conn = cs.getXAConnection(); // // conn = (XAConnection) Proxy.newProxyInstance(Thread.currentThread() // .getContextClassLoader(), // new Class[] { javax.sql.XAConnection.class }, // new CloseInterceptor(conn)); ds.setXAConnection(cs.getXAConnection()); return ds.getXAConnection(); } // 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(); // } // } // } }