package org.marketcetera.photon.internal.module; import static org.ops4j.peaberry.Peaberry.osgiModule; import static org.ops4j.peaberry.Peaberry.service; import org.eclipse.core.runtime.preferences.InstanceScope; import org.marketcetera.core.notifications.INotification; import org.marketcetera.core.notifications.INotificationManager; import org.marketcetera.core.notifications.NotificationManager; import org.marketcetera.module.ModuleException; import org.marketcetera.module.ModuleManager; import org.marketcetera.photon.module.IDataFlowLabelProvider; import org.marketcetera.photon.module.IModuleAttributeSupport; import org.marketcetera.photon.module.ISinkDataManager; import org.marketcetera.util.misc.ClassVersion; import org.osgi.framework.BundleActivator; import org.osgi.framework.BundleContext; import org.osgi.service.prefs.BackingStoreException; import com.google.inject.AbstractModule; import com.google.inject.Guice; import com.google.inject.Injector; import com.google.inject.Module; import com.google.inject.Provider; /* $License$ */ /** * Controls the plug-in life cycle. * * @author <a href="mailto:will@marketcetera.com">Will Horn</a> * @version $Id: Activator.java 16154 2012-07-14 16:34:05Z colin $ * @since 1.1.0 */ @ClassVersion("$Id: Activator.java 16154 2012-07-14 16:34:05Z colin $") public final class Activator implements BundleActivator { /** * The plug-in ID */ public static final String PLUGIN_ID = "org.marketcetera.photon.module"; //$NON-NLS-1$ /** * The shared instance */ private static Activator sInstance; /** * ModuleManager singleton */ private ModuleManager mModuleManager; /** * Configures module creation attribute defaults */ private IModuleAttributeSupport mModuleAttributeSupport; /** * Multiplexes sink data */ private SinkDataManager mSinkDataManager; /** * Labels source of data. */ private Provider<IDataFlowLabelProvider> mDataFlowLabelProvider; @Override public void start(BundleContext context) throws Exception { sInstance = this; mModuleManager = new ModuleManager(); mModuleAttributeSupport = new ModuleAttributeSupport( new PreferenceAttributeDefaults()); mModuleManager .setConfigurationProvider(new EclipseModuleConfigurationProvider( mModuleAttributeSupport)); mSinkDataManager = new SinkDataManager(); Module module = new AbstractModule() { @Override protected void configure() { bind(IDataFlowLabelProvider.class) .toProvider( service(IDataFlowLabelProvider.class).single() .direct()); bind(INotificationManager.class).toInstance( NotificationManager.getNotificationManager()); } }; Injector injector = Guice.createInjector(osgiModule(context), module); mDataFlowLabelProvider = injector .getProvider(IDataFlowLabelProvider.class); NotificationHandler handler = injector .getInstance(NotificationHandler.class); mSinkDataManager.register(handler, INotification.class); mModuleManager.addSinkListener(mSinkDataManager); mModuleManager.init(); } @Override public void stop(BundleContext context) throws Exception { sInstance = null; mModuleAttributeSupport = null; mSinkDataManager = null; try { mModuleManager.stop(); } catch (ModuleException e) { Messages.ACTIVATOR_FAILED_TO_STOP_MODULE_MANAGER.error(this, e); } mModuleManager = null; try { new InstanceScope().getNode(Activator.PLUGIN_ID).flush(); } catch (BackingStoreException e) { Messages.ACTIVATOR_FAILED_TO_SAVE_PREFERENCES.error(this, e); } mDataFlowLabelProvider = null; } /** * Returns the shared instance * * @return the shared instance */ public static Activator getDefault() { return sInstance; } /** * Returns the core {@link ModuleManager} instance. * * @return the core module manager */ public ModuleManager getModuleManager() { return mModuleManager; } /** * Returns the {@link IModuleAttributeSupport} instance. * * @return the module attribute support */ public IModuleAttributeSupport getModuleAttributeSupport() { return mModuleAttributeSupport; } /** * Returns the {@link ISinkDataManager} instance. * * @return the sink data manager */ public ISinkDataManager getSinkDataManager() { return mSinkDataManager; } /** * Returns the {@link IDataFlowLabelProvider} instance. * * @return the data flow label provider */ public Provider<IDataFlowLabelProvider> getDataFlowLabelProvider() { return mDataFlowLabelProvider; } }