package com.philemonworks.critter;
import java.util.Properties;
import javax.sql.DataSource;
import com.philemonworks.critter.proto.Definitions;
import com.philemonworks.critter.proto.DefinitionsPerRule;
import org.apache.commons.dbcp.BasicDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.google.inject.AbstractModule;
import com.google.inject.name.Names;
import com.philemonworks.critter.dao.RecordingDao;
import com.philemonworks.critter.dao.RecordingDaoMemoryImpl;
import com.philemonworks.critter.dao.RuleDao;
import com.philemonworks.critter.dao.RuleDaoMemoryImpl;
import com.philemonworks.critter.dao.mongo.MongoModule;
import com.philemonworks.critter.dao.mongo.RecordingDaoMongoImpl;
import com.philemonworks.critter.dao.mongo.RuleDaoMongoImpl;
import com.philemonworks.critter.dao.sql.RuleDaoSqlImpl;
import com.philemonworks.critter.db.DbCreator;
/**
* Represents the Critter manager module.
*
* @author jcraane
*/
final class ManagerModule extends AbstractModule {
private static final Logger LOG = LoggerFactory.getLogger(ManagerModule.class);
private final Properties properties;
private final TrafficManager trafficManager;
private final DefinitionsPerRule definitionsPerRule;
ManagerModule(final Properties properties, final TrafficManager trafficManager) {
this.properties = properties;
this.trafficManager = trafficManager;
this.definitionsPerRule = new DefinitionsPerRule();
}
@Override
protected void configure() {
Names.bindProperties(binder(), properties);
RuleDao ruleDao;
RecordingDao recordingDao;
if (Boolean.parseBoolean(properties.getProperty("rule.database.h2.enabled"))) {
LOG.info("Using in H2 rules database");
ruleDao = new RuleDaoSqlImpl();
recordingDao = new RecordingDaoMemoryImpl(); //new RecordingDaoSqlImpl();
DbCreator.create(createAndBindDataSource());
} else if (properties.containsKey(MongoModule.HOST)) {
LOG.info("Using MongoDB rules database");
this.install(new MongoModule(properties));
ruleDao = new RuleDaoMongoImpl();
recordingDao = new RecordingDaoMongoImpl();
} else {
LOG.info("Using in memory rules database");
ruleDao = new RuleDaoMemoryImpl();
recordingDao = new RecordingDaoMemoryImpl();
}
this.bind(TrafficManager.class).toInstance(trafficManager);
this.bind(RuleDao.class).toInstance(ruleDao);
this.bind(RecordingDao.class).toInstance(recordingDao);
this.bind(DefinitionsPerRule.class).toInstance(this.definitionsPerRule);
}
private DataSource createAndBindDataSource() {
final BasicDataSource dataSource = new BasicDataSource();
dataSource.setUrl("jdbc:h2:critter");
this.bind(DataSource.class).toInstance(dataSource);
return dataSource;
}
}