package op.users;
import entity.system.Groups;
import entity.system.Users;
import op.OPDE;
import op.threads.DisplayManager;
import op.tools.SYSConst;
import javax.persistence.EntityManager;
import javax.persistence.LockModeType;
import javax.persistence.OptimisticLockException;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ItemEvent;
import java.util.ArrayList;
import java.util.HashMap;
/**
* Created by IntelliJ IDEA.
* User: tloehr
* Date: 01.09.12
* Time: 14:37
* To change this template use File | Settings | File Templates.
*/
public class PnlEditMemberships extends JPanel {
private Users user;
private ArrayList<Groups> listGroups; // is only needed once during setup of the panel
private HashMap<String, Groups> groupMap; // will be used during the use of the panel
public PnlEditMemberships(Users user, ArrayList<Groups> listGroups) {
super();
this.user = user;
this.listGroups = listGroups;
setLayout(new GridLayout(0, 3));
initPanel();
}
private void initPanel() {
groupMap = new HashMap<String, Groups>();
for (final Groups group : listGroups) {
final String gid = group.getGID();
groupMap.put(group.getGID(), group);
JCheckBox cbGroup = new JCheckBox(group.getGID());
cbGroup.setToolTipText(group.getDescription());
cbGroup.setFont(SYSConst.ARIAL14);
cbGroup.setSelected(user.getGroups().contains(groupMap.get(gid)));
cbGroup.addItemListener(itemEvent -> {
EntityManager em = OPDE.createEM();
try {
em.getTransaction().begin();
Users myUser = em.merge(user);
em.lock(myUser, LockModeType.OPTIMISTIC);
Groups myGroup = em.merge(groupMap.get(gid));
em.lock(myGroup, LockModeType.OPTIMISTIC);
if (itemEvent.getStateChange() == ItemEvent.SELECTED) {
myUser.getGroups().add(myGroup);
myGroup.getMembers().add(myUser);
} else {
myUser.getGroups().remove(myGroup);
myGroup.getMembers().remove(myUser);
}
em.getTransaction().commit();
// so we won't get locking exceptions because of outdated version informations
user = myUser;
groupMap.put(gid, myGroup);
} catch (OptimisticLockException ole) { OPDE.warn(ole);
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.getDisplayManager().addSubMessage(DisplayManager.getLockMessage());
} catch (Exception e) {
if (em.getTransaction().isActive()) {
em.getTransaction().rollback();
}
OPDE.fatal(e);
} finally {
em.close();
}
});
add(cbGroup);
cbGroup.setEnabled(!group.isEveryone());
}
}
}