/*******************************************************************************
 * Copyright (c) 2003, 2007 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
 *******************************************************************************/
package org.eclipse.jst.j2ee.internal.archive.operations;

import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jem.util.emf.workbench.ProjectUtilities;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Archive;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.SaveStrategy;
import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEComponentImportDataModelProperties;
import org.eclipse.jst.j2ee.internal.archive.ArchiveWrapper;
import org.eclipse.jst.j2ee.internal.archive.ComponentArchiveSaveAdapter;
import org.eclipse.jst.j2ee.internal.archive.ConnectorComponentArchiveSaveAdapter;
import org.eclipse.jst.j2ee.internal.common.classpath.J2EEComponentClasspathUpdater;
import org.eclipse.jst.j2ee.internal.project.ProjectSupportResourceHandler;
import org.eclipse.jst.jee.archive.ArchiveOptions;
import org.eclipse.jst.jee.archive.IArchive;
import org.eclipse.jst.jee.archive.IArchiveFactory;
import org.eclipse.wst.common.componentcore.ComponentCore;
import org.eclipse.wst.common.componentcore.datamodel.properties.IFacetProjectCreationDataModelProperties;
import org.eclipse.wst.common.componentcore.resources.IVirtualComponent;
import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;
import org.eclipse.wst.common.frameworks.internal.enablement.nonui.WFTWrappedException;

public abstract class J2EEArtifactImportOperation extends AbstractDataModelOperation {

	/**
	 * @deprecated use {@link #archiveWrapper}
	 */
	protected Archive moduleFile;
	protected ArchiveWrapper archiveWrapper;
	protected IVirtualComponent virtualComponent;
	protected IAdaptable info;
	protected final int PROJECT_CREATION_WORK = 30;
	
	private static IArchiveFactory archiveFactory = IArchiveFactory.INSTANCE;

	public J2EEArtifactImportOperation(IDataModel model) {
		super(model);
	}

	public IStatus execute(IProgressMonitor monitor, IAdaptable anInfo) throws ExecutionException {
		try {
			J2EEComponentClasspathUpdater.getInstance().pauseUpdates();
			this.info = anInfo;
			moduleFile = (Archive) model.getProperty(IJ2EEComponentImportDataModelProperties.FILE);
			archiveWrapper = (ArchiveWrapper)model.getProperty(IJ2EEComponentImportDataModelProperties.ARCHIVE_WRAPPER);
			monitor.beginTask(ProjectSupportResourceHandler.getString(ProjectSupportResourceHandler.Importing_archive, new Object [] { archiveWrapper.getPath() }), computeTotalWork());
			doExecute(monitor);
			return OK_STATUS;
		} finally {
			try {
				if (virtualComponent != null) {
					J2EEComponentClasspathUpdater.getInstance().queueUpdate(virtualComponent.getProject());
				}
			} finally {
				J2EEComponentClasspathUpdater.getInstance().resumeUpdates();
				model.dispose();
				monitor.done();
			}
		}
	}

	protected int computeTotalWork() {
		return PROJECT_CREATION_WORK + archiveWrapper.getSize();
	}
	
	/**
	 * Subclasses overriding this method should also override {@link #computeTotalWork()}
	 * @param monitor
	 * @throws ExecutionException
	 */
	protected void doExecute(IProgressMonitor monitor) throws ExecutionException {
		IDataModel nestedModel = model.getNestedModel(IJ2EEComponentImportDataModelProperties.NESTED_MODEL_J2EE_COMPONENT_CREATION);
		IProgressMonitor subMonitor = new SubProgressMonitor(monitor, PROJECT_CREATION_WORK);
		virtualComponent = createVirtualComponent(nestedModel, subMonitor);

		try {
			importModuleFile(new SubProgressMonitor(monitor, archiveWrapper.getSize()));
		} catch (InvocationTargetException e) {
			throw new ExecutionException(e.getMessage(), e);
		} catch (InterruptedException e) {
			throw new ExecutionException(e.getMessage(), e);
		}
	}

	protected IVirtualComponent createVirtualComponent(IDataModel aModel, IProgressMonitor monitor) throws ExecutionException {
		try {
			aModel.getDefaultOperation().execute(monitor, info);
			String projectName = aModel.getStringProperty(IFacetProjectCreationDataModelProperties.FACET_PROJECT_NAME);
			IProject project = ProjectUtilities.getProject(projectName);
			return ComponentCore.createComponent(project);
		} finally {
			monitor.done();
		}
	}

	/**
	 * Creates the appropriate save strategy. Subclases should overwrite this method to create the
	 * appropriate save startegy for the kind of J2EE module project to import the archive
	 */
	protected abstract SaveStrategy createSaveStrategy(IVirtualComponent vc);

	protected void modifyStrategy(SaveStrategy saveStrat) {
	}
	
	protected ComponentArchiveSaveAdapter getArchiveSaveAdapter(IVirtualComponent virtualComponent){
		return new ConnectorComponentArchiveSaveAdapter(virtualComponent);
	}

	/**
	 * perform the archive import operation
	 * 
	 * @throws java.lang.reflect.InvocationTargetException
	 * @throws java.lang.InterruptedException
	 */
	protected void importModuleFile(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
		try {
			monitor.beginTask(null, archiveWrapper.getSize());
			if(archiveWrapper.getIArchive() != null){
				IArchive archive = archiveWrapper.getIArchive();
				ComponentArchiveSaveAdapter adap = getArchiveSaveAdapter(virtualComponent);
				ArchiveOptions saveOptions = new ArchiveOptions();
				saveOptions.setOption(ArchiveOptions.SAVE_ADAPTER, adap);
				archiveFactory.saveArchive(archive, saveOptions,monitor);
			}else{
				ComponentSaveStrategyImpl aStrategy = (ComponentSaveStrategyImpl) createSaveStrategy(virtualComponent);
				aStrategy.setProgressMonitor(monitor);
				aStrategy.setOverwriteHandler((IOverwriteHandler) model.getProperty(IJ2EEComponentImportDataModelProperties.OVERWRITE_HANDLER));
				aStrategy.setDataModel(model);
				modifyStrategy(aStrategy);
				archiveWrapper.getCommonArchive().save(aStrategy);
			}
			
		} catch (OverwriteHandlerException oe) {
			throw new InterruptedException();
		} catch (Exception ex) {
			throw new WFTWrappedException(ex, EJBArchiveOpsResourceHandler.ERROR_IMPORTING_MODULE_FILE);
		} finally {
			monitor.done();
		}
	}

}
