[106709] Finish up clean work directory. Perform stop, clean, and restart in a job.
diff --git a/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/CleanWorkDirDialog.java b/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/CleanWorkDirDialog.java
index 11ae105..d3fa4d2 100644
--- a/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/CleanWorkDirDialog.java
+++ b/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/CleanWorkDirDialog.java
@@ -11,9 +11,13 @@
 package org.eclipse.jst.server.tomcat.ui.internal;
 
 import org.eclipse.core.runtime.CoreException;
+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.jobs.IJobChangeEvent;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.core.runtime.jobs.JobChangeAdapter;
 import org.eclipse.jface.dialogs.Dialog;
 import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jst.server.core.IWebModule;
@@ -31,6 +35,7 @@
 import org.eclipse.wst.server.core.IModule;
 import org.eclipse.wst.server.core.IServer;
 import org.eclipse.wst.server.core.IServer.IOperationListener;
+import org.eclipse.wst.server.core.internal.ServerSchedulingRule;
 
 /**
  * Dialog to confirm deletion of the work directory for a module on a
@@ -59,7 +64,7 @@
 	protected IModule module;
 	protected int state;
 	protected String mode;
-	protected IStatus resultStatus = Status.OK_STATUS;
+	protected IStatus completionStatus = Status.OK_STATUS;
 	
 	/**
 	 * Creates a dialog instance confirm deletion of the work directory for a
@@ -82,16 +87,6 @@
 		
 	}
 	
-	/**
-	 * Get the IStatus result from the stop, deletion, and start operations.
-	 * 
-	 * @return returns operation result.  Will be Status.OK_STATUS if
-	 * all operations complete successfully.  The error status if not.
-	 */
-	public IStatus getResultStatus() {
-		return resultStatus;
-	}
-
 	protected void configureShell(Shell newShell) {
 		super.configureShell(newShell);
 		newShell.setText(Messages.confirmCleanWorkDirTitle);
@@ -103,7 +98,6 @@
 
 		// create a composite with standard margins and spacing
 		Composite composite = (Composite)super.createDialogArea(parent);
-//		PlatformUI.getWorkbench().getHelpSystem().setHelp(composite, ContextIds.DELETE_SERVER_DIALOG);
 
 		Label label = new Label(composite, SWT.WRAP);
 		if (state == IServer.STATE_STARTING || state == IServer.STATE_STOPPING || state == IServer.STATE_UNKNOWN) {
@@ -146,88 +140,120 @@
 	}
 
 	protected void okPressed() {
-		// If state has changed since dialog was open, abort
-		if (server.getServerState() != state) {
-			newResultStatus(ERROR_PREDELETE, Messages.errorCouldNotCleanStateChange, null);
-			super.cancelPressed();
-			return;
-		}
+		// Create job to perform the deletion
+		DeleteWorkDirJob job = new DeleteWorkDirJob(Messages.cleanServerTask);
+		job.setRule(new ServerSchedulingRule(server));
 		
-		IOperationListener listener = new IOperationListener() {
-			public void done(IStatus result) {
-				resultStatus = result;
+		job.addJobChangeListener(new JobChangeAdapter() {
+			public void done(IJobChangeEvent event) {
+				IStatus status = event.getResult();
+				if (!status.isOK()) {
+					String title = module != null ? Messages.errorCleanModuleTitle : Messages.errorCleanServerTitle;
+					String message = "Message unset";
+					switch (status.getCode()) {
+					case CleanWorkDirDialog.ERROR_PREDELETE:
+						message = module != null ?
+								NLS.bind(Messages.errorCouldNotCleanModule, module.getName(), server.getName()) :
+									NLS.bind(Messages.errorCouldNotCleanServer, server.getName());
+						break;
+					case CleanWorkDirDialog.ERROR_DURINGDELETE:
+						message = module != null ?
+								NLS.bind(Messages.errorCleanFailedModule, module.getName(), server.getName()) :
+									NLS.bind(Messages.errorCleanFailedServer, server.getName());
+						break;
+					default:
+						message = module != null ?
+								NLS.bind(Messages.errorCleanNoRestartModule, module.getName()) :
+									NLS.bind(Messages.errorCleanNoRestartServer, server.getName());
+						break;
+					}
+					TomcatUIPlugin.openError(title, message, status);
+				}
 			}
-		};
-		boolean restart = false;
-		// If server isn't stopped, try to stop, clean, and restart
-		if (state != IServer.STATE_STOPPED) {
-			resultStatus = server.canStop();
-			if (!resultStatus.isOK()) {
-				wrapResultStatus(ERROR_PREDELETE, Messages.errorCouldNotCleanCantStop);
-				super.cancelPressed();
-				return;
-			}
-
-			server.stop(false, listener);
-
-			if (!resultStatus.isOK()) {
-				wrapResultStatus(ERROR_PREDELETE, Messages.errorCouldNotCleanStopFailed);
-				super.cancelPressed();
-				return;
-			}
-			if (server.getServerState() != IServer.STATE_STOPPED) {
-				newResultStatus(ERROR_PREDELETE, Messages.errorCouldNotCleanStopFailed, null);
-				super.cancelPressed();
-				return;
-			}
-			restart = true;
+		});
+		
+		job.schedule();
+		
+		super.okPressed();
+	}
+	
+	class DeleteWorkDirJob extends Job {
+		/**
+		 * @param name name for job
+		 */
+		public DeleteWorkDirJob(String name) {
+			super(name);
 		}
-			
-		// Delete the work directory
-		TomcatServerBehaviour tsb = (TomcatServerBehaviour)server.loadAdapter(
-				TomcatServerBehaviour.class, null);
-		try {
-			if (module != null) {
-				IWebModule webModule = (IWebModule)module.loadAdapter(IWebModule.class, null);
-				if (webModule != null) {
-					ITomcatWebModule tcWebModule = new WebModule(webModule.getContextRoot(), "", "", true);
-					resultStatus = tsb.cleanContextWorkDir(tcWebModule, null);
+
+		protected IStatus run(IProgressMonitor monitor) {
+			// If state has changed since dialog was open, abort
+			if (server.getServerState() != state) {
+				return newErrorStatus(ERROR_PREDELETE, Messages.errorCouldNotCleanStateChange, null);
+			}
+
+			IOperationListener listener = new IOperationListener() {
+				public void done(IStatus result) {
+					completionStatus = result;
+				}
+			};
+			boolean restart = false;
+			IStatus status = Status.OK_STATUS;
+			// If server isn't stopped, try to stop, clean, and restart
+			if (state != IServer.STATE_STOPPED) {
+				status = server.canStop();
+				if (!status.isOK()) {
+					return wrapErrorStatus(status, ERROR_PREDELETE, Messages.errorCouldNotCleanCantStop);
+				}
+
+				server.stop(false, listener);
+
+				if (!completionStatus.isOK()) {
+					return wrapErrorStatus(completionStatus, ERROR_PREDELETE, Messages.errorCouldNotCleanStopFailed);
+				}
+				if (server.getServerState() != IServer.STATE_STOPPED) {
+					return newErrorStatus(ERROR_PREDELETE, Messages.errorCouldNotCleanStopFailed, null);
+				}
+				restart = true;
+			}
+				
+			// Delete the work directory
+			TomcatServerBehaviour tsb = (TomcatServerBehaviour)server.loadAdapter(
+					TomcatServerBehaviour.class, monitor);
+			try {
+				if (module != null) {
+					IWebModule webModule = (IWebModule)module.loadAdapter(IWebModule.class, null);
+					if (webModule != null) {
+						ITomcatWebModule tcWebModule = new WebModule(webModule.getContextRoot(), "", "", true);
+						status = tsb.cleanContextWorkDir(tcWebModule, null);
+					}
+					else {
+						return newErrorStatus(ERROR_DURINGDELETE, 
+								restart ? Messages.errorCantIdentifyWebAppWasRunning : Messages.errorCantIdentifyWebApp, null);
+					}
 				}
 				else {
-					newResultStatus(ERROR_DURINGDELETE, 
-							restart ? Messages.errorCantIdentifyWebAppWasRunning : Messages.errorCantIdentifyWebApp, null);
-					super.cancelPressed();
-					return;
+					status = tsb.cleanServerWorkDir(null);
+				}
+			} catch (CoreException ce) {
+				status = ce.getStatus();
+			}
+			if (!status.isOK()) {
+				return wrapErrorStatus(status, ERROR_DURINGDELETE,
+						restart ? Messages.errorErrorDuringCleanWasRunning : Messages.errorErrorDuringClean);
+			}
+				
+			if (restart) {
+				status = server.canStart(mode);
+				if (!status.isOK()) {
+					return wrapErrorStatus(status, ERROR_POSTDELETE, Messages.errorCleanCantRestart);
+				}
+				server.start(mode, listener);
+				if (!completionStatus.isOK()) {
+					return wrapErrorStatus(completionStatus, ERROR_POSTDELETE, Messages.errorCleanRestartFailed);
 				}
 			}
-			else
-				resultStatus = tsb.cleanServerWorkDir(null);
-		} catch (CoreException ce) {
-			resultStatus = ce.getStatus();
+			return status;
 		}
-		if (!resultStatus.isOK()) {
-			wrapResultStatus(ERROR_DURINGDELETE,
-					restart ? Messages.errorErrorDuringCleanWasRunning : Messages.errorErrorDuringClean);
-			super.cancelPressed();
-			return;
-		}
-			
-		if (restart) {
-			resultStatus = server.canStart(mode);
-			if (!resultStatus.isOK()) {
-				wrapResultStatus(ERROR_POSTDELETE, Messages.errorCleanCantRestart);
-				super.cancelPressed();
-				return;
-			}
-			server.start(mode, listener);
-			if (!resultStatus.isOK()) {
-				wrapResultStatus(ERROR_POSTDELETE, Messages.errorCleanRestartFailed);
-				super.cancelPressed();
-				return;
-			}
-		}
-
-		super.okPressed();
 	}
 	
 	private void captureServerState() {
@@ -237,14 +263,14 @@
 		}
 	}
 
-	private void newResultStatus(int errorCode, String message, Throwable throwable) {
-		resultStatus = new Status(IStatus.ERROR, TomcatUIPlugin.PLUGIN_ID, errorCode,
+	protected IStatus newErrorStatus(int errorCode, String message, Throwable throwable) {
+		return new Status(IStatus.ERROR, TomcatUIPlugin.PLUGIN_ID, errorCode,
 				message, throwable);
 	}
 	
-	private void wrapResultStatus(int errorCode, String message) {
+	protected IStatus wrapErrorStatus(IStatus status, int errorCode, String message) {
 		MultiStatus ms = new MultiStatus(TomcatUIPlugin.PLUGIN_ID, errorCode, message, null);
-		ms.add(resultStatus);
-		resultStatus = ms;
+		ms.add(status);
+		return ms;
 	}
 }
\ No newline at end of file
diff --git a/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/Messages.java b/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/Messages.java
index 0062a67..d296b17 100644
--- a/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/Messages.java
+++ b/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/Messages.java
@@ -69,6 +69,7 @@
 	public static String cleanModuleWorkDir;
 	public static String cleanServerWorkDir;
 	public static String cleanServerRunning;
+	public static String cleanServerTask;
 	public static String errorCleanModuleTitle;
 	public static String errorCleanServerTitle;
 	public static String errorCouldNotCleanModule;
diff --git a/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/Messages.properties b/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/Messages.properties
index db22647..d9763c3 100644
--- a/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/Messages.properties
+++ b/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/Messages.properties
@@ -84,6 +84,7 @@
 cleanModuleWorkDir=Clean work directory for module {0} on {1}.
 cleanServerWorkDir=Clean work directories for all Web applications on {0}.
 cleanServerRunning=The server must be stopped to clean the work directory.  Clicking OK will include stopping and restaring the server.
+cleanServerTask=Cleaning server work directory...
 
 # --- Error Strings ---
 errorDefaultDialogTitle=Tomcat Server Error
diff --git a/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/actions/CleanWorkDirAction.java b/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/actions/CleanWorkDirAction.java
index 3ee6f20..51d0b40 100644
--- a/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/actions/CleanWorkDirAction.java
+++ b/plugins/org.eclipse.jst.server.tomcat.ui/tomcatui/org/eclipse/jst/server/tomcat/ui/internal/actions/CleanWorkDirAction.java
@@ -10,15 +10,10 @@
  *******************************************************************************/
 package org.eclipse.jst.server.tomcat.ui.internal.actions;
 
-import org.eclipse.core.runtime.IStatus;
 import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.dialogs.IDialogConstants;
 import org.eclipse.jface.viewers.ISelection;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jst.server.tomcat.ui.internal.CleanWorkDirDialog;
-import org.eclipse.jst.server.tomcat.ui.internal.Messages;
-import org.eclipse.jst.server.tomcat.ui.internal.TomcatUIPlugin;
-import org.eclipse.osgi.util.NLS;
 import org.eclipse.ui.IActionDelegate;
 import org.eclipse.ui.IObjectActionDelegate;
 import org.eclipse.ui.IWorkbenchPart;
@@ -55,31 +50,6 @@
 	public void run(IAction action) {
 		CleanWorkDirDialog dlg = new CleanWorkDirDialog(targetPart.getSite().getShell(), selectedServer, selectedModule);
 		dlg.open();
-		IStatus status = dlg.getResultStatus();
-		if (dlg.getReturnCode() != IDialogConstants.OK_ID && !status.isOK()) {
-			String title = selectedModule != null ? Messages.errorCleanModuleTitle : Messages.errorCleanServerTitle;
-			String message = "Message unset";
-			switch (status.getCode()) {
-			case CleanWorkDirDialog.ERROR_PREDELETE:
-				message = selectedModule != null ?
-						NLS.bind(Messages.errorCouldNotCleanModule, selectedModule.getName(), selectedServer.getName()) :
-							NLS.bind(Messages.errorCouldNotCleanServer, selectedServer.getName());
-				break;
-
-			case CleanWorkDirDialog.ERROR_DURINGDELETE:
-				message = selectedModule != null ?
-						NLS.bind(Messages.errorCleanFailedModule, selectedModule.getName(), selectedServer.getName()) :
-							NLS.bind(Messages.errorCleanFailedServer, selectedServer.getName());
-				break;
-			default:
-				message = selectedModule != null ?
-						NLS.bind(Messages.errorCleanNoRestartModule, selectedModule.getName()) :
-							NLS.bind(Messages.errorCleanNoRestartServer, selectedServer.getName());
-				break;
-			}
-			TomcatUIPlugin.openError(title, message, dlg.getResultStatus());
-			return;
-		}
 	}
 
 	/**