package com.idega.user.presentation; import java.rmi.RemoteException; import java.util.Collection; import java.util.Iterator; import javax.ejb.EJBException; import javax.ejb.RemoveException; import com.idega.core.accesscontrol.business.AccessControl; import com.idega.core.accesscontrol.business.AccessController; import com.idega.core.accesscontrol.data.ICPermission; import com.idega.core.builder.data.ICDomain; import com.idega.data.IDOLookup; import com.idega.event.IWActionListener; import com.idega.event.IWPresentationEvent; import com.idega.event.IWPresentationStateImpl; import com.idega.idegaweb.IWApplicationContext; import com.idega.idegaweb.IWException; import com.idega.presentation.IWContext; import com.idega.user.business.GroupBusiness; import com.idega.user.data.Group; import com.idega.user.data.GroupDomainRelation; import com.idega.user.data.GroupDomainRelationHome; import com.idega.user.data.User; import com.idega.user.event.DeleteGroupEvent; /** *@author <a href="mailto:thomas@idega.is">Thomas Hilbig</a> *@version 1.0 */ public class DeleteGroupConfirmWindowPS extends IWPresentationStateImpl implements IWActionListener { /** * @see com.idega.event.IWActionListener#actionPerformed(com.idega.event.IWPresentationEvent) */ public void actionPerformed(IWPresentationEvent e) throws IWException { if (e instanceof DeleteGroupEvent) { DeleteGroupEvent event = (DeleteGroupEvent) e; if (event.isDeletingConfirmed()) { Group group = event.getGroup(); Group parentGroup = event.getParentGroup(); ICDomain parentDomain = event.getParentDomain(); IWApplicationContext iwac = e.getIWContext().getApplicationContext(); GroupBusiness groupBusiness = getGroupBusiness(iwac); try { if (groupBusiness.isGroupRemovable(group,parentGroup)) { if (parentGroup != null){ parentGroup.removeGroup(group, e.getIWContext().getCurrentUser()); } else if (parentDomain != null) { removeRelation( parentDomain, group, e.getIWContext().getCurrentUser()); } //disable permissions for group if it has no other parents. removePermissions(group,e.getIWContext()); //TODO fix this e.getIWContext().getApplicationContext().removeApplicationAttribute("domain_group_tree"); e.getIWContext().getApplicationContext().removeApplicationAttribute("group_tree"); this.fireStateChanged(); } } catch (RemoteException e1) { e1.printStackTrace(); } catch (EJBException e1) { e1.printStackTrace(); } catch (RemoveException error) { // TODO make error text visible // error will come from plugins error.printStackTrace(); } } } } /** * This method removes the groups permissions if it no longer has any valid parent relations * @param group * @param context */ private void removePermissions(Group group, IWContext iwc) { Collection parents = null; try { parents = getGroupBusiness(iwc).getParentGroups(group); } catch (RemoteException e) { e.printStackTrace(); } //if it has no parents it will disapeer from view and therefor we can disable its permissions. if( parents==null || parents.isEmpty()){ Collection permissions = getAllPermissionForGroup(group); Iterator entries = permissions.iterator(); while (entries.hasNext()) { ICPermission permission = (ICPermission) entries.next(); permission.removeBy(iwc.getCurrentUser()); } //TODO fix this better: refresh permissions PermissionCacher.updatePermissions() iwc.getApplicationContext().removeApplicationAttribute("ic_permission_map_"+AccessController.CATEGORY_GROUP_ID); } } private Collection getAllPermissionForGroup(Group group) { Collection allPermissions = null; Collection permissionSetOnGroup = null; try { allPermissions = AccessControl.getAllGroupPermissionsForGroup(group); permissionSetOnGroup = AccessControl.getAllGroupPermissionsReverseForGroup(group); allPermissions.addAll(permissionSetOnGroup); } catch (Exception e) { e.printStackTrace(); System.err.println("GroupPermission selected group ("+group.getPrimaryKey()+") not found or remote error!"); } return allPermissions; } private void removeRelation(ICDomain domain, Group group, User currentUser) { try { GroupDomainRelationHome home = (GroupDomainRelationHome) IDOLookup.getHome(GroupDomainRelation.class); Collection coll = home.findDomainsRelationshipsContaining(domain, group); Iterator iterator = coll.iterator(); while (iterator.hasNext()) { GroupDomainRelation relation = (GroupDomainRelation) iterator.next(); relation.removeBy(currentUser); } } catch (Exception ex) { } } private GroupBusiness getGroupBusiness(IWApplicationContext iwac) { try { return (GroupBusiness) com.idega.business.IBOLookup.getServiceInstance(iwac, GroupBusiness.class); } catch (java.rmi.RemoteException rme) { throw new RuntimeException(rme.getMessage()); } } }