package org.marketcetera.photon.internal.marketdata;
import static org.ops4j.peaberry.Peaberry.osgiModule;
import static org.ops4j.peaberry.Peaberry.service;
import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.marketcetera.core.instruments.UnderlyingSymbolSupport;
import org.marketcetera.module.ModuleManager;
import org.marketcetera.photon.marketdata.IMarketDataManager;
import org.marketcetera.photon.marketdata.MarketDataConstants;
import org.marketcetera.photon.module.ModuleSupport;
import org.marketcetera.util.misc.ClassVersion;
import org.osgi.framework.BundleContext;
import com.google.inject.AbstractModule;
import com.google.inject.Guice;
import com.google.inject.Module;
/* $License$ */
/**
* This class controls the plug-in life cycle and manages singleton state.
*
* @author <a href="mailto:will@marketcetera.com">Will Horn</a>
* @version $Id: Activator.java 16862 2014-03-19 12:28:49Z colin $
* @since 1.0.0
*/
@ClassVersion("$Id: Activator.java 16862 2014-03-19 12:28:49Z colin $")
public class Activator extends Plugin {
/**
* The singleton instance.
*/
private static Activator sInstance;
private static final String USE_FINE_GRAINED_MARKET_DATA_FOR_OPTIONS_KEY = "USE_FINE_GRAINED_MARKET_DATA_FOR_OPTIONS"; //$NON-NLS-1$
/**
* The {@link Executor} used by data flow managers to perform market data
* related operations serially in a background thread.
*/
private ExecutorService mMarketDataExecutor;
/**
* The {@link MarketDataManager} singleton for this plug-in instance.
*/
private MarketDataManager mMarketDataManager;
@Override
public final void start(final BundleContext context) throws Exception {
synchronized (getClass()) {
super.start(context);
final boolean useFineGrainedMarketDataForOptions = new InstanceScope().getNode(MarketDataConstants.PLUGIN_ID).getBoolean(USE_FINE_GRAINED_MARKET_DATA_FOR_OPTIONS_KEY,
false);
mMarketDataExecutor = Executors.newSingleThreadExecutor();
final Module module = new AbstractModule() {
@Override
protected void configure() {
bind(ModuleManager.class).toInstance(
ModuleSupport.getModuleManager());
bind(IMarketDataRequestSupport.class).toInstance(
new MarketDataRequestSupport(
useFineGrainedMarketDataForOptions));
bind(UnderlyingSymbolSupport.class).toProvider(
service(UnderlyingSymbolSupport.class).single()
.direct());
}
};
mMarketDataManager = Guice.createInjector(osgiModule(context),
module).getInstance(MarketDataManager.class);
// service is unregistered during stop
context.registerService(IMarketDataManager.class.getName(),
mMarketDataManager,
null);
sInstance = this;
}
}
@Override
public final void stop(final BundleContext context) throws Exception {
synchronized (getClass()) {
sInstance = null;
mMarketDataManager = null;
if (mMarketDataExecutor != null) {
mMarketDataExecutor.shutdownNow();
mMarketDataExecutor = null;
}
super.stop(context);
}
}
/**
* Returns the market data manager for the singleton plug-in.
*
* @return the market data manager, or null if the plug-in is not active
*/
public static MarketDataManager getMarketDataManager() {
synchronized (Activator.class) {
return sInstance == null ? null : sInstance.mMarketDataManager;
}
}
}