diff --git a/dmp-backend/web/src/main/java/eu/eudat/controllers/Prefillings.java b/dmp-backend/web/src/main/java/eu/eudat/controllers/Prefillings.java new file mode 100644 index 000000000..7466f838c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/controllers/Prefillings.java @@ -0,0 +1,39 @@ +package eu.eudat.controllers; + +import eu.eudat.logic.managers.PrefillingManager; +import eu.eudat.models.data.datasetwizard.DatasetWizardModel; +import eu.eudat.models.data.helpers.responses.ResponseItem; +import eu.eudat.models.data.prefilling.Prefilling; +import eu.eudat.types.ApiMessageCode; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.UUID; + +@RestController +@CrossOrigin +@RequestMapping(value = {"/api"}) +public class Prefillings { + + private final PrefillingManager prefillingManager; + + @Autowired + public Prefillings(PrefillingManager prefillingManager) { + this.prefillingManager = prefillingManager; + } + + @RequestMapping(method = RequestMethod.GET, value = {"/prefilling/list"}, produces = "application/json") + public ResponseEntity>> getPrefillingList(@RequestParam String like, @RequestParam String configId) { + List prefillingList = prefillingManager.getPrefillings(like, configId); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem>().payload(prefillingList).status(ApiMessageCode.NO_MESSAGE)); + } + + @RequestMapping(method = RequestMethod.GET, value = {"/prefilling/get/{id}"}, produces = "application/json") + public ResponseEntity> getPrefillingDataset(@PathVariable String id, @RequestParam String configId, @RequestParam UUID profileId) throws Exception { + DatasetWizardModel datasetWizardModel = prefillingManager.getPrefilledDataset(id, configId, profileId); + return ResponseEntity.status(HttpStatus.OK).body(new ResponseItem().payload(datasetWizardModel).status(ApiMessageCode.NO_MESSAGE)); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/PrefillingManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/PrefillingManager.java new file mode 100644 index 000000000..1b8203e92 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/PrefillingManager.java @@ -0,0 +1,67 @@ +package eu.eudat.logic.managers; + +import com.fasterxml.jackson.databind.ObjectMapper; +import eu.eudat.data.entities.DatasetProfile; +import eu.eudat.logic.proxy.config.ExternalUrlCriteria; +import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; +import eu.eudat.logic.proxy.config.entities.PrefillingConfig; +import eu.eudat.logic.proxy.config.entities.PrefillingGet; +import eu.eudat.logic.services.ApiContext; +import eu.eudat.models.data.datasetprofile.DatasetProfileOverviewModel; +import eu.eudat.models.data.datasetwizard.DatasetWizardModel; +import eu.eudat.models.data.prefilling.Prefilling; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import java.util.*; +import java.util.stream.Collectors; + +@Service +public class PrefillingManager { + + private final ApiContext apiContext; + private final ConfigLoader configLoader; + private final ObjectMapper objectMapper; + private final DatasetManager datasetManager; + private final DatasetProfileManager datasetProfileManager; + + @Autowired + public PrefillingManager(ApiContext apiContext, ConfigLoader configLoader, DatasetManager datasetManager, DatasetProfileManager datasetProfileManager) { + this.apiContext = apiContext; + this.configLoader = configLoader; + this.objectMapper = new ObjectMapper(); + this.datasetManager = datasetManager; + this.datasetProfileManager = datasetProfileManager; + } + + public List getPrefillings(String like, String configId) { + PrefillingConfig prefillingConfig = configLoader.getExternalUrls().getPrefillings().get(configId); + ExternalUrlCriteria externalUrlCriteria = new ExternalUrlCriteria(); + externalUrlCriteria.setLike(like); + List> map = apiContext.getOperationsContext().getRemoteFetcher().getExternalGeneric(externalUrlCriteria, prefillingConfig.getPrefillingSearch()); + return map.stream().map(submap -> objectMapper.convertValue(submap, Prefilling.class)).collect(Collectors.toList()); + } + + public DatasetWizardModel getPrefilledDataset(String prefillId, String configId, UUID profileId) throws Exception { + PrefillingConfig prefillingConfig = configLoader.getExternalUrls().getPrefillings().get(configId); + PrefillingGet prefillingGet = prefillingConfig.getPrefillingGet(); + Map prefillingEntity = getSingle(prefillingGet.getUrl(), prefillId); + DatasetProfile datasetProfile = apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(profileId); + return DatasetWizardModel.fromPrefilledEntity(prefillingEntity, prefillingGet.getMappings(), datasetProfile, datasetManager); + } + + private Map getSingle(String url, String id) { + RestTemplate restTemplate = new RestTemplate(); + String parsedUrl = url.replace("{id}", id); + HttpHeaders headers = new HttpHeaders(); + headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON)); + HttpEntity entity = new HttpEntity("", headers); + + return restTemplate.exchange(parsedUrl, HttpMethod.GET, entity, LinkedHashMap.class).getBody(); + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java index 2706681f7..7a008d853 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/ExternalUrls.java @@ -2,10 +2,14 @@ package eu.eudat.logic.proxy.config; import eu.eudat.logic.proxy.config.entities.*; +import eu.eudat.logic.proxy.config.prefilling.PrefillingConfigMapAdapter; import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; import javax.xml.bind.annotation.XmlRootElement; +import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter; import java.io.Serializable; +import java.util.Map; @XmlRootElement public class ExternalUrls implements Serializable { @@ -26,6 +30,7 @@ public class ExternalUrls implements Serializable { FunderUrls funders; LicenseUrls licenses; ValidationUrls validations; + Map prefillings; public RegistryUrls getRegistries() { @@ -153,6 +158,16 @@ public class ExternalUrls implements Serializable { public void setValidations(ValidationUrls validations) { this.validations = validations; } + + public Map getPrefillings() { + return prefillings; + } + + @XmlJavaTypeAdapter(PrefillingConfigMapAdapter.class) + @XmlElement(name = "prefillings") + public void setPrefillings(Map prefillings) { + this.prefillings = prefillings; + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DatasetUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DatasetUrls.java index 2c1f2aca0..f1aeb9a3b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DatasetUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/DatasetUrls.java @@ -8,7 +8,7 @@ import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class DatasetUrls { +public class DatasetUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/FunderUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/FunderUrls.java index 385efe039..ede90c5ee 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/FunderUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/FunderUrls.java @@ -7,7 +7,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class FunderUrls { +public class FunderUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GenericUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GenericUrls.java new file mode 100644 index 000000000..6507564bb --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GenericUrls.java @@ -0,0 +1,12 @@ +package eu.eudat.logic.proxy.config.entities; + +import eu.eudat.logic.proxy.config.FetchStrategy; +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import java.util.List; + +public abstract class GenericUrls { + + public abstract List getUrls(); + public abstract FetchStrategy getFetchMode(); +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GrantUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GrantUrls.java index f8f0c261e..3616d6726 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GrantUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/GrantUrls.java @@ -8,7 +8,7 @@ import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class GrantUrls { +public class GrantUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/LicenseUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/LicenseUrls.java index 79e1e1b47..55dadce4e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/LicenseUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/LicenseUrls.java @@ -8,7 +8,7 @@ import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class LicenseUrls { +public class LicenseUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/OrganisationUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/OrganisationUrls.java index 714907a59..e45192806 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/OrganisationUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/OrganisationUrls.java @@ -7,7 +7,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class OrganisationUrls { +public class OrganisationUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingConfig.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingConfig.java new file mode 100644 index 000000000..eca10e81e --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingConfig.java @@ -0,0 +1,29 @@ +package eu.eudat.logic.proxy.config.entities; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "config") +public class PrefillingConfig { + + private PrefillingSearch prefillingSearch; + private PrefillingGet prefillingGet; + + public PrefillingSearch getPrefillingSearch() { + return prefillingSearch; + } + + @XmlElement(name = "prefillingSearch") + public void setPrefillingSearch(PrefillingSearch prefillingSearch) { + this.prefillingSearch = prefillingSearch; + } + + public PrefillingGet getPrefillingGet() { + return prefillingGet; + } + + @XmlElement(name = "prefillingGet") + public void setPrefillingGet(PrefillingGet prefillingGet) { + this.prefillingGet = prefillingGet; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingGet.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingGet.java new file mode 100644 index 000000000..c74b5f9f4 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingGet.java @@ -0,0 +1,32 @@ +package eu.eudat.logic.proxy.config.entities; + +import eu.eudat.logic.proxy.config.FetchStrategy; +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import javax.xml.bind.annotation.XmlElement; +import javax.xml.bind.annotation.XmlElementWrapper; +import java.util.List; + +public class PrefillingGet{ + private String url; + private List mappings; + + public String getUrl() { + return url; + } + + @XmlElement(name = "url") + public void setUrl(String url) { + this.url = url; + } + + public List getMappings() { + return mappings; + } + + @XmlElement(name = "mapping") + @XmlElementWrapper + public void setMappings(List mappings) { + this.mappings = mappings; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingMapping.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingMapping.java new file mode 100644 index 000000000..a6d33296c --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingMapping.java @@ -0,0 +1,38 @@ +package eu.eudat.logic.proxy.config.entities; + +import javax.xml.bind.annotation.XmlAttribute; +import javax.xml.bind.annotation.XmlRootElement; + +@XmlRootElement(name = "mapping") +public class PrefillingMapping { + private String source; + private String target; + private String maDmpTarget; + + public String getSource() { + return source; + } + + @XmlAttribute(name = "source") + public void setSource(String source) { + this.source = source; + } + + public String getTarget() { + return target; + } + + @XmlAttribute(name = "target") + public void setTarget(String target) { + this.target = target; + } + + public String getMaDmpTarget() { + return maDmpTarget; + } + + @XmlAttribute(name = "maDmpTarget") + public void setMaDmpTarget(String maDmpTarget) { + this.maDmpTarget = maDmpTarget; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingSearch.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingSearch.java new file mode 100644 index 000000000..d905a18dd --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/PrefillingSearch.java @@ -0,0 +1,33 @@ +package eu.eudat.logic.proxy.config.entities; + +import eu.eudat.logic.proxy.config.FetchStrategy; +import eu.eudat.logic.proxy.config.UrlConfiguration; + +import javax.xml.bind.annotation.XmlElement; +import java.util.ArrayList; +import java.util.List; + +public class PrefillingSearch extends GenericUrls{ + private UrlConfiguration urlConfig; + + public UrlConfiguration getUrlConfig() { + return urlConfig; + } + + @XmlElement(name = "urlConfig") + public void setUrlConfig(UrlConfiguration urlConfig) { + this.urlConfig = urlConfig; + } + + @Override + public List getUrls() { + List urls = new ArrayList<>(); + urls.add(urlConfig); + return urls; + } + + @Override + public FetchStrategy getFetchMode() { + return null; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ProjectUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ProjectUrls.java index d07fb59b4..0b6e7eaeb 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ProjectUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ProjectUrls.java @@ -7,7 +7,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class ProjectUrls { +public class ProjectUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RegistryUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RegistryUrls.java index 77d8efc6e..c9d062c75 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RegistryUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RegistryUrls.java @@ -7,7 +7,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class RegistryUrls { +public class RegistryUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RepositoryUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RepositoryUrls.java index e135f12af..5f0df351c 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RepositoryUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/RepositoryUrls.java @@ -7,7 +7,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class RepositoryUrls { +public class RepositoryUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ResearcherUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ResearcherUrls.java index 98852f54b..af9346b50 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ResearcherUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ResearcherUrls.java @@ -7,7 +7,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class ResearcherUrls { +public class ResearcherUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ServiceUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ServiceUrls.java index c915ac52e..4af0df57b 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ServiceUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ServiceUrls.java @@ -7,7 +7,7 @@ import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlElementWrapper; import java.util.List; -public class ServiceUrls { +public class ServiceUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java index e3040b1a5..56077214e 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/TagUrls.java @@ -10,7 +10,7 @@ import java.util.List; /** * Created by ikalyvas on 7/9/2018. */ -public class TagUrls { +public class TagUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ValidationUrls.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ValidationUrls.java index 56c8f4b33..8c6c00029 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ValidationUrls.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/entities/ValidationUrls.java @@ -8,7 +8,7 @@ import javax.xml.bind.annotation.XmlElementWrapper; import eu.eudat.logic.proxy.config.FetchStrategy; import eu.eudat.logic.proxy.config.UrlConfiguration; -public class ValidationUrls { +public class ValidationUrls extends GenericUrls{ List urls; FetchStrategy fetchMode; diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/prefilling/PrefillingConfigMapAdapter.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/prefilling/PrefillingConfigMapAdapter.java new file mode 100644 index 000000000..927587d18 --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/config/prefilling/PrefillingConfigMapAdapter.java @@ -0,0 +1,35 @@ +package eu.eudat.logic.proxy.config.prefilling; + +import eu.eudat.logic.proxy.config.entities.PrefillingConfig; +import org.w3c.dom.Element; + +import javax.xml.bind.JAXBContext; +import javax.xml.bind.Unmarshaller; +import javax.xml.bind.annotation.adapters.XmlAdapter; +import java.util.HashMap; +import java.util.Map; + +public class PrefillingConfigMapAdapter extends XmlAdapter> { + @Override + public Map unmarshal(Object v) throws Exception { + Map configMap = new HashMap<>(); + Element element = (Element) v; + JAXBContext jaxbContext = JAXBContext.newInstance(PrefillingConfig.class); + Unmarshaller jaxbUnmarshaller = jaxbContext.createUnmarshaller(); + for (int i = 0; i < element.getChildNodes().getLength(); i++) { + if (element.getChildNodes().item(i).getAttributes() == null) { + continue; + } + String id = element.getChildNodes().item(i).getAttributes().getNamedItem("id").getNodeValue(); + PrefillingConfig prefillingConfig = (PrefillingConfig) jaxbUnmarshaller.unmarshal(element.getChildNodes().item(i)); + prefillingConfig = configMap.put(id, prefillingConfig); + System.out.println(prefillingConfig); + } + return configMap; + } + + @Override + public Object marshal(Map v) throws Exception { + return null; + } +} diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java index 54fc21aee..53b408323 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/proxy/fetching/RemoteFetcher.java @@ -10,6 +10,7 @@ import eu.eudat.logic.proxy.config.ExternalUrlCriteria; import eu.eudat.logic.proxy.config.FetchStrategy; import eu.eudat.logic.proxy.config.UrlConfiguration; import eu.eudat.logic.proxy.config.configloaders.ConfigLoader; +import eu.eudat.logic.proxy.config.entities.GenericUrls; import eu.eudat.logic.proxy.config.exceptions.HugeResultSet; import eu.eudat.logic.proxy.config.exceptions.NoURLFound; import eu.eudat.logic.proxy.fetching.entities.Results; @@ -143,6 +144,12 @@ public class RemoteFetcher { return data.size(); } + public List> getExternalGeneric(ExternalUrlCriteria externalUrlCriteria, GenericUrls genericUrls) { + List urlConfigurations = genericUrls.getUrls(); + FetchStrategy fetchStrategy = genericUrls.getFetchMode(); + return getAll(urlConfigurations, fetchStrategy, externalUrlCriteria); + } + private List> getAll(List urlConfigs, FetchStrategy fetchStrategy, ExternalUrlCriteria externalUrlCriteria) { @@ -309,8 +316,10 @@ public class RemoteFetcher { results = RemoteFetcherUtils.getFromJsonWithFirstAndLastName(jsonContext, jsonDataPath); } else { results = new Results(jsonContext.read(jsonDataPath.getPath() - + "[" + jsonDataPath.getFieldsUrlConfiguration().getName() + "," + jsonDataPath.getFieldsUrlConfiguration().getDescription() - + "," + jsonDataPath.getFieldsUrlConfiguration().getUri() + "," + jsonDataPath.getFieldsUrlConfiguration().getId() + "]"), + + "[" + (jsonDataPath.getFieldsUrlConfiguration().getName() != null ? jsonDataPath.getFieldsUrlConfiguration().getName(): "") + + (jsonDataPath.getFieldsUrlConfiguration().getDescription() != null ? "," + jsonDataPath.getFieldsUrlConfiguration().getDescription(): "") + + (jsonDataPath.getFieldsUrlConfiguration().getUri() !=null ? "," + jsonDataPath.getFieldsUrlConfiguration().getUri() : "") + + (jsonDataPath.getFieldsUrlConfiguration().getId() != null ? "," + jsonDataPath.getFieldsUrlConfiguration().getId(): "") + "]"), new HashMap<>(1, 1)); } results.setResults(results.getResults().stream().map(e -> e.entrySet().stream().collect(Collectors.toMap(x -> this.transformKey(jsonDataPath,x.getKey()), Map.Entry::getValue))) @@ -370,6 +379,10 @@ public class RemoteFetcher { results = new Results(values, new HashMap<>(1, 1)); } + if (results.getPagination().size() == 0) { + results.getPagination().put("pages", 1); + results.getPagination().put("count", results.getResults().size()); + } return results; } } catch (Exception exception) { diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java index 7d08c0715..5606cf096 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/datasetwizard/DatasetWizardModel.java @@ -1,7 +1,12 @@ package eu.eudat.models.data.datasetwizard; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.data.entities.*; import eu.eudat.elastic.entities.Tag; +import eu.eudat.logic.managers.DatasetManager; +import eu.eudat.logic.proxy.config.entities.PrefillingMapping; +import eu.eudat.logic.utilities.json.JsonSearcher; import eu.eudat.models.DataModel; import eu.eudat.models.data.dataset.DataRepository; import eu.eudat.models.data.dataset.Registry; @@ -12,7 +17,10 @@ import eu.eudat.models.data.externaldataset.ExternalDatasetListingModel; import eu.eudat.models.data.user.composite.PagedDatasetProfile; import net.minidev.json.JSONValue; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; import java.util.*; +import java.util.concurrent.atomic.AtomicReference; import java.util.stream.Collectors; @@ -297,6 +305,46 @@ public class DatasetWizardModel implements DataModel prefilledEntity, List mappings, + DatasetProfile profile, DatasetManager datasetManager) throws Exception { + DatasetWizardModel datasetWizardModel = new DatasetWizardModel(); + datasetWizardModel.setProfile(new DatasetProfileOverviewModel().fromDataModel(profile)); + Dataset dataset = new Dataset(); + dataset.setProfile(profile); + Map properties = new HashMap<>(); + ObjectMapper objectMapper = new ObjectMapper(); + JsonNode parentNode = objectMapper.readTree(objectMapper.writeValueAsString(datasetManager.getPagedProfile(datasetWizardModel, dataset))); + for (PrefillingMapping prefillingMapping: mappings) { + List sourceKeys = Arrays.asList(prefillingMapping.getSource().split("\\.")); + Object sourceValue = null; + for (String sourceKey: sourceKeys) { + if (sourceValue == null) { + sourceValue = prefilledEntity.get(sourceKey); + } else if (sourceValue instanceof Map) { + sourceValue = ((Map)sourceValue).get(sourceKey); + } + } + if (prefillingMapping.getTarget() != null) { + try { + String methodName = "set" + prefillingMapping.getTarget().substring(0, 1).toUpperCase(Locale.ROOT) + prefillingMapping.getTarget().substring(1); + Method setterMethod = DatasetWizardModel.class.getMethod(methodName, String.class); + setterMethod.invoke(datasetWizardModel, sourceValue); + }catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + e.printStackTrace(); + } + } else { + List nodes = JsonSearcher.findNodes(parentNode, "rdaProperty", prefillingMapping.getMaDmpTarget()); + for (JsonNode node: nodes) { + String id = node.get(0) != null ? node.get(0).get("id").asText() : node.get("id").asText(); + properties.put(id, sourceValue); + } + } + } + dataset.setProperties(objectMapper.writeValueAsString(properties)); + datasetWizardModel.setDatasetProfileDefinition(datasetManager.getPagedProfile(datasetWizardModel, dataset)); + return datasetWizardModel; + } + @Override public String getHint() { return "datasetWizardModel"; diff --git a/dmp-backend/web/src/main/java/eu/eudat/models/data/prefilling/Prefilling.java b/dmp-backend/web/src/main/java/eu/eudat/models/data/prefilling/Prefilling.java new file mode 100644 index 000000000..6c09e6b2e --- /dev/null +++ b/dmp-backend/web/src/main/java/eu/eudat/models/data/prefilling/Prefilling.java @@ -0,0 +1,31 @@ +package eu.eudat.models.data.prefilling; + +public class Prefilling { + private String pid; + private String name; + private String tag; + + public String getPid() { + return pid; + } + + public void setPid(String pid) { + this.pid = pid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getTag() { + return tag; + } + + public void setTag(String tag) { + this.tag = tag; + } +} diff --git a/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml b/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml index 4bb95d5c9..45500328a 100644 --- a/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml +++ b/dmp-backend/web/src/main/resources/externalUrls/ExternalUrls.xml @@ -1005,6 +1005,39 @@ FIRST + + + + + zenodo + + 1 + External + https://sandbox.zenodo.org/api/records/?page={page}&size={pageSize}&q="{like}" + 1 + application/json + + $[*] + + 'id' + 'title' + 'description' + + + $['hits']['total'] + + + + https://sandbox.zenodo.org/api/records/{id} + + + + + + + + +