diff --git a/pom.xml b/pom.xml index dc3c853..54b5b87 100644 --- a/pom.xml +++ b/pom.xml @@ -52,7 +52,7 @@ gr.cite.opendmp repositorydepositbase - 1.0.2 + 1.0.4 diff --git a/src/main/java/eu/eudat/depositinterface/dspacerepository/config/ConfigLoader.java b/src/main/java/eu/eudat/depositinterface/dspacerepository/config/ConfigLoader.java index 4eca44b..1060f4c 100644 --- a/src/main/java/eu/eudat/depositinterface/dspacerepository/config/ConfigLoader.java +++ b/src/main/java/eu/eudat/depositinterface/dspacerepository/config/ConfigLoader.java @@ -1,6 +1,8 @@ package eu.eudat.depositinterface.dspacerepository.config; +import java.util.List; + public interface ConfigLoader { - byte[] getLogo(); - DSpaceConfig getDSpaceConfig(); + byte[] getLogo(String repositoryId); + List getDSpaceConfig(); } diff --git a/src/main/java/eu/eudat/depositinterface/dspacerepository/config/ConfigLoaderImpl.java b/src/main/java/eu/eudat/depositinterface/dspacerepository/config/ConfigLoaderImpl.java index 01b17e1..d3c6356 100644 --- a/src/main/java/eu/eudat/depositinterface/dspacerepository/config/ConfigLoaderImpl.java +++ b/src/main/java/eu/eudat/depositinterface/dspacerepository/config/ConfigLoaderImpl.java @@ -1,5 +1,6 @@ package eu.eudat.depositinterface.dspacerepository.config; +import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.ObjectMapper; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -8,46 +9,58 @@ import org.springframework.core.env.Environment; import org.springframework.stereotype.Service; import java.io.*; +import java.util.ArrayList; +import java.util.List; @Service("dspaceConfigLoader") public class ConfigLoaderImpl implements ConfigLoader{ private static final Logger logger = LoggerFactory.getLogger(ConfigLoaderImpl.class); private static final ObjectMapper mapper = new ObjectMapper(); - private DSpaceConfig dspaceConfig; + private List dSpaceConfigs = new ArrayList<>(); + + private final Environment environment; @Autowired - private Environment environment; + public ConfigLoaderImpl(Environment environment){ + this.environment = environment; + } @Override - public DSpaceConfig getDSpaceConfig() { - if(dspaceConfig == null){ + public List getDSpaceConfig() { + if(dSpaceConfigs == null || dSpaceConfigs.isEmpty()){ try{ - dspaceConfig = mapper.readValue(getStreamFromPath(environment.getProperty("configuration.dspace")), DSpaceConfig.class); + dSpaceConfigs = mapper.readValue(getStreamFromPath(environment.getProperty("configuration.dspace")), new TypeReference>() {}); } catch (IOException e) { logger.error(e.getLocalizedMessage(), e); } } - return dspaceConfig; + return dSpaceConfigs; } @Override - public byte[] getLogo() { - String logo = environment.getProperty("configuration.logo"); - InputStream logoStream; - if(logo != null && !logo.isEmpty()) { - logoStream = getStreamFromPath(logo); - } - else{ - logoStream = getClass().getClassLoader().getResourceAsStream("dspace.svg"); - } - try { - return (logoStream != null) ? logoStream.readAllBytes() : null; - } - catch (IOException e){ - logger.error(e.getMessage(), e); + public byte[] getLogo(String repositoryId) { + if (!dSpaceConfigs.isEmpty()) { + DSpaceConfig dSpaceConfig = dSpaceConfigs.stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null); + if (dSpaceConfig != null) { + String logo = dSpaceConfig.getLogo(); + InputStream logoStream; + if(logo != null && !logo.isEmpty()) { + logoStream = getStreamFromPath(logo); + } + else{ + logoStream = getClass().getClassLoader().getResourceAsStream("dspace.svg"); + } + 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/dspacerepository/config/DSpaceConfig.java b/src/main/java/eu/eudat/depositinterface/dspacerepository/config/DSpaceConfig.java index 834c45f..c7ec791 100644 --- a/src/main/java/eu/eudat/depositinterface/dspacerepository/config/DSpaceConfig.java +++ b/src/main/java/eu/eudat/depositinterface/dspacerepository/config/DSpaceConfig.java @@ -51,6 +51,8 @@ public class DSpaceConfig { private String collection; @JsonProperty("hasLogo") private boolean hasLogo; + @JsonProperty("logo") + private String logo; public int getDepositType() { return depositType; @@ -122,6 +124,13 @@ public class DSpaceConfig { 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/dspacerepository/interfaces/DSpaceDeposit.java b/src/main/java/eu/eudat/depositinterface/dspacerepository/interfaces/DSpaceDeposit.java index 2262bc2..1e74a78 100644 --- a/src/main/java/eu/eudat/depositinterface/dspacerepository/interfaces/DSpaceDeposit.java +++ b/src/main/java/eu/eudat/depositinterface/dspacerepository/interfaces/DSpaceDeposit.java @@ -32,14 +32,15 @@ import java.nio.file.Files; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; @Component public class DSpaceDeposit implements RepositoryDeposit { private static final Logger logger = LoggerFactory.getLogger(DSpaceDeposit.class); private static final ObjectMapper objectMapper = new ObjectMapper(); - private ConfigLoader configLoader; - private Environment environment; + private final ConfigLoader configLoader; + private final Environment environment; private String csrfToken; private String bearerToken; @@ -51,83 +52,90 @@ public class DSpaceDeposit implements RepositoryDeposit { public DSpaceDeposit(ConfigLoader configLoader, Environment environment){ this.configLoader = configLoader; this.environment = environment; - this.repositoryApiUrl = configLoader.getDSpaceConfig().getRepositoryUrl(); } @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(); - this.setBearerToken(dSpaceConfig.getEmail(), dSpaceConfig.getPassword()); - this.setSubmitterId(); + if (dSpaceConfig != null) { - if(dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()){ - RestTemplate restTemplate = new RestTemplate(); - restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); + this.repositoryApiUrl = dSpaceConfig.getRepositoryUrl(); - HttpHeaders headers = this.createHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - String url = this.repositoryApiUrl + "submission/workspaceitems?owningCollection=" + dSpaceConfig.getCollection(); - Object response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>("", headers), Object.class).getBody(); - Map respMap = objectMapper.convertValue(response, Map.class); - String id = String.valueOf(respMap.get("id")); - respMap = (Map) respMap.get("_embedded"); - respMap = (Map) respMap.get("item"); - String itemId = String.valueOf(respMap.get("id")); + this.setCsrfToken(); + this.setBearerToken(dSpaceConfig.getEmail(), dSpaceConfig.getPassword()); + this.setSubmitterId(); - url = this.repositoryApiUrl + "submission/workspaceitems/" + id; - sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.title", dmpDepositModel.getLabel()); - DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); - sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.date.issued", df.format(new Date())); + if (dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()) { + RestTemplate restTemplate = new RestTemplate(); + restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory()); - PatchBooleanEntity entity = new PatchBooleanEntity(); - entity.setOp("add"); - entity.setPath("/sections/license/granted"); - entity.setValue(true); + HttpHeaders headers = this.createHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); + String url = this.repositoryApiUrl + "submission/workspaceitems?owningCollection=" + dSpaceConfig.getCollection(); + Object response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>("", headers), Object.class).getBody(); + Map respMap = objectMapper.convertValue(response, Map.class); + String id = String.valueOf(respMap.get("id")); + respMap = (Map) respMap.get("_embedded"); + respMap = (Map) respMap.get("item"); + String itemId = String.valueOf(respMap.get("id")); - List entityList = new ArrayList<>(); - entityList.add(entity); - logger.debug(objectMapper.writeValueAsString(entityList)); - restTemplate.exchange(url, HttpMethod.PATCH, new HttpEntity<>(entityList, headers), Object.class); + url = this.repositoryApiUrl + "submission/workspaceitems/" + id; + sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.title", dmpDepositModel.getLabel()); + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.date.issued", df.format(new Date())); - sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.contributor.author", "Argos User"); - sendPatchRequest(url, "add", "/sections/traditionalpageone/dc.publisher", "Argos User"); + PatchBooleanEntity entity = new PatchBooleanEntity(); + entity.setOp("add"); + entity.setPath("/sections/license/granted"); + entity.setValue(true); - this.uploadFiles(dmpDepositModel, url); + List 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()); - String claimedTaskId = this.createClaimedTask(workFlowId); + this.uploadFiles(dmpDepositModel, url); - 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()); - 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); - - } + return null; } @@ -372,22 +380,24 @@ public class DSpaceDeposit implements RepositoryDeposit { } @Override - public RepositoryDepositConfiguration getConfiguration() { - eu.eudat.depositinterface.dspacerepository.config.DSpaceConfig dspaceConfig = this.configLoader.getDSpaceConfig(); - return dspaceConfig.toRepoConfig(); + public List getConfiguration() { + List dSpaceConfigs = this.configLoader.getDSpaceConfig(); + return dSpaceConfigs.stream().map(DSpaceConfig::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 4507f9f..acfb7b1 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,2 @@ storage.temp=${STORAGE_TMP_DSPACE} -configuration.dspace=${CONFIGURATION_DSPACE} -configuration.dspace.logo=${CONFIGURATION_LOGO_DSPACE} \ No newline at end of file +configuration.dspace=${CONFIGURATION_DSPACE} \ No newline at end of file