/*******************************************************************************
 * Copyright (c) 2002 IBM Corporation and others.
 * All rights reserved.   This program and the accompanying materials
 * are made available under the terms of the Common Public License v0.5
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v05.html
 * 
 * Contributors:
 * IBM - Initial API and implementation
 ******************************************************************************/
package org.eclipse.team.examples.filesystem;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;

import org.eclipse.core.resources.IFile;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.Platform;
import org.eclipse.team.core.TeamException;
import org.eclipse.team.core.sync.IRemoteResource;

/**
 * Class represents a handle to a <code>java.io.File</code> that conforms to
 * the <code>org.eclipse.team.core.IRemoteResource</code> interface.
 */
public class FileSystemRemoteResource implements IRemoteResource {

	// the file object in which the data is stored on the disk
	private File ioFile;

	/**
	 * The constructor.
	 * @param path the full path of the resource on disk
	 */
	public FileSystemRemoteResource(IPath path) {
		this(new File(path.toOSString()));
	}

	/**
	 * Create a remote resource handle from the given java.io.file
	 * 
	 * @param ioFile the file
	 */
	FileSystemRemoteResource(File ioFile) {
		this.ioFile = ioFile;
	}

	/**
	 * Adapters are used to ensure that the right menus will appear in differnet views.
	 * 
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(Class)
	 */
	public Object getAdapter(Class adapter) {
		return Platform.getAdapterManager().getAdapter(this, adapter);
	}

	/**
	 * Returns an input stream containing the contents of the remote resource.
	 * The remote resource must be a file.
	 * 
	 * @see org.eclipse.team.core.sync.IRemoteResource#getContents(IProgressMonitor)
	 */
	public InputStream getContents(IProgressMonitor progress) throws TeamException {
		if (isContainer())
			throw new TeamException("This resource is a container so it cannot have data.");
		try {
			return new FileInputStream(ioFile);
		} catch (FileNotFoundException e) {
			throw FileSystemPlugin.wrapException(e);
		}
	}

	/**
	 * Return the modification timestamp of the remote resource.
	 * 
	 * @return long The date and time (in milliseconds) when the file was last changed on disk.
	 */
	public long getLastModified() {
		return ioFile.lastModified();
	}

	/**
	 * @see org.eclipse.team.core.sync.IRemoteResource#getName()
	 */
	public String getName() {
		return ioFile.getName();
	}

	/**
	 * @see org.eclipse.team.core.sync.IRemoteResource#isContainer()
	 */
	public boolean isContainer() {
		return ioFile.isDirectory();
	}

	/**
	 * Fetch the members of the remote resource. The remote resource must be a 
	 * container.
	 * 
	 * @see org.eclipse.team.core.sync.IRemoteResource#members(IProgressMonitor)
	 */
	public IRemoteResource[] members(IProgressMonitor progress) throws TeamException {
		// Make sure we have a container
		if (!isContainer())
			throw new TeamException(Policy.bind("RemoteResource.mustBeFolder", ioFile.getName()));

		// convert the File children to remote resource children
		File[] members = ioFile.listFiles();
		IRemoteResource[] result = new IRemoteResource[members.length];
		for (int i = 0; i < members.length; i++) {
			result[i] = new FileSystemRemoteResource(members[i]);
		}
		return result;
	}

	/**
	 * copies a single specified file to a specified location on the filesystem.
	 * @param dest The location on the filesystem to which the file is to be copied
	 * @param src The source file
	 */
	static void copyFile(IPath dest, File src) {
		File target = new File(dest.append(src.getName()).toOSString());
		try {
			InputStream in = ((IFile) src).getContents();
			java.io.FileOutputStream out = new java.io.FileOutputStream(target);
			StreamUtil.pipe(in, out, target.length(), null, target.getName());
		} catch (FileNotFoundException e) {} catch (IOException e) {} catch (CoreException e) {}
	}
	/**
	 * Recursively copies an entire directory structure to a specified location on the filesystem
	 * @param dest The location on the filssystem to which the directory structure is to be written
	 * @param src The directory structure that is to be duplicated
	 */
	static void copyFolder(IPath dest, File src) {
		String children[] = src.list();
		File current;
		for (int i = 0; i < children.length; i++) {
			current = new File(children[i]);
			if (current.isFile())
				copyFile(dest.append(src.getName()), current);
			else if (current.isDirectory())
				copyFolder(dest.append(src.getName()), current);
		}
	}

	/**
	 * Creates a copy of the remote resource in the location specified
	 * @param location The destination for the copy of the remote resource
	 */
	public void copyOver(IPath location) {
		copyFolder(location, ioFile);
	}

}