package net.sourceforge.javautil.database.derby;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource;
import org.apache.derby.jdbc.EmbeddedConnectionPoolDataSource40;
import net.sourceforge.javautil.common.io.impl.SystemDirectory;
import net.sourceforge.javautil.common.password.IPassword;
import net.sourceforge.javautil.database.DatabaseServerAbstract;
import net.sourceforge.javautil.datasource.IDataSourceDescriptor;
import net.sourceforge.javautil.datasource.DataSourceDescriptorStandard;
import net.sourceforge.javautil.lifecycle.ILifecycle.PhaseType;
import net.sourceforge.javautil.lifecycle.annotation.Phase;
/**
* The main implementation for using Apache Derby as an internal database server.
*
* @author elponderador
* @author $Author: ponderator $
* @version $Id: DerbyDatabaseServer.java 2297 2010-06-16 00:13:14Z ponderator $
*/
public class DerbyDatabaseServer extends DatabaseServerAbstract {
public DerbyDatabaseServer(SystemDirectory root) {
super("Apache Derby Database", root);
}
@Phase(value=PhaseType.START) public void startDerby() {}
@Phase(value=PhaseType.DESTROY) public void stopDerby() {
try { DriverManager.getConnection("jdbc:derby:;shutdown=true"); } catch (SQLException e) {}
}
public boolean isDatabaseExists(String name) { return new File(this.root.getRealArtifact(), name).exists(); }
public boolean createDatabase(String name, String username, IPassword password) {
File databaseDir = new File(this.root.getRealArtifact(), name);
if (databaseDir.exists()) return false;
try {
this.createConnection(name, username, password);
return true;
} catch (SQLException e) {
return false;
}
}
public String getUsername() { return null; }
public Connection createConnection(String databaseName, String username, IPassword password) throws SQLException {
String url = this.createConnectionURL(databaseName, username, password);
return username == null ? DriverManager.getConnection(url) : DriverManager.getConnection(url, username, new String(password.getPassword()));
}
public IDataSourceDescriptor createDescriptor(String name, String databaseName, String username) {
return new DataSourceDescriptorStandard(name, "org.apache.derby.jdbc.EmbeddedDriver",
this.createConnectionURL(databaseName, username, null), username);
}
public DataSource createDataSource(String databaseName, String username, IPassword password) throws SQLException {
EmbeddedConnectionPoolDataSource pooled = new EmbeddedConnectionPoolDataSource40();
pooled.setDatabaseName(databaseName);
pooled.setUser(username);
pooled.setPassword(new String(password.getPassword()));
if (!this.isDatabaseExists(databaseName)) {
pooled.setCreateDatabase("create");
}
return pooled;
}
/**
* Central place for URL connection generation
*/
protected String createConnectionURL (String databaseName, String username, IPassword password) {
File databaseDir = new File(this.root.getRealArtifact(), databaseName);
String url = "jdbc:derby:directory:" + databaseDir.getPath();
if (!databaseDir.exists()) {
url += ";create=true";
if (username != null) url += "user=" + username + ";password=" + new String(password.getPassword());
}
return url;
}
}