From 2acd2b5031fe5354887c74cfbe45e77b16780ccd Mon Sep 17 00:00:00 2001 From: Aldo Mihasi Date: Wed, 21 Jun 2023 12:38:25 +0300 Subject: [PATCH] multiple configuration for repository --- pom.xml | 2 +- .../config/ConfigLoader.java | 6 +- .../config/ConfigLoaderImpl.java | 53 +++--- .../config/DataverseConfig.java | 9 + .../interfaces/DataverseDeposit.java | 160 +++++++++--------- src/main/resources/application.properties | 5 +- 6 files changed, 128 insertions(+), 107 deletions(-) diff --git a/pom.xml b/pom.xml index b400bb7..486eb21 100644 --- a/pom.xml +++ b/pom.xml @@ -58,7 +58,7 @@ gr.cite.opendmp repositorydepositbase - 1.0.3 + 1.0.4 diff --git a/src/main/java/eu/eudat/depositinterface/dataverserepository/config/ConfigLoader.java b/src/main/java/eu/eudat/depositinterface/dataverserepository/config/ConfigLoader.java index 9d1f841..34d71a8 100644 --- a/src/main/java/eu/eudat/depositinterface/dataverserepository/config/ConfigLoader.java +++ b/src/main/java/eu/eudat/depositinterface/dataverserepository/config/ConfigLoader.java @@ -1,6 +1,8 @@ package eu.eudat.depositinterface.dataverserepository.config; +import java.util.List; + public interface ConfigLoader { - byte[] getLogo(); - DataverseConfig getDataverseConfig(); + byte[] getLogo(String repositoryId); + List getDataverseConfig(); } diff --git a/src/main/java/eu/eudat/depositinterface/dataverserepository/config/ConfigLoaderImpl.java b/src/main/java/eu/eudat/depositinterface/dataverserepository/config/ConfigLoaderImpl.java index 0c37067..ec4ec14 100644 --- a/src/main/java/eu/eudat/depositinterface/dataverserepository/config/ConfigLoaderImpl.java +++ b/src/main/java/eu/eudat/depositinterface/dataverserepository/config/ConfigLoaderImpl.java @@ -1,5 +1,6 @@ package eu.eudat.depositinterface.dataverserepository.config; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -11,46 +12,58 @@ import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; +import java.util.ArrayList; +import java.util.List; @Service("dataverseConfigLoader") public class ConfigLoaderImpl implements ConfigLoader{ private static final Logger logger = LoggerFactory.getLogger(ConfigLoaderImpl.class); private static final ObjectMapper mapper = new ObjectMapper(); - private DataverseConfig dataverseConfig; + private List dataverseConfigs = new ArrayList<>(); + + private final Environment environment; @Autowired - private Environment environment; + public ConfigLoaderImpl(Environment environment){ + this.environment = environment; + } @Override - public DataverseConfig getDataverseConfig() { - if(dataverseConfig == null){ + public List getDataverseConfig() { + if(dataverseConfigs == null || dataverseConfigs.isEmpty()){ try{ - dataverseConfig = mapper.readValue(getStreamFromPath(environment.getProperty("configuration.dataverse")), DataverseConfig.class); + dataverseConfigs = mapper.readValue(getStreamFromPath(environment.getProperty("dataverse.plugin.configuration.dataverse")), new TypeReference>() {}); } catch (IOException e) { logger.error(e.getLocalizedMessage(), e); } } - return dataverseConfig; + return dataverseConfigs; } @Override - public byte[] getLogo() { - String logo = environment.getProperty("configuration.dataverse.logo"); - InputStream logoStream; - if(logo != null && !logo.isEmpty()) { - logoStream = getStreamFromPath(logo); - } - else{ - logoStream = getClass().getClassLoader().getResourceAsStream("dataverse.png"); - } - try { - return (logoStream != null) ? logoStream.readAllBytes() : null; - } - catch (IOException e){ - logger.error(e.getMessage(), e); + public byte[] getLogo(String repositoryId) { + if (!dataverseConfigs.isEmpty()) { + DataverseConfig dataverseConfig = dataverseConfigs.stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null); + if (dataverseConfig != null) { + String logo = dataverseConfig.getLogo(); + InputStream logoStream; + if (logo != null && !logo.isEmpty()) { + logoStream = getStreamFromPath(logo); + } + else { + logoStream = getClass().getClassLoader().getResourceAsStream("dataverse.png"); + } + try { + return (logoStream != null) ? logoStream.readAllBytes() : null; + } + catch (IOException e) { + logger.error(e.getMessage(), e); + } + } return null; } + return null; } private InputStream getStreamFromPath(String filePath) { diff --git a/src/main/java/eu/eudat/depositinterface/dataverserepository/config/DataverseConfig.java b/src/main/java/eu/eudat/depositinterface/dataverserepository/config/DataverseConfig.java index f1f95a7..f99770f 100644 --- a/src/main/java/eu/eudat/depositinterface/dataverserepository/config/DataverseConfig.java +++ b/src/main/java/eu/eudat/depositinterface/dataverserepository/config/DataverseConfig.java @@ -47,6 +47,8 @@ public class DataverseConfig { private String parentDataverseAlias; @JsonProperty("hasLogo") private boolean hasLogo; + @JsonProperty("logo") + private String logo; public int getDepositType() { return depositType; @@ -104,6 +106,13 @@ public class DataverseConfig { this.hasLogo = hasLogo; } + public String getLogo() { + return logo; + } + public void setLogo(String logo) { + this.logo = logo; + } + public RepositoryDepositConfiguration toRepoConfig() { RepositoryDepositConfiguration config = new RepositoryDepositConfiguration(); config.setDepositType(this.depositType); diff --git a/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java b/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java index ab2b5c2..3b57452 100644 --- a/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java +++ b/src/main/java/eu/eudat/depositinterface/dataverserepository/interfaces/DataverseDeposit.java @@ -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 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 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 = api.getDatasetOperations().publishDataset(id, MAJOR); + doi = publishedDataset.getData().getAuthority() + "/" + publishedDataset.getData().getIdentifier(); + } + + + return doi; - this.api.getDatasetOperations().updateDataset(dataset, id); - DataverseResponse 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 getDatasetIdentifier(String previousDOI) { + private Map 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) 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 fileMap = new LinkedMultiValueMap<>(); ContentDisposition contentDisposition = ContentDisposition .builder("form-data") @@ -202,29 +198,31 @@ public class DataverseDeposit implements RepositoryDeposit { HttpEntity> 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 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 getConfiguration() { + List 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; } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b8441d5..e6c1df1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,2 @@ -storage.temp=${STORAGE_TMP_DATAVERSE} -configuration.dataverse=${CONFIGURATION_DATAVERSE} -configuration.dataverse.logo=${CONFIGURATION_LOGO_DATAVERSE} \ No newline at end of file +dataverse_plugin.storage.temp=${STORAGE_TMP_DATAVERSE} +dataverse.plugin.configuration.dataverse=${CONFIGURATION_DATAVERSE} \ No newline at end of file