/**
* Copyright (C) 2014 - present by OpenGamma Inc. and the OpenGamma group of companies
*
* Please see distribution for license.
*/
package com.opengamma.solutions.library.engine;
import java.util.concurrent.ExecutorService;
import com.google.common.collect.ImmutableSet;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.inject.AbstractModule;
import com.google.inject.Provides;
import com.google.inject.Singleton;
import com.opengamma.core.link.ConfigLink;
import com.opengamma.core.marketdatasnapshot.MarketDataSnapshotSource;
import com.opengamma.core.security.Security;
import com.opengamma.financial.currency.CurrencyMatrix;
import com.opengamma.sesame.bondfuture.BondFutureFn;
import com.opengamma.sesame.bondfuture.BondFutureFn;
import com.opengamma.sesame.bondfutureoption.BondFutureOptionFn;
import com.opengamma.sesame.credit.measures.CreditCs01Fn;
import com.opengamma.sesame.credit.measures.CreditPvFn;
import com.opengamma.sesame.engine.ComponentMap;
import com.opengamma.sesame.engine.DefaultEngine;
import com.opengamma.sesame.engine.Engine;
import com.opengamma.sesame.engine.ViewFactory;
import com.opengamma.sesame.fra.FRAFn;
import com.opengamma.sesame.equityindexoptions.EquityIndexOptionFn;
import com.opengamma.sesame.function.AvailableOutputs;
import com.opengamma.sesame.function.AvailableOutputsImpl;
import com.opengamma.sesame.irfuture.InterestRateFutureFn;
import com.opengamma.sesame.irs.InterestRateSwapFn;
import com.opengamma.sesame.marketdata.SnapshotMarketDataFactory;
import com.opengamma.sesame.marketdata.builders.MarketDataBuilders;
import com.opengamma.sesame.marketdata.builders.MarketDataEnvironmentFactory;
import com.opengamma.sesame.trade.TradeWrapper;
/**
* Configures a {@link Engine} instance and associated objects.
*/
public class EngineModule extends AbstractModule {
@Override
protected void configure() {
// force componentMap and hence the threadLocal ServiceContext to be set now
// (Some modules assume ServiceContext is set without declaring a dependency)
bind(ComponentMap.class).toProvider(ComponentMapProvider.class).asEagerSingleton();
bind(ViewFactory.class).toProvider(ViewFactoryProvider.class);
}
/**
* Create the available outputs.
*
* @return the available outputs, not null
*/
@Provides
public AvailableOutputs createAvailableOutputs() {
AvailableOutputs available = new AvailableOutputsImpl(ImmutableSet.of(Security.class, TradeWrapper.class));
available.register(CreditCs01Fn.class);
available.register(CreditPvFn.class);
available.register(InterestRateSwapFn.class);
available.register(FRAFn.class);
available.register(InterestRateFutureFn.class);
available.register(EquityIndexOptionFn.class);
available.register(BondFutureOptionFn.class);
available.register(BondFutureFn.class);
return available;
}
/**
* Create the engine instance
*
* @param viewFactory the view factory
* @param marketData the MarketDataEnvironmentFactory
* @param service the executor service
* @return the engine
*/
@Provides
@Singleton
public Engine createEngine(ViewFactory viewFactory, MarketDataEnvironmentFactory marketData,
ExecutorService service) {
return new DefaultEngine(viewFactory, marketData, service);
}
/**
* Create the MarketDataEnvironmentFactory instance
*
* @param componentMap the ComponentMap
* @param snapshotSource the snapshot source
* @return the MarketDataEnvironmentFactory
*/
@Provides
@Singleton
public MarketDataEnvironmentFactory createEngine(ComponentMap componentMap, MarketDataSnapshotSource snapshotSource) {
String currencyMatrixName = "CurrencyMatrix";
ConfigLink<CurrencyMatrix> currencyMatrixLink = ConfigLink.resolvable(currencyMatrixName, CurrencyMatrix.class);
return new MarketDataEnvironmentFactory(
new SnapshotMarketDataFactory(snapshotSource),
MarketDataBuilders.raw(componentMap, "DEFAULT"),
MarketDataBuilders.multicurve(componentMap, currencyMatrixLink),
MarketDataBuilders.fxMatrix());
}
/**
* Create the ExecutorService instance,
* a single thread executor is used here to aid clarity in debugging the examples
*
* @return the ExecutorService
*/
@Provides
@Singleton
public ExecutorService createExecutorService() {
return MoreExecutors.sameThreadExecutor();
}
}