| /******************************************************************************* |
| * Copyright (c) 2006 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| ******************************************************************************/ |
| |
| package org.eclipse.ui.internal.ide.filesystem; |
| |
| import java.io.File; |
| import java.net.URI; |
| import java.util.Collection; |
| import java.util.HashSet; |
| import java.util.Iterator; |
| |
| import org.eclipse.core.filesystem.IFileInfo; |
| import org.eclipse.core.runtime.CoreException; |
| import org.eclipse.core.runtime.IConfigurationElement; |
| import org.eclipse.core.runtime.IExtension; |
| import org.eclipse.core.runtime.IExtensionPoint; |
| import org.eclipse.core.runtime.ISafeRunnable; |
| import org.eclipse.core.runtime.Platform; |
| import org.eclipse.core.runtime.dynamichelpers.ExtensionTracker; |
| import org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler; |
| import org.eclipse.core.runtime.dynamichelpers.IExtensionTracker; |
| import org.eclipse.swt.widgets.DirectoryDialog; |
| import org.eclipse.swt.widgets.Shell; |
| import org.eclipse.ui.PlatformUI; |
| import org.eclipse.ui.ide.fileSystem.FileSystemContributor; |
| import org.eclipse.ui.internal.ide.IDEWorkbenchMessages; |
| import org.eclipse.ui.internal.ide.IDEWorkbenchPlugin; |
| import org.eclipse.ui.internal.ide.dialogs.IDEResourceInfoUtils; |
| |
| /** |
| * @since 3.2 |
| * |
| */ |
| public class FileSystemSupportRegistry implements IExtensionChangeHandler { |
| |
| private static final String FILESYSTEM_SUPPORT = "filesystemSupport";//$NON-NLS-1$ |
| |
| protected static final String ATT_CLASS = "class"; //$NON-NLS-1$ |
| |
| private static final String LABEL = "label";//$NON-NLS-1$ |
| |
| private static final String SCHEME = "scheme";//$NON-NLS-1$ |
| |
| private static FileSystemSupportRegistry singleton; |
| |
| /** |
| * Get the instance of the registry. |
| * |
| * @return MarkerSupportRegistry |
| */ |
| public static FileSystemSupportRegistry getInstance() { |
| if (singleton == null) { |
| singleton = new FileSystemSupportRegistry(); |
| } |
| return singleton; |
| } |
| |
| private Collection registeredContributions = new HashSet(0); |
| |
| FileSystemConfiguration defaultConfiguration = new FileSystemConfiguration( |
| FileSystemMessages.DefaultFileSystem_name, new FileSystemContributor() { |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.ui.ide.fileSystem.FileSystemContributor#browseFileSystem(java.lang.String, |
| * org.eclipse.swt.widgets.Shell) |
| */ |
| public URI browseFileSystem(String initialPath, Shell shell) { |
| |
| DirectoryDialog dialog = new DirectoryDialog(shell); |
| dialog |
| .setMessage(IDEWorkbenchMessages.ProjectLocationSelectionDialog_directoryLabel); |
| |
| if (!initialPath.equals(IDEResourceInfoUtils.EMPTY_STRING)) { |
| IFileInfo info = IDEResourceInfoUtils |
| .getFileInfo(initialPath); |
| if (info != null && info.exists()) { |
| dialog.setFilterPath(initialPath); |
| } |
| } |
| |
| String selectedDirectory = dialog.open(); |
| if (selectedDirectory == null) { |
| return null; |
| } |
| return new File(selectedDirectory).toURI(); |
| |
| } |
| }, null); |
| |
| private FileSystemConfiguration[] allConfigurations; |
| |
| /** |
| * Create a new instance of the receiver. |
| */ |
| public FileSystemSupportRegistry() { |
| |
| IExtensionTracker tracker = PlatformUI.getWorkbench() |
| .getExtensionTracker(); |
| IExtensionPoint point = Platform.getExtensionRegistry() |
| .getExtensionPoint(IDEWorkbenchPlugin.IDE_WORKBENCH, |
| FILESYSTEM_SUPPORT); |
| if (point == null) { |
| return; |
| } |
| IExtension[] extensions = point.getExtensions(); |
| // initial population |
| for (int i = 0; i < extensions.length; i++) { |
| IExtension extension = extensions[i]; |
| processExtension(tracker, extension); |
| } |
| tracker.registerHandler(this, ExtensionTracker |
| .createExtensionPointFilter(point)); |
| |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler#addExtension(org.eclipse.core.runtime.dynamichelpers.IExtensionTracker, |
| * org.eclipse.core.runtime.IExtension) |
| */ |
| public void addExtension(IExtensionTracker tracker, IExtension extension) { |
| processExtension(tracker, extension); |
| allConfigurations = null;//Clear the cache |
| } |
| |
| /* |
| * (non-Javadoc) |
| * |
| * @see org.eclipse.core.runtime.dynamichelpers.IExtensionChangeHandler#removeExtension(org.eclipse.core.runtime.IExtension, |
| * java.lang.Object[]) |
| */ |
| public void removeExtension(IExtension extension, Object[] objects) { |
| for (int i = 0; i < objects.length; i++) { |
| registeredContributions.remove(objects[i]); |
| } |
| allConfigurations = null;//Clear the cache |
| |
| } |
| |
| /** |
| * Process the extension and register the result with the tracker. |
| * |
| * @param tracker |
| * @param extension |
| */ |
| private void processExtension(IExtensionTracker tracker, |
| IExtension extension) { |
| IConfigurationElement[] elements = extension.getConfigurationElements(); |
| for (int j = 0; j < elements.length; j++) { |
| IConfigurationElement element = elements[j]; |
| FileSystemConfiguration contribution = newConfiguration(element); |
| registeredContributions.add(contribution); |
| tracker.registerObject(extension, contribution, |
| IExtensionTracker.REF_STRONG); |
| |
| } |
| } |
| |
| /** |
| * Return a new FileSystemContribution. |
| * |
| * @param element |
| * @return FileSystemContribution or <code>null</code> if there is an |
| * exception. |
| */ |
| private FileSystemConfiguration newConfiguration( |
| final IConfigurationElement element) { |
| |
| final FileSystemContributor[] contributors = new FileSystemContributor[1]; |
| final CoreException[] exceptions = new CoreException[1]; |
| |
| Platform.run(new ISafeRunnable() { |
| public void run() { |
| try { |
| contributors[0] = (FileSystemContributor) IDEWorkbenchPlugin |
| .createExtension(element, ATT_CLASS); |
| |
| } catch (CoreException exception) { |
| exceptions[0] = exception; |
| } |
| } |
| |
| /* |
| * (non-Javadoc) Method declared on ISafeRunnable. |
| */ |
| public void handleException(Throwable e) { |
| // Do nothing as Core will handle the logging |
| } |
| }); |
| |
| if (exceptions[0] != null) { |
| return null; |
| } |
| String name = element.getAttribute(LABEL); |
| String fileSystem = element.getAttribute(SCHEME); |
| FileSystemConfiguration config = new FileSystemConfiguration(name, |
| contributors[0], fileSystem); |
| |
| return config; |
| |
| } |
| |
| /** |
| * Return the FileSystemConfiguration defined in the receiver. |
| * |
| * @return FileSystemConfiguration[] |
| */ |
| public FileSystemConfiguration[] getConfigurations() { |
| if (allConfigurations == null) { |
| allConfigurations = new FileSystemConfiguration[registeredContributions |
| .size() + 1]; |
| allConfigurations[0] = defaultConfiguration; |
| |
| Iterator iterator = registeredContributions.iterator(); |
| int index = 0; |
| while (iterator.hasNext()) { |
| allConfigurations[++index] = (FileSystemConfiguration) iterator |
| .next(); |
| } |
| } |
| return allConfigurations; |
| } |
| |
| /** |
| * Return the default file system configuration (the local file system |
| * extension in the ide plug-in). |
| * |
| * @return FileSystemConfiguration |
| */ |
| public FileSystemConfiguration getDefaultConfiguration() { |
| return defaultConfiguration; |
| } |
| |
| /** |
| * Return whether or not there is only one file system registered. |
| * |
| * @return <code>true</code> if there is only one file system. |
| */ |
| public boolean hasOneFileSystem() { |
| return registeredContributions.size() == 0; |
| } |
| } |