|
|
|
@ -45,89 +45,85 @@ public class DataverseDeposit implements RepositoryDeposit {
|
|
|
|
|
private static final Logger logger = LoggerFactory.getLogger(DataverseDeposit.class);
|
|
|
|
|
private static final ObjectMapper objectMapper = new ObjectMapper();
|
|
|
|
|
|
|
|
|
|
private DataverseAPI api;
|
|
|
|
|
private boolean isApiSet;
|
|
|
|
|
|
|
|
|
|
private ConfigLoader configLoader;
|
|
|
|
|
private Environment environment;
|
|
|
|
|
private final ConfigLoader configLoader;
|
|
|
|
|
private final Environment environment;
|
|
|
|
|
|
|
|
|
|
@Autowired
|
|
|
|
|
public DataverseDeposit(ConfigLoader configLoader, Environment environment){
|
|
|
|
|
this.configLoader = configLoader;
|
|
|
|
|
this.environment = environment;
|
|
|
|
|
this.isApiSet = false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void setDataverseApi() throws MalformedURLException {
|
|
|
|
|
if(!this.isApiSet) {
|
|
|
|
|
this.api = new DataverseAPIImpl();
|
|
|
|
|
eu.eudat.depositinterface.dataverserepository.config.DataverseConfig jsonConfig = this.configLoader.getDataverseConfig();
|
|
|
|
|
DataverseConfig config = new DataverseConfig(new URL(jsonConfig.getServer()), jsonConfig.getApiToken(), jsonConfig.getParentDataverseAlias());
|
|
|
|
|
api.configure(config);
|
|
|
|
|
this.isApiSet = true;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String deposit(DMPDepositModel dmpDepositModel, String repositoryAccessToken) throws Exception {
|
|
|
|
|
public String deposit(String repositoryId, DMPDepositModel dmpDepositModel, String repositoryAccessToken) throws Exception {
|
|
|
|
|
|
|
|
|
|
if(!this.isApiSet)
|
|
|
|
|
this.setDataverseApi();
|
|
|
|
|
eu.eudat.depositinterface.dataverserepository.config.DataverseConfig jsonConfig = this.configLoader.getDataverseConfig().stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null);
|
|
|
|
|
|
|
|
|
|
String dmpDescription = dmpDepositModel.getDescription();
|
|
|
|
|
if(dmpDescription == null || dmpDescription.isEmpty()){
|
|
|
|
|
dmpDescription = "-";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String doi;
|
|
|
|
|
DatasetFacade dataset = DatasetFacade.builder()
|
|
|
|
|
.title(dmpDepositModel.getLabel())
|
|
|
|
|
.authors(dmpDepositModel.getUsers().stream().map(x -> DatasetAuthor.builder().authorName(x.getUser().getName()).build()).collect(Collectors.toList()))
|
|
|
|
|
.contacts(dmpDepositModel.getUsers().stream().map(x -> DatasetContact.builder().datasetContactEmail(x.getUser().getEmail()).build()).collect(Collectors.toList()))
|
|
|
|
|
.subject("Other")
|
|
|
|
|
.description(DatasetDescription.builder().description(dmpDescription).build())
|
|
|
|
|
.languages(new ArrayList<>())
|
|
|
|
|
.depositor("")
|
|
|
|
|
.build();
|
|
|
|
|
if(jsonConfig != null) {
|
|
|
|
|
|
|
|
|
|
if(dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()){
|
|
|
|
|
Identifier id = this.api.getDataverseOperations().createDataset(dataset, this.configLoader.getDataverseConfig().getParentDataverseAlias());
|
|
|
|
|
DataverseAPI api = new DataverseAPIImpl();
|
|
|
|
|
DataverseConfig config = new DataverseConfig(new URL(jsonConfig.getServer()), jsonConfig.getApiToken(), jsonConfig.getParentDataverseAlias());
|
|
|
|
|
api.configure(config);
|
|
|
|
|
|
|
|
|
|
doi = this.api.getDatasetOperations().getDataset(id).getDoiId().orElse(null);
|
|
|
|
|
|
|
|
|
|
this.uploadFiles(dmpDepositModel, doi);
|
|
|
|
|
|
|
|
|
|
this.api.getDatasetOperations().publishDataset(id, MAJOR);
|
|
|
|
|
}
|
|
|
|
|
else{
|
|
|
|
|
Map<String, Object> datasetJson = this.getDatasetIdentifier(dmpDepositModel.getPreviousDOI());
|
|
|
|
|
Identifier id = new Identifier();
|
|
|
|
|
id.setId(((Integer) datasetJson.get("id")).longValue());
|
|
|
|
|
JsonNode jsonNode = objectMapper.convertValue(datasetJson, JsonNode.class);
|
|
|
|
|
JsonNode latestVersion = jsonNode.get("latestVersion");
|
|
|
|
|
JsonNode files = latestVersion.get("files");
|
|
|
|
|
if(files.isArray()){
|
|
|
|
|
for (JsonNode file : files) {
|
|
|
|
|
int fileId = file.get("dataFile").get("id").asInt();
|
|
|
|
|
this.deleteFile(fileId);
|
|
|
|
|
}
|
|
|
|
|
String dmpDescription = dmpDepositModel.getDescription();
|
|
|
|
|
if (dmpDescription == null || dmpDescription.isEmpty()) {
|
|
|
|
|
dmpDescription = "-";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.uploadFiles(dmpDepositModel, dmpDepositModel.getPreviousDOI());
|
|
|
|
|
String doi;
|
|
|
|
|
DatasetFacade dataset = DatasetFacade.builder()
|
|
|
|
|
.title(dmpDepositModel.getLabel())
|
|
|
|
|
.authors(dmpDepositModel.getUsers().stream().map(x -> DatasetAuthor.builder().authorName(x.getUser().getName()).build()).collect(Collectors.toList()))
|
|
|
|
|
.contacts(dmpDepositModel.getUsers().stream().map(x -> DatasetContact.builder().datasetContactEmail(x.getUser().getEmail()).build()).collect(Collectors.toList()))
|
|
|
|
|
.subject("Other")
|
|
|
|
|
.description(DatasetDescription.builder().description(dmpDescription).build())
|
|
|
|
|
.languages(new ArrayList<>())
|
|
|
|
|
.depositor("")
|
|
|
|
|
.build();
|
|
|
|
|
|
|
|
|
|
if (dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()) {
|
|
|
|
|
Identifier id = api.getDataverseOperations().createDataset(dataset, jsonConfig.getParentDataverseAlias());
|
|
|
|
|
|
|
|
|
|
doi = api.getDatasetOperations().getDataset(id).getDoiId().orElse(null);
|
|
|
|
|
|
|
|
|
|
this.uploadFiles(jsonConfig, dmpDepositModel, doi);
|
|
|
|
|
|
|
|
|
|
api.getDatasetOperations().publishDataset(id, MAJOR);
|
|
|
|
|
} else {
|
|
|
|
|
Map<String, Object> datasetJson = this.getDatasetIdentifier(jsonConfig, dmpDepositModel.getPreviousDOI());
|
|
|
|
|
Identifier id = new Identifier();
|
|
|
|
|
id.setId(((Integer) datasetJson.get("id")).longValue());
|
|
|
|
|
JsonNode jsonNode = objectMapper.convertValue(datasetJson, JsonNode.class);
|
|
|
|
|
JsonNode latestVersion = jsonNode.get("latestVersion");
|
|
|
|
|
JsonNode files = latestVersion.get("files");
|
|
|
|
|
if (files.isArray()) {
|
|
|
|
|
for (JsonNode file : files) {
|
|
|
|
|
int fileId = file.get("dataFile").get("id").asInt();
|
|
|
|
|
this.deleteFile(jsonConfig, fileId);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.uploadFiles(jsonConfig, dmpDepositModel, dmpDepositModel.getPreviousDOI());
|
|
|
|
|
|
|
|
|
|
api.getDatasetOperations().updateDataset(dataset, id);
|
|
|
|
|
DataverseResponse<PublishedDataset> publishedDataset = api.getDatasetOperations().publishDataset(id, MAJOR);
|
|
|
|
|
doi = publishedDataset.getData().getAuthority() + "/" + publishedDataset.getData().getIdentifier();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return doi;
|
|
|
|
|
|
|
|
|
|
this.api.getDatasetOperations().updateDataset(dataset, id);
|
|
|
|
|
DataverseResponse<PublishedDataset> publishedDataset = this.api.getDatasetOperations().publishDataset(id, MAJOR);
|
|
|
|
|
doi = publishedDataset.getData().getAuthority() + "/" + publishedDataset.getData().getIdentifier();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return doi;
|
|
|
|
|
return null;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void deleteFile(int fileId){
|
|
|
|
|
HttpHeaders headers = this.createBasicAuthHeaders(this.configLoader.getDataverseConfig().getApiToken(), "");
|
|
|
|
|
String serverUrl = this.configLoader.getDataverseConfig().getServer() + "/dvn/api/data-deposit/v1.1/swordv2/edit-media/file/" + fileId;
|
|
|
|
|
private void deleteFile(eu.eudat.depositinterface.dataverserepository.config.DataverseConfig jsonConfig, int fileId){
|
|
|
|
|
HttpHeaders headers = this.createBasicAuthHeaders(jsonConfig.getApiToken(), "");
|
|
|
|
|
String serverUrl = jsonConfig.getServer() + "/dvn/api/data-deposit/v1.1/swordv2/edit-media/file/" + fileId;
|
|
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
|
|
restTemplate.exchange(serverUrl, HttpMethod.DELETE, new HttpEntity<>(headers), Object.class);
|
|
|
|
|
}
|
|
|
|
@ -142,8 +138,8 @@ public class DataverseDeposit implements RepositoryDeposit {
|
|
|
|
|
}};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void uploadFiles(DMPDepositModel dmpDepositModel, String doi) throws IOException {
|
|
|
|
|
this.uploadFile(dmpDepositModel.getPdfFile().getFilename(), dmpDepositModel.getPdfFile().getFile(), doi);
|
|
|
|
|
private void uploadFiles(eu.eudat.depositinterface.dataverserepository.config.DataverseConfig jsonConfig, DMPDepositModel dmpDepositModel, String doi) throws IOException {
|
|
|
|
|
this.uploadFile(jsonConfig, dmpDepositModel.getPdfFile().getFilename(), dmpDepositModel.getPdfFile().getFile(), doi);
|
|
|
|
|
|
|
|
|
|
FileEnvelope rdaJsonEnvelope = dmpDepositModel.getRdaJsonFile();
|
|
|
|
|
HttpHeaders responseHeaders = new HttpHeaders();
|
|
|
|
@ -159,7 +155,7 @@ public class DataverseDeposit implements RepositoryDeposit {
|
|
|
|
|
|
|
|
|
|
String contentDisposition = jsonFile.getHeaders().get("Content-Disposition").get(0);
|
|
|
|
|
String jsonFileName = contentDisposition.substring(contentDisposition.lastIndexOf('=') + 1);
|
|
|
|
|
File rdaJson = new File(this.environment.getProperty("storage.temp") + jsonFileName);
|
|
|
|
|
File rdaJson = new File(this.environment.getProperty("dataverse_plugin.storage.temp") + jsonFileName);
|
|
|
|
|
OutputStream output = new FileOutputStream(rdaJson);
|
|
|
|
|
try {
|
|
|
|
|
output.write(Objects.requireNonNull(jsonFile.getBody()));
|
|
|
|
@ -168,26 +164,26 @@ public class DataverseDeposit implements RepositoryDeposit {
|
|
|
|
|
} catch (IOException e) {
|
|
|
|
|
logger.error(e.getMessage(), e);
|
|
|
|
|
}
|
|
|
|
|
this.uploadFile(jsonFileName, rdaJson, doi);
|
|
|
|
|
this.uploadFile(jsonConfig, jsonFileName, rdaJson, doi);
|
|
|
|
|
Files.deleteIfExists(rdaJson.toPath());
|
|
|
|
|
|
|
|
|
|
if(dmpDepositModel.getSupportingFilesZip() != null) {
|
|
|
|
|
this.uploadFile(dmpDepositModel.getSupportingFilesZip().getName(), dmpDepositModel.getSupportingFilesZip(), doi);
|
|
|
|
|
this.uploadFile(jsonConfig, dmpDepositModel.getSupportingFilesZip().getName(), dmpDepositModel.getSupportingFilesZip(), doi);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private Map<String, Object> getDatasetIdentifier(String previousDOI) {
|
|
|
|
|
private Map<String, Object> getDatasetIdentifier(eu.eudat.depositinterface.dataverserepository.config.DataverseConfig jsonConfig, String previousDOI) {
|
|
|
|
|
HttpHeaders headers = new HttpHeaders();
|
|
|
|
|
headers.set("X-Dataverse-key", this.configLoader.getDataverseConfig().getApiToken());
|
|
|
|
|
String serverUrl = this.configLoader.getDataverseConfig().getServer() + "/api/datasets/:persistentId?persistentId=doi:" + previousDOI;
|
|
|
|
|
headers.set("X-Dataverse-key", jsonConfig.getApiToken());
|
|
|
|
|
String serverUrl = jsonConfig.getServer() + "/api/datasets/:persistentId?persistentId=doi:" + previousDOI;
|
|
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
|
|
return (Map<String, Object>) restTemplate.exchange(serverUrl, HttpMethod.GET, new HttpEntity<>(headers), Map.class).getBody().get("data");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private void uploadFile(String filename, File file, String doi) throws IOException {
|
|
|
|
|
private void uploadFile(eu.eudat.depositinterface.dataverserepository.config.DataverseConfig jsonConfig, String filename, File file, String doi) throws IOException {
|
|
|
|
|
HttpHeaders headers = new HttpHeaders();
|
|
|
|
|
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
|
|
|
|
|
headers.set("X-Dataverse-key", this.configLoader.getDataverseConfig().getApiToken());
|
|
|
|
|
headers.set("X-Dataverse-key", jsonConfig.getApiToken());
|
|
|
|
|
MultiValueMap<String, String> fileMap = new LinkedMultiValueMap<>();
|
|
|
|
|
ContentDisposition contentDisposition = ContentDisposition
|
|
|
|
|
.builder("form-data")
|
|
|
|
@ -202,29 +198,31 @@ public class DataverseDeposit implements RepositoryDeposit {
|
|
|
|
|
HttpEntity<MultiValueMap<String, Object>> requestEntity
|
|
|
|
|
= new HttpEntity<>(body, headers);
|
|
|
|
|
|
|
|
|
|
String serverUrl = this.configLoader.getDataverseConfig().getServer() + "/api/datasets/:persistentId/add?persistentId=doi:" + doi;
|
|
|
|
|
String serverUrl = jsonConfig.getServer() + "/api/datasets/:persistentId/add?persistentId=doi:" + doi;
|
|
|
|
|
|
|
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
|
|
ResponseEntity<Object> resp = restTemplate.postForEntity(serverUrl, requestEntity, Object.class);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public RepositoryDepositConfiguration getConfiguration() {
|
|
|
|
|
eu.eudat.depositinterface.dataverserepository.config.DataverseConfig dataverseConfig = this.configLoader.getDataverseConfig();
|
|
|
|
|
return dataverseConfig.toRepoConfig();
|
|
|
|
|
public List<RepositoryDepositConfiguration> getConfiguration() {
|
|
|
|
|
List<eu.eudat.depositinterface.dataverserepository.config.DataverseConfig> dataverseConfigs = this.configLoader.getDataverseConfig();
|
|
|
|
|
return dataverseConfigs.stream().map(eu.eudat.depositinterface.dataverserepository.config.DataverseConfig::toRepoConfig).collect(Collectors.toList());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String authenticate(String code) {
|
|
|
|
|
public String authenticate(String repositoryId, String code) {
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
@Override
|
|
|
|
|
public String getLogo() {
|
|
|
|
|
RepositoryDepositConfiguration conf = this.getConfiguration();
|
|
|
|
|
if(conf.isHasLogo()){
|
|
|
|
|
byte[] logo = this.configLoader.getLogo();
|
|
|
|
|
return (logo != null && logo.length != 0) ? Base64.getEncoder().encodeToString(logo) : null;
|
|
|
|
|
public String getLogo(String repositoryId) {
|
|
|
|
|
RepositoryDepositConfiguration conf = this.getConfiguration().stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null);
|
|
|
|
|
if(conf != null) {
|
|
|
|
|
if (conf.isHasLogo()) {
|
|
|
|
|
byte[] logo = this.configLoader.getLogo(repositoryId);
|
|
|
|
|
return (logo != null && logo.length != 0) ? Base64.getEncoder().encodeToString(logo) : null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|