From c7892f45df4131b7cecaeb1d0721776045cd7916 Mon Sep 17 00:00:00 2001 From: George Kalampokis Date: Fri, 12 Jun 2020 17:25:53 +0300 Subject: [PATCH] Tags created by the form by using the rda standard keyword or the tag field will be stored to the dataset's tags in elastic --- .../managers/DataManagementPlanManager.java | 5 ++- .../eudat/logic/managers/DatasetManager.java | 42 +++++++++++++++++++ .../logic/utilities/json/JsonSearcher.java | 12 +++++- 3 files changed, 56 insertions(+), 3 deletions(-) diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java index 90b800cd2..d7b423fc9 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DataManagementPlanManager.java @@ -1428,7 +1428,10 @@ public class DataManagementPlanManager { if (elastic != null) { tags = elastic.getTags(); } - datasetManager.updateTags(dataset, tags); + DatasetWizardModel datasetWizardModel = new DatasetWizardModel().fromDataModel(dataset); + datasetWizardModel.setTags(tags); + datasetManager.getTagsFromProfile(datasetWizardModel, dataset); + datasetManager.updateTags(dataset, datasetWizardModel.getTags()); } catch (Exception e) { logger.error(e.getMessage(), e); } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java index e82bc1801..41dd55280 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/managers/DatasetManager.java @@ -1,5 +1,7 @@ package eu.eudat.logic.managers; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; import eu.eudat.data.dao.criteria.*; import eu.eudat.data.dao.entities.DataRepositoryDao; import eu.eudat.data.dao.entities.DatasetDao; @@ -27,6 +29,8 @@ import eu.eudat.logic.utilities.documents.helpers.FileEnvelope; import eu.eudat.logic.utilities.documents.types.ParagraphStyle; import eu.eudat.logic.utilities.documents.word.WordBuilder; import eu.eudat.logic.utilities.documents.xml.ExportXmlBuilder; +import eu.eudat.logic.utilities.helpers.StreamDistinctBy; +import eu.eudat.logic.utilities.json.JsonSearcher; import eu.eudat.models.HintedModelFactory; import eu.eudat.models.data.datasetImport.DatasetImportField; import eu.eudat.models.data.datasetImport.DatasetImportPagedDatasetProfile; @@ -563,6 +567,7 @@ public class DatasetManager { eu.eudat.data.entities.Dataset dataset = datasetWizardModel.toDataModel(); dataset.setDmp(dmp); dataset.setProperties(propertiesModelToString(datasetWizardModel.getDatasetProfileDefinition())); + this.getTagsFromProfile(datasetWizardModel, dataset); if (datasetWizardModel.getStatus() == (int) Dataset.Status.FINALISED.getValue()) checkDatasetValidation(dataset); UserInfo userInfo = apiContext.getOperationsContext().getBuilderFactory().getBuilder(UserInfoBuilder.class).id(principal.getId()).build(); @@ -974,4 +979,41 @@ public class DatasetManager { } } } + + public void getTagsFromProfile(DatasetWizardModel wizardModel, Dataset dataset) throws IOException { + dataset.setProfile(apiContext.getOperationsContext().getDatabaseRepository().getDatasetProfileDao().find(dataset.getProfile().getId())); + wizardModel.setDatasetProfileDefinition(this.getPagedProfile(wizardModel, dataset)); + ObjectMapper mapper = new ObjectMapper(); + String json = mapper.writeValueAsString(wizardModel.getDatasetProfileDefinition()); + JsonNode propertiesJson = mapper.readTree(json); + List tags = apiContext.getOperationsContext().getElasticRepository().getDatasetRepository().query(new DatasetCriteria()).stream().map(eu.eudat.elastic.entities.Dataset::getTags).flatMap(Collection::stream).filter(StreamDistinctBy.distinctByKey(Tag::getId)).collect(Collectors.toList()); + Set tagNodes = new HashSet<>(); + tagNodes.addAll(JsonSearcher.findNodes(propertiesJson, "renderStyle", "tags", true)); + tagNodes.addAll(JsonSearcher.findNodes(propertiesJson, "rdaProperty", "dataset.keyword")); + if (!tagNodes.isEmpty()) { + tagNodes.forEach(node -> { + JsonNode value = node.get("value"); + if (value.isArray()) { + value.elements().forEachRemaining(element -> { + try { + Map data = mapper.readValue(element.asText(), HashMap.class); + Tag tag = new Tag(); + if(tags.stream().anyMatch(intag -> intag.getName().equals(data.get("name")))) { + tag = tags.stream().filter(intag -> intag.getName().equals(data.get("name"))).findFirst().get(); + } else { + tag.setName(data.get("name")); + tag.setId(data.get("id")); + } + if (wizardModel.getTags().stream().noneMatch(intag -> intag.getName().equals(data.get("name")))) { + wizardModel.getTags().add(tag); + } + } catch (IOException e) { + logger.error(e.getMessage(), e); + } + + }); + } + }); + } + } } diff --git a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/json/JsonSearcher.java b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/json/JsonSearcher.java index 979053830..e7579d07a 100644 --- a/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/json/JsonSearcher.java +++ b/dmp-backend/web/src/main/java/eu/eudat/logic/utilities/json/JsonSearcher.java @@ -10,6 +10,10 @@ import java.util.List; public class JsonSearcher { public static List findNodes(JsonNode root, String key, String value) { + return findNodes(root, key, value, false); + } + + public static List findNodes(JsonNode root, String key, String value, boolean parent) { List nodes = new ArrayList<>(); for (Iterator it = root.elements(); it.hasNext(); ) { JsonNode node = it.next(); @@ -18,14 +22,18 @@ public class JsonSearcher { String fieldName = iter.next(); if (fieldName.equals(key)) { if (node.get(fieldName).asText().equals(value) || node.get(fieldName).asText().startsWith(value)) { - nodes.add(node); + if (parent) { + nodes.add(root); + } else { + nodes.add(node); + } found++; } } } if (found == 0) { - nodes.addAll(findNodes(node, key, value)); + nodes.addAll(findNodes(node, key, value, parent)); } } return nodes;