17748 streamline common login UI operations
authorStephen Talley <stephen.talley@oracle.com>
Wed, 19 Jan 2011 14:32:11 -0500
changeset 640 d2f5ddc6d701
parent 639 0cfa7516d1da
child 641 f1833b84c12f
17748 streamline common login UI operations
usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/LoginDialog.java
usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/LoginPane.java
usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/resources/Resources.properties
usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/swing/control/resources/Resources.properties
--- a/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/LoginDialog.java	Wed Jan 19 13:14:12 2011 -0500
+++ b/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/LoginDialog.java	Wed Jan 19 14:32:11 2011 -0500
@@ -20,7 +20,7 @@
  */
 
 /*
- * Copyright (c) 2010, Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
  */
 
 package org.opensolaris.os.vp.client.swing;
@@ -56,32 +56,26 @@
     private PropertyChangeListener promptListener =
 	new PropertyChangeListener() {
 	    @Override
-	    public void propertyChange(PropertyChangeEvent event) {
-		Component comp = (Component)event.getSource();
-		if (event.getNewValue().equals(true)) {
-		    if (comp == loginPane) {
-			certPane.setVisible(false);
-		    } else if (comp == certPane) {
-			loginPane.setVisible(false);
-		    }
-		    comp.setVisible(true);
-		    EventQueue.invokeLater(
-			new Runnable() {
-			    @Override
-			    public void run() {
+	    public void propertyChange(final PropertyChangeEvent event) {
+		EventQueue.invokeLater(
+		    new Runnable() {
+			@Override
+			public void run() {
+			    if (event.getNewValue().equals(true)) {
+				Component comp = (Component)event.getSource();
+				if (comp == loginPane) {
+				    certPane.setVisible(false);
+				} else if (comp == certPane) {
+				    loginPane.setVisible(false);
+				}
+				comp.setVisible(true);
 				getGlassPane().setVisible(false);
 				setVisible(true);
-			    }
-			});
-		} else {
-		    EventQueue.invokeLater(
-			new Runnable() {
-			    @Override
-			    public void run() {
+			    } else {
 				getGlassPane().setVisible(true);
 			    }
-			});
-		}
+			}
+		    });
 	    }
 	};
 
--- a/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/LoginPane.java	Wed Jan 19 13:14:12 2011 -0500
+++ b/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/LoginPane.java	Wed Jan 19 14:32:11 2011 -0500
@@ -44,8 +44,20 @@
     // Inner classes
     //
 
-    private static abstract class LoginField<C extends Component>
-	extends JPanel {
+    private static interface LoginField<T> {
+	T getValue();
+
+	void requestEditFocus();
+
+	void setEditable(boolean editable);
+
+	void setValue(T text);
+
+	void setVisible(boolean visible);
+    }
+
+    private static abstract class DualLoginField<T, C extends Component>
+	extends JPanel implements LoginField<T> {
 
 	//
 	// Instance data
@@ -58,7 +70,7 @@
 	// Constructors
 	//
 
-	public LoginField() {
+	public DualLoginField() {
 	    super(new BorderLayout());
 	    setOpaque(false);
 
@@ -73,6 +85,21 @@
 	// LoginField methods
 	//
 
+	@Override
+	public void requestEditFocus() {
+	    field.requestFocusInWindow();
+	}
+
+	@Override
+	public void setEditable(boolean editable) {
+	    label.setVisible(!editable);
+	    field.setVisible(editable);
+	}
+
+	//
+	// DualLoginField methods
+	//
+
 	public abstract C createField();
 
 	public JLabel getLabel() {
@@ -83,17 +110,8 @@
 	    return field;
 	}
 
-	public void setEditable(boolean editable) {
-	    label.setVisible(!editable);
-	    field.setVisible(editable);
-	}
-
-	public abstract String getValue();
-
-	public abstract void setValue(String text);
-
-	public String toDisplayableText(String value) {
-	    return value;
+	public String toDisplayableText(T value) {
+	    return value == null ? null : value.toString();
 	}
 
 	protected void updateLabel() {
@@ -101,12 +119,38 @@
 	}
     }
 
-    private static class LoginTextField extends LoginField<JTextField> {
+    private static class LoginTextField
+	extends DualLoginField<String, JTextField> {
+
 	//
 	// LoginField methods
 	//
 
 	@Override
+	public String getValue() {
+	    String value = getField().getText();
+	    if (value.isEmpty()) {
+		value = null;
+	    }
+	    return value;
+	}
+
+	@Override
+	public void requestEditFocus() {
+	    getField().selectAll();
+	    super.requestEditFocus();
+	}
+
+	@Override
+	public void setValue(String text) {
+	    getField().setText(text);
+	}
+
+	//
+	// DualLoginField methods
+	//
+
+	@Override
 	public JTextField createField() {
 	    JTextField field = new JTextField(GUIUtil.getTextFieldWidth());
 
@@ -120,23 +164,11 @@
 
 	    return field;
 	}
-
-	@Override
-	public String getValue() {
-	    String value = getField().getText();
-	    if (value.isEmpty()) {
-		value = null;
-	    }
-	    return value;
-	}
-
-	@Override
-	public void setValue(String text) {
-	    getField().setText(text);
-	}
     }
 
-    private static class LoginComboBox extends LoginField<JComboBox> {
+    private static class LoginComboBox
+	extends DualLoginField<String, JComboBox> {
+
 	//
 	// Instance data
 	//
@@ -157,6 +189,20 @@
 	//
 
 	@Override
+	public String getValue() {
+	    return (String)getField().getSelectedItem();
+	}
+
+	@Override
+	public void setValue(String text) {
+	    getField().getModel().setSelectedItem(text);
+	}
+
+	//
+	// DualLoginField methods
+	//
+
+	@Override
 	public JComboBox createField() {
 	    JComboBox field = new JComboBox();
 	    if (!(field.getModel() instanceof DefaultComboBoxModel)) {
@@ -201,16 +247,6 @@
 	}
 
 	@Override
-	public String getValue() {
-	    return (String)getField().getSelectedItem();
-	}
-
-	@Override
-	public void setValue(String text) {
-	    getField().getModel().setSelectedItem(text);
-	}
-
-	@Override
 	public String toDisplayableText(String value) {
 	    return value == null ? nullText : value;
 	}
@@ -239,10 +275,10 @@
     private int nCoreFields;
 
     private JLabel hostLabel;
-    private LoginField hostField;
+    private LoginTextField hostField;
 
     private JLabel userLabel;
-    private LoginField userField;
+    private LoginTextField userField;
 
     private JLabel roleLabel;
     private LoginComboBox roleField;
@@ -289,11 +325,7 @@
 	final LoginProperty<String> role = request.getRole();
 	final List<DialogMessage> messages = request.getMessages();
 
-	DialogMessage help = new DialogMessage(Finder.getString(
-            "login.message.ack", host.getValue(), user.getValue(),
-            role.getValue()));
-
-	messages.add(help);
+	addMessage(request, "login.message.ack");
 
 	GUIUtil.invokeAndWait(
 	    new Runnable() {
@@ -301,17 +333,14 @@
 		public void run() {
 		    getMessagePanel().setMessages(messages);
 
+		    clear();
 		    setHostInUI(host, false);
 		    setUserInUI(user, false);
 
-		    if (role.getValue() == null) {
-			hideRole();
-		    } else {
+		    if (role.getValue() != null) {
 			setRoleInUI(role, false);
 		    }
 
-		    clearAuthFields();
-
 		    getButtonBar().getBackButton().setEnabled(false);
 		}
 	});
@@ -335,13 +364,8 @@
 	final List<DialogMessage> messages = request.getMessages();
 
 	if (isFirst) {
-	    String resource = isUserAuth ? "login.message.auth.user" :
-		"login.message.auth.role";
-
-	    DialogMessage help = new DialogMessage(Finder.getString(
-		resource, host.getValue(), user.getValue(), role.getValue()));
-
-	    messages.add(help);
+	    addMessage(request, isUserAuth ? "login.message.auth.user" :
+		"login.message.auth.role");
 	}
 
 	final Map<LoginProperty, JTextComponent> map =
@@ -353,20 +377,17 @@
 		public void run() {
 		    getMessagePanel().setMessages(messages);
 
+		    clear();
 		    setHostInUI(host, false);
 		    setUserInUI(user, false);
 
-		    if (isUserAuth) {
-			hideRole();
-		    } else {
+		    if (!isUserAuth) {
 			setRoleInUI(role, false);
 		    }
 
                     getButtonBar().getBackButton().setEnabled(
                         host.isEditable() || user.isEditable() ||
-                        role.isEditable());
-
-		    clearAuthFields();
+                        (!isUserAuth && role.isEditable()));
 
 		    int cols = GUIUtil.getTextFieldWidth();
 
@@ -439,11 +460,7 @@
 	final List<DialogMessage> messages = request.getMessages();
 
 	if (messages.isEmpty()) {
-	    DialogMessage help = new DialogMessage(Finder.getString(
-		"login.message.fail", host.getValue(), user.getValue(),
-		role.getValue()));
-
-	    messages.add(help);
+	    addMessage(request, "login.message.fail");
 	}
 
 	GUIUtil.invokeAndWait(
@@ -452,26 +469,16 @@
 		public void run() {
 		    getMessagePanel().setMessages(messages);
 
-		    if (host.getValue() == null) {
-			hideHost();
-			hideUser();
-			hideRole();
-		    } else {
+		    clear();
+		    if (host.getValue() != null) {
 			setHostInUI(host, false);
-			if (user.getValue() == null) {
-			    hideUser();
-			    hideRole();
-			} else {
+			if (user.getValue() != null) {
 			    setUserInUI(user, false);
-			    if (role.getValue() == null) {
-				hideRole();
-			    } else {
+			    if (role.getValue() != null) {
 				setRoleInUI(role, false);
 			    }
 			}
 		    }
-
-		    clearAuthFields();
 		}
 	});
 
@@ -494,11 +501,7 @@
 	if (user.isEditable()) {
 	    resource += ".user";
 	}
-
-	DialogMessage help = new DialogMessage(Finder.getString(
-	    resource, host.getValue(), user.getValue()));
-
-	messages.add(help);
+	addMessage(request, resource);
 
 	GUIUtil.invokeAndWait(
 	    new Runnable() {
@@ -506,10 +509,9 @@
 		public void run() {
 		    getMessagePanel().setMessages(messages);
 
+		    clear();
 		    setHostInUI(host, true);
 		    setUserInUI(user, true);
-		    hideRole();
-		    clearAuthFields();
 
 		    getButtonBar().getBackButton().setEnabled(false);
 		}
@@ -535,11 +537,7 @@
 	final LoginProperty<String> role = request.getRole();
 	final List<DialogMessage> messages = request.getMessages();
 
-	DialogMessage help = new DialogMessage(Finder.getString(
-	    "login.message.role", host.getValue(),
-	    user.getValue()));
-
-	messages.add(help);
+	addMessage(request, "login.message.role");
 
 	GUIUtil.invokeAndWait(
 	    new Runnable() {
@@ -556,10 +554,10 @@
 			model.addElement(r);
 		    }
 
+		    clear();
 		    setHostInUI(host, false);
 		    setUserInUI(user, false);
 		    setRoleInUI(role, true);
-		    clearAuthFields();
 
 		    getButtonBar().getBackButton().setEnabled(
 			host.isEditable() || user.isEditable());
@@ -574,6 +572,13 @@
     // Private methods
     //
 
+    private void addMessage(LoginRequest request, String resource) {
+	DialogMessage message = new DialogMessage(Finder.getString(
+            resource, request.getHost().getValue(),
+            request.getUser().getValue(), request.getRole().getValue()));
+	request.getMessages().add(message);
+    }
+
     private void awaitClose() {
 	SettingsButtonBar bar = getButtonBar();
 	AbstractButton closeButton = bar.getCloseButton();
@@ -612,13 +617,6 @@
 	}
     }
 
-    private void clearAuthFields() {
-	// Remove all but the "core" fields (host, user, role)
-	while (fieldPanel.getComponentCount() > nCoreFields) {
-	    fieldPanel.remove(nCoreFields);
-	}
-    }
-
     private void createFieldPanel() {
 	hostField = new LoginTextField();
 	hostLabel = new JLabel();
@@ -657,19 +655,22 @@
 	nCoreFields = fieldPanel.getComponentCount();
     }
 
-    private void hideHost() {
+    private void clear() {
+	assert EventQueue.isDispatchThread();
+
 	hostLabel.setVisible(false);
 	hostField.setVisible(false);
-    }
 
-    private void hideRole() {
 	roleLabel.setVisible(false);
 	roleField.setVisible(false);
-    }
 
-    private void hideUser() {
 	userLabel.setVisible(false);
 	userField.setVisible(false);
+
+	// Remove all but the "core" fields (host, user, role, etc.)
+	while (fieldPanel.getComponentCount() > nCoreFields) {
+	    fieldPanel.remove(nCoreFields);
+	}
     }
 
     private void setHostInUI(LoginProperty<String> property, boolean allowEdit)
@@ -677,19 +678,25 @@
 	setInUI(property, hostLabel, hostField, LABEL_HOST, allowEdit);
     }
 
-    private void setInProperty(LoginProperty<String> property, LoginField field)
-    {
+    private <T> void setInProperty(LoginProperty<T> property,
+	LoginField<T> field) {
+
 	if (property.isEditable()) {
 	    property.setValue(field.getValue());
 	}
 	property.setErrored(false);
     }
 
-    private void setInUI(LoginProperty<String> property, JLabel label,
-        final LoginField field, String defaultLabel, boolean allowEdit) {
+    private <T> void setInUI(LoginProperty<T> property, JLabel label,
+        final LoginField<T> field, String defaultLabel, boolean allowEdit) {
+
+	assert EventQueue.isDispatchThread();
 
 	String labelText = property.getName();
-	label.setText(labelText != null ? labelText : defaultLabel);
+	if (labelText == null) {
+	    labelText = defaultLabel;
+	}
+	label.setText(labelText);
 
 	boolean editable = allowEdit && property.isEditable();
 	Color foreground = null;
@@ -702,11 +709,7 @@
 		    new Runnable() {
 			@Override
 			public void run() {
-			    Component comp = field.getField();
-			    if (comp instanceof JTextComponent) {
-				((JTextComponent)comp).selectAll();
-			    }
-			    comp.requestFocusInWindow();
+			    field.requestEditFocus();
 			}
 		    });
 	    }
--- a/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/resources/Resources.properties	Wed Jan 19 13:14:12 2011 -0500
+++ b/usr/src/java/vpanels/client/org/opensolaris/os/vp/client/swing/resources/Resources.properties	Wed Jan 19 14:32:11 2011 -0500
@@ -36,17 +36,17 @@
 login.message.auth.role = Role "{2}" must be authenticated.
 login.message.auth.user = User "{1}" must be authenticated.
 login.message.fail = The requested login has failed.
-login.message.hostuser = Review the selected host to connect to and user to administer it.
-login.message.hostuser.host = Select a host to administer as user "{1}".
-login.message.hostuser.host.user = Select a host to connect to and a user to administer it.
-login.message.hostuser.user = Select a user to administer host "{0}".
-login.message.role = Select a role to authenticate, or choose "(none)" to administer host "{0}" as user "{1}".
+login.message.hostuser = Review the selected host to connect to and user to log in as.
+login.message.hostuser.host = Select a host to connect to as user "{1}".
+login.message.hostuser.host.user = Select a host to connect to and a user to log in as.
+login.message.hostuser.user = Select a user to connect to host "{0}".
+login.message.role = Select a role to assume, or choose "(none)" to connect to host "{0}" as user "{1}".
 
 login.button.yes = Yes
 login.button.no = No
 login.button.forward = Log In
 login.label.host = Host:
-login.label.user = Username:
+login.label.user = User:
 login.label.role = Role:
 login.field.role.none = (none)
 
--- a/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/swing/control/resources/Resources.properties	Wed Jan 19 13:14:12 2011 -0500
+++ b/usr/src/java/vpanels/panel/org/opensolaris/os/vp/panel/swing/control/resources/Resources.properties	Wed Jan 19 14:32:11 2011 -0500
@@ -58,4 +58,4 @@
 login.popup.clear = Clear History...
 login.popup.role = Change Role...
 login.popup.user = Change User...
-login.err.role.none = Roles are not available for user "{1}" on host "{0}".
+login.err.role.none = No role has been granted to user "{1}" on host "{0}".