[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;
- }
}
/**