multiple configuration for repository
This commit is contained in:
parent
70a0d091bb
commit
d256fdf5c6
2
pom.xml
2
pom.xml
|
@ -56,7 +56,7 @@
|
|||
<dependency>
|
||||
<groupId>gr.cite.opendmp</groupId>
|
||||
<artifactId>repositorydepositbase</artifactId>
|
||||
<version>1.0.2</version>
|
||||
<version>1.0.4</version>
|
||||
</dependency>
|
||||
|
||||
<dependency>
|
||||
|
|
|
@ -45,6 +45,8 @@ public class CkanConfig {
|
|||
private String organization;
|
||||
@JsonProperty("hasLogo")
|
||||
private boolean hasLogo;
|
||||
@JsonProperty("logo")
|
||||
private String logo;
|
||||
|
||||
public int getDepositType() {
|
||||
return depositType;
|
||||
|
@ -95,6 +97,13 @@ public class CkanConfig {
|
|||
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);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package eu.eudat.depositinterface.ckanrepository.config;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public interface ConfigLoader {
|
||||
byte[] getLogo();
|
||||
CkanConfig getCkanConfig();
|
||||
byte[] getLogo(String repositoryId);
|
||||
List<CkanConfig> getCkanConfig();
|
||||
}
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
package eu.eudat.depositinterface.ckanrepository.config;
|
||||
|
||||
import com.fasterxml.jackson.core.type.TypeReference;
|
||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
@ -11,41 +12,56 @@ 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("ckanConfigLoader")
|
||||
public class ConfigLoaderImpl implements ConfigLoader{
|
||||
private static final Logger logger = LoggerFactory.getLogger(ConfigLoaderImpl.class);
|
||||
private static final ObjectMapper mapper = new ObjectMapper();
|
||||
|
||||
private CkanConfig ckanConfig;
|
||||
private List<CkanConfig> ckanConfigs = new ArrayList<>();
|
||||
|
||||
private final Environment environment;
|
||||
|
||||
@Autowired
|
||||
private Environment environment;
|
||||
public ConfigLoaderImpl(Environment environment){
|
||||
this.environment = environment;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CkanConfig getCkanConfig() {
|
||||
if(ckanConfig == null){
|
||||
public List<CkanConfig> getCkanConfig() {
|
||||
if(ckanConfigs == null || ckanConfigs.isEmpty()) {
|
||||
try{
|
||||
ckanConfig = mapper.readValue(getStreamFromPath(environment.getProperty("configuration.ckan")), CkanConfig.class);
|
||||
ckanConfigs = mapper.readValue(getStreamFromPath(environment.getProperty("configuration.ckan")), new TypeReference<List<CkanConfig>>() {});
|
||||
} catch (IOException e) {
|
||||
logger.error(e.getLocalizedMessage(), e);
|
||||
}
|
||||
}
|
||||
return ckanConfig;
|
||||
return ckanConfigs;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte[] getLogo() {
|
||||
String logo = environment.getProperty("configuration.logo");
|
||||
if(logo != null && !logo.isEmpty()){
|
||||
InputStream logoStream = getStreamFromPath(logo);
|
||||
try {
|
||||
return logoStream.readAllBytes();
|
||||
}
|
||||
catch (IOException e){
|
||||
logger.error(e.getMessage(), e);
|
||||
return null;
|
||||
public byte[] getLogo(String repositoryId) {
|
||||
if (!ckanConfigs.isEmpty()) {
|
||||
CkanConfig ckanConfig = ckanConfigs.stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null);
|
||||
if (ckanConfig != null) {
|
||||
String logo = ckanConfig.getLogo();
|
||||
InputStream logoStream;
|
||||
if (logo != null && !logo.isEmpty()) {
|
||||
logoStream = getStreamFromPath(logo);
|
||||
}
|
||||
else {
|
||||
logoStream = getClass().getClassLoader().getResourceAsStream("ckan.png");
|
||||
}
|
||||
try {
|
||||
return (logoStream != null) ? logoStream.readAllBytes() : null;
|
||||
}
|
||||
catch (IOException e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
@ -28,14 +28,15 @@ import java.io.IOException;
|
|||
import java.io.OutputStream;
|
||||
import java.nio.file.Files;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@Component
|
||||
public class CkanDeposit implements RepositoryDeposit {
|
||||
private static final Logger logger = LoggerFactory.getLogger(CkanDeposit.class);
|
||||
private static final ObjectMapper objectMapper = new ObjectMapper();
|
||||
|
||||
private ConfigLoader configLoader;
|
||||
private Environment environment;
|
||||
private final ConfigLoader configLoader;
|
||||
private final Environment environment;
|
||||
|
||||
@Autowired
|
||||
public CkanDeposit(ConfigLoader configLoader, Environment environment){
|
||||
|
@ -44,65 +45,70 @@ public class CkanDeposit implements RepositoryDeposit {
|
|||
}
|
||||
|
||||
@Override
|
||||
public String deposit(DMPDepositModel dmpDepositModel, String repositoryAccessToken) throws Exception {
|
||||
public String deposit(String repositoryId, DMPDepositModel dmpDepositModel, String repositoryAccessToken) throws Exception {
|
||||
|
||||
CkanConfig ckanConfig = this.configLoader.getCkanConfig();
|
||||
CkanConfig ckanConfig = this.configLoader.getCkanConfig().stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null);
|
||||
|
||||
String doi;
|
||||
if(ckanConfig != null) {
|
||||
|
||||
CkanDataset dataset = new CkanDataset();
|
||||
dataset.setName(dmpDepositModel.getLabel().replaceAll("[^a-zA-Z0-9]+", "_").toLowerCase());
|
||||
//dataset.setPrivate(!dmpDepositModel.isPublic());
|
||||
dataset.setPrivate(true);
|
||||
dataset.setNotes(dmpDepositModel.getDescription());
|
||||
dataset.setVersion(String.valueOf(dmpDepositModel.getVersion()));
|
||||
dataset.setOwner_org(ckanConfig.getOrganization());
|
||||
dataset.setAuthor("Argos User");
|
||||
dataset.setAuthor_email("argosUser@example.com");
|
||||
String doi;
|
||||
|
||||
if(dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()){
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", ckanConfig.getApiToken());
|
||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
String url = ckanConfig.getRepositoryUrl() + "package_create";
|
||||
Object response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(dataset, headers), Object.class).getBody();
|
||||
Map<String, Object> respMap = objectMapper.convertValue(response, Map.class);
|
||||
respMap = (Map<String, Object>) respMap.get("result");
|
||||
String id = String.valueOf(respMap.get("id"));
|
||||
CkanDataset dataset = new CkanDataset();
|
||||
dataset.setName(dmpDepositModel.getLabel().replaceAll("[^a-zA-Z0-9]+", "_").toLowerCase());
|
||||
//dataset.setPrivate(!dmpDepositModel.isPublic());
|
||||
dataset.setPrivate(true);
|
||||
dataset.setNotes(dmpDepositModel.getDescription());
|
||||
dataset.setVersion(String.valueOf(dmpDepositModel.getVersion()));
|
||||
dataset.setOwner_org(ckanConfig.getOrganization());
|
||||
dataset.setAuthor("Argos User");
|
||||
dataset.setAuthor_email("argosUser@example.com");
|
||||
|
||||
doi = String.valueOf(respMap.get("doi"));
|
||||
if (dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()) {
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", ckanConfig.getApiToken());
|
||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
String url = ckanConfig.getRepositoryUrl() + "package_create";
|
||||
Object response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(dataset, headers), Object.class).getBody();
|
||||
Map<String, Object> respMap = objectMapper.convertValue(response, Map.class);
|
||||
respMap = (Map<String, Object>) respMap.get("result");
|
||||
String id = String.valueOf(respMap.get("id"));
|
||||
|
||||
this.uploadFiles(dmpDepositModel, id);
|
||||
}
|
||||
else{
|
||||
JsonNode datasetJson = this.getDatasetIdentifier(dmpDepositModel.getPreviousDOI()).get(0);
|
||||
String datasetId = datasetJson.get("id").asText();
|
||||
String version = datasetJson.get("version").asText();
|
||||
doi = String.valueOf(respMap.get("doi"));
|
||||
|
||||
JsonNode files = datasetJson.get("resources");
|
||||
if(files.isArray()) {
|
||||
for (JsonNode file : files) {
|
||||
String fileId = file.get("id").asText();
|
||||
this.deleteFile(fileId);
|
||||
this.uploadFiles(ckanConfig, dmpDepositModel, id);
|
||||
} else {
|
||||
JsonNode datasetJson = this.getDatasetIdentifier(ckanConfig, dmpDepositModel.getPreviousDOI()).get(0);
|
||||
String datasetId = datasetJson.get("id").asText();
|
||||
String version = datasetJson.get("version").asText();
|
||||
|
||||
JsonNode files = datasetJson.get("resources");
|
||||
if (files.isArray()) {
|
||||
for (JsonNode file : files) {
|
||||
String fileId = file.get("id").asText();
|
||||
this.deleteFile(ckanConfig, fileId);
|
||||
}
|
||||
}
|
||||
|
||||
this.uploadFiles(ckanConfig, dmpDepositModel, datasetId);
|
||||
|
||||
Map<String, Object> resp = this.updateVersion(ckanConfig, datasetId, version);
|
||||
doi = (String) resp.get("doi");
|
||||
}
|
||||
|
||||
this.uploadFiles(dmpDepositModel, datasetId);
|
||||
return doi;
|
||||
|
||||
Map<String, Object> resp = this.updateVersion(datasetId, version);
|
||||
doi = (String) resp.get("doi");
|
||||
}
|
||||
|
||||
return doi;
|
||||
return null;
|
||||
|
||||
}
|
||||
|
||||
private Map<String, Object> updateVersion(String datasetId, String version){
|
||||
private Map<String, Object> updateVersion(CkanConfig ckanConfig, String datasetId, String version){
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", this.configLoader.getCkanConfig().getApiToken());
|
||||
headers.set("Authorization", ckanConfig.getApiToken());
|
||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
String serverUrl = this.configLoader.getCkanConfig().getRepositoryUrl() + "package_patch";
|
||||
String serverUrl = ckanConfig.getRepositoryUrl() + "package_patch";
|
||||
Map<String, String> body = new HashMap<>();
|
||||
body.put("id", datasetId);
|
||||
body.put("version", String.valueOf(Integer.parseInt(version) + 1));
|
||||
|
@ -110,19 +116,19 @@ public class CkanDeposit implements RepositoryDeposit {
|
|||
return (Map<String, Object>)restTemplate.exchange(serverUrl, HttpMethod.POST, new HttpEntity<>(body, headers), Map.class).getBody().get("result");
|
||||
}
|
||||
|
||||
private void deleteFile(String fileId){
|
||||
private void deleteFile(CkanConfig ckanConfig, String fileId){
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", this.configLoader.getCkanConfig().getApiToken());
|
||||
headers.set("Authorization", ckanConfig.getApiToken());
|
||||
headers.setContentType(MediaType.APPLICATION_JSON);
|
||||
String serverUrl = this.configLoader.getCkanConfig().getRepositoryUrl() + "resource_delete";
|
||||
String serverUrl = ckanConfig.getRepositoryUrl() + "resource_delete";
|
||||
Map<String, String> map = new HashMap<>();
|
||||
map.put("id", fileId);
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
restTemplate.exchange(serverUrl, HttpMethod.POST, new HttpEntity<>(map, headers), Object.class);
|
||||
}
|
||||
|
||||
private void uploadFiles(DMPDepositModel dmpDepositModel, String id) throws IOException {
|
||||
this.uploadFile(dmpDepositModel.getPdfFile().getFilename(), dmpDepositModel.getPdfFile().getFile(), id);
|
||||
private void uploadFiles(CkanConfig ckanConfig, DMPDepositModel dmpDepositModel, String id) throws IOException {
|
||||
this.uploadFile(ckanConfig, dmpDepositModel.getPdfFile().getFilename(), dmpDepositModel.getPdfFile().getFile(), id);
|
||||
|
||||
FileEnvelope rdaJsonEnvelope = dmpDepositModel.getRdaJsonFile();
|
||||
HttpHeaders responseHeaders = new HttpHeaders();
|
||||
|
@ -147,28 +153,28 @@ public class CkanDeposit implements RepositoryDeposit {
|
|||
} catch (IOException e) {
|
||||
logger.error(e.getMessage(), e);
|
||||
}
|
||||
this.uploadFile(jsonFileName, rdaJson, id);
|
||||
this.uploadFile(ckanConfig, jsonFileName, rdaJson, id);
|
||||
Files.deleteIfExists(rdaJson.toPath());
|
||||
|
||||
if(dmpDepositModel.getSupportingFilesZip() != null) {
|
||||
this.uploadFile(dmpDepositModel.getSupportingFilesZip().getName(), dmpDepositModel.getSupportingFilesZip(), id);
|
||||
this.uploadFile(ckanConfig, dmpDepositModel.getSupportingFilesZip().getName(), dmpDepositModel.getSupportingFilesZip(), id);
|
||||
}
|
||||
}
|
||||
|
||||
private JsonNode getDatasetIdentifier(String previousDOI) throws JsonProcessingException {
|
||||
private JsonNode getDatasetIdentifier(CkanConfig ckanConfig, String previousDOI) throws JsonProcessingException {
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.set("Authorization", this.configLoader.getCkanConfig().getApiToken());
|
||||
String serverUrl = this.configLoader.getCkanConfig().getRepositoryUrl() + "package_search?q=doi:" + previousDOI + "&include_private=True";
|
||||
headers.set("Authorization", ckanConfig.getApiToken());
|
||||
String serverUrl = ckanConfig + "package_search?q=doi:" + previousDOI + "&include_private=True";
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
Object response = restTemplate.exchange(serverUrl, HttpMethod.GET, new HttpEntity<>(headers), Map.class).getBody().get("result");
|
||||
JsonNode jsonNode = objectMapper.readTree(new JSONObject((Map<String, Object>)response).toString());
|
||||
return jsonNode.findValues("results").get(0);
|
||||
}
|
||||
|
||||
private void uploadFile(String filename, File file, String datasetId) {
|
||||
private void uploadFile(CkanConfig ckanConfig, String filename, File file, String datasetId) {
|
||||
HttpHeaders headers = new HttpHeaders();
|
||||
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
|
||||
headers.set("Authorization", this.configLoader.getCkanConfig().getApiToken());
|
||||
headers.set("Authorization", ckanConfig.getApiToken());
|
||||
MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder();
|
||||
Resource resource = new FileSystemResource(file);
|
||||
multipartBodyBuilder.part("upload", resource)
|
||||
|
@ -178,30 +184,32 @@ public class CkanDeposit implements RepositoryDeposit {
|
|||
MultiValueMap<String, HttpEntity<?>> multipartBody = multipartBodyBuilder.build();
|
||||
HttpEntity<MultiValueMap<String, HttpEntity<?>>> requestEntity = new HttpEntity<>(multipartBody, headers);
|
||||
|
||||
String serverUrl = this.configLoader.getCkanConfig().getRepositoryUrl() + "resource_create";
|
||||
String serverUrl = ckanConfig.getRepositoryUrl() + "resource_create";
|
||||
|
||||
RestTemplate restTemplate = new RestTemplate();
|
||||
ResponseEntity<Object> resp = restTemplate.postForEntity(serverUrl, requestEntity, Object.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public RepositoryDepositConfiguration getConfiguration() {
|
||||
eu.eudat.depositinterface.ckanrepository.config.CkanConfig ckanConfig = this.configLoader.getCkanConfig();
|
||||
return ckanConfig.toRepoConfig();
|
||||
public List<RepositoryDepositConfiguration> getConfiguration() {
|
||||
List<eu.eudat.depositinterface.ckanrepository.config.CkanConfig> ckanConfigs = this.configLoader.getCkanConfig();
|
||||
return ckanConfigs.stream().map(CkanConfig::toRepoConfig).collect(Collectors.toList());
|
||||
}
|
||||
|
||||
@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;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String authenticate(String code) {
|
||||
public String authenticate(String repositoryId, String code) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,3 +1,2 @@
|
|||
storage.temp=${STORAGE_TMP_CKAN}
|
||||
configuration.ckan=${CONFIGURATION_CKAN}
|
||||
configuration.ckan.logo=${CONFIGURATION_LOGO_CKAN}
|
||||
configuration.ckan=${CONFIGURATION_CKAN}
|
Loading…
Reference in New Issue