multiple configuration for repository

This commit is contained in:
Aldo Mihasi 2023-06-21 12:38:25 +03:00
parent e56017f083
commit 2acd2b5031
6 changed files with 128 additions and 107 deletions

View File

@ -58,7 +58,7 @@
<dependency>
<groupId>gr.cite.opendmp</groupId>
<artifactId>repositorydepositbase</artifactId>
<version>1.0.3</version>
<version>1.0.4</version>
</dependency>
<dependency>

View File

@ -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<DataverseConfig> getDataverseConfig();
}

View File

@ -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<DataverseConfig> 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<DataverseConfig> 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<List<DataverseConfig>>() {});
} 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) {

View File

@ -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);

View File

@ -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;
}

View File

@ -1,3 +1,2 @@
storage.temp=${STORAGE_TMP_DATAVERSE}
configuration.dataverse=${CONFIGURATION_DATAVERSE}
configuration.dataverse.logo=${CONFIGURATION_LOGO_DATAVERSE}
dataverse_plugin.storage.temp=${STORAGE_TMP_DATAVERSE}
dataverse.plugin.configuration.dataverse=${CONFIGURATION_DATAVERSE}