Copyright (c) 2005, 2015 IBM Corporation and others.
This program and the accompanying materials
are made available under the terms of the Eclipse Public License 2.0
which accompanies this distribution, and is available at
https://www.eclipse.org/legal/epl-2.0/
SPDX-License-Identifier: EPL-2.0
Contributors:
IBM Corporation - initial API and implementation
/*******************************************************************************
* Copyright (c) 2005, 2015 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
*******************************************************************************/
package org.eclipse.core.internal.filesystem;
import java.net.URI;
import java.util.HashMap;
import org.eclipse.core.filesystem.*;
import org.eclipse.core.filesystem.provider.FileSystem;
import org.eclipse.core.runtime.*;
import org.eclipse.osgi.util.NLS;
The class manages internal implementation of methods on EFS.
This includes maintaining a list of file system extensions.
/**
* The class manages internal implementation of methods on EFS.
* This includes maintaining a list of file system extensions.
*/
public class InternalFileSystemCore implements IRegistryChangeListener {
private static final InternalFileSystemCore INSTANCE = new InternalFileSystemCore();
A map (String -> (IConfigurationElement or IFileSystem)) mapping URI
scheme to the file system for that scheme. If the corresponding file
system has never been accessed, then the map contains the configuration
element for the extension. Once the file system has been created, the
map contains the IFileSystem instance for that scheme.
/**
* A map (String -> (IConfigurationElement or IFileSystem)) mapping URI
* scheme to the file system for that scheme. If the corresponding file
* system has never been accessed, then the map contains the configuration
* element for the extension. Once the file system has been created, the
* map contains the IFileSystem instance for that scheme.
*/
private HashMap<String, Object> fileSystems;
Returns the singleton instance of this class.
Returns: The singleton instance.
/**
* Returns the singleton instance of this class.
* @return The singleton instance.
*/
public static InternalFileSystemCore getInstance() {
return INSTANCE;
}
This class has a singleton instance.
/**
* This class has a singleton instance.
*/
private InternalFileSystemCore() {
super();
RegistryFactory.getRegistry().addRegistryChangeListener(this);
}
Implements the method EFS#getFileSystem(String)
Params: - scheme – The URI scheme of the file system
Throws: Returns: The file system
/**
* Implements the method EFS#getFileSystem(String)
*
* @param scheme The URI scheme of the file system
* @return The file system
* @throws CoreException
*/
public IFileSystem getFileSystem(String scheme) throws CoreException {
if (scheme == null)
throw new NullPointerException();
final HashMap<String, Object> registry = getFileSystemRegistry();
Object result = registry.get(scheme);
if (result == null)
Policy.error(EFS.ERROR_INTERNAL, NLS.bind(Messages.noFileSystem, scheme));
if (result instanceof IFileSystem)
return (IFileSystem) result;
try {
IConfigurationElement element = (IConfigurationElement) result;
FileSystem fs = (FileSystem) element.createExecutableExtension("run"); //$NON-NLS-1$
fs.initialize(scheme);
//store the file system instance so we don't have to keep recreating it
registry.put(scheme, fs);
return fs;
} catch (CoreException e) {
//remove this invalid file system from the registry
registry.remove(scheme);
throw e;
}
}
Implements the method EFS#getLocalFileSystem()
Returns: The local file system
/**
* Implements the method EFS#getLocalFileSystem()
*
* @return The local file system
*/
public IFileSystem getLocalFileSystem() {
try {
return getFileSystem(EFS.SCHEME_FILE);
} catch (CoreException e) {
//the local file system is always present
throw new Error(e);
}
}
Implements the method EFS#getStore(URI)
Params: - uri – The URI of the store to retrieve
Throws: Returns: The file store corresponding to the given URI
/**
* Implements the method EFS#getStore(URI)
*
* @param uri The URI of the store to retrieve
* @return The file store corresponding to the given URI
* @throws CoreException
*/
public IFileStore getStore(URI uri) throws CoreException {
final String scheme = uri.getScheme();
if (scheme == null)
Policy.error(EFS.ERROR_INTERNAL, Messages.noScheme + uri);
return getFileSystem(scheme).getStore(uri);
}
Returns the fully initialized file system registry
Returns: The file system registry
/**
* Returns the fully initialized file system registry
* @return The file system registry
*/
private synchronized HashMap<String, Object> getFileSystemRegistry() {
if (fileSystems == null) {
fileSystems = new HashMap<>();
IExtensionPoint point = RegistryFactory.getRegistry().getExtensionPoint(EFS.PI_FILE_SYSTEM, EFS.PT_FILE_SYSTEMS);
IExtension[] extensions = point.getExtensions();
for (IExtension extension : extensions) {
IConfigurationElement[] elements = extension.getConfigurationElements();
for (IConfigurationElement element : elements) {
if ("filesystem".equals(element.getName())) { //$NON-NLS-1$
String scheme = element.getAttribute("scheme"); //$NON-NLS-1$
if (scheme != null) {
fileSystems.put(scheme, element);
}
}
}
}
}
return fileSystems;
}
@Override
public void registryChanged(IRegistryChangeEvent event) {
IExtensionDelta[] changes = event.getExtensionDeltas(EFS.PI_FILE_SYSTEM, EFS.PT_FILE_SYSTEMS);
if (changes.length == 0)
return;
synchronized (this) {
//let the registry be rebuilt lazily
fileSystems = null;
}
}
Implements EFS.getNullFileSystem()
. Returns: The null file system
/**
* Implements {@link EFS#getNullFileSystem()}.
* @return The null file system
*/
public IFileSystem getNullFileSystem() {
try {
return getFileSystem(EFS.SCHEME_NULL);
} catch (CoreException e) {
//the local file system is always present
throw new Error(e);
}
}
}