/*
* UserDialog.java - Jun 16, 2003
*
* @author wolf
*/
package org.exist.client;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.net.URISyntaxException;
import java.net.URL;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.ListSelectionModel;
import javax.swing.border.EtchedBorder;
import javax.swing.table.AbstractTableModel;
import org.exist.security.User;
import org.exist.xmldb.UserManagementService;
import org.exist.xmldb.XmldbURI;
import org.xmldb.api.base.XMLDBException;
class UserDialog extends JFrame {
UserManagementService service;
JTextField username;
JPasswordField password1;
JPasswordField password2;
JTextField homedir;
JList groups;
JList allGroups;
DefaultListModel groupsModel;
DefaultListModel allGroupsModel;
JTable users;
UserTableModel userModel;
InteractiveClient client;
public UserDialog(UserManagementService service, String title, InteractiveClient client)
throws XMLDBException {
super(title);
this.service = service;
this.client = client;
setupComponents();
}
private void setupComponents() throws XMLDBException {
GridBagLayout grid = new GridBagLayout();
getContentPane().setLayout(grid);
GridBagConstraints c = new GridBagConstraints();
c.insets = new Insets(5, 5, 5, 5);
userModel = new UserTableModel(service);
users = new JTable(userModel);
users.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
users.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 1)
tableSelectAction(e);
}
});
JScrollPane scroll = new JScrollPane(users);
scroll.setPreferredSize(new Dimension(250, 150));
c.gridx = 0;
c.gridy = 0;
c.gridwidth = 2;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 0.5;
grid.setConstraints(scroll, c);
getContentPane().add(scroll);
JComponent toolbar = getToolbar();
c.gridx = 0;
c.gridy = 1;
c.gridwidth = 2;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 0;
grid.setConstraints(toolbar, c);
getContentPane().add(toolbar);
JLabel label = new JLabel("Username");
c.gridx = 0;
c.gridy = 2;
c.gridwidth = 1;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.NONE;
c.weightx = 0;
c.weighty = 0;
grid.setConstraints(label, c);
getContentPane().add(label);
username = new JTextField(15);
c.gridx = 1;
c.gridy = 2;
c.anchor = GridBagConstraints.EAST;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
c.weighty = 0;
grid.setConstraints(username, c);
getContentPane().add(username);
label = new JLabel("Password");
c.gridx = 0;
c.gridy = 3;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.NONE;
c.weightx = 0;
c.weighty = 0;
grid.setConstraints(label, c);
getContentPane().add(label);
password1 = new JPasswordField(15);
c.gridx = 1;
c.gridy = 3;
c.anchor = GridBagConstraints.EAST;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
c.weighty = 0;
grid.setConstraints(password1, c);
getContentPane().add(password1);
label = new JLabel("Password (repeat)");
c.gridx = 0;
c.gridy = 4;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.NONE;
c.weightx = 0;
c.weighty = 0;
grid.setConstraints(label, c);
getContentPane().add(label);
password2 = new JPasswordField(15);
c.gridx = 1;
c.gridy = 4;
c.anchor = GridBagConstraints.EAST;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
c.weighty = 0;
grid.setConstraints(password2, c);
getContentPane().add(password2);
label = new JLabel("Home-Collection");
c.gridx = 0;
c.gridy = 5;
c.anchor = GridBagConstraints.WEST;
c.fill = GridBagConstraints.NONE;
c.weightx = 0;
c.weighty = 0;
grid.setConstraints(label, c);
getContentPane().add(label);
homedir = new JTextField(20);
c.gridx = 1;
c.gridy = 5;
c.anchor = GridBagConstraints.EAST;
c.fill = GridBagConstraints.HORIZONTAL;
c.weightx = 1;
c.weighty = 0;
grid.setConstraints(homedir, c);
getContentPane().add(homedir);
JPanel groupsPanel = getGroupsPanel();
c.gridx = 0;
c.gridy = 6;
c.gridwidth = 2;
c.anchor = GridBagConstraints.CENTER;
c.fill = GridBagConstraints.BOTH;
c.weightx = 1;
c.weighty = 1;
grid.setConstraints(groupsPanel, c);
getContentPane().add(groupsPanel);
pack();
}
private JComponent getToolbar() {
Box box = Box.createHorizontalBox();
JButton button = new JButton("Create User");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionCreateUser();
}
});
box.add(button);
button = new JButton("Modify User");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionModify();
}
});
box.add(button);
button = new JButton("Remove");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionRemove();
}
});
box.add(button);
button = new JButton("Reset");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionClear();
}
});
box.add(button);
return box;
}
private JPanel getGroupsPanel() throws XMLDBException {
JPanel panel = new JPanel(false);
panel.setLayout(new BoxLayout(panel, BoxLayout.X_AXIS));
panel.setBorder(
BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(EtchedBorder.RAISED),
"Groups"));
groupsModel = new DefaultListModel();
groups = new JList(groupsModel);
JScrollPane scroll = new JScrollPane(groups);
scroll.setPreferredSize(new Dimension(150, 150));
scroll.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(EtchedBorder.RAISED),
"Assigned"));
panel.add(scroll);
Box box = Box.createVerticalBox();
URL url = getClass().getResource("icons/Back16.gif");
JButton button = new JButton(new ImageIcon(url));
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionAssignGroup();
}
});
button.setToolTipText("Assign group");
box.add(button);
url = getClass().getResource("icons/Forward16.gif");
button = new JButton(new ImageIcon(url));
button.setToolTipText("Remove group");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionRemoveGroup();
}
});
box.add(button);
url = getClass().getResource("icons/New16.gif");
button = new JButton(new ImageIcon(url));
button.setToolTipText("Create new group");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
actionNewGroup();
}
});
box.add(button);
panel.add(box);
allGroupsModel = new DefaultListModel();
updateGroups();
allGroups = new JList(allGroupsModel);
scroll = new JScrollPane(allGroups);
scroll.setPreferredSize(new Dimension(150, 150));
scroll.setBorder(BorderFactory.createTitledBorder(
BorderFactory.createEtchedBorder(EtchedBorder.RAISED),
"All"));
panel.add(scroll);
return panel;
}
private void updateGroups() throws XMLDBException {
String[] gl = service.getGroups();
for (int i = 0; i < gl.length; i++) {
allGroupsModel.addElement(gl[i]);
}
}
private void actionAssignGroup() {
Object[] selected = allGroups.getSelectedValues();
for (int i = 0; i < selected.length; i++) {
if (!groupsModel.contains(selected[i]))
groupsModel.addElement(selected[i]);
}
}
private void actionRemoveGroup() {
int[] selected = groups.getSelectedIndices();
for (int i = 0; i < selected.length; i++)
groupsModel.remove(selected[i]);
}
private void actionNewGroup() {
String newGroup =
JOptionPane.showInputDialog(
this,
"Please enter a name for the new group",
"New Group",
JOptionPane.QUESTION_MESSAGE);
groupsModel.addElement(newGroup);
allGroupsModel.addElement(newGroup);
}
private void actionCreateUser() {
String name = username.getText();
if (name.length() == 0)
return;
User user = new User(name);
String pass1 = new String(password1.getPassword());
String pass2 = new String(password2.getPassword());
if (!pass1.equals(pass2)) {
JOptionPane.showMessageDialog(this, "Different passwords. Please check.");
return;
}
user.setPassword(pass1);
try {
user.setHome(XmldbURI.xmldbUriFor(homedir.getText()));
} catch (URISyntaxException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
return;
}
if(groupsModel.size() == 0) {
JOptionPane.showMessageDialog(this, "Please assign a group to the new user");
return;
}
for (int i = 0; i < groupsModel.size(); i++)
user.addGroup((String) groupsModel.elementAt(i));
try {
service.addUser(user);
client.reloadCollection();
userModel.reload();
} catch (XMLDBException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
}
}
private void actionModify() {
String name = username.getText();
if (name.length() == 0)
return;
User user = new User(name);
String pass1 = new String(password1.getPassword());
String pass2 = new String(password2.getPassword());
if(pass1.length() == 0 &&
JOptionPane.showConfirmDialog(this, "No password set. Are you sure?",
"Password missing", JOptionPane.YES_NO_OPTION)
== JOptionPane.NO_OPTION)
return;
if (!pass1.equals(pass2)) {
JOptionPane.showMessageDialog(this, "Different passwords. Please check.");
return;
}
user.setPassword(pass1);
try {
user.setHome(XmldbURI.xmldbUriFor(homedir.getText()));
} catch (URISyntaxException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
return;
}
for (int i = 0; i < groupsModel.size(); i++)
user.addGroup((String) groupsModel.elementAt(i));
try {
service.updateUser(user);
String myUser = client.properties.getProperty("user", "admin");
if(name.equals(myUser)) {
client.properties.setProperty("password", pass1);
client.reloadCollection();
}
userModel.reload();
} catch (XMLDBException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
}
}
private void actionRemove() {
int[] selected = users.getSelectedRows();
if(selected.length == 0)
return;
if(JOptionPane.showConfirmDialog(this, "Are you sure you want to remove the selected users?",
"Remove users", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION)
return;
for(int i = 0; i < selected.length; i++) {
User user = userModel.users[selected[i]];
try {
service.removeUser(user);
client.reloadCollection();
userModel.reload();
} catch (XMLDBException e) {
JOptionPane.showMessageDialog(this, e.getMessage());
}
}
}
private void actionClear() {
groupsModel.clear();
username.setText("");
password1.setText("");
password2.setText("");
homedir.setText("");
}
private void tableSelectAction(MouseEvent ev) {
int row = users.rowAtPoint(ev.getPoint());
User user = userModel.users[row];
username.setText(user.getName());
groupsModel.clear();
password1.setText("");
password2.setText("");
if(user.getHome()!=null) {
homedir.setText(user.getHome().toString());
} else {
homedir.setText("");
}
String[] groups = user.getGroups();
for (int i = 0; i < groups.length; i++) {
groupsModel.addElement(groups[i]);
}
}
class UserTableModel extends AbstractTableModel {
private final String[] columnNames = new String[] { "UID", "User", "Groups", "Home" };
private User users[] = null;
public UserTableModel(UserManagementService service) throws XMLDBException {
super();
reload();
}
public void reload() throws XMLDBException {
users = service.getUsers();
fireTableDataChanged();
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnCount()
*/
public int getColumnCount() {
return columnNames.length;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getColumnName(int)
*/
public String getColumnName(int column) {
return columnNames[column];
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getRowCount()
*/
public int getRowCount() {
return users == null ? 0 : users.length;
}
/* (non-Javadoc)
* @see javax.swing.table.TableModel#getValueAt(int, int)
*/
public Object getValueAt(int rowIndex, int columnIndex) {
switch (columnIndex) {
case 0 :
return new Integer(users[rowIndex].getUID());
case 1 :
return users[rowIndex].getName();
case 2 :
StringBuilder buf = new StringBuilder();
String[] groups = users[rowIndex].getGroups();
for (int i = 0; i < groups.length; i++) {
buf.append(groups[i]);
if (i + 1 < groups.length)
buf.append(';');
}
return buf.toString();
case 3 :
return users[rowIndex].getHome();
default :
return null;
}
}
}
}