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: 13:55 * To change this template use File | Settings | File Templates. */ public class PnlEditMembers extends JPanel { private Groups group; private ArrayList<Users> listUsers; // is only needed once during setup of the panel private HashMap<String, Users> userMap; // will be used during the use of the panel public PnlEditMembers(Groups group, ArrayList<Users> listUsers) { super(); this.group = group; this.listUsers = listUsers; setLayout(new GridLayout(0, 3)); initPanel(); } private void initPanel() { userMap = new HashMap<String, Users>(); // int num = 0; for (final Users user : listUsers) { // num++; if (user.isActive()) { final String uid = user.getUID(); userMap.put(uid, user); JCheckBox cbMembership = new JCheckBox(user.toString()); cbMembership.setFont(SYSConst.ARIAL14); cbMembership.setSelected(group.getMembers().contains(userMap.get(uid))); cbMembership.addItemListener(itemEvent -> { EntityManager em = OPDE.createEM(); try { em.getTransaction().begin(); Users myUser = em.merge(userMap.get(uid)); em.lock(myUser, LockModeType.OPTIMISTIC); Groups myGroup = em.merge(group); 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 group = myGroup; userMap.put(uid, myUser); } 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(cbMembership); } } } }