blob: aca847ed4a0098d5eca644194b9c7ad7eb6aff69 [file] [log] [blame]
/*******************************************************************************
* 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.filesystem.provider;
import java.net.URI;
import java.net.URISyntaxException;
import org.eclipse.core.filesystem.*;
import org.eclipse.core.runtime.*;
/**
* The common superclass for all file system implementations. Instances
* of this class are provided using the <code>org.eclipse.core.filesystem.filesystems</code>
* extension point.
* <p>
* On creation, the <code>setInitializationData</code> method is called with
* any parameter data specified in the declaring plug-in's manifest.
* </p>
* <p>
* Clients may subclass this class.
* </p>
* @since org.eclipse.core.filesystem 1.0
*/
public abstract class FileSystem extends PlatformObject implements IFileSystem {
private String scheme;
/**
* Creates a new file system instance.
*/
public FileSystem() {
super();
}
/**
* This is the default implementation of {@link IFileSystem#attributes()}.
* This implementation always returns <code>0</code>.
* Subclasses may override this method.
*
* @return The attributes supported by this file system
* @see IFileSystem#attributes()
*/
@Override
public int attributes() {
return 0;
}
/**
* This is the default implementation of {@link IFileSystem#canDelete()}.
* This implementation always returns <code>false</code>.
* Subclasses may override this method.
*
* @return <code>true</code> if this file system supports deletion, and
* <code>false</code> otherwise.
* @see IFileSystem#canDelete()
*/
@Override
public boolean canDelete() {
return false;
}
/**
* This is the default implementation of {@link IFileSystem#canWrite()}.
* This implementation always returns <code>false</code>.
* Subclasses may override this method.
*
* @return <code>true</code> if this file system allows modification, and
* <code>false</code> otherwise.
* @see IFileSystem#canWrite()
*/
@Override
public boolean canWrite() {
return false;
}
@Override
public final String getScheme() {
return scheme;
}
/**
* This is the default implementation of {@link IFileSystem#getStore(IPath)}.
* This implementation forwards to {@link IFileSystem#getStore(URI)},
* assuming that the provided path corresponds to the path component of the
* URI for the file store.
* <p>
* Subclasses may override this method. If it is not possible to create a file
* store corresponding to the provided path for this file system, a file store
* belonging to the null file system should be returned
* </p>
*
* @param path A path to a file store within the scheme of this file system.
* @return A handle to a file store in this file system
* @see IFileSystem#getStore(IPath)
* @see EFS#getNullFileSystem()
*/
@Override
public IFileStore getStore(IPath path) {
try {
return getStore(new URI(scheme, path.toString(), null));
} catch (URISyntaxException e) {
return EFS.getNullFileSystem().getStore(path);
}
}
/**
* Subclasses must implement this method to satisfy the contract
* of {@link IFileSystem#getStore(URI)}. If it is not possible to create a file
* store corresponding to the provided URI for this file system, a file store
* belonging to the null file system should be returned
*/
@Override
public abstract IFileStore getStore(URI uri);
/**
* {@inheritDoc}
* <p>
* This default implementation always returns <code>null</code>. Subclasses
* that can efficiently provide an {@link IFileTree} rooted at the given file store
* should override.
* @throws CoreException if fails.
* @see IFileSystem#fetchFileTree(IFileStore, IProgressMonitor)
*/
@Override
public IFileTree fetchFileTree(IFileStore root, IProgressMonitor monitor) throws CoreException {
return null;
}
/**
* {@inheritDoc}
* <p>
* This default implementation always returns <code>null</code>.
* Subclasses may override to provide a concrete mapping from local
* files to an IFileStore in their file system.
*/
@Override
public IFileStore fromLocalFile(java.io.File file) {
return null;
}
/**
* Initializes this file system instance with the provided scheme.
* <p>
* This method is called by the platform immediately after the
* file system instance is created. This method must not be
* called by clients.
*
* @param aScheme The scheme of the file system.
*/
public final void initialize(String aScheme) {
if (aScheme == null)
throw new NullPointerException();
//scheme cannot be changed after creation
if (this.scheme != null)
throw new IllegalStateException("File system already initialized"); //$NON-NLS-1$
this.scheme = aScheme;
}
/**
* This is the default implementation of {@link IFileSystem#isCaseSensitive()}.
* This implementation always returns <code>true</code>. Subclasses may override this method.
*
* @return <code>true</code> if this file system is case sensitive, and
* <code>false</code> otherwise.
* @see IFileSystem#isCaseSensitive()
*/
@Override
public boolean isCaseSensitive() {
return true;
}
}