repository-deposit-dspace/src/main/java/eu/eudat/depositinterface/dspacerepository/interfaces/DSpaceDeposit.java

144 lines
6.1 KiB
Java

package eu.eudat.depositinterface.dspacerepository.interfaces;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import eu.eudat.depositinterface.dspacerepository.config.ConfigLoader;
import eu.eudat.depositinterface.dspacerepository.config.DSpaceConfig;
import eu.eudat.depositinterface.models.DMPDepositModel;
import eu.eudat.depositinterface.repository.RepositoryDeposit;
import eu.eudat.depositinterface.repository.RepositoryDepositConfiguration;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
@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 String csrfToken;
private String bearerToken;
@Autowired
public DSpaceDeposit(ConfigLoader configLoader, Environment environment){
this.configLoader = configLoader;
this.environment = environment;
}
@Override
public String deposit(DMPDepositModel dmpDepositModel, String repositoryAccessToken) throws Exception {
DSpaceConfig dSpaceConfig = this.configLoader.getDSpaceConfig();
this.setCsrfToken();
this.setBearerToken(dSpaceConfig.getEmail(), dSpaceConfig.getPassword());
if(dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()){
RestTemplate restTemplate = new RestTemplate();
restTemplate.setRequestFactory(new HttpComponentsClientHttpRequestFactory());
HttpHeaders headers = this.createHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
String url = dSpaceConfig.getRepositoryUrl() + "submission/workspaceitems?owningCollection=" + dSpaceConfig.getCollection();
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"));
PatchEntity entity = new PatchEntity();
entity.setOp("add");
entity.setPath("/sections/traditionalpageone/dc.title");
List<Map<String, String>> value = new ArrayList<>();
Map<String, String> title = new HashMap<>();
title.put("value", dmpDepositModel.getLabel());
value.add(title);
entity.setValue(value);
url = dSpaceConfig.getRepositoryUrl() + "submission/workspaceitems/" + id;
List<PatchEntity> entityList = new ArrayList<>();
entityList.add(entity);
logger.debug(objectMapper.writeValueAsString(entityList));
restTemplate.exchange(url, HttpMethod.PATCH, new HttpEntity<>(entityList, headers), Object.class);
entity = new PatchEntity();
entity.setOp("add");
entity.setPath("/sections/traditionalpageone/dc.date.issued");
value = new ArrayList<>();
Map<String, String> date = new HashMap<>();
DateFormat df = new SimpleDateFormat("dd-MM-yyyy");
date.put("value", df.format(new Date()));
value.add(date);
entity.setValue(value);
entityList = new ArrayList<>();
entityList.add(entity);
logger.debug(objectMapper.writeValueAsString(entityList));
restTemplate.exchange(url, HttpMethod.PATCH, new HttpEntity<>(entityList, headers), Object.class);
}
return null;
}
private HttpHeaders createHeaders() {
HttpHeaders headers = new HttpHeaders();
headers.add("X-XSRF-TOKEN", this.csrfToken);
headers.add("Cookie", "DSPACE-XSRF-COOKIE=" + this.csrfToken);
headers.add("Authorization", this.bearerToken);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
return headers;
}
private void setCsrfToken(){
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = restTemplate.exchange(this.configLoader.getDSpaceConfig().getRepositoryUrl(), HttpMethod.GET, null, Object.class).getHeaders();
this.csrfToken = headers.get("DSPACE-XSRF-TOKEN").get(0);
}
private void setBearerToken(String email, String password){
RestTemplate restTemplate = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
headers.add("X-XSRF-TOKEN", this.csrfToken);
headers.add("Cookie", "DSPACE-XSRF-COOKIE=" + this.csrfToken);
MultiValueMap<String, String> map = new LinkedMultiValueMap<>();
map.add("user", email);
map.add("password", password);
HttpEntity<MultiValueMap<String, String>> entity = new HttpEntity<>(map, headers);
this.bearerToken = restTemplate.exchange(this.configLoader.getDSpaceConfig().getRepositoryUrl() + "authn/login", HttpMethod.POST, entity, Object.class).getHeaders().get("Authorization").get(0);
}
@Override
public RepositoryDepositConfiguration getConfiguration() {
eu.eudat.depositinterface.dspacerepository.config.DSpaceConfig dspaceConfig = this.configLoader.getDSpaceConfig();
return dspaceConfig.toRepoConfig();
}
@Override
public String authenticate(String code) {
return null;
}
}