/*******************************************************************************
 * 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);
	}
}
