/* * Copyright (c) 2000-2007 MetaMatrix, Inc. * All rights reserved. */ package org.teiid.test.framework.connection; import java.sql.Connection; import java.sql.SQLException; import java.util.Properties; import javax.sql.DataSource; import javax.sql.XAConnection; import javax.sql.XADataSource; import org.teiid.core.util.PropertiesUtils; import org.teiid.jdbc.BaseDataSource; import org.teiid.jdbc.TeiidDataSource; import org.teiid.test.framework.TestLogger; import org.teiid.test.framework.exception.QueryTestFailedException; import org.teiid.test.framework.exception.TransactionRuntimeException; @SuppressWarnings("nls") public class DataSourceConnection extends ConnectionStrategy { public static final String DS_USER = "user"; //$NON-NLS-1$ // need both user variables because Teiid uses 'user' and connectors use // 'username' public static final String DS_USERNAME = "User"; //$NON-NLS-1$ public static final String DS_PASSWORD = "Password"; //$NON-NLS-1$ // the driver is only used for making direct connections to the source, the // connector type will provide the JDBCPropertyNames.CONNECTION_SOURCE // driver class public static final String DS_DRIVER = "driver"; //$NON-NLS-1$ public static final String DS_DATASOURCE = "datasource"; //$NON-NLS-1$ public static final String DS_SERVERNAME = "ServerName"; //$NON-NLS-1$ public static final String DS_SERVERPORT = "PortNumber"; //$NON-NLS-1$ public static final String DS_JNDINAME = "ds-jndiname"; //$NON-NLS-1$ public static final String DS_DATABASENAME = "DatabaseName"; //$NON-NLS-1$ public static final String DS_APPLICATION_NAME = "application-name"; //$NON-NLS-1$ public static final String DS_URL = "URL"; //$NON-NLS-1$ private String driver = null; private String username = null; private String pwd = null; private String applName = null; private String databaseName = null; private String serverName = null; private String portNumber = null; private String url = null; private XAConnection xaConnection; public DataSourceConnection(Properties props) throws QueryTestFailedException { super(props); } public void validate() { databaseName = this.getEnvironment().getProperty(DS_DATABASENAME); if (databaseName == null || databaseName.length() == 0) { throw new TransactionRuntimeException("Property " + DS_DATABASENAME + " was not specified"); } serverName = this.getEnvironment().getProperty(DS_SERVERNAME); if (serverName == null || serverName.length() == 0) { throw new TransactionRuntimeException("Property " + DS_SERVERNAME + " was not specified"); } this.portNumber = this.getEnvironment().getProperty(DS_SERVERPORT); this.applName = this.getEnvironment().getProperty(DS_APPLICATION_NAME); if (this.getEnvironment().getProperty(DS_DATASOURCE) != null) { this.driver = this.getEnvironment().getProperty(DS_DATASOURCE); if (this.driver == null || this.driver.length() == 0) { throw new TransactionRuntimeException("Property " + DS_DATASOURCE + " was null"); } } else { this.driver = this.getEnvironment().getProperty(DS_DRIVER); if (this.driver == null || this.driver.length() == 0) { throw new TransactionRuntimeException("Property " + DS_DRIVER + " was not specified"); } } this.url = this.getEnvironment().getProperty(DS_URL); this.username = this.getEnvironment().getProperty(DS_USER); if (username == null) { this.username = this.getEnvironment().getProperty(DS_USERNAME); } this.pwd = this.getEnvironment().getProperty(DS_PASSWORD); } @Override public Connection getConnection() throws QueryTestFailedException { try { return getXAConnection().getConnection(); } catch (QueryTestFailedException qtf) { throw qtf; } catch (Exception e) { e.printStackTrace(); throw new QueryTestFailedException(e); } } @Override public synchronized XAConnection getXAConnection() throws QueryTestFailedException { if (xaConnection == null) { validate(); try { xaConnection = createConnection(); } catch (Exception e) { throw new QueryTestFailedException(e); } } return xaConnection; } private XAConnection createConnection() throws SQLException, InstantiationException, IllegalAccessException, ClassNotFoundException { TestLogger.log("Creating Datasource Connection: \"" + this.serverName + " - " + this.databaseName + "\""); //$NON-NLS-1$ //$NON-NLS-2$ DataSource ds = (DataSource) Class.forName(this.driver).newInstance(); if (ds instanceof BaseDataSource) { BaseDataSource dataSource = (BaseDataSource) ds; dataSource.setDatabaseName(this.databaseName); if (this.applName != null) { dataSource.setApplicationName(this.applName); } ((TeiidDataSource) dataSource).setServerName(this.serverName); ((TeiidDataSource) dataSource).setPortNumber(Integer.parseInt(this.portNumber)); if (this.username != null) { dataSource.setUser(this.username); dataSource.setPassword(this.pwd); } return ((XADataSource) dataSource).getXAConnection(this.username, this.pwd); } Properties props = new Properties(); props.setProperty(DS_DATABASENAME, this.databaseName); props.setProperty(DS_SERVERPORT, this.portNumber); props.setProperty(DS_URL, this.url); props.setProperty(DS_SERVERNAME, this.serverName); if (this.username != null) { props.setProperty(DS_USERNAME, this.username); props.setProperty(DS_USER, this.username); props.setProperty(DS_PASSWORD, this.pwd); } PropertiesUtils.setBeanProperties(ds, props, null); return ((XADataSource) ds).getXAConnection(); } public void shutdown() { super.shutdown(); try { if (this.xaConnection != null) { this.xaConnection.close(); } } catch (Exception e) { // ignore.. } this.xaConnection = null; } }