blob: f71201d345b66a062188df5ce0040ea7dc9b8a0f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, Cloudsmith Inc.
* The code, documentation and other materials contained herein have been
* licensed under the Eclipse Public License - v 1.0 by the copyright holder
* listed above, as the Initial Contributor under such license. The text of
* such license is available at www.eclipse.org.
******************************************************************************/
package org.eclipse.equinox.internal.p2.repository;
import org.eclipse.ecf.filetransfer.service.IRetrieveFileTransferFactory;
import org.eclipse.ecf.provider.filetransfer.IFileTransferProtocolToFactoryMapper;
import org.eclipse.equinox.internal.p2.core.helpers.ServiceHelper;
import org.osgi.framework.*;
import org.osgi.service.packageadmin.PackageAdmin;
import org.osgi.util.tracker.ServiceTracker;
/**
* The activator class controls the plug-in life cycle.
* This activator has helper methods to get file transfer service tracker, and
* for making sure required ECF bundles are started.
*/
public class Activator implements BundleActivator {
public static final String ID = "org.eclipse.equinox.p2.repository"; //$NON-NLS-1$
private static final String HTTP = "http"; //$NON-NLS-1$
private static final String HTTPS = "https"; //$NON-NLS-1$
private static BundleContext context;
// tracker for ECF service
private ServiceTracker retrievalFactoryTracker;
// tracker for protocolToFactoryMapperTracker
private ServiceTracker protocolToFactoryMapperTracker = null;
// The shared instance
private static Activator plugin;
public void start(BundleContext aContext) throws Exception {
Activator.context = aContext;
Activator.plugin = this;
}
public void stop(BundleContext aContext) throws Exception {
Activator.context = null;
Activator.plugin = null;
if (retrievalFactoryTracker != null) {
retrievalFactoryTracker.close();
retrievalFactoryTracker = null;
}
if (protocolToFactoryMapperTracker != null) {
protocolToFactoryMapperTracker.close();
protocolToFactoryMapperTracker = null;
}
}
public static BundleContext getContext() {
return Activator.context;
}
/**
* Get singleton instance.
*
* @return the shared instance
*/
public static Activator getDefault() {
return plugin;
}
/**
* Returns a {@link IRetrieveFileTransferFactory} using a {@link ServiceTracker} after having attempted
* to start the bundle "org.eclipse.ecf.provider.filetransfer". If something is wrong with the configuration
* this method returns null.
* @return a factory, or null, if configuration is incorrect
*/
public IRetrieveFileTransferFactory getRetrieveFileTransferFactory() {
return (IRetrieveFileTransferFactory) getFileTransferServiceTracker().getService();
}
public synchronized void useJREHttpClient() {
IFileTransferProtocolToFactoryMapper mapper = getProtocolToFactoryMapper();
if (mapper != null) {
// remove http
// Remove browse provider
String providerId = mapper.getBrowseFileTransferFactoryId(HTTP);
if (providerId != null) {
mapper.removeBrowseFileTransferFactory(providerId);
}
// Remove retrieve provider
providerId = mapper.getRetrieveFileTransferFactoryId(HTTP);
if (providerId != null) {
mapper.removeRetrieveFileTransferFactory(providerId);
}
// Remove send provider
providerId = mapper.getSendFileTransferFactoryId(HTTP);
if (providerId != null) {
mapper.removeSendFileTransferFactory(providerId);
}
// remove https
// Remove browse provider
providerId = mapper.getBrowseFileTransferFactoryId(HTTPS);
if (providerId != null) {
mapper.removeBrowseFileTransferFactory(providerId);
}
// Remove retrieve provider
providerId = mapper.getRetrieveFileTransferFactoryId(HTTPS);
if (providerId != null) {
mapper.removeRetrieveFileTransferFactory(providerId);
}
// Remove send provider
providerId = mapper.getSendFileTransferFactoryId(HTTPS);
if (providerId != null) {
mapper.removeSendFileTransferFactory(providerId);
}
}
}
/**
* Gets the singleton ServiceTracker for the IRetrieveFileTransferFactory and starts the bundles
* "org.eclipse.ecf" and
* "org.eclipse.ecf.provider.filetransfer" on first call.
* @return ServiceTracker
*/
private synchronized ServiceTracker getFileTransferServiceTracker() {
if (retrievalFactoryTracker == null) {
retrievalFactoryTracker = new ServiceTracker(Activator.getContext(), IRetrieveFileTransferFactory.class.getName(), null);
retrievalFactoryTracker.open();
startBundle("org.eclipse.ecf"); //$NON-NLS-1$
startBundle("org.eclipse.ecf.provider.filetransfer"); //$NON-NLS-1$
}
return retrievalFactoryTracker;
}
private IFileTransferProtocolToFactoryMapper getProtocolToFactoryMapper() {
if (protocolToFactoryMapperTracker == null) {
protocolToFactoryMapperTracker = new ServiceTracker(context, IFileTransferProtocolToFactoryMapper.class.getName(), null);
protocolToFactoryMapperTracker.open();
}
return (IFileTransferProtocolToFactoryMapper) protocolToFactoryMapperTracker.getService();
}
private boolean startBundle(String bundleId) {
PackageAdmin packageAdmin = (PackageAdmin) ServiceHelper.getService(Activator.getContext(), PackageAdmin.class.getName());
if (packageAdmin == null)
return false;
Bundle[] bundles = packageAdmin.getBundles(bundleId, null);
if (bundles != null && bundles.length > 0) {
for (int i = 0; i < bundles.length; i++) {
try {
if ((bundles[0].getState() & Bundle.INSTALLED) == 0) {
bundles[0].start();
return true;
}
} catch (BundleException e) {
// failed, try next bundle
}
}
}
return false;
}
}