KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > jdesktop > swing > auth > JXLoginPanel


1 package org.jdesktop.swing.auth;
2
3 /*
4  * $Id: JXLoginPanel.java,v 1.3 2005/02/26 06:26:48 bino_george Exp $
5  *
6  * Copyright 2004 Sun Microsystems, Inc., 4150 Network Circle,
7  * Santa Clara, California 95054, U.S.A. All rights reserved.
8  */

9
10 import java.awt.BorderLayout JavaDoc;
11 import java.awt.Cursor JavaDoc;
12 import java.awt.Frame JavaDoc;
13 import java.awt.GridBagConstraints JavaDoc;
14 import java.awt.GridBagLayout JavaDoc;
15 import java.awt.GridLayout JavaDoc;
16 import java.awt.Insets JavaDoc;
17 import java.awt.event.ActionEvent JavaDoc;
18 import java.awt.event.ActionListener JavaDoc;
19 import java.awt.event.FocusEvent JavaDoc;
20 import java.awt.event.FocusListener JavaDoc;
21 import java.util.Enumeration JavaDoc;
22 import java.util.EventObject JavaDoc;
23 import java.util.HashMap JavaDoc;
24 import java.util.MissingResourceException JavaDoc;
25 import java.util.ResourceBundle JavaDoc;
26 import javax.swing.JButton JavaDoc;
27 import javax.swing.JCheckBox JavaDoc;
28 import javax.swing.JComboBox JavaDoc;
29 import javax.swing.JComponent JavaDoc;
30 import javax.swing.JDialog JavaDoc;
31 import javax.swing.JFrame JavaDoc;
32 import javax.swing.JLabel JavaDoc;
33 import javax.swing.JOptionPane JavaDoc;
34 import javax.swing.JPanel JavaDoc;
35 import javax.swing.JPasswordField JavaDoc;
36 import javax.swing.JProgressBar JavaDoc;
37 import javax.swing.UIManager JavaDoc;
38
39 /**
40  * <p>JXLoginPanel is a JPanel that implements a Login dialog with
41  * support for saving passwords supplied for future use in a secure
42  * manner. It is intended to work with <strong>LoginService</strong>
43  * and <strong>PasswordStore</strong> to implement the
44  * authentication.</p>
45  *
46  * <p> In order to perform the authentication, <strong>JXLoginPanel</strong>
47  * calls the <code>authenticate</code> method of the <strong>LoginService
48  * </strong>. In order to perform the persistence of the password,
49  * <strong>JXLoginPanel</strong> calls the put method of the
50  * <strong>PasswordStore</strong> object that is supplied. If
51  * the <strong>PasswordStore</strong> is <code>null</code>, then the password
52  * is not saved. Similarly, if a <strong>PasswordStore</strong> is
53  * supplied and the password is null, then the <strong>PasswordStore</strong>
54  * will be queried for the password using the <code>get</code> method.
55  *
56  * @author Bino George
57  */

58
59 public class JXLoginPanel extends JPanel JavaDoc {
60
61     /**
62      * Comment for <code>serialVersionUID</code>
63      */

64     private static final long serialVersionUID = 3544949969896288564L;
65
66     private JLabel JavaDoc nameLabel;
67
68     private JLabel JavaDoc passwordLabel;
69
70     private JComboBox JavaDoc nameField;
71
72     private String JavaDoc username;
73
74     private JPasswordField JavaDoc passwordField;
75
76     private JCheckBox JavaDoc save;
77
78     private JComponent JavaDoc header;
79
80     private JComponent JavaDoc label;
81
82     private static JButton JavaDoc okButton;
83
84     // Cancel Button on the login dialog
85
private static JButton JavaDoc cancelButton;
86
87     private JPanel JavaDoc loginPanel;
88
89     private JPanel JavaDoc savePanel;
90
91     private JPanel JavaDoc headerPanel;
92
93     private LoginService loginService;
94
95     private PasswordStore passwordStore;
96
97     private UsernameStore usernameStore;
98
99     private Handler handler = new Handler();
100
101     //TODO This belongs in Application or some other class.
102
private static HashMap JavaDoc<String JavaDoc, Object JavaDoc> _resources;
103
104     /**
105      * Whether to save password or username ?
106      */

107     private int saveMode;
108
109     /**
110      * Dont save anything.
111      */

112     public static final int SAVE_NONE = 0;
113
114     /**
115      * Save the password using PasswordStore
116      */

117     public static final int SAVE_PASSWORD = 1;
118
119     /**
120      * Save the username in the Preferences node for this class.
121      */

122     public static final int SAVE_USERNAME = 2;
123
124     /**
125      * Creates a default JXLoginPanel instance
126      */

127     
128     static {
129     
130         // Popuplate UIDefaults with the localisable Strings we will use
131
// in the Login panel.
132

133         String JavaDoc keys[] = { "okString", "okString.mnemonic",
134                                    "cancelString", "cancelString.mnemonic",
135                                     "nameString", "loginString",
136                 "passwordString","rememberUserString",
137                 "rememberPasswordString", "loggingInString", };
138         
139         String JavaDoc className = JXLoginPanel.class.getCanonicalName();
140         String JavaDoc lookup;
141         for (String JavaDoc key : keys) {
142             lookup = className + "." + key;
143             if (UIManager.getString(lookup) == null) {
144                 UIManager.put(lookup, getResourceAsObject(key));
145             }
146         }
147     }
148
149     public JXLoginPanel() {
150         this(null, null, null, null, null, null);
151     }
152
153     /**
154      * Creates a JXLoginPanel with the supplied parameters
155      *
156      * @param name Name, can be null.
157      * @param password Password, can be null.
158      * @param service an Object that implements LoginService
159      * @param store an Object that implements Password store, can be null.
160      */

161     public JXLoginPanel(String JavaDoc name, String JavaDoc password, LoginService service,
162             PasswordStore store) {
163         this(name, password, service, store, null, null);
164     }
165
166     /**
167      * Creates a JXLoginPanel with the supplied parameters
168      *
169      * @param name Name, can be null.
170      * @param password Password, can be null.
171      * @param service an Object that implements LoginService
172      * @param store an Object that implements Password store, can be null.
173      * @param header a JComponent to use as the header, can be null.
174      * @paran label a JComponent to use as the label, can be null.
175      */

176     public JXLoginPanel(String JavaDoc name, String JavaDoc password, LoginService service,
177             PasswordStore store, JComponent JavaDoc header, JComponent JavaDoc label) {
178         loginService = service;
179         passwordStore = store;
180         this.username = name;
181         this.header = header;
182         this.label = label;
183         service.addLoginListener(new SaveListener());
184         init(name, password);
185     }
186
187     void init(String JavaDoc nameStr, String JavaDoc passwordStr) {
188         usernameStore = UsernameStore.getUsernameStore();
189         if (username != null) {
190             usernameStore.addUsername(username);
191         }
192         setLayout(new BorderLayout JavaDoc(5, 5));
193         createLoginPanel(nameStr, passwordStr);
194         add(loginPanel, BorderLayout.CENTER);
195         add(headerPanel, BorderLayout.NORTH);
196     }
197
198     void createLoginPanel(String JavaDoc nameStr, String JavaDoc passwordStr) {
199
200         String JavaDoc className = JXLoginPanel.class.getCanonicalName();
201         
202         nameLabel = new JLabel JavaDoc(UIManager.getString(className + "." + "nameString"));
203             passwordLabel = new JLabel JavaDoc(UIManager.getString(className + "." + "passwordString"));
204
205         loginPanel = new JPanel JavaDoc();
206
207         savePanel = new JPanel JavaDoc();
208         savePanel.setLayout(new GridBagLayout JavaDoc());
209         headerPanel = new JPanel JavaDoc();
210
211         headerPanel.setLayout(new GridBagLayout JavaDoc());
212
213         GridBagConstraints JavaDoc gbc = new GridBagConstraints JavaDoc();
214         nameField = new JComboBox JavaDoc(usernameStore.getUsernames());//new JTextField(nameStr, 15);
215
nameField.setEditable(true);
216         nameField.addActionListener(handler);
217         nameField.addFocusListener(handler);
218
219         passwordField = new JPasswordField JavaDoc(passwordStr, 15);
220
221         gbc.gridx = 0;
222         gbc.gridy = 0;
223         gbc.fill = GridBagConstraints.NONE;
224         gbc.insets = new Insets JavaDoc(12, 12, 5, 12);
225         gbc.anchor = GridBagConstraints.WEST;
226         loginPanel.setLayout(new GridBagLayout JavaDoc());
227         loginPanel.add(nameLabel, gbc);
228
229         gbc.gridx = 1;
230         gbc.insets = new Insets JavaDoc(12, 0, 5, 11);
231         gbc.anchor = GridBagConstraints.WEST;
232         gbc.fill = GridBagConstraints.HORIZONTAL;
233         loginPanel.add(nameField, gbc);
234
235         gbc.gridy++;
236         gbc.gridx = 0;
237         gbc.insets = new Insets JavaDoc(0, 12, 6, 12);
238         gbc.anchor = GridBagConstraints.WEST;
239         gbc.fill = GridBagConstraints.NONE;
240         loginPanel.add(passwordLabel, gbc);
241
242         gbc.gridx = 1;
243         gbc.insets = new Insets JavaDoc(0, 0, 5, 11);
244         gbc.anchor = GridBagConstraints.WEST;
245         gbc.fill = GridBagConstraints.HORIZONTAL;
246         loginPanel.add(passwordField, gbc);
247
248         gbc.gridy++;
249         gbc.gridx = 1;
250         gbc.fill = GridBagConstraints.NONE;
251         loginPanel.add(savePanel, gbc);
252
253         gbc.gridx = 0;
254         gbc.gridy = 0;
255         if (header != null) {
256             gbc.insets = new Insets JavaDoc(0, 0, 0, 0);
257             gbc.anchor = GridBagConstraints.WEST;
258             gbc.fill = GridBagConstraints.HORIZONTAL;
259             headerPanel.add(header, gbc);
260             gbc.gridy++;
261         }
262         if (label != null) {
263             gbc.insets = new Insets JavaDoc(12, 12, 0, 0);
264             headerPanel.add(label, gbc);
265         }
266
267     }
268
269     /**
270      * Listener class to implement saving of passwords and usernames.
271      *
272      *
273      */

274     class SaveListener implements LoginListener {
275         public void loginFailed(EventObject JavaDoc source) {
276         }
277
278         public void loginSucceeded(EventObject JavaDoc source) {
279             if (getSaveMode() == SAVE_PASSWORD) {
280                 savePassword();
281             } else if (getSaveMode() == SAVE_USERNAME) {
282                 usernameStore.addUsername(username);
283                 usernameStore.saveUsernames();
284             }
285         }
286
287         public void loginStarted(EventObject JavaDoc source) {
288         }
289
290         public void loginCanceled(EventObject JavaDoc source) {
291         }
292     }
293
294     void savePassword() {
295         if (passwordStore != null) {
296             passwordStore.set(getUserName(),getLoginService().getServer(),getPassword());
297         }
298     }
299
300     private class Handler implements ActionListener JavaDoc, FocusListener JavaDoc {
301         public void actionPerformed(ActionEvent JavaDoc ae) {
302             if (ae.getSource() == nameField) {
303                 username = (String JavaDoc) nameField.getSelectedItem();
304             }
305         }
306
307         public void focusGained(FocusEvent JavaDoc e) {
308
309         }
310
311         public void focusLost(FocusEvent JavaDoc e) {
312             if (e.getSource() == nameField) {
313                 username = (String JavaDoc) nameField.getSelectedItem();
314             }
315         }
316     }
317
318     private static class DialogHelper implements LoginListener, ActionListener JavaDoc {
319         JDialog JavaDoc dialog;
320
321         JXLoginPanel loginPanel;
322
323         JPanel JavaDoc buttonPanel;
324
325         JPanel JavaDoc mainPanel;
326
327         LoginService service;
328
329         private JPanel JavaDoc progressPanel;
330
331         private JProgressBar JavaDoc progressBar;
332
333         private JButton JavaDoc loginCancelButton;
334
335         private boolean cancelled;
336
337         DialogHelper(Frame JavaDoc frame, JXLoginPanel panel, LoginService service) {
338             String JavaDoc className = JXLoginPanel.class.getCanonicalName();
339             this.loginPanel = panel;
340             this.service = service;
341             progressPanel = createProgressPanel();
342             dialog = new JDialog JavaDoc(frame, UIManager.getString(className + "." + "loginString"));
343             service.addLoginListener(this);
344             okButton = new JButton JavaDoc(UIManager.getString(className + "." + "okString"));
345                         okButton.setMnemonic(UIManager.getInt(className + "." + "okString.mnemonic"));
346                         okButton.addActionListener(this);
347             cancelButton = new JButton JavaDoc(UIManager.getString(className + "." + "cancelString"));
348                         cancelButton.setMnemonic(UIManager.getInt(className + "." + "cancelString.mnemonic"));
349             cancelButton.addActionListener(this);
350             buttonPanel = new JPanel JavaDoc();
351                         JPanel JavaDoc innerPanel = new JPanel JavaDoc();
352                         innerPanel.setLayout(new GridLayout JavaDoc(1,2));
353             buttonPanel.setLayout(new java.awt.GridBagLayout JavaDoc());
354
355             GridBagConstraints JavaDoc gridBagConstraints = new GridBagConstraints JavaDoc();
356             gridBagConstraints.gridx = 1;
357             gridBagConstraints.gridy = 0;
358             gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
359             gridBagConstraints.anchor = java.awt.GridBagConstraints.EAST;
360             gridBagConstraints.insets = new java.awt.Insets JavaDoc(17, 5, 11, 11);
361             innerPanel.add(okButton);
362                         innerPanel.add(cancelButton);
363                         buttonPanel.add(innerPanel, gridBagConstraints);
364                         
365             gridBagConstraints.gridx = 0;
366             gridBagConstraints.gridy = 0;
367             gridBagConstraints.fill = java.awt.GridBagConstraints.HORIZONTAL;
368             gridBagConstraints.weightx = 1.0;
369             buttonPanel.add(new JLabel JavaDoc(), gridBagConstraints);
370
371             mainPanel = new JPanel JavaDoc();
372             mainPanel.setLayout(new BorderLayout JavaDoc());
373             mainPanel.add(loginPanel, BorderLayout.CENTER);
374             mainPanel.add(buttonPanel, BorderLayout.SOUTH);
375             dialog.add(mainPanel);
376                         
377                         dialog.getRootPane().setDefaultButton(okButton);
378             dialog.pack();
379             dialog.setModal(true);
380             dialog.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
381         }
382
383         JPanel JavaDoc createProgressPanel() {
384             String JavaDoc className = JXLoginPanel.class.getCanonicalName();
385             JPanel JavaDoc panel = new JPanel JavaDoc();
386             panel.setLayout(new GridBagLayout JavaDoc());
387             GridBagConstraints JavaDoc gbc = new GridBagConstraints JavaDoc();
388             gbc.insets = new Insets JavaDoc(8, 8, 8, 8);
389             gbc.gridx = 0;
390             gbc.gridy = 0;
391             progressBar = new JProgressBar JavaDoc();
392             panel.add(new JLabel JavaDoc(UIManager.getString(className + "." +"loggingInString")), gbc);
393             gbc.gridy = 1;
394             panel.add(progressBar, gbc);
395             gbc.gridy = 2;
396             loginCancelButton = new JButton JavaDoc(UIManager.getString(className + "." + "cancelString"));
397             loginCancelButton.addActionListener(this);
398             panel.add(loginCancelButton, gbc);
399             return panel;
400         }
401
402         public void show() {
403             dialog.setVisible(true);
404         }
405
406         public void loginFailed(EventObject JavaDoc source) {
407             finishedLogin(false);
408             JOptionPane.showMessageDialog(dialog, "Login failed !");
409
410         }
411
412         public void loginSucceeded(EventObject JavaDoc source) {
413             finishedLogin(true);
414             JOptionPane.showMessageDialog(dialog, "Login Succeeded !");
415             dialog.dispose();
416         }
417
418         public void loginStarted(EventObject JavaDoc source) {
419
420         }
421
422         /**
423          *
424          */

425         void startLogin() {
426             cancelled = false;
427             dialog.remove(mainPanel);
428             progressBar.setIndeterminate(true);
429             dialog.add(progressPanel);
430             loginPanel.setCursor(new Cursor JavaDoc(Cursor.WAIT_CURSOR));
431             dialog.pack();
432             String JavaDoc name = loginPanel.getUserName();
433             char[] password = loginPanel.getPassword();
434             service.startAuthentication(name, password, null);
435         }
436
437         void finishedLogin(boolean result) {
438             progressBar.setIndeterminate(false);
439             dialog.remove(progressPanel);
440             dialog.add(mainPanel);
441             dialog.pack();
442             loginPanel.setCursor(new Cursor JavaDoc(Cursor.DEFAULT_CURSOR));
443         }
444
445         void cancelAuthentication() {
446             service.cancelAuthentication();
447             progressBar.setIndeterminate(false);
448             dialog.remove(progressPanel);
449             dialog.add(mainPanel);
450             dialog.pack();
451             loginPanel.setCursor(new Cursor JavaDoc(Cursor.DEFAULT_CURSOR));
452         }
453
454         public void loginCanceled(EventObject JavaDoc source) {
455             cancelled = true;
456         }
457
458         public void actionPerformed(ActionEvent JavaDoc ae) {
459             Object JavaDoc source = ae.getSource();
460             if (source == okButton) {
461                 startLogin();
462             } else if (source == loginCancelButton) {
463                 cancelAuthentication();
464             } else if (source == cancelButton) {
465                 dialog.dispose();
466             }
467         }
468     }
469
470     /**
471      * A convenience method to show a Login dialog
472      *
473      * @param frame parent Frame
474      * @param name name
475      * @param password password
476      * @param service service
477      * @param store password store
478      * @param saveMode saveMode
479      */

480     public static void showLoginDialog(Frame JavaDoc frame, String JavaDoc name,
481             String JavaDoc password, LoginService service, PasswordStore store,
482             int saveMode) {
483         showLoginDialog(frame, name, password, service, store, null, null,
484                 saveMode);
485     }
486
487     /**
488      * A convenience method to show a Login dialog
489      *
490      * @param frame parent Frame
491      * @param name name
492      * @param password password
493      * @param service service
494      * @param store password store
495      * @param header header component
496      * @param label label component
497      * @param saveMode saveMode
498      */

499     public static void showLoginDialog(Frame JavaDoc frame, String JavaDoc name,
500             String JavaDoc password, LoginService service, PasswordStore store,
501             JComponent JavaDoc header, JComponent JavaDoc label, int saveMode) {
502         JXLoginPanel loginPanel = new JXLoginPanel(name, password, service,
503                 store, header, label);
504         loginPanel.setSaveMode(saveMode);
505         DialogHelper helper = new DialogHelper(frame, loginPanel, service);
506         helper.show();
507     }
508
509     /**
510      * Returns the name to use for the resource bundle for this module. The
511      * default implementation returns the
512      * <code>getClass().getName().resources.Resources</code>, subclasses
513      * wanting different behavior should override appropriately.
514      *
515      * @return Name for resource bundle
516      */

517
518     
519     static String JavaDoc getResourceBundleName() {
520         Package JavaDoc package1 = JXLoginPanel.class.getPackage();
521         return package1 == null ? "resources.Resources" : package1.getName()
522                 + ".resources.Resources";
523     }
524
525     static String JavaDoc getResourceAsString(String JavaDoc key) {
526         Object JavaDoc value = getResourceAsObject(key);
527         return value.toString();
528     }
529
530     static int getResourceAsInt(String JavaDoc key) throws NumberFormatException JavaDoc {
531         Object JavaDoc value = getResourceAsObject(key);
532         if (value instanceof Integer JavaDoc) {
533             return ((Integer JavaDoc) value).intValue();
534         }
535         return Integer.parseInt(value.toString());
536     }
537
538     static Object JavaDoc getResourceAsObject(String JavaDoc key)
539             throws MissingResourceException JavaDoc {
540         synchronized (JXLoginPanel.class) {
541             if (_resources == null) {
542                 _resources = new HashMap JavaDoc<String JavaDoc, Object JavaDoc>();
543                 ResourceBundle JavaDoc bundle = ResourceBundle
544                         .getBundle(getResourceBundleName());
545                 Enumeration JavaDoc bundleKeys = bundle.getKeys();
546                 while (bundleKeys.hasMoreElements()) {
547                     String JavaDoc resourceKey = (String JavaDoc) bundleKeys.nextElement();
548                     _resources.put(resourceKey, bundle.getObject(resourceKey));
549                 }
550             }
551         }
552         return _resources.get(key);
553     }
554
555     /**
556      * @return Returns the saveMode.
557      */

558     public int getSaveMode() {
559         return saveMode;
560     }
561
562     /**
563      * @param saveMode The saveMode to set.
564      */

565     public void setSaveMode(int saveMode) {
566         this.saveMode = saveMode;
567         savePanel.removeAll();
568         String JavaDoc className = JXLoginPanel.class.getCanonicalName();
569         if (saveMode == SAVE_PASSWORD) {
570             save = new JCheckBox JavaDoc(UIManager.getString(className + "." + "rememberPasswordString"),
571                     passwordStore != null ? true : false);
572             savePanel.add(save);
573         } else {
574             save = new JCheckBox JavaDoc(UIManager.getString(className + "." +"rememberUserString"),
575                     passwordStore != null ? true : false);
576             savePanel.add(save);
577         }
578
579     }
580
581     /**
582      * Sets the <strong>LoginService</strong> for this panel.
583      *
584      * @param service service
585      */

586     public void setLoginService(LoginService service) {
587         loginService = service;
588     }
589
590     /**
591      * Gets the <strong>LoginService</strong> for this panel.
592      *
593      * @return service service
594      */

595     public LoginService getLoginService() {
596         return loginService;
597     }
598
599     /**
600      * Sets the <strong>PasswordStore</strong> for this panel.
601      *
602      * @param store PasswordStore
603      */

604     public void setPasswordStore(PasswordStore store) {
605         passwordStore = store;
606     }
607
608     /**
609      * Gets the <strong>PasswordStore</strong> for this panel.
610      *
611      * @return store PasswordStore
612      */

613     public PasswordStore getPasswordStore() {
614         return passwordStore;
615     }
616
617     /**
618      * Sets the <strong>User name</strong> for this panel.
619      *
620      * @param username User name
621      */

622     public void setUserName(String JavaDoc username) {
623         nameField.setSelectedItem(username);
624     }
625
626     /**
627      * Gets the <strong>User name</strong> for this panel.
628      *
629      * @param username User name
630      */

631     public String JavaDoc getUserName() {
632         if (username == null) {
633             username = (String JavaDoc) nameField.getSelectedItem();
634         }
635         return username;
636     }
637
638     /**
639      * Sets the <strong>Password</strong> for this panel.
640      *
641      * @param password Password
642      */

643     public void setPassword(char[] password) {
644         passwordField.setText(new String JavaDoc(password));
645     }
646
647     /**
648      * Gets the <strong>Password</strong> for this panel.
649      *
650      * @return password Password
651      */

652     public char[] getPassword() {
653         return passwordField.getPassword();
654     }
655
656 }
Popular Tags