/*******************************************************************************
* ALMA - Atacama Large Millimeter Array
* Copyright (c) COSYLAB - Control System Laboratory, 2011
* (in the framework of the ALMA collaboration).
* All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*******************************************************************************/
/**
*
*/
package com.cosylab.cdb.jdal.hibernate.plugin;
import java.util.ArrayList;
import java.util.Map;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.hibernate.Session;
import alma.acs.tmcdb.Component;
import alma.acs.tmcdb.Configuration;
import com.cosylab.cdb.client.CDBAccess;
import com.cosylab.cdb.jdal.hibernate.DBUtil;
/**
* @author msekoranja
*/
public class PluginFactory {
public static final String WDAL_PLUGIN_KEY = "cdb_rdb.plugins.wdal";
public static final String CONFIGURATION_WDAL_PLUGIN_KEY = "cdb_rdb.plugins.configuration";
public static HibernateWDALPlugin getPlugin(Logger logger) {
DelegateHibernateWDALPlugin delegate = new DelegateHibernateWDALPlugin(logger);
delegate.initialize(logger);
return delegate;
}
private static class DelegateHibernateWDALPlugin implements HibernateWDALPlugin
{
private ArrayList<HibernateWDALPlugin> plugins = new ArrayList<HibernateWDALPlugin>();
private Logger logger;
public DelegateHibernateWDALPlugin(Logger logger)
{
plugins.add(new EssentialHibernateWDALPlugin());
String classNames = System.getProperty(WDAL_PLUGIN_KEY);
if (classNames == null)
{
logger.config("No plugins registered.");
return;
}
StringTokenizer tokenizer = new StringTokenizer(classNames, ",");
while (tokenizer.hasMoreTokens())
{
String className = tokenizer.nextToken();
try {
HibernateWDALPlugin plugin = (HibernateWDALPlugin)Class.forName(className).getConstructor((Class[])null).newInstance((Object[])null);
plugins.add(plugin);
logger.config("Plugin '" + plugin.getName() + "' registered.");
} catch (Throwable th) {
logger.log(Level.CONFIG, "Plugin with class-name '" + className + "' failed to register.", th);
}
}
}
/**
* Get plugin name.
* @return the plugin name.
*/
public String getName()
{
return "Delegation plugin";
}
/**
* @param logger
*/
public void initialize(Logger logger)
{
this.logger = logger;
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling initialize() on " + plugin.getName());
plugin.initialize(logger);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call initialize() on " + plugin.getName() + " failed.", th);
}
}
}
// load
public void loadPrologue(Session session, Configuration config, Map<String, Object> rootMap)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling loadPrologue() on " + plugin.getName());
plugin.loadPrologue(session, config, rootMap);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call loadPrologue() on " + plugin.getName() + " failed.", th);
}
}
}
public void loadControlDevices(Session session, Configuration config, ControlDeviceBindCallback bindCallback)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling loadControlDevices() on " + plugin.getName());
plugin.loadControlDevices(session, config, bindCallback);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call loadControlDevices() on " + plugin.getName() + " failed.", th);
}
}
}
public void loadEpilogue(Session session, Configuration config, Map<String, Object> rootMap)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling loadEpilogue() on " + plugin.getName());
plugin.loadEpilogue(session, config, rootMap);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call loadEpilogue() on " + plugin.getName() + " failed.", th);
}
}
}
// update
public void updatePrologue(Session session, Configuration config, Map<String, Object> rootMap, String curl)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling updatePrologue() on " + plugin.getName());
plugin.updatePrologue(session, config, rootMap, curl);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call updatePrologue() on " + plugin.getName() + " failed.", th);
}
}
}
public void updateControlDevices(Session session, Configuration config, ControlDeviceBindCallback bindCallback, String curl)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling updateControlDevices() on " + plugin.getName());
plugin.updateControlDevices(session, config, bindCallback, curl);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call updateControlDevices() on " + plugin.getName() + " failed.", th);
}
}
}
public void updateEpilogue(Session session, Configuration config, Map<String, Object> rootMap, String curl)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling updateEpilogue() on " + plugin.getName());
plugin.updateEpilogue(session, config, rootMap, curl);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call updateEpilogue() on " + plugin.getName() + " failed.", th);
}
}
}
// import
public void importPrologue(Session session, Configuration config, CDBAccess cdbAccess)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling importPrologue() on " + plugin.getName());
plugin.importPrologue(session, config, cdbAccess);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call importPrologue() on " + plugin.getName() + " failed.", th);
}
}
}
public void controlDeviceImportEpilogue(Session session, Configuration config, CDBAccess cdbAccess, String cdbComponentName, Component component)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling controlDeviceImportEpilogue() on " + plugin.getName());
plugin.controlDeviceImportEpilogue(session, config, cdbAccess, cdbComponentName, component);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call controlDeviceImportEpilogue() on " + plugin.getName() + " failed.", th);
}
}
}
public void importEpilogue(Session session, Configuration config, CDBAccess cdbAccess)
{
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling importEpilogue() on " + plugin.getName());
plugin.importEpilogue(session, config, cdbAccess);
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call importEpilogue() on " + plugin.getName() + " failed.", th);
}
}
}
public String[] getCreateTablesScriptList(String backend) {
ArrayList<String> scripts = new ArrayList<String>();
for (HibernateWDALPlugin plugin : plugins) {
try {
logger.finer("Calling getCreateTablesScriptList() on " + plugin.getName());
String[] list = plugin.getCreateTablesScriptList(backend);
if (list != null)
{
for (String item : list)
if (!scripts.contains(item))
scripts.add(item);
}
}
catch (Throwable th) {
logger.log(Level.SEVERE, "Call getCreateTablesScriptList() on " + plugin.getName() + " failed.", th);
}
}
return scripts.toArray(new String[scripts.size()]);
}
}
private static class EssentialHibernateWDALPlugin implements HibernateWDALPlugin
{
public String getName()
{
return "EssentialHibernateWDALPlugin";
}
public void initialize(Logger logger) {}
public void loadPrologue(Session session, Configuration config, Map<String, Object> rootMap) {}
public void loadControlDevices(Session session, Configuration config, ControlDeviceBindCallback bindCallback) {}
public void loadEpilogue(Session session, Configuration config, Map<String, Object> rootMap) {}
public void updatePrologue(Session session, Configuration config, Map<String, Object> rootMap, String curl) {}
public void updateControlDevices(Session session, Configuration config, ControlDeviceBindCallback bindCallback, String curl) {}
public void updateEpilogue(Session session, Configuration config, Map<String, Object> rootMap, String curl) {}
public void importPrologue(Session session, Configuration config, CDBAccess cdbAccess) {}
public void controlDeviceImportEpilogue(Session session, Configuration config, CDBAccess cdbAccess, String cdbComponentName, Component component) {}
public void importEpilogue(Session session, Configuration config, CDBAccess cdbAccess) {}
public String[] getCreateTablesScriptList(String backend) {
String ddlDir = System.getProperty("ACS.ddlpath");
if (ddlDir == null)
ddlDir = ".";
if (backend.equals(DBUtil.ORACLE_BACKEND_NAME)) {
return new String[] {
ddlDir + "/oracle/TMCDB_swconfigcore/CreateOracleTables.sql",
ddlDir + "/oracle/TMCDB_swconfigext/CreateOracleTables.sql"
};
}
else if (backend.equals(DBUtil.HSQLDB_BACKEND_NAME)) {
return new String[] {
ddlDir + "/hsqldb/TMCDB_swconfigcore/CreateHsqldbTables.sql",
ddlDir + "/hsqldb/TMCDB_swconfigext/CreateHsqldbTables.sql"
};
}
else if (backend.equals(DBUtil.MYSQL_BACKEND_NAME)) {
return new String[] {
ddlDir + "/mysql/TMCDB_swconfigcore/CreateMysqlTables.sql",
ddlDir + "/mysql/TMCDB_swconfigext/CreateMysqlTables.sql"
};
}
else
return null;
}
}
public static String BACKEND_KEY_NAME = "cdb_rdb.backend";
public static String URL_KEY_NAME = "cdb_rdb.url";
public static String USERNAME_KEY_NAME = "cdb_rdb.username";
public static String PASSWORD_KEY_NAME = "cdb_rdb.password";
private static class DefaultConfigurationPlugin implements HibernateWDALConfigurationPlugin
{
public String getName() {
return "Default configuration plugin";
}
public String get(String name, String defaultValue) {
return System.getProperty(name, defaultValue);
}
public String getBackend() {
return System.getProperty(BACKEND_KEY_NAME, "hsqldb");
}
public String getURL() {
return System.getProperty(URL_KEY_NAME, "jdbc:hsqldb:mem:tmcdb");
}
public String getUserName() {
return System.getProperty(USERNAME_KEY_NAME, "sa");
}
public String getPassword() {
return System.getProperty(PASSWORD_KEY_NAME, "");
}
public void initialize(Logger logger) {
}
}
private static HibernateWDALConfigurationPlugin configurationPlugin = null;
public static synchronized HibernateWDALConfigurationPlugin getConfigurationPlugin(Logger logger)
{
if (configurationPlugin == null)
{
String className = System.getProperty(CONFIGURATION_WDAL_PLUGIN_KEY);
if (className == null)
configurationPlugin = new DefaultConfigurationPlugin();
else
{
try {
configurationPlugin = (HibernateWDALConfigurationPlugin)Class.forName(className).getConstructor((Class[])null).newInstance((Object[])null);
configurationPlugin.initialize(logger);
} catch (Throwable th) {
logger.log(Level.WARNING, "Failed to instantiate configuration plugin '" + className + "', using default plugin."/*, th*/);
configurationPlugin = new DefaultConfigurationPlugin();
}
}
}
return configurationPlugin;
}
}