/*
* 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.util;
import java.util.HashMap;
import java.util.Map;
import com.scooterframework.common.util.CurrentThreadCache;
import com.scooterframework.orm.sqldataexpress.config.DatabaseConfig;
import com.scooterframework.orm.sqldataexpress.object.Function;
import com.scooterframework.orm.sqldataexpress.object.JdbcStatement;
import com.scooterframework.orm.sqldataexpress.object.PrimaryKey;
import com.scooterframework.orm.sqldataexpress.object.StoredProcedure;
import com.scooterframework.orm.sqldataexpress.object.TableInfo;
import com.scooterframework.orm.sqldataexpress.processor.JdbcStatementProcessor;
import com.scooterframework.orm.sqldataexpress.vendor.DBAdapter;
/**
* DBStore class serves as an in-memory cache for some frequently used objects.
*
* @author (Fei) John Chen
*/
public class DBStore {
private static final DBStore me = new DBStore();
private DBStore() {}
public static DBStore getInstance() {
return me;
}
public Map<String, StoredProcedure> getStoredProcedures() {
return storedProcedures;
}
public StoredProcedure getStoredProcedure(String name) {
if (name == null) return null;
StoredProcedure spoc = null;
String spocKey = getSpocKey(name);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
spoc = (StoredProcedure)CurrentThreadCache.get(spocKey);
return spoc;
}
spoc = (StoredProcedure)storedProcedures.get(spocKey);
return spoc;
}
public void addStoredProcedure(String name, StoredProcedure spoc) {
if (name == null || spoc == null)
throw new IllegalArgumentException("addStoredProcedure: Neither name nor spoc can be null: " +
"name is " + name + "; " +
"spoc is " + spoc + ".");
String spocKey = getSpocKey(name);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(spocKey, spoc);
return;
}
storedProcedures.put(spocKey, spoc);
}
public Map<String, Function> getFunctions() {
return functions;
}
public Function getFunction(String name) {
if (name == null) return null;
String functionKey = getFunctionKey(name);
Function function = null;
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
function = (Function)CurrentThreadCache.get(functionKey);
return function;
}
function = (Function)functions.get(functionKey);
return function;
}
public void addFunction(String name, Function function) {
if (name == null || function == null)
throw new IllegalArgumentException("addFunction: Neither name nor function can be null: " +
"name is " + name + "; " +
"function is " + function + ".");
String functionKey = getFunctionKey(name);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(functionKey, function);
return;
}
functions.put(functionKey, function);
}
public Map<String, JdbcStatement> getJdbcStatements() {
return jdbcStatements;
}
public JdbcStatement getJdbcStatement(String name) {
if (name == null) return null;
String jdbcKey = getJdbcKey(name);
JdbcStatement stmt = null;
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
stmt = (JdbcStatement)CurrentThreadCache.get(jdbcKey);
return stmt;
}
stmt = (JdbcStatement)jdbcStatements.get(jdbcKey);
return stmt;
}
public void addJdbcStatement(String name, JdbcStatement jdbcStmt) {
if (name == null || jdbcStmt == null)
throw new IllegalArgumentException("addJdbcStatement: Neither name nor jdbcStmt can be null: " +
"name is " + name + "; " +
"jdbcStmt is " + jdbcStmt + ".");
String jdbcKey = getJdbcKey(name);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(jdbcKey, jdbcStmt);
return;
}
jdbcStatements.put(jdbcKey, jdbcStmt);
}
public Map<String, JdbcStatementProcessor> getJdbcStatementProcessors() {
return jdbcStatementProcessors;
}
public JdbcStatementProcessor getJdbcStatementProcessor(String name) {
if (name == null) return null;
String jdbcKey = getJdbcKey(name);
JdbcStatementProcessor stmt = null;
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
stmt = (JdbcStatementProcessor)CurrentThreadCache.get(jdbcKey);
return stmt;
}
stmt = (JdbcStatementProcessor)jdbcStatementProcessors.get(jdbcKey);
return stmt;
}
public void addJdbcStatementProcessor(String name, JdbcStatementProcessor jdbcProcessor) {
if (name == null || jdbcProcessor == null)
throw new IllegalArgumentException("addJdbcStatementProcessor: Neither name nor jdbcProcessor can be null: " +
"name is " + name + "; " +
"jdbcProcessor is " + jdbcProcessor + ".");
String jdbcKey = getJdbcKey(name);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(jdbcKey, jdbcProcessor);
return;
}
jdbcStatementProcessors.put(jdbcKey, jdbcProcessor);
}
public Map<String, TableInfo> getTableInfos() {
return tables;
}
/**
* Retrieves a stored <tt>TableInfo</tt> instance.
*
* @param connName database connection name
* @param catalog catalog name
* @param schema schema name
* @param tableName table name
* @return instance of <tt>TableInfo</tt>
*/
public TableInfo getTableInfo(String connName, String catalog, String schema, String tableName) {
if (connName == null) {
throw new IllegalArgumentException("getTableInfo: connName cannot be null");
}
if (tableName == null) return null;
String fullTableName = getFullTableName(connName, catalog, schema, tableName);
String tableKey = getTableKey(connName, fullTableName);
TableInfo ti = null;
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
ti = (TableInfo)CurrentThreadCache.get(tableKey);
return ti;
}
ti = (TableInfo) tables.get(tableKey);
return ti;
}
/**
* Adds an instance of <tt>TableInfo</tt>
*
* @param connName database connection name
* @param catalog catalog name
* @param schema schema name
* @param tableName table name
* @param ti instance of <tt>TableInfo</tt>
*/
public void addTableInfo(String connName, String catalog, String schema, String tableName, TableInfo ti) {
if (connName == null) {
throw new IllegalArgumentException("addTableInfo: connName cannot be null");
}
if (tableName == null || ti == null) {
throw new IllegalArgumentException("addTableInfo: Neither TableName nor TableInfo can be null: " +
"tableName is '" + tableName + "'; " +
"tableInfo is '" + ti + "'.");
}
String fullTableName = getFullTableName(connName, catalog, schema, tableName);
String tableKey = getTableKey(connName, fullTableName);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(tableKey, ti);
return;
}
tables.put(tableKey, ti);
}
/**
* Retrieves a stored <tt>TableInfo</tt> instance.
*
* @param connName database connection name
* @param tableName table name
* @return instance of <tt>TableInfo</tt>
*/
public TableInfo getTableInfo(String connName, String tableName) {
if (connName == null) {
throw new IllegalArgumentException("getTableInfo: connName cannot be null");
}
if (tableName == null) return null;
String tableKey = getTableKey(connName, tableName);
TableInfo ti = null;
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
ti = (TableInfo)CurrentThreadCache.get(tableKey);
return ti;
}
ti = (TableInfo) tables.get(tableKey);
return ti;
}
/**
* Adds an instance of <tt>TableInfo</tt>
*
* @param connName database connection name
* @param tableName table name
* @param ti instance of <tt>TableInfo</tt>
*/
public void addTableInfo(String connName, String tableName, TableInfo ti) {
if (connName == null) {
throw new IllegalArgumentException("addTableInfo: connName cannot be null");
}
if (tableName == null || ti == null) {
throw new IllegalArgumentException("addTableInfo: Neither TableName nor TableInfo can be null: " +
"tableName is '" + tableName + "'; " +
"tableInfo is '" + ti + "'.");
}
String tableKey = getTableKey(connName, tableName);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(tableKey, ti);
return;
}
tables.put(tableKey, ti);
}
/**
* Retrieves a stored <tt>PrimaryKey</tt> instance.
*
* @param connName database connection name
* @param catalog catalog name
* @param schema schema name
* @param tableName table name
* @return instance of <tt>PrimaryKey</tt>
*/
public PrimaryKey getPrimaryKey(String connName, String catalog, String schema, String tableName) {
if (connName == null) {
throw new IllegalArgumentException("getPrimaryKey: connName cannot be null");
}
if (tableName == null) return null;
String fullTableName = getFullTableName(connName, catalog, schema, tableName);
String pkKey = getPKKey(connName, fullTableName);
PrimaryKey pk = null;
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
pk = (PrimaryKey)CurrentThreadCache.get(pkKey);
return pk;
}
pk = (PrimaryKey) pkMap.get(pkKey);
return pk;
}
/**
* Adds an instance of <tt>PrimaryKey</tt>
*
* @param connName database connection name
* @param catalog catalog name
* @param schema schema name
* @param tableName table name
* @param pk instance of <tt>PrimaryKey</tt>
*/
public void addPrimaryKey(String connName, String catalog, String schema, String tableName, PrimaryKey pk) {
if (connName == null) {
throw new IllegalArgumentException("addPrimaryKey: connName cannot be null");
}
if (tableName == null || pk == null) {
throw new IllegalArgumentException("addPrimaryKey: Neither TableName nor PrimaryKey can be null: " +
"tableName is '" + tableName + "'; " +
"pk is '" + pk + "'.");
}
String fullTableName = getFullTableName(connName, catalog, schema, tableName);
String pkKey = getPKKey(connName, fullTableName);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(pkKey, pk);
return;
}
pkMap.put(pkKey, pk);
}
/**
* Retrieves a stored <tt>PrimaryKey</tt> instance.
*
* @param connName database connection name
* @param tableName table name
* @return instance of <tt>PrimaryKey</tt>
*/
public PrimaryKey getPrimaryKey(String connName, String tableName) {
if (connName == null) {
throw new IllegalArgumentException("getPrimaryKey: connName cannot be null");
}
if (tableName == null) return null;
String pkKey = getPKKey(connName, tableName);
PrimaryKey pk = null;
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
pk = (PrimaryKey)CurrentThreadCache.get(pkKey);
return pk;
}
pk = (PrimaryKey) pkMap.get(pkKey);
return pk;
}
/**
* Adds an instance of <tt>PrimaryKey</tt>
*
* @param connName database connection name
* @param tableName table name
* @param pk instance of <tt>PrimaryKey</tt>
*/
public void addPrimaryKey(String connName, String tableName, PrimaryKey pk) {
if (connName == null) {
throw new IllegalArgumentException("addPrimaryKey: connName cannot be null");
}
if (tableName == null || pk == null) {
throw new IllegalArgumentException("addPrimaryKey: Neither TableName nor PrimaryKey can be null: " +
"tableName is '" + tableName + "'; " +
"pk is '" + pk + "'.");
}
String pkKey = getPKKey(connName, tableName);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(pkKey, pk);
return;
}
pkMap.put(pkKey, pk);
}
public Map<String, DBAdapter> getAdapters() {
return adapterMap;
}
public DBAdapter getDBAdapter(String connName) {
if (connName == null) return null;
String dbaKey = getDbaKeyForCurrentThreadCache(connName);
DBAdapter dba = null;
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
dba = (DBAdapter)CurrentThreadCache.get(dbaKey);
return dba;
}
return adapterMap.get(dbaKey);
}
public void addDBAdapter(String connName, DBAdapter dba) {
if (connName == null || dba == null)
throw new IllegalArgumentException("addDBAdapter: Neither connName nor dba can be null: " +
"connName is " + connName + "; " +
"dba is " + dba + ".");
String dbaKey = getDbaKeyForCurrentThreadCache(connName);
if (DatabaseConfig.getInstance().isInDevelopmentEnvironment()) {
CurrentThreadCache.set(dbaKey, dba);
return;
}
adapterMap.put(dbaKey, dba);
}
private String getFullTableName(String connName, String catalog, String schema, String tableName) {
StringBuilder sb = new StringBuilder();
if (catalog != null) sb.append(catalog).append(".");
if (schema != null) sb.append(schema).append(".");
sb.append(tableName);
return sb.toString();
}
private String getSpocKey(String name) {
return "spoc:" + name;
}
private String getFunctionKey(String name) {
return "function:" + name;
}
private String getJdbcKey(String name) {
return "jdbc:" + name;
}
private String getTableKey(String connName, String fullTableName) {
return "table:" + fullTableName.toUpperCase() + "@" + connName;
}
private String getPKKey(String connName, String fullTableName) {
return "pk:" + fullTableName.toUpperCase() + "@" + connName;
}
private String getDbaKeyForCurrentThreadCache(String connName) {
return "dba:" + connName;
}
private Map<String, StoredProcedure> storedProcedures = new HashMap<String, StoredProcedure>();
private Map<String, Function> functions = new HashMap<String, Function>();
private Map<String, JdbcStatement> jdbcStatements = new HashMap<String, JdbcStatement>();
private Map<String, JdbcStatementProcessor> jdbcStatementProcessors = new HashMap<String, JdbcStatementProcessor>();
private Map<String, TableInfo> tables = new HashMap<String, TableInfo>();
private Map<String, PrimaryKey> pkMap = new HashMap<String, PrimaryKey>();
private Map<String, DBAdapter> adapterMap = new HashMap<String, DBAdapter>();
}