From a34655cfc1789a195d8d3a114e2d430f062d069a Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 25 Jan 2019 15:43:19 +0100
Subject: [PATCH] OO-3719: build business path activation chain in user
 management

---
 .../olat/admin/user/UserAdminController.java  | 13 +++++++--
 .../user/UsermanagerUserSearchController.java | 29 ++++++++++++++++++-
 .../admin/user/UsermanagerUserSearchForm.java | 12 ++++----
 .../org/olat/core/id/context/StateMapped.java |  2 +-
 .../registration/RegistrationManager.java     |  4 +--
 .../ui/admin/UserSearchTableController.java   | 26 +++++++++++++++--
 6 files changed, 69 insertions(+), 17 deletions(-)

diff --git a/src/main/java/org/olat/admin/user/UserAdminController.java b/src/main/java/org/olat/admin/user/UserAdminController.java
index 5e2caf1d5b3..ddd406ce77c 100644
--- a/src/main/java/org/olat/admin/user/UserAdminController.java
+++ b/src/main/java/org/olat/admin/user/UserAdminController.java
@@ -54,9 +54,11 @@ import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.Identity;
 import org.olat.core.id.Organisation;
 import org.olat.core.id.Roles;
+import org.olat.core.id.context.BusinessControlFactory;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
 import org.olat.core.util.WebappHelper;
+import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.QuotaManager;
 import org.olat.course.certificate.ui.CertificateAndEfficiencyStatementListController;
 import org.olat.ldap.LDAPLoginManager;
@@ -116,6 +118,7 @@ public class UserAdminController extends BasicController implements Activateable
 	private Identity editedIdentity;
 	private final Roles editedRoles;
 	private final boolean allowedToManage;
+	private int rolesTab;
 
 	// controllers used in tabbed pane
 	private TabbedPane userTabP;
@@ -206,9 +209,13 @@ public class UserAdminController extends BasicController implements Activateable
 		if(entries == null || entries.isEmpty()) return;
 
 		String entryPoint = entries.get(0).getOLATResourceable().getResourceableTypeName();
-		if("tab".equals(entryPoint)) {
+		if("tab".equalsIgnoreCase(entryPoint)) {
 			userTabP.activate(ureq, entries, state);
-		} else if("table".equals(entryPoint)) {
+		} else if("roles".equalsIgnoreCase(entryPoint) && rolesTab >= 0) {
+			List<ContextEntry> tabEntries = BusinessControlFactory.getInstance()
+					.createCEListFromString(OresHelper.createOLATResourceableInstance("tab", Long.valueOf(rolesTab)));
+			userTabP.activate(ureq, tabEntries, state);
+		} else if("table".equalsIgnoreCase(entryPoint)) {
 			if(entries.size() > 2) {
 				List<ContextEntry> subEntries = entries.subList(2, entries.size());
 				userTabP.activate(ureq, subEntries, state);
@@ -430,7 +437,7 @@ public class UserAdminController extends BasicController implements Activateable
 		}
 
 		// the controller manager is read-write permissions
-		userTabP.addTab(translate(NLS_EDIT_UROLES), uureq -> {
+		rolesTab = userTabP.addTab(translate(NLS_EDIT_UROLES), uureq -> {
 			rolesCtr = new SystemRolesAndRightsController(getWindowControl(), uureq, identity);
 			listenTo(rolesCtr);
 			return rolesCtr.getInitialComponent();
diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
index 5a7e5b83943..623ed0b56fc 100644
--- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
+++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchController.java
@@ -24,8 +24,11 @@
 */
 package org.olat.admin.user;
 
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
+import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityModule;
 import org.olat.basesecurity.SearchIdentityParams;
 import org.olat.core.gui.UserRequest;
@@ -78,6 +81,8 @@ public class UsermanagerUserSearchController extends BasicController implements
 	@Autowired
 	private UserManager userManager;
 	@Autowired
+	private BaseSecurity securityManager;
+	@Autowired
 	private BaseSecurityModule securityModule;
 
 	/**
@@ -178,11 +183,19 @@ public class UsermanagerUserSearchController extends BasicController implements
 			
 			if(entries != null && !entries.isEmpty()) {
 				String table = entries.get(0).getOLATResourceable().getResourceableTypeName();
-				if("table".equals(table)) {
+				if("table".equalsIgnoreCase(table)) {
 					entries.remove(0);
 					event(ureq, searchFormCtrl, Event.DONE_EVENT);
 				}
 			}
+		} else {
+			if(entries != null && entries.size()> 1) {
+				String table = entries.get(0).getOLATResourceable().getResourceableTypeName();
+				String identity = entries.get(1).getOLATResourceable().getResourceableTypeName();
+				if("table".equalsIgnoreCase(table) && "Identity".equalsIgnoreCase(identity)) {
+					doActivateUser(ureq, entries.subList(1, entries.size()));
+				}
+			}
 		}
 	}
 
@@ -191,6 +204,20 @@ public class UsermanagerUserSearchController extends BasicController implements
 		//
 	}
 	
+	private void doActivateUser(UserRequest ureq, List<ContextEntry> entries) {
+		Long identityKey = entries.get(0).getOLATResourceable().getResourceableId();
+		Identity searchedIdentity = securityManager.loadIdentityByKey(identityKey);
+		
+		StateMapped searchState = new StateMapped();
+		Map<String,String> states = new HashMap<>();
+		states.put("login", searchedIdentity.getName());
+		searchState.setDelegate(states);
+		searchFormCtrl.setStateEntry(searchState);
+		
+		doPushSearch(ureq);
+		tableCtr.activate(ureq, entries, null);
+	}
+	
 	private void doPushSearch(UserRequest ureq) {
 		identityQueryParams = searchFormCtrl.getSearchIdentityParams();
 		if(identityQueryParams.getOrganisations() == null || identityQueryParams.getOrganisations().isEmpty()) {
diff --git a/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java b/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java
index 872601ddda0..2cd283e4133 100644
--- a/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java
+++ b/src/main/java/org/olat/admin/user/UsermanagerUserSearchForm.java
@@ -317,13 +317,11 @@ public class UsermanagerUserSearchForm extends FormBasicController {
 
 	protected StateMapped getStateEntry() {
 		StateMapped state = new StateMapped();
-		if(items != null) {
-			for(Map.Entry<String, FormItem> itemEntry : items.entrySet()) {
-				String key = itemEntry.getKey();
-				FormItem f = itemEntry.getValue();
-				if (f instanceof TextElement) {
-					state.getDelegate().put(key, ((TextElement) f).getValue());
-				}	
+		for(Map.Entry<String, FormItem> itemEntry : items.entrySet()) {
+			String key = itemEntry.getKey();
+			FormItem f = itemEntry.getValue();
+			if (f instanceof TextElement) {
+				state.getDelegate().put(key, ((TextElement) f).getValue());
 			}	
 		}
 		return state;
diff --git a/src/main/java/org/olat/core/id/context/StateMapped.java b/src/main/java/org/olat/core/id/context/StateMapped.java
index 92fcf92f5a6..b530b8fd6c5 100644
--- a/src/main/java/org/olat/core/id/context/StateMapped.java
+++ b/src/main/java/org/olat/core/id/context/StateMapped.java
@@ -33,7 +33,7 @@ import java.util.Map;
 public class StateMapped implements StateEntry{
 
 	private static final long serialVersionUID = -164313132644246934L;
-	private Map<String,String> delegate = new HashMap<String,String>();
+	private Map<String,String> delegate = new HashMap<>();
 	
 	public StateMapped() {
 		//make XStream happy
diff --git a/src/main/java/org/olat/registration/RegistrationManager.java b/src/main/java/org/olat/registration/RegistrationManager.java
index 1ebf0408981..e3960797af6 100644
--- a/src/main/java/org/olat/registration/RegistrationManager.java
+++ b/src/main/java/org/olat/registration/RegistrationManager.java
@@ -279,9 +279,9 @@ public class RegistrationManager implements UserDataDeletable, UserDataExportabl
 			return;
 		}
 		
-		// http://localhost:8080/auth/UserAdminSite/0/usearch/0/table/0/Identity/720896/tab/10
+		// http://localhost:8080/auth/UserAdminSite/0/usearch/0/table/0/Identity/720896/roles/0
 		
-		String userPath = "[UserAdminSite:0][usearch:0][table:0][Identity:" + newIdentity.getKey() + "][tab:10]";
+		String userPath = "[UserAdminSite:0][usearch:0][table:0][Identity:" + newIdentity.getKey() + "][roles:0]";
 		String url = BusinessControlFactory.getInstance().getURLFromBusinessPathString(userPath);
 		
 		MailerResult result = new MailerResult();
diff --git a/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java b/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
index b0ea828bb96..602fdc84403 100644
--- a/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
+++ b/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
@@ -62,12 +62,15 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController;
+import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.gui.control.generic.wizard.Step;
 import org.olat.core.gui.control.generic.wizard.StepRunnerCallback;
 import org.olat.core.gui.control.generic.wizard.StepsMainRunController;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
+import org.olat.core.id.context.ContextEntry;
+import org.olat.core.id.context.StateEntry;
 import org.olat.core.logging.activity.ThreadLocalUserActivityLogger;
 import org.olat.core.util.Util;
 import org.olat.core.util.mail.ContactList;
@@ -87,7 +90,7 @@ import org.springframework.beans.factory.annotation.Autowired;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class UserSearchTableController extends FormBasicController {
+public class UserSearchTableController extends FormBasicController implements Activateable2 {
 	
 	private static final String USER_PROPS_ID = ExtendedIdentitiesTableDataModel.class.getCanonicalName();
 	public static final int USER_PROPS_OFFSET = 500;
@@ -205,6 +208,22 @@ public class UserSearchTableController extends FormBasicController {
 		//
 	}
 
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		if(entries == null || entries.isEmpty()) return;
+		
+		String type = entries.get(0).getOLATResourceable().getResourceableTypeName();
+		if("Identity".equalsIgnoreCase(type)) {
+			Long identityKey = entries.get(0).getOLATResourceable().getResourceableId();
+			List<IdentityPropertiesRow> rows = tableModel.getObjects();
+			for(IdentityPropertiesRow row:rows) {
+				if(row != null && row.getIdentityKey().equals(identityKey)) {
+					doSelectIdentity(ureq, row).activate(ureq, entries.subList(1, entries.size()), null);
+				}
+			}
+		}
+	}
+
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if(userBulkChangesController == source) {
@@ -302,7 +321,7 @@ public class UserSearchTableController extends FormBasicController {
 		}
 	}
 
-	private void doSelectIdentity(UserRequest ureq, IdentityPropertiesRow userRow) {
+	private UserAdminController doSelectIdentity(UserRequest ureq, IdentityPropertiesRow userRow) {
 		removeAsListenerAndDispose(userAdminCtr);
 		
 		Identity identity = securityManager.loadIdentityByKey(userRow.getIdentityKey());
@@ -319,7 +338,8 @@ public class UserSearchTableController extends FormBasicController {
 		stackPanel.pushController(fullName, userAdminCtr);
 		stackPanel.addTool(previousLink, Align.rightEdge, false, "o_tool_previous");
 		stackPanel.addTool(nextLink, Align.rightEdge, false, "o_tool_next");
-		updateNextPrevious(userRow, false);	
+		updateNextPrevious(userRow, false);
+		return userAdminCtr;
 	}
 	
 	private void doSelectVcard(UserRequest ureq, IdentityPropertiesRow userRow) {
-- 
GitLab