multiple configuration for repository

This commit is contained in:
Aldo Mihasi 2023-06-21 12:39:44 +03:00
parent c53553c25c
commit 09d45d0538
6 changed files with 127 additions and 94 deletions

View File

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

View File

@ -1,6 +1,8 @@
package eu.eudat.depositinterface.dspacerepository.config; package eu.eudat.depositinterface.dspacerepository.config;
import java.util.List;
public interface ConfigLoader { public interface ConfigLoader {
byte[] getLogo(); byte[] getLogo(String repositoryId);
DSpaceConfig getDSpaceConfig(); List<DSpaceConfig> getDSpaceConfig();
} }

View File

@ -1,5 +1,6 @@
package eu.eudat.depositinterface.dspacerepository.config; package eu.eudat.depositinterface.dspacerepository.config;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -8,46 +9,58 @@ import org.springframework.core.env.Environment;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.io.*; import java.io.*;
import java.util.ArrayList;
import java.util.List;
@Service("dspaceConfigLoader") @Service("dspaceConfigLoader")
public class ConfigLoaderImpl implements ConfigLoader{ public class ConfigLoaderImpl implements ConfigLoader{
private static final Logger logger = LoggerFactory.getLogger(ConfigLoaderImpl.class); private static final Logger logger = LoggerFactory.getLogger(ConfigLoaderImpl.class);
private static final ObjectMapper mapper = new ObjectMapper(); private static final ObjectMapper mapper = new ObjectMapper();
private DSpaceConfig dspaceConfig; private List<DSpaceConfig> dSpaceConfigs = new ArrayList<>();
private final Environment environment;
@Autowired @Autowired
private Environment environment; public ConfigLoaderImpl(Environment environment){
this.environment = environment;
}
@Override @Override
public DSpaceConfig getDSpaceConfig() { public List<DSpaceConfig> getDSpaceConfig() {
if(dspaceConfig == null){ if(dSpaceConfigs == null || dSpaceConfigs.isEmpty()){
try{ try{
dspaceConfig = mapper.readValue(getStreamFromPath(environment.getProperty("configuration.dspace")), DSpaceConfig.class); dSpaceConfigs = mapper.readValue(getStreamFromPath(environment.getProperty("configuration.dspace")), new TypeReference<List<DSpaceConfig>>() {});
} catch (IOException e) { } catch (IOException e) {
logger.error(e.getLocalizedMessage(), e); logger.error(e.getLocalizedMessage(), e);
} }
} }
return dspaceConfig; return dSpaceConfigs;
} }
@Override @Override
public byte[] getLogo() { public byte[] getLogo(String repositoryId) {
String logo = environment.getProperty("configuration.logo"); if (!dSpaceConfigs.isEmpty()) {
InputStream logoStream; DSpaceConfig dSpaceConfig = dSpaceConfigs.stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null);
if(logo != null && !logo.isEmpty()) { if (dSpaceConfig != null) {
logoStream = getStreamFromPath(logo); String logo = dSpaceConfig.getLogo();
} InputStream logoStream;
else{ if(logo != null && !logo.isEmpty()) {
logoStream = getClass().getClassLoader().getResourceAsStream("dspace.svg"); logoStream = getStreamFromPath(logo);
} }
try { else{
return (logoStream != null) ? logoStream.readAllBytes() : null; logoStream = getClass().getClassLoader().getResourceAsStream("dspace.svg");
} }
catch (IOException e){ try {
logger.error(e.getMessage(), e); return (logoStream != null) ? logoStream.readAllBytes() : null;
}
catch (IOException e){
logger.error(e.getMessage(), e);
}
}
return null; return null;
} }
return null;
} }
private InputStream getStreamFromPath(String filePath) { private InputStream getStreamFromPath(String filePath) {

View File

@ -51,6 +51,8 @@ public class DSpaceConfig {
private String collection; private String collection;
@JsonProperty("hasLogo") @JsonProperty("hasLogo")
private boolean hasLogo; private boolean hasLogo;
@JsonProperty("logo")
private String logo;
public int getDepositType() { public int getDepositType() {
return depositType; return depositType;
@ -122,6 +124,13 @@ public class DSpaceConfig {
this.hasLogo = hasLogo; this.hasLogo = hasLogo;
} }
public String getLogo() {
return logo;
}
public void setLogo(String logo) {
this.logo = logo;
}
public RepositoryDepositConfiguration toRepoConfig() { public RepositoryDepositConfiguration toRepoConfig() {
RepositoryDepositConfiguration config = new RepositoryDepositConfiguration(); RepositoryDepositConfiguration config = new RepositoryDepositConfiguration();
config.setDepositType(this.depositType); config.setDepositType(this.depositType);

View File

@ -32,14 +32,15 @@ import java.nio.file.Files;
import java.text.DateFormat; import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Component @Component
public class DSpaceDeposit implements RepositoryDeposit { public class DSpaceDeposit implements RepositoryDeposit {
private static final Logger logger = LoggerFactory.getLogger(DSpaceDeposit.class); private static final Logger logger = LoggerFactory.getLogger(DSpaceDeposit.class);
private static final ObjectMapper objectMapper = new ObjectMapper(); private static final ObjectMapper objectMapper = new ObjectMapper();
private ConfigLoader configLoader; private final ConfigLoader configLoader;
private Environment environment; private final Environment environment;
private String csrfToken; private String csrfToken;
private String bearerToken; private String bearerToken;
@ -51,83 +52,90 @@ public class DSpaceDeposit implements RepositoryDeposit {
public DSpaceDeposit(ConfigLoader configLoader, Environment environment){ public DSpaceDeposit(ConfigLoader configLoader, Environment environment){
this.configLoader = configLoader; this.configLoader = configLoader;
this.environment = environment; this.environment = environment;
this.repositoryApiUrl = configLoader.getDSpaceConfig().getRepositoryUrl();
} }
@Override @Override
public String deposit(DMPDepositModel dmpDepositModel, String repositoryAccessToken) throws Exception { public String deposit(String repositoryId, DMPDepositModel dmpDepositModel, String repositoryAccessToken) throws Exception {
DSpaceConfig dSpaceConfig = this.configLoader.getDSpaceConfig(); DSpaceConfig dSpaceConfig = this.configLoader.getDSpaceConfig().stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null);
this.setCsrfToken(); if (dSpaceConfig != null) {
this.setBearerToken(dSpaceConfig.getEmail(), dSpaceConfig.getPassword());
this.setSubmitterId();
if(dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()){ this.repositoryApiUrl = dSpaceConfig.getRepositoryUrl();
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
HttpHeaders headers = this.createHeaders(); this.setCsrfToken();
headers.setContentType(MediaType.APPLICATION_JSON); this.setBearerToken(dSpaceConfig.getEmail(), dSpaceConfig.getPassword());
String url = this.repositoryApiUrl + "submission/workspaceitems?owningCollection=" + dSpaceConfig.getCollection(); this.setSubmitterId();
Object response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>("", headers), Object.class).getBody();
Map<String, Object> respMap = objectMapper.convertValue(response, Map.class);
String id = String.valueOf(respMap.get("id"));
respMap = (Map<String, Object>) respMap.get("_embedded");
respMap = (Map<String, Object>) respMap.get("item");
String itemId = String.valueOf(respMap.get("id"));
url = this.repositoryApiUrl + "submission/workspaceitems/" + id; if (dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()) {
sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.title", dmpDepositModel.getLabel()); RestTemplate restTemplate = new RestTemplate();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.date.issued", df.format(new Date()));
PatchBooleanEntity entity = new PatchBooleanEntity(); HttpHeaders headers = this.createHeaders();
entity.setOp("add"); headers.setContentType(MediaType.APPLICATION_JSON);
entity.setPath("/sections/license/granted"); String url = this.repositoryApiUrl + "submission/workspaceitems?owningCollection=" + dSpaceConfig.getCollection();
entity.setValue(true); Object response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>("", headers), Object.class).getBody();
Map<String, Object> respMap = objectMapper.convertValue(response, Map.class);
String id = String.valueOf(respMap.get("id"));
respMap = (Map<String, Object>) respMap.get("_embedded");
respMap = (Map<String, Object>) respMap.get("item");
String itemId = String.valueOf(respMap.get("id"));
List<PatchBooleanEntity> entityList = new ArrayList<>(); url = this.repositoryApiUrl + "submission/workspaceitems/" + id;
entityList.add(entity); sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.title", dmpDepositModel.getLabel());
logger.debug(objectMapper.writeValueAsString(entityList)); DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
restTemplate.exchange(url, HttpMethod.PATCH, new HttpEntity<>(entityList, headers), Object.class); sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.date.issued", df.format(new Date()));
sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.contributor.author", "Argos User"); PatchBooleanEntity entity = new PatchBooleanEntity();
sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.publisher", "Argos User"); entity.setOp("add");
entity.setPath("/sections/license/granted");
entity.setValue(true);
this.uploadFiles(dmpDepositModel, url); List<PatchBooleanEntity> entityList = new ArrayList<>();
entityList.add(entity);
logger.debug(objectMapper.writeValueAsString(entityList));
restTemplate.exchange(url, HttpMethod.PATCH, new HttpEntity<>(entityList, headers), Object.class);
String workFlowId = this.createWorkflow(url); sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.contributor.author", "Argos User");
sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.publisher", "Argos User");
this.setBearerToken(dSpaceConfig.getWorkflowEmail(), dSpaceConfig.getWorkflowPassword()); this.uploadFiles(dmpDepositModel, url);
String claimedTaskId = this.createClaimedTask(workFlowId);
this.submitTask(claimedTaskId); String workFlowId = this.createWorkflow(url);
return this.getHandle(itemId); this.setBearerToken(dSpaceConfig.getWorkflowEmail(), dSpaceConfig.getWorkflowPassword());
String claimedTaskId = this.createClaimedTask(workFlowId);
this.submitTask(claimedTaskId);
return this.getHandle(itemId);
}
else {
String itemId = this.getItemIdFromHandle(dSpaceConfig.getRepositoryRecordUrl(), dmpDepositModel.getPreviousDOI());
this.setBearerToken(dSpaceConfig.getWorkflowEmail(), dSpaceConfig.getWorkflowPassword());
String workSpaceItemId = this.createNewVersion(itemId);
this.deleteFiles(workSpaceItemId);
String workSpaceItemUrl = this.repositoryApiUrl + "submission/workspaceitems/" + workSpaceItemId;
this.uploadFiles(dmpDepositModel, workSpaceItemUrl);
String workFlowId = this.createWorkflow(workSpaceItemUrl);
String claimedTaskId = this.createClaimedTask(workFlowId);
this.submitTask(claimedTaskId);
return this.getHandle(itemId);
}
} }
else{
String itemId = this.getItemIdFromHandle(dSpaceConfig.getRepositoryRecordUrl(), dmpDepositModel.getPreviousDOI());
this.setBearerToken(dSpaceConfig.getWorkflowEmail(), dSpaceConfig.getWorkflowPassword()); return null;
String workSpaceItemId = this.createNewVersion(itemId);
this.deleteFiles(workSpaceItemId);
String workSpaceItemUrl = this.repositoryApiUrl + "submission/workspaceitems/" + workSpaceItemId;
this.uploadFiles(dmpDepositModel, workSpaceItemUrl);
String workFlowId = this.createWorkflow(workSpaceItemUrl);
String claimedTaskId = this.createClaimedTask(workFlowId);
this.submitTask(claimedTaskId);
return this.getHandle(itemId);
}
} }
@ -372,22 +380,24 @@ public class DSpaceDeposit implements RepositoryDeposit {
} }
@Override @Override
public RepositoryDepositConfiguration getConfiguration() { public List<RepositoryDepositConfiguration> getConfiguration() {
eu.eudat.depositinterface.dspacerepository.config.DSpaceConfig dspaceConfig = this.configLoader.getDSpaceConfig(); List<eu.eudat.depositinterface.dspacerepository.config.DSpaceConfig> dSpaceConfigs = this.configLoader.getDSpaceConfig();
return dspaceConfig.toRepoConfig(); return dSpaceConfigs.stream().map(DSpaceConfig::toRepoConfig).collect(Collectors.toList());
} }
@Override @Override
public String authenticate(String code) { public String authenticate(String repositoryId, String code) {
return null; return null;
} }
@Override @Override
public String getLogo() { public String getLogo(String repositoryId) {
RepositoryDepositConfiguration conf = this.getConfiguration(); RepositoryDepositConfiguration conf = this.getConfiguration().stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null);
if(conf.isHasLogo()){ if(conf != null) {
byte[] logo = this.configLoader.getLogo(); if(conf.isHasLogo()){
return (logo != null && logo.length != 0) ? Base64.getEncoder().encodeToString(logo) : null; byte[] logo = this.configLoader.getLogo(repositoryId);
return (logo != null && logo.length != 0) ? Base64.getEncoder().encodeToString(logo) : null;
}
} }
return null; return null;
} }

View File

@ -1,3 +1,2 @@
storage.temp=${STORAGE_TMP_DSPACE} storage.temp=${STORAGE_TMP_DSPACE}
configuration.dspace=${CONFIGURATION_DSPACE} configuration.dspace=${CONFIGURATION_DSPACE}
configuration.dspace.logo=${CONFIGURATION_LOGO_DSPACE}