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