package org.kevoree.library.databaseChannel;
import net.sf.hajdbc.SimpleDatabaseClusterConfigurationFactory;
import net.sf.hajdbc.SynchronizationStrategy;
import net.sf.hajdbc.cache.DatabaseMetaDataCacheFactoryEnum;
import net.sf.hajdbc.dialect.DialectFactoryEnum;
import net.sf.hajdbc.distributed.jgroups.DefaultChannelProvider;
import net.sf.hajdbc.sql.DataSource;
import net.sf.hajdbc.sql.DataSourceDatabase;
import net.sf.hajdbc.sql.DataSourceDatabaseClusterConfiguration;
import net.sf.hajdbc.sql.SQLProxy;
import net.sf.hajdbc.state.simple.SimpleStateManagerFactory;
import net.sf.hajdbc.sync.FullSynchronizationStrategy;
import org.kevoree.annotation.*;
import org.kevoree.common.dbProxy.api.dbProxyService;
import org.kevoree.framework.AbstractComponentType;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.HashMap;
/**
* Created by jed
* User: jedartois@gmail.com
* Date: 09/05/12
* Time: 14:27
*/
@Library(name = "JavaSE")
@ComponentType
@DictionaryType({
@DictionaryAttribute(name = "login", defaultValue = "daum", optional = false),
@DictionaryAttribute(name = "password", defaultValue = "daum", optional = false)
})
@Provides({
@ProvidedPort(name = "configuration", type = PortType.MESSAGE) ,
@ProvidedPort(name = "dbProxyService", type = PortType.SERVICE, className = dbProxyService.class)
})
public class DatabaseCluster extends AbstractComponentType implements dbProxyService{
private Logger logger = LoggerFactory.getLogger(DatabaseCluster.class);
private javax.sql.DataSource ds=null;
private HashMap<String,DataSourceDatabase> dataSourceDatabases=null;
private SQLProxy<javax.sql.DataSource, DataSourceDatabase, javax.sql.DataSource, SQLException> proxy = null;
DataSource ds_cluster;
@Start
public void start() {
}
@Stop
public void stop()
{
}
@Port(name = "configuration")
public void confCluster(Object obj) {
if (obj instanceof HashMap)
{
try
{
String login = this.getDictionary().get("login").toString();
String password = this.getDictionary().get("password").toString();
dataSourceDatabases = (HashMap<String, DataSourceDatabase>) obj;
DataSourceDatabaseClusterConfiguration config = new DataSourceDatabaseClusterConfiguration();
config.setDatabases(dataSourceDatabases.values());
config.setDialectFactory(DialectFactoryEnum.DERBY);
config.setDatabaseMetaDataCacheFactory(DatabaseMetaDataCacheFactoryEnum.SHARED_EAGER);
DefaultChannelProvider channel = new DefaultChannelProvider();
config.setDispatcherFactory(channel);
HashMap<String,SynchronizationStrategy> t = new HashMap<String, SynchronizationStrategy>();
SynchronizationStrategy t2 = new FullSynchronizationStrategy();
t.put("full",t2);
config.setSynchronizationStrategyMap(t);
config.setDefaultSynchronizationStrategy("full");
SimpleStateManagerFactory state = new SimpleStateManagerFactory();
config.setStateManagerFactory(state);
ds_cluster = new DataSource();
ds_cluster.setCluster("kevoreeCluster");
ds_cluster.setConfigurationFactory(new SimpleDatabaseClusterConfigurationFactory<javax.sql.DataSource, DataSourceDatabase>(config));
} catch (Exception e)
{
logger.error("",e);
ds = null;
}
}
}
@Update
public void update() {
}
@Override
@Port(name = "dbProxyService", method = "getConnection")
public Connection getConnection() {
Connection connection =null;
logger.debug("getConnection Service");
try
{
String login = this.getDictionary().get("login").toString();
String password = this.getDictionary().get("password").toString();
proxy = (SQLProxy<javax.sql.DataSource, DataSourceDatabase, javax.sql.DataSource, SQLException>) Proxy.getInvocationHandler(ds_cluster.getProxy());
ds = proxy.getObject(dataSourceDatabases.get(getNodeName()));
if(ds != null)
{
connection = ds.getConnection(login,password);
}
logger.debug("getConnection isValid = "+connection.isValid(100));
} catch (Exception e)
{
logger.error("",e);
connection = null;
}
return connection;
}
}