/*
* Copyright (c) 2000-2007 MetaMatrix, Inc.
* All rights reserved.
*/
package org.teiid.test.framework.connection;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import org.teiid.test.framework.TestLogger;
import org.teiid.test.framework.exception.QueryTestFailedException;
import org.teiid.test.framework.exception.TransactionRuntimeException;
/**
* The DriverConnection strategy that can get connections in standalone mode or
* embedded mode.
*/
@SuppressWarnings("nls")
public class DriverConnection 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_URL = "URL"; //$NON-NLS-1$
public static final String DS_APPLICATION_NAME = "application-name"; //$NON-NLS-1$
private String url = null;
private String driver = null;
private String username = null;
private String pwd = null;
private Connection connection;
public DriverConnection(Properties props) throws QueryTestFailedException {
super(props);
validate();
}
public void validate() {
String urlProp = this.getEnvironment().getProperty(DS_URL);
if (urlProp == null || urlProp.length() == 0) {
throw new TransactionRuntimeException("Property " + DS_URL
+ " was not specified");
}
StringBuffer urlSB = new StringBuffer(urlProp);
String appl = this.getEnvironment().getProperty(DS_APPLICATION_NAME);
if (appl != null) {
urlSB.append(";");
urlSB.append("ApplicationName").append("=").append(appl);
}
url = urlSB.toString();
driver = this.getEnvironment().getProperty(DS_DRIVER);
if (driver == null || driver.length() == 0) {
throw new TransactionRuntimeException("Property " + DS_DRIVER
+ " was not specified");
}
// need both user variables because Teiid uses 'user' and connectors use
// 'username'
this.username = this.getEnvironment().getProperty(DS_USER);
if (username == null) {
this.username = this.getEnvironment().getProperty(DS_USERNAME);
}
this.pwd = this.getEnvironment().getProperty(DS_PASSWORD);
try {
// Load jdbc driver
Class.forName(driver);
} catch (ClassNotFoundException e) {
throw new TransactionRuntimeException(e);
}
}
public synchronized Connection getConnection()
throws QueryTestFailedException {
if (this.connection != null) {
try {
if (!this.connection.isClosed()) {
return this.connection;
}
} catch (SQLException e) {
}
}
this.connection = getJDBCConnection(this.driver, this.url,
this.username, this.pwd);
return this.connection;
}
private Connection getJDBCConnection(String driver, String url,
String user, String passwd) throws QueryTestFailedException {
TestLogger.log("Creating Driver Connection: \"" + url + "\"" + " user:password - " + (user!=null?user:"NA") + ":" + (passwd!=null?passwd:"NA")); //$NON-NLS-1$ //$NON-NLS-2$
Connection conn = null;
try {
// Create a connection
if (user != null && user.length() > 0) {
conn = DriverManager.getConnection(url, user, passwd);
} else {
conn = DriverManager.getConnection(url);
}
} catch (Throwable t) {
t.printStackTrace();
throw new QueryTestFailedException(t.getMessage());
}
return conn;
}
@Override
public void shutdown() {
super.shutdown();
if (this.connection != null) {
try {
this.connection.close();
} catch (Exception e) {
// ignore
}
}
this.connection = null;
}
}