From ec96e61198040d9cadf485141ed4cd4ec983ebe0 Mon Sep 17 00:00:00 2001 From: Greg Watson Date: Mon, 7 Oct 2013 11:41:49 -0400 Subject: [PATCH] Check for changes before opening connection. Signed-off-by: Greg Watson --- .../local/LocalConnectionWorkingCopy.java | 55 +++++++++++++++++++ .../core/IRemoteConnectionWorkingCopy.java | 14 +++++ .../remote/jsch/core/JSchConnection.java | 10 +++- .../jsch/core/JSchConnectionWorkingCopy.java | 32 +++++++++++ .../internal/remote/ui/messages/Messages.java | 4 ++ .../remote/ui/messages/messages.properties | 2 + .../ConnectionsPreferencePage.java | 38 +++++++++++++ 7 files changed, 152 insertions(+), 3 deletions(-) diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/internal/remote/core/services/local/LocalConnectionWorkingCopy.java b/bundles/org.eclipse.remote.core/src/org/eclipse/internal/remote/core/services/local/LocalConnectionWorkingCopy.java index 8462d0062ec..64063b92c8b 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/internal/remote/core/services/local/LocalConnectionWorkingCopy.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/internal/remote/core/services/local/LocalConnectionWorkingCopy.java @@ -22,36 +22,91 @@ public class LocalConnectionWorkingCopy extends LocalConnection implements IRemo fOriginal = connection; } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#getOriginal() + */ + @Override + public IRemoteConnection getOriginal() { + return fOriginal; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#isDirty() + */ + @Override + public boolean isDirty() { + return false; + } + + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#save() + */ @Override public IRemoteConnection save() { return fOriginal; } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setAddress(java.lang.String) + */ @Override public void setAddress(String address) { // Do nothing } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setAttribute(java.lang.String, java.lang.String) + */ @Override public void setAttribute(String key, String value) { // Do nothing } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setName(java.lang.String) + */ @Override public void setName(String name) { // Do nothing } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setPassword(java.lang.String) + */ @Override public void setPassword(String password) { // Do nothing } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setPort(int) + */ @Override public void setPort(int port) { // Do nothing } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setUsername(java.lang.String) + */ @Override public void setUsername(String username) { // Do nothing diff --git a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionWorkingCopy.java b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionWorkingCopy.java index 4aecbd69295..3f16adfc4b4 100644 --- a/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionWorkingCopy.java +++ b/bundles/org.eclipse.remote.core/src/org/eclipse/remote/core/IRemoteConnectionWorkingCopy.java @@ -11,6 +11,20 @@ package org.eclipse.remote.core; public interface IRemoteConnectionWorkingCopy extends IRemoteConnection { + /** + * Returns the original connection this working copy was created from. + * + * @return original connection + */ + public IRemoteConnection getOriginal(); + + /** + * Returns whether this connection has been modified since it was last saved or created. + * + * @return true if the connection has been modified + */ + public boolean isDirty(); + /** * Saves this working copy to its original connection and returns a handle to the resulting connection. Has no effect if this * connection does not need saving. diff --git a/bundles/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnection.java b/bundles/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnection.java index 92081772f38..01eef1de679 100644 --- a/bundles/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnection.java +++ b/bundles/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnection.java @@ -97,6 +97,10 @@ public class JSchConnection implements IRemoteConnection { if (logging) { System.out.println("promptPassword:" + message); //$NON-NLS-1$ } + if (firstTry && !getPassword().equals("")) { //$NON-NLS-1$ + firstTry = false; + return true; + } if (fAuthenticator != null) { PasswordAuthentication auth = fAuthenticator.prompt(null, message); if (auth == null) { @@ -117,11 +121,11 @@ public class JSchConnection implements IRemoteConnection { return true; } if (fAuthenticator != null) { - String[] results = fAuthenticator.prompt("", "", message, new String[] { message }, new boolean[] { true }); //$NON-NLS-1$//$NON-NLS-2$ - if (results == null) { + PasswordAuthentication auth = fAuthenticator.prompt(null, message); + if (auth == null) { return false; } - fAttributes.setSecureAttribute(JSchConnectionAttributes.PASSPHRASE_ATTR, results[0]); + fAttributes.setSecureAttribute(JSchConnectionAttributes.PASSPHRASE_ATTR, new String(auth.getPassword())); } return true; } diff --git a/bundles/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionWorkingCopy.java b/bundles/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionWorkingCopy.java index bb5f1cf9ca9..bcf1d98cd5a 100644 --- a/bundles/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionWorkingCopy.java +++ b/bundles/org.eclipse.remote.jsch.core/src/org/eclipse/internal/remote/jsch/core/JSchConnectionWorkingCopy.java @@ -23,11 +23,13 @@ import org.eclipse.remote.core.IRemoteConnectionWorkingCopy; public class JSchConnectionWorkingCopy extends JSchConnection implements IRemoteConnectionWorkingCopy { private final JSchConnectionAttributes fWorkingAttributes; private final JSchConnection fOriginal; + private boolean fIsDirty; public JSchConnectionWorkingCopy(JSchConnection connection) { super(connection.getName(), connection.getRemoteServices()); fWorkingAttributes = connection.getInfo().copy(); fOriginal = connection; + fIsDirty = false; } /* @@ -65,6 +67,15 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote return fWorkingAttributes.getName(); } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#getOriginal() + */ + public IRemoteConnection getOriginal() { + return fOriginal; + } + /* * (non-Javadoc) * @@ -125,6 +136,15 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote return this; } + /* + * (non-Javadoc) + * + * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#isDirty() + */ + public boolean isDirty() { + return fIsDirty; + } + /* * (non-Javadoc) * @@ -153,6 +173,7 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote } info.save(); getManager().add(fOriginal); + fIsDirty = false; return fOriginal; } @@ -162,6 +183,7 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setAddress(java.lang.String) */ public void setAddress(String address) { + fIsDirty = true; fWorkingAttributes.setAttribute(JSchConnectionAttributes.ADDRESS_ATTR, address); } @@ -171,14 +193,17 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setAttribute(java.lang.String, java.lang.String) */ public void setAttribute(String key, String value) { + fIsDirty = true; fWorkingAttributes.setAttribute(key, value); } public void setIsPasswordAuth(boolean flag) { + fIsDirty = true; fWorkingAttributes.setAttribute(JSchConnectionAttributes.IS_PASSWORD_ATTR, Boolean.toString(flag)); } public void setKeyFile(String keyFile) { + fIsDirty = true; fWorkingAttributes.setAttribute(JSchConnectionAttributes.KEYFILE_ATTR, keyFile); } @@ -193,10 +218,12 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setName(java.lang.String) */ public void setName(String name) { + fIsDirty = true; fWorkingAttributes.setName(name); } public void setPassphrase(String passphrase) { + fIsDirty = true; fWorkingAttributes.setSecureAttribute(JSchConnectionAttributes.PASSPHRASE_ATTR, passphrase); } @@ -206,6 +233,7 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setPassword(java.lang.String) */ public void setPassword(String password) { + fIsDirty = true; fWorkingAttributes.setSecureAttribute(JSchConnectionAttributes.PASSWORD_ATTR, password); } @@ -215,14 +243,17 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setPort(int) */ public void setPort(int port) { + fIsDirty = true; fWorkingAttributes.setAttribute(JSchConnectionAttributes.PORT_ATTR, Integer.toString(port)); } public void setTimeout(int timeout) { + fIsDirty = true; fWorkingAttributes.setAttribute(JSchConnectionAttributes.TIMEOUT_ATTR, Integer.toString(timeout)); } public void setUseLoginShell(boolean flag) { + fIsDirty = true; fWorkingAttributes.setAttribute(JSchConnectionAttributes.USE_LOGIN_SHELL_ATTR, Boolean.toString(flag)); } @@ -232,6 +263,7 @@ public class JSchConnectionWorkingCopy extends JSchConnection implements IRemote * @see org.eclipse.remote.core.IRemoteConnectionWorkingCopy#setUsername(java.lang.String) */ public void setUsername(String userName) { + fIsDirty = true; fWorkingAttributes.setAttribute(JSchConnectionAttributes.USERNAME_ATTR, userName); } } diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/messages/Messages.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/messages/Messages.java index 9b686d52580..7c8af58ce68 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/messages/Messages.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/messages/Messages.java @@ -26,6 +26,8 @@ public class Messages extends NLS { public static String ConnectionsPreferencePage_Close; + public static String ConnectionsPreferencePage_Confirm_Actions; + public static String ConnectionsPreferencePage_Connection_Name; public static String ConnectionsPreferencePage_Edit; @@ -42,6 +44,8 @@ public class Messages extends NLS { public static String ConnectionsPreferencePage_Status; + public static String ConnectionsPreferencePage_This_connection_contains_unsaved_changes; + public static String ConnectionsPreferencePage_User; public static String LocalUIConnectionManager_0; diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/messages/messages.properties b/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/messages/messages.properties index c47fe19d153..ef10df6b39b 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/messages/messages.properties +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/messages/messages.properties @@ -10,6 +10,7 @@ AbstractRemoteUIConnectionManager_Connection_Error=Connection Error ConnectionsPreferencePage_Add=Add ConnectionsPreferencePage_Close=Close ConnectionsPreferencePage_closed=closed +ConnectionsPreferencePage_Confirm_Actions=Confirm Actions ConnectionsPreferencePage_Connection_Name=Connection Name ConnectionsPreferencePage_Edit=Edit ConnectionsPreferencePage_Host=Host @@ -18,6 +19,7 @@ ConnectionsPreferencePage_Open=Open ConnectionsPreferencePage_Remote_Services=Remote Services: ConnectionsPreferencePage_Remove=Remove ConnectionsPreferencePage_Status=Status +ConnectionsPreferencePage_This_connection_contains_unsaved_changes=This connection contains unsaved changes. Do you wish to save before opening the connection? ConnectionsPreferencePage_User=User LocalUIConnectionManager_0=Connection Error LocalUIConnectionManager_1=Could not open connection diff --git a/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/preferences/ConnectionsPreferencePage.java b/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/preferences/ConnectionsPreferencePage.java index 4fd52e8f0bc..74f5200435b 100644 --- a/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/preferences/ConnectionsPreferencePage.java +++ b/bundles/org.eclipse.remote.ui/src/org/eclipse/internal/remote/ui/preferences/ConnectionsPreferencePage.java @@ -19,6 +19,8 @@ import org.eclipse.internal.remote.core.RemoteServicesDescriptor; import org.eclipse.internal.remote.core.RemoteServicesImpl; import org.eclipse.internal.remote.core.preferences.Preferences; import org.eclipse.internal.remote.ui.messages.Messages; +import org.eclipse.jface.dialogs.IDialogConstants; +import org.eclipse.jface.dialogs.MessageDialog; import org.eclipse.jface.preference.PreferencePage; import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.jface.viewers.ColumnLayoutData; @@ -41,6 +43,8 @@ import org.eclipse.remote.ui.IRemoteUIConnectionWizard; import org.eclipse.remote.ui.RemoteUIServices; import org.eclipse.remote.ui.widgets.RemoteConnectionWidget; import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.SelectionAdapter; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.graphics.Image; @@ -262,6 +266,21 @@ public class ConnectionsPreferencePage extends PreferencePage implements IWorkbe fConnectionTable.setLayoutData(data); fConnectionTable.setFont(parent.getFont()); fConnectionTable.addSelectionListener(fEventHandler); + fConnectionTable.addMouseListener(new MouseListener() { + public void mouseDoubleClick(MouseEvent e) { + if (fSelectedConnection != null && !fSelectedConnection.isOpen()) { + editConnection(); + } + } + + public void mouseDown(MouseEvent e) { + // Nothing + } + + public void mouseUp(MouseEvent e) { + // Nothing + } + }); TableLayout tableLayout = new TableLayout(); fConnectionTable.setLayout(tableLayout); @@ -438,6 +457,25 @@ public class ConnectionsPreferencePage extends PreferencePage implements IWorkbe if (conn.isOpen()) { conn.close(); } else { + if (conn instanceof IRemoteConnectionWorkingCopy) { + IRemoteConnectionWorkingCopy wc = (IRemoteConnectionWorkingCopy) conn; + if (wc.isDirty()) { + MessageDialog dialog = new MessageDialog(getShell(), Messages.ConnectionsPreferencePage_Confirm_Actions, null, + Messages.ConnectionsPreferencePage_This_connection_contains_unsaved_changes, + MessageDialog.QUESTION, new String[] { IDialogConstants.YES_LABEL, IDialogConstants.NO_LABEL, + IDialogConstants.CANCEL_LABEL }, 0); + switch (dialog.open()) { + case 0: + wc.save(); + break; + case 1: + conn = wc.getOriginal(); + break; + case 2: + return; + } + } + } IRemoteUIConnectionManager mgr = RemoteUIServices.getRemoteUIServices(conn.getRemoteServices()) .getUIConnectionManager(); if (mgr != null) {