/*
* Copyright (c) 2010, SQL Power Group Inc.
*
* This file is part of SQL Power Library.
*
* SQL Power Library is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* SQL Power 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package ca.sqlpower.swingui.enterprise.client;
import java.awt.Component;
import java.net.URI;
import java.net.URISyntaxException;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import ca.sqlpower.enterprise.client.ConnectionTestAction;
import ca.sqlpower.enterprise.client.SPServerInfo;
import ca.sqlpower.swingui.DataEntryPanel;
import ca.sqlpower.util.Version;
import com.jgoodies.forms.builder.DefaultFormBuilder;
import com.jgoodies.forms.layout.FormLayout;
/**
* Creates a panel for setting the properties of a SPServerInfo. Since
* instances of SPServerInfo are not mutable, calling applyChanges() will not
* modify the original SPServerInfo object provided in the constructor. You
* must obtain a new SPServerInfo object by calling getServerInfo().
*/
public class SPServerInfoPanel implements DataEntryPanel {
private final Component dialogOwner;
private final JPanel panel;
private JTextField name;
private JTextField host;
private JTextField port;
private JTextField path;
private JTextField username;
private JPasswordField password;
private JButton testButton;
/**
* The version of this client to compare to each server version to determine compatibility
*/
private final Version clientVersion;
private final boolean passwordAllowed;
private final String defaultScheme;
/**
* Create a {@link SPServerInfoPanel} populated with the given default
* settings
*
* @param dialogOwner
* The parent {@link Component} for the dialog containing this
* {@link SPServerInfoPanel}
* @param clientVersion
* The version of the client to be used to determine
* compatibility with the server
* @param defaultSettings
* A {@link SPServerInfo} instance set with the default
* configuration
*/
public SPServerInfoPanel(Component dialogOwner, Version clientVersion, SPServerInfo defaultSettings) {
this.dialogOwner = dialogOwner;
panel = buildUI(defaultSettings);
defaultScheme = defaultSettings.getScheme();
passwordAllowed = defaultSettings.isPasswordAllowed();
this.clientVersion = clientVersion;
}
private JPanel buildUI(SPServerInfo si) {
DefaultFormBuilder builder = new DefaultFormBuilder(new FormLayout("pref, 4dlu, max(100dlu; pref):grow")); //$NON-NLS-1$
builder.append(Messages.getString("SPServerInfoPanel.displayNameField"), name = new JTextField(si.getName())); //$NON-NLS-1$
builder.append(Messages.getString("SPServerInfoPanel.hostField"), host = new JTextField(si.getServerAddress())); //$NON-NLS-1$
builder.append(Messages.getString("SPServerInfoPanel.portField"), port = new JTextField(String.valueOf(si.getPort()))); //$NON-NLS-1$
builder.append(Messages.getString("SPServerInfoPanel.pathField"), path = new JTextField(si.getPath())); //$NON-NLS-1$
builder.append(Messages.getString("SPServerInfoPanel.usernameField"), username = new JTextField(si.getUsername())); //$NON-NLS-1$
if (si.isPasswordAllowed()) {
builder.append(Messages.getString("SPServerInfoPanel.passwordField"), password = new JPasswordField(si.getPassword())); //$NON-NLS-1$
}
builder.append(testButton = new JButton(Messages.getString("SPServerInfoPanel.testConnectionButton"))); //$NON-NLS-1$
builder.appendParagraphGapRow();
return builder.getPanel();
}
public void setTestAction(ConnectionTestAction action) {
testButton.setAction(action);
}
/**
* Returns a new SPServerInfo object which has been configured based on the
* settings currently in this panel's fields.
*/
public SPServerInfo getServerInfo() {
// lookupServerInfo(false); TODO: re-enable/replace when connection testing is implemented
int port = Integer.parseInt(this.port.getText());
SPServerInfo si;
if (passwordAllowed) {
si = new SPServerInfo(
name.getText(), host.getText(), port, path.getText(),
username.getText(), new String(password.getPassword()));
} else {
si = new SPServerInfo(defaultScheme,
name.getText(), host.getText(), port, path.getText(),
username.getText());
}
return si;
}
public JComponent getPanel() {
return panel;
}
/**
* Checks fields for validity, but does not modify the SPServerInfo given in
* the constructor (this is not possible because it's immutable). If any of
* the fields contain inappropriate entries, the user will be told so in a
* dialog.
*
* @return true if all the fields contain valid values; false if there are
* invalid fields.
*/
public boolean applyChanges() {
if (this.name.getText()==null||this.name.getText().equals("")) { //$NON-NLS-1$
JOptionPane.showMessageDialog(
dialogOwner, Messages.getString("SPServerInfoPanel.giveConnectionName"), //$NON-NLS-1$
Messages.getString("SPServerInfoPanel.nameRequired"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
return false;
}
String port = this.port.getText();
try {
Integer.parseInt(port);
} catch (NumberFormatException ex) {
JOptionPane.showMessageDialog(
dialogOwner, Messages.getString("SPServerInfoPanel.portMustBeNumber"), //$NON-NLS-1$
Messages.getString("SPServerInfoPanel.invalidPortNumber"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
return false;
}
if (!this.path.getText().startsWith("/")) { //$NON-NLS-1$
this.path.setText("/".concat(this.path.getText()==null?"":this.path.getText())); //$NON-NLS-1$ //$NON-NLS-2$
}
String path = this.path.getText();
if (path == null || path.length() < 2) {
JOptionPane.showMessageDialog(
dialogOwner, Messages.getString("SPServerInfoPanel.pathMustBeginWithSlash"), //$NON-NLS-1$
Messages.getString("SPServerInfoPanel.invalidSetting"), JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
return false;
}
if (this.host.getText().startsWith("http://")) { //$NON-NLS-1$
this.host.setText(this.host.getText().replace("http://", "")); //$NON-NLS-1$ //$NON-NLS-2$
}
String host = this.host.getText();
try {
new URI("http", null, host, Integer.parseInt(port), path, null, null); //$NON-NLS-1$
} catch (URISyntaxException e) {
JOptionPane.showMessageDialog(
dialogOwner, Messages.getString("SPServerInfoPanel.problemWithHostName"), //$NON-NLS-1$
"", JOptionPane.ERROR_MESSAGE); //$NON-NLS-1$
return false;
}
return true;
}
public void discardChanges() {
// nothing to do
}
public boolean hasUnsavedChanges() {
return true;
}
}