/*
* This software is distributed under the terms of the FSF
* Gnu Lesser General Public License (see lgpl.txt).
*
* This program is distributed WITHOUT ANY WARRANTY. See the
* GNU General Public License for more details.
*/
package com.scooterframework.orm.sqldataexpress.connection;
import java.util.Properties;
import com.scooterframework.orm.sqldataexpress.config.DatabaseConfig;
import com.scooterframework.orm.sqldataexpress.exception.CreateConnectionFailureException;
/**
* UserDatabaseConnectionFactory class creates UserDatabaseConnection.
*
* @author (Fei) John Chen
*/
public class UserDatabaseConnectionFactory {
private static final UserDatabaseConnectionFactory me = new UserDatabaseConnectionFactory();
private UserDatabaseConnectionFactory() {
}
/**
* Returns self.
*/
public static UserDatabaseConnectionFactory getInstance() {
return me;
}
/**
* Create a UserDatabaseConnection instance based on the default
* connection name in the properties file.
* @return UserDatabaseConnection
*/
public UserDatabaseConnection createUserDatabaseConnection() {
//check if there is any default connection name specified in property file
String connName = DatabaseConfig.getInstance().getDefaultDatabaseConnectionName();
return createUserDatabaseConnection(connName);
}
/**
* Create a UserDatabaseConnection instance based on connection name. The
* properties related to the name must be in the properties file.
*
* @param connName database connection name
* @return UserDatabaseConnection
*/
public UserDatabaseConnection createUserDatabaseConnection(String connName) {
if (connName == null || connName.equals(""))
throw new CreateConnectionFailureException("Failed to create a database connection: connection name is null.");
Properties prop = DatabaseConfig.getInstance().getPredefinedDatabaseConnectionProperties(connName);
return buildUserDatabaseConnection(connName, prop);
}
/**
* Create a UserDatabaseConnection instance based on supplied
* DatabaseConnectionContext instance.
*
* @param dcc a DatabaseConnectionContext instance
* @return UserDatabaseConnection
*/
public UserDatabaseConnection createUserDatabaseConnection(DatabaseConnectionContext dcc) {
if (dcc == null) return null;
UserDatabaseConnection udc = null;
if (dcc instanceof DataSourceConnectionContext) {
udc = new DataSourceConnection((DataSourceConnectionContext)udc);
}
else if (dcc instanceof JdbcConnectionContext) {
udc = new JdbcConnection((JdbcConnectionContext)udc);
}
else {
throw new CreateConnectionFailureException("Failed to create a database connection: " +
"input DatabaseConnectionContext instance is neither " +
"a DataSourceConnectionContext nor a JdbcConnectionContext type of instance.");
}
return udc;
}
/**
* Create a UserDatabaseConnection instance based on supplied
* connection properties.
*
* @return UserDatabaseConnection
* @param prop Connection properties
*/
/*public UserDatabaseConnection createUserDatabaseConnection(Properties supplied) {
if (supplied == null || supplied.size() == 0) return null;
UserDatabaseConnection udc = null;
String connectionName = supplied.getProperty(DatabaseConnectionContext.CONNECTION_NAME);
if (connectionName == null) {
//check if there is any default connection name specified in property file
connectionName = DatabaseConfig.getInstance().getDefaultDatabaseConnectionName();
if (connectionName == null || connectionName.equals(""))
throw new CreateConnectionFailureException("Failed to create a database connection: connection name " +
"in the properties is null.");
}
Properties predefined = DatabaseConfig.getInstance().getPredefinedDatabaseConnectionProperties(connectionName);
// update the predefined properties with the latest supplied.
return buildUserDatabaseConnection(updateProperties(predefined, supplied));
}*/
/**
* Build a UserDatabaseConnection instance based on all available
* properties.
*
* The properties is a mix of predefined properties with supplied.
*
* @return UserDatabaseConnection
* @param prop Connection properties
*/
private UserDatabaseConnection buildUserDatabaseConnection(String connectionName, Properties prop) {
if (prop == null || prop.size() == 0)
throw new CreateConnectionFailureException("Failed to create a database connection: connection properties is null.");
UserDatabaseConnection udc = null;
//now find if it is dataSouce type
if (isDataSourceConnectionContext(prop)) {
udc = new DataSourceConnection(connectionName, new DataSourceConnectionContext(prop));
}
else {
udc = new JdbcConnection(connectionName, new JdbcConnectionContext(prop));
}
return udc;
}
private boolean isDataSourceConnectionContext(Properties prop) {
boolean isDataSource = false;
String dataSourceName = prop.getProperty(DatabaseConnectionContext.KEY_DATASOURCENAME);
String url = prop.getProperty(DatabaseConnectionContext.KEY_URL);
if (dataSourceName != null && !dataSourceName.equals("")) {
if (url != null && !url.equals(""))
throw new CreateConnectionFailureException("Failed to detect whether " +
"the connection properties is for Jdbc connection or for datasource connection: url=" + url +
" datasource=" + dataSourceName);
isDataSource = true;
}
else {
if (url == null || url.equals(""))
throw new CreateConnectionFailureException("Failed to detect whether " +
"the connection properties is for Jdbc connection or for datasource connection: " +
"both url and dataSourceName are either null or empty.");
}
return isDataSource;
}
}