blob: 855e60bc65c440d03fd2adfbea16453bcd19de11 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2006, 2015 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
* James Blackburn (Broadcom Corp.) - ongoing development
*******************************************************************************/
package org.eclipse.core.tests.internal.filesystem.wrapper;
import java.net.URI;
import java.net.URISyntaxException;
import org.eclipse.core.filesystem.EFS;
import org.eclipse.core.filesystem.IFileStore;
import org.eclipse.core.filesystem.provider.FileSystem;
import org.eclipse.core.runtime.*;
import org.eclipse.core.tests.harness.CoreTest;
import org.eclipse.core.tests.resources.ResourceTest;
/**
* A simple file system implementation that acts as a wrapper around the
* local file system.
* <p>
* Also allows tests to inject a custom FileStore template class (derived from
* {@link WrapperFileStore}). Tests can use {@link #setCustomFileStore(Class)}
* to override default {@link WrapperFileStore} behaviour.
* </p>
*/
public class WrapperFileSystem extends FileSystem {
protected static final IFileStore NULL_ROOT = EFS.getNullFileSystem().getStore(Path.ROOT);
private static final String SCHEME_WRAPPED = "wrapped";
private static volatile WrapperFileSystem instance;
/** Custom file-store wrapper */
private static volatile Class<? extends WrapperFileStore> customFS = WrapperFileStore.class;
public static URI getBasicURI(URI wrappedURI) {
Assert.isLegal(SCHEME_WRAPPED.equals(wrappedURI.getScheme()));
return URI.create(wrappedURI.getQuery());
}
public static synchronized WrapperFileSystem getInstance() {
if (instance != null) {
return instance;
}
return instance = new WrapperFileSystem();
}
/**
* Use fs as the WrapperFileStore to use in this filesystem.
* Allows tests to easily override existing IFileStore behaviour.
* By extending {@link WrapperFileStore} conditions difficult to simulate
* on the LocalFileSystem can be provoked.
*
* @param fs filestore, or null to use default {@link WrapperFileStore}
* based implementation.
*/
public static void setCustomFileStore(Class<? extends WrapperFileStore> fs) {
if (fs == null) {
customFS = WrapperFileStore.class;
} else {
customFS = fs;
}
}
public static URI getWrappedURI(URI baseURI) {
try {
return new URI(SCHEME_WRAPPED, null, baseURI.getPath(), baseURI.toString(), null);
} catch (URISyntaxException e) {
throw new IllegalArgumentException(e.toString());
}
}
public WrapperFileSystem() {
instance = this;
}
@Override
public IFileStore getStore(URI uri) {
Assert.isLegal(SCHEME_WRAPPED.equals(uri.getScheme()));
IFileStore baseStore;
try {
baseStore = EFS.getStore(getBasicURI(uri));
} catch (CoreException e) {
CoreTest.log(ResourceTest.PI_RESOURCES_TESTS, e);
return NULL_ROOT;
}
return WrapperFileStore.newInstance(customFS, baseStore);
}
}