/*******************************************************************************
* This file is protected by Copyright.
* Please refer to the COPYRIGHT file distributed with this source distribution.
*
* This file is part of REDHAWK IDE.
*
* All rights reserved. This program and the accompanying materials are made available under
* the terms of the Eclipse Public License v1.0 which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*******************************************************************************/
package gov.redhawk.bulkio.util;
import gov.redhawk.bulkio.util.internal.ConnectionManager;
import gov.redhawk.sca.util.Debug;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import mil.jpeojtrs.sca.util.NamedThreadFactory;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Plugin;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.preferences.DefaultScope;
import org.eclipse.core.runtime.preferences.IEclipsePreferences;
import org.eclipse.core.runtime.preferences.InstanceScope;
import org.eclipse.jdt.annotation.NonNull;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceReference;
import org.osgi.util.tracker.ServiceTracker;
import BULKIO.updateSRIOperations;
/**
* The activator class controls the plug-in life cycle
*/
public class BulkIOUtilActivator extends Plugin {
// The plug-in ID
public static final String PLUGIN_ID = "gov.redhawk.bulkio.util"; //$NON-NLS-1$
/**
* @since 2.0
*/
public static final String BULKIO_ORB_TYPE = "orbType";
/**
* @since 2.0
*/
public static final String SYSTEM_PROPERTY_BULKIO_ORB_TYPE = "gov.redhawk.bulkio.orbType";
private static final ExecutorService EXECUTOR_POOL = Executors.newSingleThreadExecutor(new NamedThreadFactory(BulkIOUtilActivator.class.getName()));
private static final Debug DEBUG = new Debug(BulkIOUtilActivator.PLUGIN_ID, "PortFactory");
// The shared instance
private static BulkIOUtilActivator plugin;
private ServiceTracker<IPortFactory, IPortFactory> portFactoryTracker;
private final IPortFactory delegatingFactory = new IPortFactory() {
@Override
public PortReference connect(String connectionID, String portIor, BulkIOType type, updateSRIOperations handler) throws CoreException {
IEclipsePreferences defaultNode = DefaultScope.INSTANCE.getNode(BulkIOUtilActivator.PLUGIN_ID);
IEclipsePreferences node = InstanceScope.INSTANCE.getNode(BulkIOUtilActivator.PLUGIN_ID);
String orbType = node.get(BulkIOUtilActivator.BULKIO_ORB_TYPE, defaultNode.get(BulkIOUtilActivator.BULKIO_ORB_TYPE, null));
if (System.getProperty(BulkIOUtilActivator.SYSTEM_PROPERTY_BULKIO_ORB_TYPE, null) != null) {
orbType = System.getProperty(BulkIOUtilActivator.SYSTEM_PROPERTY_BULKIO_ORB_TYPE, "default");
}
Map<String, IPortFactory> factories = getPortFactories();
IPortFactory factory = factories.get(orbType);
if (factory == null) {
if (BulkIOUtilActivator.DEBUG.enabled) {
BulkIOUtilActivator.DEBUG.trace("WARNING: No factory of type {0} using 'default'", orbType);
}
orbType = "default";
factory = factories.get(orbType);
}
if (factory != null) {
if (BulkIOUtilActivator.DEBUG.enabled) {
BulkIOUtilActivator.DEBUG.message("DEBUG: Creating factory of type {0}", orbType);
}
PortReference retVal = factory.connect(connectionID, portIor, type, handler);
if (BulkIOUtilActivator.DEBUG.enabled) {
BulkIOUtilActivator.DEBUG.message("DEBUG: SUCCESS Created factory of type {0}", orbType);
}
return retVal;
}
throw new CoreException(new Status(IStatus.ERROR, BulkIOUtilActivator.PLUGIN_ID, "No port factories available."));
}
};
/**
* The constructor
*/
public BulkIOUtilActivator() {
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
*/
@Override
public void start(BundleContext context) throws Exception {
super.start(context);
BulkIOUtilActivator.plugin = this;
portFactoryTracker = new ServiceTracker<IPortFactory, IPortFactory>(context, IPortFactory.class, null);
portFactoryTracker.open();
}
/*
* (non-Javadoc)
*
* @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
*/
@Override
public void stop(BundleContext context) throws Exception {
super.stop(context);
BulkIOUtilActivator.plugin = null;
if (portFactoryTracker != null) {
portFactoryTracker.close();
portFactoryTracker = null;
}
Future< ? > future = BulkIOUtilActivator.EXECUTOR_POOL.submit(new Runnable() {
@Override
public void run() {
ConnectionManager.INSTANCE.dispose();
}
});
try {
future.get(30, TimeUnit.SECONDS); // SUPPRESS CHECKSTYLE MAGIC NUMBER
} catch (InterruptedException e) {
// PASS
} catch (ExecutionException e) {
// PASS
} catch (TimeoutException e) {
// PASS
}
}
/**
* @since 2.0
*/
public Map<String, IPortFactory> getPortFactories() {
ServiceReference<IPortFactory>[] refsArray = portFactoryTracker.getServiceReferences();
List<ServiceReference<IPortFactory>> refsList;
if (refsArray != null) {
refsList = Arrays.asList(refsArray);
} else {
refsList = Collections.emptyList();
}
List<ServiceReference<IPortFactory>> refs = new ArrayList<ServiceReference<IPortFactory>>(refsList);
Collections.sort(refs);
Map<String, IPortFactory> retVal = new HashMap<String, IPortFactory>();
for (ServiceReference<IPortFactory> ref : refs) {
retVal.put(String.valueOf(ref.getProperty(BulkIOUtilActivator.BULKIO_ORB_TYPE)), portFactoryTracker.getService(ref));
}
return Collections.unmodifiableMap(retVal);
}
/**
* Returns the shared instance
*
* @return the shared instance
*/
public static BulkIOUtilActivator getDefault() {
return BulkIOUtilActivator.plugin;
}
public static IBulkIOPortConnectionManager getBulkIOPortConnectionManager() {
return ConnectionManager.INSTANCE;
}
/**
* @return
* @since 2.0
*/
@NonNull
public IPortFactory getPortFactory() {
return delegatingFactory;
}
}