/**
* Copyright (c) 2009 Juwi MacMillan Group GmbH
*
* Licensed 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 de.juwimm.cms.gui.admin;
import static de.juwimm.cms.client.beans.Application.getBean;
import static de.juwimm.cms.common.Constants.rb;
import java.awt.Cursor;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.SwingUtilities;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import org.apache.commons.lang.ArrayUtils;
import org.apache.log4j.Logger;
import de.juwimm.cms.authorization.vo.GroupValue;
import de.juwimm.cms.authorization.vo.UserValue;
import de.juwimm.cms.client.beans.Beans;
import de.juwimm.cms.common.Constants;
import de.juwimm.cms.common.UserRights;
import de.juwimm.cms.gui.controls.ReloadablePanel;
import de.juwimm.cms.gui.event.ExitEvent;
import de.juwimm.cms.gui.event.ExitListener;
import de.juwimm.cms.gui.table.TableSorter;
import de.juwimm.cms.gui.table.UserTableModel;
import de.juwimm.cms.util.ActionHub;
import de.juwimm.cms.util.Communication;
import de.juwimm.cms.vo.UnitValue;
import de.juwimm.swing.DropDownHolder;
import de.juwimm.swing.NoResizeScrollPane;
import de.juwimm.swing.PickListData;
import de.juwimm.swing.PickListPanel;
/**
* <p>
* Title: juwimm cms
* </p>
* <p>
* Description: content management system
* </p>
* <p>
* Copyright: Copyright (c) 2002
* </p>
* <p>
* Company: juwi macmillan group gmbh
* </p>
*
* @author Dirk Bogun
* @version $Id: PanUnitGroupPerUser.java 6 2009-07-30 14:05:05Z
* skulawik@gmail.com $
*/
public class PanUnitGroupPerUser extends JPanel implements ExitListener,
ActionListener, ReloadablePanel {
private static Logger log = Logger.getLogger(PanUnitGroupPerUser.class);
private UserTableModel userTableModel = new UserTableModel(false);
private Communication comm = ((Communication) getBean(Beans.COMMUNICATION));
private int currentSelected = -1;
private DropDownHolder[] allUnits;
private DropDownHolder[] allGroupsOfCaller;
private JTable tblUser;
private JButton btnSave = new JButton();
private JLabel lblUser = new JLabel();
private PickListData unitPickData = null;
private PickListData groupPickData = null;
private PickListPanel panUnitPick = null;
private PickListPanel panGroupPick = null;
public PanUnitGroupPerUser() {
ActionHub.addExitListener(this);
try {
setDoubleBuffered(true);
jbInit();
tblUser.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
tblUser.getSelectionModel().addListSelectionListener(
new UserListSelectionListener(this));
} catch (Exception exe) {
log.error("Initialization Error: ", exe);
}
}
private UserValue getSelectedUser(int row) {
if (row >= 0) {
return (UserValue) tblUser.getModel().getValueAt(row, 5);
}
return null;
}
void jbInit() throws Exception {
this.setLayout(new GridBagLayout());
this.unitPickData = new PickListData();
this.unitPickData.setLeftLabel(rb
.getString("panel.admin.tab.units.assigned"));
this.unitPickData.setRightLabel(rb
.getString("panel.admin.tab.units.all"));
this.groupPickData = new PickListData();
this.groupPickData.setLeftLabel(rb
.getString("panel.admin.tab.groups.assigned"));
this.groupPickData.setRightLabel(rb
.getString("panel.admin.tab.groups.all"));
this.panUnitPick = new PickListPanel(this.unitPickData);
this.panGroupPick = new PickListPanel(this.groupPickData);
this.btnSave.setText(rb.getString("dialog.save"));
this.lblUser.setText(rb.getString("panel.login.username"));
this.btnSave.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
save();
}
});
this.tblUser = new JTable();
JScrollPane scrollUser = new NoResizeScrollPane(tblUser);
this.add(lblUser, new GridBagConstraints(0, 0, 1, 1, 0.0, 0.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.HORIZONTAL,
new Insets(10, 10, 5, 0), 0, 0));
this.add(scrollUser, new GridBagConstraints(0, 1, 1, 2, 1.0, 1.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 10, 0, 0), 0, 0));
this.add(btnSave, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0,
GridBagConstraints.SOUTHWEST, GridBagConstraints.NONE,
new Insets(10, 10, 10, 0), 0, 0));
this.add(this.panUnitPick, new GridBagConstraints(1, 0, 1, 2, 2.0, 1.0,
GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 10, 0, 10), 0, 0));
this.add(this.panGroupPick, new GridBagConstraints(1, 2, 1, 1, 2.0,
1.0, GridBagConstraints.NORTHWEST, GridBagConstraints.BOTH,
new Insets(0, 10, 0, 10), 0, 0));
}
/**
* Return all Groups the Caller is in that are not in the Array given
*
* @param gvDiff
* the Array to check
* @return Array of all of my Groups that are not in the Array given
*/
private DropDownHolder[] getDiffGroups(GroupValue[] gvDiff) {
if (allGroupsOfCaller == null)
return new DropDownHolder[0];
ArrayList<DropDownHolder> diffGroupList = new ArrayList<DropDownHolder>();
for (int i = 0; i < allGroupsOfCaller.length; i++) {
if (!contains(gvDiff, allGroupsOfCaller[i])) {
diffGroupList.add(allGroupsOfCaller[i]);
}
}
return diffGroupList.toArray(new DropDownHolder[0]);
}
private boolean contains(GroupValue[] gv, DropDownHolder groupDao) {
for (int i = 0; i < gv.length; i++) {
if (gv[i].getGroupId().equals(
((GroupValue) groupDao.getObject()).getGroupId())) {
return true;
}
}
return false;
}
public void unload() {
if (unitPickData.isModified() || groupPickData.isModified()) {
int i = JOptionPane.showConfirmDialog(this, rb
.getString("dialog.wantToSave"), "CMS",
JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE);
if (i == JOptionPane.YES_OPTION) {
saveChanges(currentSelected);
}
unitPickData.setModified(false);
groupPickData.setModified(false);
}
}
private void setPickerEnabled(boolean enabled) {
this.panGroupPick.setEnabled(enabled);
this.panUnitPick.setEnabled(enabled);
}
public void reload() {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
setCursor(new Cursor(Cursor.WAIT_CURSOR));
try {
setPickerEnabled(false);
tblUser.setEnabled(false);
userTableModel = new UserTableModel(false);
TableSorter tblSorter = new TableSorter(userTableModel,
tblUser.getTableHeader());
GroupValue[] groups = null;
if (!comm.isUserInRole(UserRights.SITE_ROOT)) {
groups = comm.getGroups();
} else {
groups = comm.getAllGroups();
}
if (groups != null) {
allGroupsOfCaller = new DropDownHolder[groups.length];
for (int i = groups.length - 1; i >= 0; i--) {
allGroupsOfCaller[i] = new DropDownHolder(
groups[i], groups[i].getGroupName());
}
}
UnitValue[] units = comm.getUnits();
if (units != null) {
allUnits = new DropDownHolder[units.length];
for (int i = units.length - 1; i >= 0; i--) {
allUnits[i] = new DropDownHolder(units[i], units[i]
.getName());
}
}
UserValue[] uv = comm.getAllUser();
if (uv != null) {
if (comm.isUserInRole(UserRights.SITE_ROOT)) {
userTableModel.addRows(uv);
} else {
UserValue me = comm.getUser();
for (int i = 0; i < uv.length; i++) {
boolean isSiteRoot = comm.isUserInRole(uv[i],
UserRights.SITE_ROOT);
boolean isMe = uv[i].getUserName()
.equalsIgnoreCase(me.getUserName());
if (!isSiteRoot) {
userTableModel.addRow(uv[i]);
}
}
}
}
tblUser.setModel(tblSorter);
unitPickData.getLstLeftModel().clear();
unitPickData.getLstRightModel().clear();
groupPickData.getLstLeftModel().clear();
groupPickData.getLstRightModel().clear();
} catch (Exception exe) {
log.error("Error reloading tables: ", exe);
}
tblUser.setEnabled(true);
setCursor(Cursor.getDefaultCursor());
}
});
}
public void save() {
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
setPickerEnabled(false);
btnSave.setEnabled(false);
if (currentSelected >= 0)
saveChanges(currentSelected);
setPickerEnabled(true);
btnSave.setEnabled(true);
setCursor(Cursor.getDefaultCursor());
}
private synchronized void saveChanges(int row) {
if (this.unitPickData.isModified() || this.groupPickData.isModified()) {
try {
tblUser.setEnabled(false);
UserValue user = getSelectedUser(row);
GroupValue[] groups = comm.getGroups4User(user.getUserName());
DropDownHolder[] groupList = null;
if (groups != null) {
groupList = new DropDownHolder[groups.length];
for (int i = groups.length - 1; i >= 0; i--) {
groupList[i] = new DropDownHolder(groups[i], groups[i]
.getGroupName());
}
}
UnitValue[] units = comm.getUnits4User(user.getUserName());
DropDownHolder[] unitList = null;
if (units != null) {
unitList = new DropDownHolder[units.length];
for (int i = units.length - 1; i >= 0; i--) {
unitList[i] = new DropDownHolder(units[i], units[i]
.getName());
}
}
for (int i = 0; i < groupList.length; i++) {
if (!this.groupPickData.getLstLeftModel().contains(
groupList[i])) {
try {
comm.removeUserFromGroup(((GroupValue) groupList[i]
.getObject()), user.getUserName());
} catch (Exception exe) {
log.error("Error removing user from group: ", exe);
}
}
}
for (int i = 0; i < this.groupPickData.getLstLeftModel()
.getSize(); i++) {
GroupValue group = (GroupValue) ((DropDownHolder) this.groupPickData
.getLstLeftModel().getElementAt(i)).getObject();
if (!ArrayUtils.contains(groups, group)) {
try {
comm.addUserToGroup(group, user.getUserName());
} catch (Exception exe) {
log.error("Error adding user to group: ", exe);
}
}
}
if (!comm.isUserInRole(user, UserRights.SITE_ROOT)) {
for (int i = 0; i < unitList.length; i++) {
if (!this.unitPickData.getLstLeftModel().contains(
unitList[i])) {
try {
comm.removeUserFromUnit(
((UnitValue) unitList[i].getObject()),
user.getUserName());
} catch (Exception exe) {
log.error("Error removing unser from unit: ",
exe);
}
}
}
for (int i = 0; i < this.unitPickData.getLstLeftModel()
.getSize(); i++) {
UnitValue unit = (UnitValue) ((DropDownHolder) this.unitPickData
.getLstLeftModel().getElementAt(i)).getObject();
if (!ArrayUtils.contains(units, unit)) {
try {
comm.addUser2Unit(user, unit);
} catch (Exception exe) {
log.error("Error adding user to unit: ", exe);
}
}
}
}
} catch (Exception exe) {
log.error(exe);
}
}
this.unitPickData.setModified(false);
this.groupPickData.setModified(false);
tblUser.setEnabled(true);
}
/**
*
*/
private class UserListSelectionListener implements ListSelectionListener {
private PanUnitGroupPerUser caller;
public UserListSelectionListener(PanUnitGroupPerUser aCaller) {
caller = aCaller;
}
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting()) {
return;
}
boolean isSiteRoot = false;
if (tblUser.getSelectedRow() >= 0) {
if (unitPickData.isModified() || groupPickData.isModified()) {
int i = JOptionPane.showConfirmDialog(caller, rb
.getString("dialog.wantToSave"), rb
.getString("dialog.title"),
JOptionPane.YES_NO_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (i == JOptionPane.YES_OPTION) {
setCursor(new Cursor(Cursor.WAIT_CURSOR));
saveChanges(currentSelected);
} else {
unitPickData.setModified(false);
groupPickData.setModified(false);
}
}
setCursor(new Cursor(Cursor.WAIT_CURSOR));
setPickerEnabled(false);
currentSelected = tblUser.getSelectedRow();
UserValue user = getSelectedUser(currentSelected);
try {
if (comm.isUserInRole(user, UserRights.SITE_ROOT)) {
unitPickData.getLstLeftModel().removeAllElements();
unitPickData.getLstLeftModel().addAll(allUnits);
unitPickData.getLstRightModel().removeAllElements();
isSiteRoot = true;
} else {
UnitValue[] vec = comm
.getUnits4User(user.getUserName());
unitPickData.getLstRightModel().removeAllElements();
unitPickData.getLstLeftModel().removeAllElements();
for (int i = 0; i < vec.length; i++) {
DropDownHolder ddh = new DropDownHolder(vec[i],
vec[i].getName());
unitPickData.getLstLeftModel().addElement(ddh);
}
for (int i = 0; i < allUnits.length; i++) {
if (!unitPickData.getLstLeftModel().contains(
allUnits[i])) {
unitPickData.getLstRightModel().addElement(
allUnits[i]);
}
}
}
GroupValue[] grpHave = comm.getGroups4User(user
.getUserName());
groupPickData.getLstRightModel().clear();
groupPickData.getLstLeftModel().clear();
groupPickData.getLstRightModel().addAll(
getDiffGroups(grpHave));
if (grpHave != null) {
DropDownHolder[] groups = new DropDownHolder[grpHave.length];
for (int i = grpHave.length - 1; i >= 0; i--) {
groups[i] = new DropDownHolder(grpHave[i],
grpHave[i].getGroupName());
}
groupPickData.getLstLeftModel().addAll(groups);
}
} catch (Exception exe) {
log.error(exe);
}
}
panUnitPick.setEnabled(!isSiteRoot);
panGroupPick.setEnabled(true);
setCursor(Cursor.getDefaultCursor());
}
}
public boolean exitPerformed(ExitEvent e) {
try {
if (unitPickData.isModified() || groupPickData.isModified()) {
int i = JOptionPane.showConfirmDialog(this, rb
.getString("dialog.wantToSave"), rb
.getString("dialog.title"),
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (i == JOptionPane.YES_OPTION) {
saveChanges(currentSelected);
} else if (i == JOptionPane.CANCEL_OPTION) {
return false;
}
}
} catch (Exception ex) {
}
return true;
}
public void actionPerformed(ActionEvent ae) {
if (ae.getActionCommand().equals(Constants.ACTION_CHANGE_USERACCOUNTS)) {
Thread t = new Thread(new Runnable() {
public void run() {
reload();
}
});
t.setPriority(Thread.NORM_PRIORITY);
t.start();
}
}
}