diff --git a/pom.xml b/pom.xml index f92323a..f7b83bf 100644 --- a/pom.xml +++ b/pom.xml @@ -56,7 +56,7 @@ gr.cite.opendmp repositorydepositbase - 1.0.2 + 1.0.4 diff --git a/src/main/java/eu/eudat/depositinterface/ckanrepository/config/CkanConfig.java b/src/main/java/eu/eudat/depositinterface/ckanrepository/config/CkanConfig.java index 9bda7f1..90fb1e3 100644 --- a/src/main/java/eu/eudat/depositinterface/ckanrepository/config/CkanConfig.java +++ b/src/main/java/eu/eudat/depositinterface/ckanrepository/config/CkanConfig.java @@ -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); diff --git a/src/main/java/eu/eudat/depositinterface/ckanrepository/config/ConfigLoader.java b/src/main/java/eu/eudat/depositinterface/ckanrepository/config/ConfigLoader.java index 26d084a..4a19d2e 100644 --- a/src/main/java/eu/eudat/depositinterface/ckanrepository/config/ConfigLoader.java +++ b/src/main/java/eu/eudat/depositinterface/ckanrepository/config/ConfigLoader.java @@ -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 getCkanConfig(); } diff --git a/src/main/java/eu/eudat/depositinterface/ckanrepository/config/ConfigLoaderImpl.java b/src/main/java/eu/eudat/depositinterface/ckanrepository/config/ConfigLoaderImpl.java index 675afe6..9c14e0e 100644 --- a/src/main/java/eu/eudat/depositinterface/ckanrepository/config/ConfigLoaderImpl.java +++ b/src/main/java/eu/eudat/depositinterface/ckanrepository/config/ConfigLoaderImpl.java @@ -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 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 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>() {}); } 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; } diff --git a/src/main/java/eu/eudat/depositinterface/ckanrepository/interfaces/CkanDeposit.java b/src/main/java/eu/eudat/depositinterface/ckanrepository/interfaces/CkanDeposit.java index 38edeb8..2f22968 100644 --- a/src/main/java/eu/eudat/depositinterface/ckanrepository/interfaces/CkanDeposit.java +++ b/src/main/java/eu/eudat/depositinterface/ckanrepository/interfaces/CkanDeposit.java @@ -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 respMap = objectMapper.convertValue(response, Map.class); - respMap = (Map) 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 respMap = objectMapper.convertValue(response, Map.class); + respMap = (Map) 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 resp = this.updateVersion(ckanConfig, datasetId, version); + doi = (String) resp.get("doi"); } - this.uploadFiles(dmpDepositModel, datasetId); + return doi; - Map resp = this.updateVersion(datasetId, version); - doi = (String) resp.get("doi"); } - return doi; + return null; } - private Map updateVersion(String datasetId, String version){ + private Map 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 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)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 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)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> multipartBody = multipartBodyBuilder.build(); 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 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 getConfiguration() { + List 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; } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3a5e685..6738151 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,3 +1,2 @@ storage.temp=${STORAGE_TMP_CKAN} -configuration.ckan=${CONFIGURATION_CKAN} -configuration.ckan.logo=${CONFIGURATION_LOGO_CKAN} \ No newline at end of file +configuration.ckan=${CONFIGURATION_CKAN} \ No newline at end of file