package com.vividsolutions.jump.workbench.ui.plugin.datastore;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.lang.reflect.InvocationTargetException;
import java.util.Arrays;
import java.util.Iterator;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPasswordField;
import javax.swing.SwingUtilities;
import com.vividsolutions.jts.util.Assert;
import com.vividsolutions.jump.I18N;
import com.vividsolutions.jump.datastore.DataStoreConnection;
import com.vividsolutions.jump.datastore.DataStoreException;
import com.vividsolutions.jump.workbench.datastore.ConnectionDescriptor;
import com.vividsolutions.jump.workbench.datastore.ConnectionManager;
import com.vividsolutions.jump.workbench.ui.GUIUtil;
public class PasswordPrompter {
public DataStoreConnection getOpenConnection(
ConnectionManager connectionManager,
ConnectionDescriptor connectionDescriptor, Component parentComponent)
throws Exception {
return connectionManager
.getOpenConnection(promptForPasswordIfNecessary(
connectionDescriptor, connectionManager,
parentComponent));
}
private ConnectionDescriptor promptForPasswordIfNecessary(
ConnectionDescriptor connectionDescriptor,
ConnectionManager connectionManager, Component parentComponent)
throws DataStoreException {
String passwordParameterName = ConnectionDescriptor
.passwordParameterName(connectionDescriptor.getParameterList()
.getSchema());
if (passwordParameterName == null) {
return connectionDescriptor;
}
// To know if a password has been entered correctly, check if the
// connection is open rather then if the password has been set,
// as the user may have set a password that is incorrect.
// [Jon Aquino 2005-03-11]
/*
* if
* (!connectionManager.getConnection(connectionDescriptor).isClosed()) {
* return connectionDescriptor; }
*/
// The above isn't going to work anymore, because we are now saving
// passwords. Just check whether the password is null for now.
// Of course this doesn't handle the case in which a password
// is incorrect or changed. Need to design a generic way to identify an
// error as being a password error, without being specific to Oracle,
// SDE, etc. [Jon Aquino 2005-03-17]
if (connectionDescriptor.getParameterList().getParameterString(
passwordParameterName) != null) {
return connectionDescriptor;
}
connectionDescriptor.getParameterList().setParameter(
passwordParameterName,
promptForPassword(identifier(connectionDescriptor),
parentComponent));
return connectionDescriptor;
}
/**
* @return a username or other brief description of this
* ConnectionDescriptor
*/
private String identifier(ConnectionDescriptor connectionDescriptor) {
for (Iterator i = Arrays.asList(
connectionDescriptor.getParameterList().getSchema().getNames())
.iterator(); i.hasNext();) {
String name = (String) i.next();
if (name.toLowerCase().matches("user.*")) {
return connectionDescriptor.getParameterList().getParameter(
name).toString();
}
}
return connectionDescriptor.getParameterList()
.getParameter(
connectionDescriptor.getParameterList().getSchema()
.getNames()[0]).toString();
}
/**
* @param identifier
* username or other description of what the password is for
*/
private String promptForPassword(String identifier, Component parent) {
Assert.isTrue(SwingUtilities.isEventDispatchThread());
final JPasswordField passwordField = new JPasswordField(15);
final JDialog dialog = createDialog(I18N.get("jump.workbench.ui.plugin.datastore.PasswordPrompter.Password"), parent);
dialog.getContentPane().setLayout(new GridBagLayout());
dialog.getContentPane().add(
new JLabel(I18N.get("jump.workbench.ui.plugin.datastore.PasswordPrompter.Enter-password-for")+" " + identifier + ": "),
new GridBagConstraints(0, 0, 1, 1, 0, 0,
GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(2, 2, 2, 2), 0, 0));
dialog.getContentPane().add(
passwordField,
new GridBagConstraints(0, 1, 1, 1, 0, 0,
GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(2, 2, 2, 2), 0, 0));
dialog.getContentPane().add(
new JButton(I18N.get("jump.workbench.ui.plugin.datastore.PasswordPrompter.OK")) {
{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
dialog.setVisible(false);
}
});
dialog.getRootPane().setDefaultButton(this);
}
},
new GridBagConstraints(0, 2, 1, 1, 0, 0,
GridBagConstraints.CENTER, GridBagConstraints.NONE,
new Insets(2, 2, 2, 2), 0, 0));
dialog.pack();
GUIUtil.centreOnWindow(dialog);
dialog.setVisible(true);
return new String(passwordField.getPassword());
}
private JDialog createDialog(String title, Component parent) {
return window(parent) instanceof Frame ? new JDialog(
(Frame) window(parent), title, true) : new JDialog(
(Dialog) window(parent), title, true);
}
private Window window(Component component) {
return component instanceof Window ? (Window) component
: SwingUtilities.windowForComponent(component);
}
public static void main(String[] args) throws InterruptedException,
InvocationTargetException {
SwingUtilities.invokeAndWait(new Runnable() {
public void run() {
JFrame frame = new JFrame();
GUIUtil.centreOnScreen(frame);
new PasswordPrompter().promptForPassword("scott", frame);
}
});
}
}