package com.spun.util;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Properties;
import com.spun.util.timers.Counter;
/**
* A static class of convence functions for database access
**/
public class DatabaseConfiguration
{
private boolean inRollbackOnlyMode = false;
public String dataSourceName = null;
public String driver = null;
public String protocol = null;
public String server = null;
public String port = null;
public String database = null;
public String userName = null;
public String password = null;
public int type = 0;
public String wrapper = null;
private Counter connectionCounter = new Counter();
private static HashMap<String, DatabaseConfigurationWrapper> wrappers = new HashMap<String, DatabaseConfigurationWrapper>();
public static void registerWrapper(String name, DatabaseConfigurationWrapper wrapper)
{
wrappers.put(name, wrapper);
}
/************************************************************************/
public DatabaseConfiguration(DatabaseConfiguration config)
{
this.dataSourceName = config.dataSourceName;
this.driver = config.driver;
this.protocol = config.protocol;
this.server = config.server;
this.port = config.port;
this.database = config.database;
this.userName = config.userName;
this.password = config.password;
this.type = config.type;
this.wrapper = config.wrapper;
}
/************************************************************************/
public DatabaseConfiguration(String dataSourceName, String driver, String protocol, String server, String port,
String database, String userName, String password, int type)
{
this.dataSourceName = dataSourceName;
this.driver = driver;
this.protocol = protocol;
if (protocol != null && protocol.endsWith("://")) { throw new Error("protocol's shouldn't end with '://'"); }
this.server = server;
if (server != null && server.endsWith("/")) { throw new Error("server's shouldn't end with '/'"); }
this.port = port;
this.database = database;
this.userName = userName;
this.password = password;
this.type = type;
}
/************************************************************************/
public boolean isDataSource()
{
return StringUtils.isNonZero(dataSourceName);
}
/************************************************************************/
/**
* Convenience function.
**/
public Properties getProperties()
{
Properties props = new Properties();
props.setProperty("connection", "direct");
props.setProperty("jdbcDriver", this.driver);
props.setProperty("jdbcURL", DatabaseUtils.makeURL(protocol, server, port, database, type));
props.setProperty("user", this.userName);
props.setProperty("password", this.password);
return props;
}
/************************************************************************/
public Connection makeConnection()
{
return makeConnection(database);
}
/************************************************************************/
public Connection makeConnection(String databaseName)
{
connectionCounter.inc();
Connection con = null;
if (wrapper == null)
{
con = DatabaseUtils.makeConnection(driver, protocol, server, port, databaseName, userName, password, type);
}
else
{
DatabaseConfigurationWrapper w = (DatabaseConfigurationWrapper) wrappers.get(wrapper);
if (w == null) { throw new Error("No wrapper found for '" + wrapper + "' in " + wrappers.keySet()); }
con = w.makeConnection(databaseName, this);
}
if(this.inRollbackOnlyMode)
{
try
{
DatabaseUtils.beginTransaction(con);
}
catch (SQLException e)
{
throw ObjectUtils.throwAsError(e);
}
}
return con;
}
/************************************************************************/
public Counter getConnectionCounter()
{
return connectionCounter;
}
/************************************************************************/
public String toString()
{
String value = "com.spun.util.DatabaseConfiguration[";
value += " dataSourceName = '" + dataSourceName + "'" + ",\n" + " database = '" + database + "'" + ",\n"
+ " driver = '" + driver + "'" + ",\n" + " password = '" + password + "'" + ",\n" + " port = '" + port
+ "'" + ",\n" + " protocol = '" + protocol + "'" + ",\n" + " server = '" + server + "'" + ",\n"
+ " type = " + type + ",\n" + " userName = '" + userName + "'" + "]";
return value;
}
/************************************************************************/
public String getDataSourceName()
{
return dataSourceName;
}
/************************************************************************/
public String getDatabase()
{
return database;
}
/************************************************************************/
public String getDriver()
{
return driver;
}
/************************************************************************/
public String getPassword()
{
return password;
}
/************************************************************************/
public String getProtocol()
{
return protocol;
}
/************************************************************************/
public String getServer()
{
return server;
}
/************************************************************************/
public int getType()
{
return type;
}
/************************************************************************/
public String getUserName()
{
return userName;
}
/***********************************************************************/
public int getPort()
{
return NumberUtils.load(port, 0);
}
/************************************************************************/
public void setWrapper(String wrapper)
{
this.wrapper = wrapper;
}
/************************************************************************/
public void setRollbackOnlyMode()
{
this.inRollbackOnlyMode = true;
}
/************************************************************************/
/************************************************************************/
}