From 8fcd3d00d234e23f75a4ee69802ad43a4f7a47fc Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Mon, 19 Dec 2016 20:02:49 +0100
Subject: [PATCH] OO-2423: load identities by user names the case insensitive
 way

---
 .../admin/user/imp/UserImportController.java  |  2 +-
 .../org/olat/basesecurity/BaseSecurity.java   |  2 ++
 .../basesecurity/BaseSecurityManager.java     | 21 ++++++++++++++++
 ...ortMemberOverviewIdentitiesController.java |  2 +-
 .../MembersOverviewIdentitiesController.java  |  2 +-
 .../basesecurity/BaseSecurityManagerTest.java | 25 +++++++++++++++++++
 6 files changed, 51 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/olat/admin/user/imp/UserImportController.java b/src/main/java/org/olat/admin/user/imp/UserImportController.java
index e293f003f6c..61f0598e7d3 100644
--- a/src/main/java/org/olat/admin/user/imp/UserImportController.java
+++ b/src/main/java/org/olat/admin/user/imp/UserImportController.java
@@ -341,7 +341,7 @@ public class UserImportController extends BasicController {
 			}
 		}
 
-		List<Identity> nextIds = securityManager.findIdentitiesByName(usernames);
+		List<Identity> nextIds = securityManager.findIdentitiesByNameCaseInsensitive(usernames);
 		identities.addAll(nextIds);
 		return identities;
 	}
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurity.java b/src/main/java/org/olat/basesecurity/BaseSecurity.java
index 24ffbd3647b..880ba14c163 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurity.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurity.java
@@ -160,6 +160,8 @@ public interface BaseSecurity {
 	public Identity findIdentityByNameCaseInsensitive(String identityName);
 	
 	public List<Identity> findIdentitiesByName(Collection<String> identityName);
+	
+	public List<Identity> findIdentitiesByNameCaseInsensitive(Collection<String> identityNames);
 
 	/**
 	 * Find an identity by student/institutionalnumber (i.e., Matrikelnummer), using the getIdentititesByPowerSearch() method.
diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
index bdca01a9d1b..354f1ed1bb3 100644
--- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
+++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java
@@ -33,6 +33,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
+import java.util.stream.Collectors;
 
 import javax.persistence.EntityNotFoundException;
 import javax.persistence.LockModeType;
@@ -1020,6 +1021,26 @@ public class BaseSecurityManager implements BaseSecurity {
 				.getResultList();
 		return identities;
 	}
+	
+	
+
+	@Override
+	public List<Identity> findIdentitiesByNameCaseInsensitive(Collection<String> identityNames) {
+		if (identityNames == null || identityNames.isEmpty()) return Collections.emptyList();
+
+		StringBuilder sb = new StringBuilder();
+		sb.append("select ident from ").append(IdentityImpl.class.getName()).append(" as ident")
+		  .append(" inner join fetch ident.user user")
+		  .append(" where lower(ident.name) in (:usernames)");
+		
+		List<String> loweredIdentityNames = identityNames.stream()
+				.map(id -> id.toLowerCase()).collect(Collectors.toList());
+
+		return dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), Identity.class)
+				.setParameter("usernames", loweredIdentityNames)
+				.getResultList();
+	}
 
 	@Override
 	public Identity findIdentityByUser(User user) {
diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
index 08adfaef971..2249ce0eff8 100644
--- a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
+++ b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java
@@ -179,7 +179,7 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr
 			identListLowercase.add(ident.toLowerCase());
 		}
 		//search by names, must be lower case
-		List<Identity> identities = securityManager.findIdentitiesByName(identListLowercase);
+		List<Identity> identities = securityManager.findIdentitiesByNameCaseInsensitive(identListLowercase);
 		for(Identity identity:identities) {
 			identListLowercase.remove(identity.getName().toLowerCase());
 			if (!PersistenceHelper.containsPersistable(oks, identity)
diff --git a/src/main/java/org/olat/modules/portfolio/ui/wizard/MembersOverviewIdentitiesController.java b/src/main/java/org/olat/modules/portfolio/ui/wizard/MembersOverviewIdentitiesController.java
index ca5f14b721b..104e74b5e05 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/wizard/MembersOverviewIdentitiesController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/wizard/MembersOverviewIdentitiesController.java
@@ -183,7 +183,7 @@ public class MembersOverviewIdentitiesController extends StepFormBasicController
 			identListLowercase.add(ident.toLowerCase());
 		}
 		//search by names, must be lower case
-		List<Identity> identities = securityManager.findIdentitiesByName(identListLowercase);
+		List<Identity> identities = securityManager.findIdentitiesByNameCaseInsensitive(identListLowercase);
 		for(Identity identity:identities) {
 			identListLowercase.remove(identity.getName().toLowerCase());
 			if (!PersistenceHelper.containsPersistable(oks, identity)
diff --git a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
index dab7c58a5f3..29da0e69789 100644
--- a/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
+++ b/src/test/java/org/olat/basesecurity/BaseSecurityManagerTest.java
@@ -221,6 +221,31 @@ public class BaseSecurityManagerTest extends OlatTestCase {
 		Assert.assertTrue(foundIds.contains(id2));
 	}
 	
+	@Test
+	public void findIdentityByNamesCaseInsensitive() {
+		//create a user it
+		String username1 = "fINd-ME-4-" + UUID.randomUUID();
+		Identity id1 = JunitTestHelper.createAndPersistIdentityAsUser(username1);
+		String username2 = "fINd-ME-5-" + UUID.randomUUID();
+		Identity id2 = JunitTestHelper.createAndPersistIdentityAsUser(username2);
+		Assert.assertNotNull(id1);
+		Assert.assertEquals(username1, id1.getName());
+		Assert.assertNotNull(id2);
+		Assert.assertEquals(username2, id2.getName());
+		dbInstance.commitAndCloseSession();
+		
+		List<String> names = new ArrayList<String>(2);
+		names.add(username1);
+		names.add(username2);
+		
+		//find it
+		List<Identity> foundIds = securityManager.findIdentitiesByNameCaseInsensitive(names);
+		Assert.assertNotNull(foundIds);
+		Assert.assertEquals(2, foundIds.size());
+		Assert.assertTrue(foundIds.contains(id1));
+		Assert.assertTrue(foundIds.contains(id2));
+	}
+	
 	@Test
 	public void loadIdentityShortByKey() {
 		//create a user it
-- 
GitLab