/*******************************************************************************
 *  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.io.*;
import java.net.URI;
import org.eclipse.core.filesystem.*;
import org.eclipse.core.filesystem.provider.FileStore;
import org.eclipse.core.runtime.*;

/**
 * A simple file system implementation that acts as a wrapper around the
 * local file system.
 */
public class WrapperFileStore extends FileStore {
	private final IFileStore baseStore;

	public WrapperFileStore(IFileStore baseStore) {
		this.baseStore = baseStore;
	}

	public static IFileStore newInstance(Class<? extends WrapperFileStore> clazz, IFileStore baseStore) {
		try {
			return clazz.getConstructor(IFileStore.class).newInstance(baseStore);
		} catch (Exception e) {
			// Test infrastructure failure...
			throw new Error(e);
		}
	}

	protected IFileStore createNewWrappedStore(IFileStore store) {
		return newInstance(getClass(), store);
	}

	@Override
	public IFileInfo[] childInfos(int options, IProgressMonitor monitor) throws CoreException {
		return baseStore.childInfos(options, monitor);
	}

	@Override
	public String[] childNames(int options, IProgressMonitor monitor) throws CoreException {
		return baseStore.childNames(options, monitor);
	}

	@Override
	public IFileStore[] childStores(int options, IProgressMonitor monitor) throws CoreException {
		IFileStore[] childStores = baseStore.childStores(options, monitor);
		for (int i = 0; i < childStores.length; i++) {
			// replace ordinary file store with wrapper version
			childStores[i] = createNewWrappedStore(childStores[i]);
		}
		return childStores;
	}

	@Override
	public void copy(IFileStore destination, int options, IProgressMonitor monitor) throws CoreException {
		baseStore.copy(destination, options, monitor);
	}

	@Override
	public void delete(int options, IProgressMonitor monitor) throws CoreException {
		baseStore.delete(options, monitor);
	}

	@Override
	public boolean equals(Object obj) {
		if (obj == this) {
			return true;
		}
		if (!(obj instanceof WrapperFileStore)) {
			return false;
		}
		return baseStore.equals(((WrapperFileStore) obj).baseStore);
	}

	@Override
	public IFileInfo fetchInfo() {
		return baseStore.fetchInfo();
	}

	@Override
	public IFileInfo fetchInfo(int options, IProgressMonitor monitor) throws CoreException {
		return baseStore.fetchInfo(options, monitor);
	}

	public IFileStore getBaseStore() {
		return baseStore;
	}

	@Deprecated
	@Override
	public IFileStore getChild(IPath path) {
		return createNewWrappedStore(baseStore.getChild(path));
	}

	@Override
	public IFileStore getFileStore(IPath path) {
		return createNewWrappedStore(baseStore.getFileStore(path));
	}

	@Override
	public IFileStore getChild(String name) {
		return createNewWrappedStore(baseStore.getChild(name));
	}

	@Override
	public IFileSystem getFileSystem() {
		return WrapperFileSystem.getInstance();
	}

	@Override
	public String getName() {
		return baseStore.getName();
	}

	@Override
	public IFileStore getParent() {
		IFileStore baseParent = baseStore.getParent();
		return baseParent == null ? null : createNewWrappedStore(baseParent);
	}

	@Override
	public int hashCode() {
		return baseStore.hashCode();
	}

	@Override
	public boolean isParentOf(IFileStore other) {
		if (!(other instanceof WrapperFileStore)) {
			return false;
		}
		IFileStore otherBaseStore = ((WrapperFileStore) other).baseStore;
		return baseStore.isParentOf(otherBaseStore);
	}

	@Override
	public IFileStore mkdir(int options, IProgressMonitor monitor) throws CoreException {
		baseStore.mkdir(options, monitor);
		return this;
	}

	@Override
	public void move(IFileStore destination, int options, IProgressMonitor monitor) throws CoreException {
		if (destination instanceof WrapperFileStore) {
			destination = ((WrapperFileStore) destination).baseStore;
		}
		baseStore.move(destination, options, monitor);
	}

	@Override
	public InputStream openInputStream(int options, IProgressMonitor monitor) throws CoreException {
		return baseStore.openInputStream(options, monitor);
	}

	@Override
	public OutputStream openOutputStream(int options, IProgressMonitor monitor) throws CoreException {
		return baseStore.openOutputStream(options, monitor);
	}

	@Override
	public void putInfo(IFileInfo info, int options, IProgressMonitor monitor) throws CoreException {
		baseStore.putInfo(info, options, monitor);
	}

	@Override
	public File toLocalFile(int options, IProgressMonitor monitor) throws CoreException {
		return baseStore.toLocalFile(options, monitor);
	}

	@Override
	public URI toURI() {
		return WrapperFileSystem.getWrappedURI(baseStore.toURI());
	}
}
