- use temporary file for launcher
- send ^C to terminate remote script
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/.classpath b/rse/plugins/org.eclipse.dltk.rse.core/.classpath
index 2fbb7a2..64c5e31 100644
--- a/rse/plugins/org.eclipse.dltk.rse.core/.classpath
+++ b/rse/plugins/org.eclipse.dltk.rse.core/.classpath
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
- <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.4"/>
+ <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
<classpathentry kind="src" path="src"/>
<classpathentry kind="output" path="bin"/>
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/.settings/org.eclipse.jdt.core.prefs b/rse/plugins/org.eclipse.dltk.rse.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..0db8fa6
--- /dev/null
+++ b/rse/plugins/org.eclipse.dltk.rse.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Fri May 15 16:28:03 NOVST 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/META-INF/MANIFEST.MF b/rse/plugins/org.eclipse.dltk.rse.core/META-INF/MANIFEST.MF
index 7f7c761..251e107 100644
--- a/rse/plugins/org.eclipse.dltk.rse.core/META-INF/MANIFEST.MF
+++ b/rse/plugins/org.eclipse.dltk.rse.core/META-INF/MANIFEST.MF
@@ -19,4 +19,4 @@
Bundle-ActivationPolicy: lazy
Export-Package: org.eclipse.dltk.core.internal.rse,
org.eclipse.dltk.core.internal.rse.perfomance
-Bundle-RequiredExecutionEnvironment: J2SE-1.4
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/Messages.java b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/Messages.java
index ccb1e2e..a133744 100644
--- a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/Messages.java
+++ b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/Messages.java
@@ -19,6 +19,13 @@
public static String RSEEnvironment_EnvironmentNameSuffix;
public static String RSEEnvironmentProvider_providerName;
public static String RSEExecEnvironment_hostNotFound;
+ public static String RSEExecEnvironment_ErrorConnecting;
+ public static String RSEExecEnvironment_ErrorRunningCommand;
+ public static String RSEExecEnvironment_ProcessCreateError;
+ public static String RSEExecEnvironment_LauncherUploadError;
+ public static String RSEExecEnvironment_NoFileServicerError;
+ public static String RSEExecEnvironment_NoShellService;
+ public static String RSEExecEnvironment_NotConnected;
static {
// initialize resource bundle
NLS.initializeMessages(BUNDLE_NAME, Messages.class);
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/MyHostShellProcessAdapter.java b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/MyHostShellProcessAdapter.java
index 117d15d..1f750fa 100644
--- a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/MyHostShellProcessAdapter.java
+++ b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/MyHostShellProcessAdapter.java
@@ -80,12 +80,23 @@
}
}
+ static final String CTRL_C = "\u0003"; //$NON-NLS-1$
+
/**
* Exits the shell.
*
* @see java.lang.Process#destroy()
*/
public synchronized void destroy() {
+ if (!done && hostShell.isActive()) {
+ hostShell.writeToShell(CTRL_C);
+ // let the shell time to terminate in standard way
+ try {
+ wait(1000);
+ } catch (InterruptedException e) {
+ // ignore
+ }
+ }
hostShell.exit();
notifyAll();
closeStreams();
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEEnvironment.java b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEEnvironment.java
index 3b84f1f..ddb5eb2 100644
--- a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEEnvironment.java
+++ b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEEnvironment.java
@@ -33,8 +33,7 @@
throw new RuntimeException(
Messages.RSEEnvironment_EmptyFileNameError);
}
- URI uri = RSEFileSystem.getURIFor(host.getHostName(), path.toString());
- return new RSEFileHandle(this, uri);
+ return new RSEFileHandle(this, getURIFor(host, path.toString()));
}
public String getId() {
@@ -76,8 +75,7 @@
}
public URI getURI(IPath location) {
- return RSEFileSystem.getURIFor(host.getHostName(), location
- .toPortableString());
+ return getURIFor(host, location.toString());
}
public String convertPathToString(IPath path) {
@@ -103,4 +101,8 @@
public String getCanonicalPath(IPath path) {
return convertPathToString(path);
}
+
+ public static URI getURIFor(IHost host, String path) {
+ return RSEFileSystem.getURIFor(host.getHostName(), path);
+ }
}
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEExecEnvironment.java b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEExecEnvironment.java
index 13e5210..ca342ae 100644
--- a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEExecEnvironment.java
+++ b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEExecEnvironment.java
@@ -1,18 +1,26 @@
package org.eclipse.dltk.core.internal.rse;
+import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.Writer;
import java.net.URI;
+import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Random;
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.dltk.core.DLTKCore;
import org.eclipse.dltk.core.environment.IDeployment;
import org.eclipse.dltk.core.environment.IEnvironment;
@@ -23,26 +31,22 @@
import org.eclipse.osgi.util.NLS;
import org.eclipse.rse.core.model.IHost;
import org.eclipse.rse.core.subsystems.ISubSystem;
-import org.eclipse.rse.internal.efs.RSEFileSystem;
import org.eclipse.rse.services.clientserver.messages.SystemMessageException;
+import org.eclipse.rse.services.files.IFileService;
import org.eclipse.rse.services.shells.IHostShell;
import org.eclipse.rse.services.shells.IShellService;
+import org.eclipse.rse.subsystems.files.core.servicesubsystem.IFileServiceSubSystem;
import org.eclipse.rse.subsystems.shells.core.subsystems.servicesubsystem.IShellServiceSubSystem;
public class RSEExecEnvironment implements IExecutionEnvironment {
- private static final String SHELL_PATH = "exec /bin/sh"; //$NON-NLS-1$
-
- private static final String CMD_SEPARATOR = ";"; //$NON-NLS-1$
- private static final String EXPORT_CMD = ";export "; //$NON-NLS-1$
- private final static String EXIT_CMD = "exit"; //$NON-NLS-1$
- private static final String SET_CMD = "set"; //$NON-NLS-1$
- private static final String BACKSLASH = " \\"; //$NON-NLS-1$
+ private static final String EXEC_BIN_SH = "exec /bin/sh "; //$NON-NLS-1$
+ private static final String TOKEN_PREFIX = "DLTK_INITIAL_PREFIX_EXECUTION_STRING:"; //$NON-NLS-1$
private final RSEEnvironment environment;
private static int counter = -1;
- private static final Map hostToEnvironment = new HashMap();
+ private static final Map<IHost, Map<String, String>> hostToEnvironment = new HashMap<IHost, Map<String, String>>();
public RSEExecEnvironment(RSEEnvironment env) {
this.environment = env;
@@ -70,14 +74,16 @@
}
private URI createRemoteURI(IHost host, String rootPath) {
- return RSEFileSystem.getURIFor(host.getHostName(), rootPath);
+ return RSEEnvironment.getURIFor(host, rootPath);
}
- private IShellServiceSubSystem getShellServiceSubSystem(IHost host) {
+ @SuppressWarnings("unchecked")
+ private <SUBSYSTEM extends ISubSystem> SUBSYSTEM getSubSystem(IHost host,
+ Class<SUBSYSTEM> clazz) {
ISubSystem[] subsys = host.getSubSystems();
for (int i = 0; i < subsys.length; i++) {
- if (subsys[i] instanceof IShellServiceSubSystem)
- return (IShellServiceSubSystem) subsys[i];
+ if (clazz.isInstance(subsys[i]))
+ return (SUBSYSTEM) subsys[i];
}
return null;
}
@@ -91,31 +97,28 @@
}
private String getTempDir() {
- IHost host = environment.getHost();
- IShellServiceSubSystem system = getShellServiceSubSystem(host);
-
+ final IHost host = environment.getHost();
+ final IShellServiceSubSystem system = getSubSystem(host,
+ IShellServiceSubSystem.class);
if (system == null) {
DLTKRSEPlugin.logWarning(NLS.bind(
Messages.RSEExecEnvironment_hostNotFound, host.getName()));
return null;
}
-
- String tmpDir = null;
try {
system.connect(new NullProgressMonitor(), false);
-
- tmpDir = system.getConnectorService().getTempDirectory();
- if (tmpDir.length() == 0) {
- tmpDir = "/tmp"; //$NON-NLS-1$
+ final String tmp = system.getConnectorService().getTempDirectory();
+ if (tmp != null && tmp.length() != 0) {
+ return tmp;
+ } else {
+ return "/tmp"; //$NON-NLS-1$
}
-
} catch (Exception e) {
if (DLTKCore.DEBUG) {
e.printStackTrace();
}
}
-
- return tmpDir;
+ return null;
}
public Process exec(String[] cmdLine, IPath workingDir, String[] environment)
@@ -129,90 +132,183 @@
RSEPerfomanceStatistics
.inc(RSEPerfomanceStatistics.EXECUTION_COUNT);
}
- long start = System.currentTimeMillis();
- IShellServiceSubSystem shell = getShellServiceSubSystem(this.environment
- .getHost());
+ final long start = RSEPerfomanceStatistics.PERFOMANCE_TRACING ? System
+ .currentTimeMillis() : 0;
+ final IHost host = this.environment.getHost();
+
+ // obtain IFileService
+ final IFileServiceSubSystem fileService = getSubSystem(host,
+ IFileServiceSubSystem.class);
+ if (fileService == null) {
+ throw new CoreException(newStatus(
+ RSEStatusConstants.NO_FILE_SERVICE, NLS.bind(
+ Messages.RSEExecEnvironment_NoFileServicerError,
+ host.getAliasName()), null));
+ }
try {
- shell.connect(null, false);
+ fileService.connect(new NullProgressMonitor(), false);
} catch (Exception e) {
- if (DLTKCore.DEBUG) {
- e.printStackTrace();
+ throw new CoreException(newStatus(RSEStatusConstants.CONNECT_ERROR,
+ NLS.bind(Messages.RSEExecEnvironment_ErrorConnecting, host
+ .getAliasName(), e.getMessage()), e));
+ }
+
+ // remote path for launcher file
+ final String tmpLauncherDir = getTempDir();
+ final String tmpLauncher = "dltk-" + fileService.getUserId() + System.currentTimeMillis() + ".sh"; //$NON-NLS-1$ //$NON-NLS-2$
+ final String tmpLauncherPath = tmpLauncherDir
+ + fileService.getSeparatorChar() + tmpLauncher;
+
+ // build commands
+ final List<String> commands = new ArrayList<String>();
+ if (workingDir != null) {
+ final String p = this.environment.convertPathToString(workingDir);
+ commands.add("cd " + p); //$NON-NLS-1$
+ } else {
+ commands.add("cd /"); //$NON-NLS-1$
+ }
+ /*
+ * Sometimes environment variables aren't set by the runCommand() call,
+ * so use export.
+ */
+ if (environment != null) {
+ // TODO Skip environment variables which are already in shell?
+ for (int i = 0; i < environment.length; i++) {
+ commands.add(buildExportCommand(environment[i]));
}
- return null;
+ }
+ final String token = TOKEN_PREFIX + System.currentTimeMillis();
+ final String echoCmd = "echo \"" + token + "\""; //$NON-NLS-1$ //$NON-NLS-2$
+ commands.add(echoCmd);
+ commands.add(buildCommand(cmdLine));
+ commands.add(echoCmd);
+ commands.add("rm -f " + tmpLauncherPath); //$NON-NLS-1$
+ if (logger != null) {
+ logger.logLine("launcher=" + tmpLauncherDir + '/' + tmpLauncher); //$NON-NLS-1$
+ for (String command : commands) {
+ logger.logLine("launcher:" + command); //$NON-NLS-1$
+ }
+ logger.logLine("launcher:END"); //$NON-NLS-1$
+ }
+
+ // save launcher to the remote location
+ try {
+ final OutputStream os = fileService.getFileService()
+ .getOutputStream(tmpLauncherDir, tmpLauncher,
+ IFileService.TEXT_MODE, new NullProgressMonitor());
+ try {
+ final Writer writer = new OutputStreamWriter(
+ new BufferedOutputStream(os, 4096), fileService
+ .getRemoteEncoding());
+ try {
+ for (String command : commands) {
+ writer.write(command);
+ writer.write('\n');
+ }
+ writer.flush();
+ } finally {
+ try {
+ writer.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ } finally {
+ try {
+ os.close();
+ } catch (IOException e) {
+ // ignore
+ }
+ }
+ } catch (Exception e) {
+ final String msg = NLS.bind(
+ Messages.RSEExecEnvironment_LauncherUploadError, host
+ .getAliasName(), e.getMessage());
+ throw new CoreException(newStatus(
+ RSEStatusConstants.LAUNCHER_UPLOAD_ERROR, msg, e));
+ }
+
+ // execute uploaded launcher in remote shell
+ final IShellServiceSubSystem shell = getSubSystem(host,
+ IShellServiceSubSystem.class);
+ if (shell == null) {
+ throw new CoreException(newStatus(
+ RSEStatusConstants.NO_SHELL_SERVICE, NLS.bind(
+ Messages.RSEExecEnvironment_NoShellService, host
+ .getAliasName()), null));
+ }
+ try {
+ shell.connect(new NullProgressMonitor(), false);
+ } catch (Exception e) {
+ throw new CoreException(newStatus(RSEStatusConstants.CONNECT_ERROR,
+ NLS.bind(Messages.RSEExecEnvironment_ErrorConnecting, host
+ .getAliasName(), e.getMessage()), e));
}
if (!shell.isConnected()) {
- return null;
+ throw new CoreException(newStatus(
+ RSEStatusConstants.NOT_CONNECTED_ERROR, NLS.bind(
+ Messages.RSEExecEnvironment_NotConnected, host
+ .getAliasName()), null));
}
- IShellService shellService = shell.getShellService();
- IHostShell hostShell = null;
- String workingDirectory = null;
- if (workingDir != null) {
- workingDirectory = this.environment.convertPathToString(workingDir);
- } else {
- workingDirectory = "/"; //$NON-NLS-1$
- }
+ // TODO try to use "exec" channel instead of "shell" one.
+ final IShellService shellService = shell.getShellService();
+ final String command = EXEC_BIN_SH + tmpLauncherPath;
+ final IHostShell hostShell;
try {
- hostShell = shellService.runCommand(workingDirectory, SHELL_PATH,
- environment, new NullProgressMonitor());
- } catch (SystemMessageException e1) {
- DLTKRSEPlugin.log(e1);
- return null;
+ hostShell = shellService.runCommand(null, command, environment,
+ new NullProgressMonitor());
+ } catch (SystemMessageException e) {
+ throw new CoreException(newStatus(
+ RSEStatusConstants.COMMAND_RUN_ERROR, NLS.bind(
+ Messages.RSEExecEnvironment_ErrorRunningCommand,
+ host.getAliasName(), e.getMessage()), e));
}
- // Sometimes environment variables aren't set, so use export.
- if (environment != null) {
- hostShell.writeToShell(SHELL_PATH);
- // TODO: Skip environment variables what is already in shell.
- for (int i = 0; i < environment.length; i++) {
- hostShell.writeToShell(toShellArguments(environment[i])
- + EXPORT_CMD + extractName(environment[i]));
- }
- }
- final String pattern = "DLTK_INITIAL_PREFIX_EXECUTION_STRING:" //$NON-NLS-1$
- + String.valueOf(System.currentTimeMillis());
- final String echoPattern = "echo \"" + pattern + "\""; //$NON-NLS-1$ //$NON-NLS-2$
- hostShell.writeToShell(echoPattern + CMD_SEPARATOR + BACKSLASH);
- hostShell.writeToShell(buildCommand(cmdLine) + CMD_SEPARATOR
- + BACKSLASH);
- hostShell.writeToShell(echoPattern + CMD_SEPARATOR + EXIT_CMD);
- Process p = null;
+ // wrap shell as java.lang.Process and return
try {
- p = new MyHostShellProcessAdapter(hostShell, pattern, logger);
+ return new MyHostShellProcessAdapter(hostShell, token, logger);
} catch (Exception e) {
- if (p != null) {
- p.destroy();
+ hostShell.writeToShell(MyHostShellProcessAdapter.CTRL_C);
+ hostShell.exit();
+ throw new CoreException(newStatus(
+ RSEStatusConstants.INTERNAL_ERROR, NLS.bind(
+ Messages.RSEExecEnvironment_ProcessCreateError, e
+ .getMessage()), e));
+ } finally {
+ if (RSEPerfomanceStatistics.PERFOMANCE_TRACING) {
+ RSEPerfomanceStatistics.inc(
+ RSEPerfomanceStatistics.EXECUTION_TIME, System
+ .currentTimeMillis()
+ - start);
}
- throw new RuntimeException("Failed to run remote command"); //$NON-NLS-1$
}
- if (RSEPerfomanceStatistics.PERFOMANCE_TRACING) {
- final long end = System.currentTimeMillis();
- RSEPerfomanceStatistics.inc(RSEPerfomanceStatistics.EXECUTION_TIME,
- (end - start));
- }
- return p;
+ }
+
+ private static String buildExportCommand(String envEntry) {
+ return toShellArguments(envEntry) + ";export " + extractName(envEntry); //$NON-NLS-1$
+ }
+
+ private static Status newStatus(int code, String msg,
+ final Throwable exception) {
+ return new Status(IStatus.ERROR, DLTKRSEPlugin.PLUGIN_ID, code, msg,
+ exception);
}
/**
* @param environmentEntry
* @return
*/
- private String extractName(String environmentEntry) {
+ private static String extractName(String environmentEntry) {
final int pos = environmentEntry.indexOf('=');
return pos > 0 ? environmentEntry.substring(0, pos) : environmentEntry;
}
- private String toShellArguments(String cmd) {
+ private static String toShellArguments(String cmd) {
String replaceAll = cmd.replaceAll(" ", "\\\\ "); //$NON-NLS-1$ //$NON-NLS-2$
return replaceAll;
}
- // private String createWorkingDir(IPath workingDir) {
- // if (workingDir == null)
- // return "."; //$NON-NLS-1$
- // return workingDir.toPortableString();
- // }
-
private String buildCommand(String[] cmdLine) {
StringBuffer cmd = new StringBuffer();
for (int i = 0; i < cmdLine.length; i++) {
@@ -224,22 +320,22 @@
return cmd.toString();
}
+ @SuppressWarnings("unchecked")
public Map getEnvironmentVariables(boolean realyNeed) {
if (!realyNeed) {
- return new HashMap();
+ return new HashMap<String, String>();
}
final long start = System.currentTimeMillis();
synchronized (hostToEnvironment) {
- final Map result = (Map) hostToEnvironment.get(environment
- .getHost());
+ final Map<String, String> result = hostToEnvironment
+ .get(environment.getHost());
if (result != null) {
- return new HashMap(result);
+ return new HashMap<String, String>(result);
}
}
- final Map result = new HashMap();
+ final Map<String, String> result = new HashMap<String, String>();
try {
- Process process = this.exec(new String[] { SET_CMD }, Path.EMPTY,
- null);
+ Process process = exec(new String[] { "set" }, Path.EMPTY, null); //$NON-NLS-1$
if (process != null) {
final BufferedReader input = new BufferedReader(
new InputStreamReader(process.getInputStream()));
@@ -277,7 +373,7 @@
}
if (!result.isEmpty()) {
synchronized (hostToEnvironment) {
- hostToEnvironment.put(this.environment.getHost(), Collections
+ hostToEnvironment.put(environment.getHost(), Collections
.unmodifiableMap(result));
}
}
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEStatusConstants.java b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEStatusConstants.java
new file mode 100644
index 0000000..001d8d8
--- /dev/null
+++ b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/RSEStatusConstants.java
@@ -0,0 +1,25 @@
+/*******************************************************************************
+ * Copyright (c) 2009 xored software, Inc.
+ *
+ * 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:
+ * xored software, Inc. - initial API and Implementation (Alex Panchenko)
+ *******************************************************************************/
+package org.eclipse.dltk.core.internal.rse;
+
+public class RSEStatusConstants {
+
+ public static final int NO_SHELL_SERVICE = 200;
+ public static final int NO_FILE_SERVICE = 201;
+ public static final int CONNECT_ERROR = 210;
+ public static final int NOT_CONNECTED_ERROR = 211;
+ public static final int COMMAND_RUN_ERROR = 220;
+ public static final int LAUNCHER_UPLOAD_ERROR = 301;
+
+ public static final int INTERNAL_ERROR = 500;
+
+}
diff --git a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/messages.properties b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/messages.properties
index 544de58..b2f81fa 100644
--- a/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/messages.properties
+++ b/rse/plugins/org.eclipse.dltk.rse.core/src/org/eclipse/dltk/core/internal/rse/messages.properties
@@ -2,3 +2,10 @@
RSEEnvironment_EnvironmentNameSuffix=\ (RSE)
RSEEnvironmentProvider_providerName=RSE
RSEExecEnvironment_hostNotFound=unable to find IShellServiceSubSystem host {0}
+RSEExecEnvironment_ErrorConnecting=Error connecting to {0}: {1}
+RSEExecEnvironment_ErrorRunningCommand=Error running shell on {0}: {1}
+RSEExecEnvironment_ProcessCreateError=java.lang.Process create error: {1}
+RSEExecEnvironment_LauncherUploadError=Error uploading launcher to {0}: {1}
+RSEExecEnvironment_NoFileServicerError={0} has no IFileService sub-system
+RSEExecEnvironment_NoShellService={0} has no IShellService sub-system
+RSEExecEnvironment_NotConnected=Not connected to {0}