From e695e173f746bdeceb52b1f7bab43eefa76fae35 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Tue, 2 Sep 2014 09:49:03 +0200
Subject: [PATCH] OO-1172: remove deleted users from courses and groups

---
 .../delete/service/UserDeletionManager.java   | 14 ++++++-
 .../olat/basesecurity/manager/GroupDAO.java   | 10 ++++-
 .../model/GroupMembershipImpl.java            |  4 +-
 .../ui/main/EditMembershipController.java     |  2 +-
 .../org/olat/user/_spring/userContext.xml     |  1 +
 .../basesecurity/manager/GroupDAOTest.java    | 38 ++++++++++++++++++-
 6 files changed, 63 insertions(+), 6 deletions(-)

diff --git a/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java b/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java
index 1515fcc60e9..a32947d8855 100644
--- a/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java
+++ b/src/main/java/org/olat/admin/user/delete/service/UserDeletionManager.java
@@ -40,6 +40,7 @@ import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.IdentityImpl;
 import org.olat.basesecurity.SecurityGroup;
+import org.olat.basesecurity.manager.GroupDAO;
 import org.olat.commons.calendar.CalendarManagerFactory;
 import org.olat.commons.lifecycle.LifeCycleManager;
 import org.olat.core.CoreSpringFactory;
@@ -97,6 +98,7 @@ public class UserDeletionManager extends BasicManager {
 	private DeletionModule deletionModule;
 	private BaseSecurity securityManager;
 	private MailManager mailManager;
+	private GroupDAO groupDao;
 
 	/**
 	 * [used by spring]
@@ -122,6 +124,14 @@ public class UserDeletionManager extends BasicManager {
 	public void setMailManager(MailManager mailManager) {
 		this.mailManager = mailManager;
 	}
+	
+	/**
+	 * [used by Spring]
+	 * @param groupDao
+	 */
+	public void setGroupDao(GroupDAO groupDao) {
+		this.groupDao = groupDao;
+	}
 
 
 	/**
@@ -304,7 +314,9 @@ public class UserDeletionManager extends BasicManager {
 			securityManager.removeIdentityFromSecurityGroup(identity, secGroup);
 			logInfo("Removing user=" + identity + " from security group="  + secGroup.toString());
 		}
-		
+		//remove identity from groups
+		groupDao.removeMemberships(identity);
+
 		// fxdiff: FXOLAT-44 delete emails still in change-workflow
 		RegistrationManager rm = RegistrationManager.getInstance();
 		String key = identity.getUser().getProperty("emchangeKey", null);
diff --git a/src/main/java/org/olat/basesecurity/manager/GroupDAO.java b/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
index ee0ac3729c3..3f3e949c6f5 100644
--- a/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
+++ b/src/main/java/org/olat/basesecurity/manager/GroupDAO.java
@@ -46,7 +46,7 @@ import org.springframework.stereotype.Service;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-@Service
+@Service("groupDao")
 public class GroupDAO {
 	
 	@Autowired
@@ -134,6 +134,14 @@ public class GroupDAO {
 		return memberships.size();
 	}
 	
+	public int removeMemberships(IdentityRef identity) {
+		String deleteQuery = "delete from bgroupmember as membership where membership.identity.key=:identityKey";
+		
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(deleteQuery).setParameter("identityKey", identity.getKey())
+				.executeUpdate();
+	}
+	
 	public int countMembers(Group group) {
 		Number count = dbInstance.getCurrentEntityManager()
 			.createNamedQuery("countMembersByGroup", Number.class)
diff --git a/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java b/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
index 3a01c5665f0..f2ca3858aab 100644
--- a/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
+++ b/src/main/java/org/olat/basesecurity/model/GroupMembershipImpl.java
@@ -150,8 +150,8 @@ public class GroupMembershipImpl implements GroupMembership, ModifiedInfo, Persi
 		if (this == obj) {
 			return true;
 		}
-		if (obj instanceof GroupImpl) {
-			GroupImpl other = (GroupImpl) obj;
+		if (obj instanceof GroupMembershipImpl) {
+			GroupMembershipImpl other = (GroupMembershipImpl)obj;
 			return getKey().equals(other.getKey());
 		}
 		return false;
diff --git a/src/main/java/org/olat/group/ui/main/EditMembershipController.java b/src/main/java/org/olat/group/ui/main/EditMembershipController.java
index 02f110429d6..1fba9b5f90d 100644
--- a/src/main/java/org/olat/group/ui/main/EditMembershipController.java
+++ b/src/main/java/org/olat/group/ui/main/EditMembershipController.java
@@ -202,7 +202,7 @@ public class EditMembershipController extends FormBasicController {
 	
 	private MultipleSelectionElement createSelection(boolean selected, boolean enabled) {
 		String name = "cb" + UUID.randomUUID().toString().replace("-", "");
-		MultipleSelectionElement selection = new MultipleSelectionElementImpl(name, Layout.vertical);
+		MultipleSelectionElement selection = new MultipleSelectionElementImpl(name, Layout.horizontal);
 		selection.setKeysAndValues(keys, values);
 		flc.add(name, selection);
 		selection.select(keys[0], selected);
diff --git a/src/main/java/org/olat/user/_spring/userContext.xml b/src/main/java/org/olat/user/_spring/userContext.xml
index 080e1138187..7ea69b5502a 100644
--- a/src/main/java/org/olat/user/_spring/userContext.xml
+++ b/src/main/java/org/olat/user/_spring/userContext.xml
@@ -289,6 +289,7 @@
 		<constructor-arg index="0" ref="deletionModule" />
 		<property name="baseSecurityManager" ref="baseSecurityManager" />
 		<property name="mailManager" ref="mailManager"/>
+		<property name="groupDao" ref="groupDao"/>
 		<property name="keepUserLoginAfterDeletion" value="${keepUserLoginAfterDeletion}" />
 		<property name="keepUserEmailAfterDeletion" value="${keepUserEmailAfterDeletion}" />
 	</bean>
diff --git a/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java b/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
index e53470acc27..354b705ebdf 100644
--- a/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
+++ b/src/test/java/org/olat/basesecurity/manager/GroupDAOTest.java
@@ -223,7 +223,7 @@ public class GroupDAOTest extends OlatTestCase {
 	}
 	
 	@Test
-	public void removeMemberships() {
+	public void removeMemberships_group() {
 		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-7-");
 		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-8-");
 		Group group = groupDao.createGroup();
@@ -246,6 +246,42 @@ public class GroupDAOTest extends OlatTestCase {
 		Assert.assertTrue(deletedMemberships.isEmpty());
 	}
 	
+	@Test
+	public void removeMemberships_identity() {
+		//
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-9-");
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsRndUser("bgrp-10-");
+		Group group1 = groupDao.createGroup();
+		GroupMembership membership1 = groupDao.addMembership(group1, id1, "pilot");
+		GroupMembership membership2 = groupDao.addMembership(group1, id2, "pilot");
+		Assert.assertNotNull(membership1);
+		Assert.assertNotNull(membership2);
+		dbInstance.commitAndCloseSession();
+		Group group2 = groupDao.createGroup();
+		GroupMembership membership3 = groupDao.addMembership(group2, id1, "passanger");
+		GroupMembership membership4 = groupDao.addMembership(group2, id2, "passanger");
+		Assert.assertNotNull(membership3);
+		Assert.assertNotNull(membership4);
+		dbInstance.commitAndCloseSession();
+
+		//check
+		List<GroupMembership> memberships = groupDao.getMemberships(group1, "pilot");
+		Assert.assertEquals(2, memberships.size());
+		
+		//remove
+		groupDao.removeMemberships(id1);
+		dbInstance.commitAndCloseSession();
+		
+		//check 
+		List<GroupMembership> deletedMemberships1 = groupDao.getMemberships(group1, "pilot");
+		Assert.assertEquals(1, deletedMemberships1.size());
+		Assert.assertEquals(membership2, deletedMemberships1.get(0));
+		
+		List<GroupMembership> deletedMemberships2 = groupDao.getMemberships(group2, "passanger");
+		Assert.assertEquals(1, deletedMemberships2.size());
+		Assert.assertEquals(membership4, deletedMemberships2.get(0));
+	}
+	
 	@Test
 	public void addGrant() {
 		Group group = groupDao.createGroup();
-- 
GitLab