package net.sourceforge.phpeclipse.builder;

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

import net.sourceforge.phpdt.internal.ui.util.StreamUtil;
import net.sourceforge.phpeclipse.PHPeclipsePlugin;

import org.eclipse.core.resources.IStorage;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.PlatformObject;
import org.eclipse.core.runtime.Status;

/*
 * (c) Copyright QNX Software Systems Ltd. 2002.
 * All Rights Reserved.
 */

/**
 *
 * @see IStorage
 */
public class FileStorage extends PlatformObject implements IStorage {
	 private boolean forceReadOnly;
	 private final IPath path;
	 private final File file;

	 /**
		* Two FileStorages are equal if their IPaths are equal.
		* @see java.lang.Object#equals(java.lang.Object)
		*/
	 public boolean equals(Object obj) {
			if (this == obj)
				 return true;
			if (!(obj instanceof FileStorage))
				 return false;
			FileStorage other = (FileStorage) obj;
			return path.equals(other.path);
	 }

	 /* (non-Javadoc)
		* @see org.eclipse.core.resources.IStorage#getContents()
		*/
	 public InputStream getContents() throws CoreException {
			try {
				 return new FileInputStream(file);
			} catch (FileNotFoundException e) {
				 throw new CoreException(new Status(IStatus.ERROR, PHPeclipsePlugin.PLUGIN_ID, IStatus.ERROR, e.toString(), e));
			}
	 }

	 /* (non-Javadoc)
		* @see org.eclipse.core.resources.IStorage#getFullPath()
		*/
	 public IPath getFullPath() {
			return this.path;
	 }

	 /* (non-Javadoc)
		* @see org.eclipse.core.resources.IStorage#getName()
		*/
	 public String getName() {
			return this.path.lastSegment();
	 }

	 /* (non-Javadoc)
		* @see org.eclipse.core.resources.IStorage#isReadOnly()
		*/
	 public boolean isReadOnly() {
			return forceReadOnly || !file.canWrite();
	 }

	 /**
		* Method FileStorage.
		* @param path
		*/
	 public FileStorage(IPath path) {
			this.path = path;
			this.file = path.toFile();
	 }

	 /* (non-Javadoc)
		* @see java.lang.Object#toString()
		*/
	 public String toString() {
			return path.toOSString();
	 }

	 /**
		* @param stream
		* @param overwrite
		* @param b
		* @param monitor
		*/
	 public void setContents(InputStream stream, boolean overwrite, boolean b, IProgressMonitor monitor) throws CoreException {
			try {
				StreamUtil.transferStreams(stream, new FileOutputStream(file));
			} catch (FileNotFoundException e) {
				 throw new CoreException(new Status(IStatus.ERROR, PHPeclipsePlugin.PLUGIN_ID, IStatus.ERROR, e.toString(), e));
			} catch (IOException e) {
				 throw new CoreException(new Status(IStatus.ERROR, PHPeclipsePlugin.PLUGIN_ID, IStatus.ERROR, e.toString(), e));
			}
	 }

	 /**
		* Some document providers (notably CompilationUnitDocumentProvider)
		* can't handle read/write storage.
		*/
	 public void setReadOnly() {
			forceReadOnly = true;
	 }
}