diff --git a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManager.java b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManager.java index cae9fb1c4b6aba0749e5af5397454d45da72dd4d..fd1ef85d3a9711ef825790b5290237b4f4278534 100644 --- a/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManager.java +++ b/server-application-server/source/java/ch/systemsx/cisd/openbis/generic/server/task/UserManager.java @@ -1553,6 +1553,41 @@ public class UserManager } if (roleCreations.isEmpty() == false) { + // Filter out already existing roles to not repeat creations + // This is to manage a corner case when a user role has been added manually unnecessarily. + List<RoleAssignmentCreation> filteredRoleCreations = new ArrayList<>(); + for (RoleAssignmentCreation roleAssignmentCreationToCheck : roleCreations) + { + PersonPermId userId = (PersonPermId) roleAssignmentCreationToCheck.getUserId(); + SpacePermId spaceId = (SpacePermId) roleAssignmentCreationToCheck.getSpaceId(); + RoleAssignmentSearchCriteria roleAssignmentSearchCriteria = + new RoleAssignmentSearchCriteria(); + roleAssignmentSearchCriteria.withUser().withUserId() + .thatEquals(userId.getPermId()); + roleAssignmentSearchCriteria.withSpace().withCode() + .thatEquals(spaceId.getPermId()); + SearchResult<RoleAssignment> roleAssignmentSearchResult = + service.searchRoleAssignments(sessionToken, + roleAssignmentSearchCriteria, new RoleAssignmentFetchOptions()); + + boolean found = false; + if (!roleAssignmentSearchResult.getObjects().isEmpty()) + { + Role role = roleAssignmentCreationToCheck.getRole(); + for (RoleAssignment roleAssignment : roleAssignmentSearchResult.getObjects()) + { + if (roleAssignment.getRole().equals(role)) + { + found = true; + } + } + } + if (!found) + { + filteredRoleCreations.add(roleAssignmentCreationToCheck); + } + } + roleCreations = filteredRoleCreations; operations.add(new CreateRoleAssignmentsOperation(roleCreations)); } if (roleDeletions.isEmpty() == false)