package net.sourceforge.phpeclipse.builder;

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;

import net.sourceforge.phpeclipse.PHPeclipsePlugin;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.jface.text.IDocument;
import org.eclipse.ui.editors.text.StorageDocumentProvider;

/**
 * @author ed
 * @version 1.0, May 19, 2003
 */
public class ExternalStorageDocumentProvider extends StorageDocumentProvider {

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.texteditor.AbstractDocumentProvider#doSaveDocument(org.eclipse.core.runtime.IProgressMonitor,
	 *      java.lang.Object, org.eclipse.jface.text.IDocument, boolean)
	 */
	protected void doSaveDocument(IProgressMonitor monitor, Object element,
			IDocument document, boolean overwrite) throws CoreException {
		if (element instanceof ExternalEditorInput) {
			ExternalEditorInput external = (ExternalEditorInput) element;
			FileStorage storage = (FileStorage) external.getStorage();
			String encoding = getEncoding(element);
			if (encoding == null)
				encoding = getDefaultEncoding();
			try {
				InputStream stream = new ByteArrayInputStream(document.get()
						.getBytes(encoding));
				try {
					// inform about the upcoming content change
					fireElementStateChanging(element);
					storage.setContents(stream, overwrite, true, monitor);
				} catch (RuntimeException e) {
					// inform about failure
					fireElementStateChangeFailed(element);
					throw e;
				}
			} catch (IOException e) {
				IStatus s = new Status(IStatus.ERROR,
						PHPeclipsePlugin.PLUGIN_ID, IStatus.OK, e.getMessage(),
						e);
				throw new CoreException(s);
			}

		} else {
			super.doSaveDocument(monitor, element, document, overwrite);
		}
	}

}