/*******************************************************************************
 * Copyright (c) 2008-2011 Chair for Applied Software Engineering,
 * Technische Universitaet Muenchen.
 * 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:
 * emueller
 ******************************************************************************/
package org.eclipse.emf.emfstore.internal.client.importexport;

import java.io.File;
import java.io.IOException;

import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;

/**
 * Generic export/import controller whose main responsibility it is to actually
 * execute an {@link IExportImportController}.
 * 
 * @author emueller
 */
public class ExportImportControllerExecutor {

	private final File file;
	private final IProgressMonitor monitor;
	private IOException importExportError;

	/**
	 * Constructor.
	 * 
	 * @param file
	 *            the file that should be exported/imported
	 * @param monitor
	 *            a ProgressMonitor to inform about the progress of the export/import process
	 */
	public ExportImportControllerExecutor(File file, IProgressMonitor monitor) {
		this.file = file;
		this.monitor = monitor;
	}

	/**
	 * Executes the given {@link IExportImportController}.
	 * 
	 * @param controller
	 *            the controller to be executed
	 * @throws IOException
	 *             in case an error occurs during export/import
	 */
	public void execute(final IExportImportController controller) throws IOException {

		final String action = controller.isExport() ? "Exporting " : "Importing ";

		new EMFStoreCommand() {
			@Override
			protected void doRun() {
				monitor.beginTask(action + controller.getLabel(), 100);
				// TODO: let export controllers set worked state
				monitor.worked(10);
				try {
					controller.execute(file, monitor);
				} catch (final IOException e) {
					importExportError = e;
				}
				// / TODO
				monitor.worked(30);
				monitor.worked(60);
				monitor.done();
			}
		}.run(false);

		if (importExportError != null) {
			throw importExportError;
		}
	}
}
