package org.genedb.anttasks;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Component;
import java.awt.Dialog;
import java.awt.Frame;
import java.awt.Label;
import java.awt.Panel;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.TextEvent;
import java.awt.event.TextListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.Console;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Task;
/**
* A simple ant task that requests a password from the user.
*
* If a console is available, the password will be requested on the console.
* Otherwise a dialog box will pop up.
*
* @author rh11
*/
public class Password extends Task {
private String name;
private String prompt = "Password";
public void setName(String name) {
this.name = name;
}
public void setPrompt(String message) {
this.prompt = message;
}
@Override
public void execute() throws BuildException {
if (name == null)
throw new BuildException("<password> task requires 'name=' attribute.");
String password = readPassword(prompt);
if (password != null) {
String passwordString = new String(password);
getProject().setProperty(name, passwordString);
}
}
private String readPassword(String prompt) {
Console console = System.console();
if (console == null) {
return readPasswordFromDialog(prompt);
}
return readPasswordFromConsole(console, prompt);
}
private String readPasswordFromConsole(Console console, String prompt) {
char[] password = console.readPassword("%s: ", prompt);
if (password == null)
return null;
return new String(password);
}
private Dialog dialog;
private String dialogPassword = "";
private boolean dialogCancelled;
private String readPasswordFromDialog(String prompt) {
System.out.println("Prompting user for password");
dialogCancelled = false;
Frame hiddenFrame = new Frame(getClass().getName());
dialog = new Dialog(hiddenFrame, "Password", true);
dialog.setLocation(100, 100);
dialog.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent windowEvent) {
dialogCancelled = true;
windowEvent.getWindow().dispose();
}
});
dialog.add(new Label(prompt), BorderLayout.NORTH);
dialog.add(passwordEntryField(), BorderLayout.CENTER);
dialog.add(buttonPanel(), BorderLayout.SOUTH);
dialog.pack();
dialog.setVisible(true);
hiddenFrame.dispose();
if (dialogCancelled)
throw new BuildException("Password entry cancelled.");
return dialogPassword;
}
private Component passwordEntryField() {
final TextField textField = new TextField(16);
textField.setEchoChar('*');
textField.addTextListener(new TextListener() {
public void textValueChanged(TextEvent e) {
if (e.getID() == TextEvent.TEXT_VALUE_CHANGED)
dialogPassword = textField.getText();
}
});
textField.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
dialog.dispose();
}
});
return textField;
}
private Component buttonPanel() {
Panel buttonPanel = new Panel();
Button cancelButton = new Button("Cancel");
cancelButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
dialogCancelled = true;
dialog.dispose();
}
});
Button okButton = new Button("OK");
okButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent actionEvent) {
dialog.dispose();
}
});
buttonPanel.add(okButton);
buttonPanel.add(cancelButton);
return buttonPanel;
}
}