/***************************************************************************************************
 * Copyright (c) 2003, 2004 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.application.internal.operations;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.eclipse.core.commands.ExecutionException;
import org.eclipse.core.commands.operations.IUndoableOperation;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.MultiStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.SubProgressMonitor;
import org.eclipse.jst.j2ee.datamodel.properties.IJ2EEUtilityJarListImportDataModelProperties;
import org.eclipse.jst.j2ee.internal.earcreation.EARCreationResourceHandler;
import org.eclipse.jst.j2ee.internal.plugin.J2EEPlugin;
import org.eclipse.wst.common.frameworks.datamodel.AbstractDataModelOperation;
import org.eclipse.wst.common.frameworks.datamodel.IDataModel;

public class J2EEUtilityJarListImportOperation extends AbstractDataModelOperation implements IUndoableOperation {

	private static final int ASSISTANT_TICKS = 5;

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

	public IStatus execute(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {

		MultiStatus status = new MultiStatus(J2EEPlugin.PLUGIN_ID, 0, EARCreationResourceHandler.J2EEUtilityJarListImportOperation_UI_Import_Utility_Jars, null);  
			
		Object[] utilityJars = (Object[]) model.getProperty(IJ2EEUtilityJarListImportDataModelProperties.UTILITY_JAR_LIST);
		if (utilityJars == null || utilityJars.length == 0)
			return J2EEPlugin.createErrorStatus(0, EARCreationResourceHandler.J2EEUtilityJarListImportOperation_There_were_no_utility_jars_selected, null);

		monitor.beginTask(EARCreationResourceHandler.J2EEUtilityJarListImportOperation_UI_Import_Utility_Jars, utilityJars.length * (1 + ASSISTANT_TICKS)); //$NON-NLS-1$

//		String earProjectName = model.getStringProperty(IJ2EEUtilityJarListImportDataModelProperties.EAR_PROJECT_NAME);
//		boolean isBinary = model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.BINARY_IMPORT);
		
		// if model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.COPY) then
		// isLinked = createProject = false;
		boolean toLinkImportedJars = shouldLinkImportedJars();
		boolean toCreateProject = shouldCreateProject();
		boolean toOverrideProjectRoot = shouldOverrideProjectRoot();  
		boolean toOverwriteIfNecessary = shouldOverwriteIfNecessary();
		
		
		String projectRoot = null;		
		if(toOverrideProjectRoot)
			projectRoot = model.getStringProperty(IJ2EEUtilityJarListImportDataModelProperties.PROJECT_ROOT);
		
		monitor.subTask(EARCreationResourceHandler.J2EEUtilityJarListImportOperation_UI_Preparing_to_import); //$NON-NLS-1$

		String associatedEARProjectName = model.getStringProperty(IJ2EEUtilityJarListImportDataModelProperties.EAR_PROJECT_NAME);		
		
		J2EEUtilityJarImportAssistantOperation assistantOperation = null;
		List utilityJarOperations = new ArrayList();
		File utilityJar = null;
		String linkedPathVariable = null; 
		if(model.isPropertySet(IJ2EEUtilityJarListImportDataModelProperties.LINKED_PATH_VARIABLE))
			linkedPathVariable = model.getStringProperty(IJ2EEUtilityJarListImportDataModelProperties.LINKED_PATH_VARIABLE);
		for (int i = 0; i < utilityJars.length && !monitor.isCanceled(); i++) {
			utilityJar = (File) utilityJars[i];
			if (toCreateProject) { 
				if (!toLinkImportedJars) {
					assistantOperation = new CreateProjectWithExtractedJarOperation(utilityJar, projectRoot); 
				 
				} else {
					assistantOperation = new CreateProjectWithLinkedJarOperation(utilityJar, projectRoot, linkedPathVariable);
					
				} 
			} else { 
				if (!toLinkImportedJars) {
					assistantOperation = new CopyArchiveIntoProjectOperation(utilityJar);
				} else
					assistantOperation = new LinkArchiveIntoProjectOperation(utilityJar, linkedPathVariable);
			} 
			assistantOperation.setAssociatedEARProjectName(associatedEARProjectName); 
			assistantOperation.setOverwriteIfNecessary(toOverwriteIfNecessary);
			utilityJarOperations.add(assistantOperation);

			monitor.worked(1);
		}
		
		for (Iterator iter = utilityJarOperations.iterator(); iter.hasNext() && !monitor.isCanceled();) {
			try {
				assistantOperation = (J2EEUtilityJarImportAssistantOperation) iter.next();
				IProgressMonitor submonitor = new SubProgressMonitor(monitor, ASSISTANT_TICKS);
				assistantOperation.execute(submonitor, null);
				submonitor.done();
			} catch (Exception e) {
				status.add(J2EEPlugin.createErrorStatus(0, e.getMessage(), e));
				J2EEPlugin.logError(0, e.getMessage(), e);
			} 
		} 
		
		monitor.done();
		
		return status;
	}
 
	private boolean shouldOverwriteIfNecessary() {
		return model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.OVERWRITE_IF_NECESSARY);
	}

	protected final boolean shouldImportAsBinary() {
		return model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.BINARY_IMPORT);
	}

	protected final boolean shouldOverrideProjectRoot() {
		return model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.OVERRIDE_PROJECT_ROOT);
	}
 
	protected final  boolean shouldCreateProject() {
		return (model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.CREATE_PROJECT) || model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.CREATE_LINKED_PROJECT));
	}
 
	protected final  boolean shouldLinkImportedJars() {
		return (model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.LINK_IMPORT) || model.getBooleanProperty(IJ2EEUtilityJarListImportDataModelProperties.CREATE_LINKED_PROJECT));
	}

	public IStatus redo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
		return Status.CANCEL_STATUS;
	}

	public IStatus undo(IProgressMonitor monitor, IAdaptable info) throws ExecutionException {
		return Status.CANCEL_STATUS;
	}


 


}
