blob: 7e9608b25e0f04bd2463867d8210faa061412c93 [file] [log] [blame]
/*
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package org.apache.batik.apps.svgbrowser;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.EventQueue;
import java.awt.Frame;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.net.Authenticator;
import java.net.PasswordAuthentication;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
/**
* This class is resposible for providing authentication information
* when needed by network protocols. It does this by poping up a small
* window that asks for User ID and password for the system.
*
* @author <a href="mailto:thomas.deweese@kodak.com">Thomas DeWeese</a>
* @version $Id$
*/
public class JAuthenticator extends Authenticator {
/**
* Internationalization message string
*/
public static final String TITLE
= "JAuthenticator.title";
public static final String LABEL_SITE
= "JAuthenticator.label.site";
public static final String LABEL_REQ
= "JAuthenticator.label.req";
public static final String LABEL_USERID
= "JAuthenticator.label.userID";
public static final String LABEL_PASSWORD
= "JAuthenticator.label.password";
public static final String LABEL_CANCEL
= "JAuthenticator.label.cancel";
public static final String LABEL_OK
= "JAuthenticator.label.ok";
protected JDialog window;
protected JButton cancelButton;
protected JButton okButton;
protected JLabel label1;
protected JLabel label2;
protected JTextField JUserID;
protected JPasswordField JPassword;
final Object lock = new Object();
private boolean result;
private volatile boolean wasNotified;
private String userID;
private char [] password;
public JAuthenticator() {
initWindow();
}
protected void initWindow() {
String title = Resources.getString(TITLE);
window = new JDialog((Frame)null, title, true);
Container mainPanel = window.getContentPane();
mainPanel.setLayout(new BorderLayout());
mainPanel.add(buildAuthPanel(), BorderLayout.CENTER);
mainPanel.add(buildButtonPanel(), BorderLayout.SOUTH);
window.pack();
window.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
cancelListener.actionPerformed
(new ActionEvent(e.getWindow(),
ActionEvent.ACTION_PERFORMED,
"Close"));
}
});
}
protected JComponent buildAuthPanel() {
GridBagLayout gridBag = new GridBagLayout();
GridBagConstraints c = new GridBagConstraints();
JPanel proxyPanel = new JPanel(gridBag);
c.fill = GridBagConstraints.BOTH;
c.weightx = 1.0;
c.gridwidth = 1;
JLabel labelS = new JLabel(Resources.getString(LABEL_SITE));
labelS.setHorizontalAlignment(SwingConstants.LEFT);
gridBag.setConstraints(labelS, c);
proxyPanel.add(labelS);
c.gridwidth = GridBagConstraints.REMAINDER;
label1 = new JLabel("");
label1.setHorizontalAlignment(SwingConstants.LEFT);
gridBag.setConstraints(label1, c);
proxyPanel.add(label1);
c.gridwidth = 1;
JLabel labelR = new JLabel(Resources.getString(LABEL_REQ));
labelR.setHorizontalAlignment(SwingConstants.LEFT);
gridBag.setConstraints(labelR, c);
proxyPanel.add(labelR);
c.gridwidth = GridBagConstraints.REMAINDER;
label2 = new JLabel("");
label2.setHorizontalAlignment(SwingConstants.LEFT);
gridBag.setConstraints(label2, c);
proxyPanel.add(label2);
c.gridwidth = 1;
JLabel labelUserID = new JLabel(Resources.getString(LABEL_USERID));
labelUserID.setHorizontalAlignment(SwingConstants.LEFT);
gridBag.setConstraints(labelUserID, c);
proxyPanel.add(labelUserID);
c.gridwidth = GridBagConstraints.REMAINDER;
JUserID = new JTextField(20);
gridBag.setConstraints(JUserID, c);
proxyPanel.add(JUserID);
c.gridwidth = 1;
JLabel labelPassword = new JLabel(Resources.getString(LABEL_PASSWORD));
labelPassword.setHorizontalAlignment(SwingConstants.LEFT);
gridBag.setConstraints(labelPassword, c);
proxyPanel.add(labelPassword);
c.gridwidth = GridBagConstraints.REMAINDER;
JPassword = new JPasswordField(20);
JPassword.setEchoChar('*');
JPassword.addActionListener(okListener);
gridBag.setConstraints(JPassword, c);
proxyPanel.add(JPassword);
return proxyPanel;
}
protected JComponent buildButtonPanel() {
JPanel buttonPanel = new JPanel();
cancelButton = new JButton(Resources.getString(LABEL_CANCEL));
cancelButton.addActionListener(cancelListener);
buttonPanel.add(cancelButton);
okButton = new JButton(Resources.getString(LABEL_OK));
okButton.addActionListener( okListener);
buttonPanel.add(okButton);
return buttonPanel;
}
/**
* This is called by the protocol stack when authentication is
* required. We then show the dialog in the Swing event thread,
* and block waiting for the user to select either cancel or ok,
* at which point we get notified.
*/
public PasswordAuthentication getPasswordAuthentication() {
synchronized (lock) {
EventQueue.invokeLater(new Runnable() {
public void run() {
label1.setText(getRequestingSite().getHostName());
label2.setText(getRequestingPrompt());
window.setVisible(true);
}
});
wasNotified = false;
while (!wasNotified) {
try {
lock.wait();
} catch(InterruptedException ie) { }
}
if (!result)
return null;
return new PasswordAuthentication(userID, password);
}
}
ActionListener okListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
synchronized (lock) {
window.setVisible(false);
userID = JUserID.getText();
password = JPassword.getPassword();
JPassword.setText("");
result = true;
wasNotified = true;
lock.notifyAll();
}
}
};
ActionListener cancelListener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
synchronized (lock) {
window.setVisible(false);
userID = null;
JUserID.setText("");
password = null;
JPassword.setText("");
result = false;
wasNotified = true;
lock.notifyAll();
}
}
};
}