diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java')
-rw-r--r-- | bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java | 169 |
1 files changed, 169 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java new file mode 100644 index 000000000..b21c52c03 --- /dev/null +++ b/bundles/org.eclipse.equinox.p2.transport.ecf/src/org/eclipse/equinox/internal/p2/transport/ecf/Activator.java @@ -0,0 +1,169 @@ +/******************************************************************************* + * Copyright (c) 2009 Cloudsmith Inc and others. + * 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 + * + * Contributors: + * Cloudsmith Inc - initial API and implementation + * IBM Corporation - ongoing development + * Genuitec - Bug 291926 + ******************************************************************************/ +package org.eclipse.equinox.internal.p2.transport.ecf; + +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.transport.ecf"; //$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<IRetrieveFileTransferFactory, IRetrieveFileTransferFactory> retrievalFactoryTracker; + + // tracker for protocolToFactoryMapperTracker + private ServiceTracker<IFileTransferProtocolToFactoryMapper, IFileTransferProtocolToFactoryMapper> 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 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<IRetrieveFileTransferFactory, IRetrieveFileTransferFactory> getFileTransferServiceTracker() { + if (retrievalFactoryTracker == null) { + retrievalFactoryTracker = new ServiceTracker<IRetrieveFileTransferFactory, IRetrieveFileTransferFactory>(Activator.getContext(), IRetrieveFileTransferFactory.class, 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<IFileTransferProtocolToFactoryMapper, IFileTransferProtocolToFactoryMapper>(context, IFileTransferProtocolToFactoryMapper.class, null); + protocolToFactoryMapperTracker.open(); + } + return 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[i].getState() & Bundle.INSTALLED) == 0) { + bundles[i].start(Bundle.START_ACTIVATION_POLICY); + bundles[i].start(Bundle.START_TRANSIENT); + return true; + } + } catch (BundleException e) { + // failed, try next bundle + } + } + } + return false; + } + +} |