/******************************************************************************* * Copyright (c) 2009, 2010 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; } }