/*
* (c) Rob Gordon 2005
*/
package org.oddjob.sql;
import java.io.Serializable;
import java.sql.Connection;
import java.sql.Driver;
import java.sql.SQLException;
import java.util.Properties;
import javax.inject.Inject;
import org.apache.log4j.Logger;
import org.oddjob.arooa.convert.ArooaConversionException;
import org.oddjob.arooa.types.ValueFactory;
/**
* @oddjob.description Definition for a Database connection.
*
* @oddjob.example
*
* See {@link org.oddjob.sql.SQLJob} for an example.
*
* @author Rob Gordon.
*/
public class ConnectionType implements ValueFactory<Connection>, Serializable {
private final static long serialVersionUID = 20070315;
private static final Logger logger = Logger.getLogger(ConnectionType.class);
/**
* @oddjob.property
* @oddjob.description The driver class name.
* @oddjob.required Yes.
*/
private String driver;
/**
* @oddjob.property
* @oddjob.description The jdbc url.
* @oddjob.required Yes.
*/
private String url;
/**
* @oddjob.property
* @oddjob.description The database username..
* @oddjob.required No.
*/
private String username;
/**
* @oddjob.property
* @oddjob.description The users password.
* @oddjob.required No.
*/
private String password;
/**
* @oddjob.property
* @oddjob.description The class loader to use to load the JDBC driver.
* @oddjob.required No.
*/
private ClassLoader classLoader;
/*
* (non-Javadoc)
* @see org.oddjob.arooa.types.ValueFactory#toValue()
*/
public Connection toValue() throws ArooaConversionException {
if (driver == null) {
throw new NullPointerException("Driver must be provided.");
}
if (url == null) {
throw new NullPointerException("Url must be provided.");
}
ClassLoader loader = classLoader;
if (loader == null) {
loader = getClass().getClassLoader();
}
Class<?> driverClass;
try {
// Attempting to fix Deadlock issues possibly caused by
// http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6354348
synchronized (Driver.class) {
driverClass = Class.forName(driver, true, loader);
}
} catch (ClassNotFoundException e) {
throw new ArooaConversionException(e);
}
Driver theDriver;
try {
theDriver = (Driver) driverClass.newInstance();
} catch (Exception e) {
throw new ArooaConversionException(e);
}
Properties info = new Properties();
if (username != null) {
info.put("user", username);
}
if (password != null) {
info.put("password", password);
}
try {
Connection connection = theDriver.connect(url, info);
if (connection == null) {
throw new ArooaConversionException(
"No connection available for [" + url + "]");
}
return connection;
} catch (SQLException e) {
logger.warn("Failed creating connection to: " + url, e);
for (SQLException ce = e.getNextException(); ce != null;
ce = ce.getNextException()) {
logger.warn("Next chained exception:", ce);
}
throw new ArooaConversionException(e);
}
}
/**
* Get this connections driver class name.
*
* @return The driver class name.
*/
public String getDriver() {
return driver;
}
/**
* Set this connections dirver class name.
*
* @param driver The driver class name.
*/
public void setDriver(String driver) {
this.driver = driver;
}
/**
* Get the password.
*
* @return The password.
*/
public String getPassword() {
return password;
}
/**
* Set the password.
*
* @param password The password.
*/
public void setPassword(String password) {
this.password = password;
}
/**
* Get the url.
*
* @return The url.
*/
public String getUrl() {
return url;
}
/**
* Set the url.
*
* @param url The url
*/
public void setUrl(String url) {
this.url = url;
}
/**
* Get the username.
*
* @return The username.
*/
public String getUsername() {
return username;
}
/**
* Set the username.
*
* @param username The username.
*/
public void setUsername(String username) {
this.username = username;
}
public ClassLoader getClassLoader() {
return classLoader;
}
@Inject
public void setClassLoader(ClassLoader classLoader) {
this.classLoader = classLoader;
}
/*
* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return "Connection to " + url + " as " + username;
}
}