From 19cd08ee0c067162c3a62244c4070eee82a427a0 Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Fri, 10 May 2013 10:07:17 +0200 Subject: [PATCH] OO-586: import members by user names, emails and institutional numbers, remove select box, update wording --- .../gui/IdentitiesMoveEvent.java | 1 + .../gui/IdentitiesRemoveEvent.java | 1 + .../gui/multi/UsersToGroupWizardStep00.java | 2 +- .../org/olat/basesecurity/BaseSecurity.java | 3 + .../basesecurity/BaseSecurityManager.java | 15 +++ .../ImportMemberByUsernamesController.java | 23 +--- .../wizard/ImportMemberOverviewDataModel.java | 2 +- ...ortMemberOverviewIdentitiesController.java | 122 ++++++++---------- .../wizard/ImportMember_1a_LoginListStep.java | 2 +- .../wizard/_i18n/LocalStrings_de.properties | 7 +- .../wizard/_i18n/LocalStrings_en.properties | 7 +- .../java/org/olat/user/UserManagerImpl.java | 4 +- 12 files changed, 89 insertions(+), 100 deletions(-) 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 dae65ac9648..76b714f1370 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 a8d83d1ec43..0216b8f4ea9 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 7643fb7a145..8638f877aab 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 66ce0f2524c..eed2a302bcb 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 26849a394e6..be6b281f4e7 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 21fc69ec28f..52a82e93697 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 95caece510b..6531b5c6d06 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 88d78767b88..85352ef9283 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 f32550bae1e..b0e2be68884 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 6a5baca4e17..53f0e5cd1ee 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 336cb6dd37f..68b5ee1b0a0 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 3928731b4b6..338f37ba999 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)) { -- GitLab