org.flowable.app.rest.idm.WorkflowUsersResource Maven / Gradle / Ivy
/* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.flowable.app.rest.idm;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import org.flowable.app.model.common.ResultListDataRepresentation;
import org.flowable.app.model.common.UserRepresentation;
import org.flowable.app.service.idm.RemoteIdmService;
import org.flowable.engine.RuntimeService;
import org.flowable.engine.TaskService;
import org.flowable.identitylink.api.IdentityLink;
import org.flowable.idm.api.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
* Rest resource for managing users, specifically related to tasks and processes.
*/
@RestController
public class WorkflowUsersResource {
@Autowired
private RemoteIdmService remoteIdmService;
@Autowired
private RuntimeService runtimeService;
@Autowired
private TaskService taskService;
@RequestMapping(value = "/rest/workflow-users", method = RequestMethod.GET)
public ResultListDataRepresentation getUsers(@RequestParam(value = "filter", required = false) String filter,
@RequestParam(value = "excludeTaskId", required = false) String excludeTaskId,
@RequestParam(value = "excludeProcessId", required = false) String excludeProcessId) {
List matchingUsers = remoteIdmService.findUsersByNameFilter(filter);
// Filter out users already part of the task/process of which the ID has been passed
if (excludeTaskId != null) {
filterUsersInvolvedInTask(excludeTaskId, matchingUsers);
} else if (excludeProcessId != null) {
filterUsersInvolvedInProcess(excludeProcessId, matchingUsers);
}
List userRepresentations = new ArrayList<>(matchingUsers.size());
for (User user : matchingUsers) {
userRepresentations.add(new UserRepresentation(user));
}
return new ResultListDataRepresentation(userRepresentations);
}
protected void filterUsersInvolvedInProcess(String excludeProcessId, List matchingUsers) {
Set involvedUsers = getInvolvedUsersAsSet(
runtimeService.getIdentityLinksForProcessInstance(excludeProcessId));
removeinvolvedUsers(matchingUsers, involvedUsers);
}
protected void filterUsersInvolvedInTask(String excludeTaskId, List matchingUsers) {
Set involvedUsers = getInvolvedUsersAsSet(taskService.getIdentityLinksForTask(excludeTaskId));
removeinvolvedUsers(matchingUsers, involvedUsers);
}
protected Set getInvolvedUsersAsSet(List involvedPeople) {
Set involved = null;
if (involvedPeople.size() > 0) {
involved = new HashSet<>();
for (IdentityLink link : involvedPeople) {
if (link.getUserId() != null) {
involved.add(link.getUserId());
}
}
}
return involved;
}
protected void removeinvolvedUsers(List matchingUsers, Set involvedUsers) {
if (involvedUsers != null) {
// Using iterator to be able to remove without ConcurrentModExceptions
Iterator userIt = matchingUsers.iterator();
while (userIt.hasNext()) {
if (involvedUsers.contains(userIt.next().getId())) {
userIt.remove();
}
}
}
}
}