diff --git a/src/main/java/org/olat/admin/securitygroup/gui/IdentitiesMoveEvent.java b/src/main/java/org/olat/admin/securitygroup/gui/IdentitiesMoveEvent.java index dae65ac9648dd7d8d8d25acb5409ca44df4bf2c3..76b714f13705fe8cd263ca3fefa5de399c161704 100644 --- a/src/main/java/org/olat/admin/securitygroup/gui/IdentitiesMoveEvent.java +++ b/src/main/java/org/olat/admin/securitygroup/gui/IdentitiesMoveEvent.java @@ -40,6 +40,7 @@ import org.olat.core.id.Identity; */ public class IdentitiesMoveEvent extends MultiIdentityChosenEvent { + private static final long serialVersionUID = -45306223838687501L; private List<Identity> notMovedIdentities; private List<Identity> movedIdentities; diff --git a/src/main/java/org/olat/admin/securitygroup/gui/IdentitiesRemoveEvent.java b/src/main/java/org/olat/admin/securitygroup/gui/IdentitiesRemoveEvent.java index a8d83d1ec4368448637f02da141c801a3017bf79..0216b8f4ea9b572b54ab6dfb948056ed8579ba53 100644 --- a/src/main/java/org/olat/admin/securitygroup/gui/IdentitiesRemoveEvent.java +++ b/src/main/java/org/olat/admin/securitygroup/gui/IdentitiesRemoveEvent.java @@ -40,6 +40,7 @@ import org.olat.core.id.Identity; */ public class IdentitiesRemoveEvent extends Event { + private static final long serialVersionUID = -8986928822106248277L; private List<Identity> removedIdentities; /** diff --git a/src/main/java/org/olat/admin/securitygroup/gui/multi/UsersToGroupWizardStep00.java b/src/main/java/org/olat/admin/securitygroup/gui/multi/UsersToGroupWizardStep00.java index 7643fb7a145afe10802b51233e923c58af0e7d86..8638f877aab5beeeb77f2a053ee0266e3a1ae747 100644 --- a/src/main/java/org/olat/admin/securitygroup/gui/multi/UsersToGroupWizardStep00.java +++ b/src/main/java/org/olat/admin/securitygroup/gui/multi/UsersToGroupWizardStep00.java @@ -56,6 +56,6 @@ public class UsersToGroupWizardStep00 extends BasicStep { @Override public StepFormController getStepController(UserRequest ureq, WindowControl wControl, StepsRunContext stepsRunContext, Form form) { - return new ImportMemberByUsernamesController(ureq, wControl, form, stepsRunContext, true); + return new ImportMemberByUsernamesController(ureq, wControl, form, stepsRunContext); } } diff --git a/src/main/java/org/olat/basesecurity/BaseSecurity.java b/src/main/java/org/olat/basesecurity/BaseSecurity.java index 66ce0f2524c92451f8c863d9614bab64c0931a8e..eed2a302bcb3618b601f9e3b9ed640bb03396005 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurity.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurity.java @@ -191,6 +191,9 @@ public interface BaseSecurity { */ public Identity findIdentityByNumber(String identityNumber); + + public List<Identity> findIdentitiesByNumber(Collection<String> identityNumbers); + /** * Find an identity by its user * @param user diff --git a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java index 26849a394e6601ba10777c4f519b0aa71ab73052..be6b281f4e778ce6cac4e73bd639d1e7132afe33 100644 --- a/src/main/java/org/olat/basesecurity/BaseSecurityManager.java +++ b/src/main/java/org/olat/basesecurity/BaseSecurityManager.java @@ -1180,6 +1180,21 @@ public class BaseSecurityManager extends BasicManager implements BaseSecurity { return null; } + @Override + public List<Identity> findIdentitiesByNumber(Collection<String> identityNumbers) { + if(identityNumbers == null || identityNumbers.isEmpty()) return Collections.emptyList(); + + StringBuilder sb = new StringBuilder(); + sb.append("select identity from ").append(IdentityImpl.class.getName()).append(" identity ") + .append(" inner join identity.user user ") + .append(" where user.properties['").append(UserConstants.INSTITUTIONALUSERIDENTIFIER).append("'] in (:idNumbers) "); + + return dbInstance.getCurrentEntityManager() + .createQuery(sb.toString(), Identity.class) + .setParameter("idNumbers", identityNumbers) + .getResultList(); + } + @Override public List<Identity> findIdentitiesByName(Collection<String> identityNames) { if (identityNames == null || identityNames.isEmpty()) return Collections.emptyList(); diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberByUsernamesController.java b/src/main/java/org/olat/course/member/wizard/ImportMemberByUsernamesController.java index 21fc69ec28f1aaf613f470cf8ae3fca14d548a2e..52a82e936978221f60b6a0c67439164de2ca5735 100644 --- a/src/main/java/org/olat/course/member/wizard/ImportMemberByUsernamesController.java +++ b/src/main/java/org/olat/course/member/wizard/ImportMemberByUsernamesController.java @@ -21,7 +21,6 @@ package org.olat.course.member.wizard; import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.form.flexible.FormItemContainer; -import org.olat.core.gui.components.form.flexible.elements.SingleSelection; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.Form; import org.olat.core.gui.control.Controller; @@ -29,26 +28,18 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.generic.wizard.StepFormBasicController; import org.olat.core.gui.control.generic.wizard.StepsEvent; import org.olat.core.gui.control.generic.wizard.StepsRunContext; -import org.olat.course.member.wizard.ImportMemberOverviewIdentitiesController.DataType; /** * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ public class ImportMemberByUsernamesController extends StepFormBasicController { - private final boolean typesEnabled; + private TextElement idata; - private SingleSelection typedata; - - private String[] typeKeys = new String[]{ - DataType.username.name(), DataType.email.name(), DataType.institutionalUserIdentifier.name() - }; public ImportMemberByUsernamesController(UserRequest ureq, WindowControl wControl, Form rootForm, - StepsRunContext runContext, boolean typesEnabled) { + StepsRunContext runContext) { super(ureq, wControl, rootForm, runContext, LAYOUT_DEFAULT, null); - this.typesEnabled = typesEnabled; - initForm (ureq); } @@ -64,21 +55,11 @@ public class ImportMemberByUsernamesController extends StepFormBasicController { protected void formOK(UserRequest ureq) { String logins = idata.getValue(); addToRunContext("logins", logins); - if(typedata != null && typedata.isOneSelected()) { - addToRunContext("dataType", DataType.values()[typedata.getSelected()]); - } fireEvent(ureq, StepsEvent.ACTIVATE_NEXT); } @Override protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) { - if(typesEnabled) { - String[] theValues = new String[]{ - "Username", "Email", "MarkId" - }; - typedata = uifactory.addDropdownSingleselect("form.addusers.type", formLayout, typeKeys, theValues, null); - } - idata = uifactory.addTextAreaElement("addusers", "form.addusers", -1, 15, 40, true, " ", formLayout); idata.setExampleKey ("form.names.example", null); } diff --git a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewDataModel.java b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewDataModel.java index 95caece510b40f42e7225d29b077a3df5932706f..6531b5c6d0622edd3d1fcbaaab608dff3e1087cb 100644 --- a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewDataModel.java +++ b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewDataModel.java @@ -33,7 +33,7 @@ import org.olat.user.propertyhandlers.UserPropertyHandler; * * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com */ -public class ImportMemberOverviewDataModel extends DefaultTableDataModel<Identity> implements FlexiTableDataModel { +public class ImportMemberOverviewDataModel extends DefaultTableDataModel<Identity> implements FlexiTableDataModel<Identity> { private final Locale locale; private final boolean isAdministrativeUser; private FlexiTableColumnModel columnModel; 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 88d78767b88b88ff294ad4e78febbb97e8a34ac0..85352ef9283187e3966084d06aa2b6f408656f84 100644 --- a/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java +++ b/src/main/java/org/olat/course/member/wizard/ImportMemberOverviewIdentitiesController.java @@ -20,7 +20,6 @@ package org.olat.course.member.wizard; import java.util.ArrayList; -import java.util.Collections; import java.util.List; import org.olat.admin.user.UserTableDataModel; @@ -43,6 +42,8 @@ import org.olat.core.gui.control.generic.wizard.StepsEvent; import org.olat.core.gui.control.generic.wizard.StepsRunContext; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; +import org.olat.core.id.UserConstants; +import org.olat.core.util.mail.MailHelper; import org.olat.user.UserManager; import org.olat.user.propertyhandlers.UserPropertyHandler; @@ -69,13 +70,8 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr oks = null; if(containsRunContextKey("logins")) { - DataType type = (DataType)runContext.get("dataType"); - if(type == null) { - type = DataType.username; - } - String logins = (String)runContext.get("logins"); - oks = loadModel(logins, type); + oks = loadModel(logins); } else if(containsRunContextKey("keys")) { @SuppressWarnings("unchecked") List<String> keys = (List<String>)runContext.get("keys"); @@ -115,12 +111,9 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr } private List<Identity> loadModel(List<String> keys) { - List<Identity> existIdents = Collections.emptyList();//securityManager.getIdentitiesOfSecurityGroup(securityGroup); - List<Identity> oks = new ArrayList<Identity>(); List<String> isanonymous = new ArrayList<String>(); List<String> notfounds = new ArrayList<String>(); - List<String> alreadyin = new ArrayList<String>(); SecurityGroup anonymousSecGroup = securityManager.findSecurityGroupByName(Constants.GROUP_ANONYMOUS); for (String identityKey : keys) { @@ -129,70 +122,71 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr notfounds.add(identityKey); } else if (securityManager.isIdentityInSecurityGroup(ident, anonymousSecGroup)) { isanonymous.add(identityKey); - } else { - // check if already in group - boolean inGroup = PersistenceHelper.containsPersistable(existIdents, ident); - if (inGroup) { - // added to warning: already in group - alreadyin.add(ident.getName()); - } else { - // ok to add -> preview (but filter duplicate entries) - if (!PersistenceHelper.containsPersistable(oks, ident)) { - oks.add(ident); - } - } + } else if (!PersistenceHelper.containsPersistable(oks, ident)) { + oks.add(ident); } } return oks; } - private List<Identity> loadModel(String inp, DataType type) { - List<Identity> existIdents = Collections.emptyList();//securityManager.getIdentitiesOfSecurityGroup(securityGroup); - + private List<Identity> loadModel(String inp) { List<Identity> oks = new ArrayList<Identity>(); - List<String> isanonymous = new ArrayList<String>(); - List<String> notfounds = new ArrayList<String>(); - List<String> alreadyin = new ArrayList<String>(); SecurityGroup anonymousSecGroup = securityManager.findSecurityGroupByName(Constants.GROUP_ANONYMOUS); + List<String> identList = new ArrayList<String>(); String[] lines = inp.split("\r?\n"); for (int i = 0; i < lines.length; i++) { String username = lines[i].trim(); - if (!username.equals("")) { // skip empty lines - Identity ident; - switch(type) { - case email: { - ident = userManager.findIdentityByEmail(username); - break; - } - case institutionalUserIdentifier: { - ident = securityManager.findIdentityByNumber(username); - break; - } - default: { - ident = securityManager.findIdentityByName(username); - } - } - - if (ident == null) { // not found, add to not-found-list - notfounds.add(username); - } else if (securityManager.isIdentityInSecurityGroup(ident, anonymousSecGroup)) { - isanonymous.add(username); - } else { - // check if already in group - boolean inGroup = PersistenceHelper.containsPersistable(existIdents, ident); - if (inGroup) { - // added to warning: already in group - alreadyin.add(ident.getName()); - } else { - // ok to add -> preview (but filter duplicate entries) - if (!PersistenceHelper.containsPersistable(oks, ident)) { - oks.add(ident); - } - } - } + if(username.length() > 0) { + identList.add(username); + } + } + + //search by names + List<Identity> identities = securityManager.findIdentitiesByName(identList); + for(Identity identity:identities) { + identList.remove(identity.getName()); + if (!PersistenceHelper.containsPersistable(oks, identity) + && !securityManager.isIdentityInSecurityGroup(identity, anonymousSecGroup)) { + oks.add(identity); + } + } + + //search by email + List<String> emails = new ArrayList<String>(); + for(String ident:identList) { + if(MailHelper.isValidEmailAddress(ident)) { + emails.add(ident); + } + } + List<Identity> mailIdentities = userManager.findIdentitiesByEmail(emails); + for(Identity identity:mailIdentities) { + String email = identity.getUser().getProperty(UserConstants.EMAIL, null); + if(email != null) { + identList.remove(email); + } + String institutEmail = identity.getUser().getProperty(UserConstants.INSTITUTIONALEMAIL, null); + if(institutEmail != null) { + identList.remove(institutEmail); + } + if (!PersistenceHelper.containsPersistable(oks, identity) + && !securityManager.isIdentityInSecurityGroup(identity, anonymousSecGroup)) { + oks.add(identity); + } + } + + //search by institutionalUserIdentifier + List<Identity> institutIdentities = securityManager.findIdentitiesByNumber(identList); + for(Identity identity:institutIdentities) { + String userIdent = identity.getUser().getProperty(UserConstants.INSTITUTIONALUSERIDENTIFIER, null); + if(userIdent != null) { + identList.remove(userIdent); + } + if (!PersistenceHelper.containsPersistable(oks, identity) + && !securityManager.isIdentityInSecurityGroup(identity, anonymousSecGroup)) { + oks.add(identity); } } @@ -214,10 +208,4 @@ public class ImportMemberOverviewIdentitiesController extends StepFormBasicContr protected void doDispose() { // } - - public enum DataType { - username, - email, - institutionalUserIdentifier - } } \ No newline at end of file diff --git a/src/main/java/org/olat/course/member/wizard/ImportMember_1a_LoginListStep.java b/src/main/java/org/olat/course/member/wizard/ImportMember_1a_LoginListStep.java index f32550bae1edc4b6520a256ac390546cddda662c..b0e2be688840b7ac7f7cbeebd20753f11fc99851 100644 --- a/src/main/java/org/olat/course/member/wizard/ImportMember_1a_LoginListStep.java +++ b/src/main/java/org/olat/course/member/wizard/ImportMember_1a_LoginListStep.java @@ -48,6 +48,6 @@ public class ImportMember_1a_LoginListStep extends BasicStep { @Override public StepFormController getStepController(UserRequest ureq, WindowControl wControl, StepsRunContext runContext, Form form) { - return new ImportMemberByUsernamesController(ureq, wControl, form, runContext, false); + return new ImportMemberByUsernamesController(ureq, wControl, form, runContext); } } \ No newline at end of file diff --git a/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_de.properties index 6a5baca4e176120bf4618028eb6c95a444ca45c6..53f0e5cd1ee2478544cedb71a90a6e029b12f298 100644 --- a/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_de.properties @@ -1,10 +1,9 @@ #Mon Mar 02 09:54:04 CET 2009 -import.import.title=Benutzernamen angeben +import.import.title=Benutzer suchen import.choose.title=$\:import.import.title import.confirm.title=Überprüfen import.permission.title=Berechtigungen import.mail.title=E-Mail-Benachrichtigung -form.names.example=test01<br/>author02<br/> -form.addusers=Benutzername -form.addusers.type=Typ +form.names.example=test01<br/>author02<br/>$org.olat.user.propertyhandlers\:import.example.institutionalUserIdentifier +form.addusers=Benutzername, $org.olat.user.propertyhandlers\:table.name.email oder $org.olat.user.propertyhandlers\:table.name.institutionalUserIdentifier table.user.login=$org.olat.group.ui.main\:table.header.login \ No newline at end of file diff --git a/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_en.properties index 336cb6dd37f9a41ce9a0a81d41b6d8aaf625d740..68b5ee1b0a0fa436c507064804badef00bd35537 100644 --- a/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/course/member/wizard/_i18n/LocalStrings_en.properties @@ -1,10 +1,9 @@ #Thu Sep 27 13:24:15 CEST 2012 -form.addusers=User names -form.names.example=test01<br/>author02<br/> +form.addusers=User names, $org.olat.user.propertyhandlers\:table.name.email or $org.olat.user.propertyhandlers\:table.name.institutionalUserIdentifier +form.names.example=test01<br/>author02<br/>$org.olat.user.propertyhandlers\:import.example.institutionalUserIdentifier import.confirm.title=Review -import.import.title=Enter user names +import.import.title=Search for users import.choose.title=Indicate user name import.mail.title=E-Mail notification import.permission.title=Rights -form.addusers.type=Type table.user.login=$org.olat.group.ui.main\:table.header.login diff --git a/src/main/java/org/olat/user/UserManagerImpl.java b/src/main/java/org/olat/user/UserManagerImpl.java index 3928731b4b6148233fe21d62d096627ea23ea50d..338f37ba999add8b2726019f3b5eaf36ab4c425f 100644 --- a/src/main/java/org/olat/user/UserManagerImpl.java +++ b/src/main/java/org/olat/user/UserManagerImpl.java @@ -20,6 +20,7 @@ package org.olat.user; import java.nio.charset.Charset; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; @@ -187,7 +188,8 @@ public class UserManagerImpl extends UserManager { } @Override - public List<Identity> findIdentitiesByEmail(List<String> emails) { + public List<Identity> findIdentitiesByEmail(List<String> emailList) { + List<String> emails = new ArrayList<String>(emailList); for(Iterator<String> emailIt=emails.iterator(); emailIt.hasNext(); ) { String email = emailIt.next(); if (!MailHelper.isValidEmailAddress(email)) {