blob: 85a6907a5eef11c18c3d42e2174f4be5e0a7ec1f [file] [log] [blame]
package org.eclipse.dltk.ruby.fastdebugger;
import java.io.IOException;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.NullProgressMonitor;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Status;
import org.eclipse.debug.core.DebugException;
import org.eclipse.debug.core.ILaunch;
import org.eclipse.dltk.core.PreferencesLookupDelegate;
import org.eclipse.dltk.core.environment.IDeployment;
import org.eclipse.dltk.core.environment.IEnvironment;
import org.eclipse.dltk.core.environment.IExecutionEnvironment;
import org.eclipse.dltk.internal.launching.execution.DeploymentManager;
import org.eclipse.dltk.launching.DebuggingEngineRunner;
import org.eclipse.dltk.launching.IInterpreterInstall;
import org.eclipse.dltk.launching.InterpreterConfig;
import org.eclipse.dltk.launching.ScriptLaunchUtil;
import org.eclipse.dltk.launching.debug.DbgpConnectionConfig;
import org.eclipse.dltk.ruby.debug.RubyDebugPlugin;
import org.eclipse.dltk.ruby.internal.launching.RubyGenericInstallType;
import org.eclipse.dltk.ruby.launching.RubyLaunchConfigurationConstants;
import org.eclipse.osgi.util.NLS;
import org.osgi.framework.Bundle;
public class FastDebuggerRunner extends DebuggingEngineRunner {
public static final String ENGINE_ID = "org.eclipse.dltk.ruby.fastdebugger"; //$NON-NLS-1$
private static final String RUBY_HOST_VAR = "DBGP_RUBY_HOST"; //$NON-NLS-1$
private static final String RUBY_PORT_VAR = "DBGP_RUBY_PORT"; //$NON-NLS-1$
private static final String RUBY_KEY_VAR = "DBGP_RUBY_KEY"; //$NON-NLS-1$
private static final String RUBY_LOG_VAR = "DBGP_RUBY_LOG"; //$NON-NLS-1$
private static final String DEBUGGER_SCRIPT = "FastRunner.rb"; //$NON-NLS-1$
private static final String P_CHECK_RUBY_DEBUG = FastDebuggerConstants.CHECK_RUBY_DEBUG;
protected IPath deploy(IDeployment deployment) throws CoreException {
try {
IPath deploymentPath = FastDebuggerPlugin.getDefault()
.deployDebuggerSource(deployment);
return deployment.getFile(deploymentPath).getPath();
} catch (IOException e) {
// TODO: add code for handler
throw new CoreException(
new Status(
IStatus.ERROR,
FastDebuggerPlugin.PLUGIN_ID,
Messages.FastDebuggerRunner_unableToDeployDebuggerSource,
e));
}
}
public FastDebuggerRunner(IInterpreterInstall install) {
super(install);
}
@Override
protected InterpreterConfig addEngineConfig(InterpreterConfig config,
PreferencesLookupDelegate delegate, ILaunch launch)
throws CoreException {
if (!(getInstall().getInterpreterInstallType() instanceof RubyGenericInstallType)) {
throw new DebugException(
new Status(
IStatus.ERROR,
FastDebuggerPlugin.PLUGIN_ID,
Messages.FastDebuggerRunner_fastDebuggerCanOnlyBeRunWithGenericRubyInterpreter));
}
IEnvironment env = getInstall().getEnvironment();
IExecutionEnvironment exeEnv = env
.getAdapter(IExecutionEnvironment.class);
IDeployment deployment = exeEnv.createDeployment();
if (deployment == null) {
return null;
}
DeploymentManager.getInstance().addDeployment(launch, deployment);
// Get debugger source location
final IPath sourceLocation = deploy(deployment);
final IPath scriptFile = sourceLocation.append(DEBUGGER_SCRIPT);
// Creating new config
InterpreterConfig newConfig = (InterpreterConfig) config.clone();
newConfig.addInterpreterArg("-r"); //$NON-NLS-1$
newConfig.addInterpreterArg(env.convertPathToString(scriptFile));
newConfig.addInterpreterArg("-I"); //$NON-NLS-1$
newConfig.addInterpreterArg(env.convertPathToString(sourceLocation));
// Environment
DbgpConnectionConfig dbgpConfig = DbgpConnectionConfig.load(config);
newConfig.addEnvVar(RUBY_HOST_VAR, dbgpConfig.getHost());
newConfig.addEnvVar(RUBY_PORT_VAR, Integer.toString(dbgpConfig
.getPort()));
String sessionId = dbgpConfig.getSessionId();
newConfig.addEnvVar(RUBY_KEY_VAR, sessionId);
String logFileName = getLogFileName(delegate, sessionId);
if (logFileName != null) {
newConfig.addEnvVar(RUBY_LOG_VAR, logFileName);
}
final boolean check = delegate.getBoolean(FastDebuggerPlugin.PLUGIN_ID,
FastDebuggerConstants.CHECK_RUBY_DEBUG);
newConfig.setProperty(P_CHECK_RUBY_DEBUG, Boolean.valueOf(check));
return newConfig;
}
@Override
protected String getDebuggingEngineId() {
return ENGINE_ID;
}
/*
* @see
* org.eclipse.dltk.launching.DebuggingEngineRunner#getDebugPreferenceQualifier
* ()
*/
@Override
protected String getDebugPreferenceQualifier() {
return RubyDebugPlugin.PLUGIN_ID;
}
// FIXME TODO this is not used anywhere and is broken on non-1.8 installs
// or when the install location is non-default such as with rvm.
public IPath resolveGemsPath(boolean user) {
IEnvironment env = getInstall().getEnvironment();
IPath gemsPath = new Path(getInstall().getInstallLocation()
.toOSString());
if (gemsPath.segmentCount() < 2)
return null;
gemsPath = gemsPath.removeLastSegments(2);
if (user == true) {
gemsPath = gemsPath.append("lib/ruby/user-gems/1.8/gems"); //$NON-NLS-1$
IPath userGemsPathUbuntu = new Path("/var/lib/user-gems/1.8/gems"); //$NON-NLS-1$
if ((env.getFile(gemsPath).exists() != true)
&& (env.getFile(userGemsPathUbuntu).exists() == true)) {
gemsPath = userGemsPathUbuntu;
}
} else {
gemsPath = gemsPath.append("lib/ruby/gems/1.8/gems"); //$NON-NLS-1$
IPath gemsPathUbuntu = new Path("/var/lib/gems/1.8/gems"); //$NON-NLS-1$
if ((env.getFile(gemsPath).exists() != true)
&& (env.getFile(gemsPathUbuntu).exists() == true)) {
gemsPath = gemsPathUbuntu;
}
}
return gemsPath;
}
public boolean resolveRubyDebugGemExists() {
IEnvironment environment = getInstall().getEnvironment();
IExecutionEnvironment executionEnvironment = environment
.getAdapter(IExecutionEnvironment.class);
Bundle bundle = FastDebuggerPlugin.getDefault().getBundle();
String output = ScriptLaunchUtil.runEmbeddedScriptReadContent(
executionEnvironment, "scripts/check_debugger_gem.rb", bundle, //$NON-NLS-1$
getInstall().getInstallLocation(),
new NullProgressMonitor());
return output.startsWith("true");
}
@Override
protected void checkConfig(InterpreterConfig config,
IEnvironment environment) throws CoreException {
super.checkConfig(config, environment);
final Boolean check = (Boolean) config.getProperty(P_CHECK_RUBY_DEBUG);
if (check != null && check.booleanValue()) {
checkRubyDebug();
}
}
private void checkRubyDebug() throws CoreException {
if (!resolveRubyDebugGemExists()) {
abort(
NLS
.bind(
Messages.FastDebuggerRunner_rubyDebugGemDoesntSeemToBeInstalled,
new Object[] {
getDebuggingEngine().getName(),
getInstall().getInstallLocation()
.toOSString() }), null);
}
}
@Override
protected String getDebuggingEnginePreferenceQualifier() {
return FastDebuggerPlugin.PLUGIN_ID;
}
protected String getLoggingEnabledPreferenceKey() {
return FastDebuggerConstants.ENABLE_LOGGING;
}
@Override
protected String getLogFileNamePreferenceKey() {
return FastDebuggerConstants.LOG_FILE_NAME;
}
protected String getLogFilePathPreferenceKey() {
return FastDebuggerConstants.LOG_FILE_PATH;
}
@Override
protected String getProcessType() {
return RubyLaunchConfigurationConstants.ID_RUBY_PROCESS_TYPE;
}
}