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