blob: 4a4303a40704fc8d7a3b6bc268c050966cde8345 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2007, 2008 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.actions;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IAdaptable;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugPlugin;
import org.eclipse.debug.core.IBreakpointManager;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.debug.core.ILaunchConfiguration;
import org.eclipse.debug.core.ILaunchManager;
import org.eclipse.debug.core.model.LaunchConfigurationDelegate;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.wst.server.core.IModule;
import org.eclipse.wst.server.core.IServer;
import org.eclipse.wst.server.core.ServerCore;
import org.eclipse.wst.server.core.internal.IClient;
import org.eclipse.wst.server.core.internal.ILaunchableAdapter;
import org.eclipse.wst.server.core.internal.ServerPlugin;
import org.eclipse.wst.server.core.model.ModuleArtifactDelegate;
import org.eclipse.wst.server.ui.internal.EclipseUtil;
import org.eclipse.wst.server.ui.internal.LaunchClientJob;
import org.eclipse.wst.server.ui.internal.Messages;
import org.eclipse.wst.server.ui.internal.ServerUIPlugin;
import org.eclipse.wst.server.ui.internal.Trace;
public class RunOnServerLaunchConfigurationDelegate extends LaunchConfigurationDelegate {
public static final String ATTR_SERVER_ID = "server-id";
public static final String ATTR_MODULE_ARTIFACT = "module-artifact";
public static final String ATTR_MODULE_ARTIFACT_CLASS = "module-artifact-class";
public static final String ATTR_LAUNCHABLE_ADAPTER_ID = "launchable-adapter-id";
public static final String ATTR_CLIENT_ID = "client-id";
protected boolean saveBeforeLaunch(ILaunchConfiguration configuration, String mode, IProgressMonitor monitor) throws CoreException {
// ignore
return true;
}
public void launch(ILaunchConfiguration configuration, String launchMode, final ILaunch launch2,
IProgressMonitor monitor) throws CoreException {
String serverId = configuration.getAttribute(ATTR_SERVER_ID, (String)null);
String moduleArt = configuration.getAttribute(ATTR_MODULE_ARTIFACT, (String)null);
String moduleArtifactClass = configuration.getAttribute(ATTR_MODULE_ARTIFACT_CLASS, (String)null);
String laId = configuration.getAttribute(ATTR_LAUNCHABLE_ADAPTER_ID, (String)null);
String clientId = configuration.getAttribute(ATTR_CLIENT_ID, (String)null);
IServer server = ServerCore.findServer(serverId);
IModule module = null;
ModuleArtifactDelegate moduleArtifact = null;
ILaunchableAdapter launchableAdapter = null;
if (laId != null)
launchableAdapter = ServerPlugin.findLaunchableAdapter(laId);
IClient client = ServerPlugin.findClient(clientId);
try {
Class c = Class.forName(moduleArtifactClass);
moduleArtifact = (ModuleArtifactDelegate) c.newInstance();
moduleArtifact.deserialize(moduleArt);
module = moduleArtifact.getModule();
} catch (Throwable t) {
Trace.trace(Trace.WARNING, "Could not load module artifact delegate class");
}
if (moduleArtifact == null)
throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorLaunchConfig));
if (module == null)
throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorLaunchConfig));
if (server == null)
throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorInvalidServer));
if (launchableAdapter == null)
throw new CoreException(new Status(IStatus.ERROR, ServerUIPlugin.PLUGIN_ID, Messages.errorLaunchConfig));
final Shell[] shell2 = new Shell[1];
Display.getDefault().syncExec(new Runnable() {
public void run() {
shell2[0] = EclipseUtil.getShell();
}
});
final Shell shell = shell2[0];
final IAdaptable info = new IAdaptable() {
public Object getAdapter(Class adapter) {
if (Shell.class.equals(adapter))
return shell;
return null;
}
};
if (client == null) {
// if there is no client, use a dummy
client = new IClient() {
public String getDescription() {
return Messages.clientDefaultDescription;
}
public String getId() {
return "org.eclipse.wst.server.ui.client.default";
}
public String getName() {
return Messages.clientDefaultName;
}
public IStatus launch(IServer server3, Object launchable2, String launchMode3, ILaunch launch) {
return Status.OK_STATUS;
}
public boolean supports(IServer server3, Object launchable2, String launchMode3) {
return true;
}
};
}
Trace.trace(Trace.FINEST, "Ready to launch");
launch2.addProcess(new RunOnServerProcess(launch2));
// start server if it's not already started
// and cue the client to start
IModule[] modules = new IModule[] { module }; // TODO: get parent hierarchy correct
int state = server.getServerState();
if (state == IServer.STATE_STARTING) {
LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
clientJob.schedule();
} else if (state == IServer.STATE_STARTED) {
boolean restart = false;
String mode = server.getMode();
IBreakpointManager breakpointManager = DebugPlugin.getDefault().getBreakpointManager();
boolean disabledBreakpoints = false;
if (server.getServerRestartState()) { // TODO - restart state might not be set until after publish
int result = RunOnServerActionDelegate.openRestartDialog(shell);
if (result == 0) {
launchMode = mode;
restart = true;
} else if (result == 9) { // cancel
launch2.terminate();
return;
}
}
if (!restart) {
if (!ILaunchManager.RUN_MODE.equals(mode) && ILaunchManager.RUN_MODE.equals(launchMode)) {
boolean breakpointsOption = false;
if (breakpointManager.isEnabled() && ILaunchManager.DEBUG_MODE.equals(mode))
breakpointsOption = true;
int result = RunOnServerActionDelegate.openOptionsDialog(shell, Messages.wizRunOnServerTitle, Messages.dialogModeWarningRun, breakpointsOption);
if (result == 0)
restart = true;
else if (result == 1) {
breakpointManager.setEnabled(false);
disabledBreakpoints = true;
launchMode = mode;
} else if (result == 2)
launchMode = mode;
else { // result == 9 // cancel
launch2.terminate();
return;
}
} else if (!ILaunchManager.DEBUG_MODE.equals(mode) && ILaunchManager.DEBUG_MODE.equals(launchMode)) {
int result = RunOnServerActionDelegate.openOptionsDialog(shell, Messages.wizDebugOnServerTitle, Messages.dialogModeWarningDebug, false);
if (result == 0)
restart = true;
else if (result == 1)
launchMode = mode;
else { // result == 9 // cancel
launch2.terminate();
return;
}
} else if (!ILaunchManager.PROFILE_MODE.equals(mode) && ILaunchManager.PROFILE_MODE.equals(launchMode)) {
boolean breakpointsOption = false;
if (breakpointManager.isEnabled() && ILaunchManager.DEBUG_MODE.equals(mode))
breakpointsOption = true;
int result = RunOnServerActionDelegate.openOptionsDialog(shell, Messages.wizProfileOnServerTitle, Messages.dialogModeWarningProfile, breakpointsOption);
if (result == 0)
restart = true;
else if (result == 1) {
breakpointManager.setEnabled(false);
disabledBreakpoints = true;
launchMode = mode;
} else if (result == 2)
launchMode = mode;
else {// result == 9 // cancel
launch2.terminate();
return;
}
}
if (ILaunchManager.DEBUG_MODE.equals(launchMode)) {
if (!breakpointManager.isEnabled() && !disabledBreakpoints) {
int result = RunOnServerActionDelegate.openBreakpointDialog(shell);
if (result == 0)
breakpointManager.setEnabled(true);
else if (result == 1) {
// ignore
} else { // result == 2
launch2.terminate();
return;
}
}
}
}
final LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
if (restart) {
final IServer server2 = server;
server.restart(launchMode, new IServer.IOperationListener() {
public void done(IStatus result) {
// Only publish if the server requires publish before launching the client.
if (server2.shouldPublish()) {
server2.publish(IServer.PUBLISH_INCREMENTAL, null, info, new IServer.IOperationListener() {
public void done(IStatus result2) {
if (result2.isOK())
clientJob.schedule();
}
});
} else {
clientJob.schedule();
}
}
});
} else {
// Only publish if the server requires publish before launching the client.
if (server.shouldPublish()) {
server.publish(IServer.PUBLISH_INCREMENTAL, null, info, new IServer.IOperationListener() {
public void done(IStatus result) {
if (result.isOK())
clientJob.schedule();
}
});
} else {
clientJob.schedule();
}
}
} else if (state != IServer.STATE_STOPPING) {
final LaunchClientJob clientJob = new LaunchClientJob(server, modules, launchMode, moduleArtifact, launchableAdapter, client);
/*ChainedJob myJob = new ChainedJob("test", server) {
protected IStatus run(IProgressMonitor monitor2) {
try {
LaunchConfigurationManager lcm = DebugUIPlugin.getDefault().getLaunchConfigurationManager();
lcm.setRecentLaunch(launch2);
} catch (Throwable t) {
Trace.trace(Trace.WARNING, "Could not tweak debug launch history");
}
return Status.OK_STATUS;
}
};*/
server.start(launchMode, new IServer.IOperationListener() {
public void done(IStatus result) {
if (result.isOK())
clientJob.schedule();
}
});
}
launch2.terminate();
}
}