From 60ff3dce6e6c67d439a59ddf2fc7c4eb6e940b35 Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Tue, 17 Jan 2023 18:20:41 +0200 Subject: [PATCH 01/12] changes for new aai registry --- .../controllers/UserRoleController.java | 3 +- .../service/RepositoryServiceImpl.java | 29 +------------- .../aai/registry/AaiRegistryService.java | 3 +- .../service/aai/registry/RegistryCalls.java | 25 +++--------- .../aai/registry/utils/RegistryUtils.java | 9 ++++- .../security/AuthorizationService.java | 10 ++++- .../security/AuthorizationServiceImpl.java | 34 ++++++++++++++++- .../dnetlib/repo/manager/utils/HttpUtils.java | 38 +++++++++++++------ 8 files changed, 83 insertions(+), 68 deletions(-) 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 255bac7..bc4dcf2 100644 --- a/src/main/java/eu/dnetlib/repo/manager/controllers/UserRoleController.java +++ b/src/main/java/eu/dnetlib/repo/manager/controllers/UserRoleController.java @@ -71,8 +71,7 @@ public class UserRoleController { } Integer couId = aaiRegistryService.getCouId(type, id); if (couId != null) { - Integer role = aaiRegistryService.getRoleId(coPersonId, couId); - aaiRegistryService.assignMemberRole(coPersonId, couId, role); + aaiRegistryService.assignMemberRole(coPersonId, couId); // Add role to current authorities authoritiesUpdater.addRole(roleMappingService.convertRepoIdToAuthority(id)); 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 06e67f3..b89746a 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java @@ -8,7 +8,6 @@ import eu.dnetlib.api.functionality.ValidatorServiceException; import eu.dnetlib.domain.enabling.Vocabulary; import eu.dnetlib.domain.functionality.validator.JobForValidation; import eu.dnetlib.repo.manager.domain.*; -import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.exception.BrokerException; import eu.dnetlib.repo.manager.exception.RepositoryServiceException; @@ -36,7 +35,6 @@ import org.springframework.http.converter.json.MappingJackson2HttpMessageConvert import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; -import org.springframework.web.client.HttpClientErrorException; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; @@ -499,32 +497,7 @@ public class RepositoryServiceImpl implements RepositoryService { this.latentUpdate(repository, SecurityContextHolder.getContext().getAuthentication()); } - // TODO: move the following code elsewhere (creation and assignment of role to user) ?? - // Create new role - String newRoleName = roleMappingService.getRoleIdByRepoId(repository.getId()); - Role newRole = new Role(newRoleName, repository.getOfficialname()); - Integer couId = null; - try { - couId = registryCalls.createRole(newRole); - } catch (HttpClientErrorException e) { - couId = registryCalls.getCouId(newRoleName); - if (couId == null) { - logger.error(String.format("Could not create role '%s'", newRoleName), e); - } - } catch (Exception e) { - logger.error(String.format("Could not create role '%s'", newRoleName), e); - throw e; - } - - // Assign new role to the user that created it - Integer coPersonId = registryCalls.getCoPersonIdByIdentifier(); - if (couId != null) { - Integer role = registryCalls.getRoleId(coPersonId, couId); - registryCalls.assignMemberRole(coPersonId, couId, role); - - // Add role to current user authorities - authoritiesUpdater.addRole(roleMappingService.convertRepoIdToAuthority(repository.getId())); - } + authorizationService.createAndAssignRoleToAuthenticatedUser(repository.getId(), repository.getOfficialname()); return repository; } diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java index 6fe4888..e54aebb 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java @@ -188,9 +188,8 @@ public interface AaiRegistryService { * * @param coPersonId * @param couId - * @param id */ - void assignMemberRole(Integer coPersonId, Integer couId, Integer id); + void assignMemberRole(Integer coPersonId, Integer couId); /** * 16. Remove a member role from a User diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java index 050b20a..8d93ac9 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java @@ -11,7 +11,6 @@ import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -26,14 +25,11 @@ public class RegistryCalls implements AaiRegistryService { private static final Logger logger = LoggerFactory.getLogger(RegistryCalls.class); - private final String coid; public final HttpUtils httpUtils; public final RegistryUtils jsonUtils; @Autowired - RegistryCalls(@Value("${services.provide.aai.registry.coid:2}") String coid, - HttpUtils httpUtils, RegistryUtils registryUtils) { - this.coid = coid; + RegistryCalls(HttpUtils httpUtils, RegistryUtils registryUtils) { this.httpUtils = httpUtils; this.jsonUtils = registryUtils; } @@ -53,7 +49,6 @@ public class RegistryCalls implements AaiRegistryService { OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); String email = authentication.getUserInfo().getEmail(); Map params = new HashMap<>(); - params.put("coid", coid); params.put("mail", email); JsonElement response = httpUtils.get("co_people.json", params); return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null; @@ -66,7 +61,6 @@ public class RegistryCalls implements AaiRegistryService { @Override public Integer getCoPersonIdByEmail(String email) { Map params = new HashMap<>(); - params.put("coid", coid); params.put("mail", email); JsonElement response = httpUtils.get("co_people.json", params); if (response != null) { @@ -82,7 +76,6 @@ public class RegistryCalls implements AaiRegistryService { public List getCoPersonIdsByEmail(String email) { List coPersonIds = new ArrayList<>(); Map params = new HashMap<>(); - params.put("coid", coid); params.put("mail", email); JsonElement response = httpUtils.get("co_people.json", params); if (response != null) { @@ -108,7 +101,6 @@ public class RegistryCalls implements AaiRegistryService { public Integer getCoPersonIdByIdentifier(String sub) { Map params = new HashMap<>(); - params.put("coid", coid); params.put("search.identifier", sub); JsonElement response = httpUtils.get("co_people.json", params); return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null; @@ -117,7 +109,6 @@ public class RegistryCalls implements AaiRegistryService { @Override public JsonArray getCous(String name) { Map params = new HashMap<>(); - params.put("coid", coid); if (name != null) { params.put("name", URLEncoder.encode(name).toLowerCase()); } @@ -214,7 +205,6 @@ public class RegistryCalls implements AaiRegistryService { @Override public JsonArray getCouGroups(Integer couId) { Map params = new HashMap<>(); - params.put("coid", coid); params.put("couid", couId.toString()); JsonElement response = httpUtils.get("co_groups.json", params); return (response != null) ? response.getAsJsonObject().get("CoGroups").getAsJsonArray() : new JsonArray(); @@ -345,18 +335,15 @@ public class RegistryCalls implements AaiRegistryService { } @Override - public void assignMemberRole(Integer coPersonId, Integer couId, Integer id) { - if (id != null) { - httpUtils.put("co_person_roles/" + id.toString() + ".json", jsonUtils.coPersonRoles(coPersonId, couId, "Active")); - } else { - httpUtils.post("co_person_roles.json", jsonUtils.coPersonRoles(coPersonId, couId, "Active")); - } + public void assignMemberRole(Integer coPersonId, Integer couId) { + httpUtils.post("co_person_roles.json", jsonUtils.coPersonRoles(coPersonId, couId, "Active")); } + @Override public void removeMemberRole(Integer coPersonId, Integer couId, Integer id) { if (id != null) { - httpUtils.put("co_person_roles/" + id.toString() + ".json", jsonUtils.coPersonRoles(coPersonId, couId, "Deleted")); + httpUtils.put("co_person_roles/" + id + ".json", jsonUtils.coPersonRoles(coPersonId, couId, "Deleted")); } } @@ -416,7 +403,7 @@ public class RegistryCalls implements AaiRegistryService { } } if (id != null) { - httpUtils.delete("co_group_members/" + id.toString() + ".json"); + httpUtils.delete("co_group_members/" + id + ".json"); } } diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/RegistryUtils.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/RegistryUtils.java index 7fe74f1..24576b0 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/RegistryUtils.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/RegistryUtils.java @@ -6,6 +6,8 @@ import eu.dnetlib.repo.manager.domain.dto.Role; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import java.util.Date; + @Component public class RegistryUtils { @@ -29,8 +31,11 @@ public class RegistryUtils { coPersonRole.addProperty("Title", ""); coPersonRole.addProperty("O", "Openaire"); coPersonRole.addProperty("Status", status); - coPersonRole.addProperty("ValidFrom", ""); - coPersonRole.addProperty("ValidThrough", ""); + if(status.equals("Active")) { + coPersonRole.addProperty("ValidFrom", new Date().toString()); + } else { + coPersonRole.addProperty("ValidThrough", new Date().toString()); + } coPersonRoles.add(coPersonRole); role.addProperty("RequestType", "CoPersonRoles"); role.addProperty("Version", version); 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 3696321..88abcd7 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 @@ -55,10 +55,18 @@ public interface AuthorizationService { */ boolean removeAdmin(String resourceId, String email) throws ResourceNotFoundException; + /** + * Creates a role based on the resourceId and assigns it to the current user. + * + * @param resourceId usually the repository Id. + * @param roleDescription usually the repository official name. + */ + void createAndAssignRoleToAuthenticatedUser(String resourceId, String roleDescription); + /** * Returns the roles of the authenticated user. - * + * * @return */ Collection getUserRoles(); 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 cd6812e..ad4dcfc 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 @@ -1,6 +1,7 @@ package eu.dnetlib.repo.manager.service.security; import com.google.gson.JsonElement; +import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; @@ -11,6 +12,7 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import org.springframework.web.client.HttpClientErrorException; import java.util.ArrayList; import java.util.Collection; @@ -85,8 +87,7 @@ public class AuthorizationServiceImpl implements AuthorizationService { String role = roleMappingService.getRoleIdByRepoId(resourceId); Integer couId = aaiRegistryService.getCouId(role); if (couId != null) { - Integer roleId = aaiRegistryService.getRoleId(coPersonId, couId); - aaiRegistryService.assignMemberRole(coPersonId, couId, roleId); + aaiRegistryService.assignMemberRole(coPersonId, couId); // Add role to user current authorities authoritiesUpdater.addRole(email, roleMappingService.convertRepoIdToAuthority(resourceId)); @@ -125,6 +126,35 @@ public class AuthorizationServiceImpl implements AuthorizationService { } } + @Override + public void createAndAssignRoleToAuthenticatedUser(String resourceId, String roleDescription) { + // Create new role + String newRoleName = roleMappingService.getRoleIdByRepoId(resourceId); + Role newRole = new Role(newRoleName, roleDescription); + + Integer couId; + try { + couId = aaiRegistryService.createRole(newRole); + } catch (HttpClientErrorException e) { + couId = aaiRegistryService.getCouId(newRoleName); + if (couId == null) { + logger.error(String.format("Could not create role '%s'", newRoleName), e); + } + } catch (Exception e) { + logger.error(String.format("Could not create role '%s'", newRoleName), e); + throw e; + } + + // Assign new role to the current authenticated user + Integer coPersonId = aaiRegistryService.getCoPersonIdByIdentifier(); + if (couId != null) { + aaiRegistryService.assignMemberRole(coPersonId, couId); + + // Add role to current user authorities + authoritiesUpdater.addRole(roleMappingService.convertRepoIdToAuthority(resourceId)); + } + } + @Override public Collection getUserRoles() { Collection roles; diff --git a/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java b/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java index 957da55..65bed60 100644 --- a/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java +++ b/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java @@ -9,9 +9,14 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.*; import org.springframework.stereotype.Component; +import org.springframework.util.LinkedMultiValueMap; import org.springframework.web.client.RestTemplate; +import org.springframework.web.util.UriComponents; +import org.springframework.web.util.UriComponentsBuilder; import java.nio.charset.StandardCharsets; +import java.util.Collections; +import java.util.HashMap; import java.util.Map; @Component @@ -28,6 +33,9 @@ public class HttpUtils { @Value("${services.provide.aai.registry.password}") private String password; + @Value("2") + private String coid; + public JsonElement post(String path, JsonObject body) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = createHeaders(user, password); @@ -48,7 +56,7 @@ public class HttpUtils { public JsonElement get(String path, Map params) { RestTemplate restTemplate = new RestTemplate(); - String url = registryUrl + path + ((params != null) ? createParams(params) : null); + String url = createUrl(registryUrl + path, params); ResponseEntity responseEntity = restTemplate.exchange (url, HttpMethod.GET, new HttpEntity<>(createHeaders(user, password)), String.class); return getResponseEntityAsJsonElement(responseEntity); @@ -62,18 +70,24 @@ public class HttpUtils { return getResponseEntityAsJsonElement(responseEntity); } - - private String createParams(Map params) { - StringBuilder ret = new StringBuilder("?"); - int count = 0; - for (Map.Entry param : params.entrySet()) { - ret.append(param.getKey()).append("=").append(param.getValue()); - count++; - if (count != params.entrySet().size()) { - ret.append("&"); - } + private Map addCoId(Map params) { + if(params == null) { + params = new HashMap<>(); } - return ret.toString(); + params.put("coid", coid); + return params; + } + + + private String createUrl(String baseAddress, Map params) { + params = addCoId(params); + LinkedMultiValueMap multiValueMap = new LinkedMultiValueMap<>(); + params.forEach((k, v) -> multiValueMap.put(k, Collections.singletonList(v))); + UriComponents uriComponents = UriComponentsBuilder + .fromHttpUrl(baseAddress) + .queryParams(multiValueMap) + .build().encode(); + return uriComponents.toString(); } private HttpHeaders createHeaders(String username, String password) { From 139fb420d4bd544aa42f9d4d9526c9d7cced3e89 Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Tue, 17 Jan 2023 18:21:20 +0200 Subject: [PATCH 02/12] removed empty class --- .../dnetlib/repo/manager/utils/DatasourceManagerClient.java | 5 ----- 1 file changed, 5 deletions(-) delete mode 100644 src/main/java/eu/dnetlib/repo/manager/utils/DatasourceManagerClient.java diff --git a/src/main/java/eu/dnetlib/repo/manager/utils/DatasourceManagerClient.java b/src/main/java/eu/dnetlib/repo/manager/utils/DatasourceManagerClient.java deleted file mode 100644 index 118dd05..0000000 --- a/src/main/java/eu/dnetlib/repo/manager/utils/DatasourceManagerClient.java +++ /dev/null @@ -1,5 +0,0 @@ -package eu.dnetlib.repo.manager.utils; - -public class DatasourceManagerClient { - // -} From e4d52c23230acc00dd8e098346d6e4a89a5fdd96 Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Tue, 17 Jan 2023 18:23:59 +0200 Subject: [PATCH 03/12] refactoring project structure --- .../repo/manager/service/aai/registry/RegistryCalls.java | 2 +- .../manager/{ => service/aai/registry}/utils/HttpUtils.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/java/eu/dnetlib/repo/manager/{ => service/aai/registry}/utils/HttpUtils.java (98%) diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java index 8d93ac9..ceeb05b 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java @@ -6,7 +6,7 @@ import com.google.gson.JsonObject; import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.service.aai.registry.utils.RegistryUtils; -import eu.dnetlib.repo.manager.utils.HttpUtils; +import eu.dnetlib.repo.manager.service.aai.registry.utils.HttpUtils; import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/HttpUtils.java similarity index 98% rename from src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java rename to src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/HttpUtils.java index 65bed60..44ff24c 100644 --- a/src/main/java/eu/dnetlib/repo/manager/utils/HttpUtils.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/HttpUtils.java @@ -1,4 +1,4 @@ -package eu.dnetlib.repo.manager.utils; +package eu.dnetlib.repo.manager.service.aai.registry.utils; import com.google.gson.JsonElement; import com.google.gson.JsonObject; From 7c5020c2059942c85cc99213aded495a0a021706 Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Wed, 18 Jan 2023 16:54:18 +0200 Subject: [PATCH 04/12] update user roles using identifier instead of email --- .../aai/registry/AaiRegistryService.java | 10 +++++- .../service/aai/registry/RegistryCalls.java | 31 +++++++++++++++++-- .../service/aai/registry/utils/HttpUtils.java | 18 ++--------- .../security/AuthorizationServiceImpl.java | 8 +++-- 4 files changed, 45 insertions(+), 22 deletions(-) diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java index e54aebb..ac6a69b 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java @@ -26,7 +26,15 @@ public interface AaiRegistryService { Integer getCoPersonIdByEmail(String email); /** - * 1. Get CoPersonId List by Email + * 1.3 Get a list of User Identifiers by Email + * + * @param email + * @return + */ + List getUserIdentifiersByEmail(String email); + + /** + * 1.4 Get CoPersonId List by Email * * @param email * @return diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java index ceeb05b..ce46c5b 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java @@ -5,12 +5,13 @@ import com.google.gson.JsonElement; import com.google.gson.JsonObject; import eu.dnetlib.repo.manager.domain.dto.Role; import eu.dnetlib.repo.manager.domain.dto.User; -import eu.dnetlib.repo.manager.service.aai.registry.utils.RegistryUtils; import eu.dnetlib.repo.manager.service.aai.registry.utils.HttpUtils; +import eu.dnetlib.repo.manager.service.aai.registry.utils.RegistryUtils; import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; @@ -27,11 +28,13 @@ public class RegistryCalls implements AaiRegistryService { public final HttpUtils httpUtils; public final RegistryUtils jsonUtils; + private final String coid; @Autowired - RegistryCalls(HttpUtils httpUtils, RegistryUtils registryUtils) { + RegistryCalls(HttpUtils httpUtils, RegistryUtils registryUtils, @Value("${services.provide.aai.registry.coid}") String coid) { this.httpUtils = httpUtils; this.jsonUtils = registryUtils; + this.coid = coid; } private String mapType(String type, boolean communityMap) { @@ -62,6 +65,7 @@ public class RegistryCalls implements AaiRegistryService { public Integer getCoPersonIdByEmail(String email) { Map params = new HashMap<>(); params.put("mail", email); + params.put("coid", coid); JsonElement response = httpUtils.get("co_people.json", params); if (response != null) { JsonArray coPeople = response.getAsJsonObject().get("CoPeople").getAsJsonArray(); @@ -72,11 +76,31 @@ public class RegistryCalls implements AaiRegistryService { return null; } + @Override + public List getUserIdentifiersByEmail(String email) { + List ids = new ArrayList<>(); + Map params = new HashMap<>(); + params.put("copersonid", getCoPersonIdByEmail(email).toString()); + + JsonElement response = httpUtils.get("identifiers.json", params); + if (response != null) { + JsonArray infos = response.getAsJsonObject().get("Identifiers").getAsJsonArray(); + infos.forEach(info -> { + JsonObject jsonInfo = info.getAsJsonObject(); + if (!jsonInfo.get("Deleted").getAsBoolean()) { + ids.add(jsonInfo.get("Identifier").getAsString()); + } + }); + } + return ids; + } + @Override public List getCoPersonIdsByEmail(String email) { List coPersonIds = new ArrayList<>(); Map params = new HashMap<>(); params.put("mail", email); + params.put("coid", coid); JsonElement response = httpUtils.get("co_people.json", params); if (response != null) { JsonArray coPeople = response.getAsJsonObject().get("CoPeople").getAsJsonArray(); @@ -102,6 +126,7 @@ public class RegistryCalls implements AaiRegistryService { public Integer getCoPersonIdByIdentifier(String sub) { Map params = new HashMap<>(); params.put("search.identifier", sub); + params.put("coid", coid); JsonElement response = httpUtils.get("co_people.json", params); return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null; } @@ -368,7 +393,7 @@ public class RegistryCalls implements AaiRegistryService { params.put("copersonid", coPersonId.toString()); JsonElement response = httpUtils.get("names.json", params); JsonObject info = (response != null) ? response.getAsJsonObject().get("Names").getAsJsonArray().get(0).getAsJsonObject() : null; - if ( info != null ) { + if (info != null) { JsonObject jsonInfo = info.getAsJsonObject(); return jsonInfo.get("Given").getAsString() + " " + jsonInfo.get("Family").getAsString(); } else diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/HttpUtils.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/HttpUtils.java index 44ff24c..c88c5b4 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/HttpUtils.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/utils/HttpUtils.java @@ -16,7 +16,6 @@ import org.springframework.web.util.UriComponentsBuilder; import java.nio.charset.StandardCharsets; import java.util.Collections; -import java.util.HashMap; import java.util.Map; @Component @@ -33,9 +32,6 @@ public class HttpUtils { @Value("${services.provide.aai.registry.password}") private String password; - @Value("2") - private String coid; - public JsonElement post(String path, JsonObject body) { RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = createHeaders(user, password); @@ -70,17 +66,7 @@ public class HttpUtils { return getResponseEntityAsJsonElement(responseEntity); } - private Map addCoId(Map params) { - if(params == null) { - params = new HashMap<>(); - } - params.put("coid", coid); - return params; - } - - private String createUrl(String baseAddress, Map params) { - params = addCoId(params); LinkedMultiValueMap multiValueMap = new LinkedMultiValueMap<>(); params.forEach((k, v) -> multiValueMap.put(k, Collections.singletonList(v))); UriComponents uriComponents = UriComponentsBuilder @@ -101,11 +87,11 @@ public class HttpUtils { private JsonElement getResponseEntityAsJsonElement(ResponseEntity responseEntity) { - if ( responseEntity == null ) + if (responseEntity == null) return null; String responseBody = responseEntity.getBody(); - if ( responseBody != null ) { + if (responseBody != null) { logger.debug(responseBody); try { return new JsonParser().parse(responseBody); 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 ad4dcfc..56a71c2 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 @@ -90,7 +90,9 @@ public class AuthorizationServiceImpl implements AuthorizationService { aaiRegistryService.assignMemberRole(coPersonId, couId); // Add role to user current authorities - authoritiesUpdater.addRole(email, roleMappingService.convertRepoIdToAuthority(resourceId)); + for (String userId : aaiRegistryService.getUserIdentifiersByEmail(email)) { + authoritiesUpdater.addRole(userId, roleMappingService.convertRepoIdToAuthority(resourceId)); + } return true; } else { @@ -115,7 +117,9 @@ public class AuthorizationServiceImpl implements AuthorizationService { aaiRegistryService.removeMemberRole(coPersonId, couId, roleId); // Remove role from user current authorities - authoritiesUpdater.removeRole(email, roleMappingService.convertRepoIdToAuthority(resourceId)); + for (String userId : aaiRegistryService.getUserIdentifiersByEmail(email)) { + authoritiesUpdater.removeRole(userId, roleMappingService.convertRepoIdToAuthority(resourceId)); + } return true; } else { From 0674a3c031657cfaba7c232c8346ffc7ebe0b36d Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Thu, 19 Jan 2023 12:15:30 +0200 Subject: [PATCH 05/12] fixed null pointer exception --- .../dnetlib/repo/manager/service/RepositoryServiceImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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 b89746a..898bbb1 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java @@ -614,7 +614,7 @@ public class RepositoryServiceImpl implements RepositoryService { emailUtils.sendAdminRegisterInterfaceEmail(e, comment, repositoryInterface, authentication); emailUtils.sendUserRegisterInterfaceEmail(e, comment, repositoryInterface, authentication); - if (desiredCompatibilityLevel != null && !repositoryInterface.getCompatibility().equals(desiredCompatibilityLevel)) { + if (desiredCompatibilityLevel != null && (repositoryInterface.getCompatibility() == null || !repositoryInterface.getCompatibility().equals(desiredCompatibilityLevel))) { InterfaceComplianceRequest request = new InterfaceComplianceRequest(repoId, repositoryInterface.getId(), desiredCompatibilityLevel); interfaceComplianceService.create(request); } @@ -637,7 +637,7 @@ public class RepositoryServiceImpl implements RepositoryService { emailUtils.sendAdminUpdateInterfaceEmail(repository, comment, repositoryInterface, authentication); emailUtils.sendUserUpdateInterfaceEmail(repository, comment, repositoryInterface, authentication); - if (desiredCompatibilityLevel != null && !repositoryInterface.getCompatibility().equals(desiredCompatibilityLevel)) { + if (desiredCompatibilityLevel != null && (repositoryInterface.getCompatibility() == null || !repositoryInterface.getCompatibility().equals(desiredCompatibilityLevel))) { InterfaceComplianceRequest request = new InterfaceComplianceRequest(repoId, repositoryInterface.getId(), desiredCompatibilityLevel); interfaceComplianceService.create(request); } From f88d9b838101af18bf6efbdd1ba5d06b468a576b Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Thu, 19 Jan 2023 12:28:31 +0200 Subject: [PATCH 06/12] fixed deserialization issue caused from json to String --- .../repo/manager/service/RepositoryServiceImpl.java | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) 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 898bbb1..ed8f062 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java @@ -287,16 +287,14 @@ public class RepositoryServiceImpl implements RepositoryService { requestFilter.setEnglishname(englishName); try { - String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); + Map rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, Map.class); if (rs == null) { logger.error("DSM response is null : [url={}]", uriComponents.toUri()); } else { - JSONObject response = new JSONObject(rs); - JSONArray jsonArray = (JSONArray) response.get("datasourceInfo"); - Header header = mapper.readValue(response.get("header").toString(), Header.class); + Header header = mapper.readValue(mapper.writeValueAsString(rs.get("header")), Header.class); snippets = Paging.of(header, mapper.readValue( - String.valueOf(jsonArray), + mapper.writeValueAsString(rs.get("datasourceInfo")), mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); } From 415bb1e1974810cbed6a230256c25c5e64eacad4 Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Thu, 19 Jan 2023 13:08:03 +0200 Subject: [PATCH 07/12] fixed conflict --- .../manager/service/aai/registry/RegistryCalls.java | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java index ce46c5b..2485137 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java @@ -178,15 +178,18 @@ public class RegistryCalls implements AaiRegistryService { @Override public JsonArray getRolesWithStatus(Integer coPersonId, RoleStatus status) { JsonArray roles = getRoles(coPersonId); - if (status == null) { - return roles; + if (roles == null) { + roles = new JsonArray(); } JsonArray activeRoles = new JsonArray(); - for (JsonElement role : roles) { - if (role.getAsJsonObject().get("Status").getAsString().equalsIgnoreCase(status.toString())) { - activeRoles.add(role); + if (status != null) { + for (JsonElement role : roles) { + if (role.getAsJsonObject().get("Status").getAsString().equalsIgnoreCase(status.toString())) { + activeRoles.add(role); + } } } + assert activeRoles != null; return activeRoles; } From 125b64ec3bea2f6a554e895414db98d67f5c9f7e Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Thu, 19 Jan 2023 13:41:11 +0200 Subject: [PATCH 08/12] check if CouId is null --- .../manager/service/security/AuthorizationServiceImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 56a71c2..0f05eaa 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 @@ -176,7 +176,9 @@ public class AuthorizationServiceImpl implements AuthorizationService { 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()); + if (element.getAsJsonObject().get("CouId") != null) { + list.add(element.getAsJsonObject().get("CouId").getAsInt()); + } } return aaiRegistryService.getCouNames(list).values(); } From 607c417e3f6fb06fe21f77419004ba4b4a0dbfc0 Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Fri, 20 Jan 2023 19:15:59 +0200 Subject: [PATCH 09/12] get all ids of user using email in registry --- .../controllers/UserRoleController.java | 216 +++++++++--------- .../service/RepositoryServiceImpl.java | 10 +- .../aai/registry/AaiRegistryService.java | 22 +- .../service/aai/registry/RegistryCalls.java | 67 +++--- .../security/AuthorizationService.java | 4 +- .../security/AuthorizationServiceImpl.java | 61 +++-- 6 files changed, 191 insertions(+), 189 deletions(-) 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 bc4dcf2..9f4d8b7 100644 --- a/src/main/java/eu/dnetlib/repo/manager/controllers/UserRoleController.java +++ b/src/main/java/eu/dnetlib/repo/manager/controllers/UserRoleController.java @@ -1,108 +1,108 @@ -package eu.dnetlib.repo.manager.controllers; - -import eu.dnetlib.repo.manager.domain.dto.Role; -import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; -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.ApiOperation; -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.web.bind.annotation.*; - -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import java.util.Collection; - -//@RestController -//@RequestMapping(value = "/role-management") -//@Api(description = "Role Management", value = "role-management") -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, - AuthorizationService authorizationService) { - this.aaiRegistryService = aaiRegistryService; - this.authoritiesUpdater = authoritiesUpdater; - this.roleMappingService = roleMappingService; - this.authorizationService = authorizationService; - } - - /** - * Get the role with the given id. - **/ - @RequestMapping(method = RequestMethod.GET, path = "/role/{id}") -// @PreAuthorize("hasAnyAuthority('REGISTERED_USER', 'SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')") - public Response getRole(@RequestParam(value = "type", defaultValue = "datasource") String type, @PathVariable("id") String id) { - int roleId = aaiRegistryService.getCouId(type, id); - return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role id is: " + roleId).toString()).type(MediaType.APPLICATION_JSON).build(); - } - - /** - * Create a new role with the given name and description. - **/ - @RequestMapping(method = RequestMethod.POST, path = "/role") - @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR')") - public Response createRole(@RequestBody Role role) { - aaiRegistryService.createRole(role); - return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been created").toString()).type(MediaType.APPLICATION_JSON).build(); - } - - /** - * Subscribe to a type(Community, etc.) with id(ee, egi, etc.) - */ - @ApiOperation(value = "subscribe") - @RequestMapping(method = RequestMethod.POST, path = "/subscribe/{type}/{id}") - @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')") - public Response subscribe(@PathVariable("type") String type, @PathVariable("id") String id) { - Integer coPersonId = aaiRegistryService.getCoPersonIdByIdentifier(); - if (coPersonId == null) { - coPersonId = aaiRegistryService.getCoPersonIdByEmail(); - } - Integer couId = aaiRegistryService.getCouId(type, id); - if (couId != null) { - aaiRegistryService.assignMemberRole(coPersonId, couId); - - // Add role to current authorities - authoritiesUpdater.addRole(roleMappingService.convertRepoIdToAuthority(id)); - - return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been assigned").toString()).type(MediaType.APPLICATION_JSON).build(); - } else { - return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); - } - } - ///////////////////////////////////////////////////////////////////////////////////////////// - ///////////////////////////////////////////////////////////////////////////////////////////// - - @RequestMapping(method = RequestMethod.GET, path = "/users/couid/{id}") - @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')") - public ResponseEntity getUsersByCouId(@PathVariable("id") Integer id) { -// calls.getUserByCoId() - return ResponseEntity.ok(aaiRegistryService.getUsersByCouId(id).toString()); - } - - - @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) { - return ResponseEntity.ok(authorizationService.getUserRolesByEmail(email)); - } - - - @RequestMapping(method = RequestMethod.GET, path = "/user/roles/my") - @PreAuthorize("hasAuthority('REGISTERED_USER')") - public ResponseEntity> getRoleNames() { - return ResponseEntity.ok(authorizationService.getUserRoles()); - } - -} +//package eu.dnetlib.repo.manager.controllers; +// +//import eu.dnetlib.repo.manager.domain.dto.Role; +//import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; +//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.ApiOperation; +//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.web.bind.annotation.*; +// +//import javax.ws.rs.core.MediaType; +//import javax.ws.rs.core.Response; +//import java.util.Collection; +// +////@RestController +////@RequestMapping(value = "/role-management") +////@Api(description = "Role Management", value = "role-management") +//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, +// AuthorizationService authorizationService) { +// this.aaiRegistryService = aaiRegistryService; +// this.authoritiesUpdater = authoritiesUpdater; +// this.roleMappingService = roleMappingService; +// this.authorizationService = authorizationService; +// } +// +// /** +// * Get the role with the given id. +// **/ +// @RequestMapping(method = RequestMethod.GET, path = "/role/{id}") +//// @PreAuthorize("hasAnyAuthority('REGISTERED_USER', 'SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')") +// public Response getRole(@RequestParam(value = "type", defaultValue = "datasource") String type, @PathVariable("id") String id) { +// int roleId = aaiRegistryService.getCouId(type, id); +// return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role id is: " + roleId).toString()).type(MediaType.APPLICATION_JSON).build(); +// } +// +// /** +// * Create a new role with the given name and description. +// **/ +// @RequestMapping(method = RequestMethod.POST, path = "/role") +// @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR')") +// public Response createRole(@RequestBody Role role) { +// aaiRegistryService.createRole(role); +// return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been created").toString()).type(MediaType.APPLICATION_JSON).build(); +// } +// +// /** +// * Subscribe to a type(Community, etc.) with id(ee, egi, etc.) +// */ +// @ApiOperation(value = "subscribe") +// @RequestMapping(method = RequestMethod.POST, path = "/subscribe/{type}/{id}") +// @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')") +// public Response subscribe(@PathVariable("type") String type, @PathVariable("id") String id) { +// Integer coPersonId = aaiRegistryService.getCoPersonIdByIdentifier(); +// if (coPersonId == null) { +// coPersonId = aaiRegistryService.getCoPersonIdsByEmail(); +// } +// Integer couId = aaiRegistryService.getCouId(type, id); +// if (couId != null) { +// aaiRegistryService.assignMemberRole(coPersonId, couId); +// +// // Add role to current authorities +// authoritiesUpdater.addRole(roleMappingService.convertRepoIdToAuthority(id)); +// +// return Response.status(HttpStatus.OK.value()).entity(JsonUtils.createResponse("Role has been assigned").toString()).type(MediaType.APPLICATION_JSON).build(); +// } else { +// return Response.status(HttpStatus.NOT_FOUND.value()).entity(JsonUtils.createResponse("Role has not been found").toString()).type(MediaType.APPLICATION_JSON).build(); +// } +// } +// ///////////////////////////////////////////////////////////////////////////////////////////// +// ///////////////////////////////////////////////////////////////////////////////////////////// +// +// @RequestMapping(method = RequestMethod.GET, path = "/users/couid/{id}") +// @PreAuthorize("hasAnyAuthority('SUPER_ADMINISTRATOR', 'CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR')") +// public ResponseEntity getUsersByCouId(@PathVariable("id") Integer id) { +//// calls.getUserByCoId() +// return ResponseEntity.ok(aaiRegistryService.getUsersByCouId(id).toString()); +// } +// +// +// @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) { +// return ResponseEntity.ok(authorizationService.getUserRolesByEmail(email)); +// } +// +// +// @RequestMapping(method = RequestMethod.GET, path = "/user/roles/my") +// @PreAuthorize("hasAuthority('REGISTERED_USER')") +// public ResponseEntity> getRoleNames() { +// return ResponseEntity.ok(authorizationService.getUserRoles()); +// } +// +//} 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 ed8f062..cd29d19 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java @@ -434,7 +434,7 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public List getRepositoryInterface(String id) throws JSONException { + public List getRepositoryInterface(String id) { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/api/") @@ -629,6 +629,12 @@ public class RepositoryServiceImpl implements RepositoryService { String desiredCompatibilityLevel) throws Exception { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Repository repository = this.getRepositoryById(repoId); + if (repositoryInterface.getId() != null) { + RepositoryInterface existing = getRepositoryInterface(repoId).stream().filter(iFace -> iFace.getId().equals(repositoryInterface.getId())).findFirst().orElse(null); + if (existing != null && (existing.getBaseurl() == null || "".equals(existing.getBaseurl()))) { + this.updateBaseUrl(repoId, repositoryInterface.getId(), repositoryInterface.getBaseurl()); + } + } this.updateValidationSet(repoId, repositoryInterface.getId(), repositoryInterface.getAccessSet()); @@ -988,7 +994,7 @@ public class RepositoryServiceImpl implements RepositoryService { } private List getRoleIdsFromUserRoles(String userEmail) { - Integer coPersonId = registryCalls.getCoPersonIdByEmail(userEmail); + List coPersonId = registryCalls.getCoPersonIdsByEmail(userEmail); JsonArray roles; ArrayList roleIds = new ArrayList<>(); ArrayList couIds = new ArrayList<>(); diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java index ac6a69b..6cb453f 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/AaiRegistryService.java @@ -11,19 +11,19 @@ import java.util.Map; public interface AaiRegistryService { /** - * 1.1 Get CoPersonId by authenticated user's Email + * 1.1 Get CoPersonId List by authenticated user's Email * * @return */ - Integer getCoPersonIdByEmail(); + List getCoPersonIdsByEmail(); /** - * 1.2 Get CoPersonId by Email + * 1.2 Get CoPersonId List by Email * * @param email * @return */ - Integer getCoPersonIdByEmail(String email); + List getCoPersonIdsByEmail(String email); /** * 1.3 Get a list of User Identifiers by Email @@ -34,12 +34,12 @@ public interface AaiRegistryService { List getUserIdentifiersByEmail(String email); /** - * 1.4 Get CoPersonId List by Email + * 1.3 Get a list of User Identifiers by Email * - * @param email + * @param coPersonId * @return */ - List getCoPersonIdsByEmail(String email); + List getUserIdentifiersByCoPersonId(Integer coPersonId); /** * 2. Get CoPersonId by AAI identifier @@ -105,6 +105,14 @@ public interface AaiRegistryService { */ JsonArray getRolesWithStatus(Integer coPersonId, RoleStatus status); + /** + * 5.3 Get User non admin active roles + * + * @param coPersonIds + * @return + */ + JsonArray getRolesWithStatus(List coPersonIds, RoleStatus status); + /** * 6. Get Role id of User base on couId. * diff --git a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java index 2485137..db0573e 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/aai/registry/RegistryCalls.java @@ -16,10 +16,7 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import java.net.URLEncoder; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @Service public class RegistryCalls implements AaiRegistryService { @@ -46,41 +43,20 @@ public class RegistryCalls implements AaiRegistryService { return type; } - @Override - public Integer getCoPersonIdByEmail() { - try { - OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); - String email = authentication.getUserInfo().getEmail(); - Map params = new HashMap<>(); - params.put("mail", email); - JsonElement response = httpUtils.get("co_people.json", params); - return (response != null) ? response.getAsJsonObject().get("CoPeople").getAsJsonArray().get(0).getAsJsonObject().get("Id").getAsInt() : null; - } catch (Exception e) { - logger.error("Get User info: An error occurred ", e); - return null; - } - } - - @Override - public Integer getCoPersonIdByEmail(String email) { - Map params = new HashMap<>(); - params.put("mail", email); - params.put("coid", coid); - JsonElement response = httpUtils.get("co_people.json", params); - if (response != null) { - JsonArray coPeople = response.getAsJsonObject().get("CoPeople").getAsJsonArray(); - if (coPeople.size() > 0) { - return coPeople.get(0).getAsJsonObject().get("Id").getAsInt(); - } - } - return null; - } - @Override public List getUserIdentifiersByEmail(String email) { + List ids = new ArrayList<>(); + for (Integer coPersonId : getCoPersonIdsByEmail(email)) { + ids.addAll(getUserIdentifiersByCoPersonId(coPersonId)); + } + return ids; + } + + @Override + public List getUserIdentifiersByCoPersonId(Integer coPersonId) { List ids = new ArrayList<>(); Map params = new HashMap<>(); - params.put("copersonid", getCoPersonIdByEmail(email).toString()); + params.put("copersonid", coPersonId.toString()); JsonElement response = httpUtils.get("identifiers.json", params); if (response != null) { @@ -95,6 +71,18 @@ public class RegistryCalls implements AaiRegistryService { return ids; } + @Override + public List getCoPersonIdsByEmail() { + try { + OIDCAuthenticationToken authentication = (OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication(); + String email = authentication.getUserInfo().getEmail(); + return getCoPersonIdsByEmail(email); + } catch (Exception e) { + logger.error("Get User info: An error occurred ", e); + return null; + } + } + @Override public List getCoPersonIdsByEmail(String email) { List coPersonIds = new ArrayList<>(); @@ -177,7 +165,14 @@ public class RegistryCalls implements AaiRegistryService { @Override public JsonArray getRolesWithStatus(Integer coPersonId, RoleStatus status) { - JsonArray roles = getRoles(coPersonId); + return getRolesWithStatus(Collections.singletonList(coPersonId), status); + } + + @Override + public JsonArray getRolesWithStatus(List coPersonIds, RoleStatus status) { + JsonArray roles = new JsonArray(); + JsonArray finalRoles = roles; + coPersonIds.parallelStream().forEach(coPersonId -> finalRoles.addAll(getRoles(coPersonId))); if (roles == null) { roles = new JsonArray(); } 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 88abcd7..8c8a665 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 @@ -43,7 +43,7 @@ public interface AuthorizationService { * @return * @throws ResourceNotFoundException */ - boolean addAdmin(String resourceId, String email) throws ResourceNotFoundException; + void addAdmin(String resourceId, String email) throws ResourceNotFoundException; /** * Remove user from resource admins. @@ -53,7 +53,7 @@ public interface AuthorizationService { * @return * @throws ResourceNotFoundException */ - boolean removeAdmin(String resourceId, String email) throws ResourceNotFoundException; + void removeAdmin(String resourceId, String email) throws ResourceNotFoundException; /** * Creates a role based on the resourceId and assigns it to the current user. 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 0f05eaa..7583c6f 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 @@ -81,52 +81,45 @@ public class AuthorizationServiceImpl implements AuthorizationService { @Override - public boolean addAdmin(String resourceId, String email) throws ResourceNotFoundException { - Integer coPersonId = aaiRegistryService.getCoPersonIdByEmail(email); - if (coPersonId != null) { - String role = roleMappingService.getRoleIdByRepoId(resourceId); - Integer couId = aaiRegistryService.getCouId(role); - if (couId != null) { - aaiRegistryService.assignMemberRole(coPersonId, couId); + public void addAdmin(String resourceId, String email) throws ResourceNotFoundException { + String role = roleMappingService.getRoleIdByRepoId(resourceId); + Integer couId = aaiRegistryService.getCouId(role); + if (couId == null) { + throw new ResourceNotFoundException("Cannot find CouId for role: " + role); + } + List coPersonIds = aaiRegistryService.getCoPersonIdsByEmail(email); + for (Integer coPersonId : coPersonIds) { + assert coPersonId != null; + aaiRegistryService.assignMemberRole(coPersonId, couId); - // Add role to user current authorities - for (String userId : aaiRegistryService.getUserIdentifiersByEmail(email)) { - authoritiesUpdater.addRole(userId, roleMappingService.convertRepoIdToAuthority(resourceId)); - } - - return true; - } else { - throw new ResourceNotFoundException("Cannot find CouId for role: " + role); + // Add role to user current authorities + for (String userId : aaiRegistryService.getUserIdentifiersByEmail(email)) { + authoritiesUpdater.addRole(userId, roleMappingService.convertRepoIdToAuthority(resourceId)); } - } else { - throw new ResourceNotFoundException("Cannot find coPersonId for user with email: " + email); } } @Override - public boolean removeAdmin(String resourceId, String email) throws ResourceNotFoundException { - Integer coPersonId = aaiRegistryService.getCoPersonIdByEmail(email); - if (coPersonId != null) { - String role = roleMappingService.getRoleIdByRepoId(resourceId); - Integer couId = aaiRegistryService.getCouId(role); - Integer roleId = null; - if (couId != null) { - roleId = aaiRegistryService.getRoleId(coPersonId, couId); - } - if (couId != null && roleId != null) { + public void removeAdmin(String resourceId, String email) throws ResourceNotFoundException { + String role = roleMappingService.getRoleIdByRepoId(resourceId); + Integer couId = aaiRegistryService.getCouId(role); + if (couId == null) { + throw new ResourceNotFoundException("Cannot find CouId for role: " + role); + } + List coPersonIds = aaiRegistryService.getCoPersonIdsByEmail(email); + for (Integer coPersonId : coPersonIds) { + assert coPersonId != null; + Integer roleId = aaiRegistryService.getRoleId(coPersonId, couId); + if (roleId != null) { aaiRegistryService.removeMemberRole(coPersonId, couId, roleId); // Remove role from user current authorities for (String userId : aaiRegistryService.getUserIdentifiersByEmail(email)) { authoritiesUpdater.removeRole(userId, roleMappingService.convertRepoIdToAuthority(resourceId)); } - - return true; } else { - throw new ResourceNotFoundException("Cannot find CouId for role: " + role); + logger.error("Cannot find RoleId for role: {}", role); } - } else { - throw new ResourceNotFoundException("Cannot find coPersonId for user with email: " + email); } } @@ -173,9 +166,9 @@ public class AuthorizationServiceImpl implements AuthorizationService { @Override public Collection getUserRolesByEmail(String email) { - int coPersonId = aaiRegistryService.getCoPersonIdByEmail(email); + List coPersonIds = aaiRegistryService.getCoPersonIdsByEmail(email); List list = new ArrayList<>(); - for (JsonElement element : aaiRegistryService.getRolesWithStatus(coPersonId, AaiRegistryService.RoleStatus.ACTIVE)) { + for (JsonElement element : aaiRegistryService.getRolesWithStatus(coPersonIds, AaiRegistryService.RoleStatus.ACTIVE)) { if (element.getAsJsonObject().get("CouId") != null) { list.add(element.getAsJsonObject().get("CouId").getAsInt()); } From 0aa604a192b6d3cd3114803fef9acb3df2cb5f34 Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Mon, 23 Jan 2023 17:54:51 +0200 Subject: [PATCH 10/12] refactoring --- .../manager/service/RepositoryService.java | 5 +- .../service/RepositoryServiceImpl.java | 251 ++++++++---------- .../dnetlib/repo/manager/utils/Converter.java | 67 +---- 3 files changed, 122 insertions(+), 201 deletions(-) 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 ff760f9..2de462f 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryService.java @@ -1,5 +1,6 @@ package eu.dnetlib.repo.manager.service; +import com.fasterxml.jackson.core.JsonProcessingException; import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.exception.RepositoryServiceException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; @@ -50,7 +51,7 @@ public interface RepositoryService { String officialName, String requestSortBy, String order, int page, int pageSize) throws Exception; - int getTotalRegisteredRepositories(); + Integer getTotalRegisteredRepositories(); List getRepositoryInterface(String id) throws JSONException; @@ -84,7 +85,7 @@ public interface RepositoryService { MetricsInfo getMetricsInfoForRepository(String repoId) throws RepositoryServiceException; - Map getListLatestUpdate(String mode) throws JSONException; + Map getListLatestUpdate(String mode); RepositoryInterface updateRepositoryInterface(String repoId, String comment, RepositoryInterface repositoryInterface, String desiredCompatibilityLevel) throws Exception; 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 cd29d19..7e582c6 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java @@ -1,5 +1,6 @@ package eu.dnetlib.repo.manager.service; +import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.JsonArray; import com.google.gson.JsonElement; @@ -9,7 +10,6 @@ import eu.dnetlib.domain.enabling.Vocabulary; import eu.dnetlib.domain.functionality.validator.JobForValidation; import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.domain.dto.User; -import eu.dnetlib.repo.manager.exception.BrokerException; import eu.dnetlib.repo.manager.exception.RepositoryServiceException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; @@ -20,9 +20,7 @@ import eu.dnetlib.repo.manager.utils.Converter; import eu.dnetlib.repo.manager.utils.DateUtils; import gr.uoa.di.driver.enabling.vocabulary.VocabularyLoader; import org.apache.commons.codec.digest.DigestUtils; -import org.json.JSONArray; import org.json.JSONException; -import org.json.JSONObject; import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -74,8 +72,6 @@ public class RepositoryServiceImpl implements RepositoryService { @Value("${services.provide.usageStatisticsNumbersBaseURL}") private String usageStatisticsNumbersBaseURL; - private final Converter converter; - private static final Map> dataSourceClass = new HashMap<>(); private static final Map invertedDataSourceClass = new HashMap<>(); @@ -94,7 +90,7 @@ public class RepositoryServiceImpl implements RepositoryService { VocabularyLoader vocabularyLoader, RestTemplate restTemplate, ObjectMapper objectMapper, - Converter converter, +// Converter converter, @Lazy EmailUtils emailUtils, @Lazy ValidatorService validatorService, @Lazy PiWikService piWikService, @@ -105,7 +101,6 @@ public class RepositoryServiceImpl implements RepositoryService { this.authoritiesUpdater = authoritiesUpdater; this.vocabularyLoader = vocabularyLoader; this.piWikService = piWikService; - this.converter = converter; this.emailUtils = emailUtils; this.validatorService = validatorService; this.restTemplate = restTemplate; @@ -172,21 +167,18 @@ public class RepositoryServiceImpl implements RepositoryService { // 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<>(); + public List getRepositories(List ids, int page, int size) { logger.debug("Retrieving repositories with ids : {}", String.join(", ", ids)); - UriComponents uriComponents = searchDatasource(Integer.toString(Math.abs(page)), Integer.toString(Math.abs(size))); + UriComponents uriComponents = searchDatasourceUri(Integer.toString(Math.abs(page)), Integer.toString(Math.abs(size))); RequestFilter requestFilter = new RequestFilter(); + List repos = new ArrayList<>(); + for (String repoId : ids) { requestFilter.setId(repoId); - List rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, List.class); - -// repos.addAll(converter.toRepositoryList(new JSONObject(rs))); + repos.addAll(searchDatasource(uriComponents, requestFilter, Repository.class).getResults()); } - // TODO - "repos" is EMPTY!! - for (Repository r : repos) r.setPiwikInfo(piWikService.getPiwikSiteForRepo(r.getId())); return repos; @@ -205,31 +197,30 @@ public class RepositoryServiceImpl implements RepositoryService { // another way for paging must be implemented. @Override public List getRepositoriesSnippets(List ids, int page, int size) throws Exception { - List resultSet = new ArrayList<>(); + List resultSet; + List datasourceDetailsList = new ArrayList<>(); // here page should be 0 - UriComponents uriComponents = searchSnippetDatasource(Integer.toString(Math.abs(page)), Integer.toString(Math.abs(size))); + UriComponents uriComponents = searchDatasourceSnippetUri(Integer.toString(Math.abs(page)), Integer.toString(Math.abs(size))); RequestFilter requestFilter = new RequestFilter(); - try { - for (String repoId : ids) { - requestFilter.setId(repoId); + for (String repoId : ids) { + requestFilter.setId(repoId); - DatasourceResponse rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, DatasourceResponse.class); - if (rs == null) { - logger.error("The \"DatasourceResponse\" is null!"); - return null; - } - - resultSet.addAll(objectMapper.readValue(objectMapper.writeValueAsString(rs.getDatasourceInfo()), - objectMapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); + DatasourceResponse rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, DatasourceResponse.class); + if (rs == null) { + logger.error("The \"DatasourceResponse\" is null!"); + } else { + datasourceDetailsList.addAll(rs.getDatasourceInfo()); } - } catch (Exception e) { - logger.debug("Exception on getRepositoriesSnippetOfUser", e); - throw e; } - logger.debug("resultSet: {}", resultSet); + resultSet = objectMapper.readValue(objectMapper.writeValueAsString(datasourceDetailsList), + objectMapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class)); + + if (logger.isDebugEnabled()) { + logger.debug("resultSet: {}", objectMapper.writeValueAsString(resultSet)); + } resultSet.parallelStream().forEach(repositorySnippet -> { repositorySnippet.setPiwikInfo(piWikService.getPiwikSiteForRepo(repositorySnippet.getId())); }); @@ -240,13 +231,10 @@ public class RepositoryServiceImpl implements RepositoryService { @Override public List getRepositoriesByCountry(String country, String mode, - Boolean managed) throws JSONException, IOException { - + Boolean managed) throws IOException { logger.debug("Getting repositories by country!"); int page = 0; int size = 100; - List resultSet = new ArrayList<>(); - ObjectMapper mapper = new ObjectMapper(); String filterKey = "UNKNOWN"; if (mode.equalsIgnoreCase("repository")) @@ -257,17 +245,12 @@ public class RepositoryServiceImpl implements RepositoryService { logger.debug("Country code equals : {} | Filter mode equals : {}", country, filterKey); - UriComponents uriComponents = searchSnippetDatasource(String.valueOf(page), String.valueOf(size)); + UriComponents uriComponents = searchDatasourceSnippetUri(String.valueOf(page), String.valueOf(size)); RequestFilter requestFilter = new RequestFilter(); requestFilter.setCountry(country); requestFilter.setEoscDatasourceType(filterKey); - Map rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, Map.class); - if (rs != null) { - resultSet.addAll(mapper.readValue(mapper.writeValueAsString(rs.get("datasourceInfo")), - mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); - } - return resultSet; + return searchDatasource(uriComponents, requestFilter, RepositorySnippet.class).getResults(); } public List searchRegisteredRepositories(String country, String typology, String englishName, @@ -275,10 +258,7 @@ public class RepositoryServiceImpl implements RepositoryService { logger.debug("Searching registered repositories"); - Paging snippets = null; - ObjectMapper mapper = new ObjectMapper(); - - UriComponents uriComponents = searchRegisteredDatasource(requestSortBy, order, Integer.toString(page), Integer.toString(pageSize)); + UriComponents uriComponents = searchRegisteredDatasourceUri(requestSortBy, order, Integer.toString(page), Integer.toString(pageSize)); RequestFilter requestFilter = new RequestFilter(); requestFilter.setCountry(country); @@ -286,27 +266,12 @@ public class RepositoryServiceImpl implements RepositoryService { requestFilter.setOfficialname(officialName); requestFilter.setEnglishname(englishName); - try { - Map rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, Map.class); - if (rs == null) { - logger.error("DSM response is null : [url={}]", uriComponents.toUri()); - } else { - Header header = mapper.readValue(mapper.writeValueAsString(rs.get("header")), Header.class); - snippets = Paging.of(header, - mapper.readValue( - mapper.writeValueAsString(rs.get("datasourceInfo")), - mapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class))); - } - - } catch (Exception e) { - logger.error("Error searching registered datasources", e); - throw e; - } + Paging snippets = searchDatasource(uriComponents, requestFilter, RepositorySnippet.class); return snippets != null ? snippets.getResults() : null; // TODO: return paging when ui is compatible } @Override - public int getTotalRegisteredRepositories() throws NullPointerException { + public Integer getTotalRegisteredRepositories() throws NullPointerException { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/countregistered") .queryParam("fromDate", "1900-01-01") @@ -315,7 +280,7 @@ public class RepositoryServiceImpl implements RepositoryService { return restTemplate.getForObject(uriComponents.toUri(), Integer.class); } - private Repository updateRepositoryInfo(Repository r) throws JSONException { + private Repository updateRepositoryInfo(Repository r) { r.setInterfaces(this.getRepositoryInterface(r.getId())); r.setPiwikInfo(piWikService.getPiwikSiteForRepo(r.getId())); return r; @@ -361,57 +326,35 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public RepositorySnippet getRepositorySnippetById(String id) throws JSONException, ResourceNotFoundException { + public RepositorySnippet getRepositorySnippetById(String id) throws ResourceNotFoundException { logger.debug("Retrieving repositories with id : {}", id); - RepositorySnippet repo; - UriComponents uriComponents = searchSnippetDatasource("0", "100"); + UriComponents uriComponents = searchDatasourceSnippetUri("0", "100"); RequestFilter requestFilter = new RequestFilter(); requestFilter.setId(id); - String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); - if (rs == null) { - logger.error("The result is null!"); - return null; - } + List repositories = searchDatasource(uriComponents, requestFilter, RepositorySnippet.class).getResults(); - JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); - - if (jsonArray.length() == 0) + if (repositories.isEmpty()) throw new ResourceNotFoundException(); - repo = converter.toRepositorySnippet(jsonArray.getJSONObject(0)); - return repo; + return repositories.get(0); } @Override - public Repository getRepositoryById(String id) throws JSONException, ResourceNotFoundException { + public Repository getRepositoryById(String id) throws ResourceNotFoundException { logger.debug("Retrieving repositories with id : {}", id); - Repository repo; - UriComponents uriComponents = searchDatasource("0", "100"); + + UriComponents uriComponents = searchDatasourceUri("0", "100"); RequestFilter requestFilter = new RequestFilter(); requestFilter.setId(id); -// String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); -// JSONArray jsonArray = (JSONArray) new JSONObject(rs).get("datasourceInfo"); - - DatasourceResponse response; - response = restTemplate.postForObject(uriComponents.toUri(), requestFilter, DatasourceResponse.class); - if (response == null) { - logger.error("The response is null!"); - return null; - } - - List datasources = response.getDatasourceInfo(); - if (datasources.size() == 0) + List datasources = searchDatasource(uriComponents, requestFilter, Repository.class).getResults(); + if (datasources.isEmpty()) throw new ResourceNotFoundException(); -// repo = converter.toRepository(jsonArray.getJSONObject(0)); -// return updateRepositoryInfo(repo); - - return updateRepositoryInfo(converter.toRepository(datasources.get(0))); - + return updateRepositoryInfo(datasources.get(0)); } @@ -421,12 +364,11 @@ public class RepositoryServiceImpl implements RepositoryService { String size) throws JSONException { logger.debug("Retrieving repositories with official name : {}", name); - UriComponents uriComponents = searchDatasource("0", "100"); + UriComponents uriComponents = searchDatasourceUri("0", "100"); RequestFilter requestFilter = new RequestFilter(); requestFilter.setOfficialname(name); - String rs = restTemplate.postForObject(uriComponents.toUri(), requestFilter, String.class); - List repos = converter.toRepositoryList(new JSONObject(rs)); + List repos = searchDatasource(uriComponents, requestFilter, Repository.class).getResults(); for (Repository r : repos) updateRepositoryInfo(r); return repos; @@ -441,26 +383,20 @@ public class RepositoryServiceImpl implements RepositoryService { .path("/{id}") .build().expand(id).encode(); -// String rs = restTemplate.getForObject(uriComponents.toUri(), String.class); - ApiDetailsResponse rs = restTemplate.getForObject(uriComponents.toUri(), ApiDetailsResponse.class); - if (rs == null) { - logger.error("The ApiDetailsResponse was null!"); - return null; - } + List rs = searchApi(uriComponents, null, RepositoryInterface.class).getResults(); // TODO STOP FILTERING OUT "sword", "rest" AND FIX UI! - List res = new ArrayList<>(); - - for (ApiDetails det : rs.getApi()) { + List repositoryInterfaces = new ArrayList<>(); + for (RepositoryInterface det : rs) { String protocol = det.getProtocol(); if (!protocol.equals("sword") && !protocol.equals("rest") && !protocol.equals("ftp")) { - res.add(det); + repositoryInterfaces.add(det); } } - return converter.toRepositoryInterfaceList(res); + return repositoryInterfaces; } @Override @@ -501,17 +437,13 @@ public class RepositoryServiceImpl implements RepositoryService { } /* update method acting as add -> send email with registration topic/body*/ - private Repository latentUpdate(Repository repository, Authentication authentication) throws Exception { + private Repository latentUpdate(Repository repository, Authentication authentication) { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/update/") .build() .encode(); - // FIXME: problematic -// String json_repository = converter.toJson(repository); -// logger.debug("JSON to add(update) -> " + json_repository); - - HttpEntity httpEntity = new HttpEntity<>(repository, httpHeaders); // TODO: check if it works (Repository contains extra fields) + HttpEntity httpEntity = new HttpEntity<>(repository, httpHeaders); ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, httpEntity, ResponseEntity.class); if (responseEntity.getStatusCode().equals(HttpStatus.OK)) { @@ -533,10 +465,6 @@ public class RepositoryServiceImpl implements RepositoryService { .build() .encode(); - // FIXME: problematic -// String json_repository = converter.toJson(repository); -// logger.debug("JSON to update -> " + json_repository); - HttpEntity httpEntity = new HttpEntity<>(repository, httpHeaders); ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, httpEntity, ResponseEntity.class); @@ -564,7 +492,6 @@ public class RepositoryServiceImpl implements RepositoryService { .fromHttpUrl(baseAddress + "/ds/add/") .build() .encode(); -// String json_repository = converter.toJson(repository); HttpEntity httpEntity = new HttpEntity<>(repository, httpHeaders); ResponseEntity responseEntity = restTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, httpEntity, ResponseEntity.class); @@ -597,8 +524,7 @@ public class RepositoryServiceImpl implements RepositoryService { String desiredCompatibilityLevel) throws Exception { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Repository e = this.getRepositoryById(repoId); - repositoryInterface = createRepositoryInterface(e, repositoryInterface, datatype); -// String json_interface = converter.toJson(e, repositoryInterface); + repositoryInterface = fillInterfaceFields(e, repositoryInterface, datatype); UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/api/add/") @@ -606,9 +532,11 @@ public class RepositoryServiceImpl implements RepositoryService { .encode(); HttpEntity httpEntity = new HttpEntity<>(repositoryInterface, httpHeaders); - restTemplate.postForObject(uriComponents.toUri(), httpEntity, String.class); + // Explicitly update validation set (updating the interface does not allow updating the set value) + this.updateValidationSet(repoId, repositoryInterface.getId(), repositoryInterface.getAccessSet()); + emailUtils.sendAdminRegisterInterfaceEmail(e, comment, repositoryInterface, authentication); emailUtils.sendUserRegisterInterfaceEmail(e, comment, repositoryInterface, authentication); @@ -682,12 +610,11 @@ public class RepositoryServiceImpl implements RepositoryService { this.validatorService.submitJobForValidation(job); } - private RepositoryInterface createRepositoryInterface(Repository repo, RepositoryInterface iFace, String datatype) { + private RepositoryInterface fillInterfaceFields(Repository repo, RepositoryInterface iFace, String datatype) { iFace.setDatasource(repo.getId()); iFace.setContentdescription("metadata"); - // TODO: double check me logger.warn("Compatibility level: {}", iFace.getCompatibility()); if (iFace.getCompatibility() == null || iFace.getCompatibility().equals("")) { iFace.setCompatibility("UNKNOWN"); @@ -699,7 +626,7 @@ public class RepositoryServiceImpl implements RepositoryService { iFace.setAccessFormat("oai_dc"); - // FIXME: this will probably not work + // TODO: is this the correct functionality? if (repo.getEoscDatasourceType() != null && !repo.getEoscDatasourceType().isEmpty()) iFace.setTypology(repo.getEoscDatasourceType()); else if (datatype.equalsIgnoreCase("journal")) @@ -725,18 +652,18 @@ public class RepositoryServiceImpl implements RepositoryService { @Override public List getDnetCountries() { logger.debug("Getting dnet-countries!"); - return converter.readFile("countries.txt"); + return Converter.readFile("countries.txt"); } @Override public List getTypologies() { - return converter.readFile("typologies.txt"); + return Converter.readFile("typologies.txt"); } @Override public List getTimezones() { - List timezones = converter.readFile("timezones.txt"); - return converter.toTimezones(timezones); + List timezones = Converter.readFile("timezones.txt"); + return Converter.toTimezones(timezones); } @Override @@ -867,13 +794,13 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public Map getListLatestUpdate(String mode) throws JSONException { + public Map getListLatestUpdate(String mode) { Map dates = new HashMap<>(); if (mode.equals("repository")) { dates.put("opendoar", DateUtils.toString(getRepositoryInterface("openaire____::opendoar").get(0).getLastCollectionDate())); dates.put("fairsharing", DateUtils.toString(getRepositoryInterface("openaire____::fairsharing").get(0).getLastCollectionDate())); // create re3data last collection date -// dates.put("re3data", converter.toString(getRepositoryInterface("openaire____::re3data").get(1).getLastCollectionDate())); +// dates.put("re3data", Converter.toString(getRepositoryInterface("openaire____::re3data").get(1).getLastCollectionDate())); List re3interfaces = getRepositoryInterface("openaire____::re3data"); String re3Date = null; for (RepositoryInterface interf : re3interfaces) { @@ -928,7 +855,7 @@ public class RepositoryServiceImpl implements RepositoryService { restTemplate.postForObject(uriComponents.toUri(), null, String.class); } - private MetricsNumbers getMetricsNumbers(String openAIREID) throws BrokerException { + private MetricsNumbers getMetricsNumbers(String openAIREID) { //build the uri params UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(this.usageStatisticsNumbersBaseURL + openAIREID + "/clicks"); @@ -959,7 +886,7 @@ public class RepositoryServiceImpl implements RepositoryService { } - private UriComponents searchDatasource(String page, String size) { + private UriComponents searchDatasourceUri(String page, String size) { return UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/searchdetails/") @@ -969,7 +896,7 @@ public class RepositoryServiceImpl implements RepositoryService { .build().expand(page, size).encode(); } - private UriComponents searchSnippetDatasource(String page, String size) { + private UriComponents searchDatasourceSnippetUri(String page, String size) { return UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/searchsnippet/") @@ -979,7 +906,7 @@ public class RepositoryServiceImpl implements RepositoryService { .build().expand(page, size).encode(); } - private UriComponents searchRegisteredDatasource(String requestSortBy, String order, String page, String size) { + private UriComponents searchRegisteredDatasourceUri(String requestSortBy, String order, String page, String size) { return UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/searchregistered/") @@ -989,6 +916,52 @@ public class RepositoryServiceImpl implements RepositoryService { .build().expand(page, size).encode(); } + private Paging searchDatasource(UriComponents uriComponents, RequestFilter requestFilter, Class clazz) { + Paging repositories = new Paging<>(); + ResponseEntity rs; + rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.POST, new HttpEntity<>(requestFilter), Map.class); + if (!rs.getStatusCode().is2xxSuccessful()) { + logger.error("Api call not successful. Code: {} | Body: {}", rs.getStatusCode(), rs.getBody()); + } + if (rs.getBody() == null) { + logger.error("DSM response is null : [url={}]", uriComponents.toUri()); + } else { + try { + Header header = objectMapper.readValue(objectMapper.writeValueAsString(rs.getBody().get("header")), Header.class); + repositories = Paging.of(header, + objectMapper.readValue( + objectMapper.writeValueAsString(rs.getBody().get("datasourceInfo")), + objectMapper.getTypeFactory().constructCollectionType(List.class, clazz))); + } catch (JsonProcessingException e) { + logger.error("Error in objectMapper", e); + } + } + return repositories; + } + + private Paging searchApi(UriComponents uriComponents, RequestFilter requestFilter, Class clazz) { + Paging repositories = new Paging<>(); + ResponseEntity rs; + rs = restTemplate.exchange(uriComponents.toUri(), HttpMethod.GET, new HttpEntity<>(requestFilter), Map.class); + if (!rs.getStatusCode().is2xxSuccessful()) { + logger.error("Api call not successful. Code: {} | Body: {}", rs.getStatusCode(), rs.getBody()); + } + if (rs.getBody() == null) { + logger.error("DSM response is null : [url={}]", uriComponents.toUri()); + } else { + try { + Header header = objectMapper.readValue(objectMapper.writeValueAsString(rs.getBody().get("header")), Header.class); + repositories = Paging.of(header, + objectMapper.readValue( + objectMapper.writeValueAsString(rs.getBody().get("api")), + objectMapper.getTypeFactory().constructCollectionType(List.class, clazz))); + } catch (JsonProcessingException e) { + logger.error("Error in objectMapper", e); + } + } + return repositories; + } + private String getRepositoryType(String typology) { return invertedDataSourceClass.get(typology); } diff --git a/src/main/java/eu/dnetlib/repo/manager/utils/Converter.java b/src/main/java/eu/dnetlib/repo/manager/utils/Converter.java index 38f5e2e..3dccc4e 100644 --- a/src/main/java/eu/dnetlib/repo/manager/utils/Converter.java +++ b/src/main/java/eu/dnetlib/repo/manager/utils/Converter.java @@ -1,15 +1,9 @@ package eu.dnetlib.repo.manager.utils; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.ObjectMapper; -import eu.dnetlib.repo.manager.domain.*; +import eu.dnetlib.repo.manager.domain.Timezone; import org.apache.commons.codec.digest.DigestUtils; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.stereotype.Component; import java.io.BufferedReader; import java.io.InputStream; @@ -18,61 +12,14 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -@Component public class Converter { private static final Logger logger = LoggerFactory.getLogger(Converter.class); - private final ObjectMapper objectMapper; - - public Converter() { - objectMapper = new ObjectMapper()/*.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)*/; - } - public Repository toRepository(Object repositoryObject) { - - Repository repository = objectMapper.convertValue(repositoryObject, Repository.class); - - return repository; + private Converter() { } - public RepositorySnippet toRepositorySnippet(JSONObject repositorySnippetObject) { - - RepositorySnippet snippet = objectMapper.convertValue(repositorySnippetObject, RepositorySnippet.class); - - return snippet; - } - - public List toRepositoryList(JSONObject json) throws JSONException { - - List resultSet = new ArrayList<>(); - JSONArray rs = json.getJSONArray("datasourceInfo"); - for (int i = 0; i < rs.length(); i++) - resultSet.add(toRepository(rs.getJSONObject(i))); - return resultSet; - } - - public List toRepositoryInterfaceList(List apiDetailsList) { - - List resultSet = new ArrayList<>(); - - for (ApiDetails entry : apiDetailsList) - resultSet.add(toRepositoryInterface(entry)); - return resultSet; - } - - public RepositoryInterface toRepositoryInterface(Object repositoryInterfaceObject) { - - RepositoryInterface repoInterface = objectMapper.convertValue(repositoryInterfaceObject, RepositoryInterface.class); - - return repoInterface; - } - - public String toJson(Repository repository) throws JsonProcessingException { - - return objectMapper.writeValueAsString(repository); - } - - public List readFile(String filename) { + public static List readFile(String filename) { String line; List list = new ArrayList<>(); try { @@ -88,7 +35,7 @@ public class Converter { return list; // It may be empty. } - public List toTimezones(List timezones) { + public static List toTimezones(List timezones) { List tmz = new ArrayList<>(); for (String t : timezones) { @@ -98,17 +45,17 @@ public class Converter { return tmz; } - private String getOpenaireId(String repositoryId) { + public static String getOpenaireId(String repositoryId) { if (repositoryId != null && repositoryId.contains("::")) return repositoryId.split("::")[0] + "::" + DigestUtils.md5Hex(repositoryId.split("::")[1]); return null; } - private Boolean convertStringToBoolean(String value) { + public static Boolean convertStringToBoolean(String value) { return value.equals("null") ? null : Boolean.valueOf(value); } - private Double toDouble(String number) { + public static Double toDouble(String number) { if (Objects.equals(number, "null")) return 0.0; else From 4231480cbce247b7e99fae23f9b269976146d3a9 Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Mon, 23 Jan 2023 17:57:18 +0200 Subject: [PATCH 11/12] disabled delete on interfaces --- .../dnetlib/repo/manager/controllers/RepositoryController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) 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 807d0af..9112339 100644 --- a/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java +++ b/src/main/java/eu/dnetlib/repo/manager/controllers/RepositoryController.java @@ -201,7 +201,8 @@ public class RepositoryController { @PreAuthorize("hasAuthority('SUPER_ADMINISTRATOR') or hasAuthority('CONTENT_PROVIDER_DASHBOARD_ADMINISTRATOR') or @authorizationService.isMemberOfInterface(#id)") public void deleteRepositoryInterface(@RequestParam("id") String id, @RequestParam("registeredBy") String registeredBy) { - repositoryService.deleteRepositoryInterface(id, registeredBy); +// repositoryService.deleteRepositoryInterface(id, registeredBy); + logger.warn("User attempted delete on Interface with ID: {}", id); } @RequestMapping(value = "/addInterface", method = RequestMethod.POST, From 9e4817f2bd7718dd9a8f5a24429ba82093d5ee9a Mon Sep 17 00:00:00 2001 From: Konstantinos Spyrou Date: Mon, 23 Jan 2023 18:26:19 +0200 Subject: [PATCH 12/12] refactoring --- .../manager/service/RepositoryService.java | 27 ++++---- .../service/RepositoryServiceImpl.java | 65 +++++++++---------- 2 files changed, 42 insertions(+), 50 deletions(-) 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 2de462f..b3bf3e3 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryService.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryService.java @@ -1,13 +1,12 @@ package eu.dnetlib.repo.manager.service; -import com.fasterxml.jackson.core.JsonProcessingException; +import eu.dnetlib.api.functionality.ValidatorServiceException; import eu.dnetlib.repo.manager.domain.*; import eu.dnetlib.repo.manager.exception.RepositoryServiceException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import org.json.JSONException; import org.springframework.security.core.Authentication; -import java.io.IOException; import java.util.List; import java.util.Map; @@ -17,27 +16,25 @@ public interface RepositoryService { // TODO: move this elsewhere Country[] getCountries(); - List getRepositories(List ids) throws JSONException; + List getRepositories(List ids); - List getRepositories(List ids, int page, int size) throws JSONException; + List getRepositories(List ids, int page, int size); 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 getRepositoriesByCountry(String country, String mode, Boolean managed); // TODO: remove? - List getRepositoriesOfUser(String page, String size) throws JSONException, IOException; + List getRepositoriesOfUser(String page, String size); // TODO: remove? - List getRepositoriesOfUser(String userEmail, - String page, - String size) throws JSONException, IOException; + List getRepositoriesOfUser(String userEmail, String page, String size); - List getRepositoriesSnippetsOfUser(String page, String size) throws Exception; + List getRepositoriesSnippetsOfUser(String page, String size); - List getRepositoriesSnippetsOfUser(String userEmail, String page, String size) throws Exception; + List getRepositoriesSnippetsOfUser(String userEmail, String page, String size); RepositorySnippet getRepositorySnippetById(String id) throws JSONException, ResourceNotFoundException; @@ -71,11 +68,9 @@ public interface RepositoryService { List getTimezones(); - Repository updateRepository(Repository repository, Authentication authentication) throws Exception; + Repository updateRepository(Repository repository, Authentication authentication); - List getUrlsOfUserRepos(String user_email, - String page, - String size); + List getUrlsOfUserRepos(String userEmail, String page, String size); Map getCompatibilityClasses(String mode); @@ -87,7 +82,7 @@ public interface RepositoryService { Map getListLatestUpdate(String mode); - RepositoryInterface updateRepositoryInterface(String repoId, String comment, RepositoryInterface repositoryInterface, String desiredCompatibilityLevel) throws Exception; + RepositoryInterface updateRepositoryInterface(String repoId, String comment, RepositoryInterface repositoryInterface, String desiredCompatibilityLevel) throws ResourceNotFoundException, ValidatorServiceException; void updateInterfaceCompliance(String repositoryId, String repositoryInterfaceId, String compliance); } 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 7e582c6..b0b828d 100644 --- a/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java +++ b/src/main/java/eu/dnetlib/repo/manager/service/RepositoryServiceImpl.java @@ -13,14 +13,12 @@ import eu.dnetlib.repo.manager.domain.dto.User; import eu.dnetlib.repo.manager.exception.RepositoryServiceException; import eu.dnetlib.repo.manager.exception.ResourceNotFoundException; import eu.dnetlib.repo.manager.service.aai.registry.AaiRegistryService; -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 eu.dnetlib.repo.manager.utils.DateUtils; import gr.uoa.di.driver.enabling.vocabulary.VocabularyLoader; import org.apache.commons.codec.digest.DigestUtils; -import org.json.JSONException; import org.mitre.openid.connect.model.OIDCAuthenticationToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -38,7 +36,6 @@ import org.springframework.web.util.UriComponents; import org.springframework.web.util.UriComponentsBuilder; import javax.annotation.PostConstruct; -import java.io.IOException; import java.sql.Timestamp; import java.util.*; import java.util.concurrent.ConcurrentHashMap; @@ -51,7 +48,6 @@ public class RepositoryServiceImpl implements RepositoryService { private final AuthorizationService authorizationService; private final RoleMappingService roleMappingService; private final AaiRegistryService registryCalls; - private final AuthoritiesUpdater authoritiesUpdater; private final RestTemplate restTemplate; private final ObjectMapper objectMapper; private final VocabularyLoader vocabularyLoader; @@ -86,11 +82,9 @@ public class RepositoryServiceImpl implements RepositoryService { public RepositoryServiceImpl(AuthorizationService authorizationService, RoleMappingService roleMappingService, AaiRegistryService registryCalls, - AuthoritiesUpdater authoritiesUpdater, VocabularyLoader vocabularyLoader, RestTemplate restTemplate, ObjectMapper objectMapper, -// Converter converter, @Lazy EmailUtils emailUtils, @Lazy ValidatorService validatorService, @Lazy PiWikService piWikService, @@ -98,7 +92,6 @@ public class RepositoryServiceImpl implements RepositoryService { this.authorizationService = authorizationService; this.roleMappingService = roleMappingService; this.registryCalls = registryCalls; - this.authoritiesUpdater = authoritiesUpdater; this.vocabularyLoader = vocabularyLoader; this.piWikService = piWikService; this.emailUtils = emailUtils; @@ -134,7 +127,7 @@ public class RepositoryServiceImpl implements RepositoryService { } httpHeaders = new HttpHeaders(); - httpHeaders.setContentType(MediaType.APPLICATION_JSON_UTF8); + httpHeaders.setContentType(MediaType.APPLICATION_JSON); for (String vocName : vocabularyNames) { vocabularyMap.put(vocName, vocabularyLoader.getVocabulary(vocName, Locale.ENGLISH, Locale.ROOT)); @@ -159,7 +152,7 @@ public class RepositoryServiceImpl implements RepositoryService { // 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 { + public List getRepositories(List ids) { return getRepositories(ids, 0, 10); } @@ -188,7 +181,7 @@ public class RepositoryServiceImpl implements RepositoryService { // 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 { + public List getRepositoriesSnippets(List ids) { return getRepositoriesSnippets(ids, 0, 10); } @@ -196,8 +189,8 @@ public class RepositoryServiceImpl implements RepositoryService { // 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; + public List getRepositoriesSnippets(List ids, int page, int size) { + List resultSet = null; List datasourceDetailsList = new ArrayList<>(); // here page should be 0 @@ -215,15 +208,19 @@ public class RepositoryServiceImpl implements RepositoryService { } } - resultSet = objectMapper.readValue(objectMapper.writeValueAsString(datasourceDetailsList), - objectMapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class)); - - if (logger.isDebugEnabled()) { - logger.debug("resultSet: {}", objectMapper.writeValueAsString(resultSet)); + try { + resultSet = objectMapper.readValue(objectMapper.writeValueAsString(datasourceDetailsList), + objectMapper.getTypeFactory().constructCollectionType(List.class, RepositorySnippet.class)); + if (logger.isDebugEnabled()) { + logger.debug("resultSet: {}", objectMapper.writeValueAsString(resultSet)); + } + resultSet.parallelStream().forEach(repositorySnippet -> { + repositorySnippet.setPiwikInfo(piWikService.getPiwikSiteForRepo(repositorySnippet.getId())); + }); + } catch (JsonProcessingException e) { + logger.error("Error deserializing.", e); } - resultSet.parallelStream().forEach(repositorySnippet -> { - repositorySnippet.setPiwikInfo(piWikService.getPiwikSiteForRepo(repositorySnippet.getId())); - }); + return resultSet; } @@ -231,7 +228,7 @@ public class RepositoryServiceImpl implements RepositoryService { @Override public List getRepositoriesByCountry(String country, String mode, - Boolean managed) throws IOException { + Boolean managed) { logger.debug("Getting repositories by country!"); int page = 0; int size = 100; @@ -254,7 +251,7 @@ public class RepositoryServiceImpl implements RepositoryService { } public List searchRegisteredRepositories(String country, String typology, String englishName, - String officialName, String requestSortBy, String order, int page, int pageSize) throws Exception { + String officialName, String requestSortBy, String order, int page, int pageSize) { logger.debug("Searching registered repositories"); @@ -287,7 +284,7 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public List getRepositoriesOfUser(String page, String size) throws JSONException { + public List getRepositoriesOfUser(String page, String size) { logger.debug("Retrieving repositories of authenticated user : {}", ((OIDCAuthenticationToken) SecurityContextHolder.getContext().getAuthentication()).getUserInfo().getEmail()); Collection repoIds = roleMappingService.getRepoIdsByRoleIds(authorizationService.getUserRoles()); @@ -295,19 +292,19 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public List getRepositoriesOfUser(String userEmail, String page, String size) throws JSONException { + public List getRepositoriesOfUser(String userEmail, String page, String size) { logger.debug("Retrieving repositories of authenticated user : {}", userEmail); Collection repoIds = roleMappingService.getRepoIdsByRoleIds(authorizationService.getUserRolesByEmail(userEmail)); return getRepositories(new ArrayList<>(repoIds)); } @Override - public List getRepositoriesSnippetsOfUser(String page, String size) throws Exception { + public List getRepositoriesSnippetsOfUser(String page, String size) { return getRepositoriesSnippetsOfUser(null, page, size); } @Override - public List getRepositoriesSnippetsOfUser(String userEmail, String page, String size) throws Exception { + public List getRepositoriesSnippetsOfUser(String userEmail, String page, String size) { int from = Integer.parseInt(page) * Integer.parseInt(size); int to = from + Integer.parseInt(size); List repoIds = new ArrayList<>(); @@ -361,7 +358,7 @@ public class RepositoryServiceImpl implements RepositoryService { @Override public List getRepositoriesByName(String name, String page, - String size) throws JSONException { + String size) { logger.debug("Retrieving repositories with official name : {}", name); UriComponents uriComponents = searchDatasourceUri("0", "100"); @@ -400,7 +397,7 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public Repository addRepository(String datatype, Repository repository) throws Exception { + public Repository addRepository(String datatype, Repository repository) { logger.debug("storing '{}' repository with id: {}", datatype, repository.getId()); @@ -459,7 +456,7 @@ public class RepositoryServiceImpl implements RepositoryService { } @Override - public Repository updateRepository(Repository repository, Authentication authentication) throws Exception { + public Repository updateRepository(Repository repository, Authentication authentication) { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/update/") .build() @@ -480,7 +477,7 @@ public class RepositoryServiceImpl implements RepositoryService { return repository; } - private void storeRepository(Repository repository, Authentication authentication) throws Exception { + private void storeRepository(Repository repository, Authentication authentication) { Date utilDate = new Date(); Timestamp date = new Timestamp(utilDate.getTime()); @@ -554,7 +551,7 @@ public class RepositoryServiceImpl implements RepositoryService { public RepositoryInterface updateRepositoryInterface(String repoId, String comment, RepositoryInterface repositoryInterface, - String desiredCompatibilityLevel) throws Exception { + String desiredCompatibilityLevel) throws ResourceNotFoundException, ValidatorServiceException { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); Repository repository = this.getRepositoryById(repoId); if (repositoryInterface.getId() != null) { @@ -694,7 +691,7 @@ public class RepositoryServiceImpl implements RepositoryService { public Map getCompatibilityClasses(String mode) { logger.debug("Getting compatibility classes for mode: {}", mode); - Map retMap = new HashMap(); + Map retMap = new HashMap<>(); Map compatibilityClasses = this.getVocabulary("dnet:compatibilityLevel").getAsMap(); boolean foundData = false; @@ -729,7 +726,7 @@ public class RepositoryServiceImpl implements RepositoryService { logger.debug("Getting datasource classes for mode: {}", mode); - Map retMap = new HashMap(); + Map retMap = new HashMap<>(); // TODO: refactor (remove?) for (Map.Entry entry : this.getVocabulary("dnet:datasource_typologies").getAsMap().entrySet()) { @@ -823,7 +820,7 @@ public class RepositoryServiceImpl implements RepositoryService { return Collections.singletonMap("lastCollectionDate", DateUtils.toString(getRepositoryInterface("openaire____::" + mode).get(0).getLastCollectionDate())); } - private void updateValidationSet(String repositoryId, String repositoryInterfaceId, String validationSet) throws Exception { + private void updateValidationSet(String repositoryId, String repositoryInterfaceId, String validationSet) { UriComponents uriComponents = UriComponentsBuilder .fromHttpUrl(baseAddress + "/ds/api/oaiset") .queryParam("dsId", repositoryId)