blob: e4adfe9892c09eae47911a59fbee9d5305da6aec [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2005, 2011 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.wst.server.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.Status;
import org.eclipse.swt.widgets.Display;
import org.eclipse.wst.server.core.*;
import org.eclipse.wst.server.core.internal.*;
/**
*
*/
public class LaunchClientJob extends ChainedJob {
protected IModule[] module;
protected IClient client;
protected ILaunchableAdapter launchableAdapter;
protected String launchMode;
protected IModuleArtifact moduleArtifact;
public LaunchClientJob(IServer server, IModule[] module, String launchMode, IModuleArtifact moduleArtifact, ILaunchableAdapter launchableAdapter, IClient client) {
super(Messages.launchingClientTask, server);
this.module = module;
this.launchMode = launchMode;
this.moduleArtifact = moduleArtifact;
this.launchableAdapter = launchableAdapter;
this.client = client;
setRule(server);
}
/** (non-Javadoc)
* @see org.eclipse.core.runtime.jobs.Job#run(org.eclipse.core.runtime.IProgressMonitor)
*/
protected IStatus run(IProgressMonitor monitor) {
Trace.trace(Trace.FINER, "LaunchClient job");
// wait for up to 5 minutes
final Server server = (Server) getServer();
int state = server.getModuleState(module);
int count = ServerPreferences.getInstance().getModuleStartTimeout();
while (state == IServer.STATE_STARTING && count > 0) {
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
try {
Thread.sleep(2000);
} catch (Exception e) {
// ignore
}
count -= 2000;
state = server.getModuleState(module);
}
Trace.trace(Trace.FINER, "LaunchClient job 2 " + state);
if (monitor.isCanceled())
return Status.CANCEL_STATUS;
if (state == IServer.STATE_STARTING)
return Status.OK_STATUS;
Trace.trace(Trace.FINER, "LaunchClient job 3");
// job return status
final IStatus[] resultingStatus = new IStatus[] { Status.OK_STATUS };
// acquire the launchable object.
final Object[] launchable = new Object[1];
try {
launchable[0] = launchableAdapter.getLaunchable(server, moduleArtifact);
}
catch (CoreException ce) {
resultingStatus[0] = ce.getStatus();
EclipseUtil.openError(null, resultingStatus[0]);
}
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
// display client on UI thread if launchable exists.
if (launchable[0] != null) {
Display.getDefault().asyncExec(new Runnable() {
public void run() {
Trace.trace(Trace.FINEST, "Attempting to load client: " + client.getId());
try {
resultingStatus[0] = client.launch(server, launchable[0], launchMode, server.getLaunch());
if (resultingStatus[0] != null && resultingStatus[0].getSeverity() == IStatus.ERROR)
EclipseUtil.openError(null, resultingStatus[0]);
}
catch (Exception e) {
Trace.trace(Trace.SEVERE, "Server client failed", e);
}
}
});
}
Trace.trace(Trace.FINER, "LaunchClient job 4");
return resultingStatus[0];
}
}