multiple configuration for repository

This commit is contained in:
Aldo Mihasi 2023-06-21 12:40:59 +03:00
parent 70a0d091bb
commit d256fdf5c6
6 changed files with 120 additions and 86 deletions

View File

@ -56,7 +56,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

@ -45,6 +45,8 @@ public class CkanConfig {
private String organization; private String organization;
@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;
@ -95,6 +97,13 @@ public class CkanConfig {
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

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

View File

@ -1,5 +1,6 @@
package eu.eudat.depositinterface.ckanrepository.config; package eu.eudat.depositinterface.ckanrepository.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;
@ -11,41 +12,56 @@ import java.io.FileInputStream;
import java.io.FileNotFoundException; import java.io.FileNotFoundException;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
@Service("ckanConfigLoader") @Service("ckanConfigLoader")
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 CkanConfig ckanConfig; private List<CkanConfig> ckanConfigs = new ArrayList<>();
private final Environment environment;
@Autowired @Autowired
private Environment environment; public ConfigLoaderImpl(Environment environment){
this.environment = environment;
}
@Override @Override
public CkanConfig getCkanConfig() { public List<CkanConfig> getCkanConfig() {
if(ckanConfig == null){ if(ckanConfigs == null || ckanConfigs.isEmpty()) {
try{ 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) { } catch (IOException e) {
logger.error(e.getLocalizedMessage(), e); logger.error(e.getLocalizedMessage(), e);
} }
} }
return ckanConfig; return ckanConfigs;
} }
@Override @Override
public byte[] getLogo() { public byte[] getLogo(String repositoryId) {
String logo = environment.getProperty("configuration.logo"); if (!ckanConfigs.isEmpty()) {
if(logo != null && !logo.isEmpty()){ CkanConfig ckanConfig = ckanConfigs.stream().filter(x -> x.getRepositoryId().equals(repositoryId)).findFirst().orElse(null);
InputStream logoStream = getStreamFromPath(logo); if (ckanConfig != null) {
try { String logo = ckanConfig.getLogo();
return logoStream.readAllBytes(); InputStream logoStream;
} if (logo != null && !logo.isEmpty()) {
catch (IOException e){ logoStream = getStreamFromPath(logo);
logger.error(e.getMessage(), e); }
return null; 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; return null;
} }

View File

@ -28,14 +28,15 @@ import java.io.IOException;
import java.io.OutputStream; import java.io.OutputStream;
import java.nio.file.Files; import java.nio.file.Files;
import java.util.*; import java.util.*;
import java.util.stream.Collectors;
@Component @Component
public class CkanDeposit implements RepositoryDeposit { public class CkanDeposit implements RepositoryDeposit {
private static final Logger logger = LoggerFactory.getLogger(CkanDeposit.class); private static final Logger logger = LoggerFactory.getLogger(CkanDeposit.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;
@Autowired @Autowired
public CkanDeposit(ConfigLoader configLoader, Environment environment){ public CkanDeposit(ConfigLoader configLoader, Environment environment){
@ -44,65 +45,70 @@ public class CkanDeposit implements RepositoryDeposit {
} }
@Override @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(); String doi;
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");
if(dmpDepositModel.getPreviousDOI() == null || dmpDepositModel.getPreviousDOI().isEmpty()){ CkanDataset dataset = new CkanDataset();
RestTemplate restTemplate = new RestTemplate(); dataset.setName(dmpDepositModel.getLabel().replaceAll("[^a-zA-Z0-9]+", "_").toLowerCase());
HttpHeaders headers = new HttpHeaders(); //dataset.setPrivate(!dmpDepositModel.isPublic());
headers.set("Authorization", ckanConfig.getApiToken()); dataset.setPrivate(true);
headers.setContentType(MediaType.APPLICATION_JSON); dataset.setNotes(dmpDepositModel.getDescription());
String url = ckanConfig.getRepositoryUrl() + "package_create"; dataset.setVersion(String.valueOf(dmpDepositModel.getVersion()));
Object response = restTemplate.exchange(url, HttpMethod.POST, new HttpEntity<>(dataset, headers), Object.class).getBody(); dataset.setOwner_org(ckanConfig.getOrganization());
Map<String, Object> respMap = objectMapper.convertValue(response, Map.class); dataset.setAuthor("Argos User");
respMap = (Map<String, Object>) respMap.get("result"); dataset.setAuthor_email("argosUser@example.com");
String id = String.valueOf(respMap.get("id"));
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); doi = String.valueOf(respMap.get("doi"));
}
else{
JsonNode datasetJson = this.getDatasetIdentifier(dmpDepositModel.getPreviousDOI()).get(0);
String datasetId = datasetJson.get("id").asText();
String version = datasetJson.get("version").asText();
JsonNode files = datasetJson.get("resources"); this.uploadFiles(ckanConfig, dmpDepositModel, id);
if(files.isArray()) { } else {
for (JsonNode file : files) { JsonNode datasetJson = this.getDatasetIdentifier(ckanConfig, dmpDepositModel.getPreviousDOI()).get(0);
String fileId = file.get("id").asText(); String datasetId = datasetJson.get("id").asText();
this.deleteFile(fileId); 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(); HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", this.configLoader.getCkanConfig().getApiToken()); headers.set("Authorization", ckanConfig.getApiToken());
headers.setContentType(MediaType.APPLICATION_JSON); 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<>(); Map<String, String> body = new HashMap<>();
body.put("id", datasetId); body.put("id", datasetId);
body.put("version", String.valueOf(Integer.parseInt(version) + 1)); 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"); 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(); HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", this.configLoader.getCkanConfig().getApiToken()); headers.set("Authorization", ckanConfig.getApiToken());
headers.setContentType(MediaType.APPLICATION_JSON); 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<String, String> map = new HashMap<>();
map.put("id", fileId); map.put("id", fileId);
RestTemplate restTemplate = new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
restTemplate.exchange(serverUrl, HttpMethod.POST, new HttpEntity<>(map, headers), Object.class); restTemplate.exchange(serverUrl, HttpMethod.POST, new HttpEntity<>(map, headers), Object.class);
} }
private void uploadFiles(DMPDepositModel dmpDepositModel, String id) throws IOException { private void uploadFiles(CkanConfig ckanConfig, DMPDepositModel dmpDepositModel, String id) throws IOException {
this.uploadFile(dmpDepositModel.getPdfFile().getFilename(), dmpDepositModel.getPdfFile().getFile(), id); this.uploadFile(ckanConfig, dmpDepositModel.getPdfFile().getFilename(), dmpDepositModel.getPdfFile().getFile(), id);
FileEnvelope rdaJsonEnvelope = dmpDepositModel.getRdaJsonFile(); FileEnvelope rdaJsonEnvelope = dmpDepositModel.getRdaJsonFile();
HttpHeaders responseHeaders = new HttpHeaders(); HttpHeaders responseHeaders = new HttpHeaders();
@ -147,28 +153,28 @@ public class CkanDeposit implements RepositoryDeposit {
} catch (IOException e) { } catch (IOException e) {
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
} }
this.uploadFile(jsonFileName, rdaJson, id); this.uploadFile(ckanConfig, jsonFileName, rdaJson, id);
Files.deleteIfExists(rdaJson.toPath()); Files.deleteIfExists(rdaJson.toPath());
if(dmpDepositModel.getSupportingFilesZip() != null) { 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(); HttpHeaders headers = new HttpHeaders();
headers.set("Authorization", this.configLoader.getCkanConfig().getApiToken()); headers.set("Authorization", ckanConfig.getApiToken());
String serverUrl = this.configLoader.getCkanConfig().getRepositoryUrl() + "package_search?q=doi:" + previousDOI + "&include_private=True"; String serverUrl = ckanConfig + "package_search?q=doi:" + previousDOI + "&include_private=True";
RestTemplate restTemplate = new RestTemplate(); RestTemplate restTemplate = new RestTemplate();
Object response = restTemplate.exchange(serverUrl, HttpMethod.GET, new HttpEntity<>(headers), Map.class).getBody().get("result"); 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()); JsonNode jsonNode = objectMapper.readTree(new JSONObject((Map<String, Object>)response).toString());
return jsonNode.findValues("results").get(0); 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(); HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA); headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.set("Authorization", this.configLoader.getCkanConfig().getApiToken()); headers.set("Authorization", ckanConfig.getApiToken());
MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder(); MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder();
Resource resource = new FileSystemResource(file); Resource resource = new FileSystemResource(file);
multipartBodyBuilder.part("upload", resource) multipartBodyBuilder.part("upload", resource)
@ -178,30 +184,32 @@ public class CkanDeposit implements RepositoryDeposit {
MultiValueMap<String, HttpEntity<?>> multipartBody = multipartBodyBuilder.build(); MultiValueMap<String, HttpEntity<?>> multipartBody = multipartBodyBuilder.build();
HttpEntity<MultiValueMap<String, HttpEntity<?>>> requestEntity = new HttpEntity<>(multipartBody, headers); 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(); RestTemplate restTemplate = new RestTemplate();
ResponseEntity<Object> resp = restTemplate.postForEntity(serverUrl, requestEntity, Object.class); ResponseEntity<Object> resp = restTemplate.postForEntity(serverUrl, requestEntity, Object.class);
} }
@Override @Override
public RepositoryDepositConfiguration getConfiguration() { public List<RepositoryDepositConfiguration> getConfiguration() {
eu.eudat.depositinterface.ckanrepository.config.CkanConfig ckanConfig = this.configLoader.getCkanConfig(); List<eu.eudat.depositinterface.ckanrepository.config.CkanConfig> ckanConfigs = this.configLoader.getCkanConfig();
return ckanConfig.toRepoConfig(); return ckanConfigs.stream().map(CkanConfig::toRepoConfig).collect(Collectors.toList());
} }
@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;
} }
@Override @Override
public String authenticate(String code) { public String authenticate(String repositoryId, String code) {
return null; return null;
} }
} }

View File

@ -1,3 +1,2 @@
storage.temp=${STORAGE_TMP_CKAN} storage.temp=${STORAGE_TMP_CKAN}
configuration.ckan=${CONFIGURATION_CKAN} configuration.ckan=${CONFIGURATION_CKAN}
configuration.ckan.logo=${CONFIGURATION_LOGO_CKAN}