| /**************************************************************************** |
| * Copyright (c) 2006, 2007 Composent, Inc. and others. |
| * |
| * This program and the accompanying materials are made |
| * available under the terms of the Eclipse Public License 2.0 |
| * which is available at https://www.eclipse.org/legal/epl-2.0/ |
| * |
| * Contributors: |
| * Composent, Inc. - initial API and implementation |
| * |
| * SPDX-License-Identifier: EPL-2.0 |
| *****************************************************************************/ |
| package org.eclipse.ecf.internal.provider.filetransfer; |
| |
| import java.io.IOException; |
| import java.net.URL; |
| import java.net.URLConnection; |
| import java.util.Arrays; |
| import java.util.HashMap; |
| import java.util.HashSet; |
| import java.util.Hashtable; |
| import java.util.Iterator; |
| import java.util.List; |
| import java.util.Map; |
| import java.util.Set; |
| import java.util.StringTokenizer; |
| import org.eclipse.core.net.proxy.IProxyService; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IAdapterManager; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtensionDelta; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.IExtensionRegistry; |
| import org.eclipse.core.runtime.IRegistryChangeEvent; |
| import org.eclipse.core.runtime.IRegistryChangeListener; |
| import org.eclipse.core.runtime.IStatus; |
| import org.eclipse.core.runtime.Status; |
| import org.eclipse.ecf.core.util.LogHelper; |
| import org.eclipse.ecf.core.util.PlatformHelper; |
| import org.eclipse.ecf.filetransfer.service.IRemoteFileSystemBrowser; |
| import org.eclipse.ecf.filetransfer.service.IRemoteFileSystemBrowserFactory; |
| import org.eclipse.ecf.filetransfer.service.IRetrieveFileTransfer; |
| import org.eclipse.ecf.filetransfer.service.IRetrieveFileTransferFactory; |
| import org.eclipse.ecf.filetransfer.service.ISendFileTransfer; |
| import org.eclipse.ecf.filetransfer.service.ISendFileTransferFactory; |
| import org.eclipse.ecf.provider.filetransfer.IFileTransferProtocolToFactoryMapper; |
| import org.eclipse.ecf.provider.filetransfer.retrieve.MultiProtocolRetrieveAdapter; |
| import org.eclipse.osgi.util.NLS; |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.BundleActivator; |
| import org.osgi.framework.BundleContext; |
| import org.osgi.framework.ServiceReference; |
| import org.osgi.framework.ServiceRegistration; |
| import org.osgi.service.log.LogService; |
| import org.osgi.service.url.AbstractURLStreamHandlerService; |
| import org.osgi.service.url.URLConstants; |
| import org.osgi.service.url.URLStreamHandlerService; |
| import org.osgi.util.tracker.ServiceTracker; |
| |
| /** |
| * The activator class controls the plug-in life cycle |
| */ |
| public class Activator implements BundleActivator, IFileTransferProtocolToFactoryMapper { |
| |
| // This is the name of a system property 'org.eclipse.ecf.provider.filetransfer.excludeContributors' |
| // that allows people to defeat the priority system for the browse, send, and retrieve factory contributions. |
| // If a plugin (symbolic id) is given in this property (multiples separated by comma), then |
| // that plugin's contributions will *not* be added to the browse, send, and retrieve protocol factories |
| public static final String PLUGIN_EXCLUDED_SYS_PROP_NAME = Activator.PLUGIN_ID + ".excludeContributors"; //$NON-NLS-1$ |
| |
| private static final String CLASS_ATTR = "class"; //$NON-NLS-1$ |
| private static final String PRIORITY_ATTR = "priority"; //$NON-NLS-1$ |
| private static final int DEFAULT_PRIORITY = 100; |
| private static final String PROTOCOL_ATTR = "protocol"; //$NON-NLS-1$ |
| private static final String URI_ATTR = "uri"; //$NON-NLS-1$ |
| private static final String[] jvmSchemes = new String[] {Messages.FileTransferNamespace_Http_Protocol, Messages.FileTransferNamespace_Ftp_Protocol, Messages.FileTransferNamespace_File_Protocol, Messages.FileTransferNamespace_Jar_Protocol, Messages.FileTransferNamespace_Https_Protocol, Messages.FileTransferNamespace_Mailto_Protocol, Messages.FileTransferNamespace_Gopher_Protocol}; |
| |
| private static final String URL_HANDLER_PROTOCOL_NAME = "url.handler.protocol"; //$NON-NLS-1$ |
| |
| private static final String URLSTREAM_HANDLER_SERVICE_NAME = "org.osgi.service.url.URLStreamHandlerService"; //$NON-NLS-1$ |
| |
| // The plug-in ID |
| public static final String PLUGIN_ID = "org.eclipse.ecf.provider.filetransfer"; //$NON-NLS-1$ |
| |
| private static final String RETRIEVE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME = "retrieveFileTransferProtocolFactory"; //$NON-NLS-1$ |
| |
| private static final String RETRIEVE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT = PLUGIN_ID + "." //$NON-NLS-1$ |
| + RETRIEVE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME; |
| |
| private static final String SEND_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME = "sendFileTransferProtocolFactory"; //$NON-NLS-1$ |
| |
| private static final String SEND_FILETRANSFER_PROTOCOL_FACTORY_EPOINT = PLUGIN_ID + "." //$NON-NLS-1$ |
| + SEND_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME; |
| |
| private static final String BROWSE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME = "browseFileTransferProtocolFactory"; //$NON-NLS-1$ |
| |
| private static final String BROWSE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT = PLUGIN_ID + "." //$NON-NLS-1$ |
| + BROWSE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME; |
| |
| // The shared instance |
| private static Activator plugin; |
| |
| private BundleContext context = null; |
| |
| private ServiceRegistration fileTransferServiceRegistration; |
| |
| private ServiceTracker logServiceTracker = null; |
| private ServiceTracker extensionRegistryTracker = null; |
| |
| private Map retrieveFileTransferProtocolMap; |
| |
| private Map sendFileTransferProtocolMap; |
| |
| private Map browseFileTransferProtocolMap; |
| |
| private ServiceTracker adapterManagerTracker = null; |
| |
| private ServiceTracker proxyServiceTracker = null; |
| |
| private IURLConnectionModifier urlConnectionModifier = null; |
| |
| private String[] excludedPlugins = null; |
| |
| private ServiceRegistration protocolMapperRegistration; |
| |
| private IRegistryChangeListener registryChangeListener = new IRegistryChangeListener() { |
| |
| public void registryChanged(IRegistryChangeEvent event) { |
| final IExtensionDelta retrieveDelta[] = event.getExtensionDeltas(PLUGIN_ID, RETRIEVE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME); |
| for (IExtensionDelta r : retrieveDelta) { |
| switch (r.getKind()) { |
| case IExtensionDelta.ADDED : |
| addRetrieveExtensions(r.getExtension().getConfigurationElements()); |
| break; |
| case IExtensionDelta.REMOVED : |
| removeRetrieveExtensions(r.getExtension().getConfigurationElements()); |
| break; |
| } |
| } |
| final IExtensionDelta sendDelta[] = event.getExtensionDeltas(PLUGIN_ID, SEND_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME); |
| for (IExtensionDelta s : sendDelta) { |
| switch (s.getKind()) { |
| case IExtensionDelta.ADDED : |
| addSendExtensions(s.getExtension().getConfigurationElements()); |
| break; |
| case IExtensionDelta.REMOVED : |
| removeSendExtensions(s.getExtension().getConfigurationElements()); |
| break; |
| } |
| } |
| final IExtensionDelta browseDelta[] = event.getExtensionDeltas(PLUGIN_ID, BROWSE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT_NAME); |
| for (IExtensionDelta b : browseDelta) { |
| switch (b.getKind()) { |
| case IExtensionDelta.ADDED : |
| addBrowseExtensions(b.getExtension().getConfigurationElements()); |
| break; |
| case IExtensionDelta.REMOVED : |
| removeBrowseExtensions(b.getExtension().getConfigurationElements()); |
| break; |
| } |
| } |
| } |
| |
| }; |
| |
| private String[] parseExcludedPlugins() { |
| String prop = System.getProperty(PLUGIN_EXCLUDED_SYS_PROP_NAME); |
| if (prop == null) |
| return new String[0]; |
| StringTokenizer tok = new StringTokenizer(prop, ","); //$NON-NLS-1$ |
| int count = tok.countTokens(); |
| String[] results = new String[count]; |
| for (int i = 0; i < count; i++) { |
| results[i] = tok.nextToken(); |
| } |
| return results; |
| } |
| |
| /** |
| * The constructor |
| */ |
| public Activator() { |
| // |
| } |
| |
| protected LogService getLogService() { |
| synchronized (this) { |
| if (this.context == null) |
| return null; |
| if (logServiceTracker == null) { |
| logServiceTracker = new ServiceTracker(this.context, LogService.class.getName(), null); |
| logServiceTracker.open(); |
| } |
| return (LogService) logServiceTracker.getService(); |
| } |
| } |
| |
| public IProxyService getProxyService() { |
| try { |
| if (proxyServiceTracker == null) { |
| proxyServiceTracker = new ServiceTracker(this.context, IProxyService.class.getName(), null); |
| proxyServiceTracker.open(); |
| } |
| return (IProxyService) proxyServiceTracker.getService(); |
| } catch (Exception e) { |
| logNoProxyWarning(e); |
| } catch (NoClassDefFoundError e) { |
| logNoProxyWarning(e); |
| } |
| return null; |
| } |
| |
| static boolean proxyWarningGiven = false; |
| |
| public static void logNoProxyWarning(Throwable e) { |
| Activator a = getDefault(); |
| if (a != null) { |
| if (!proxyWarningGiven) { |
| a.log(new Status(IStatus.WARNING, Activator.PLUGIN_ID, IStatus.WARNING, "Warning: Platform proxy API not available", null)); //$NON-NLS-1$ |
| proxyWarningGiven = true; |
| } |
| } |
| } |
| |
| public void log(IStatus status) { |
| if (this.context == null) |
| return; |
| final LogService logService = getLogService(); |
| if (logService != null) { |
| logService.log(LogHelper.getLogCode(status), LogHelper.getLogMessage(status), status.getException()); |
| } |
| } |
| |
| public Bundle getBundle() { |
| if (context == null) |
| return null; |
| return context.getBundle(); |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.core.runtime.Plugins#start(org.osgi.framework.BundleContext) |
| */ |
| public void start(BundleContext ctxt) throws Exception { |
| plugin = this; |
| this.context = ctxt; |
| this.retrieveFileTransferProtocolMap = new HashMap(3); |
| this.sendFileTransferProtocolMap = new HashMap(3); |
| this.browseFileTransferProtocolMap = new HashMap(3); |
| |
| // initialize the default url connection modifier for ssl |
| try { |
| Class urlConnectionModifierClass = Class.forName("org.eclipse.ecf.internal.provider.filetransfer.ssl.ECFURLConnectionModifier"); //$NON-NLS-1$ |
| urlConnectionModifier = (IURLConnectionModifier) urlConnectionModifierClass.newInstance(); |
| urlConnectionModifier.init(ctxt); |
| } catch (ClassNotFoundException e) { |
| // will occur if fragment is not installed or not on proper execution environment |
| } catch (Throwable t) { |
| log(new Status(IStatus.ERROR, getDefault().getBundle().getSymbolicName(), "Unexpected Error in Activator.start", t)); //$NON-NLS-1$ |
| } |
| |
| fileTransferServiceRegistration = ctxt.registerService(IRetrieveFileTransferFactory.class.getName(), new IRetrieveFileTransferFactory() { |
| public IRetrieveFileTransfer newInstance() { |
| return new MultiProtocolRetrieveAdapter(); |
| } |
| }, null); |
| this.extensionRegistryTracker = new ServiceTracker(ctxt, IExtensionRegistry.class.getName(), null); |
| this.extensionRegistryTracker.open(); |
| final IExtensionRegistry registry = getExtensionRegistry(); |
| if (registry != null) { |
| registry.addRegistryChangeListener(registryChangeListener); |
| } |
| // Can't be lazy about this, as schemes need to be registered with |
| // platform |
| loadProtocolHandlers(); |
| // Finally, register this object as a IFileTransferProtocolToFactoryMapper service |
| protocolMapperRegistration = context.registerService(IFileTransferProtocolToFactoryMapper.class.getName(), this, null); |
| } |
| |
| public boolean reinitialize() { |
| try { |
| loadProtocolHandlers(); |
| return true; |
| } catch (Exception e) { |
| return false; |
| } |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.core.runtime.Plugin#stop(org.osgi.framework.BundleContext) |
| */ |
| public void stop(BundleContext ctxt) throws Exception { |
| final IExtensionRegistry registry = getExtensionRegistry(); |
| if (registry != null) { |
| registry.removeRegistryChangeListener(registryChangeListener); |
| } |
| |
| if (urlConnectionModifier != null) { |
| urlConnectionModifier.dispose(); |
| urlConnectionModifier = null; |
| } |
| if (extensionRegistryTracker != null) { |
| extensionRegistryTracker.close(); |
| extensionRegistryTracker = null; |
| } |
| if (fileTransferServiceRegistration != null) { |
| fileTransferServiceRegistration.unregister(); |
| fileTransferServiceRegistration = null; |
| } |
| if (adapterManagerTracker != null) { |
| adapterManagerTracker.close(); |
| adapterManagerTracker = null; |
| } |
| if (proxyServiceTracker != null) { |
| proxyServiceTracker.close(); |
| proxyServiceTracker = null; |
| } |
| if (this.retrieveFileTransferProtocolMap != null) { |
| this.retrieveFileTransferProtocolMap.clear(); |
| this.retrieveFileTransferProtocolMap = null; |
| } |
| if (this.sendFileTransferProtocolMap != null) { |
| this.sendFileTransferProtocolMap.clear(); |
| this.sendFileTransferProtocolMap = null; |
| } |
| if (this.browseFileTransferProtocolMap != null) { |
| this.browseFileTransferProtocolMap.clear(); |
| this.browseFileTransferProtocolMap = null; |
| } |
| if (this.protocolMapperRegistration != null) { |
| this.protocolMapperRegistration.unregister(); |
| this.protocolMapperRegistration = null; |
| } |
| |
| synchronized (this) { |
| this.context = null; |
| } |
| plugin = null; |
| } |
| |
| /** |
| * Returns the shared instance |
| * |
| * @return the shared instance |
| */ |
| public synchronized static Activator getDefault() { |
| if (plugin == null) { |
| plugin = new Activator(); |
| } |
| return plugin; |
| } |
| |
| public String[] getPlatformSupportedSchemes() { |
| final ServiceTracker handlers = new ServiceTracker(context, URLSTREAM_HANDLER_SERVICE_NAME, null); |
| handlers.open(); |
| final ServiceReference[] refs = handlers.getServiceReferences(); |
| final Set protocols = new HashSet(); |
| if (refs != null) |
| for (ServiceReference ref : refs) { |
| final Object protocol = ref.getProperty(URL_HANDLER_PROTOCOL_NAME); |
| if (protocol instanceof String) { |
| protocols.add(protocol); |
| } else if (protocol instanceof String[]) { |
| final String[] ps = (String[]) protocol; |
| protocols.addAll(Arrays.asList(ps)); |
| } |
| } |
| handlers.close(); |
| protocols.addAll(Arrays.asList(jvmSchemes)); |
| return (String[]) protocols.toArray(new String[] {}); |
| } |
| |
| public IExtensionRegistry getExtensionRegistry() { |
| if (extensionRegistryTracker == null) { |
| this.extensionRegistryTracker = new ServiceTracker(context, IExtensionRegistry.class.getName(), null); |
| this.extensionRegistryTracker.open(); |
| } |
| return (IExtensionRegistry) extensionRegistryTracker.getService(); |
| } |
| |
| static class ProtocolFactory implements Comparable { |
| Object factory; |
| int priority = 0; |
| String id; |
| |
| public ProtocolFactory(Object factory, int priority, String id) { |
| this.factory = factory; |
| this.priority = priority; |
| this.id = id; |
| } |
| |
| public Object getFactory() { |
| return factory; |
| } |
| |
| public String getID() { |
| return id; |
| } |
| |
| public int getPriority() { |
| return priority; |
| } |
| |
| /* (non-Javadoc) |
| * @see java.lang.Comparable#compareTo(java.lang.Object) |
| */ |
| public int compareTo(Object another) { |
| if (!(another instanceof ProtocolFactory)) |
| return -1; |
| ProtocolFactory other = (ProtocolFactory) another; |
| if (this.priority == other.priority) |
| return 0; |
| return (this.priority < other.priority) ? -1 : 1; |
| } |
| } |
| |
| private int getPriority(IConfigurationElement configElement, String warning, String protocol) { |
| // Get priority for new entry, if optional priority attribute specified |
| final String priorityString = configElement.getAttribute(PRIORITY_ATTR); |
| int priority = DEFAULT_PRIORITY; |
| if (priorityString != null) { |
| try { |
| priority = Integer.parseInt(priorityString); |
| // Make sure that any negative values are reset to 0 (highest priority) |
| priority = (priority < 0) ? 0 : priority; |
| } catch (NumberFormatException e) { |
| // Give warning |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for {1} from {2} has invalid priority {3}. Priority will be set to {4}", new Object[] {warning, protocol, configElement.getDeclaringExtension().getContributor().getName(), priorityString, String.valueOf(DEFAULT_PRIORITY)}), null)); //$NON-NLS-1$ |
| } |
| } |
| return priority; |
| } |
| |
| boolean pluginExcluded(String pluginId) { |
| if (excludedPlugins == null) { |
| excludedPlugins = parseExcludedPlugins(); |
| } |
| List l = Arrays.asList(excludedPlugins); |
| return l.contains(pluginId); |
| } |
| |
| void addRetrieveExtensions(IConfigurationElement[] configElements) { |
| for (IConfigurationElement configElement : configElements) { |
| final String protocol = configElement.getAttribute(PROTOCOL_ATTR); |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return; |
| String uriStr = configElement.getAttribute(URI_ATTR); |
| boolean uri = (uriStr == null) ? false : Boolean.valueOf(uriStr).booleanValue(); |
| String CONTRIBUTION_WARNING = "File retrieve contribution"; //$NON-NLS-1$ |
| try { |
| String pluginId = configElement.getDeclaringExtension().getContributor().getName(); |
| // Only add the factories if the contributor plugin has not been excluded |
| if (!pluginExcluded(pluginId)) { |
| // First create factory clazz |
| final IRetrieveFileTransferFactory retrieveFactory = (IRetrieveFileTransferFactory) configElement.createExecutableExtension(CLASS_ATTR); |
| // Get priority for new entry, if optional priority attribute specified |
| int priority = getPriority(configElement, CONTRIBUTION_WARNING, protocol); |
| String contributorName = configElement.getDeclaringExtension().getContributor().getName(); |
| // Now add new ProtocolFactory |
| setRetrieveFileTransferFactory(protocol, contributorName, retrieveFactory, priority, uri); |
| } else { |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, "Plugin " + pluginId + " excluded from contributing retrieve factory", null)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } catch (final CoreException e) { |
| Activator.getDefault().log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, NLS.bind("Error loading from {0} extension point", RETRIEVE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT), e)); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| void removeRetrieveExtensions(IConfigurationElement[] configElements) { |
| for (IConfigurationElement configElement : configElements) { |
| final String protocol = configElement.getAttribute(PROTOCOL_ATTR); |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return; |
| String id = getRetrieveFileTransferFactoryId(protocol); |
| if (id != null) |
| removeRetrieveFileTransferFactory(id); |
| } |
| } |
| |
| void addSendExtensions(IConfigurationElement[] configElements) { |
| for (IConfigurationElement configElement : configElements) { |
| final String protocol = configElement.getAttribute(PROTOCOL_ATTR); |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return; |
| String uriStr = configElement.getAttribute(URI_ATTR); |
| boolean uri = (uriStr == null) ? false : Boolean.valueOf(uriStr).booleanValue(); |
| String CONTRIBUTION_WARNING = "File send contribution"; //$NON-NLS-1$ |
| try { |
| String pluginId = configElement.getDeclaringExtension().getContributor().getName(); |
| // Only add the factories if the contributor plugin has not been excluded |
| if (!pluginExcluded(pluginId)) { |
| // First create factory clazz |
| final ISendFileTransferFactory clazz = (ISendFileTransferFactory) configElement.createExecutableExtension(CLASS_ATTR); |
| // Get priority for new entry, if optional priority attribute specified |
| int priority = getPriority(configElement, CONTRIBUTION_WARNING, protocol); |
| setSendFileTransferFactory(protocol, pluginId, clazz, priority, uri); |
| } else { |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, "Plugin " + pluginId + " excluded from contributing send factory", null)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } catch (final CoreException e) { |
| Activator.getDefault().log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, NLS.bind("Error loading from {0} extension point", SEND_FILETRANSFER_PROTOCOL_FACTORY_EPOINT), e)); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| void removeSendExtensions(IConfigurationElement[] configElements) { |
| for (IConfigurationElement configElement : configElements) { |
| final String protocol = configElement.getAttribute(PROTOCOL_ATTR); |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return; |
| String id = getSendFileTransferFactoryId(protocol); |
| if (id != null) |
| removeSendFileTransferFactory(id); |
| } |
| } |
| |
| void addBrowseExtensions(IConfigurationElement[] configElements) { |
| for (IConfigurationElement configElement : configElements) { |
| final String protocol = configElement.getAttribute(PROTOCOL_ATTR); |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return; |
| String uriStr = configElement.getAttribute(URI_ATTR); |
| boolean uri = (uriStr == null) ? false : Boolean.valueOf(uriStr).booleanValue(); |
| String CONTRIBUTION_WARNING = "File browse contribution"; //$NON-NLS-1$ |
| try { |
| String pluginId = configElement.getDeclaringExtension().getContributor().getName(); |
| // Only add the factories if the contributor plugin has not been excluded |
| if (!pluginExcluded(pluginId)) { |
| // First create factory clazz |
| final IRemoteFileSystemBrowserFactory clazz = (IRemoteFileSystemBrowserFactory) configElement.createExecutableExtension(CLASS_ATTR); |
| // Get priority for new entry, if optional priority attribute specified |
| int priority = getPriority(configElement, CONTRIBUTION_WARNING, protocol); |
| setBrowseFileTransferFactory(protocol, pluginId, clazz, priority, uri); |
| } else { |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, "Plugin " + pluginId + " excluded from contributing browse factory", null)); //$NON-NLS-1$ //$NON-NLS-2$ |
| } |
| } catch (final CoreException e) { |
| Activator.getDefault().log(new Status(IStatus.ERROR, PLUGIN_ID, IStatus.ERROR, NLS.bind("Error loading from {0} extension point", BROWSE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT), e)); //$NON-NLS-1$ |
| } |
| } |
| } |
| |
| void removeBrowseExtensions(IConfigurationElement[] configElements) { |
| for (IConfigurationElement configElement : configElements) { |
| final String protocol = configElement.getAttribute(PROTOCOL_ATTR); |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return; |
| String id = getBrowseFileTransferFactoryId(protocol); |
| if (id != null) |
| removeBrowseFileTransferFactory(id); |
| } |
| } |
| |
| private void loadProtocolHandlers() { |
| final IExtensionRegistry reg = getExtensionRegistry(); |
| if (reg != null) { |
| final IExtensionPoint retrieveExtensionPoint = reg.getExtensionPoint(RETRIEVE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT); |
| if (retrieveExtensionPoint != null) |
| addRetrieveExtensions(retrieveExtensionPoint.getConfigurationElements()); |
| // Now do it with send |
| final IExtensionPoint sendExtensionPoint = reg.getExtensionPoint(SEND_FILETRANSFER_PROTOCOL_FACTORY_EPOINT); |
| if (sendExtensionPoint != null) |
| addSendExtensions(sendExtensionPoint.getConfigurationElements()); |
| // Now for browse |
| final IExtensionPoint browseExtensionPoint = reg.getExtensionPoint(BROWSE_FILETRANSFER_PROTOCOL_FACTORY_EPOINT); |
| if (browseExtensionPoint != null) |
| addBrowseExtensions(browseExtensionPoint.getConfigurationElements()); |
| } |
| } |
| |
| private boolean isSchemeRegistered(String protocol, String[] schemes) { |
| for (String scheme : schemes) { |
| if (protocol.equals(scheme)) { |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| class DummyURLStreamHandlerService extends AbstractURLStreamHandlerService { |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.osgi.service.url.AbstractURLStreamHandlerService#openConnection(java.net.URL) |
| */ |
| public URLConnection openConnection(URL u) throws IOException { |
| throw new IOException(NLS.bind("URLConnection cannot be created for {0}", u.toExternalForm())); //$NON-NLS-1$ |
| } |
| |
| } |
| |
| private final DummyURLStreamHandlerService dummyService = new DummyURLStreamHandlerService(); |
| |
| private void registerScheme(String protocol) { |
| final Hashtable properties = new Hashtable(); |
| properties.put(URLConstants.URL_HANDLER_PROTOCOL, new String[] {protocol}); |
| context.registerService(URLStreamHandlerService.class.getName(), dummyService, properties); |
| } |
| |
| public IRetrieveFileTransfer getFileTransfer(String protocol) { |
| ProtocolFactory protocolFactory = null; |
| synchronized (retrieveFileTransferProtocolMap) { |
| protocolFactory = (ProtocolFactory) retrieveFileTransferProtocolMap.get(protocol); |
| } |
| if (protocolFactory == null) |
| return null; |
| final IRetrieveFileTransferFactory factory = (IRetrieveFileTransferFactory) protocolFactory.getFactory(); |
| if (factory != null) |
| return factory.newInstance(); |
| return null; |
| } |
| |
| public ISendFileTransfer getSendFileTransfer(String protocol) { |
| ProtocolFactory protocolFactory = null; |
| synchronized (sendFileTransferProtocolMap) { |
| protocolFactory = (ProtocolFactory) sendFileTransferProtocolMap.get(protocol); |
| } |
| if (protocolFactory == null) |
| return null; |
| final ISendFileTransferFactory factory = (ISendFileTransferFactory) protocolFactory.getFactory(); |
| if (factory != null) |
| return factory.newInstance(); |
| return null; |
| } |
| |
| public IRemoteFileSystemBrowser getBrowseFileTransfer(String protocol) { |
| ProtocolFactory protocolFactory = null; |
| synchronized (browseFileTransferProtocolMap) { |
| protocolFactory = (ProtocolFactory) browseFileTransferProtocolMap.get(protocol); |
| } |
| if (protocolFactory == null) |
| return null; |
| final IRemoteFileSystemBrowserFactory factory = (IRemoteFileSystemBrowserFactory) protocolFactory.getFactory(); |
| if (factory != null) |
| return factory.newInstance(); |
| return null; |
| } |
| |
| public IAdapterManager getAdapterManager() { |
| // First, try to get the adapter manager via |
| if (adapterManagerTracker == null) { |
| adapterManagerTracker = new ServiceTracker(this.context, IAdapterManager.class.getName(), null); |
| adapterManagerTracker.open(); |
| } |
| IAdapterManager adapterManager = (IAdapterManager) adapterManagerTracker.getService(); |
| // Then, if the service isn't there, try to get from Platform class via |
| // PlatformHelper class |
| if (adapterManager == null) |
| adapterManager = PlatformHelper.getPlatformAdapterManager(); |
| return adapterManager; |
| } |
| |
| public IURLConnectionModifier getURLConnectionModifier() { |
| return urlConnectionModifier; |
| } |
| |
| public boolean setRetrieveFileTransferFactory(String protocol, String id, IRetrieveFileTransferFactory factory, int priority) { |
| return setRetrieveFileTransferFactory(protocol, id, factory, priority, false); |
| } |
| |
| public boolean setRetrieveFileTransferFactory(String protocol, String id, IRetrieveFileTransferFactory factory, int priority, boolean uri) { |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return false; |
| if (id == null) |
| return false; |
| if (factory == null) |
| return false; |
| if (!pluginExcluded(id)) { |
| // Now create new ProtocolFactory |
| ProtocolFactory newProtocolFactory = new ProtocolFactory(factory, priority, id); |
| synchronized (retrieveFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) retrieveFileTransferProtocolMap.get(protocol); |
| // If found, choose between them based upon comparing their priority |
| if (oldProtocolFactory != null) { |
| // Now, compare priorities and pick winner |
| String CONTRIBUTION_WARNING = "File retrieve contribution"; //$NON-NLS-1$ |
| int result = oldProtocolFactory.compareTo(newProtocolFactory); |
| if (result < 0) { |
| // Existing one has higher priority, so we provide warning and return (leaving existing one as the handler) |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be ignored. Existing protocol factory has higher priority.", new Object[] {CONTRIBUTION_WARNING, protocol, id}), null)); //$NON-NLS-1$ |
| return false; |
| } else if (result == 0) { |
| // Warn that we are using new one because they have the same priority. |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be used in preference to existing handler. Both have same priority={3}.", new Object[] {CONTRIBUTION_WARNING, protocol, id, Integer.valueOf(priority)}), null)); //$NON-NLS-1$ |
| } else if (result > 0) { |
| // Warn that we are using new one because it has higher priority. |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be used in preference to existing handler. New handler has higher priority={3}<{4}.", new Object[] {CONTRIBUTION_WARNING, protocol, id, Integer.valueOf(priority), Integer.valueOf(oldProtocolFactory.priority)}), null)); //$NON-NLS-1$ |
| } |
| } |
| // If !uri, then check/register protocol as URLStreamHandlerService |
| if (!uri) { |
| String[] existingSchemes = getPlatformSupportedSchemes(); |
| if (!isSchemeRegistered(protocol, existingSchemes)) |
| registerScheme(protocol); |
| } |
| // Finally, put protocol factory in map with protocol as key |
| retrieveFileTransferProtocolMap.put(protocol, newProtocolFactory); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public String getRetrieveFileTransferFactoryId(String protocol) { |
| if (protocol == null) |
| return null; |
| synchronized (retrieveFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) retrieveFileTransferProtocolMap.get(protocol); |
| if (oldProtocolFactory == null) |
| return null; |
| return oldProtocolFactory.getID(); |
| } |
| } |
| |
| public int getRetrieveFileTransferPriority(String protocol) { |
| if (protocol == null) |
| return -1; |
| synchronized (retrieveFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) retrieveFileTransferProtocolMap.get(protocol); |
| if (oldProtocolFactory == null) |
| return -1; |
| return oldProtocolFactory.getPriority(); |
| } |
| } |
| |
| public boolean removeRetrieveFileTransferFactory(String id) { |
| if (id == null) |
| return false; |
| boolean removed = false; |
| synchronized (retrieveFileTransferProtocolMap) { |
| for (Iterator i = retrieveFileTransferProtocolMap.keySet().iterator(); i.hasNext();) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) retrieveFileTransferProtocolMap.get(i.next()); |
| if (oldProtocolFactory == null) |
| continue; |
| if (id.equals(oldProtocolFactory.getID())) { |
| i.remove(); |
| removed = true; |
| } |
| } |
| return removed; |
| } |
| } |
| |
| public boolean setBrowseFileTransferFactory(String protocol, String id, IRemoteFileSystemBrowserFactory factory, int priority) { |
| return setBrowseFileTransferFactory(protocol, id, factory, priority, false); |
| } |
| |
| public boolean setBrowseFileTransferFactory(String protocol, String id, IRemoteFileSystemBrowserFactory factory, int priority, boolean uri) { |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return false; |
| if (id == null) |
| return false; |
| if (factory == null) |
| return false; |
| if (!pluginExcluded(id)) { |
| // Now create new ProtocolFactory |
| ProtocolFactory newProtocolFactory = new ProtocolFactory(factory, priority, id); |
| synchronized (browseFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) browseFileTransferProtocolMap.get(protocol); |
| // If found, choose between them based upon comparing their priority |
| if (oldProtocolFactory != null) { |
| // Now, compare priorities and pick winner |
| String CONTRIBUTION_WARNING = "File browse contribution"; //$NON-NLS-1$ |
| int result = oldProtocolFactory.compareTo(newProtocolFactory); |
| if (result < 0) { |
| // Existing one has higher priority, so we provide warning and return (leaving existing one as the handler) |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be ignored. Existing protocol factory has higher priority.", new Object[] {CONTRIBUTION_WARNING, protocol, id}), null)); //$NON-NLS-1$ |
| return false; |
| } else if (result == 0) { |
| // Warn that we are using new one because they have the same priority. |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be used in preference to existing handler. Both have same priority={3}.", new Object[] {CONTRIBUTION_WARNING, protocol, id, Integer.valueOf(priority)}), null)); //$NON-NLS-1$ |
| } else if (result > 0) { |
| // Warn that we are using new one because it has higher priority. |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be used in preference to existing handler. New handler has higher priority={3}<{4}.", new Object[] {CONTRIBUTION_WARNING, protocol, id, Integer.valueOf(priority), Integer.valueOf(oldProtocolFactory.priority)}), null)); //$NON-NLS-1$ |
| } |
| } |
| // If !uri, then check/register protocol as URLStreamHandlerService |
| if (!uri) { |
| String[] existingSchemes = getPlatformSupportedSchemes(); |
| if (!isSchemeRegistered(protocol, existingSchemes)) |
| registerScheme(protocol); |
| } |
| // Finally, put protocol factory in map with protocol as key |
| browseFileTransferProtocolMap.put(protocol, newProtocolFactory); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public String getBrowseFileTransferFactoryId(String protocol) { |
| if (protocol == null) |
| return null; |
| synchronized (browseFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) browseFileTransferProtocolMap.get(protocol); |
| if (oldProtocolFactory == null) |
| return null; |
| return oldProtocolFactory.getID(); |
| } |
| } |
| |
| public int getBrowseFileTransferPriority(String protocol) { |
| if (protocol == null) |
| return -1; |
| synchronized (browseFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) browseFileTransferProtocolMap.get(protocol); |
| if (oldProtocolFactory == null) |
| return -1; |
| return oldProtocolFactory.getPriority(); |
| } |
| } |
| |
| public boolean removeBrowseFileTransferFactory(String id) { |
| if (id == null) |
| return false; |
| boolean removed = false; |
| synchronized (browseFileTransferProtocolMap) { |
| for (Iterator i = browseFileTransferProtocolMap.keySet().iterator(); i.hasNext();) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) browseFileTransferProtocolMap.get(i.next()); |
| if (oldProtocolFactory == null) |
| continue; |
| if (id.equals(oldProtocolFactory.getID())) { |
| i.remove(); |
| removed = true; |
| } |
| } |
| return removed; |
| } |
| } |
| |
| public boolean setSendFileTransferFactory(String protocol, String id, ISendFileTransferFactory factory, int priority) { |
| return setSendFileTransferFactory(protocol, id, factory, priority, false); |
| } |
| |
| public boolean setSendFileTransferFactory(String protocol, String id, ISendFileTransferFactory factory, int priority, boolean uri) { |
| if (protocol == null || "".equals(protocol)) //$NON-NLS-1$ |
| return false; |
| if (id == null) |
| return false; |
| if (factory == null) |
| return false; |
| if (!pluginExcluded(id)) { |
| // Now create new ProtocolFactory |
| ProtocolFactory newProtocolFactory = new ProtocolFactory(factory, priority, id); |
| synchronized (sendFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) sendFileTransferProtocolMap.get(protocol); |
| // If found, choose between them based upon comparing their priority |
| if (oldProtocolFactory != null) { |
| // Now, compare priorities and pick winner |
| String CONTRIBUTION_WARNING = "File send contribution"; //$NON-NLS-1$ |
| int result = oldProtocolFactory.compareTo(newProtocolFactory); |
| if (result < 0) { |
| // Existing one has higher priority, so we provide warning and return (leaving existing one as the handler) |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be ignored. Existing protocol factory has higher priority.", new Object[] {CONTRIBUTION_WARNING, protocol, id}), null)); //$NON-NLS-1$ |
| return false; |
| } else if (result == 0) { |
| // Warn that we are using new one because they have the same priority. |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be used in preference to existing handler. Both have same priority={3}.", new Object[] {CONTRIBUTION_WARNING, protocol, id, Integer.valueOf(priority)}), null)); //$NON-NLS-1$ |
| } else if (result > 0) { |
| // Warn that we are using new one because it has higher priority. |
| Activator.getDefault().log(new Status(IStatus.WARNING, PLUGIN_ID, IStatus.WARNING, NLS.bind("{0} for protocol {1} from {2} will be used in preference to existing handler. New handler has higher priority={3}<{4}.", new Object[] {CONTRIBUTION_WARNING, protocol, id, Integer.valueOf(priority), Integer.valueOf(oldProtocolFactory.priority)}), null)); //$NON-NLS-1$ |
| } |
| } |
| // If !uri, then check/register protocol as URLStreamHandlerService |
| if (!uri) { |
| String[] existingSchemes = getPlatformSupportedSchemes(); |
| if (!isSchemeRegistered(protocol, existingSchemes)) |
| registerScheme(protocol); |
| } |
| // Finally, put protocol factory in map with protocol as key |
| sendFileTransferProtocolMap.put(protocol, newProtocolFactory); |
| return true; |
| } |
| } |
| return false; |
| } |
| |
| public String getSendFileTransferFactoryId(String protocol) { |
| if (protocol == null) |
| return null; |
| synchronized (sendFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) sendFileTransferProtocolMap.get(protocol); |
| if (oldProtocolFactory == null) |
| return null; |
| return oldProtocolFactory.getID(); |
| } |
| } |
| |
| public int getSendFileTransferPriority(String protocol) { |
| if (protocol == null) |
| return -1; |
| synchronized (sendFileTransferProtocolMap) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) sendFileTransferProtocolMap.get(protocol); |
| if (oldProtocolFactory == null) |
| return -1; |
| return oldProtocolFactory.getPriority(); |
| } |
| } |
| |
| public boolean removeSendFileTransferFactory(String id) { |
| if (id == null) |
| return false; |
| boolean removed = false; |
| synchronized (sendFileTransferProtocolMap) { |
| for (Iterator i = sendFileTransferProtocolMap.keySet().iterator(); i.hasNext();) { |
| ProtocolFactory oldProtocolFactory = (ProtocolFactory) sendFileTransferProtocolMap.get(i.next()); |
| if (oldProtocolFactory == null) |
| continue; |
| if (id.equals(oldProtocolFactory.getID())) { |
| i.remove(); |
| removed = true; |
| } |
| } |
| return removed; |
| } |
| } |
| |
| } |