bb.gui
Class DialogInputSecure

java.lang.Object
  extended by java.awt.Component
      extended by java.awt.Container
          extended by java.awt.Window
              extended by java.awt.Dialog
                  extended by javax.swing.JDialog
                      extended by bb.gui.DialogInputSecure
All Implemented Interfaces:
ImageObserver, MenuContainer, Serializable, Accessible, RootPaneContainer, WindowConstants

public class DialogInputSecure
extends JDialog

Subclass of JDialog which lets the user input some highly sensitive piece of text (e.g. a password).

The text is entered in a TextFieldSecure instance inside the dialog. This class allows optional header text above the TextFieldSecure (e.g. for instructions, a password hint, etc), as well as requires prompt text on the left to label the TextFieldSecure. It automatically puts a label on the right which specifies the maximum number of chars that may be entered.

The only public member is the static getInputSecure method, which is all that normal users will use. For subclassing purposes, the other members of this class have protected access.

Like typical Java GUI code, this class's GUI parts (the constructor and all instance methods) are not multithread safe: they expect to only be called by EventQueue's dispatch thread. This threading limitation is checked in every such public method. Note, however, that the chief public API method, getInputSecure, may be safely called by any thread.

Author:
Brent Boyer
See Also:
Serialized Form

Nested Class Summary
private static class DialogInputSecure.DialogTask
          Bridges the requirement of getInputSecure that any thread can call that method with the requirement of the constructor that only EventQueue's dispatch thread can call it.
static class DialogInputSecure.UnitTest
          See the Overview page of the project's javadocs for a general description of this unit test class.
 
Nested classes/interfaces inherited from class javax.swing.JDialog
JDialog.AccessibleJDialog
 
Nested classes/interfaces inherited from class java.awt.Dialog
Dialog.AccessibleAWTDialog, Dialog.ModalExclusionType, Dialog.ModalityType
 
Nested classes/interfaces inherited from class java.awt.Window
Window.AccessibleAWTWindow
 
Nested classes/interfaces inherited from class java.awt.Container
Container.AccessibleAWTContainer
 
Nested classes/interfaces inherited from class java.awt.Component
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
 
Field Summary
private static long serialVersionUID
           
private  TextFieldSecure textFieldSecure
          A TextFieldSecure instance that is used by this class to input highly sensitive text.
 
Fields inherited from class javax.swing.JDialog
accessibleContext, rootPane, rootPaneCheckingEnabled
 
Fields inherited from class java.awt.Dialog
DEFAULT_MODALITY_TYPE
 
Fields inherited from class java.awt.Component
BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
 
Fields inherited from interface javax.swing.WindowConstants
DISPOSE_ON_CLOSE, DO_NOTHING_ON_CLOSE, EXIT_ON_CLOSE, HIDE_ON_CLOSE
 
Fields inherited from interface java.awt.image.ImageObserver
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
 
Constructor Summary
protected DialogInputSecure(Frame parent, String title, boolean modal, String header, String prompt, int numberCharsMax)
          Constructs a new DialogInputSecure instance.
 
Method Summary
protected  JComponent buildButtons()
           
protected  JComponent buildGui(String header, String prompt, int numberCharsMax)
           
protected  JComponent buildSecureEntry(String prompt, int numberCharsMax)
           
static char[] getInputSecure(Frame parent, String title, boolean modal, String header, String prompt, int numberCharsMax)
          Reads and returns some sensitive piece of information (e.g. a password) from a new DialogInputSecure instance.
 
Methods inherited from class javax.swing.JDialog
addImpl, createRootPane, dialogInit, getAccessibleContext, getContentPane, getDefaultCloseOperation, getGlassPane, getGraphics, getJMenuBar, getLayeredPane, getRootPane, getTransferHandler, isDefaultLookAndFeelDecorated, isRootPaneCheckingEnabled, paramString, processWindowEvent, remove, repaint, setContentPane, setDefaultCloseOperation, setDefaultLookAndFeelDecorated, setGlassPane, setJMenuBar, setLayeredPane, setLayout, setRootPane, setRootPaneCheckingEnabled, setTransferHandler, update
 
Methods inherited from class java.awt.Dialog
addNotify, getModalityType, getTitle, hide, isModal, isResizable, isUndecorated, setModal, setModalityType, setResizable, setTitle, setUndecorated, setVisible, show, toBack
 
Methods inherited from class java.awt.Window
addPropertyChangeListener, addPropertyChangeListener, addWindowFocusListener, addWindowListener, addWindowStateListener, applyResourceBundle, applyResourceBundle, createBufferStrategy, createBufferStrategy, dispose, getBufferStrategy, getFocusableWindowState, getFocusCycleRootAncestor, getFocusOwner, getFocusTraversalKeys, getGraphicsConfiguration, getIconImages, getInputContext, getListeners, getLocale, getModalExclusionType, getMostRecentFocusOwner, getOwnedWindows, getOwner, getOwnerlessWindows, getToolkit, getWarningString, getWindowFocusListeners, getWindowListeners, getWindows, getWindowStateListeners, isActive, isAlwaysOnTop, isAlwaysOnTopSupported, isFocusableWindow, isFocusCycleRoot, isFocused, isLocationByPlatform, isShowing, pack, paint, postEvent, processEvent, processWindowFocusEvent, processWindowStateEvent, removeNotify, removeWindowFocusListener, removeWindowListener, removeWindowStateListener, reshape, setAlwaysOnTop, setBounds, setBounds, setCursor, setFocusableWindowState, setFocusCycleRoot, setIconImage, setIconImages, setLocationByPlatform, setLocationRelativeTo, setMinimumSize, setModalExclusionType, setSize, setSize, toFront
 
Methods inherited from class java.awt.Container
add, add, add, add, add, addContainerListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getAlignmentX, getAlignmentY, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalPolicy, getInsets, getLayout, getMaximumSize, getMinimumSize, getMousePosition, getPreferredSize, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, print, printComponents, processContainerEvent, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusTraversalKeys, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setFont, transferFocusBackward, transferFocusDownCycle, validate, validateTree
 
Methods inherited from class java.awt.Component
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, contains, createImage, createImage, createVolatileImage, createVolatileImage, disable, disableEvents, dispatchEvent, enable, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getBackground, getBaseline, getBaselineResizeBehavior, getBounds, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getFontMetrics, getForeground, getHeight, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocation, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getSize, getTreeLock, getWidth, getX, getY, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isDoubleBuffered, isEnabled, isFocusable, isFocusOwner, isFocusTraversable, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isOpaque, isPreferredSizeSet, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, prepareImage, prepareImage, printAll, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processKeyEvent, processMouseEvent, processMouseMotionEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resize, resize, setBackground, setComponentOrientation, setDropTarget, setEnabled, setFocusable, setFocusTraversalKeysEnabled, setForeground, setIgnoreRepaint, setLocale, setLocation, setLocation, setMaximumSize, setName, setPreferredSize, show, size, toString, transferFocus, transferFocusUpCycle
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

serialVersionUID

private static final long serialVersionUID
See Also:
Constant Field Values

textFieldSecure

private final TextFieldSecure textFieldSecure
A TextFieldSecure instance that is used by this class to input highly sensitive text.

Constructor Detail

DialogInputSecure

protected DialogInputSecure(Frame parent,
                            String title,
                            boolean modal,
                            String header,
                            String prompt,
                            int numberCharsMax)
                     throws IllegalArgumentException
Constructs a new DialogInputSecure instance.

Parameters:
parent - the parent Frame that this JDialog will be attached to; may be null
title - the dialog's title; may be null
modal - specifies whether or not this JDialog is a modal dialog
header - optional text (e.g. instructions, a password hint) displayed above the TextFieldSecure; this text will be put into a JLabel, so it may be html formatted; may be null
prompt - mandatory text displayed next to the TextFieldSecure; this text will be put into a JLabel, so it may be html formatted; must be non-blank
numberCharsMax - the maximum number of chars that may be typed in the TextFieldSecure as well as the number of columns in the TextFieldSecure (this affects its displayed width); must be > 0
Throws:
IllegalArgumentException - if prompt is blank; numberCharsMax <= 0
Method Detail

getInputSecure

public static final char[] getInputSecure(Frame parent,
                                          String title,
                                          boolean modal,
                                          String header,
                                          String prompt,
                                          int numberCharsMax)
                                   throws InterruptedException,
                                          InvocationTargetException
Reads and returns some sensitive piece of information (e.g. a password) from a new DialogInputSecure instance. The result is a char[], not a String, so that it can be zeroed out after use.

See the constructor for documentation of all the params and throws.

Note: any thread may safely call this method.

Throws:
InterruptedException - if the calling thread is interrupted will waiting inside this method
InvocationTargetException - if a problem happens while reading user input; this Exception will wrap some underlying one (e.g. an IllegalArgumentException if one of the args of this method is invalid)

buildGui

protected JComponent buildGui(String header,
                              String prompt,
                              int numberCharsMax)

buildSecureEntry

protected JComponent buildSecureEntry(String prompt,
                                      int numberCharsMax)

buildButtons

protected JComponent buildButtons()