diff --git a/sql12/core/doc/changes.txt b/sql12/core/doc/changes.txt index 65c2f3580a..bbdb2087c0 100755 --- a/sql12/core/doc/changes.txt +++ b/sql12/core/doc/changes.txt @@ -6,6 +6,13 @@ Not yet released, available in our GIT repository, snapshots and future releases Enhancements: +https://github.com/squirrel-sql-client/squirrel-sql-code/issues/82 + SQuirreL allows multiple proxy settings which can be assigned to Aliases. + At menu File --> Global Preferences --> tab Proxy, + besides the default proxy settings additional settings can be defined. + The Aliases dialog offers a button (router icon) to choose a proxy setting. + The main frame's status bar has a new section displaying the currently used proxy. + https://github.com/squirrel-sql-client/squirrel-sql-code/issues/75 The options "Allow to run all SQLs in editor" and "Allow to run a SQL in all open Sessions" are now switched off by default. See menu File --> Global Preferences tab SQL. diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/Application.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/Application.java index 51e0954086..fde577df9c 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/Application.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/Application.java @@ -52,6 +52,7 @@ import net.sourceforge.squirrel_sql.client.gui.builders.UIFactory; import net.sourceforge.squirrel_sql.client.gui.db.AliasesAndDriversManager; import net.sourceforge.squirrel_sql.client.gui.db.GlobalSQLAliasVersioner; +import net.sourceforge.squirrel_sql.client.gui.db.NonDefaultProxySwitcher; import net.sourceforge.squirrel_sql.client.gui.db.encryption.AliasKeyPasswordManager; import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DesktopStyle; import net.sourceforge.squirrel_sql.client.gui.laf.AllBluesBoldMetalTheme; @@ -106,7 +107,6 @@ import net.sourceforge.squirrel_sql.fw.util.BaseException; import net.sourceforge.squirrel_sql.fw.util.ClassLoaderListener; import net.sourceforge.squirrel_sql.fw.util.IMessageHandler; -import net.sourceforge.squirrel_sql.fw.util.ProxyHandler; import net.sourceforge.squirrel_sql.fw.util.SquirrelLookAndFeelHandler; import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; @@ -244,6 +244,9 @@ public class Application implements IApplication private AliasKeyPasswordManager _aliasKeyPasswordManager = new AliasKeyPasswordManager(); + private NonDefaultProxySwitcher _nonDefaultProxySwitcher = new NonDefaultProxySwitcher(); + + public Application() { } @@ -1070,9 +1073,9 @@ private void preferencesHaveChanged(PropertyChangeEvent evt) DriverManager.setLoginTimeout(_globalPreferences.getLoginTimeout()); } - if (propName == null || propName == SquirrelPreferences.IPropertyNames.PROXY) + if(propName == null || propName.equals(SquirrelPreferences.IPropertyNames.PROXY)) { - new ProxyHandler().apply(_globalPreferences.getProxySettings()); + getNonDefaultProxySwitcher().updateDefaultProxyWhenItsDue(); } } @@ -1545,4 +1548,10 @@ public AliasKeyPasswordManager getAliasKeyPasswordManager() { return _aliasKeyPasswordManager; } + + @Override + public NonDefaultProxySwitcher getNonDefaultProxySwitcher() + { + return _nonDefaultProxySwitcher; + } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/IApplication.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/IApplication.java index 3f164cc6ae..ff8fd39a8b 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/IApplication.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/IApplication.java @@ -28,6 +28,7 @@ import net.sourceforge.squirrel_sql.client.gui.WindowManager; import net.sourceforge.squirrel_sql.client.gui.db.AliasesAndDriversManager; import net.sourceforge.squirrel_sql.client.gui.db.GlobalSQLAliasVersioner; +import net.sourceforge.squirrel_sql.client.gui.db.NonDefaultProxySwitcher; import net.sourceforge.squirrel_sql.client.gui.db.encryption.AliasKeyPasswordManager; import net.sourceforge.squirrel_sql.client.gui.desktopcontainer.DesktopStyle; import net.sourceforge.squirrel_sql.client.gui.mainframe.MainFrame; @@ -309,4 +310,6 @@ interface IMenuIDs extends MainFrame.IMenuIDs SyntaxManager getSyntaxManager(); AliasKeyPasswordManager getAliasKeyPasswordManager(); + + NonDefaultProxySwitcher getNonDefaultProxySwitcher(); } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasInternalFrame.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasInternalFrame.java index ea13279277..23711e8cc9 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasInternalFrame.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/AliasInternalFrame.java @@ -39,8 +39,10 @@ import javax.swing.JComboBox; import javax.swing.JInternalFrame; import javax.swing.JLabel; +import javax.swing.JMenuItem; import javax.swing.JOptionPane; import javax.swing.JPanel; +import javax.swing.JPopupMenu; import javax.swing.JSeparator; import javax.swing.JTextField; import javax.swing.SwingConstants; @@ -69,11 +71,13 @@ import net.sourceforge.squirrel_sql.fw.sql.SQLConnection; import net.sourceforge.squirrel_sql.fw.util.IObjectCacheChangeListener; import net.sourceforge.squirrel_sql.fw.util.ObjectCacheChangeEvent; +import net.sourceforge.squirrel_sql.fw.util.ProxySettings; import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; import net.sourceforge.squirrel_sql.fw.util.Utilities; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; +import org.apache.commons.lang3.StringUtils; import static net.sourceforge.squirrel_sql.client.preferences.PreferenceType.ALIAS_DEFINITIONS; /** @@ -130,10 +134,16 @@ public class AliasInternalFrame extends DialogWidget private JCheckBox _chkSavePasswordEncrypted = new JCheckBox(SQLAliasPropType.encryptPassword.getI18nString()); - private JCheckBox _chkReadOnly = new JCheckBox(SQLAliasPropType.readOnly.getI18nString()); - /** Button that brings up the driver properties dialog. */ private final JButton _btnAliasProps = new JButton(s_stringMgr.getString("AliasInternalFrame.props")); + + private final JButton _btnChooseNonDefaultProxySettings = new JButton(Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.PROXY)); + private final JLabel _lblNonDefaultProxySettings = new JLabel(); + + + private JCheckBox _chkReadOnly = new JCheckBox(SQLAliasPropType.readOnly.getI18nString()); + + private AliasSheetOkListener _aliasSheetOkListener; @@ -220,7 +230,6 @@ private void loadData() _chkConnectAtStartup.setSelected(_sqlAlias.isConnectAtStartup()); _chkSavePasswordEncrypted.setSelected(_sqlAlias.isEncryptPassword()); _chkReadOnly.setSelected(_sqlAlias.isReadOnly()); - //_useDriverPropsChk.setSelected(_sqlAlias.getUseDriverProperties()); if (_maintType != AliasMaintenanceType.NEW) { @@ -235,9 +244,14 @@ private void loadData() _txtUrl.setText(driver.getUrl()); } } + + if(Main.getApplication().getNonDefaultProxySwitcher().hasValidNonDefaultProxySettings(_sqlAlias)) + { + _lblNonDefaultProxySettings.setText(_sqlAlias.getNonDefaultProxySettingsName()); + } } - private String loadPassword() + private String loadPassword() { String password = null; try @@ -312,6 +326,7 @@ private void applyFromDialog(SQLAlias alias) throws ValidationException alias.setAutoLogon(_chkAutoLogon.isSelected()); alias.setConnectAtStartup(_chkConnectAtStartup.isSelected()); + alias.setNonDefaultProxySettingsName(StringUtils.isBlank(_lblNonDefaultProxySettings.getText()) ? null : _lblNonDefaultProxySettings.getText()); } private void showNewDriverDialog() @@ -332,6 +347,35 @@ private void showDriverPropertiesDialog() } } + private void chooseNonDefaultProxySettings() + { + ProxySettings[] buf = Main.getApplication().getSquirrelPreferences().getAdditionalNamedProxySettings(); + if(0 == buf.length) + { + JOptionPane.showMessageDialog(_btnChooseNonDefaultProxySettings, s_stringMgr.getString("AliasInternalFrame.no.non.default.proxy.setting.defined")); + return; + } + + JPopupMenu mnuChooseProxy = new JPopupMenu(); + + JMenuItem menuItem; + + menuItem = new JMenuItem(s_stringMgr.getString("AliasInternalFrame.no.non.default.proxy")); + menuItem.addActionListener(e -> _lblNonDefaultProxySettings.setText(null)); + mnuChooseProxy.add(menuItem); + + for(ProxySettings ps : buf) + { + menuItem = new JMenuItem(ps.getSettingName()); + menuItem.addActionListener(e -> _lblNonDefaultProxySettings.setText(ps.getSettingName())); + mnuChooseProxy.add(menuItem); + } + + mnuChooseProxy.show(_btnChooseNonDefaultProxySettings, 0,0); + + } + + /** * Create user interface for this sheet. */ @@ -411,8 +455,6 @@ private void createUserInterface() private JPanel createDataEntryPanel() { - _btnAliasProps.addActionListener(evt -> showDriverPropertiesDialog()); - JPanel pnl = new JPanel(new GridBagLayout()); GridBagConstraints gbc; @@ -468,11 +510,10 @@ private JPanel createDataEntryPanel() pnl.add(createPasswordEncryptedPanel(), gbc); gbc = new GridBagConstraints(0,7, GridBagConstraints.REMAINDER, 1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); - _btnAliasProps.setIcon(Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.ALIAS_PROPERTIES)); - pnl.add(_btnAliasProps, gbc); + pnl.add(createAliasPropsAndNonDefaultProxyPanel(), gbc); gbc = new GridBagConstraints(0,8,GridBagConstraints.REMAINDER,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); - pnl.add(getReadOnlyPanel(), gbc); + pnl.add(createReadOnlyPanel(), gbc); // make it grow when added @@ -482,7 +523,29 @@ private JPanel createDataEntryPanel() return pnl; } - private JPanel createPasswordEncryptedPanel() + private JPanel createAliasPropsAndNonDefaultProxyPanel() + { + JPanel ret = new JPanel(new GridBagLayout()); + + GridBagConstraints gbc; + + gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0); + _btnAliasProps.setIcon(Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.ALIAS_PROPERTIES)); + _btnAliasProps.addActionListener(evt -> showDriverPropertiesDialog()); + ret.add(_btnAliasProps, gbc); + + gbc = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,10,0,0), 0,0); + _btnChooseNonDefaultProxySettings.setToolTipText(s_stringMgr.getString("AliasInternalFrame.choose.non.default.proxy.setting")); + _btnChooseNonDefaultProxySettings.addActionListener(e -> chooseNonDefaultProxySettings()); + ret.add(GUIUtils.styleAsToolbarButton(_btnChooseNonDefaultProxySettings, false, false, _btnAliasProps.getPreferredSize().height), gbc); + + gbc = new GridBagConstraints(2,0,1,1,1,0,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,0,0,0), 0,0); + ret.add(_lblNonDefaultProxySettings, gbc); + + return ret; + } + + private JPanel createPasswordEncryptedPanel() { JPanel ret = new JPanel(new GridBagLayout()); @@ -500,7 +563,7 @@ private JPanel createPasswordEncryptedPanel() return ret; } - private JPanel getReadOnlyPanel() + private JPanel createReadOnlyPanel() { JPanel ret = new JPanel(new GridBagLayout()); diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/ConnectionInternalFrameHandler.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/ConnectionInternalFrameHandler.java index 8b39f9bf98..5a46ca43a9 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/ConnectionInternalFrameHandler.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/ConnectionInternalFrameHandler.java @@ -1,5 +1,6 @@ package net.sourceforge.squirrel_sql.client.gui.db; +import javax.swing.SwingUtilities; import net.sourceforge.squirrel_sql.client.IApplication; import net.sourceforge.squirrel_sql.client.Main; import net.sourceforge.squirrel_sql.client.gui.db.encryption.AliasPasswordHandler; @@ -18,8 +19,6 @@ import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; -import javax.swing.SwingUtilities; - /** * Handler used for connection internal frame actions. */ @@ -142,6 +141,7 @@ public void doConnect() { final OpenConnectionCommand cmd = new OpenConnectionCommand(_alias, _user, _password, _props); + Main.getApplication().getNonDefaultProxySwitcher().maybeApplyNonDefaultProxySettings(_alias); cmd.executeConnectAndWaitForResultInBackground(t -> afterExecuteFinished(sqlDriver, cmd, t)); } @@ -154,6 +154,7 @@ public void doConnect() private void afterExecuteFinished(ISQLDriver sqlDriver, OpenConnectionCommand cmd, Throwable t) { + ISession createdSession = null; try { if(null != t) @@ -202,7 +203,7 @@ private void afterExecuteFinished(ISQLDriver sqlDriver, OpenConnectionCommand cm _callback.connected(conn); if(_createSession) { - createSession(sqlDriver, conn); + createdSession = createSession(sqlDriver, conn); } else { @@ -215,6 +216,20 @@ private void afterExecuteFinished(ISQLDriver sqlDriver, OpenConnectionCommand cm _connectionInternalFrame.finishedCreatingConnection(false); _callback.errorOccurred(th, _connectWasCanceled); } + finally + { + if(null != createdSession) + { + if(null != Main.getApplication().getSessionManager().getActiveSession()) + { + Main.getApplication().getNonDefaultProxySwitcher().maybeApplyNonDefaultProxySettings(Main.getApplication().getSessionManager().getActiveSession().getAlias()); + } + else + { + Main.getApplication().getNonDefaultProxySwitcher().allSessionsClosed(); + } + } + } } private void closeCanceledConnection(ISQLConnection conn) diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/I18NStrings.properties b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/I18NStrings.properties index 21442b302c..3e94dd9974 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/I18NStrings.properties +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/I18NStrings.properties @@ -194,4 +194,9 @@ DriverInternalFrame.jdbc.driver.classpath.description=Add JDBC driver JAR file(s ConnectionInternalFrameHandler.error.opensession=Error opening session AliasInternalFrame.missingAliasKeyPassword.open.with.empty.password=The Alias key password was not entered. Do you wish to open the Alias with empty password?\n\ - Note: If you save the Alias the previous password will be lost. \ No newline at end of file + Note: If you save the Alias the previous password will be lost. + +AliasInternalFrame.choose.non.default.proxy.setting=In case you defined non default proxy settings in out global preferences. You may choose one to use with this Alias + +AliasInternalFrame.no.non.default.proxy.setting.defined=No non default proxy settings configured in Global Preferences +AliasInternalFrame.no.non.default.proxy= \ No newline at end of file diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/NonDefaultProxySwitcher.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/NonDefaultProxySwitcher.java new file mode 100644 index 0000000000..16d20258a7 --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/NonDefaultProxySwitcher.java @@ -0,0 +1,81 @@ +package net.sourceforge.squirrel_sql.client.gui.db; + +import java.util.Optional; +import java.util.stream.Stream; +import net.sourceforge.squirrel_sql.client.Main; +import net.sourceforge.squirrel_sql.fw.util.ProxyHandler; +import net.sourceforge.squirrel_sql.fw.util.ProxySettings; +import org.apache.commons.lang3.StringUtils; + +public class NonDefaultProxySwitcher +{ + private ProxySettings _currentProxySettings; + private NonDefaultProxySwitcherListener _listener; + + public boolean hasValidNonDefaultProxySettings(SQLAlias sqlAlias) + { + return false == StringUtils.isBlank(sqlAlias.getNonDefaultProxySettingsName()) + && getNonDefaultProxySetting(sqlAlias).isPresent(); + } + + private Optional getNonDefaultProxySetting(SQLAlias sqlAlias) + { + ProxySettings[] additionalNamedProxySettings = Main.getApplication().getSquirrelPreferences().getAdditionalNamedProxySettings(); + return Stream.of(additionalNamedProxySettings).filter(ps -> StringUtils.equals(sqlAlias.getNonDefaultProxySettingsName(), ps.getSettingName())).findFirst(); + } + + public void maybeApplyNonDefaultProxySettings(SQLAlias sqlAlias) + { + if(false == hasValidNonDefaultProxySettings(sqlAlias)) + { + _currentProxySettings = Main.getApplication().getSquirrelPreferences().getProxySettings(); + } + else + { + _currentProxySettings = getNonDefaultProxySetting(sqlAlias).orElseThrow(); + } + applyCurrentProxy(); + } + + public void updateDefaultProxyWhenItsDue() + { + if(null == _currentProxySettings) + { + _currentProxySettings = Main.getApplication().getSquirrelPreferences().getProxySettings(); + } + + if(isDefaultSetting(_currentProxySettings) && isDefaultSetting(Main.getApplication().getSquirrelPreferences().getProxySettings())) + { + // When the default Proxy-Setting was updated in global preferences a new instance was created. + _currentProxySettings = Main.getApplication().getSquirrelPreferences().getProxySettings(); + applyCurrentProxy(); + } + } + + private boolean isDefaultSetting(ProxySettings proxySettings) + { + return null == proxySettings.getSettingName(); + } + + private void applyCurrentProxy() + { + ProxyHandler.apply(_currentProxySettings); + + if(null != _listener) + { + _listener.proxyChanged(_currentProxySettings); + } + } + + public void setListener(NonDefaultProxySwitcherListener listener) + { + _listener = listener; + _listener.proxyChanged(_currentProxySettings); + } + + public void allSessionsClosed() + { + _currentProxySettings = Main.getApplication().getSquirrelPreferences().getProxySettings(); + applyCurrentProxy(); + } +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/NonDefaultProxySwitcherListener.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/NonDefaultProxySwitcherListener.java new file mode 100644 index 0000000000..042f35096f --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/NonDefaultProxySwitcherListener.java @@ -0,0 +1,9 @@ +package net.sourceforge.squirrel_sql.client.gui.db; + +import net.sourceforge.squirrel_sql.fw.util.ProxySettings; + +@FunctionalInterface +public interface NonDefaultProxySwitcherListener +{ + void proxyChanged(ProxySettings proxySettings); +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/SQLAlias.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/SQLAlias.java index d97244c20f..583da3f138 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/SQLAlias.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/SQLAlias.java @@ -18,6 +18,7 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +import java.io.Serializable; import net.sourceforge.squirrel_sql.client.gui.db.modifyaliases.SQLAliasPropType; import net.sourceforge.squirrel_sql.fw.id.IHasIdentifier; import net.sourceforge.squirrel_sql.fw.id.IIdentifier; @@ -29,8 +30,6 @@ import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; import net.sourceforge.squirrel_sql.fw.util.Utilities; -import java.io.Serializable; - /** * This represents a Database alias which is a description of the means * required to connect to a JDBC complient database.

@@ -89,6 +88,8 @@ public class SQLAlias implements Serializable, Comparable, IHasIdentif private boolean _readOnly; + private String _nonDefaultProxySettingsName; + public SQLAlias() { distributeVersioner(); @@ -161,6 +162,7 @@ public void assignFromWithValidationException(SQLAlias sqlAlias, boolean withIde setAutoLogon(sqlAlias.isAutoLogon()); setUseDriverProperties(sqlAlias.getUseDriverProperties()); setDriverProperties(sqlAlias.getDriverPropertiesClone()); + setNonDefaultProxySettingsName(sqlAlias.getNonDefaultProxySettingsName()); setAliasVersionTimeMills(sqlAlias.getAliasVersionTimeMills()); _schemaProperties = Utilities.cloneObject(sqlAlias._schemaProperties, getClass().getClassLoader()); _schemaProperties.acceptAliasVersioner(_versioner); @@ -480,7 +482,7 @@ public SQLAliasSchemaProperties getSchemaProperties() } /** - * @see net.sourceforge.squirrel_sql.client.gui.db.SQLAlias#setSchemaProperties(net.sourceforge.squirrel_sql.client.gui.db.SQLAliasSchemaProperties) + * @see SQLAlias#setSchemaProperties(SQLAliasSchemaProperties) */ public void setSchemaProperties(SQLAliasSchemaProperties schemaProperties) { @@ -511,4 +513,14 @@ public void setConnectionProperties(SQLAliasConnectionProperties connectionPrope _connectionProperties = connectionProperties; _connectionProperties.acceptAliasVersioner(_versioner); } + + public void setNonDefaultProxySettingsName(String nonDefaultProxySettingsName) + { + _nonDefaultProxySettingsName = nonDefaultProxySettingsName; + } + + public String getNonDefaultProxySettingsName() + { + return _nonDefaultProxySettingsName; + } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/SQLAliasBeanInfo.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/SQLAliasBeanInfo.java index e634a7227f..0e0b347193 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/SQLAliasBeanInfo.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/SQLAliasBeanInfo.java @@ -49,14 +49,9 @@ interface IPropertyNames String SCHEMA_PROPERTIES = "schemaProperties"; String COLOR_PROPERTIES = "colorProperties"; String CONNECTION_PROPERTIES = "connectionProperties"; + String NON_DEFAULT_PROXY_SETTINGS_NAME = "nonDefaultProxySettingsName"; } - /** - * See http://tinyurl.com/63no6t for discussion of the proper thread-safe way to implement - * getPropertyDescriptors(). - * - * @see java.beans.SimpleBeanInfo#getPropertyDescriptors() - */ @Override public PropertyDescriptor[] getPropertyDescriptors() { @@ -79,7 +74,8 @@ public PropertyDescriptor[] getPropertyDescriptors() new PropertyDescriptor(IPropertyNames.ALIAS_VERSION_TIME_MILLIS, SQLAlias.class, "getAliasVersionTimeMills", "setAliasVersionTimeMills"), new PropertyDescriptor(IPropertyNames.SCHEMA_PROPERTIES, SQLAlias.class, "getSchemaProperties","setSchemaProperties"), new PropertyDescriptor(IPropertyNames.COLOR_PROPERTIES, SQLAlias.class, "getColorProperties","setColorProperties"), - new PropertyDescriptor(IPropertyNames.CONNECTION_PROPERTIES, SQLAlias.class, "getConnectionProperties","setConnectionProperties") + new PropertyDescriptor(IPropertyNames.CONNECTION_PROPERTIES, SQLAlias.class, "getConnectionProperties","setConnectionProperties"), + new PropertyDescriptor(IPropertyNames.NON_DEFAULT_PROXY_SETTINGS_NAME, SQLAlias.class, "getNonDefaultProxySettingsName","setNonDefaultProxySettingsName") }; return result; } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/encryption/I18NStrings.properties b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/encryption/I18NStrings.properties index 81814511b8..800d27653c 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/encryption/I18NStrings.properties +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/encryption/I18NStrings.properties @@ -48,3 +48,6 @@ AliasKeyPasswordStatusBarPanel.tooltip=Increase security of encrypted Alias pass AliasKeyPasswordStatusBarPanel.status.unused=Alias key password: Unused AliasKeyPasswordStatusBarPanel.status.logged.in=Alias key password: Logged in AliasKeyPasswordStatusBarPanel.status.logged.out=Alias key password: Logged out + + +ProxyStatusBarPanel.current.proxy=Name of current proxy: {0} \ No newline at end of file diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/encryption/ProxyStatusBarPanel.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/encryption/ProxyStatusBarPanel.java new file mode 100644 index 0000000000..dedcc5ca73 --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/gui/db/encryption/ProxyStatusBarPanel.java @@ -0,0 +1,96 @@ +package net.sourceforge.squirrel_sql.client.gui.db.encryption; + +import java.awt.Color; +import java.awt.GridLayout; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.Timer; +import net.sourceforge.squirrel_sql.client.Main; +import net.sourceforge.squirrel_sql.client.preferences.ProxyPreferenceTabComponent; +import net.sourceforge.squirrel_sql.client.resources.SquirrelResources; +import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; +import net.sourceforge.squirrel_sql.fw.util.JsonMarshalUtil; +import net.sourceforge.squirrel_sql.fw.util.ProxySettings; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; +import org.apache.commons.lang3.StringUtils; + +public class ProxyStatusBarPanel extends JPanel +{ + private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ProxyStatusBarPanel.class); + + private final JLabel _lblProxy; + private final Timer _proxyChangeIndicatingTimer; + private Color _originalLabelBackground; + private String _changeCheckJson; + + public ProxyStatusBarPanel() + { + super(new GridLayout()); + + _lblProxy = new JLabel(Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.PROXY_12x12), JLabel.LEADING); + _lblProxy.setOpaque(true); + + _originalLabelBackground = _lblProxy.getBackground(); + + _proxyChangeIndicatingTimer = new Timer(1000, e -> _lblProxy.setBackground(_originalLabelBackground)); + + _proxyChangeIndicatingTimer.setRepeats(false); + + GUIUtils.setPreferredWidth(_lblProxy, 70); + GUIUtils.setMinimumWidth(_lblProxy, 70); + + add(_lblProxy); + + Main.getApplication().getNonDefaultProxySwitcher().setListener(ps -> updatePanel(ps)); + + } + + public void updatePanel(ProxySettings currentProxySettings) + { + if(false == isChanged(currentProxySettings)) + { + return; + } + + _lblProxy.setText(getProxySettingsName(currentProxySettings)); + _lblProxy.setToolTipText(getLabelToolTip(currentProxySettings)); + _lblProxy.setBackground(Color.yellow); + _proxyChangeIndicatingTimer.restart(); + } + + private boolean isChanged(ProxySettings currentProxySettings) + { + String buf = JsonMarshalUtil.toJsonString(currentProxySettings); + + if(StringUtils.isBlank(_changeCheckJson)) + { + _changeCheckJson = buf; + return true; + } + + if(false == StringUtils.equals(_changeCheckJson, buf)) + { + _changeCheckJson = buf; + return true; + } + + return false; + } + + private String getLabelToolTip(ProxySettings currentProxySettings) + { + String unused = ""; + if( false == currentProxySettings.getSocksUseProxy() && false == currentProxySettings.getHttpUseProxy() ) + { + unused = ", unused"; + } + + return s_stringMgr.getString("ProxyStatusBarPanel.current.proxy", getProxySettingsName(currentProxySettings) + unused); + } + + private String getProxySettingsName(ProxySettings currentProxySettings) + { + return StringUtils.isBlank(currentProxySettings.getSettingName()) ? ProxyPreferenceTabComponent.DEFAULT_PROXY_SETTINGS_NAME : currentProxySettings.getSettingName(); + } +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/I18NStrings.properties b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/I18NStrings.properties index efaf97d4fb..f76b393818 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/I18NStrings.properties +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/I18NStrings.properties @@ -154,4 +154,17 @@ SQLPreferencesPanel.reload.changetrack.hint=Note: When the change tracking toolb SQLPreferencesPanel.notify.external.file.changes=Notify external file changes (requires application restart) -SQLPreferencesPanel.use.statement.separator.as.current.bounds=Use statement separator (instead of empty line) as bounds of current SQL \ No newline at end of file +SQLPreferencesPanel.use.statement.separator.as.current.bounds=Use statement separator (instead of empty line) as bounds of current SQL + + +ProxyAdditionalSettingsPanel.additional.settings.name=Settings name + +ProxyPreferenceTabComponent.cannot.delete.default.proxy.settings=Cannot delete default proxy settings. + +ProxySettingsAddDlg.ok=Ok +ProxySettingsAddDlg.cancel=Cancel +ProxySettingsAddDlg.add.proxy.setting=Add new proxy setting; +ProxySettingsAddDlg.enter.name.of.new.proxy.setting=Enter name of new proxy setting: + +ProxySettingsAddCtrl.proxy.settings.name.cannot.be.empty=Proxy settings name cannot be empty. +ProxySettingsAddCtrl.proxy.settings.name.already.exists=The proxy settings name already exists. \ No newline at end of file diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxyPreferenceTabComponent.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxyPreferenceTabComponent.java index 776cd82b9a..66085a9528 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxyPreferenceTabComponent.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxyPreferenceTabComponent.java @@ -1,23 +1,19 @@ package net.sourceforge.squirrel_sql.client.preferences; -import net.sourceforge.squirrel_sql.client.IApplication; -import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel; -import net.sourceforge.squirrel_sql.fw.util.IProxySettings; -import net.sourceforge.squirrel_sql.fw.util.ProxySettings; -import net.sourceforge.squirrel_sql.fw.util.StringManager; -import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; - -import javax.swing.BorderFactory; -import javax.swing.JCheckBox; -import javax.swing.JLabel; -import javax.swing.JPanel; -import javax.swing.JPasswordField; -import javax.swing.JTextField; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; +import java.util.ArrayList; +import java.util.List; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; +import net.sourceforge.squirrel_sql.fw.util.ProxySettings; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; +import net.sourceforge.squirrel_sql.fw.util.StringUtilities; +import net.sourceforge.squirrel_sql.fw.util.Utilities; +import org.apache.commons.lang3.StringUtils; /** * Created with IntelliJ IDEA. @@ -26,208 +22,221 @@ * Time: 16:13 * To change this template use File | Settings | File Templates. */ -final class ProxyPreferenceTabComponent extends JPanel +public final class ProxyPreferenceTabComponent extends JPanel { private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ProxyPreferenceTabComponent.class); + public static final String DEFAULT_PROXY_SETTINGS_NAME = ""; - private JCheckBox _httpUseProxyChk = new JCheckBox(s_stringMgr.getString("ProxyPreferencesPanel.useproxy")); - private JLabel _httpProxyServerLabel = new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.server"), JLabel.RIGHT); - private JTextField _httpProxyServer = new JTextField(); - private JLabel _httpProxyPortLabel = - new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.port"), JLabel.RIGHT); - private JTextField _httpProxyPort = new JTextField(); - private JLabel _httpProxyUserLabel = - new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.user"), JLabel.RIGHT); - private JTextField _httpProxyUser = new JTextField(); - private JLabel _httpProxyPasswordLabel = - new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.password"), JLabel.RIGHT); - private JPasswordField _httpProxyPassword = new JPasswordField(); - private JLabel _httpNonProxyHostsLabel = - new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.noproxyfor"), JLabel.RIGHT); - private JTextField _httpNonProxyHosts = new JTextField(); - private JCheckBox _socksUseProxyChk = new JCheckBox(s_stringMgr.getString("ProxyPreferencesPanel.useproxy")); - private JLabel _socksProxyServerLabel = - new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.server"), JLabel.RIGHT); - private JTextField _socksProxyServer = new JTextField(); - private JLabel _socksProxyPortLabel = - new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.port"), JLabel.RIGHT); - private JTextField _socksProxyPort = new JTextField(); + private final ProxySettingsPanel _pnl = new ProxySettingsPanel(); + private ArrayList _additionalNamedProxySettings; + private boolean _dontReactToAdditionalNamedProxySettingsChange; + private ProxySettings _defaultProxySettings; + private ProxySettings _currentSettings; ProxyPreferenceTabComponent() { - super(new GridBagLayout()); - createUserInterface(); - } + setLayout(new GridBagLayout()); - void loadData(IApplication app, SquirrelPreferences prefs) - { - final IProxySettings proxySettings = prefs.getProxySettings(); + GridBagConstraints gbc; + + gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(15,10,10,10), 0,0); + add(_pnl, gbc); - _httpUseProxyChk.setSelected(proxySettings.getHttpUseProxy()); - _httpProxyServer.setText(proxySettings.getHttpProxyServer()); - _httpProxyPort.setText(proxySettings.getHttpProxyPort()); - _httpNonProxyHosts.setText(proxySettings.getHttpNonProxyHosts()); - _httpProxyUser.setText(proxySettings.getHttpProxyUser()); - _httpProxyPassword.setText(proxySettings.getHttpProxyPassword()); + gbc = new GridBagConstraints(0,1,1,1,1,1,GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0); + add(new JPanel(), gbc); - _socksUseProxyChk.setSelected(proxySettings.getSocksUseProxy()); - _socksProxyServer.setText(proxySettings.getSocksProxyServer()); - _socksProxyPort.setText(proxySettings.getSocksProxyPort()); + _pnl.httpUseProxyChk.addActionListener(e -> updateEnabled()); + _pnl.socksUseProxyChk.addActionListener(e -> updateEnabled()); - updateControlStatus(); + _pnl.cboAdditionalSettingsNames.addActionListener(e -> onCboAdditionalSettingsNamesChanged()); + _pnl.btnAddProxySetting.addActionListener(e -> onAddNewSetting()); + _pnl.btnRemoveProxySetting.addActionListener(e -> onDeleteSetting()); } - void applyChanges(SquirrelPreferences prefs) + private void onDeleteSetting() { - final ProxySettings proxySettings = new ProxySettings(); + if(_currentSettings == _defaultProxySettings) + { + JOptionPane.showMessageDialog(this, s_stringMgr.getString("ProxyPreferenceTabComponent.cannot.delete.default.proxy.settings")); + return; + } - proxySettings.setHttpUseProxy(_httpUseProxyChk.isSelected()); - proxySettings.setHttpProxyServer(_httpProxyServer.getText()); - proxySettings.setHttpProxyPort(_httpProxyPort.getText()); - proxySettings.setHttpNonProxyHosts(_httpNonProxyHosts.getText()); - proxySettings.setHttpProxyUser(_httpProxyUser.getText()); + int indexOfSettingToDelete = _additionalNamedProxySettings.indexOf(_currentSettings); - String password = new String(_httpProxyPassword.getPassword()); - proxySettings.setHttpProxyPassword(password); + if(-1 == indexOfSettingToDelete) + { + throw new IllegalStateException("Must contain settings of name " + _currentSettings.getSettingName()); + } - proxySettings.setSocksUseProxy(_socksUseProxyChk.isSelected()); - proxySettings.setSocksProxyServer(_socksProxyServer.getText()); - proxySettings.setSocksProxyPort(_socksProxyPort.getText()); + _pnl.cboAdditionalSettingsNames.removeItemAt(indexOfSettingToDelete + 1); // + 1 because of the default setting name - prefs.setProxySettings(proxySettings); - } + _additionalNamedProxySettings.remove(indexOfSettingToDelete); + if(indexOfSettingToDelete + 1 < _additionalNamedProxySettings.size()) + { + _currentSettings = _additionalNamedProxySettings.get(indexOfSettingToDelete + 1); + } + else + { + _currentSettings = _additionalNamedProxySettings.get(indexOfSettingToDelete + 1 - 1); + } - private void updateControlStatus() - { - final boolean http = _httpUseProxyChk.isSelected(); - _httpProxyServerLabel.setEnabled(http); - _httpProxyServer.setEnabled(http); - _httpProxyPortLabel.setEnabled(http); - _httpProxyPort.setEnabled(http); - _httpNonProxyHostsLabel.setEnabled(http); - _httpNonProxyHosts.setEnabled(http); - _httpProxyUserLabel.setEnabled(http); - _httpProxyUser.setEnabled(http); - _httpProxyPasswordLabel.setEnabled(http); - _httpProxyPassword.setEnabled(http); - - final boolean socks = _socksUseProxyChk.isSelected(); - _socksProxyServerLabel.setEnabled(socks); - _socksProxyServer.setEnabled(socks); - _socksProxyPortLabel.setEnabled(socks); - _socksProxyPort.setEnabled(socks); - } + try(AutoCloseable ignored = () -> _dontReactToAdditionalNamedProxySettingsChange = false) + { + _dontReactToAdditionalNamedProxySettingsChange = true; + _pnl.cboAdditionalSettingsNames.setSelectedItem(_currentSettings.getSettingName()); + } + catch(Exception e) + { + throw Utilities.wrapRuntime(e); + } - private void createUserInterface() - { - final GridBagConstraints gbc = new GridBagConstraints(); - gbc.fill = GridBagConstraints.HORIZONTAL; - gbc.insets = new Insets(4, 4, 4, 4); - gbc.gridx = 0; - gbc.gridy = 0; - gbc.weightx = 1; - add(createHTTPPanel(), gbc); - ++gbc.gridy; - add(createSOCKSPanel(), gbc); - - final ActionListener lis = new MyActionHandler(); - _httpUseProxyChk.addActionListener(lis); - _socksUseProxyChk.addActionListener(lis); + applyCurrentSettingsToControls(); } - private JPanel createHTTPPanel() + private void onAddNewSetting() { + ProxySettingsAddCtrl proxySettingsAddCtrl = + new ProxySettingsAddCtrl( + _additionalNamedProxySettings.stream().map(ps -> ps.getSettingName()).toList(), + GUIUtils.getOwningWindow(this)); - JPanel pnl = new JPanel(new GridBagLayout()); - pnl.setBorder(BorderFactory.createTitledBorder(s_stringMgr.getString("ProxyPreferencesPanel.httpproxy"))); - - final GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.WEST; - gbc.insets = new Insets(4, 4, 4, 4); - gbc.gridx = 0; - gbc.gridy = 0; - pnl.add(_httpUseProxyChk, gbc); - - gbc.fill = GridBagConstraints.HORIZONTAL; - ++gbc.gridx; - pnl.add(_httpProxyServerLabel, gbc); - - ++gbc.gridy; - pnl.add(_httpProxyPortLabel, gbc); + if(false == proxySettingsAddCtrl.isOk()) + { + return; + } - ++gbc.gridy; - pnl.add(_httpProxyUserLabel, gbc); + applyChangesToCurrentSettings(); - ++gbc.gridy; - pnl.add(_httpProxyPasswordLabel, gbc); + _currentSettings = new ProxySettings(); + _currentSettings.setSettingName(proxySettingsAddCtrl.getNewSettingsName()); - ++gbc.gridy; - pnl.add(_httpNonProxyHostsLabel, gbc); + _additionalNamedProxySettings.add(_currentSettings); - ++gbc.gridy; - --gbc.gridx; - gbc.gridwidth = GridBagConstraints.REMAINDER; - pnl.add(new MultipleLineLabel(s_stringMgr.getString("ProxyPreferencesPane.notes")), gbc); - gbc.gridwidth = 1; - ++gbc.gridx; + try(AutoCloseable ignored = () -> _dontReactToAdditionalNamedProxySettingsChange = false) + { + _dontReactToAdditionalNamedProxySettingsChange = true; + _pnl.cboAdditionalSettingsNames.addItem(_currentSettings.getSettingName()); + _pnl.cboAdditionalSettingsNames.setSelectedItem(_currentSettings.getSettingName()); + } + catch(Exception e) + { + throw Utilities.wrapRuntime(e); + } - ++gbc.gridx; - gbc.gridy = 0; - gbc.weightx = 1; - pnl.add(_httpProxyServer, gbc); + applyCurrentSettingsToControls(); + } - ++gbc.gridy; - pnl.add(_httpProxyPort, gbc); + private void onCboAdditionalSettingsNamesChanged() + { + if(_dontReactToAdditionalNamedProxySettingsChange) + { + return; + } - ++gbc.gridy; - pnl.add(_httpProxyUser, gbc); + applyChangesToCurrentSettings(); - ++gbc.gridy; - pnl.add(_httpProxyPassword, gbc); + String newSelectedItem = (String) _pnl.cboAdditionalSettingsNames.getSelectedItem(); - ++gbc.gridy; - pnl.add(_httpNonProxyHosts, gbc); + if(StringUtils.equals(DEFAULT_PROXY_SETTINGS_NAME, newSelectedItem)) + { + _currentSettings = _defaultProxySettings; + } + else + { + _currentSettings = + _additionalNamedProxySettings.stream().filter(ps -> StringUtils.equals(ps.getSettingName(), newSelectedItem)).findFirst().orElseThrow(); + } - return pnl; + applyCurrentSettingsToControls(); } - private JPanel createSOCKSPanel() + void loadData(SquirrelPreferences prefs) { - JPanel pnl = new JPanel(new GridBagLayout()); - pnl.setBorder(BorderFactory.createTitledBorder(s_stringMgr.getString("ProxyPreferencesPanel.socksproxy"))); + _defaultProxySettings = Utilities.cloneObject(prefs.getProxySettings()); + _currentSettings = _defaultProxySettings; - final GridBagConstraints gbc = new GridBagConstraints(); - gbc.anchor = GridBagConstraints.WEST; - gbc.insets = new Insets(4, 4, 4, 4); - gbc.gridx = 0; - gbc.gridy = 0; - pnl.add(_socksUseProxyChk, gbc); + applyCurrentSettingsToControls(); - gbc.fill = GridBagConstraints.HORIZONTAL; - ++gbc.gridx; - pnl.add(_socksProxyServerLabel, gbc); + _additionalNamedProxySettings = new ArrayList<>(List.of(Utilities.cloneObject(prefs.getAdditionalNamedProxySettings()))); - ++gbc.gridy; - pnl.add(_socksProxyPortLabel, gbc); + try(AutoCloseable ignored = () -> _dontReactToAdditionalNamedProxySettingsChange = false) + { + _dontReactToAdditionalNamedProxySettingsChange = true; + _pnl.cboAdditionalSettingsNames.addItem(DEFAULT_PROXY_SETTINGS_NAME); + for(ProxySettings additionalNamedProxySetting : _additionalNamedProxySettings) + { + _pnl.cboAdditionalSettingsNames.addItem(additionalNamedProxySetting.getSettingName()); + } + + _pnl.cboAdditionalSettingsNames.setSelectedItem(DEFAULT_PROXY_SETTINGS_NAME); + } + catch(Exception e) + { + throw Utilities.wrapRuntime(e); + } - ++gbc.gridx; - gbc.gridy = 0; - gbc.weightx = 1; - pnl.add(_socksProxyServer, gbc); + updateEnabled(); + } - ++gbc.gridy; - pnl.add(_socksProxyPort, gbc); + private void applyCurrentSettingsToControls() + { + _pnl.httpUseProxyChk.setSelected(_currentSettings.getHttpUseProxy()); + _pnl.httpProxyServer.setText(_currentSettings.getHttpProxyServer()); + _pnl.httpProxyPort.setText(_currentSettings.getHttpProxyPort()); + _pnl.httpNonProxyHosts.setText(_currentSettings.getHttpNonProxyHosts()); + _pnl.httpProxyUser.setText(_currentSettings.getHttpProxyUser()); + _pnl.httpProxyPassword.setText(_currentSettings.getHttpProxyPassword()); + + _pnl.socksUseProxyChk.setSelected(_currentSettings.getSocksUseProxy()); + _pnl.socksProxyServer.setText(_currentSettings.getSocksProxyServer()); + _pnl.socksProxyPort.setText(_currentSettings.getSocksProxyPort()); + + updateEnabled(); + } - return pnl; + void applyChangesToSquirrelPrefs(SquirrelPreferences prefs) + { + applyChangesToCurrentSettings(); + + prefs.setProxySettings(_defaultProxySettings); + prefs.setAdditionalNamedProxySettings(_additionalNamedProxySettings.toArray(new ProxySettings[0])); } - private final class MyActionHandler implements ActionListener + private void applyChangesToCurrentSettings() { - public void actionPerformed(ActionEvent evt) - { - updateControlStatus(); - } + _currentSettings.setHttpUseProxy(_pnl.httpUseProxyChk.isSelected()); + _currentSettings.setHttpProxyServer(StringUtilities.emptyToNull(_pnl.httpProxyServer.getText())); + _currentSettings.setHttpProxyPort(StringUtilities.emptyToNull(_pnl.httpProxyPort.getText())); + _currentSettings.setHttpNonProxyHosts(StringUtilities.emptyToNull(_pnl.httpNonProxyHosts.getText())); + _currentSettings.setHttpProxyUser(StringUtilities.emptyToNull(_pnl.httpProxyUser.getText())); + _currentSettings.setHttpProxyPassword(StringUtilities.emptyToNull(new String(_pnl.httpProxyPassword.getPassword()))); + + _currentSettings.setSocksUseProxy(_pnl.socksUseProxyChk.isSelected()); + _currentSettings.setSocksProxyServer(StringUtilities.emptyToNull(_pnl.socksProxyServer.getText())); + _currentSettings.setSocksProxyPort(StringUtilities.emptyToNull(_pnl.socksProxyPort.getText())); } + + private void updateEnabled() + { + final boolean http = _pnl.httpUseProxyChk.isSelected(); + _pnl.httpProxyServerLabel.setEnabled(http); + _pnl.httpProxyServer.setEnabled(http); + _pnl.httpProxyPortLabel.setEnabled(http); + _pnl.httpProxyPort.setEnabled(http); + _pnl.httpNonProxyHostsLabel.setEnabled(http); + _pnl.httpNonProxyHosts.setEnabled(http); + _pnl.httpProxyUserLabel.setEnabled(http); + _pnl.httpProxyUser.setEnabled(http); + _pnl.httpProxyPasswordLabel.setEnabled(http); + _pnl.httpProxyPassword.setEnabled(http); + + final boolean socks = _pnl.socksUseProxyChk.isSelected(); + _pnl.socksProxyServerLabel.setEnabled(socks); + _pnl.socksProxyServer.setEnabled(socks); + _pnl.socksProxyPortLabel.setEnabled(socks); + _pnl.socksProxyPort.setEnabled(socks); + } + } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxyPreferencesPanel.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxyPreferencesPanel.java index 7ca741313a..bd91a1c429 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxyPreferencesPanel.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxyPreferencesPanel.java @@ -18,12 +18,11 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +import java.awt.Component; import net.sourceforge.squirrel_sql.client.IApplication; import net.sourceforge.squirrel_sql.fw.util.StringManager; import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; -import java.awt.Component; - class ProxyPreferencesPanel implements IGlobalPreferencesPanel { /** Internationalized strings for this class. */ @@ -53,7 +52,7 @@ public void initialize(IApplication app) _app = app; - ((ProxyPreferenceTabComponent)getPanelComponent()).loadData(_app, _app.getSquirrelPreferences()); + ((ProxyPreferenceTabComponent)getPanelComponent()).loadData(_app.getSquirrelPreferences()); } public void uninitialize(IApplication app) @@ -72,7 +71,7 @@ public synchronized Component getPanelComponent() public void applyChanges() { - _myPanel.applyChanges(_app.getSquirrelPreferences()); + _myPanel.applyChangesToSquirrelPrefs(_app.getSquirrelPreferences()); } public String getTitle() diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsAddCtrl.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsAddCtrl.java new file mode 100644 index 0000000000..54a95cc0d2 --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsAddCtrl.java @@ -0,0 +1,67 @@ +package net.sourceforge.squirrel_sql.client.preferences; + +import java.awt.Window; +import java.util.List; +import javax.swing.JOptionPane; +import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; +import org.apache.commons.lang3.StringUtils; + +public class ProxySettingsAddCtrl +{ + private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ProxySettingsAddCtrl.class); + + private ProxySettingsAddDlg _dlg; + private boolean _ok; + + public ProxySettingsAddCtrl(List listOfExistingAdditionalNames, Window parent) + { + _dlg = new ProxySettingsAddDlg(parent); + + _dlg.btnOK.addActionListener(e -> onOk(listOfExistingAdditionalNames)); + _dlg.btnCancel.addActionListener(e -> close()); + + GUIUtils.forceFocus(_dlg.txtName); + GUIUtils.enableCloseByEscape(_dlg); + GUIUtils.initLocation(_dlg, 320,120); + _dlg.setVisible(true); + } + + private void onOk(List listOfExistingAdditionalNames) + { + if(StringUtils.isBlank(_dlg.txtName.getText())) + { + JOptionPane.showMessageDialog(_dlg, s_stringMgr.getString("ProxySettingsAddCtrl.proxy.settings.name.cannot.be.empty")); + return; + } + + if( StringUtils.equalsIgnoreCase(_dlg.txtName.getText(), ProxyPreferenceTabComponent.DEFAULT_PROXY_SETTINGS_NAME) + || listOfExistingAdditionalNames.stream().anyMatch(n -> StringUtils.equalsIgnoreCase(n, _dlg.txtName.getText())) + ) + { + JOptionPane.showMessageDialog(_dlg, s_stringMgr.getString("ProxySettingsAddCtrl.proxy.settings.name.already.exists")); + return; + } + + _ok = true; + + close(); + } + + private void close() + { + _dlg.setVisible(false); + _dlg.dispose(); + } + + public boolean isOk() + { + return _ok; + } + + public String getNewSettingsName() + { + return _dlg.txtName.getText(); + } +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsAddDlg.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsAddDlg.java new file mode 100644 index 0000000000..cc7a31ee0c --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsAddDlg.java @@ -0,0 +1,61 @@ +package net.sourceforge.squirrel_sql.client.preferences; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import java.awt.Window; +import javax.swing.JButton; +import javax.swing.JDialog; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JTextField; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; + +public class ProxySettingsAddDlg extends JDialog +{ + private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ProxySettingsAddDlg.class); + + final JTextField txtName; + final JButton btnOK = new JButton(s_stringMgr.getString("ProxySettingsAddDlg.ok")); + final JButton btnCancel = new JButton(s_stringMgr.getString("ProxySettingsAddDlg.cancel")); + + public ProxySettingsAddDlg(Window parent) + { + super(parent, s_stringMgr.getString("ProxySettingsAddDlg.add.proxy.setting"), ModalityType.APPLICATION_MODAL); + + getContentPane().setLayout(new GridBagLayout()); + + GridBagConstraints gbc; + + gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(5,5,0,5), 0,0); + getContentPane().add(new JLabel(s_stringMgr.getString("ProxySettingsAddDlg.enter.name.of.new.proxy.setting")), gbc); + + gbc = new GridBagConstraints(0,1,1,1,1,0,GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,0,50), 0,0); + txtName = new JTextField(); + getContentPane().add(txtName, gbc); + + gbc = new GridBagConstraints(0,2,1,1,0,0,GridBagConstraints.CENTER, GridBagConstraints.NONE, new Insets(5,5,5,5), 0,0); + getContentPane().add(createButtonPanel(), gbc); + + gbc = new GridBagConstraints(0,3,1,1,0,1,GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0,0,0,0), 0,0); + getContentPane().add(new JPanel(), gbc); + + getRootPane().setDefaultButton(btnOK); + } + + private JPanel createButtonPanel() + { + JPanel ret = new JPanel(new GridBagLayout()); + + GridBagConstraints gbc; + + gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0); + ret.add(btnOK, gbc); + + gbc = new GridBagConstraints(1,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.NONE, new Insets(0,5,0,0), 0,0); + ret.add(btnCancel, gbc); + + return ret; + } +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsPanel.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsPanel.java new file mode 100644 index 0000000000..603e519a2e --- /dev/null +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/ProxySettingsPanel.java @@ -0,0 +1,198 @@ +package net.sourceforge.squirrel_sql.client.preferences; + +import java.awt.GridBagConstraints; +import java.awt.GridBagLayout; +import java.awt.Insets; +import javax.swing.BorderFactory; +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JComboBox; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.JPasswordField; +import javax.swing.JTextField; +import net.sourceforge.squirrel_sql.client.Main; +import net.sourceforge.squirrel_sql.client.resources.SquirrelResources; +import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; +import net.sourceforge.squirrel_sql.fw.gui.MultipleLineLabel; +import net.sourceforge.squirrel_sql.fw.util.StringManager; +import net.sourceforge.squirrel_sql.fw.util.StringManagerFactory; + +public class ProxySettingsPanel extends JPanel +{ + private static final StringManager s_stringMgr = StringManagerFactory.getStringManager(ProxySettingsPanel.class); + + JComboBox cboAdditionalSettingsNames = new JComboBox<>(); + + JCheckBox httpUseProxyChk = new JCheckBox(s_stringMgr.getString("ProxyPreferencesPanel.useproxy")); + JLabel httpProxyServerLabel = new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.server"), JLabel.RIGHT); + JTextField httpProxyServer = new JTextField(); + JLabel httpProxyPortLabel = new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.port"), JLabel.RIGHT); + JTextField httpProxyPort = new JTextField(); + JLabel httpProxyUserLabel = new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.user"), JLabel.RIGHT); + JTextField httpProxyUser = new JTextField(); + JLabel httpProxyPasswordLabel = new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.password"), JLabel.RIGHT); + JPasswordField httpProxyPassword = new JPasswordField(); + JLabel httpNonProxyHostsLabel = new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.noproxyfor"), JLabel.RIGHT); + JTextField httpNonProxyHosts = new JTextField(); + + JCheckBox socksUseProxyChk = new JCheckBox(s_stringMgr.getString("ProxyPreferencesPanel.useproxy")); + JLabel socksProxyServerLabel = new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.server"), JLabel.RIGHT); + JTextField socksProxyServer = new JTextField(); + JLabel socksProxyPortLabel =new JLabel(s_stringMgr.getString("ProxyPreferencesPanel.port"), JLabel.RIGHT); + JTextField socksProxyPort = new JTextField(); + JButton btnAddProxySetting; + JButton btnRemoveProxySetting; + + + public ProxySettingsPanel() + { + super(new GridBagLayout()); + + GridBagConstraints gbc; + + gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(5,5,0, 150), 0,0); + add(createSettingsNamesPanel(), gbc); + + gbc = new GridBagConstraints(0,1,1,1,1,0,GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL, new Insets(10,5,5, 5), 0,0); + add(createProxyPanel(), gbc); + + gbc = new GridBagConstraints(0,2,1,1,1,0,GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH, new Insets(0,0,0, 0), 0,0); + add(new JPanel(), gbc); + } + + private JPanel createSettingsNamesPanel() + { + JPanel ret = new JPanel(new GridBagLayout()); + + GridBagConstraints gbc; + + gbc = new GridBagConstraints(0,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,0,0,0), 0,0); + JLabel lblProxyCbo = new JLabel(s_stringMgr.getString("ProxyAdditionalSettingsPanel.additional.settings.name")); + lblProxyCbo.setIcon(Main.getApplication().getResources().getIcon(SquirrelResources.IImageNames.PROXY)); + ret.add(lblProxyCbo, gbc); + + gbc = new GridBagConstraints(1,0,1,1,1,0,GridBagConstraints.WEST, GridBagConstraints.HORIZONTAL, new Insets(0,5,0,0), 0,0); + ret.add(cboAdditionalSettingsNames, gbc); + + gbc = new GridBagConstraints(2,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,2,0,0), 0,0); + btnAddProxySetting = createIconButton(SquirrelResources.IImageNames.PLUS); + ret.add(btnAddProxySetting, gbc); + + gbc = new GridBagConstraints(3,0,1,1,0,0,GridBagConstraints.WEST, GridBagConstraints.NONE, new Insets(0,2,0,0), 0,0); + btnRemoveProxySetting = createIconButton(SquirrelResources.IImageNames.MINUS); + ret.add(btnRemoveProxySetting, gbc); + + return ret; + } + + private JButton createIconButton(String plus) + { + return GUIUtils.styleAsToolbarButton(new JButton(Main.getApplication().getResources().getIcon(plus)), false, true, cboAdditionalSettingsNames.getPreferredSize().height); + } + + private JPanel createProxyPanel() + { + JPanel ret = new JPanel(new GridBagLayout()); + + final GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.insets = new Insets(0, 0, 0, 0); + gbc.gridx = 0; + gbc.gridy = 0; + gbc.weightx = 1; + ret.add(createHTTPPanel(), gbc); + + gbc.insets = new Insets(4, 0, 0, 0); + ++gbc.gridy; + ret.add(createSOCKSPanel(), gbc); + return ret; + } + + private JPanel createHTTPPanel() + { + JPanel pnl = new JPanel(new GridBagLayout()); + pnl.setBorder(BorderFactory.createTitledBorder(s_stringMgr.getString("ProxyPreferencesPanel.httpproxy"))); + + final GridBagConstraints gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.WEST; + gbc.insets = new Insets(4, 4, 4, 4); + gbc.gridx = 0; + gbc.gridy = 0; + pnl.add(httpUseProxyChk, gbc); + + gbc.fill = GridBagConstraints.HORIZONTAL; + ++gbc.gridx; + pnl.add(httpProxyServerLabel, gbc); + + ++gbc.gridy; + pnl.add(httpProxyPortLabel, gbc); + + ++gbc.gridy; + pnl.add(httpProxyUserLabel, gbc); + + ++gbc.gridy; + pnl.add(httpProxyPasswordLabel, gbc); + + ++gbc.gridy; + pnl.add(httpNonProxyHostsLabel, gbc); + + ++gbc.gridy; + --gbc.gridx; + gbc.gridwidth = GridBagConstraints.REMAINDER; + pnl.add(new MultipleLineLabel(s_stringMgr.getString("ProxyPreferencesPane.notes")), gbc); + gbc.gridwidth = 1; + ++gbc.gridx; + + ++gbc.gridx; + gbc.gridy = 0; + gbc.weightx = 1; + pnl.add(httpProxyServer, gbc); + + ++gbc.gridy; + pnl.add(httpProxyPort, gbc); + + ++gbc.gridy; + pnl.add(httpProxyUser, gbc); + + ++gbc.gridy; + pnl.add(httpProxyPassword, gbc); + + ++gbc.gridy; + pnl.add(httpNonProxyHosts, gbc); + + return pnl; + } + + private JPanel createSOCKSPanel() + { + JPanel pnl = new JPanel(new GridBagLayout()); + pnl.setBorder(BorderFactory.createTitledBorder(s_stringMgr.getString("ProxyPreferencesPanel.socksproxy"))); + + final GridBagConstraints gbc = new GridBagConstraints(); + gbc.anchor = GridBagConstraints.WEST; + gbc.insets = new Insets(4, 4, 4, 4); + gbc.gridx = 0; + gbc.gridy = 0; + pnl.add(socksUseProxyChk, gbc); + + gbc.fill = GridBagConstraints.HORIZONTAL; + ++gbc.gridx; + pnl.add(socksProxyServerLabel, gbc); + + ++gbc.gridy; + pnl.add(socksProxyPortLabel, gbc); + + ++gbc.gridx; + gbc.gridy = 0; + gbc.weightx = 1; + pnl.add(socksProxyServer, gbc); + + ++gbc.gridy; + pnl.add(socksProxyPort, gbc); + + return pnl; + } + + +} diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java index bf19877be7..799ab140a8 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferences.java @@ -29,6 +29,7 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Iterator; +import java.util.List; import net.sourceforge.squirrel_sql.client.action.ActionKeys; import net.sourceforge.squirrel_sql.client.gui.db.mainframetitle.PositionInMainFrameTitle; import net.sourceforge.squirrel_sql.client.gui.mainframe.MainFrameWindowState; @@ -80,6 +81,7 @@ public interface IPropertyNames String PLUGIN_OBJECTS = "pluginObjects"; String PLUGIN_STATUSES = "pluginStatuses"; String PROXY = "proxyPerferences"; + String PROXY_ADDITIONAL_NAMED_SETTINGS = "additionalNamedProxySettings"; String UPDATE = "updatePreferences"; String SCROLLABLE_TABBED_PANES = "useScrollableTabbedPanes"; String SESSION_PROPERTIES = "sessionProperties"; @@ -250,6 +252,8 @@ public interface IJdbcDebugTypes /** Proxy settings. */ private ProxySettings _proxySettings = new ProxySettings(); + private ArrayList _additionalNamedProxySettings = new ArrayList<>(); + /** Show loaded drivers only in the Drivers window. */ private boolean _showLoadedDriversOnly; @@ -755,10 +759,9 @@ public synchronized void setPluginStatus(int idx, PluginStatus value) */ public ProxySettings getProxySettings() { - return (ProxySettings)_proxySettings.clone(); + return _proxySettings; } - public synchronized void setProxySettings(ProxySettings data) { if (data == null) @@ -771,7 +774,17 @@ public synchronized void setProxySettings(ProxySettings data) oldValue, _proxySettings); } - /** + public ProxySettings[] getAdditionalNamedProxySettings() + { + return _additionalNamedProxySettings.toArray(new ProxySettings[0]); + } + + public void setAdditionalNamedProxySettings(ProxySettings[] additionalNamedProxySettings) + { + _additionalNamedProxySettings = new ArrayList<>(List.of(additionalNamedProxySettings)); + } + + /** * @return whether only the loaded JDBC drivers are displayed in the * Drivers window. */ diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java index 5f5db1ab2d..3f306a7861 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/preferences/SquirrelPreferencesBeanInfo.java @@ -80,6 +80,7 @@ public PropertyDescriptor[] getPropertyDescriptors() prop(SCROLLABLE_TABBED_PANES, SquirrelPreferences.class, "getUseScrollableTabbedPanes", "setUseScrollableTabbedPanes"), ixProp(ACTION_KEYS, SquirrelPreferences.class, "getActionKeys", "setActionKeys", "getActionKeys", "setActionKeys"), prop(PROXY, SquirrelPreferences.class, "getProxySettings", "setProxySettings"), + prop(PROXY_ADDITIONAL_NAMED_SETTINGS, SquirrelPreferences.class, "getAdditionalNamedProxySettings", "setAdditionalNamedProxySettings"), prop(SHOW_LOADED_DRIVERS_ONLY, SquirrelPreferences.class, "getShowLoadedDriversOnly", "setShowLoadedDriversOnly"), prop(MAXIMIMIZE_SESSION_SHEET_ON_OPEN, SquirrelPreferences.class, "getMaximizeSessionSheetOnOpen", "setMaximizeSessionSheetOnOpen"), prop(SHOW_COLOR_ICONS_IN_TOOLBAR, SquirrelPreferences.class, "getShowColoriconsInToolbar", "setShowColoriconsInToolbar"), diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java index dfc6c220fa..6d5a767f26 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/SquirrelResources.java @@ -231,6 +231,9 @@ public interface IImageNames String BOOKMARK_SINGLE = "bookmark_single"; String PASSWORD_12X12 = "password12x12"; + + String PROXY = "proxy"; + String PROXY_12x12 = "proxy12x12"; } public SquirrelResources(String rsrcBundleBaseName) diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/proxy.png b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/proxy.png new file mode 100644 index 0000000000..4d03f04bc8 Binary files /dev/null and b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/proxy.png differ diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/proxy12x12.png b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/proxy12x12.png new file mode 100644 index 0000000000..4c870b496a Binary files /dev/null and b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/images/proxy12x12.png differ diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties index 4ee452a2ca..4ef24f49ac 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/squirrel.properties @@ -224,6 +224,9 @@ bookmark_single.image=bookmark_single.png password12x12.image=password12x12.png +proxy.image=proxy.png +proxy12x12.image=proxy12x12.png + ######## # Configuration information for ObjectTreeInternalFrame. ######## diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/SessionManager.java b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/SessionManager.java index a6bcf4390c..1dad82f834 100644 --- a/sql12/core/src/net/sourceforge/squirrel_sql/client/session/SessionManager.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/client/session/SessionManager.java @@ -20,6 +20,17 @@ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; +import java.util.Set; +import javax.swing.SwingUtilities; +import javax.swing.event.EventListenerList; import net.sourceforge.squirrel_sql.client.IApplication; import net.sourceforge.squirrel_sql.client.Main; import net.sourceforge.squirrel_sql.client.gui.db.SQLAlias; @@ -39,18 +50,6 @@ import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; -import javax.swing.SwingUtilities; -import javax.swing.event.EventListenerList; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Hashtable; -import java.util.List; -import java.util.Map; -import java.util.Set; - /** * This class manages sessions. * @@ -276,6 +275,11 @@ public boolean closeSession(ISession session, boolean doNothingAndReturnTrueWhen finally { _inCloseSession.remove(session.getIdentifier()); + + if(null == _activeSession) + { + Main.getApplication().getNonDefaultProxySwitcher().allSessionsClosed(); + } } return false; @@ -397,14 +401,16 @@ private void fireSessionClosed(ISession session) { Object[] listeners = listenerList.getListenerList(); SessionEvent evt = null; - for (int i = listeners.length - 2; i >= 0; i -= 2) + for(int i = listeners.length - 2; i >= 0; i -= 2) { - if (listeners[i] == ISessionListener.class) + if(listeners[i] == ISessionListener.class) { // Lazily create the event: - if (evt == null) + if(evt == null) + { evt = new SessionEvent(session); - ((ISessionListener)listeners[i + 1]).sessionClosed(evt); + } + ((ISessionListener) listeners[i + 1]).sessionClosed(evt); } } } @@ -466,6 +472,8 @@ private void fireSessionActivated(ISession session) ((ISessionListener)listeners[i + 1]).sessionActivated(evt); } } + + Main.getApplication().getNonDefaultProxySwitcher().maybeApplyNonDefaultProxySettings(session.getAlias()); } /** diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/statusbar/MainFrameStatusBar.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/statusbar/MainFrameStatusBar.java index e571addaf4..17dd5d4646 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/statusbar/MainFrameStatusBar.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/gui/statusbar/MainFrameStatusBar.java @@ -28,6 +28,7 @@ import net.sourceforge.squirrel_sql.client.gui.LogPanel; import net.sourceforge.squirrel_sql.client.gui.MemoryPanel; import net.sourceforge.squirrel_sql.client.gui.db.encryption.AliasKeyPasswordStatusBarPanel; +import net.sourceforge.squirrel_sql.client.gui.db.encryption.ProxyStatusBarPanel; import net.sourceforge.squirrel_sql.fw.gui.GUIUtils; import net.sourceforge.squirrel_sql.fw.gui.TimePanel; @@ -43,6 +44,7 @@ public class MainFrameStatusBar extends JPanel private final GridBagConstraints _gbc = new GridBagConstraints(); private JTextField _textLbl = new JTextField(); private AliasKeyPasswordStatusBarPanel _aliasKeyPasswordStatusBarPanel; + private ProxyStatusBarPanel _proxyStatusBarPanel; public MainFrameStatusBar(IApplication app) @@ -72,6 +74,8 @@ private void createGUI(IApplication app) _gbc.insets.left = 2; + _proxyStatusBarPanel = new ProxyStatusBarPanel(); + addJComponent(_proxyStatusBarPanel); _aliasKeyPasswordStatusBarPanel = new AliasKeyPasswordStatusBarPanel(); addJComponent(_aliasKeyPasswordStatusBarPanel); addJComponent(new LogPanel(app)); @@ -116,4 +120,9 @@ public AliasKeyPasswordStatusBarPanel getAliasKeyPasswordStatusBarPanel() { return _aliasKeyPasswordStatusBarPanel; } + + public ProxyStatusBarPanel getProxyStatusBarPanel() + { + return _proxyStatusBarPanel; + } } diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/IProxySettings.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/IProxySettings.java deleted file mode 100644 index ec289ed0e7..0000000000 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/IProxySettings.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2008 Rob Manning - * manningr@users.sourceforge.net - * - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 2.1 of the License, or (at your option) any later version. - * - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -package net.sourceforge.squirrel_sql.fw.util; - -public interface IProxySettings -{ - - public abstract boolean getHttpUseProxy(); - - public abstract String getHttpProxyServer(); - - public abstract String getHttpProxyPort(); - - public abstract String getHttpProxyUser(); - - public abstract String getHttpProxyPassword(); - - public abstract String getHttpNonProxyHosts(); - - public abstract boolean getSocksUseProxy(); - - public abstract String getSocksProxyServer(); - - public abstract String getSocksProxyPort(); - -} \ No newline at end of file diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/ProxyHandler.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/ProxyHandler.java index eac0ec1af6..b12a777643 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/ProxyHandler.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/ProxyHandler.java @@ -23,29 +23,17 @@ import java.util.Properties; import net.sourceforge.squirrel_sql.fw.util.log.ILogger; import net.sourceforge.squirrel_sql.fw.util.log.LoggerController; -/** - * This class will apply the settings from a ProxySettings - * object to a Properties object. - * - * @author Colin Bell - */ + public class ProxyHandler { - /** Logger for this class. */ - private final static ILogger s_log = - LoggerController.createLogger(ProxyHandler.class); + private final static ILogger s_log = LoggerController.createLogger(ProxyHandler.class); - public ProxyHandler() - { - super(); - } - public void apply(IProxySettings proxy) + public static void apply(ProxySettings proxy) { Properties props = System.getProperties(); - final boolean http = proxy.getHttpUseProxy(); - if (http) + if (proxy.getHttpUseProxy()) { applySetting(props, "proxySet", "true"); applySetting(props, "http.proxyHost", proxy.getHttpProxyServer()); @@ -78,8 +66,7 @@ public void apply(IProxySettings proxy) Authenticator.setDefault(null); } - final boolean socks = proxy.getSocksUseProxy(); - if (socks) + if (proxy.getSocksUseProxy()) { applySetting(props, "socksProxyHost", proxy.getSocksProxyServer()); applySetting(props, "socksProxyPort", proxy.getSocksProxyPort()); @@ -91,7 +78,7 @@ public void apply(IProxySettings proxy) } } - private void applySetting(Properties props, String key, String value) + private static void applySetting(Properties props, String key, String value) { if (value != null && value.length() > 0) { diff --git a/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/ProxySettings.java b/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/ProxySettings.java index 5f62dfa133..36d122710f 100755 --- a/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/ProxySettings.java +++ b/sql12/core/src/net/sourceforge/squirrel_sql/fw/util/ProxySettings.java @@ -25,8 +25,12 @@ * * @author Colin Bell */ -public class ProxySettings implements Cloneable, Serializable, IProxySettings +public class ProxySettings implements Serializable { + /** + * null, when it's the default settings + */ + private String _settingName; /** If true use a HTTP proxy server. */ private boolean _httpUseProxy; @@ -57,21 +61,6 @@ public class ProxySettings implements Cloneable, Serializable, IProxySettings /** Port for SOCKS Proxy server. */ private String _socksProxyPort; - /** - * Return a copy of this object. - */ - public Object clone() - { - try - { - return super.clone(); - } - catch(CloneNotSupportedException ex) - { - throw Utilities.wrapRuntime(ex); // Impossible. - } - } - public boolean getHttpUseProxy() { return _httpUseProxy; @@ -161,4 +150,14 @@ public void setSocksProxyPort(String data) { _socksProxyPort = data; } + + public String getSettingName() + { + return _settingName; + } + + public void setSettingName(String settingName) + { + _settingName = settingName; + } }