diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 28f76210b..1d1c9bec8 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -794,6 +794,7 @@ public class DataManagementPlanManager { }); UserInfo user = apiContext.getOperationsContext().getDatabaseRepository().getUserInfoDao().find(principal.getId()); sendNotification(dmp, user, NotificationType.DMP_PUBLISH); + this.createZenodoDoi(dmp.getId(), principal, null); } public void makeFinalize(UUID id, Principal principal, DatasetsToBeFinalized datasetsToBeFinalized) throws Exception { @@ -1610,8 +1611,8 @@ public class DataManagementPlanManager { throw new Exception("User is not authorized to invoke this action"); if (!dmp.getStatus().equals(DMP.DMPStatus.FINALISED.getValue())) throw new Exception("DMP is not finalized"); - if (dmp.getDoi() != null) - throw new Exception("DMP already has a DOI"); + /*if (dmp.getDoi() != null) + throw new Exception("DMP already has a DOI");*/ String zenodoToken = ""; try { @@ -1626,18 +1627,51 @@ public class DataManagementPlanManager { HttpHeaders headers = new HttpHeaders(); headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); headers.setContentType(MediaType.APPLICATION_JSON); - String createData = "{\n" + - " \"metadata\": {\n" + - " \"title\": \"" + dmp.getLabel() + "\",\n" + - " \"upload_type\": \"publication\",\n" + - " \"publication_type\": \"datamanagementplan\",\n" + - " \"description\": \"" + (dmp.getDescription() != null && !dmp.getDescription().isEmpty() ? dmp.getDescription() : "

") + "\",\n" + - " \"version\": \"" + dmp.getVersion() + "\",\n" + - " \"creators\": [{\n" + - " \t\t\"name\": \"" + dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getName() + "\",\n" + - " \t\t\"affiliation\": \"OpenDMP\"}]\n" + - " }\n" + - "}"; + String createData = null; + StringBuilder dataBuilder = new StringBuilder(); + dataBuilder.append("{\n \"metadata\": {\n"); + dataBuilder.append( " \"title\": \"").append(dmp.getLabel()).append("\",\n"); + dataBuilder.append(" \"upload_type\": \"publication\",\n"); + dataBuilder.append(" \"publication_type\": \"datamanagementplan\",\n"); + dataBuilder.append(" \"description\": \"").append((dmp.getDescription() != null && !dmp.getDescription().isEmpty() ? dmp.getDescription() : "

")).append("\",\n"); + dataBuilder.append(" \"version\": \"").append(dmp.getVersion()).append("\",\n"); + dataBuilder.append(" \"related_identifiers\": [{\n"); + dataBuilder.append(" \t\t\"identifier\": \"").append((this.environment.getProperty("dmp.domain") + "/explore-plans/publicOverview/" + id.toString())).append("\",\n"); + dataBuilder.append(" \t\t\"relation\": \"isIdenticalTo\"}],\n"); + dataBuilder.append(" \"contributors\": ["); + int i = 0; + for(UserDMP userDMP: dmp.getUsers()) { + if (i > 0) { + dataBuilder.append(",\n"); + } + dataBuilder.append("{\n"); + dataBuilder.append(" \t\t\"name\": \"").append(userDMP.getUser().getName()).append("\",\n"); + dataBuilder.append(" \t\t\"type\": \"").append("ProjectMember").append("\",\n"); + dataBuilder.append(" \t\t\"affiliation\": \"OpenDMP\"\n}"); + i++; + } + for(Researcher researcher: dmp.getResearchers()) { + if (i > 0) { + dataBuilder.append(",\n"); + } + dataBuilder.append("{\n"); + dataBuilder.append(" \t\t\"name\": \"").append(researcher.getLabel()).append("\",\n"); + dataBuilder.append(" \t\t\"type\": \"").append("Researcher").append("\",\n"); + String referenceHead = researcher.getReference().split(":")[0]; + String referenceTail = researcher.getReference().replace(referenceHead + ":", ""); + dataBuilder.append(" \t\t\"affiliation\": \"" + referenceHead + "\""); + if (referenceHead.toUpperCase().equals("ORCID")) { + dataBuilder.append(",\n \t\t\"orcid\": \"" + referenceTail + "\""); + } + dataBuilder.append("\n}"); + i++; + } + dataBuilder.append("],\n"); + dataBuilder.append(" \"creators\": [{\n"); + dataBuilder.append(" \t\t\"name\": \"").append(dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getName()).append("\",\n"); + dataBuilder.append(" \t\t\"affiliation\": \"OpenDMP\"}]\n"); + dataBuilder.append(" }\n").append("}"); + createData = dataBuilder.toString(); JsonNode createDataJSON = new ObjectMapper().readTree(createData); HttpEntity request = new HttpEntity<>(createDataJSON, headers); Map createResponse = null; @@ -1645,12 +1679,14 @@ public class DataManagementPlanManager { String previousDOI = this.getPreviousDOI(dmp.getGroupId(), dmp.getId()); String unpublishedUrl = null; String publishUrl = null; + String finalDoi = null; try { if (previousDOI == null) { String createUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?access_token=" + zenodoToken; createResponse = restTemplate.postForEntity(createUrl, request, Map.class).getBody(); links = (LinkedHashMap) createResponse.get("links"); + finalDoi = (String) createResponse.get("conceptdoi"); } else { unpublishedUrl = this.getUnpublishedDOI(previousDOI, zenodoToken, dmp.getVersion()); if (unpublishedUrl == null) { @@ -1668,6 +1704,7 @@ public class DataManagementPlanManager { String latestDraftUrl = links.get("latest_draft") + "?access_token=" + zenodoToken; createResponse = restTemplate.getForObject(latestDraftUrl, Map.class); links = (LinkedHashMap) createResponse.get("links"); + finalDoi = (String) createResponse.get("conceptdoi"); //At this point it might fail to perform the next requests so enclose them with try catch try { //Forth, update the new deposit's metadata @@ -1710,11 +1747,16 @@ public class DataManagementPlanManager { } else { publishUrl = unpublishedUrl + "?access_token=" + zenodoToken; } - Map publishResponce = restTemplate.postForObject(publishUrl, "", Map.class); + if (dmp.isPublic()) { + Map publishResponce = restTemplate.postForObject(publishUrl, "", Map.class); + finalDoi = (String) publishResponce.get("conceptdoi"); + } - dmp.setDoi((String) publishResponce.get("conceptdoi")); - apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); - return (String) publishResponce.get("conceptdoi"); + if (finalDoi != null) { + dmp.setDoi(finalDoi); + apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().createOrUpdate(dmp); + } + return finalDoi; } catch (HttpClientErrorException | HttpServerErrorException ex) { ObjectMapper ob = new ObjectMapper(); Map parsedException = ob.readValue(ex.getResponseBodyAsString(), HashMap.class);