package net.sourceforge.javautil.database.external;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
import javax.sql.DataSource;
import net.sourceforge.javautil.common.exception.ThrowableManagerRegistry;
import net.sourceforge.javautil.common.io.impl.SystemDirectory;
import net.sourceforge.javautil.common.password.IPassword;
import net.sourceforge.javautil.database.IDatabaseServer;
import net.sourceforge.javautil.database.DatabaseServerAbstract;
import net.sourceforge.javautil.datasource.IDataSourceDescriptor;
import net.sourceforge.javautil.datasource.DataSourceDescriptorStandard;
import net.sourceforge.javautil.datasource.SimpleDataSource;
import net.sourceforge.javautil.template.impl.template.SimpleStringTemplate;
import net.sourceforge.javautil.template.impl.template.TemplateContextVariableDefault;
/**
* A wrapper for an external {@link IDatabaseServer}.
*
* @author elponderador
* @author $Author$
* @version $Id$
*/
public class ExternalDatabase extends DatabaseServerAbstract {
protected final String driverClass;
protected final SimpleStringTemplate urlTemplate;
protected final Map<String, String> databaseURLs = new HashMap<String, String>();
public ExternalDatabase(String name, SystemDirectory root, String driverClass, SimpleStringTemplate urlTemplate) {
super(name, root);
this.driverClass = driverClass;
this.urlTemplate = urlTemplate;
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException("No such driver could be located: " + driverClass);
}
}
public Connection createConnection(String databaseName, String username, IPassword password) throws SQLException {
return DriverManager.getConnection(getDatabaseURL(databaseName), username, new String(password.getPassword()));
}
public boolean createDatabase(String name, String username, IPassword password) {
Connection connection = null;
Statement st = null;
try {
connection = this.createConnection(name, username, password);
st = connection.createStatement();
st.execute("CREATE DATABASE " + name);
this.getDatabaseURL(name);
return true;
} catch (SQLException e) {
return false;
} finally {
if (st != null) try { st.close(); } catch (SQLException e) { }
if (connection != null) try { connection.close(); } catch (SQLException e) { }
}
}
public DataSource createDataSource(String databaseName, String username, IPassword password) throws SQLException {
return new SimpleDataSource(this.createDescriptor(username, databaseName, username), password);
}
public IDataSourceDescriptor createDescriptor(String name, String databaseName, String username) {
return new DataSourceDescriptorStandard(name, driverClass, getDatabaseURL(databaseName), username);
}
public String getUsername() { return null; }
public boolean isDatabaseExists(String name) {
return databaseURLs.containsKey(name);
}
protected String getDatabaseURL (String databaseName) {
if (!databaseURLs.containsKey(databaseName)) {
TemplateContextVariableDefault var = new TemplateContextVariableDefault();
var.setVariable("database", databaseName);
databaseURLs.put(databaseName, urlTemplate.build(var).getTemplate());
}
return databaseURLs.get(databaseName);
}
}