source: branches/2.2/security/ExpressoCert/src/br/gov/serpro/ui/DialogBuilder.java @ 3633

Revision 3633, 15.5 KB checked in by rafaelraymundo, 13 years ago (diff)

Ticket #1430 - Mais de um certificados gravados no mesmo token.

Line 
1package br.gov.serpro.ui;
2
3import br.gov.serpro.setup.Setup;
4import java.awt.BorderLayout;
5import java.awt.Color;
6import java.awt.Dimension;
7import java.awt.FlowLayout;
8import java.awt.Frame;
9import java.awt.Toolkit;
10import java.awt.event.ActionEvent;
11import java.awt.event.ActionListener;
12import java.awt.event.KeyEvent;
13import java.awt.event.KeyListener;
14import java.awt.event.WindowEvent;
15import java.awt.event.WindowListener;
16import java.beans.PropertyChangeEvent;
17import java.beans.PropertyChangeListener;
18import java.lang.reflect.InvocationTargetException;
19
20import java.util.List;
21import javax.swing.BorderFactory;
22import javax.swing.JButton;
23import javax.swing.JDialog;
24import javax.swing.JLabel;
25import javax.swing.JList;
26import javax.swing.JOptionPane;
27import javax.swing.JPanel;
28import javax.swing.JPasswordField;
29import javax.swing.JScrollPane;
30import javax.swing.ListSelectionModel;
31import javax.swing.SwingUtilities;
32import javax.swing.WindowConstants;
33
34public final class DialogBuilder extends JDialog implements PropertyChangeListener {
35
36    private Setup setup;
37    private static Object lock = new Object();
38    private String pin = null;
39    private String certificateSubject = null;
40    //private List<String> certificatelist = new ArrayList<String>();
41    private boolean ok = false;
42    private boolean locked = true;
43    private JOptionPane optionPane;
44//      private DialogBuilder myself;
45    private EventManager em = new EventManager();
46    /**
47     * Gerado automaticamente
48     */
49    private static final long serialVersionUID = 1003857725229120014L;
50    private int dialogType = -1;
51    //JPanel pNorte, pCentro, pSul;
52    //JButton btOk, btCancel;
53    //JLabel lTitle, lTitle2, lPin;
54    JPasswordField pfPin;
55    JList lCertificatesList;
56    public static final int PIN_NEEDED_DIALOG = 0;
57    public static final int CERTIFICATE_SELECTOR_DIALOG = 1;
58
59    private DialogBuilder(Frame parent, Setup setup) {
60
61        super(parent, true);
62        this.setup = setup;
63        this.setResizable(false);
64//              this.myself = this;
65
66        //this.setVisible(true);
67
68    }
69
70    private void buildPinDialog() {
71
72        this.dialogType = DialogBuilder.PIN_NEEDED_DIALOG;
73
74        this.setContentPane(new JPanel());
75        this.setLayout(new BorderLayout());
76        this.setTitle(this.setup.getLang("ExpressoCertMessages", "pin"));
77        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
78        this.setModal(true);
79
80        JPanel pNorte = new JPanel(new FlowLayout(FlowLayout.CENTER));
81        this.add(pNorte, BorderLayout.NORTH);
82        JPanel pCentro = new JPanel(new FlowLayout(FlowLayout.CENTER));
83        this.add(pCentro, BorderLayout.CENTER);
84        JPanel pSul = new JPanel(new FlowLayout(FlowLayout.CENTER));
85        this.add(pSul, BorderLayout.SOUTH);
86
87        //JLabel lTitle = new JLabel("Entre com o seu PIN:");
88        JLabel lTitle = new JLabel(this.setup.getLang("ExpressoCertMessages", "DialogBuilder001"));
89        pNorte.add(lTitle);
90
91        JLabel lPin = new JLabel(this.setup.getLang("ExpressoCertMessages", "pin") + ":");
92        this.pfPin = new JPasswordField(30);
93        this.pfPin.requestFocusInWindow();
94        this.pfPin.addKeyListener(this.em);
95        pCentro.add(lPin);
96        pCentro.add(this.pfPin);
97
98        JButton btOk = new JButton(this.setup.getLang("ExpressoCertMessages", "ok"));
99        btOk.setMnemonic(KeyEvent.VK_ENTER);
100        btOk.setActionCommand("ok");
101
102        btOk.addActionListener(this.em);
103
104        JButton btCancel = new JButton(this.setup.getLang("ExpressoCertMessages", "cancel"));
105        btCancel.setMnemonic(KeyEvent.VK_ESCAPE);
106        btCancel.setActionCommand("cancel");
107        btCancel.addActionListener(this.em);
108
109        pSul.add(btOk);
110        pSul.add(btCancel);
111
112        this.addWindowListener(this.em);
113        this.pack();
114
115        //Posicionando no centro da tela.
116        Dimension mySize = this.getSize();
117        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
118        //System.out.println("ScreenSize: " + screenSize.toString()+"\nMySize: " +mySize.toString());
119        this.setLocation(screenSize.width / 2 - (mySize.width / 2), screenSize.height / 2 - (mySize.height / 2));
120
121        setVisible(true);
122        //this.repaint();
123
124    }
125
126    private void buildCertificateSelector(List<String> subjectList) {
127
128        dialogType = DialogBuilder.CERTIFICATE_SELECTOR_DIALOG;
129
130        this.setContentPane(new JPanel());
131        this.setLayout(new BorderLayout());
132        this.setTitle(this.setup.getLang("ExpressoCertMessages", "certificate"));
133        this.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
134        this.setModal(true);
135
136        JPanel pNorte = new JPanel(new FlowLayout(FlowLayout.CENTER));
137        this.add(pNorte, BorderLayout.NORTH);
138        JPanel pCentro = new JPanel(new FlowLayout(FlowLayout.CENTER));
139        this.add(pCentro, BorderLayout.CENTER);
140        JPanel pSul = new JPanel(new FlowLayout(FlowLayout.CENTER));
141        this.add(pSul, BorderLayout.SOUTH);
142
143        JLabel lTitle = new JLabel(this.setup.getLang("ExpressoCertMessages", "DialogBuilder002"));
144        pNorte.add(lTitle);
145
146        lCertificatesList = new JList(subjectList.toArray());
147        lCertificatesList.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
148        lCertificatesList.setLayoutOrientation(JList.HORIZONTAL_WRAP);
149        lCertificatesList.setBorder(BorderFactory.createLoweredBevelBorder());
150        JScrollPane listScroller = new JScrollPane(lCertificatesList);
151        listScroller.setPreferredSize(new Dimension(500, 80));
152        listScroller.setAlignmentX(LEFT_ALIGNMENT);
153
154        pCentro.add(listScroller);
155        //pCentro.setBorder(BorderFactory.createLineBorder(Color.BLACK, 2));
156
157        JButton bSelect = new JButton(this.setup.getLang("ExpressoCertMessages", "select"));
158        bSelect.setMnemonic(KeyEvent.VK_ENTER);
159        bSelect.setActionCommand("select");
160        bSelect.addActionListener(em);
161        pSul.add(bSelect);
162
163        JButton btCancel = new JButton(this.setup.getLang("ExpressoCertMessages", "cancel"));
164        btCancel.setMnemonic(KeyEvent.VK_ESCAPE);
165        btCancel.setActionCommand("cancel");
166        btCancel.addActionListener(this.em);
167        pSul.add(btCancel);
168
169        this.addWindowListener(em);
170        this.pack();
171
172        //Posicionando no centro da tela.
173        Dimension mySize = this.getSize();
174        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
175        //System.out.println("ScreenSize: " + screenSize.toString()+"\nMySize: " +mySize.toString());
176        this.setLocation(screenSize.width / 2 - (mySize.width / 2), screenSize.height / 2 - (mySize.height / 2));
177
178        this.setVisible(true);
179
180    }
181
182    // TODO: Lançar e implementar exceção ActionCanceled
183    private void cancelButtonActionPerformed() {
184        this.setVisible(false);
185        this.pin = null; // hack para saber que diálogo foi cancelado.
186        this.certificateSubject = null;
187        this.unlock();
188        //this.dispose();
189    }
190
191    private void okButtonActionPerformed() {
192        this.setVisible(false);
193        this.unlock();
194        //this.dispose();
195    }
196
197    protected String getPin() {
198        return this.pin;
199    }
200
201    protected void setPin(String pin) {
202        this.pin = pin;
203    }
204
205    protected String getCertificateSubject() {
206        return certificateSubject;
207    }
208
209    protected void setCertificateSubject(String certificateSubject) {
210        this.certificateSubject = certificateSubject;
211    }
212
213    protected boolean isLocked() {
214        synchronized (DialogBuilder.lock) {
215            return this.locked;
216        }
217    }
218
219    private void setLocked(boolean locked) {
220        synchronized (DialogBuilder.lock) {
221            this.locked = locked;
222        }
223
224    }
225
226    private void unlock() {
227        synchronized (DialogBuilder.lock) {
228            setLocked(false);
229            DialogBuilder.lock.notifyAll();
230        }
231    }
232
233    static public int showMessageDialog(Frame parent, Object message, Setup setup) {
234
235        return DialogBuilder.showDialog(parent, message, JOptionPane.INFORMATION_MESSAGE, JOptionPane.DEFAULT_OPTION, setup);
236
237    }
238
239    static public int showMessageDialog(Frame parent, Object message, int messageType, Setup setup) {
240
241        return DialogBuilder.showDialog(parent, message, messageType, JOptionPane.DEFAULT_OPTION, setup);
242
243    }
244
245    static public int showConfirmDialog(Frame parent, Object message, int messageType, int optionType, Setup setup) {
246
247        return DialogBuilder.showDialog(parent, message, messageType, optionType, setup);
248
249    }
250
251    static public int showDialog(Frame parent, Object message, int messageType, int optionType, Setup setup) {
252
253        DialogBuilder dialog = new DialogBuilder(parent, setup);
254        int valor = dialog.buildDialog(message, messageType, optionType);
255
256        dialog.dispose();
257
258        return valor;
259
260    }
261
262    private int buildDialog(Object message, int messageType, int optionType) {
263
264        this.optionPane = new JOptionPane(message, messageType, optionType);
265        this.setModal(true);
266        this.setContentPane(this.optionPane);
267        this.optionPane.addPropertyChangeListener(this);
268        this.pack();
269
270        //Posicionando no centro da tela.
271        Dimension mySize = this.getSize();
272        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
273        this.setLocation(screenSize.width / 2 - (mySize.width / 2), screenSize.height / 2 - (mySize.height / 2));
274        this.setVisible(true);
275
276        Object selectedValue = this.optionPane.getValue();
277        int resultado = JOptionPane.CLOSED_OPTION;
278        if (selectedValue != null) {
279            resultado = JOptionPane.CLOSED_OPTION;
280        } else if (selectedValue instanceof Integer) {
281            resultado = ((Integer) selectedValue).intValue();
282        }
283
284        //this.dispose();
285
286        return resultado;
287
288    }
289
290    public void propertyChange(PropertyChangeEvent evt) {
291        // TODO Stub de método gerado automaticamente
292        String property = evt.getPropertyName();
293
294        if (this.isVisible() &&
295                evt.getSource() == optionPane &&
296                JOptionPane.VALUE_PROPERTY.equals(property)) {
297
298            this.setVisible(false);
299        }
300
301    }
302
303    static public String showPinDialog(Frame parent, Setup setup) {
304        DialogBuilder pinCodeDialog = new DialogBuilder(parent, setup);
305
306        try {
307            SwingUtilities.invokeAndWait(pinCodeDialog.new PinCodeNeededBuilder());
308        } catch (InterruptedException e1) {
309            // TODO Bloco catch gerado automaticamente
310            e1.printStackTrace();
311        } catch (InvocationTargetException e1) {
312            // TODO Bloco catch gerado automaticamente
313            e1.printStackTrace();
314        }
315
316        synchronized (DialogBuilder.lock) {
317
318            while (pinCodeDialog.isLocked()) {
319                try {
320                    DialogBuilder.lock.wait();
321                } catch (InterruptedException e) {
322                    // TODO Bloco catch gerado automaticamente
323                }
324            }
325
326            String pin = pinCodeDialog.getPin();
327            pinCodeDialog.dispose();
328            pinCodeDialog = null;
329
330            return pin;
331        }
332    }
333
334    static public String showCertificateSelector(Frame parent, Setup setup, List<String> certificateList) {
335        DialogBuilder certificateSelectorDialog = new DialogBuilder(parent, setup);
336
337        try {
338            SwingUtilities.invokeAndWait(certificateSelectorDialog.new CertificateSelectorBuilder(certificateList));
339        } catch (InterruptedException e1) {
340            // TODO Bloco catch gerado automaticamente
341            e1.printStackTrace();
342        } catch (InvocationTargetException e1) {
343            // TODO Bloco catch gerado automaticamente
344            e1.printStackTrace();
345        }
346
347        synchronized (DialogBuilder.lock) {
348
349            while (certificateSelectorDialog.isLocked()) {
350                try {
351                    DialogBuilder.lock.wait();
352                } catch (InterruptedException e) {
353                    // TODO Bloco catch gerado automaticamente
354                }
355            }
356
357            String subject = certificateSelectorDialog.getCertificateSubject();
358            certificateSelectorDialog.dispose();
359            certificateSelectorDialog = null;
360
361            return subject;
362        }
363    }
364
365    synchronized private boolean isOk() {
366        return ok;
367    }
368
369    synchronized private void setOk(boolean ok) {
370        this.ok = ok;
371    }
372
373    private class PinCodeNeededBuilder implements Runnable {
374
375        public void run() {
376            buildPinDialog();
377        }
378    }
379
380    private class CertificateSelectorBuilder implements Runnable{
381
382        private List<String> certificateList;
383
384        public CertificateSelectorBuilder(List<String> certificateList){
385            this.certificateList = certificateList;
386        }
387
388        public void run() {
389            buildCertificateSelector(this.certificateList);
390        }
391    }
392
393    private final class EventManager implements ActionListener, KeyListener, WindowListener {
394
395        public void keyPressed(KeyEvent keyEvt) {
396            int keyPressed = keyEvt.getKeyCode();
397
398            if (keyPressed == KeyEvent.VK_ENTER) {
399                //System.out.println("Tecla ENTER pressionada");
400                if (dialogType == CERTIFICATE_SELECTOR_DIALOG) {
401                    this.actionPerformed(new ActionEvent(keyEvt.getSource(), keyEvt.getID(), "select"));
402                } else {
403                    this.actionPerformed(new ActionEvent(keyEvt.getSource(), keyEvt.getID(), "ok"));
404                }
405            } else if (keyPressed == KeyEvent.VK_ESCAPE) {
406                //System.out.println("Tecla ESC pressionada");
407                this.actionPerformed(new ActionEvent(keyEvt.getSource(), keyEvt.getID(), "cancel"));
408            }
409        }
410
411        public void keyReleased(KeyEvent arg0) {
412        }
413
414        public void keyTyped(KeyEvent keyEvt) {
415        }
416
417        public void windowActivated(WindowEvent arg0) {
418        }
419
420        public void windowClosed(WindowEvent arg0) {
421            //System.out.println("Window Closed: Fechando diálogo!");
422        }
423
424        public void windowClosing(WindowEvent arg0) {
425            //System.out.println("Window Closing: Fechando diálogo!");
426            cancelButtonActionPerformed();
427        }
428
429        public void windowDeactivated(WindowEvent arg0) {
430        }
431
432        public void windowDeiconified(WindowEvent arg0) {
433        }
434
435        public void windowIconified(WindowEvent arg0) {
436        }
437
438        public void windowOpened(WindowEvent arg0) {
439        }
440
441        public void actionPerformed(ActionEvent evt) {
442
443            String command = evt.getActionCommand();
444
445            // Atribui o valor digitado para o campo
446            // senha e esconde a interface e assina o certificado
447            if (command.equals("ok")) {
448
449                //if (pfPin != null && pfPin.getPassword().length <= 0){
450                // Mostra um aviso de que o campo PIN não foi preenchido
451                //JOptionPane.showMessageDialog(null, "Campo PIN não foi preenchido!",
452                //              "Aviso", JOptionPane.INFORMATION_MESSAGE);
453                //}
454                //else {
455                setPin(String.valueOf(pfPin.getPassword()));
456                okButtonActionPerformed();
457                //}
458
459            } else if (command.equals("select")){
460                setCertificateSubject((String) lCertificatesList.getSelectedValue());
461                okButtonActionPerformed();
462            }
463            else if (command.equals("cancel")) {
464                cancelButtonActionPerformed();
465            } else if (command.equals("prosseguir")) {
466                setOk(true);
467                okButtonActionPerformed();
468            }
469        }
470    }
471}
Note: See TracBrowser for help on using the repository browser.