package org.cryptocoinpartners.schema;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.persistence.Cacheable;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.Transient;
import org.apache.commons.configuration.Configuration;
import org.apache.commons.configuration.MapConfiguration;
import org.cryptocoinpartners.module.Context;
import org.cryptocoinpartners.service.PortfolioService;
import org.cryptocoinpartners.service.Strategy;
import com.google.inject.Binder;
import com.google.inject.Module;
/**
* StrategyInstance represents an instance of a Strategy with a specific configuration and its own
* deposit Portfolio. When you attach a StrategyInstance to a Context, the StrategyInstance will create an instance
* of the class given by the moduleName and configure it using this StrategyInstance's configuration settings. The
* instantiated Strategy may also bind using @Inject to fields for its trading Portfolio
*
* @author Tim Olson
*/
@Entity
@Cacheable
public class StrategyInstance extends PortfolioManager implements Context.AttachListener {
public StrategyInstance(String moduleName) {
// super(moduleName + " portfolio");
this.moduleName = moduleName;
}
public StrategyInstance(String moduleName, Map<String, String> config) {
super(moduleName + " Portfolio");
this.moduleName = moduleName;
this.config = config;
}
public StrategyInstance(String moduleName, Configuration configuration) {
super(moduleName + " Portfolio");
this.moduleName = moduleName;
this.config = new HashMap<>();
Iterator keys = configuration.getKeys();
while (keys.hasNext()) {
String key = (String) keys.next();
String value = configuration.getString(key);
this.config.put(key, value);
}
}
public String getModuleName() {
return moduleName;
}
@Transient
public Strategy getStrategy() {
return (Strategy) strategy;
}
@ElementCollection
public Map<String, String> getConfig() {
return config;
}
@Override
public void afterAttach(final Context context) {
// attach the actual Strategy instead of this StrategyInstance
// Set ourselves as the StrategyInstance
// context.loadStatements("BasicPortfolioService");
// portfolio = null;
strategy = context.attach(moduleName, new MapConfiguration(config), new Module()
{
@Override
public void configure(Binder binder) {
// binder.install(new FactoryModuleBuilder().build(GeneralOrderFactory.class));
// binder.install(new FactoryModuleBuilder().build(SpecificOrderFactory.class));
// binder.bind(Dao.class).to(DaoJpa.class);
binder.bind(StrategyInstance.class).toInstance(StrategyInstance.this);
// binder.bind(Dao.class).to(DaoJpa.class);
// portfolio = context.getInjector().getInstance(Portfolio.class);b
portfolio = Portfolio.findOrCreate(getModuleName(), context);
// boolean cahced = PersistUtil.cached(portfolio);
if (portfolio == null) {
// portfolio = portfolioFactory.create(getModuleName(), StrategyInstance.this);
portfolio = context.getInjector().getInstance(Portfolio.class);
portfolio.setName(getModuleName());
// EM.persist(portfolio);
portfolio.persit();
//EM.persist(portfolio);
// StrategyInstance.this.setPortfolio(portfolio);
// EM.persist(portfolio);
//EM.persist(portfolio);
// PersistUtil.insert(portfolio);
}
else {
context.getInjector().injectMembers(portfolio);
portfolio.merge();
binder.bind(Portfolio.class).toInstance(portfolio);
}
StrategyInstance.this.setPortfolio(portfolio);
// portfolio = context.getInjector().getInstance(Portfolio.class);
//portfolio.setName(getModuleName());
// portfolio.setManager(StrategyInstance.this);
// binder.bind(Portfolio.class).toInstance(portfolio);
portfolioService = context.getInjector().getInstance(PortfolioService.class);
portfolioService.addPortfolio(portfolio);
// portfolio.setName(getModuleName());
// portfolio.setManager(this);
// binder.bind(Portfolio.class).toInstance(context.getInjector().getInstance(Portfolio.class));
// binder.bind(PortfolioService.class).toInstance(context.getInjector().getInstance(PortfolioService.class));
// context.loadStatements("Portfolio");
// Need to rebuild state.
}
});
((Strategy) strategy).setPortfolio(portfolio);
}
// JPA
protected StrategyInstance() {
}
protected void setModuleName(String moduleName) {
this.moduleName = moduleName;
}
@Override
@Transient
public Portfolio getPortfolio() {
return portfolio;
}
protected void setConfig(Map<String, String> config) {
this.config = config;
}
private String moduleName;
// @Inject
//private Portfolio portfolio;
private Map<String, String> config;
private Object strategy;
}