diff --git a/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/ProcessTests.java b/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/ProcessTests.java index 1f7957ef6fd..d0655df27c6 100644 --- a/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/ProcessTests.java +++ b/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/ProcessTests.java @@ -1,8 +1,10 @@ package org.eclipse.remote.core.tests; import java.io.BufferedReader; +import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; +import java.io.OutputStreamWriter; import java.util.Collections; import java.util.HashSet; import java.util.Set; @@ -23,7 +25,7 @@ public class ProcessTests extends TestCase { private static final String USERNAME = "test"; //$NON-NLS-1$ private static final String PASSWORD = ""; //$NON-NLS-1$ private static final String HOST = "localhost"; //$NON-NLS-1$ - private static int NUM_THREADS = 5; + private static int NUM_THREADS = 2; private IRemoteServices fRemoteServices; private IRemoteConnection fRemoteConnection; @@ -33,10 +35,11 @@ public class ProcessTests extends TestCase { final Set results = Collections.synchronizedSet(new HashSet()); for (int t = 0; t < NUM_THREADS; t++) { + final String threadNum = Integer.toString(t); Thread thread = new Thread("test thread " + t) { @Override public void run() { - IRemoteProcessBuilder builder = fRemoteConnection.getProcessBuilder("perl", "-V:version"); //$NON-NLS-1$ + IRemoteProcessBuilder builder = fRemoteConnection.getProcessBuilder("perl", "-v", threadNum); //$NON-NLS-1$ assertNotNull(builder); builder.redirectErrorStream(true); for (int i = 0; i < 10; i++) { @@ -46,12 +49,14 @@ public class ProcessTests extends TestCase { String line; while ((line = stdout.readLine()) != null) { results.add(line); + results.add("\n"); } try { proc.waitFor(); } catch (InterruptedException e) { e.printStackTrace(); } + assertTrue(results.toString().contains("Larry Wall")); } catch (IOException e) { e.printStackTrace(); fail(e.getLocalizedMessage()); @@ -95,6 +100,72 @@ public class ProcessTests extends TestCase { } } + public void testEcho() { + IRemoteProcessBuilder builder = fRemoteConnection.getProcessBuilder("cat"); //$NON-NLS-1$ + assertNotNull(builder); + builder.redirectErrorStream(true); + final StringBuffer result = new StringBuffer(); + try { + final IRemoteProcess proc = builder.start(); + Thread readerThread = new Thread("echo reader thread") { + @Override + public void run() { + try { + BufferedReader stdout = new BufferedReader(new InputStreamReader(proc.getInputStream())); + String line; + while ((line = stdout.readLine()) != null) { + result.append(line); + } + try { + proc.waitFor(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + fail(e.getLocalizedMessage()); + } + } + + }; + Thread writerThread = new Thread("echo writer thread") { + @Override + public void run() { + try { + BufferedWriter stdin = new BufferedWriter(new OutputStreamWriter(proc.getOutputStream())); + for (int i = 0; i < 10; i++) { + String line = i + "\n"; + stdin.append(line); + stdin.flush(); + } + proc.getOutputStream().close(); + try { + proc.waitFor(); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } catch (IOException e) { + e.printStackTrace(); + fail(e.getLocalizedMessage()); + } + } + + }; + writerThread.start(); + readerThread.start(); + writerThread.join(); + readerThread.join(); + } catch (IOException e) { + e.printStackTrace(); + fail(e.getLocalizedMessage()); + } catch (InterruptedException e) { + e.printStackTrace(); + fail(e.getLocalizedMessage()); + } + + assertEquals("0123456789", result.toString()); + } + /* * (non-Javadoc) * diff --git a/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/suite/RemoteCoreTestSuite.java b/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/suite/RemoteCoreTestSuite.java index 1389ca21575..f97db770b9e 100644 --- a/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/suite/RemoteCoreTestSuite.java +++ b/org.eclipse.remote.core.tests/src/org/eclipse/remote/core/tests/suite/RemoteCoreTestSuite.java @@ -3,16 +3,15 @@ package org.eclipse.remote.core.tests.suite; import junit.framework.Test; import junit.framework.TestSuite; -import org.eclipse.remote.core.tests.ConnectionTests; -import org.eclipse.remote.core.tests.FileStoreTests; +import org.eclipse.remote.core.tests.ProcessTests; public class RemoteCoreTestSuite { public static Test suite() { TestSuite suite = new TestSuite(RemoteCoreTestSuite.class.getName()); - suite.addTestSuite(ConnectionTests.class); - suite.addTestSuite(FileStoreTests.class); - // suite.addTestSuite(ProcessTests.class); + // suite.addTestSuite(ConnectionTests.class); + // suite.addTestSuite(FileStoreTests.class); + suite.addTestSuite(ProcessTests.class); return suite; } diff --git a/org.eclipse.remote.core/src/org/eclipse/internal/remote/core/services/local/LocalConnectionManager.java b/org.eclipse.remote.core/src/org/eclipse/internal/remote/core/services/local/LocalConnectionManager.java index 01ff833f02f..edf48e4f029 100644 --- a/org.eclipse.remote.core/src/org/eclipse/internal/remote/core/services/local/LocalConnectionManager.java +++ b/org.eclipse.remote.core/src/org/eclipse/internal/remote/core/services/local/LocalConnectionManager.java @@ -11,8 +11,8 @@ package org.eclipse.internal.remote.core.services.local; import java.net.URI; -import java.util.HashSet; -import java.util.Set; +import java.util.ArrayList; +import java.util.List; import org.eclipse.core.filesystem.EFS; import org.eclipse.remote.core.IRemoteConnection; @@ -64,10 +64,10 @@ public class LocalConnectionManager implements IRemoteConnectionManager { * org.eclipse.remote.core.IRemoteConnectionManager#getConnections() */ @Override - public Set getConnections() { - Set set = new HashSet(); - set.add(fLocalConnection); - return set; + public List getConnections() { + List list = new ArrayList(); + list.add(fLocalConnection); + return list; } /* diff --git a/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionManager.java b/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionManager.java index 1bebd0d899d..4ac76394b20 100644 --- a/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionManager.java +++ b/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionManager.java @@ -11,7 +11,7 @@ package org.eclipse.remote.core; import java.net.URI; -import java.util.Set; +import java.util.List; import org.eclipse.remote.core.exception.RemoteConnectionException; @@ -51,7 +51,7 @@ public interface IRemoteConnectionManager { * * @return connections that we know about */ - public Set getConnections(); + public List getConnections(); /** * Creates a new remote connection named with supplied name. The connection diff --git a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnection.java b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnection.java index f04f889bf15..fea4191ed12 100644 --- a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnection.java +++ b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnection.java @@ -49,10 +49,11 @@ import com.jcraft.jsch.UserInfo; * @since 5.0 */ public class JSchConnection implements IRemoteConnection { - protected static final int DEFAULT_PORT = 22; - protected static final int DEFAULT_TIMEOUT = 5; - protected static final boolean DEFAULT_IS_PASSWORD = true; - protected static final String EMPTY_STRING = ""; //$NON-NLS-1$ + public static final int DEFAULT_PORT = 22; + public static final int DEFAULT_TIMEOUT = 5; + public static final boolean DEFAULT_IS_PASSWORD = true; + public static final boolean DEFAULT_USE_LOGIN_SHELL = true; + public static final String EMPTY_STRING = ""; //$NON-NLS-1$ private String fWorkingDir; private boolean fIsOpen; @@ -133,18 +134,20 @@ public class JSchConnection implements IRemoteConnection { * @see org.eclipse.remote.core.IRemoteConnection#close() */ public synchronized void close() { - if (isOpen()) { - if (fSftpChannel != null && fSftpChannel.isConnected()) { + if (fSftpChannel != null) { + if (fSftpChannel.isConnected()) { fSftpChannel.disconnect(); } - for (Session session : fSessions) { - if (session.isConnected()) { - session.disconnect(); - } - } - fIsOpen = false; - fireConnectionChangeEvent(IRemoteConnectionChangeEvent.CONNECTION_CLOSED); + fSftpChannel = null; } + for (Session session : fSessions) { + if (session.isConnected()) { + session.disconnect(); + } + } + fSessions.clear(); + fIsOpen = false; + fireConnectionChangeEvent(IRemoteConnectionChangeEvent.CONNECTION_CLOSED); } /* @@ -502,7 +505,16 @@ public class JSchConnection implements IRemoteConnection { * @see org.eclipse.remote.core.IRemoteConnection#isOpen() */ public boolean isOpen() { - return fIsOpen; + boolean isOpen = fIsOpen & fSessions.size() > 0; + if (isOpen) { + for (Session session : fSessions) { + isOpen &= session.isConnected(); + } + if (!isOpen) { + close(); // Cleanup if session is closed + } + } + return isOpen; } public boolean isPasswordAuth() { @@ -791,4 +803,8 @@ public class JSchConnection implements IRemoteConnection { } return str + "]"; //$NON-NLS-1$ } + + public boolean useLoginShell() { + return fAttributes.getBoolean(JSchConnectionAttributes.USE_LOGIN_SHELL_ATTR, DEFAULT_USE_LOGIN_SHELL); + } } diff --git a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionAttributes.java b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionAttributes.java index 19d83a621bc..d7eb03c4ae1 100644 --- a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionAttributes.java +++ b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionAttributes.java @@ -35,6 +35,7 @@ public class JSchConnectionAttributes { public static final String PASSPHRASE_ATTR = "JSCH_PASSPHRASE_ATTR"; //$NON-NLS-1$ public static final String KEYFILE_ATTR = "JSCH_KEYFILE_ATTR"; //$NON-NLS-1$ public static final String TIMEOUT_ATTR = "JSCH_TIMEOUT_ATTR"; //$NON-NLS-1$ + public static final String USE_LOGIN_SHELL_ATTR = "JSCH_USE_LOGIN_SHELL_ATTR"; //$NON-NLS-1$ private String fName; private String fNewName; diff --git a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionManager.java b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionManager.java index 328451c77cf..43139b366fc 100644 --- a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionManager.java +++ b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionManager.java @@ -11,11 +11,11 @@ package org.eclipse.internal.remote.jsch.core; import java.net.URI; +import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; -import java.util.HashSet; +import java.util.List; import java.util.Map; -import java.util.Set; import org.eclipse.core.runtime.preferences.IEclipsePreferences; import org.eclipse.core.runtime.preferences.InstanceScope; @@ -78,29 +78,13 @@ public class JSchConnectionManager implements IRemoteConnectionManager { * @see * org.eclipse.remote.core.IRemoteConnectionManager#getConnections() */ - public Set getConnections() { + public List getConnections() { loadConnections(); - Set set = new HashSet(); - set.addAll(fConnections.values()); - return set; + List conns = new ArrayList(); + conns.addAll(fConnections.values()); + return conns; } - // private void loadAuth(ISecurePreferences node) throws StorageException { - // JSchConnection connection = fConnections.get(node.name()); - // if (connection != null) { - // boolean isPasswordAuth = node.getBoolean(IS_PASSWORD_AUTH_KEY, true); - // connection.setIsPasswordAuth(isPasswordAuth); - // if (isPasswordAuth) { - // connection.setPassword(node.get(PASSWORD_KEY, null)); - // } else { - // connection.setPassphrase(node.get(PASSPHRASE_KEY, null)); - // connection.setKeyFile(node.get(KEYFILE_KEY, null)); - // } - // } else { - // node.removeNode(); - // } - // } - private synchronized void loadConnections() { if (fConnections == null) { fConnections = Collections.synchronizedMap(new HashMap()); @@ -163,59 +147,4 @@ public class JSchConnectionManager implements IRemoteConnectionManager { ((JSchConnection) conn).getInfo().remove(); fConnections.remove(conn.getName()); } - - // private void saveAuth(JSchConnection conn, ISecurePreferences node) throws StorageException { - // boolean isPasswordAuth = conn.isPasswordAuth(); - // node.putBoolean(IS_PASSWORD_AUTH_KEY, isPasswordAuth, false); - // if (isPasswordAuth) { - // node.put(PASSWORD_KEY, conn.getPassword(), true); - // } else { - // node.put(PASSPHRASE_KEY, conn.getPassphrase(), true); - // node.put(KEYFILE_KEY, conn.getKeyFile(), false); - // } - // } - // - // private void saveConnection(JSchConnection conn, Preferences node) { - // node.put(HOST_KEY, conn.getAddress()); - // node.put(USER_KEY, conn.getUsername()); - // node.putInt(PORT_KEY, conn.getPort()); - // node.putInt(TIMEOUT_KEY, conn.getTimeout()); - // } - // - // public synchronized void saveConnections() { - // if (fConnections != null) { - // IEclipsePreferences root = InstanceScope.INSTANCE.getNode(Activator.getUniqueIdentifier()); - // Preferences connections = root.node(CONNECTIONS_KEY); - // try { - // connections.clear(); - // } catch (BackingStoreException e) { - // Activator.log(e.getMessage()); - // } - // for (JSchConnection conn : fConnections.values()) { - // Preferences node = connections.node(conn.getName()); - // saveConnection(conn, node); - // } - // ISecurePreferences secRoot = SecurePreferencesFactory.getDefault(); - // ISecurePreferences secConnections = secRoot.node("org.eclipse.remote.jsch.connections"); - // secConnections.clear(); - // try { - // for (JSchConnection conn : fConnections.values()) { - // ISecurePreferences secNode = secConnections.node(conn.getName()); - // saveAuth(conn, secNode); - // } - // } catch (StorageException e) { - // Activator.log(e.getMessage()); - // } - // try { - // root.flush(); - // } catch (BackingStoreException e) { - // Activator.log(e.getMessage()); - // } - // try { - // secRoot.flush(); - // } catch (IOException e) { - // Activator.log(e.getMessage()); - // } - // } - // } } diff --git a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionWorkingCopy.java b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionWorkingCopy.java index 48cffcd7fa2..4ff26d027df 100644 --- a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionWorkingCopy.java +++ b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionWorkingCopy.java @@ -172,8 +172,8 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote fWorkingAttributes.setAttribute(key, value); } - public void setIsPasswordAuth(boolean isPasswordAuth) { - fWorkingAttributes.setAttribute(JSchConnectionAttributes.IS_PASSWORD_ATTR, Boolean.toString(isPasswordAuth)); + public void setIsPasswordAuth(boolean flag) { + fWorkingAttributes.setAttribute(JSchConnectionAttributes.IS_PASSWORD_ATTR, Boolean.toString(flag)); } public void setKeyFile(String keyFile) { @@ -220,6 +220,10 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote fWorkingAttributes.setAttribute(JSchConnectionAttributes.TIMEOUT_ATTR, Integer.toString(timeout)); } + public void setUseLoginShell(boolean flag) { + fWorkingAttributes.setAttribute(JSchConnectionAttributes.USE_LOGIN_SHELL_ATTR, Boolean.toString(flag)); + } + /* * (non-Javadoc) * diff --git a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchProcess.java b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchProcess.java index 692753b0012..e55b8dc6b2d 100644 --- a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchProcess.java +++ b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchProcess.java @@ -174,6 +174,6 @@ public class JSchProcess extends AbstractRemoteProcess { */ @Override public boolean isCompleted() { - return !fChannel.isClosed(); + return fChannel.isClosed(); } } diff --git a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchProcessBuilder.java b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchProcessBuilder.java index 6e9a810259d..6299eeb1a22 100644 --- a/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchProcessBuilder.java +++ b/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchProcessBuilder.java @@ -206,6 +206,10 @@ public class JSchProcessBuilder extends AbstractRemoteProcessBuilder { } } sb.append(cmd); + if (fConnection.useLoginShell()) { + sb.insert(0, "/bin/bash -l -c '"); //$NON-NLS-1$ + sb.append("'"); //$NON-NLS-1$ + } return sb.toString(); } diff --git a/org.eclipse.remote.jsch.ui/src/org/eclipse/internal/remote/jsch/ui/JSchUIConnectionManager.java b/org.eclipse.remote.jsch.ui/src/org/eclipse/internal/remote/jsch/ui/JSchUIConnectionManager.java index 65a25548d81..094f4ec2a16 100644 --- a/org.eclipse.remote.jsch.ui/src/org/eclipse/internal/remote/jsch/ui/JSchUIConnectionManager.java +++ b/org.eclipse.remote.jsch.ui/src/org/eclipse/internal/remote/jsch/ui/JSchUIConnectionManager.java @@ -20,10 +20,10 @@ import org.eclipse.remote.ui.AbstractRemoteUIConnectionManager; import org.eclipse.swt.widgets.Shell; public class JSchUIConnectionManager extends AbstractRemoteUIConnectionManager { - private final JSchConnectionManager connMgr; + private final JSchConnectionManager fConnMgr; public JSchUIConnectionManager(IRemoteServices services) { - connMgr = (JSchConnectionManager) services.getConnectionManager(); + fConnMgr = (JSchConnectionManager) services.getConnectionManager(); } /* @@ -46,15 +46,7 @@ public class JSchUIConnectionManager extends AbstractRemoteUIConnectionManager { * .IRemoteConnectionAttributeHint[], java.lang.String[]) */ public IRemoteConnectionWorkingCopy newConnection(Shell shell, String[] attrHints, String[] attrHintValues) { - JSchConnectionWorkingCopy conn = createConnection(shell, attrHints, attrHintValues); - if (conn != null) { - return conn; - } - return null; - } - - public JSchConnectionWorkingCopy createConnection(Shell shell, String[] attrHints, String[] attrHintValues) { - JSchConnectionWizard wizard = new JSchConnectionWizard(connMgr); + JSchConnectionWizard wizard = new JSchConnectionWizard(fConnMgr); WizardDialog dialog = new WizardDialog(shell, wizard); dialog.setBlockOnOpen(true); if (dialog.open() == WizardDialog.OK) { @@ -72,7 +64,7 @@ public class JSchUIConnectionManager extends AbstractRemoteUIConnectionManager { public boolean updateConnection(Shell shell, IRemoteConnectionWorkingCopy connection) { if (connection instanceof JSchConnectionWorkingCopy) { JSchConnectionWorkingCopy jSchConn = (JSchConnectionWorkingCopy) connection; - JSchConnectionWizard wizard = new JSchConnectionWizard(connMgr, jSchConn); + JSchConnectionWizard wizard = new JSchConnectionWizard(fConnMgr, jSchConn); WizardDialog dialog = new WizardDialog(shell, wizard); dialog.setBlockOnOpen(true); if (dialog.open() == WizardDialog.OK) { diff --git a/org.eclipse.remote.jsch.ui/src/org/eclipse/internal/remote/jsch/ui/wizards/JSchConnectionPage.java b/org.eclipse.remote.jsch.ui/src/org/eclipse/internal/remote/jsch/ui/wizards/JSchConnectionPage.java index e4765f13b64..373997681c9 100755 --- a/org.eclipse.remote.jsch.ui/src/org/eclipse/internal/remote/jsch/ui/wizards/JSchConnectionPage.java +++ b/org.eclipse.remote.jsch.ui/src/org/eclipse/internal/remote/jsch/ui/wizards/JSchConnectionPage.java @@ -117,6 +117,7 @@ public class JSchConnectionPage extends WizardPage { portLabel.setText(Messages.JSchNewConnectionPage_Port); portLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); fPortText = new Text(advancedComp, SWT.BORDER | SWT.SINGLE); + fPortText.setText(Integer.toString(JSchConnection.DEFAULT_PORT)); fPortText.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); fPortText.setTextLimit(5); @@ -124,6 +125,7 @@ public class JSchConnectionPage extends WizardPage { timeoutLabel.setText(Messages.JSchNewConnectionPage_Timeout); timeoutLabel.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, false, false)); fTimeoutText = new Text(advancedComp, SWT.BORDER | SWT.SINGLE); + fTimeoutText.setText(Integer.toString(JSchConnection.DEFAULT_TIMEOUT)); fTimeoutText.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false)); fTimeoutText.setTextLimit(5); diff --git a/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java b/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java index a7c93022f64..1854ed08ac9 100644 --- a/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java +++ b/org.eclipse.remote.ui/src/org/eclipse/remote/ui/widgets/RemoteConnectionWidget.java @@ -22,6 +22,7 @@ import org.eclipse.internal.remote.ui.messages.Messages; import org.eclipse.jface.operation.IRunnableContext; import org.eclipse.remote.core.IRemoteConnection; import org.eclipse.remote.core.IRemoteConnectionManager; +import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; import org.eclipse.remote.core.IRemotePreferenceConstants; import org.eclipse.remote.core.IRemoteServices; import org.eclipse.remote.core.RemoteServices; @@ -393,8 +394,9 @@ public class RemoteConnectionWidget extends Composite { */ protected void handleNewRemoteConnectionSelected() { if (getUIConnectionManager() != null) { - IRemoteConnection conn = getUIConnectionManager().newConnection(getShell(), fAttrHints, fAttrHintValues); + IRemoteConnectionWorkingCopy conn = getUIConnectionManager().newConnection(getShell(), fAttrHints, fAttrHintValues); if (conn != null) { + conn.save(); handleRemoteServiceSelected(conn); handleConnectionSelected(); }