144 lines
6.1 KiB
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;
|
|
}
|
|
}
|