/*******************************************************************************
 * Copyright (c) 2003, 2005 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.delete;


import java.lang.reflect.InvocationTargetException;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;

/**
 * Do not use this.  It will be deleted in 3.0
 * 
 * @deprecated
 *
 */
public class DeleteModuleOperation { //extends WTPOperation {

	protected void execute(IProgressMonitor monitor) throws CoreException, InvocationTargetException, InterruptedException {
		// TODO Auto-generated method stub
		
	}

//	protected DeleteOptions options;
//	/*
//	 * key is an EAREditModel and the value is a list of delete commands. We cache the commands and
//	 * execute later because the modules still need to exist when we go to remove module dependency
//	 * references.
//	 */
//	protected Map deferredCommands;
//	protected IProgressMonitor monitor;
//	protected DeleteModuleDependencyOperation deleteModuleDependencyOperation;
//	protected LooseComposedEditModel deleteEditModel;
//	protected List dirtyEarModels;
//
//	protected static String EDIT_MODEL_KEY = "DELETE_MODULES"; //$NON-NLS-1$
//
//	public DeleteModuleOperation(DeleteOptions options) {
//		this.options = options;
//	}
//
//	/**
//	 * @see HeadlessJ2EEOperation#execute(IProgressMonitor)
//	 */
//	protected void execute(IProgressMonitor aMonitor) throws CoreException, InvocationTargetException, InterruptedException {
//		this.monitor = aMonitor;
//		try {
//			buildDeleteCommandsIfNecessary();
//			if (options.shouldDeleteModuleDependencies()) {
//				deleteModuleDependencies();
//			}
//			checkIfEarsAreDirty();
//			executeDeferredCommands();
//			saveModelsIfNecessary();
//		} finally {
//			releaseModels();
//		}
//
//	}
//
//	protected void checkIfEarsAreDirty() {
//		dirtyEarModels = new ArrayList();
//		if (deferredCommands == null)
//			return;
//		Iterator models = deferredCommands.keySet().iterator();
//		while (models.hasNext()) {
//			EAREditModel model = (EAREditModel) models.next();
//			if (model.isDirty() && !dirtyEarModels.contains(model)) {
//				dirtyEarModels.add(model);
//			}
//		}
//	}
//
//	protected void buildDeleteCommandsIfNecessary() {
//		if (deferredCommands != null && !deferredCommands.isEmpty())
//			return;
//		deferredCommands = new HashMap();
//		List earProjects = EARNatureRuntime.getAllEARProjectsInWorkbench();
//		for (int i = 0; i < earProjects.size(); i++) {
//			IProject p = (IProject) earProjects.get(i);
//			if (options.getSelectedProjects().contains(p))
//				return;
//			EARNatureRuntime runtime = EARNatureRuntime.getRuntime(p);
//			if (runtime != null)
//				buildDeleteCommands(runtime);
//		}
//	}
//
//	protected void buildDeleteCommands(EARNatureRuntime runtime) {
//		List commands = new ArrayList();
//		EAREditModel model = runtime.getEarEditModelForWrite(this);
//		List projects = options.getModuleAndUtilityProjects();
//		try {
//			if (options.shouldDeleteModules()) {
//				for (int i = 0; i < projects.size(); i++) {
//					IProject project = (IProject) projects.get(i);
//					Module m = runtime.getModule(project);
//					if (m != null)
//						commands.add(new RemoveModuleFromEARProjectCommand(m, runtime.getProject()));
//					else {
//						String uri = runtime.getJARUri(project);
//						if (uri != null)
//							commands.add(new RemoveUtilityJARMapCommand(runtime.getProject(), uri, project));
//					}
//				}
//			}
//			if (!commands.isEmpty())
//				deferredCommands.put(model, commands);
//			else
//				model.releaseAccess(this);
//		} catch (RuntimeException e) {
//			model.releaseAccess(this);
//			throw e;
//		} catch (Error err) {
//			model.releaseAccess(this);
//			throw err;
//		}
//	}
//
//	/**
//	 * Do this for unhandled exceptions
//	 */
//	protected void releaseModels() {
//		if (deleteEditModel != null) {
//			//TODO - RLS, 2/19/2004 we need to revisit the whole notion of the loose composed edit
//			//model beccause this does not release the nested models as expected, also it looks
//			// like
//			// the delete edit model is never created which means validate edit is not happening
//			//TODO - JAS when you look at this class to clean up the above, also look at
//			// RenameModuleOperation
//			//because it has the same kind of mess
//			deleteEditModel.releaseAccess(this);
//			deleteEditModel = null;
//		}
//		if (deferredCommands != null) {
//			Iterator iter = deferredCommands.keySet().iterator();
//			while (iter.hasNext()) {
//				EditModel editModel = (EditModel) iter.next();
//				editModel.releaseAccess(this);
//				iter.remove();
//			}
//		}
//	}
//
//	public void release() {
//		releaseModels();
//	}
//
//	/**
//	 * After a normal execution flow, save the models if necessary
//	 */
//	protected void saveModelsIfNecessary() {
//		if (deferredCommands == null)
//			return;
//		Iterator models = deferredCommands.keySet().iterator();
//		while (models.hasNext()) {
//			EAREditModel model = (EAREditModel) models.next();
//			if (model.isDirty()) {
//				if (dirtyEarModels.contains(model)) {
//					model.saveIfNecessary(this);
//				} else {
//					model.save(this);
//				}
//			}
//		}
//	}
//
//	protected void deleteModuleDependencies() throws InvocationTargetException, InterruptedException {
//		getDeleteModuleDependencyOperation().run(monitor);
//	}
//
//	protected DeleteModuleDependencyOperation getDeleteModuleDependencyOperation() {
//		if (deleteModuleDependencyOperation == null) {
//			List earEditModels = new ArrayList();
//			Iterator iter = deferredCommands.keySet().iterator();
//			while (iter.hasNext())
//				earEditModels.add(((EAREditModel) iter.next()).getEARNature());
//			deleteModuleDependencyOperation = new DeleteModuleDependencyOperation(earEditModels, new HashSet(options.getModuleAndUtilityProjects()));
//		}
//		return deleteModuleDependencyOperation;
//	}
//
//	protected void executeDeferredCommands() {
//		Iterator it = deferredCommands.entrySet().iterator();
//		while (it.hasNext()) {
//			Map.Entry entry = (Map.Entry) it.next();
//			List commands = (List) entry.getValue();
//			executeCommands(commands);
//
//		}
//	}
//
//	protected void executeCommands(List commands) {
//		for (int i = 0; i < commands.size(); i++) {
//			Command cmd = (Command) commands.get(i);
//			cmd.execute();
//		}
//	}
//
//	/**
//	 * Return a list of all the non-resource files that will get modified as a result of running
//	 * this operation; used for validate edit.
//	 */
//	protected List getAffectedNonResourceFiles() {
//		if (options.shouldDeleteModuleDependencies())
//			return getDeleteModuleDependencyOperation().getAffectedFiles();
//		return Collections.EMPTY_LIST;
//	}
//
//	/**
//	 * Use this only for validate edits
//	 */
//	public ComposedEditModel getDeleteEditModel() {
//		if (deleteEditModel == null)
//			initializeDeleteEditModel();
//		return deleteEditModel;
//	}
//
//	protected void initializeDeleteEditModel() {
//		if (options.getAllProjectsToDelete().size() == 0) {
//			throw new RuntimeException(J2EECreationResourceHandler.getString("DeleteModuleOperation_UI_0")); //$NON-NLS-1$
//		}
//
//		buildDeleteCommandsIfNecessary();
//		IProject project = null;
//		project = (IProject) options.getAllProjectsToDelete().get(0);
//
//		deleteEditModel = new LooseComposedEditModel(EDIT_MODEL_KEY, (EMFWorkbenchContext) WorkbenchResourceHelper.getEMFContext(project)) {
//
//			/**
//			 * @see org.eclipse.jst.j2ee.internal.internal.workbench.EditModel#getNonResourceFiles()
//			 */
//			public List getNonResourceFiles() {
//				List result = super.getNonResourceFiles();
//				result.addAll(getAffectedNonResourceFiles());
//				return result;
//			}
//		};
//
//		Iterator it = deferredCommands.keySet().iterator();
//		while (it.hasNext()) {
//			deleteEditModel.addChild((J2EEEditModel) it.next());
//		}
//	}
//
//	public IStatus getStatus() {
//		return deleteModuleDependencyOperation.getStatus();
//	}

}
