Add Zenodo versioning support (ref #221)
This commit is contained in:
parent
8dba2eb543
commit
d522bd7c2f
|
@ -1233,6 +1233,25 @@ public class DataManagementPlanManager {
|
||||||
return (dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getId()).equals(principal.getId());
|
return (dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getId()).equals(principal.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private String getPreviousDOI(UUID groupId, UUID selfId) {
|
||||||
|
DataManagementPlanCriteria criteria = new DataManagementPlanCriteria();
|
||||||
|
List<UUID> groupIds = new ArrayList<>();
|
||||||
|
groupIds.add(groupId);
|
||||||
|
criteria.setGroupIds(groupIds);
|
||||||
|
criteria.setAllVersions(true);
|
||||||
|
List<DMP> dmps = this.databaseRepository.getDmpDao().getWithCriteria(criteria).toList();
|
||||||
|
String doi = null;
|
||||||
|
for (DMP dmp: dmps) {
|
||||||
|
if (!dmp.getId().equals(selfId)) {
|
||||||
|
if (dmp.getDoi() != null && !dmp.getDoi().isEmpty()) {
|
||||||
|
doi = dmp.getDoi();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return doi;
|
||||||
|
}
|
||||||
|
|
||||||
public String createZenodoDoi(UUID id, Principal principal, ConfigLoader configLoader) throws Exception {
|
public String createZenodoDoi(UUID id, Principal principal, ConfigLoader configLoader) throws Exception {
|
||||||
DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id);
|
DMP dmp = this.apiContext.getOperationsContext().getDatabaseRepository().getDmpDao().find(id);
|
||||||
if (!isUserOwnerOfDmp(dmp, principal))
|
if (!isUserOwnerOfDmp(dmp, principal))
|
||||||
|
@ -1253,14 +1272,46 @@ public class DataManagementPlanManager {
|
||||||
" \"upload_type\": \"publication\",\n" +
|
" \"upload_type\": \"publication\",\n" +
|
||||||
" \"publication_type\": \"datamanagementplan\",\n" +
|
" \"publication_type\": \"datamanagementplan\",\n" +
|
||||||
" \"description\": \"" + dmp.getDescription() + "\",\n" +
|
" \"description\": \"" + dmp.getDescription() + "\",\n" +
|
||||||
|
" \"version\": \"" + dmp.getVersion() + "\",\n" +
|
||||||
" \"creators\": [{\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\"name\": \"" + dmp.getUsers().stream().filter(userDMP -> userDMP.getRole().equals(UserDMP.UserDMPRoles.OWNER.getValue())).findFirst().get().getUser().getName() + "\",\n" +
|
||||||
" \t\t\"affiliation\": \"OpenDMP\"}]\n" +
|
" \t\t\"affiliation\": \"OpenDMP\"}]\n" +
|
||||||
" }\n" +
|
" }\n" +
|
||||||
"}";
|
"}";
|
||||||
HttpEntity<String> request = new HttpEntity<>(createData, headers);
|
HttpEntity<String> request = new HttpEntity<>(createData, headers);
|
||||||
|
Map createResponse = null;
|
||||||
|
if (dmp.getVersion() == 0) {
|
||||||
String createUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?access_token=" + this.environment.getProperty("zenodo.access_token");
|
String createUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?access_token=" + this.environment.getProperty("zenodo.access_token");
|
||||||
Map createResponse = restTemplate.postForObject(createUrl, request, Map.class);
|
createResponse = restTemplate.postForObject(createUrl, request, Map.class);
|
||||||
|
} else {
|
||||||
|
//It requires more than one step to create a new version
|
||||||
|
//First, get the deposit related to the concept DOI
|
||||||
|
String listUrl = this.environment.getProperty("zenodo.url") + "deposit/depositions" + "?q=conceptdoi:\"" + this.getPreviousDOI(dmp.getGroupId(), dmp.getId()) + "\"&access_token=" + this.environment.getProperty("zenodo.access_token");
|
||||||
|
ResponseEntity<Map[]> listResponses = restTemplate.getForEntity(listUrl, Map[].class);
|
||||||
|
createResponse = listResponses.getBody()[0];
|
||||||
|
LinkedHashMap<String, String> links = (LinkedHashMap<String, String>) createResponse.get("links");
|
||||||
|
//Second, make the new version (not in the links?)
|
||||||
|
String newVersionUrl = links.get("self") + "/actions/newversion" + "?access_token=" + this.environment.getProperty("zenodo.access_token");
|
||||||
|
createResponse = restTemplate.postForObject(newVersionUrl, null, Map.class);
|
||||||
|
links = (LinkedHashMap<String, String>) createResponse.get("links");
|
||||||
|
//Third, get the new deposit
|
||||||
|
String latestDraftUrl = links.get("latest_draft") + "?access_token=" + this.environment.getProperty("zenodo.access_token");
|
||||||
|
createResponse = restTemplate.getForObject(latestDraftUrl, Map.class);
|
||||||
|
String fileListUrl = links.get("latest_draft") + "/files" + "?access_token=" + this.environment.getProperty("zenodo.access_token");
|
||||||
|
try {
|
||||||
|
//And finally remove pre-existing files from it
|
||||||
|
ResponseEntity<Map[]> fileListResponse = restTemplate.getForEntity(fileListUrl, Map[].class);
|
||||||
|
for (Map file : fileListResponse.getBody()) {
|
||||||
|
String fileDeleteUrl = links.get("latest_draft") + "/files/" + file.get("id") + "?access_token=" + this.environment.getProperty("zenodo.access_token");
|
||||||
|
restTemplate.delete(fileDeleteUrl);
|
||||||
|
}
|
||||||
|
}catch (Exception e) {
|
||||||
|
//In case the last step fail delete the latest Deposit it in order to create a new one (only one at a time is allowed)
|
||||||
|
restTemplate.delete(latestDraftUrl);
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
// Second step, add the file to the entry.
|
// Second step, add the file to the entry.
|
||||||
HttpHeaders fileHeaders = new HttpHeaders();
|
HttpHeaders fileHeaders = new HttpHeaders();
|
||||||
|
|
Loading…
Reference in New Issue