package org.cryptocoinpartners.util;
import java.util.Properties;
import org.apache.commons.configuration.Configuration;
import org.cryptocoinpartners.module.PersistanceModule;
import com.google.inject.Binder;
import com.google.inject.Guice;
import com.google.inject.Module;
import com.google.inject.Provider;
import com.google.inject.persist.jpa.JpaPersistModule;
/**
* Guice doesn't allow binding overrides so we have to store the Configuration separately and
* add it in just before instance creation
*
* My first time using Guice... not a fan. Should have tried Pico.
*
* @author Tim Olson
*/
public class Injector {
public static Injector root() {
return root;
}
public Injector createChildInjector(java.lang.Iterable<? extends com.google.inject.Module> iterable) {
return new Injector(injector.createChildInjector(iterable), config);
}
public Injector createChildInjector(com.google.inject.Module... modules) {
return new Injector(injector.createChildInjector(modules), config);
}
public <T> T getInstance(Class<T> cls) {
T instance = ic().getInstance(cls);
return instance;
}
public void injectMembers(Object o) {
ic().injectMembers(o);
}
public Injector withConfig(Configuration config) {
setConfig(config);
return this;
}
private com.google.inject.Injector ic() {
if (injectorWithConfig == null) {
injectorWithConfig = injector.createChildInjector(new Module() {
@Override
public void configure(Binder binder) {
binder.bind(Injector.class).toProvider(new Provider<Injector>() {
@Override
public Injector get() {
return Injector.this;
}
});
binder.bind(Configuration.class).toProvider(new Provider<Configuration>() {
@Override
public Configuration get() {
return config;
}
});
}
});
}
return injectorWithConfig;
}
public Configuration getConfig() {
return config;
}
public void setConfig(Configuration config) {
this.config = config;
injectorWithConfig = null;
}
private Injector(com.google.inject.Injector injector, Configuration config) {
this.injector = injector;
this.config = config;
}
private Configuration config;
private final com.google.inject.Injector injector;
private com.google.inject.Injector injectorWithConfig;
private static Injector root;
static {
// int retryCount = ConfigUtil.combined().getInt("db.persist.retry");
Properties properties = new Properties();
//Map<String, String> properties = new HashMap<String, String>();
//daretryCount = ConfigUtil.combined().getInt("db.persist.retry");
properties.put("hibernate.hbm2ddl.auto", "update");
properties.put("hibernate.connection.driver_class", ConfigUtil.combined().getString("db.driver"));
properties.put("hibernate.dialect", ConfigUtil.combined().getString("db.dialect"));
properties.put("hibernate.connection.url", ConfigUtil.combined().getString("db.url"));
properties.put("hibernate.connection.username", ConfigUtil.combined().getString("db.username"));
properties.put("hibernate.connection.password", ConfigUtil.combined().getString("db.password"));
properties.put("hibernate.ejb.naming_strategy", "org.hibernate.cfg.ImprovedNamingStrategy");
properties.put("hibernate.connection.autocommit", "true");
properties.put("org.hibernate.flushMode", "AUTO");
properties.put("hibernate.connection.release_mode", "auto");
properties.put("hibernate.connection.provider_class", "org.hibernate.connection.C3P0ConnectionProvider");
properties.put("hibernate.cache.region.factory_class", "org.hibernate.cache.ehcache.EhCacheRegionFactory");
// "org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory");
properties.put("hibernate.cache.use_second_level_cache", "true");
properties.put("hibernate.cache.use_query_cache", "true");
properties.put("hibernate.cache.use_structured_entries ", "true");
properties.put("net.sf.ehcache.configurationResourceName", "META-INF/ehcache.xml");
properties.put("hibernate.c3p0.min_size", "10");
properties.put("hibernate.c3p0.max_size", ConfigUtil.combined().getString("db.pool.size"));
properties.put("hibernate.c3p0.acquire_increment", ConfigUtil.combined().getString("db.pool.growth"));
properties.put("hibernate.showSql", "true");
properties.put("hibernate.format_sql", "true");
properties.put("hibernate.use_sql_comments", "true");
// properties.put("hibernate.c3p0.debugUnreturnedConnectionStackTraces", "true");
//properties.put("hibernate.c3p0.unreturnedConnectionTimeout", "4000");
// properties.put("hibernate.c3p0.idle_test_period", "300");
// properties.put("hibernate.c3p0.max_statements", "0");
// properties.put("hibernate.c3p0.maxIdleTimeExcessConnections", "2");
// properties.put("hibernate.c3p0.timeout", "300");
properties.put("hibernate.c3p0.maxIdleTime", "21600");
//properties.put("hibernate.c3p0.checkoutTimeout", "500");
properties.put("hibernate.c3p0.preferredTestQuery", "SELECT 1 from exchange");
// properties.put("hibernate.c3p0.maxConnectionAge", ConfigUtil.combined().getString("db.max.connection.age"));
final String testConnection = ConfigUtil.combined().getString("db.test.connection", "false");
properties.put("hibernate.c3p0.testConnectionOnCheckout", testConnection);
// properties.put("hibernate.c3p0.testConnectionOnCheckin", testConnection);
properties.put("hibernate.c3p0.acquireRetryDelay", ConfigUtil.combined().getString("db.acquire_retry_delay", "1000"));
properties.put("hibernate.c3p0.acquireRetryAttempts", ConfigUtil.combined().getString("db.acquire_retry_attempts", "30"));
properties.put("hibernate.c3p0.breakAfterAcquireFailure", ConfigUtil.combined().getString("db.break_after_acquire_failure", "false"));
properties.put("hibernate.c3p0.checkoutTimeout", ConfigUtil.combined().getString("db.checkout_timeout", "5000"));
properties.put("hibernate.c3p0.idleConnectionTestPeriod", ConfigUtil.combined().getString("db.idle_connection_test_period", "10800"));
properties.put("hibernate.c3p0.numHelperThreads", ConfigUtil.combined().getString("db.num_helper_threads", "10"));
properties.put("hibernate.c3p0.debugUnreturnedConnectionStackTraces",
ConfigUtil.combined().getString("db.debug_unreturned_connection_stack_traces", "false"));
// properties.put("hibernate.c3p0.max_statements", "0");", "false"));. debug_unreturned_connection_stack_traces
// properties.put("hibernate.c3p0.max_statements", "0");
// properties.put("hibernate.c3p0.maxStatementsPerConnection", "100");
// properties.put("hibernate.c3p0.validate", "true");
// properties.put("hibernate.c3p0.idleConnectionTestPeriod", "100");
properties.put("javax.persistence.sharedCache.mode", "ENABLE_SELECTIVE");
properties.put("javax.persistence.query.timeout", ConfigUtil.combined().getString("db.query_timeout", "5000"));
// properties.put("javax.persistence.LockModeType", "OPTIMISTIC");
// root = new Injector(Guice.createInjector(new LogInjector(), new PersistanceModule()), ConfigUtil.combined());
// new JpaPersistModule("org.cryptocoinpartners.schema")
root = new Injector(Guice.createInjector(new LogInjector(), new JpaPersistModule("org.cryptocoinpartners.schema").properties(properties),
new PersistanceModule()), ConfigUtil.combined());
}
}