From aaecacd58b05801e42c6918544256b0261192e24 Mon Sep 17 00:00:00 2001 From: spyroukon Date: Tue, 13 Jul 2021 15:22:08 +0000 Subject: [PATCH] 1. optimization in retrieval time of repositories/snippets of authenticated user 2. Marked with FIXME methods that need attention --- .../controllers/RepositoryController.java | 6 +- .../controllers/UserRoleController.java | 36 +--- .../manager/service/BrokerServiceImpl.java | 2 +- .../manager/service/RepositoryService.java | 14 +- .../service/RepositoryServiceImpl.java | 163 +++++++++++------- .../security/AaiRoleMappingService.java | 18 ++ .../security/AuthorizationService.java | 8 + .../security/AuthorizationServiceImpl.java | 29 ++++ .../service/security/RoleMappingService.java | 15 ++ 9 files changed, 198 insertions(+), 93 deletions(-) diff --git a/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java b/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java index 217bf1a..28cbcdf 100644 --- a/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java +++ b/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java @@ -66,8 +66,8 @@ public class RepositoryController { @PreAuthorize("hasAuthority('REGISTERED_USER')") public List getRepositoriesSnippetOfUser( @PathVariable("page") String page, - @PathVariable("size") String size) throws JSONException, IOException { - return repositoryService.getRepositoriesSnippetOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size); + @PathVariable("size") String size) throws Exception { + return repositoryService.getRepositoriesSnippetOfUser(page, size); } @RequestMapping(value = "/user/repositories/{page}/{size}", method = RequestMethod.GET, @@ -77,7 +77,7 @@ public class RepositoryController { public List getRepositoriesOfUser( @PathVariable("page") String page, @PathVariable("size") String size) throws JSONException, IOException { - return repositoryService.getRepositoriesOfUser(((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(), page, size); + return repositoryService.getRepositoriesOfUser(page, size); } @RequestMapping(value = "/searchRegisteredRepositories/{page}/{size}", method = RequestMethod.GET, diff --git a/src/main/java/eu/dnetlib/repo/manager/controllers/UserRoleController.java b/src/main/java/eu/dnetlib/repo/manager/controllers/UserRoleController.java index c69e553..dfed035 100644 --- a/src/main/java/eu/dnetlib/repo/manager/controllers/UserRoleController.java +++ b/src/main/java/eu/dnetlib/repo/manager/controllers/UserRoleController.java @@ -1,29 +1,22 @@ package eu.dnetlib.repo.manager.controllers; -import com.google.gson.JsonArray; -import com.google.gson.JsonElement; import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; -import eu.dnetlib.repo.manager.service.security.RoleMappingService; -import eu.dnetlib.repo.manager.service.security.AuthoritiesMapper; import eu.dnetlib.repo.manager.service.security.AuthoritiesUpdater; +import eu.dnetlib.repo.manager.service.security.AuthorizationService; +import eu.dnetlib.repo.manager.service.security.RoleMappingService; import eu.dnetlib.repo.manager.utils.JsonUtils; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; -import org.mitre.openid.connect.model.OIDCAuthenticationToken; -import org.mitre.openid.connect.model.UserInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import java.util.ArrayList; import java.util.Collection; -import java.util.List; @RestController @RequestMapping(value = "/role-management") @@ -33,14 +26,17 @@ public class UserRoleController { private final AaiRegistryService aaiRegistryService; private final AuthoritiesUpdater authoritiesUpdater; private final RoleMappingService roleMappingService; + private final AuthorizationService authorizationService; @Autowired UserRoleController(AaiRegistryService aaiRegistryService, AuthoritiesUpdater authoritiesUpdater, - RoleMappingService roleMappingService) { + RoleMappingService roleMappingService, + AuthorizationService authorizationService) { this.aaiRegistryService = aaiRegistryService; this.authoritiesUpdater = authoritiesUpdater; this.roleMappingService = roleMappingService; + this.authorizationService = authorizationService; } /** @@ -101,30 +97,14 @@ public class UserRoleController { @RequestMapping(method = RequestMethod.GET, path = "/users/{email}/roles") @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or hasAuthority('REGISTERED_USER') and authentication.userInfo.email==#email") public ResponseEntity> getRolesByEmail(@PathVariable("email") String email) { - int coPersonId = aaiRegistryService.getCoPersonIdByEmail(email); - List list = new ArrayList<>(); - for (JsonElement element : aaiRegistryService.getRolesWithStatus(coPersonId, AaiRegistryService.RoleStatus.ACTIVE)) { - list.add(element.getAsJsonObject().get("CouId").getAsInt()); - } - return ResponseEntity.ok(aaiRegistryService.getCouNames(list).values()); + return ResponseEntity.ok(authorizationService.getUserRoles(email)); } @RequestMapping(method = RequestMethod.GET, path = "/user/roles/my") @PreAuthorize("hasAuthority('REGISTERED_USER')") public ResponseEntity> getRoleNames() { - List roles; - JsonArray entitlements = null; - UserInfo userInfo = ((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo(); - if (userInfo.getSource().getAsJsonArray("edu_person_entitlements") != null) { - entitlements = userInfo.getSource().getAsJsonArray("edu_person_entitlements"); - } else if (userInfo.getSource().getAsJsonArray("eduperson_entitlement") != null) { - entitlements = userInfo.getSource().getAsJsonArray("eduperson_entitlement"); - } else { - return ResponseEntity.ok(null); - } - roles = AuthoritiesMapper.entitlementRoles(entitlements); - return ResponseEntity.ok(roles); + return ResponseEntity.ok(authorizationService.getUserRoles()); } } \ No newline at end of file diff --git a/src/main/java/eu/dnetlib/repo/manager/service/BrokerServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/BrokerServiceImpl.java index 6ba8f94..25b27e3 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/BrokerServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/BrokerServiceImpl.java @@ -92,7 +92,7 @@ public class BrokerServiceImpl implements BrokerService { // if (Boolean.parseBoolean(includeByOthers)) { // ret.setDatasourcesOfOthers(getDatasourcesOfUserType(getRepositoriesOfUser(user))); // } - } catch (BrokerException | IOException e) { + } catch (Exception e) { LOGGER.debug("Exception on getDatasourcesOfUser" , e); emailUtils.reportException(e); } diff --git a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryService.java b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryService.java index d384db6..b5a9140 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryService.java @@ -16,13 +16,25 @@ public interface RepositoryService { Country[] getCountries() ; + List getRepositories(List ids) throws JSONException; + + List getRepositories(List ids, int page, int size) throws JSONException; + + List getRepositoriesSnippets(List ids) throws Exception; + + List getRepositoriesSnippets(List ids, int page, int size) throws Exception; + List getRepositoriesByCountry(String country, String mode, Boolean managed) throws JSONException, IOException; + List getRepositoriesOfUser(String page, String size) throws JSONException, IOException; + List getRepositoriesOfUser(String userEmail, String page, String size) throws JSONException, IOException; - List getRepositoriesSnippetOfUser(String userEmail, String page, String size) throws IOException, JSONException; + List getRepositoriesSnippetOfUser(String page, String size) throws Exception; + + List getRepositoriesSnippetOfUser(String userEmail, String page, String size) throws Exception; RepositorySnippet getRepositorySnippetById(String id) throws JSONException, ResourceNotFoundException; Repository getRepositoryById(String id) throws JSONException, ResourceNotFoundException; diff --git a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java index d7999b1..5e943a9 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java @@ -13,8 +13,9 @@ import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; -import eu.dnetlib.repo.manager.service.security.RoleMappingService; import eu.dnetlib.repo.manager.service.security.AuthoritiesUpdater; +import eu.dnetlib.repo.manager.service.security.AuthorizationService; +import eu.dnetlib.repo.manager.service.security.RoleMappingService; import eu.dnetlib.repo.manager.utils.Converter; import gr.uoa.di.driver.enabling.vocabulary.VocabularyLoader; import org.apache.commons.codec.digest.DigestUtils; @@ -50,6 +51,7 @@ public class RepositoryServiceImpl implements RepositoryService { private static final Logger LOGGER = Logger.getLogger(RepositoryServiceImpl.class); + private final AuthorizationService authorizationService; private final RoleMappingService roleMappingService; private final AaiRegistryService registryCalls; private final AuthoritiesUpdater authoritiesUpdater; @@ -84,7 +86,8 @@ public class RepositoryServiceImpl implements RepositoryService { private HttpHeaders httpHeaders; @Autowired - public RepositoryServiceImpl(RoleMappingService roleMappingService, + public RepositoryServiceImpl(AuthorizationService authorizationService, + RoleMappingService roleMappingService, AaiRegistryService registryCalls, AuthoritiesUpdater authoritiesUpdater, VocabularyLoader vocabularyLoader, @@ -92,6 +95,7 @@ public class RepositoryServiceImpl implements RepositoryService { @Lazy EmailUtils emailUtils, @Lazy ValidatorService validatorService, @Lazy PiWikService piWikService) { + this.authorizationService = authorizationService; this.roleMappingService = roleMappingService; this.registryCalls = registryCalls; this.authoritiesUpdater = authoritiesUpdater; @@ -102,7 +106,7 @@ public class RepositoryServiceImpl implements RepositoryService { this.restTemplate = restTemplate; } - private String sendEmail() { + private String getAuthenticatedUserEmail() { OIDCAuthenticationToken authenticationToken = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); return authenticationToken.getUserInfo().getEmail(); } @@ -153,6 +157,83 @@ public class RepositoryServiceImpl implements RepositoryService { .build().encode(); return restTemplate.getForObject(uriComponents.toUri(), Country[].class); } + + // FIXME: with the new roles of the users the "requestFilter.setRegisteredby(userEmail)" can no longer be used + // and the "requestFilter.setId(repoId)" should return only one result at a time, thus, + // another way for paging must be implemented. + @Override + public List getRepositories(List ids) throws JSONException { + return getRepositories(ids, 0, 10); + } + + // FIXME: with the new roles of the users the "requestFilter.setRegisteredby(userEmail)" can no longer be used + // and the "requestFilter.setId(repoId)" should return only one result at a time, thus, + // another way for paging must be implemented. + @Override + public List getRepositories(List ids, int page, int size) throws JSONException { + List repos = new ArrayList<>(); + LOGGER.debug("Retreiving repositories with ids : " + String.join(", ", ids)); + UriComponents uriComponents = searchDatasource(Integer.toString(Math.abs(page)), Integer.toString(Math.abs(size))); + RequestFilter requestFilter = new RequestFilter(); + + try { + for (String repoId : ids) { + requestFilter.setId(repoId); + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); + + repos.addAll(Converter.jsonToRepositoryList(new JSONObject(rs))); + } + } catch (JSONException e) { + LOGGER.debug("Exception on getRepositoriesOfUser", e); + emailUtils.reportException(e); + throw e; + } + + for (Repository r : repos) + r.setPiwikInfo(piWikService.getPiwikSiteForRepo(r.getId())); + return repos; + } + + // FIXME: with the new roles of the users the "requestFilter.setRegisteredby(userEmail)" can no longer be used + // and the "requestFilter.setId(repoId)" should return only one result at a time, thus, + // another way for paging must be implemented. + @Override + public List getRepositoriesSnippets(List ids) throws Exception { + return getRepositoriesSnippets(ids, 0, 10); + } + + // FIXME: with the new roles of the users the "requestFilter.setRegisteredby(userEmail)" can no longer be used + // and the "requestFilter.setId(repoId)" should return only one result at a time, thus, + // another way for paging must be implemented. + @Override + public List getRepositoriesSnippets(List ids, int page, int size) throws Exception { + List resultSet = new ArrayList<>(); + ObjectMapper mapper = new ObjectMapper(); + + // here page should be 0 + UriComponents uriComponents = searchSnipperDatasource(Integer.toString(Math.abs(page)), Integer.toString(Math.abs(size))); + RequestFilter requestFilter = new RequestFilter(); + + try { + for (String repoId : ids) { + requestFilter.setId(repoId); + + String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); + JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); + resultSet.addAll(mapper.readValue(String.valueOf(jsonArray), + mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); + } + } catch (Exception e) { + LOGGER.debug("Exception on getRepositoriesSnippetOfUser", e); + throw e; + } + + LOGGER.debug("resultSet:" + resultSet); + resultSet.parallelStream().forEach(repositorySnippet -> { + repositorySnippet.setPiwikInfo(piWikService.getPiwikSiteForRepo(repositorySnippet.getId())); + }); + return resultSet; + } @Override @@ -255,68 +336,30 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public List getRepositoriesOfUser(String userEmail, - String page, - String size) throws JSONException { - - LOGGER.debug("Retreiving repositories of user : " + userEmail); - UriComponents uriComponents = searchDatasource(page, size); - RequestFilter requestFilter = new RequestFilter(); -// requestFilter.setRegisteredby(userEmail); - - List repoIds = getRepoIdsFromUserRoles(userEmail); - List repos = new ArrayList<>(); - - try { - for (String repoId : repoIds) { - requestFilter.setId(repoId); - String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); - - repos.addAll(Converter.jsonToRepositoryList(new JSONObject(rs))); - } - } catch (Exception e) { - LOGGER.debug("Exception on getRepositoriesOfUser", e); - emailUtils.reportException(e); - throw e; - } - - for (Repository r : repos) - r.setPiwikInfo(piWikService.getPiwikSiteForRepo(r.getId())); - return repos; + public List getRepositoriesOfUser(String page, String size) throws JSONException { + String userEmail = ((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail(); + LOGGER.debug("Retreiving repositories of authenticated user : " + userEmail); + Collection repoIds = roleMappingService.getRepoIdsByRoleIds(authorizationService.getUserRoles()); + return getRepositories(new ArrayList<>(repoIds)); } @Override - public List getRepositoriesSnippetOfUser(String userEmail, String page, String size) throws IOException, JSONException { + public List getRepositoriesOfUser(String userEmail, String page, String size) throws JSONException { + LOGGER.debug("Retreiving repositories of authenticated user : " + userEmail); + Collection repoIds = roleMappingService.getRepoIdsByRoleIds(authorizationService.getUserRoles(userEmail)); + return getRepositories(new ArrayList<>(repoIds)); + } - // TODO: Step 3 - For each repo from the previous step call findByRepositoryId piwik_site to get the full info of repo - List repoIds = getRepoIdsFromUserRoles(userEmail); + @Override + public List getRepositoriesSnippetOfUser(String page, String size) throws Exception { + Collection repoIds = roleMappingService.getRepoIdsByRoleIds(authorizationService.getUserRoles()); + return getRepositoriesSnippets(new ArrayList<>(repoIds)); + } - List resultSet = new ArrayList<>(); - ObjectMapper mapper = new ObjectMapper(); - - // here page should be 0 - UriComponents uriComponents = searchSnipperDatasource(page, size); - RequestFilter requestFilter = new RequestFilter(); - - try { - for (String repoId : repoIds) { - requestFilter.setId(repoId); - - String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); - JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); - resultSet.addAll(mapper.readValue(String.valueOf(jsonArray), - mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); - } - } catch (Exception e) { - LOGGER.debug("Exception on getRepositoriesSnippetOfUser", e); - throw e; - } - - LOGGER.debug("resultSet:" + resultSet); - resultSet.parallelStream().forEach(repositorySnippet -> { - repositorySnippet.setPiwikInfo(piWikService.getPiwikSiteForRepo(repositorySnippet.getId())); - }); - return resultSet; + @Override + public List getRepositoriesSnippetOfUser(String userEmail, String page, String size) throws Exception { + Collection repoIds = roleMappingService.getRepoIdsByRoleIds(authorizationService.getUserRoles(userEmail)); + return getRepositoriesSnippets(new ArrayList<>(repoIds)); } @Override diff --git a/src/main/java/eu/dnetlib/repo/manager/service/security/AaiRoleMappingService.java b/src/main/java/eu/dnetlib/repo/manager/service/security/AaiRoleMappingService.java index 73d1c20..4b0ee5b 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/security/AaiRoleMappingService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/AaiRoleMappingService.java @@ -7,6 +7,8 @@ import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.stereotype.Service; import java.net.URLEncoder; +import java.util.Collection; +import java.util.stream.Collectors; @Service("roleMappingService") public class AaiRoleMappingService implements RoleMappingService { @@ -34,6 +36,14 @@ public class AaiRoleMappingService implements RoleMappingService { return roleId.replaceFirst(".*datasource\\.", "").replace("$", ":"); } + @Override + public Collection getRepoIdsByRoleIds(Collection roleIds) { + return roleIds + .stream() + .map(this::getRepoIdByRoleId) + .collect(Collectors.toList()); + } + @Override public String getRoleIdByRepoId(String repoId) { String roleId = ""; @@ -47,6 +57,14 @@ public class AaiRoleMappingService implements RoleMappingService { } + @Override + public Collection getRoleIdsByRepoIds(Collection repoIds) { + return repoIds + .stream() + .map(this::getRoleIdByRepoId) + .collect(Collectors.toList()); + } + @Override public String convertAuthorityIdToRepoId(String authorityId) { String repo = ""; diff --git a/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationService.java b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationService.java index d06fab3..133322c 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationService.java @@ -3,6 +3,7 @@ package eu.dnetlib.repo.manager.service.security; import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; +import java.util.Collection; import java.util.List; public interface AuthorizationService { @@ -48,4 +49,11 @@ public interface AuthorizationService { * @throws ResourceNotFoundException */ boolean removeAdmin(String id, String email) throws ResourceNotFoundException; + + + Collection getUserRoles(); + + + Collection getUserRoles(String email); + } diff --git a/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java index 3e551a8..768d3ad 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/AuthorizationServiceImpl.java @@ -5,11 +5,14 @@ import com.google.gson.JsonElement; import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; +import org.mitre.openid.connect.model.OIDCAuthenticationToken; +import org.mitre.openid.connect.model.UserInfo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import java.util.ArrayList; +import java.util.Collection; import java.util.List; @Service("authorizationService") @@ -117,4 +120,30 @@ public class AuthorizationServiceImpl implements AuthorizationService { } } + @Override + public Collection getUserRoles() { + List roles; + JsonArray entitlements; + UserInfo userInfo = ((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo(); + if (userInfo.getSource().getAsJsonArray("edu_person_entitlements") != null) { + entitlements = userInfo.getSource().getAsJsonArray("edu_person_entitlements"); + } else if (userInfo.getSource().getAsJsonArray("eduperson_entitlement") != null) { + entitlements = userInfo.getSource().getAsJsonArray("eduperson_entitlement"); + } else { + entitlements = new JsonArray(); + } + roles = AuthoritiesMapper.entitlementRoles(entitlements); + return roles; + } + + @Override + public Collection getUserRoles(String email) { + int coPersonId = aaiRegistryService.getCoPersonIdByEmail(email); + List list = new ArrayList<>(); + for (JsonElement element : aaiRegistryService.getRolesWithStatus(coPersonId, AaiRegistryService.RoleStatus.ACTIVE)) { + list.add(element.getAsJsonObject().get("CouId").getAsInt()); + } + return aaiRegistryService.getCouNames(list).values(); + } + } diff --git a/src/main/java/eu/dnetlib/repo/manager/service/security/RoleMappingService.java b/src/main/java/eu/dnetlib/repo/manager/service/security/RoleMappingService.java index 9138b4d..67439bf 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/security/RoleMappingService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/security/RoleMappingService.java @@ -3,6 +3,8 @@ package eu.dnetlib.repo.manager.service.security; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import java.util.Collection; + public interface RoleMappingService { /** @@ -18,12 +20,25 @@ public interface RoleMappingService { */ String getRepoIdByRoleId(String roleId); + /** + * + * @param roleIds Collection of roles + * @return Converts {@param roleIds} to a repo Ids. + */ + Collection getRepoIdsByRoleIds(Collection roleIds); + /** * @param repoId Repository Id * @return Converts {@param repoId} to a role Id. */ String getRoleIdByRepoId(String repoId); + /** + * @param repoIds Collection of Repository Ids + * @return Converts {@param repoIds} to role Ids. + */ + Collection getRoleIdsByRepoIds(Collection repoIds); + /** * @param authorityId Authority Id * @return Converts {@param authorityId} to repo Id.