From 525550308d30474b8576d52989bdc4a924b7e2f8 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 28 Oct 2020 10:17:49 +0100 Subject: [PATCH 001/243] fix code after code review --- src/main/java/fr/insee/rmes/bauhaus_services/Constants.java | 4 ++-- .../operations/indicators/IndicatorsUtils.java | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 903f350aa..ebffc88b6 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -39,7 +39,7 @@ public class Constants { public static final String ID_SERIES = "idSeries"; public static final String ID_SIMS = "idSims"; public static final String INDICATOR_UP = "INDICATOR"; - public static final String ISREPLACEDBY = "IsReplacedBy"; + public static final String ISREPLACEDBY = "isReplacedBy"; /*L*/ public static final String LABEL = "label"; @@ -67,7 +67,7 @@ public class Constants { /*R*/ public static final String RANGE_TYPE = "rangeType"; public static final String REPOSITORY_EXCEPTION = "RepositoryException"; - public static final String REPLACES = "Replaces"; + public static final String REPLACES = "replaces"; /*S*/ public static final String SERIES_UP = "SERIES"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java index 121686117..f8219470d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java @@ -251,8 +251,7 @@ public String setIndicator(String body) throws RmesException { mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); Indicator indicator = new Indicator(); String id=createID(); - indicator.setId(id); - if (indicator.getId() == null) { + if (id == null) { logger.error("Create indicator cancelled - no id"); return null; } From ab15a16ff0073a130d77e41fbd35a7088a37bd1a Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Mon, 2 Nov 2020 22:00:30 +0100 Subject: [PATCH 002/243] fix: quick fix after review --- .../structures/impl/StructureComponentImpl.java | 3 ++- .../structures/utils/StructureComponentUtils.java | 11 ++++++----- .../request/structures/getMutualizedComponents.ftlh | 3 ++- 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java index da355d38b..b40c1b730 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java @@ -65,6 +65,7 @@ public void deleteComponent(String id) throws RmesException { if(response.keySet().isEmpty()){ throw new NotFoundException("This component do not exist"); } - structureComponentUtils.deleteComponent(response, id); + String type = response.getString("type"); + structureComponentUtils.deleteComponent(response, id, type); } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 1600f55ee..05b7be8e7 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -38,6 +38,8 @@ @Component public class StructureComponentUtils extends RdfService { static final Logger logger = LogManager.getLogger(StructureComponentUtils.class); + public static final String VALIDATED = "Validated"; + public static final String MODIFIED = "Modified"; public String formatComponent(String id, JSONObject response) throws RmesException { response.put(Constants.ID, id); @@ -210,18 +212,17 @@ private MutualizedComponent deserializeBody(String body) throws IOException { return mapper.readValue(body, MutualizedComponent.class); } - public void deleteComponent(JSONObject component, String id) throws RmesException { - System.out.println(component); + public void deleteComponent(JSONObject component, String id, String type) throws RmesException { String state = component.getString("validationState"); - if(state.equals("Validated") || state.equals("Modified")){ + if(state.equals(VALIDATED) || state.equals(MODIFIED)){ throw new RmesException(ErrorCodes.COMPONENT_FORBIDDEN_DELETE, "You cannot delete a validated component", new JSONArray()); } IRI componentIri; - if (id.startsWith(("a"))) { + if (type.equalsIgnoreCase(QB.ATTRIBUTE_PROPERTY.toString())) { componentIri = RdfUtils.structureComponentAttributeIRI(id); - } else if (id.startsWith("m")) { + } else if (type.equalsIgnoreCase(QB.MEASURE_PROPERTY.toString())) { componentIri = RdfUtils.structureComponentMeasureIRI(id); } else { componentIri = RdfUtils.structureComponentDimensionIRI(id); diff --git a/src/main/resources/request/structures/getMutualizedComponents.ftlh b/src/main/resources/request/structures/getMutualizedComponents.ftlh index 3b82a63f1..f7ef7438f 100644 --- a/src/main/resources/request/structures/getMutualizedComponents.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponents.ftlh @@ -1,7 +1,8 @@ -SELECT DISTINCT ?id ?labelLg1 ?concept ?type ?codeList +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?concept ?type ?codeList FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { ?component dcterms:identifier ?id ; + insee:identifiantMetier ?identifiant ; rdf:type ?type ; rdfs:label ?labelLg1 . From b42fc773e99568efc78e611b8e8251ea8a4c970d Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Tue, 3 Nov 2020 21:02:48 +0100 Subject: [PATCH 003/243] feat: delete mutualized component --- .../structures/impl/StructureComponentImpl.java | 10 +++++++--- .../utils/StructureComponentUtils.java | 16 ++++++++++++++-- .../structures/utils/StructureUtils.java | 12 ++++++++++++ .../getStructuresForMutualizedComponent.ftlh | 7 ++++++- 4 files changed, 39 insertions(+), 6 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java index b40c1b730..5f7fd876a 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java @@ -38,8 +38,7 @@ public String getComponents() throws RmesException { return repoGestion.getResponseAsArray(StructureQueries.getComponents()).toString(); } - @Override - public String getComponent(String id) throws RmesException { + public JSONObject getComponentObject(String id) throws RmesException { logger.info("Starting to get one mutualized component"); JSONObject response = repoGestion.getResponseAsObject(StructureQueries.getComponent(id)); @@ -49,6 +48,11 @@ public String getComponent(String id) throws RmesException { return structureComponentUtils.formatComponent(id, response); } + @Override + public String getComponent(String id) throws RmesException { + return this.getComponentObject(id).toString(); + } + @Override public String updateComponent(String componentId, String body) throws RmesException { return structureComponentUtils.updateComponent(componentId, body); @@ -61,7 +65,7 @@ public String createComponent( String body) throws RmesException { @Override public void deleteComponent(String id) throws RmesException { - JSONObject response = repoGestion.getResponseAsObject(StructureQueries.getComponent(id)); + JSONObject response = this.getComponentObject(id); if(response.keySet().isEmpty()){ throw new NotFoundException("This component do not exist"); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 05b7be8e7..7628f9650 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -41,11 +41,11 @@ public class StructureComponentUtils extends RdfService { public static final String VALIDATED = "Validated"; public static final String MODIFIED = "Modified"; - public String formatComponent(String id, JSONObject response) throws RmesException { + public JSONObject formatComponent(String id, JSONObject response) throws RmesException { response.put(Constants.ID, id); addCodeListRange(response); addStructures(response, id); - return response.toString(); + return response; } @@ -217,8 +217,20 @@ public void deleteComponent(JSONObject component, String id, String type) throws if(state.equals(VALIDATED) || state.equals(MODIFIED)){ throw new RmesException(ErrorCodes.COMPONENT_FORBIDDEN_DELETE, "You cannot delete a validated component", new JSONArray()); } + JSONArray structures = component.getJSONArray("structures"); + boolean findPublishedStructure = false; + for (int i = 0; i < structures.length(); i++) { + JSONObject structure = (JSONObject) structures.get(i); + if(state.equals(VALIDATED) || state.equals(MODIFIED)){ + findPublishedStructure = true; + break; + } + } + if(findPublishedStructure){ + throw new RmesException(ErrorCodes.COMPONENT_FORBIDDEN_DELETE, "You cannot delete a validated component", new JSONArray()); + } IRI componentIri; if (type.equalsIgnoreCase(QB.ATTRIBUTE_PROPERTY.toString())) { componentIri = RdfUtils.structureComponentAttributeIRI(id); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 5b7be84a8..edef3d58d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -334,6 +334,18 @@ private void validateStructure(Structure structure) { } public void deleteStructure(String structureId) throws RmesException { + JSONArray components = repoGestion.getResponseAsArray(StructureQueries.getComponentsForStructure(structureId)); + System.out.println("Deleting structure " + structureId); + components.forEach(component -> { + String id = ((JSONObject) component).getString("id"); + String type = ((JSONObject) component).getString("type"); + System.out.println("Deleting component " + id); + try { + structureComponentUtils.deleteComponent((JSONObject) component, id, type); + } catch (RmesException e) { + System.out.println("Could not delete component " + id); + } + }); IRI structureIri = RdfUtils.structureIRI(structureId); repoGestion.clearStructureNodeAndComponents(structureIri); repoGestion.deleteObject(structureIri, null); diff --git a/src/main/resources/request/structures/getStructuresForMutualizedComponent.ftlh b/src/main/resources/request/structures/getStructuresForMutualizedComponent.ftlh index f81517e36..3e1e209d7 100644 --- a/src/main/resources/request/structures/getStructuresForMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/getStructuresForMutualizedComponent.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?labelLg1 +SELECT DISTINCT ?id ?labelLg1 ?validationState FROM <${STRUCTURES_GRAPH}> FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { @@ -9,6 +9,11 @@ WHERE { ?componentSpecification (qb:dimension|qb:measure|qb:attribute) ?component . ?component dcterms:identifier '${ID}' . + OPTIONAL { + ?component insee:validationState ?validationState + } . + + FILTER (lang(?labelLg1) = '${LG1}') } ORDER BY ?labelLg1 \ No newline at end of file From 6ab5f5c8d50ab2f86834f18be52b4a8dedee1004 Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Thu, 5 Nov 2020 21:13:41 +0100 Subject: [PATCH 004/243] fix: remove Sysout --- .../rmes/bauhaus_services/structures/utils/StructureUtils.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index edef3d58d..a707b1974 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -335,15 +335,12 @@ private void validateStructure(Structure structure) { public void deleteStructure(String structureId) throws RmesException { JSONArray components = repoGestion.getResponseAsArray(StructureQueries.getComponentsForStructure(structureId)); - System.out.println("Deleting structure " + structureId); components.forEach(component -> { String id = ((JSONObject) component).getString("id"); String type = ((JSONObject) component).getString("type"); - System.out.println("Deleting component " + id); try { structureComponentUtils.deleteComponent((JSONObject) component, id, type); } catch (RmesException e) { - System.out.println("Could not delete component " + id); } }); IRI structureIri = RdfUtils.structureIRI(structureId); From fd3b949e3dced8383379211c1d75b60f62b5bbed Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 6 Nov 2020 17:07:20 +0100 Subject: [PATCH 005/243] Remove duplicate method and test --- .../indicators/IndicatorsUtils.java | 130 ++++-------------- .../rmes/model/links/OperationsLink.java | 34 ++++- .../rmes/model/operations/Indicator.java | 31 ++++- .../fr/insee/rmes/CodeListsResourcesTest.java | 4 +- .../bauhaus_services/IndicatorsUtilsTest.java | 89 ++++++++++++ 5 files changed, 173 insertions(+), 115 deletions(-) create mode 100644 src/test/java/fr/insee/rmes/bauhaus_services/IndicatorsUtilsTest.java diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java index 121686117..b7dd66e3b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java @@ -66,7 +66,7 @@ public Indicator getIndicatorById(String id) throws RmesException{ return buildIndicatorFromJson(getIndicatorJsonById(id)); } - private Indicator buildIndicatorFromJson2(JSONObject indicatorJson) { + public Indicator buildIndicatorFromJson(JSONObject indicatorJson) { ObjectMapper mapper = new ObjectMapper(); String id= indicatorJson.getString(Constants.ID); Indicator indicator = new Indicator(id); @@ -75,115 +75,41 @@ private Indicator buildIndicatorFromJson2(JSONObject indicatorJson) { } catch (JsonProcessingException e) { logger.error("Json cannot be parsed: ".concat(e.getMessage())); } - return indicator; - } - - private Indicator buildIndicatorFromJson(JSONObject jsonIndicator) throws RmesException { - String id= jsonIndicator.getString(Constants.ID); - Indicator indicator = new Indicator(id); - if(jsonIndicator.has(Constants.PREF_LABEL_LG1)) { - indicator.setPrefLabelLg1(jsonIndicator.getString(Constants.PREF_LABEL_LG1)); - } - if(jsonIndicator.has(Constants.PREF_LABEL_LG2)) { - indicator.setPrefLabelLg2(jsonIndicator.getString(Constants.PREF_LABEL_LG2)); - } - if(jsonIndicator.has(Constants.ALT_LABEL_LG1)) { - indicator.setAltLabelLg1(jsonIndicator.getString(Constants.ALT_LABEL_LG1)); - } - if(jsonIndicator.has(Constants.ALT_LABEL_LG2)) { - indicator.setAltLabelLg2(jsonIndicator.getString(Constants.ALT_LABEL_LG2)); - } - if(jsonIndicator.has("abstractLg1")) { - indicator.setAbstractLg1(jsonIndicator.getString("abstractLg1")); - } - if(jsonIndicator.has("abstractLg2")) { - indicator.setAbstractLg2(jsonIndicator.getString("abstractLg2")); - } - if(jsonIndicator.has("historyNoteLg1")) { - indicator.setHistoryNoteLg1(jsonIndicator.getString("historyNoteLg1")); - } - if(jsonIndicator.has("historyNoteLg2")) { - indicator.setHistoryNoteLg2(jsonIndicator.getString("historyNoteLg2")); + if (indicatorJson.has(Constants.CONTRIBUTORS)) { + List contributors = buildListFromJsonToArray(indicatorJson, Constants.CONTRIBUTORS); + indicator.setContributors(contributors); } - if(jsonIndicator.has("accrualPeriodicityCode")) { - indicator.setAccrualPeriodicityCode(jsonIndicator.getString("accrualPeriodicityCode")); + if (indicatorJson.has(Constants.SEEALSO)) { + List seeAlsoes = buildListFromJsonToArray(indicatorJson, Constants.SEEALSO); + indicator.setSeeAlso(seeAlsoes); } - if(jsonIndicator.has("accrualPeriodicityList")) { - indicator.setAccrualPeriodicityList(jsonIndicator.getString("accrualPeriodicityList")); + if (indicatorJson.has(Constants.REPLACES)) { + List replacesList = buildListFromJsonToArray(indicatorJson, Constants.REPLACES); + indicator.setReplaces(replacesList); } - if(jsonIndicator.has(Constants.CREATORS)) { - indicator.setCreators(famOpeSerIndUtils.buildStringListFromJson( - jsonIndicator.getJSONArray(Constants.CREATORS))); + if (indicatorJson.has(Constants.ISREPLACEDBY)) { + List isReplacedByList = buildListFromJsonToArray(indicatorJson, Constants.ISREPLACEDBY); + indicator.setIsReplacedBy(isReplacedByList); } - if(jsonIndicator.has(Constants.PUBLISHERS)) { - List publishers = new ArrayList<>(); - List objects = famOpeSerIndUtils.buildObjectListFromJson( - jsonIndicator.getJSONArray(Constants.PUBLISHERS), - OperationsLink.getClassOperationsLink()); - for (Object o:objects){ - publishers.add((OperationsLink) o); - } - // indicator.setPublishers((OperationsLink[]) publishers.toArray()); - indicator.setPublishers(publishers); - } - if(jsonIndicator.has(Constants.ID_SIMS)) { - indicator.setIdSims(jsonIndicator.getString(Constants.ID_SIMS)); - } - if(jsonIndicator.has(Constants.CONTRIBUTORS)) { - List contributors = new ArrayList<>(); - List objects = famOpeSerIndUtils.buildObjectListFromJson( - jsonIndicator.getJSONArray(Constants.CONTRIBUTORS), - OperationsLink.getClassOperationsLink()); - for (Object o:objects){ - contributors.add((OperationsLink) o); - } - indicator.setContributors(contributors); - } - if(jsonIndicator.has(Constants.SEEALSO)) { - List seeAlsoes = new ArrayList<>(); - List objects = famOpeSerIndUtils.buildObjectListFromJson( - jsonIndicator.getJSONArray(Constants.SEEALSO), - OperationsLink.getClassOperationsLink()); - for (Object o:objects){ - seeAlsoes.add((OperationsLink) o); - } - indicator.setSeeAlso(seeAlsoes); - } - if(jsonIndicator.has(Constants.REPLACES)) { - List replacesList = new ArrayList<>(); - List objects = famOpeSerIndUtils.buildObjectListFromJson( - jsonIndicator.getJSONArray(Constants.REPLACES), - OperationsLink.getClassOperationsLink()); - for (Object o:objects){ - replacesList.add((OperationsLink) o); - } - indicator.setReplaces(replacesList); - } - if(jsonIndicator.has(Constants.ISREPLACEDBY)) { - List isReplacedByList = new ArrayList<>(); - List objects = famOpeSerIndUtils.buildObjectListFromJson( - jsonIndicator.getJSONArray(Constants.ISREPLACEDBY), - OperationsLink.getClassOperationsLink()); - for (Object o:objects){ - isReplacedByList.add((OperationsLink) o); - } - indicator.setIsReplacedBy(isReplacedByList); - } - if(jsonIndicator.has(Constants.WASGENERATEDBY)) { - List wasGeneratedByList = new ArrayList<>(); - List objects = famOpeSerIndUtils.buildObjectListFromJson( - jsonIndicator.getJSONArray(Constants.WASGENERATEDBY), - OperationsLink.getClassOperationsLink()); - for (Object o:objects){ - wasGeneratedByList.add((OperationsLink) o); - } - indicator.setWasGeneratedBy(wasGeneratedByList); + if (indicatorJson.has(Constants.WASGENERATEDBY)) { + List wasGeneratedByList = buildListFromJsonToArray(indicatorJson, Constants.WASGENERATEDBY); + indicator.setWasGeneratedBy(wasGeneratedByList); } return indicator; } - public JSONObject getIndicatorJsonById(String id) throws RmesException{ + private List buildListFromJsonToArray(JSONObject jsonIndicator, String constant) { + List list = new ArrayList<>(); + List objects = famOpeSerIndUtils.buildObjectListFromJson(jsonIndicator.getJSONArray(constant), + OperationsLink.getClassOperationsLink()); + for (Object o : objects) { + list.add((OperationsLink) o); + } + return list; + } + + public JSONObject getIndicatorJsonById(String id) throws RmesException { if (!checkIfIndicatorExists(id)) { throw new RmesNotFoundException(ErrorCodes.INDICATOR_UNKNOWN_ID,"Indicator not found: ", id); } @@ -192,8 +118,6 @@ public JSONObject getIndicatorJsonById(String id) throws RmesException{ indicator.put(Constants.ID, id); addLinks(id, indicator); addIndicatorCreators(id, indicator); - //addIndicatorPublishers(id, indicator); - return indicator; } diff --git a/src/main/java/fr/insee/rmes/model/links/OperationsLink.java b/src/main/java/fr/insee/rmes/model/links/OperationsLink.java index 207cf1f25..6e36565a5 100644 --- a/src/main/java/fr/insee/rmes/model/links/OperationsLink.java +++ b/src/main/java/fr/insee/rmes/model/links/OperationsLink.java @@ -1,5 +1,7 @@ package fr.insee.rmes.model.links; +import java.util.Objects; + import fr.opensagres.xdocreport.core.utils.StringUtils; import io.swagger.v3.oas.annotations.media.Schema; @@ -14,12 +16,6 @@ public class OperationsLink { @Schema(description = "Label lg1") public String labelLg1; -// @Schema(description = "Type of object", required = true) -// public String type; -// -// @Schema(description = "Label lg1", required = true) -// public String labelLg1; - @Schema(description = "Label lg2") public String labelLg2; @@ -39,6 +35,18 @@ public String getLabelLg2() { return labelLg2; } + public OperationsLink(String id, String type, String labelLg1, String labelLg2) { + super(); + this.id = id; + this.type = type; + this.labelLg1 = labelLg1; + this.labelLg2 = labelLg2; + } + + public OperationsLink() { + super(); + } + public boolean isEmpty() { return StringUtils.isEmpty(id); } @@ -46,4 +54,18 @@ public boolean isEmpty() { public static String getClassOperationsLink() { return "fr.insee.rmes.model.links.OperationsLink"; } + + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + OperationsLink other = (OperationsLink) obj; + return Objects.equals(id, other.id) && Objects.equals(labelLg1, other.labelLg1) + && Objects.equals(labelLg2, other.labelLg2) && Objects.equals(type, other.type); + } } diff --git a/src/main/java/fr/insee/rmes/model/operations/Indicator.java b/src/main/java/fr/insee/rmes/model/operations/Indicator.java index f1bf48564..97ee34e65 100644 --- a/src/main/java/fr/insee/rmes/model/operations/Indicator.java +++ b/src/main/java/fr/insee/rmes/model/operations/Indicator.java @@ -1,6 +1,7 @@ package fr.insee.rmes.model.operations; import java.util.List; +import java.util.Objects; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonFormat.Shape; @@ -11,6 +12,8 @@ public class Indicator { + + @Schema(description = "Id", required = true) public String id; @@ -250,8 +253,28 @@ public void setIdSims(String idSims) { public void setId(String id) { this.id = id; } -// -// public void setPublishers(List publishers) { -// this.publishers = publishers; -// } + + @Override + public boolean equals(Object obj) { + if (this == obj) + return true; + if (obj == null) + return false; + if (getClass() != obj.getClass()) + return false; + Indicator other = (Indicator) obj; + return Objects.equals(abstractLg1, other.abstractLg1) && Objects.equals(abstractLg2, other.abstractLg2) + && Objects.equals(accrualPeriodicityCode, other.accrualPeriodicityCode) + && Objects.equals(accrualPeriodicityList, other.accrualPeriodicityList) + && Objects.equals(altLabelLg1, other.altLabelLg1) && Objects.equals(altLabelLg2, other.altLabelLg2) + && Objects.equals(contributors, other.contributors) && Objects.equals(creators, other.creators) + && Objects.equals(historyNoteLg1, other.historyNoteLg1) + && Objects.equals(historyNoteLg2, other.historyNoteLg2) && Objects.equals(id, other.id) + && Objects.equals(idSims, other.idSims) && Objects.equals(isReplacedBy, other.isReplacedBy) + && Objects.equals(prefLabelLg1, other.prefLabelLg1) && Objects.equals(prefLabelLg2, other.prefLabelLg2) + && Objects.equals(publishers, other.publishers) && Objects.equals(replaces, other.replaces) + && Objects.equals(seeAlso, other.seeAlso) && Objects.equals(wasGeneratedBy, other.wasGeneratedBy); + } + + } diff --git a/src/test/java/fr/insee/rmes/CodeListsResourcesTest.java b/src/test/java/fr/insee/rmes/CodeListsResourcesTest.java index a7b1d450e..7d7367256 100644 --- a/src/test/java/fr/insee/rmes/CodeListsResourcesTest.java +++ b/src/test/java/fr/insee/rmes/CodeListsResourcesTest.java @@ -23,7 +23,7 @@ import fr.insee.rmes.webservice.CodeListsResources; -public class CodeListsResourcesTest { +class CodeListsResourcesTest { private final static String NOTATION = "213"; @@ -48,7 +48,7 @@ public void init() { //getCodeListByNotation// @Test - public void givengetCodeListByNotation_whenCorrectRequest_thenResponseIsOk() throws RmesException { + void givengetCodeListByNotation_whenCorrectRequest_thenResponseIsOk() throws RmesException { when(repoGestion.getResponseAsObject(anyString())).thenReturn(new JSONObject()); when(repoGestion.getResponseAsArray(anyString())).thenReturn(new JSONArray()); diff --git a/src/test/java/fr/insee/rmes/bauhaus_services/IndicatorsUtilsTest.java b/src/test/java/fr/insee/rmes/bauhaus_services/IndicatorsUtilsTest.java new file mode 100644 index 000000000..776e1f681 --- /dev/null +++ b/src/test/java/fr/insee/rmes/bauhaus_services/IndicatorsUtilsTest.java @@ -0,0 +1,89 @@ +package fr.insee.rmes.bauhaus_services; + +import java.util.ArrayList; +import java.util.List; + +import org.json.JSONObject; +import org.junit.jupiter.api.Assertions; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.mockito.InjectMocks; +import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; + +import fr.insee.rmes.bauhaus_services.operations.famopeserind_utils.FamOpeSerIndUtils; +import fr.insee.rmes.bauhaus_services.operations.indicators.IndicatorsUtils; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.links.OperationsLink; +import fr.insee.rmes.model.operations.Indicator; + +public class IndicatorsUtilsTest { + + private final static String json = "{\"idSims\":\"1779\",\"wasGeneratedBy\":[{\"labelLg2\":\"Other indexes\",\"labelLg1\":\"Autres indicateurs\",\"id\":\"s1034\"}],\"abstractLg1\":\"Le nombre d'immatriculations de voitures particulières neuves permet de suivre l'évolution du marché automobile français et constitue l'un des indicateurs permettant de calculer la consommation des ménages en automobile.\",\"prefLabelLg1\":\"Immatriculations de voitures particulières neuves\",\"abstractLg2\":\"The number of new private car registrations is used to monitor the trends on the French automobile market and constitutes one of the indicators used to calculate household automobile consumption.\",\"prefLabelLg2\":\"New private car registrations\",\"creators\":[],\"publishers\":[],\"id\":\"p1638\",\"contributors\":[]} "; + private final static JSONObject jsonIndicator = new JSONObject(json); + private Indicator indicator; + + + + @InjectMocks //CLASS TO TEST + private IndicatorsUtils indicatorsUtils; + + + // @Mock + @InjectMocks + FamOpeSerIndUtils famOpeSerIndUtilsMock; + + + @BeforeEach + public void init() { + famOpeSerIndUtilsMock = Mockito.spy(new FamOpeSerIndUtils()); + MockitoAnnotations.initMocks(this); + + try { + initIndicator(); + } catch (RmesException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + + } + + //getCodeListByNotation// + + @Test + void givenBuildIndicatorFromJson_whenCorrectRequest_thenResponseIsOk() throws RmesException { + + Indicator indicatorByApp = indicatorsUtils.buildIndicatorFromJson(jsonIndicator); + Assertions.assertEquals(indicator, indicatorByApp); + + } + + + public void initIndicator() throws RmesException { + indicator = new Indicator(); + indicator.setId("p1638"); + indicator.setIdSims("1779"); + + indicator.setAbstractLg1("Le nombre d'immatriculations de voitures particulières neuves permet de suivre l'évolution du marché automobile français et constitue l'un des indicateurs permettant de calculer la consommation des ménages en automobile."); + indicator.setAbstractLg2("The number of new private car registrations is used to monitor the trends on the French automobile market and constitutes one of the indicators used to calculate household automobile consumption."); + indicator.setPrefLabelLg1("Immatriculations de voitures particulières neuves"); + indicator.setPrefLabelLg2("New private car registrations"); + + List creators = new ArrayList<>(); + indicator.setCreators(creators); + + List pubList = new ArrayList<>(); + indicator.setPublishers(pubList); + + List contrList = new ArrayList<>(); + indicator.setContributors(contrList); + + OperationsLink wgb = new OperationsLink("s1034",null,"Autres indicateurs","Other indexes"); + List wgbList = new ArrayList<>(); + wgbList.add(wgb); + indicator.setWasGeneratedBy(wgbList); + + } + + +} From e396d4d8284e531d826c5c02e12bca2ca8c4a4d1 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 10 Nov 2020 12:17:11 +0100 Subject: [PATCH 006/243] Normalize filenames --- .../concepts/ConceptsImpl.java | 3 +- .../mail_sender/RmesMailSenderImpl.java | 9 +++--- .../java/fr/insee/rmes/utils/FileUtils.java | 14 ++++++++++ .../fr/insee/rmes/utils/FileUtilsTest.java | 28 +++++++++++++++++++ .../CodeListsResourcesTest.java | 3 +- 5 files changed, 50 insertions(+), 7 deletions(-) create mode 100644 src/test/java/fr/insee/rmes/utils/FileUtilsTest.java rename src/test/java/fr/insee/rmes/{ => webservice}/CodeListsResourcesTest.java (95%) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java index 2bdbaa5f3..1770ba454 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java @@ -31,6 +31,7 @@ import fr.insee.rmes.model.mail_sender.MailSenderContract; import fr.insee.rmes.persistance.sparql_queries.concepts.CollectionsQueries; import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; +import fr.insee.rmes.utils.FileUtils; @Service public class ConceptsImpl extends RdfService implements ConceptsService { @@ -237,7 +238,7 @@ public Response getConceptExport(String id, String acceptHeader) { return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); } InputStream is = jasper.exportConcept(concept, acceptHeader); - String fileName = concept.getString(Constants.PREF_LABEL_LG1) + jasper.getExtension(acceptHeader); + String fileName = FileUtils.cleanFileNameAndAddExtension(concept.getString(Constants.PREF_LABEL_LG1), jasper.getExtension(acceptHeader)) ; ContentDisposition content = ContentDisposition.type("attachment").fileName(fileName).build(); return Response.ok(is, acceptHeader) .header("Content-Disposition", content) diff --git a/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java b/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java index cc681900c..3c1ea7278 100644 --- a/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java @@ -2,7 +2,6 @@ import java.io.IOException; import java.io.InputStream; -import java.text.Normalizer; import java.util.ArrayList; import java.util.List; @@ -38,6 +37,7 @@ import fr.insee.rmes.external_services.mail_sender.SendRequest.Recipients; import fr.insee.rmes.model.mail_sender.Mail; import fr.insee.rmes.model.mail_sender.MailSenderContract; +import fr.insee.rmes.utils.FileUtils; @Service public class RmesMailSenderImpl implements MailSenderContract { @@ -76,10 +76,9 @@ public boolean sendMailCollection(String id, String body) throws RmesException } private boolean sendMail(Mail mail, InputStream is, JSONObject json) { - + String fileName = json.getString(Constants.PREF_LABEL_LG1); - fileName = Normalizer.normalize(fileName.toLowerCase() - .replace(" ", "-"), Normalizer.Form.NFD).replace("[^\\p{ASCII}]", "") + ".odt"; + fileName = FileUtils.cleanFileNameAndAddOdtExtension(fileName); MessageTemplate messagetemplate = new MessageTemplate(); @@ -135,6 +134,8 @@ private boolean sendMail(Mail mail, InputStream is, JSONObject json) { .post(Entity.entity(mp, MediaType.MULTIPART_FORM_DATA_TYPE),String.class); return isMailSent(result); } + + private Mail prepareMail(String body) throws RmesException { ObjectMapper mapper = new ObjectMapper(); diff --git a/src/main/java/fr/insee/rmes/utils/FileUtils.java b/src/main/java/fr/insee/rmes/utils/FileUtils.java index 320fe46e7..f883b4f57 100644 --- a/src/main/java/fr/insee/rmes/utils/FileUtils.java +++ b/src/main/java/fr/insee/rmes/utils/FileUtils.java @@ -12,6 +12,7 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import java.text.Normalizer; import java.util.HashMap; import java.util.Map; @@ -42,6 +43,19 @@ public static File streamToFile(InputStream in, String fileName, String fileExte } return tempFile; } + + public static String cleanFileNameAndAddExtension(String fileName, String extension) { + fileName = fileName.toLowerCase().trim(); + fileName = StringUtils.normalizeSpace(fileName); + fileName = fileName.replace(" ","-"); + fileName = Normalizer.normalize(fileName, Normalizer.Form.NFD).replace("[^\\p{ASCII}]", "") ; + if (extension.startsWith(".")) { + fileName += extension ; + }else { + fileName += "." + extension ; + } + return fileName; + } public static File zipFile(File inputFile) throws IOException { Map env = new HashMap<>(); diff --git a/src/test/java/fr/insee/rmes/utils/FileUtilsTest.java b/src/test/java/fr/insee/rmes/utils/FileUtilsTest.java new file mode 100644 index 000000000..1f2b30d2b --- /dev/null +++ b/src/test/java/fr/insee/rmes/utils/FileUtilsTest.java @@ -0,0 +1,28 @@ +package fr.insee.rmes.utils; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; + +import fr.insee.rmes.exceptions.RmesException; + +class FileUtilsTest { + + @ParameterizedTest + @ValueSource(strings = { "Carrières complètes ", "carrières-complètes", " Carrières complètes " }) + void givenCleanFileName_whenString_thenResponseIsClean(String name) throws RmesException { + + String cleanFileName = FileUtils.cleanFileNameAndAddExtension(name, "odt"); + assertEquals("carrières-complètes.odt", cleanFileName); + } + + @Test + void givenCleanFileName_whenStringWithPointExtension_thenResponseIsClean() throws RmesException { + + String cleanFileName = FileUtils.cleanFileNameAndAddExtension("test de nommage bidon ", ".odt"); + assertEquals("test-de-nommage-bidon.odt", cleanFileName); + } + +} diff --git a/src/test/java/fr/insee/rmes/CodeListsResourcesTest.java b/src/test/java/fr/insee/rmes/webservice/CodeListsResourcesTest.java similarity index 95% rename from src/test/java/fr/insee/rmes/CodeListsResourcesTest.java rename to src/test/java/fr/insee/rmes/webservice/CodeListsResourcesTest.java index 7d7367256..9622bfa2f 100644 --- a/src/test/java/fr/insee/rmes/CodeListsResourcesTest.java +++ b/src/test/java/fr/insee/rmes/webservice/CodeListsResourcesTest.java @@ -1,4 +1,4 @@ -package fr.insee.rmes; +package fr.insee.rmes.webservice; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.mockito.ArgumentMatchers.anyString; @@ -20,7 +20,6 @@ import fr.insee.rmes.bauhaus_services.code_list.CodeListServiceImpl; import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryGestion; import fr.insee.rmes.exceptions.RmesException; -import fr.insee.rmes.webservice.CodeListsResources; class CodeListsResourcesTest { From c3321e3c575b2fce3930161224a715d937d9c0ca Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 10 Nov 2020 12:18:20 +0100 Subject: [PATCH 007/243] Update RmesMailSenderImpl.java --- .../rmes/external_services/mail_sender/RmesMailSenderImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java b/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java index 3c1ea7278..dd4dc3bea 100644 --- a/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java @@ -78,7 +78,7 @@ public boolean sendMailCollection(String id, String body) throws RmesException private boolean sendMail(Mail mail, InputStream is, JSONObject json) { String fileName = json.getString(Constants.PREF_LABEL_LG1); - fileName = FileUtils.cleanFileNameAndAddOdtExtension(fileName); + fileName = FileUtils.cleanFileNameAndAddExtension(fileName,"odt"); MessageTemplate messagetemplate = new MessageTemplate(); From aa408f7015f711839268dcef4098d3ee89e935b7 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 10 Nov 2020 12:18:30 +0100 Subject: [PATCH 008/243] Update tests --- pom.xml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 552df93a5..f478c80e9 100644 --- a/pom.xml +++ b/pom.xml @@ -43,7 +43,7 @@ 4.3.25.RELEASE 4.2.17.RELEASE 2.13.3 - 5.5.2 + 5.7.0 UTF-8 @@ -241,6 +241,12 @@ ${junit.version} test + + org.junit.jupiter + junit-jupiter-params + ${junit.version} + test + org.mockito mockito-junit-jupiter From a58fe8e8509e679fde91ec2a85db51e1d1073794 Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Fri, 13 Nov 2020 20:10:58 +0100 Subject: [PATCH 009/243] feat: add contributor and creator to structure/component --- .../utils/StructureComponentUtils.java | 3 ++ .../structures/utils/StructureUtils.java | 2 ++ .../model/structures/MutualizedComponent.java | 19 +++++++++++++ .../rmes/model/structures/Structure.java | 28 ++++++++++++++++++- .../structures/getMutualizedComponent.ftlh | 10 ++++++- .../request/structures/getStructure.ftlh | 11 +++++++- 6 files changed, 70 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 7628f9650..bad285f39 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -13,6 +13,7 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.vocabulary.DC; import org.eclipse.rdf4j.model.vocabulary.DCTERMS; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; @@ -141,6 +142,8 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou model.add(componentURI, INSEE.VALIDATION_STATE, RdfUtils.setLiteralString(status), graph); model.add(componentURI, DCTERMS.CREATED, RdfUtils.setLiteralDateTime(component.getCreated()), graph); model.add(componentURI, DCTERMS.MODIFIED, RdfUtils.setLiteralDateTime(component.getUpdated()), graph); + RdfUtils.addTripleString(componentURI, DC.CREATOR, component.getCreator(), model, graph); + RdfUtils.addTripleString(componentURI, DCTERMS.CONTRIBUTOR, component.getContributor(), model, graph); RdfUtils.addTripleUri(componentURI, QB.CONCEPT, INSEE.STRUCTURE_CONCEPT + component.getConcept(), model, graph); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index a707b1974..356bf70b0 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -207,6 +207,8 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru RdfUtils.addTripleString(structureIri, DC.DESCRIPTION, structure.getDescriptionLg1(), Config.LG1, model, graph); RdfUtils.addTripleString(structureIri, DC.DESCRIPTION, structure.getDescriptionLg2(), Config.LG2, model, graph); + RdfUtils.addTripleString(structureIri, DC.CREATOR, structure.getCreator(), model, graph); + RdfUtils.addTripleString(structureIri, DCTERMS.CONTRIBUTOR, structure.getContributor(), model, graph); createRdfComponentSpecifications(structureIri, structure.getComponentDefinitions(), model, graph); diff --git a/src/main/java/fr/insee/rmes/model/structures/MutualizedComponent.java b/src/main/java/fr/insee/rmes/model/structures/MutualizedComponent.java index 4fbc72d38..117d26d05 100644 --- a/src/main/java/fr/insee/rmes/model/structures/MutualizedComponent.java +++ b/src/main/java/fr/insee/rmes/model/structures/MutualizedComponent.java @@ -22,6 +22,9 @@ public class MutualizedComponent { private String created; private String updated; + private String creator; + private String contributor; + public MutualizedComponent() throws RmesException { //nothing to do @@ -130,4 +133,20 @@ public String getUpdated() { public void setUpdated(String updated) { this.updated = updated; } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getContributor() { + return contributor; + } + + public void setContributor(String contributor) { + this.contributor = contributor; + } } diff --git a/src/main/java/fr/insee/rmes/model/structures/Structure.java b/src/main/java/fr/insee/rmes/model/structures/Structure.java index c9762b2bd..28a58202c 100644 --- a/src/main/java/fr/insee/rmes/model/structures/Structure.java +++ b/src/main/java/fr/insee/rmes/model/structures/Structure.java @@ -14,7 +14,9 @@ public class Structure { private String descriptionLg2; private List componentDefinitions; private String created; - + private String validationState; + private String contributor; + private String creator; private String updated; @@ -98,4 +100,28 @@ public String getIdentifiant() { public void setIdentifiant(String identifiant) { this.identifiant = identifiant; } + + public String getValidationState() { + return validationState; + } + + public void setValidationState(String validationState) { + this.validationState = validationState; + } + + public String getCreator() { + return creator; + } + + public void setCreator(String creator) { + this.creator = creator; + } + + public String getContributor() { + return contributor; + } + + public void setContributor(String contributor) { + this.contributor = contributor; + } } diff --git a/src/main/resources/request/structures/getMutualizedComponent.ftlh b/src/main/resources/request/structures/getMutualizedComponent.ftlh index 5d316f764..e1ab0c74b 100644 --- a/src/main/resources/request/structures/getMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponent.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?type ?concept ?codeList ?range ?descriptionLg1 ?descriptionLg2 ?validationState ?created ?modified +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?type ?concept ?codeList ?range ?descriptionLg1 ?descriptionLg2 ?validationState ?created ?modified ?creator ?contributor FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { ?component dcterms:identifier '${ID}' ; @@ -6,6 +6,14 @@ WHERE { rdf:type ?type ; rdfs:label ?labelLg1 . + OPTIONAL { + ?structure dc:creator ?creator . + } . + + OPTIONAL { + ?structure dcterms:contributor ?contributor . + } . + OPTIONAL { ?component insee:validationState ?validationState } . diff --git a/src/main/resources/request/structures/getStructure.ftlh b/src/main/resources/request/structures/getStructure.ftlh index 755ef921b..e8e713827 100644 --- a/src/main/resources/request/structures/getStructure.ftlh +++ b/src/main/resources/request/structures/getStructure.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?created ?modified +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?created ?modified ?creator ?contributor FROM <${STRUCTURES_GRAPH}> WHERE { ?structure dcterms:identifier "${ID}" ; @@ -13,6 +13,15 @@ WHERE { } . OPTIONAL { + ?structure dc:creator ?creator . + } . + + OPTIONAL { + ?structure dcterms:contributor ?contributor . + } . + + OPTIONAL { + ?structure dcterms:modified ?modified . } . From 7a5b5e49664c14f28ffd7f03d941ffa3b6f3d71e Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Fri, 13 Nov 2020 20:34:21 +0100 Subject: [PATCH 010/243] feat: add DISSEMINATIONSTATUS to structure/component --- .../structures/utils/StructureComponentUtils.java | 1 + .../structures/utils/StructureUtils.java | 1 + .../rmes/model/structures/MutualizedComponent.java | 9 +++++++++ .../java/fr/insee/rmes/model/structures/Structure.java | 10 +++++++++- .../request/structures/getMutualizedComponent.ftlh | 6 +++++- .../resources/request/structures/getStructure.ftlh | 6 +++++- 6 files changed, 30 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index bad285f39..0758f199f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -144,6 +144,7 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou model.add(componentURI, DCTERMS.MODIFIED, RdfUtils.setLiteralDateTime(component.getUpdated()), graph); RdfUtils.addTripleString(componentURI, DC.CREATOR, component.getCreator(), model, graph); RdfUtils.addTripleString(componentURI, DCTERMS.CONTRIBUTOR, component.getContributor(), model, graph); + RdfUtils.addTripleUri(componentURI, INSEE.DISSEMINATIONSTATUS, component.getDisseminationStatus(), model, graph); RdfUtils.addTripleUri(componentURI, QB.CONCEPT, INSEE.STRUCTURE_CONCEPT + component.getConcept(), model, graph); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 356bf70b0..6c22ab9b5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -209,6 +209,7 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru RdfUtils.addTripleString(structureIri, DC.CREATOR, structure.getCreator(), model, graph); RdfUtils.addTripleString(structureIri, DCTERMS.CONTRIBUTOR, structure.getContributor(), model, graph); + RdfUtils.addTripleUri(structureIri, INSEE.DISSEMINATIONSTATUS, structure.getDisseminationStatus(), model, graph); createRdfComponentSpecifications(structureIri, structure.getComponentDefinitions(), model, graph); diff --git a/src/main/java/fr/insee/rmes/model/structures/MutualizedComponent.java b/src/main/java/fr/insee/rmes/model/structures/MutualizedComponent.java index 117d26d05..c4a0c93fe 100644 --- a/src/main/java/fr/insee/rmes/model/structures/MutualizedComponent.java +++ b/src/main/java/fr/insee/rmes/model/structures/MutualizedComponent.java @@ -24,6 +24,7 @@ public class MutualizedComponent { private String creator; private String contributor; + private String disseminationStatus; public MutualizedComponent() throws RmesException { @@ -149,4 +150,12 @@ public String getContributor() { public void setContributor(String contributor) { this.contributor = contributor; } + + public String getDisseminationStatus() { + return disseminationStatus; + } + + public void setDisseminationStatus(String disseminationStatus) { + this.disseminationStatus = disseminationStatus; + } } diff --git a/src/main/java/fr/insee/rmes/model/structures/Structure.java b/src/main/java/fr/insee/rmes/model/structures/Structure.java index 28a58202c..90201e54c 100644 --- a/src/main/java/fr/insee/rmes/model/structures/Structure.java +++ b/src/main/java/fr/insee/rmes/model/structures/Structure.java @@ -17,7 +17,7 @@ public class Structure { private String validationState; private String contributor; private String creator; - + private String disseminationStatus; private String updated; @@ -124,4 +124,12 @@ public String getContributor() { public void setContributor(String contributor) { this.contributor = contributor; } + + public String getDisseminationStatus() { + return disseminationStatus; + } + + public void setDisseminationStatus(String disseminationStatus) { + this.disseminationStatus = disseminationStatus; + } } diff --git a/src/main/resources/request/structures/getMutualizedComponent.ftlh b/src/main/resources/request/structures/getMutualizedComponent.ftlh index e1ab0c74b..c26d7b516 100644 --- a/src/main/resources/request/structures/getMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponent.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?type ?concept ?codeList ?range ?descriptionLg1 ?descriptionLg2 ?validationState ?created ?modified ?creator ?contributor +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?type ?concept ?codeList ?range ?descriptionLg1 ?descriptionLg2 ?validationState ?created ?modified ?creator ?contributor ?disseminationStatus FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { ?component dcterms:identifier '${ID}' ; @@ -14,6 +14,10 @@ WHERE { ?structure dcterms:contributor ?contributor . } . + OPTIONAL { + ?structure insee:disseminationStatus ?disseminationStatus . + } . + OPTIONAL { ?component insee:validationState ?validationState } . diff --git a/src/main/resources/request/structures/getStructure.ftlh b/src/main/resources/request/structures/getStructure.ftlh index e8e713827..794daace8 100644 --- a/src/main/resources/request/structures/getStructure.ftlh +++ b/src/main/resources/request/structures/getStructure.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?created ?modified ?creator ?contributor +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?created ?modified ?creator ?contributor ?disseminationStatus FROM <${STRUCTURES_GRAPH}> WHERE { ?structure dcterms:identifier "${ID}" ; @@ -8,6 +8,10 @@ WHERE { FILTER (lang(?labelLg1) = '${LG1}') FILTER (lang(?labelLg2) = '${LG2}') + OPTIONAL { + ?structure insee:disseminationStatus ?disseminationStatus . + } . + OPTIONAL { ?structure dcterms:created ?created . } . From 8b65c386b867291c3f251013ce87b0ef31c3431a Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Mon, 16 Nov 2020 09:00:54 +0100 Subject: [PATCH 011/243] feat: add validationStatus to a Structure --- .../structures/utils/StructureUtils.java | 4 +++- .../java/fr/insee/rmes/model/structures/Structure.java | 9 ++++++--- src/main/resources/request/structures/getStructure.ftlh | 6 +++++- 3 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 6c22ab9b5..8f79aa702 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -6,6 +6,7 @@ import javax.ws.rs.BadRequestException; +import fr.insee.rmes.model.ValidationStatus; import fr.insee.rmes.persistance.ontologies.INSEE; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -133,7 +134,7 @@ public String setStructure(String body) throws RmesException { String id = generateNextId(); structure.setId(id); - + structure.setValidationState(ValidationStatus.UNPUBLISHED); createRdfStructure(structure); logger.info("Create Structure : {} - {}", structure.getId(), structure.getLabelLg1()); return structure.getId().replace(" ", "-").toLowerCase(); @@ -198,6 +199,7 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru model.add(structureIri, DCTERMS.IDENTIFIER, RdfUtils.setLiteralString(structureId), graph); model.add(structureIri, INSEE.IDENTIFIANT_METIER, RdfUtils.setLiteralString(structure.getIdentifiant()), graph); model.add(structureIri, RDFS.LABEL, RdfUtils.setLiteralString(structure.getLabelLg1(), Config.LG1), graph); + model.add(structureIri, INSEE.VALIDATION_STATE, RdfUtils.setLiteralString(structure.getValidationState()), graph); /*Optional*/ RdfUtils.addTripleDateTime(structureIri, DCTERMS.CREATED, structure.getCreated(), model, graph); diff --git a/src/main/java/fr/insee/rmes/model/structures/Structure.java b/src/main/java/fr/insee/rmes/model/structures/Structure.java index 90201e54c..aa68dcd13 100644 --- a/src/main/java/fr/insee/rmes/model/structures/Structure.java +++ b/src/main/java/fr/insee/rmes/model/structures/Structure.java @@ -3,6 +3,9 @@ import java.util.List; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.ValidationStatus; + +import javax.validation.Validation; public class Structure { @@ -14,7 +17,7 @@ public class Structure { private String descriptionLg2; private List componentDefinitions; private String created; - private String validationState; + private ValidationStatus validationState; private String contributor; private String creator; private String disseminationStatus; @@ -101,11 +104,11 @@ public void setIdentifiant(String identifiant) { this.identifiant = identifiant; } - public String getValidationState() { + public ValidationStatus getValidationState() { return validationState; } - public void setValidationState(String validationState) { + public void setValidationState(ValidationStatus validationState) { this.validationState = validationState; } diff --git a/src/main/resources/request/structures/getStructure.ftlh b/src/main/resources/request/structures/getStructure.ftlh index 794daace8..02efe4957 100644 --- a/src/main/resources/request/structures/getStructure.ftlh +++ b/src/main/resources/request/structures/getStructure.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?created ?modified ?creator ?contributor ?disseminationStatus +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?created ?modified ?creator ?contributor ?disseminationStatus ?validationState FROM <${STRUCTURES_GRAPH}> WHERE { ?structure dcterms:identifier "${ID}" ; @@ -29,6 +29,10 @@ WHERE { ?structure dcterms:modified ?modified . } . + OPTIONAL { + ?structure insee:validationState ?validationState + } . + OPTIONAL { ?structure rdfs:comment ?descriptionLg1 . FILTER (lang(?descriptionLg1) = '${LG1}') From 8271b520f30ba6dfe305175ce461add3c16e39ee Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Mon, 16 Nov 2020 12:30:11 +0100 Subject: [PATCH 012/243] fix: solve issue with component query --- .../request/structures/getMutualizedComponent.ftlh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/request/structures/getMutualizedComponent.ftlh b/src/main/resources/request/structures/getMutualizedComponent.ftlh index c26d7b516..e917ad1de 100644 --- a/src/main/resources/request/structures/getMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponent.ftlh @@ -7,15 +7,15 @@ WHERE { rdfs:label ?labelLg1 . OPTIONAL { - ?structure dc:creator ?creator . + ?component dc:creator ?creator . } . OPTIONAL { - ?structure dcterms:contributor ?contributor . + ?component dcterms:contributor ?contributor . } . OPTIONAL { - ?structure insee:disseminationStatus ?disseminationStatus . + ?component insee:disseminationStatus ?disseminationStatus . } . OPTIONAL { From 6bc46a4cd8321633efa54e7062e1e03394f08064 Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Mon, 16 Nov 2020 13:01:00 +0100 Subject: [PATCH 013/243] fix: solve issue with Structure --- .../structures/utils/StructureUtils.java | 14 +++++++------- .../fr/insee/rmes/model/structures/Structure.java | 9 --------- 2 files changed, 7 insertions(+), 16 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 8f79aa702..5d079da24 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -4,6 +4,7 @@ import java.util.ArrayList; import java.util.List; +import javax.validation.Validation; import javax.ws.rs.BadRequestException; import fr.insee.rmes.model.ValidationStatus; @@ -134,8 +135,7 @@ public String setStructure(String body) throws RmesException { String id = generateNextId(); structure.setId(id); - structure.setValidationState(ValidationStatus.UNPUBLISHED); - createRdfStructure(structure); + createRdfStructure(structure, ValidationStatus.UNPUBLISHED); logger.info("Create Structure : {} - {}", structure.getId(), structure.getLabelLg1()); return structure.getId().replace(" ", "-").toLowerCase(); } @@ -172,7 +172,7 @@ public String setStructure(String id, String body) throws RmesException { structure.setUpdated(DateUtils.getCurrentDate()); IRI structureIri = RdfUtils.structureIRI(structure.getId()); repoGestion.clearStructureNodeAndComponents(structureIri); - createRdfStructure(structure); + createRdfStructure(structure, ValidationStatus.MODIFIED); logger.info("Update Structure : {} - {}", structure.getId(), structure.getLabelLg1()); return structure.getId(); } @@ -183,15 +183,15 @@ public String setStructure(String id, String body) throws RmesException { * @throws RmesException */ - public void createRdfStructure(Structure structure) throws RmesException { + public void createRdfStructure(Structure structure, ValidationStatus status) throws RmesException { String structureId = structure.getId(); IRI structureIri = RdfUtils.structureIRI(structureId); Resource graph = RdfUtils.structureGraph(); - createRdfStructure(structure, structureId, structureIri, graph); + createRdfStructure(structure, structureId, structureIri, graph, status); } - public void createRdfStructure(Structure structure, String structureId, IRI structureIri, Resource graph) throws RmesException { + public void createRdfStructure(Structure structure, String structureId, IRI structureIri, Resource graph, ValidationStatus status) throws RmesException { Model model = new LinkedHashModel(); model.add(structureIri, RDF.TYPE, QB.DATA_STRUCTURE_DEFINITION, graph); @@ -199,7 +199,7 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru model.add(structureIri, DCTERMS.IDENTIFIER, RdfUtils.setLiteralString(structureId), graph); model.add(structureIri, INSEE.IDENTIFIANT_METIER, RdfUtils.setLiteralString(structure.getIdentifiant()), graph); model.add(structureIri, RDFS.LABEL, RdfUtils.setLiteralString(structure.getLabelLg1(), Config.LG1), graph); - model.add(structureIri, INSEE.VALIDATION_STATE, RdfUtils.setLiteralString(structure.getValidationState()), graph); + model.add(structureIri, INSEE.VALIDATION_STATE, RdfUtils.setLiteralString(status.toString()), graph); /*Optional*/ RdfUtils.addTripleDateTime(structureIri, DCTERMS.CREATED, structure.getCreated(), model, graph); diff --git a/src/main/java/fr/insee/rmes/model/structures/Structure.java b/src/main/java/fr/insee/rmes/model/structures/Structure.java index aa68dcd13..9839f3837 100644 --- a/src/main/java/fr/insee/rmes/model/structures/Structure.java +++ b/src/main/java/fr/insee/rmes/model/structures/Structure.java @@ -17,7 +17,6 @@ public class Structure { private String descriptionLg2; private List componentDefinitions; private String created; - private ValidationStatus validationState; private String contributor; private String creator; private String disseminationStatus; @@ -104,14 +103,6 @@ public void setIdentifiant(String identifiant) { this.identifiant = identifiant; } - public ValidationStatus getValidationState() { - return validationState; - } - - public void setValidationState(ValidationStatus validationState) { - this.validationState = validationState; - } - public String getCreator() { return creator; } From b678e52bc8fb572cfa21c418e8140fb7a141b8b4 Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Mon, 16 Nov 2020 15:53:32 +0100 Subject: [PATCH 014/243] feat: add notation to codes list --- src/main/resources/request/codes-list/getAllCodesLists.ftlh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/request/codes-list/getAllCodesLists.ftlh b/src/main/resources/request/codes-list/getAllCodesLists.ftlh index 7e66dc0a8..326368c50 100644 --- a/src/main/resources/request/codes-list/getAllCodesLists.ftlh +++ b/src/main/resources/request/codes-list/getAllCodesLists.ftlh @@ -1,9 +1,10 @@ -SELECT ?uri ?label ?range +SELECT ?uri ?label ?range ?notation WHERE { { GRAPH <${CODES_LISTS_GRAPH}> { ?uri rdf:type skos:ConceptScheme . ?uri skos:prefLabel ?label . +?uri skos:notation ?notation . FILTER(lang(?label) = 'fr') . ?range rdfs:seeAlso ?uri } From 1852cbd8e1c240ae0a6e34fb680e7b4a338312c7 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 17 Nov 2020 18:55:43 +0100 Subject: [PATCH 015/243] interpret Code Lists in SimsExport --- .../bauhaus_services/CodeListService.java | 2 +- .../rmes/bauhaus_services/Constants.java | 6 +- .../bauhaus_services/code_list/CodeList.java | 54 +++++++++++++++ .../code_list/CodeListItem.java | 59 ++++++++++++++++ .../code_list/CodeListServiceImpl.java | 30 ++++++++- .../documentations/DocumentationExport.java | 4 +- .../documentations/DocumentationsUtils.java | 52 ++++++++++++-- .../config/swagger/model/IdLabelTwoLangs.java | 39 ++++++----- .../java/fr/insee/rmes/utils/XMLUtils.java | 14 ++++ .../rmes/webservice/CodeListsResources.java | 2 +- .../xslTransformerFiles/testXSLT.xsl | 67 +++++++++++-------- 11 files changed, 270 insertions(+), 59 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeList.java create mode 100644 src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListItem.java diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/CodeListService.java b/src/main/java/fr/insee/rmes/bauhaus_services/CodeListService.java index ae4ecac72..c0be019a8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/CodeListService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/CodeListService.java @@ -5,7 +5,7 @@ public interface CodeListService { - String getCodeList(String codeListUri) throws RmesException; + String getCodeListJson(String codeListUri) throws RmesException; String getCode(String notation, String id) throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 315cc0b9d..185bc7ccd 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -3,10 +3,13 @@ public class Constants { /*A*/ + public static final String ACCRUAL_PERIODICITY_LIST ="accrualPeriodicityList"; public static final String ALT_LABEL_LG1 = "altLabelLg1"; public static final String ALT_LABEL_LG2 = "altLabelLg2"; /*C*/ + public static final String CODE_LIST_FREQ = "CL_FREQ"; + public static final String CODE_LIST_SOURCE_CATEGORY = "CL_SOURCE_CATEGORY"; public static final String CREATOR = "creator"; public static final String CREATORS = "creators"; public static final String CONTRIBUTOR = "contributor"; @@ -76,9 +79,10 @@ public class Constants { public static final String SEEALSO = "seeAlso"; /*T*/ - public static final String TYPE_OF_OBJECT = "typeOfObject"; public static final String TEXT_LG1 = "texte"; public static final String TEXT_LG2 = "text"; + public static final String TYPE_OF_OBJECT = "typeOfObject"; + public static final String TYPELIST = "typeList"; /*U*/ public static final String UNDEFINED = "undefined"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeList.java b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeList.java new file mode 100644 index 000000000..60af58cdc --- /dev/null +++ b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeList.java @@ -0,0 +1,54 @@ +package fr.insee.rmes.bauhaus_services.code_list; + +import java.util.List; + +import io.swagger.v3.oas.annotations.media.Schema; + +public class CodeList { + + @Schema(description = "Notation", required = true) + public String notation; + + @Schema(description = "Label lg1", required = true) + public String codeListLabelLg1; + + @Schema(description = "Label lg2") + public String codeListLabelLg2; + + @Schema(description = "Codes") + public List codes; + + public String getNotation() { + return notation; + } + + public void setNotation(String notation) { + this.notation = notation; + } + + public String getCodeListLabelLg1() { + return codeListLabelLg1; + } + + public void setCodeListLabelLg1(String codeListLabelLg1) { + this.codeListLabelLg1 = codeListLabelLg1; + } + + public String getCodeListLabelLg2() { + return codeListLabelLg2; + } + + public void setCodeListLabelLg2(String codeListLabelLg2) { + this.codeListLabelLg2 = codeListLabelLg2; + } + + public List getCodes() { + return codes; + } + + public void setCodes(List codes) { + this.codes = codes; + } + + +} diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListItem.java b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListItem.java new file mode 100644 index 000000000..0592278b8 --- /dev/null +++ b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListItem.java @@ -0,0 +1,59 @@ +package fr.insee.rmes.bauhaus_services.code_list; + +import io.swagger.v3.oas.annotations.media.Schema; + +public class CodeListItem { + + @Schema(description = "Code", required = true) + public String code; + + @Schema(description = "Label lg1", required = true) + public String labelLg1; + + @Schema(description = "Label lg2") + public String labelLg2; + + public CodeListItem(String code, String labelLg1, String labelLg2) { + super(); + this.code = code; + this.labelLg1 = labelLg1; + this.labelLg2 = labelLg2; + } + + public CodeListItem() { + super(); + } + + public String getCode() { + return this.code; + } + + public static String getClassCodeLabelTwoLangs() { + return "fr.insee.rmes.config.swagger.model.CodeLabelTwoLangs"; + } + + public String getLabelLg1() { + return labelLg1; + } + + public void setLabelLg1(String labelLg1) { + this.labelLg1 = labelLg1; + } + + public String getLabelLg2() { + return labelLg2; + } + + public void setLabelLg2(String labelLg2) { + this.labelLg2 = labelLg2; + } + + public void setCode(String code) { + this.code = code; + } + + public static String getClassOperationsLink() { + return "fr.insee.rmes.bauhaus_services.code_list.CodeListItem"; + + } +} \ No newline at end of file diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java index 69ea9d6d2..ba8a254c3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java @@ -1,5 +1,8 @@ package fr.insee.rmes.bauhaus_services.code_list; +import java.util.ArrayList; +import java.util.List; + import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -8,12 +11,18 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + import fr.insee.rmes.bauhaus_services.CodeListService; import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.operations.famopeserind_utils.FamOpeSerIndUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.QueryUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.organizations.Organization; import fr.insee.rmes.persistance.sparql_queries.code_list.CodeListQueries; +import fr.insee.rmes.persistance.sparql_queries.organizations.OrganizationQueries; @Service public class CodeListServiceImpl extends RdfService implements CodeListService { @@ -23,9 +32,12 @@ public class CodeListServiceImpl extends RdfService implements CodeListService @Autowired LangService codeListUtils; - + @Autowired + FamOpeSerIndUtils famOpeSerIndUtils; + + @Override - public String getCodeList(String notation) throws RmesException{ + public String getCodeListJson(String notation) throws RmesException{ JSONObject codeList = repoGestion.getResponseAsObject(CodeListQueries.getCodeListLabelByNotation(notation)); codeList.put("notation",notation); JSONArray items = repoGestion.getResponseAsArray(CodeListQueries.getCodeListItemsByNotation(notation)); @@ -35,6 +47,20 @@ public String getCodeList(String notation) throws RmesException{ return QueryUtils.correctEmptyGroupConcat(codeList.toString()); } + public CodeList buildCodeListFromJson(String codeListJson) { + ObjectMapper mapper = new ObjectMapper(); + CodeList codeList = new CodeList(); + try { + codeList = mapper.readValue(codeListJson.toString(), CodeList.class); + } catch (JsonProcessingException e) { + logger.error("Json cannot be parsed: ".concat(e.getMessage())); + } + return codeList; + } + + public CodeList getCodeList(String notation) throws RmesException { + return buildCodeListFromJson(getCodeListJson(notation)); + } @Override public String getCode(String notationCodeList, String notationCode) throws RmesException{ diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 0241a6171..6feee8ea3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -90,7 +90,7 @@ public File transfoTest(InputStream inputFile) throws Exception { public File export(InputStream inputFile, String absolutePath, String accessoryAbsolutePath, String organizationsAbsolutePath, - String targetType) throws RmesException, IOException { + String codeListAbsolutePath, String targetType) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXml = documentationsUtils.buildShellSims(); @@ -123,11 +123,13 @@ public File export(InputStream inputFile, accessoryAbsolutePath = accessoryAbsolutePath.replace('\\', '/'); organizationsAbsolutePath = organizationsAbsolutePath.replace('\\', '/'); msdPath = msdPath.replace('\\', '/'); + codeListAbsolutePath = codeListAbsolutePath.replace('\\', '/'); xsltTransformer.setParameter("tempFile", absolutePath); xsltTransformer.setParameter("accessoryTempFile", accessoryAbsolutePath); xsltTransformer.setParameter("orga", organizationsAbsolutePath); xsltTransformer.setParameter("msd", msdPath); + xsltTransformer.setParameter("codeList", codeListAbsolutePath); xsltTransformer.setParameter("targetType", targetType); xsltTransformer.transform(new StreamSource(inputFile), new StreamResult(printStream)); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 075519310..d51828e2a 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -32,6 +32,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.code_list.CodeListServiceImpl; import fr.insee.rmes.bauhaus_services.code_list.LangService; import fr.insee.rmes.bauhaus_services.operations.famopeserind_utils.FamOpeSerIndUtils; import fr.insee.rmes.bauhaus_services.operations.indicators.IndicatorsUtils; @@ -96,6 +97,8 @@ public class DocumentationsUtils extends RdfService{ @Autowired OrganizationsServiceImpl organizationsServiceImpl; + @Autowired + CodeListServiceImpl codeListServiceImpl; /** * GETTER @@ -505,6 +508,8 @@ public File exportMetadataReport(String id) throws IOException, RmesException { InputStream is; InputStream is2; InputStream is3; + InputStream is4; + Path tempDir= Files.createTempDirectory("forExport"); Path tempFile = Files.createTempFile(tempDir, "target",".xml"); @@ -516,20 +521,31 @@ public File exportMetadataReport(String id) throws IOException, RmesException { Path organizationsTempFile = Files.createTempFile(tempDir, "orga",".xml"); String organizationsAbsolutePath = organizationsTempFile.toFile().getAbsolutePath(); + Path codeListTempFile = Files.createTempFile(tempDir, "freq",".xml"); + String codeListAbsolutePath = codeListTempFile.toFile().getAbsolutePath(); + CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING }; String[] target = getDocumentationTargetTypeAndId(id); String targetType = target[0]; String idDatabase = target[1]; + ListneededCodeLists=new ArrayList(); + if (targetType.equals(Constants.OPERATION_UP)) { Operation operation=operationsUtils.getOperationById(idDatabase); String idSeries=operation.getSeries().getId(); Series series=seriesUtils.getSeriesById(idSeries); - is = IOUtils.toInputStream(XMLUtils.produceXMLResponse(operation), StandardCharsets.UTF_8); + String operationXML = XMLUtils.produceXMLResponse(operation); + is = IOUtils.toInputStream(operationXML, StandardCharsets.UTF_8); Files.copy(is, tempFile, options); - is2 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(series), StandardCharsets.UTF_8); + neededCodeLists.addAll(XMLUtils.getTagValues(operationXML,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(operationXML,Constants.ACCRUAL_PERIODICITY_LIST)); + String seriesXML = XMLUtils.produceXMLResponse(series); + is2 = IOUtils.toInputStream(seriesXML, StandardCharsets.UTF_8); Files.copy(is2, accessoryTempFile, options); + neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); } if (targetType.equals(Constants.SERIES_UP)) { @@ -539,20 +555,46 @@ public File exportMetadataReport(String id) throws IOException, RmesException { Files.copy(is, accessoryTempFile, options); is2 = IOUtils.toInputStream(response, StandardCharsets.UTF_8); Files.copy(is2, tempFile, options); + neededCodeLists.addAll(XMLUtils.getTagValues(response,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(response,Constants.ACCRUAL_PERIODICITY_LIST)); } if (targetType.equals(Constants.INDICATOR_UP)) { - is = IOUtils.toInputStream(XMLUtils.produceXMLResponse( - indicatorsUtils.getIndicatorById(idDatabase)), StandardCharsets.UTF_8); + String response=XMLUtils.produceXMLResponse( + indicatorsUtils.getIndicatorById(idDatabase)); + is = IOUtils.toInputStream(response, StandardCharsets.UTF_8); Files.copy(is, tempFile, options); + neededCodeLists.addAll(XMLUtils.getTagValues(response,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(response,Constants.ACCRUAL_PERIODICITY_LIST)); } is3 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(organizationsServiceImpl.getOrganizations()), StandardCharsets.UTF_8); Files.copy(is3, organizationsTempFile, options); + String codeListsXml=""; +// String codeList; + codeListsXml=codeListsXml.concat(""); +// codeListsXml.concat(Constants.XML_OPEN_CODELIST_TAG); + + for(String code : neededCodeLists) { + codeListsXml=codeListsXml.concat(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(code))); + } + codeListsXml=codeListsXml.concat(""); + + is4 = IOUtils.toInputStream(codeListsXml, StandardCharsets.UTF_8); + Files.copy(is4, codeListTempFile, options); + +// +// is4 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(Constants.CODE_LIST_FREQ)), StandardCharsets.UTF_8); +// Files.copy(is4, codeListFreqTempFile, options); +// +// is5 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(Constants.CODE_LIST_SOURCE_CATEGORY)), StandardCharsets.UTF_8); +// Files.copy(is5, codeListTypeTempFile, options); + InputStream simsInputStream = IOUtils.toInputStream(XMLUtils.produceResponse(getFullSims(id), "application/xml"), StandardCharsets.UTF_8); - return docExport.export(simsInputStream,absolutePath,accessoryAbsolutePath,organizationsAbsolutePath,targetType); + return docExport.export(simsInputStream,absolutePath,accessoryAbsolutePath, + organizationsAbsolutePath,codeListAbsolutePath,targetType); } public MSD buildMSDFromJson(JSONArray jsonMsd) { diff --git a/src/main/java/fr/insee/rmes/config/swagger/model/IdLabelTwoLangs.java b/src/main/java/fr/insee/rmes/config/swagger/model/IdLabelTwoLangs.java index 3ce97dd7a..5588500b6 100644 --- a/src/main/java/fr/insee/rmes/config/swagger/model/IdLabelTwoLangs.java +++ b/src/main/java/fr/insee/rmes/config/swagger/model/IdLabelTwoLangs.java @@ -3,26 +3,6 @@ import io.swagger.v3.oas.annotations.media.Schema; public class IdLabelTwoLangs { - - public String getLabelLg1() { - return labelLg1; - } - - public void setLabelLg1(String labelLg1) { - this.labelLg1 = labelLg1; - } - - public String getLabelLg2() { - return labelLg2; - } - - public void setLabelLg2(String labelLg2) { - this.labelLg2 = labelLg2; - } - - public void setId(String id) { - this.id = id; - } @Schema(description = "Id", required = true) public String id; @@ -51,6 +31,25 @@ public String getId() { public static String getClassIdLabelTwoLangs() { return "fr.insee.rmes.config.swagger.model.IdLabelTwoLangs"; } + + public String getLabelLg1() { + return labelLg1; + } + + public void setLabelLg1(String labelLg1) { + this.labelLg1 = labelLg1; + } + public String getLabelLg2() { + return labelLg2; + } + + public void setLabelLg2(String labelLg2) { + this.labelLg2 = labelLg2; + } + + public void setId(String id) { + this.id = id; + } } diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 8394f8e57..8dca5ad6f 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -3,6 +3,10 @@ import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; +import java.util.ArrayList; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; import javax.ws.rs.core.MediaType; import javax.xml.XMLConstants; @@ -101,4 +105,14 @@ public static Document convertStringToDocument(String xmlStr) { return null; } + public static List getTagValues(String text, String tag) { + final Pattern TAG_REGEX = Pattern.compile("<"+tag+">(.+?)", Pattern.DOTALL); + final List tagValues = new ArrayList(); + final Matcher matcher = TAG_REGEX.matcher(text); + while (matcher.find()) { + tagValues.add(matcher.group(1)); + } + return tagValues; + } + } diff --git a/src/main/java/fr/insee/rmes/webservice/CodeListsResources.java b/src/main/java/fr/insee/rmes/webservice/CodeListsResources.java index 7888759de..859741816 100644 --- a/src/main/java/fr/insee/rmes/webservice/CodeListsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/CodeListsResources.java @@ -67,7 +67,7 @@ public Response getallCodesLists() { public Response getCodeListByNotation(@PathParam("notation") String notation) { String jsonResultat; try { - jsonResultat = codeListService.getCodeList(notation); + jsonResultat = codeListService.getCodeListJson(notation); } catch (RmesException e) { return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); } diff --git a/src/main/resources/xslTransformerFiles/testXSLT.xsl b/src/main/resources/xslTransformerFiles/testXSLT.xsl index b1bd127fb..2576061cb 100644 --- a/src/main/resources/xslTransformerFiles/testXSLT.xsl +++ b/src/main/resources/xslTransformerFiles/testXSLT.xsl @@ -25,6 +25,9 @@ + + + @@ -291,9 +294,10 @@ - - + - + - + @@ -337,18 +341,14 @@ select="$rootVar/Documentation/rubrics/rubrics[idAttribute = $mas]/labelLg1" /> - - - + - - @@ -364,9 +364,10 @@ = $mas]/value)" /> - - - + + + - Modalité - - de la liste de codes: - + @@ -502,10 +501,8 @@ - Modalité - - de la liste de codes: - + @@ -647,10 +644,8 @@ - Modality - - of code-list: - + @@ -658,10 +653,9 @@ - Modality - - of code-list: - + + @@ -963,6 +957,21 @@ + + + + + + + + + + + + + @@ -1003,8 +1012,10 @@ - + + + + From 218960c7720607969faca917e58a2741bad67e40 Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Wed, 18 Nov 2020 09:41:35 +0100 Subject: [PATCH 016/243] feat: check unicity structures component --- .../utils/StructureComponentUtils.java | 28 +++++++++++++------ .../fr/insee/rmes/exceptions/ErrorCodes.java | 1 + .../structures/StructureQueries.java | 11 ++++++++ .../checkUnicityMutualizedComponent.ftlh | 11 ++++++++ 4 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 0758f199f..ac2c8786e 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -6,6 +6,7 @@ import javax.ws.rs.BadRequestException; import fr.insee.rmes.exceptions.ErrorCodes; +import fr.insee.rmes.exceptions.RmesUnauthorizedException; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -81,6 +82,17 @@ public String updateComponent(String componentId, String body) throws RmesExcept return component.getId(); } + public String createComponent(String body) throws RmesException { + MutualizedComponent component; + try { + component = deserializeBody(body); + } catch (IOException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "IOException"); + + } + return createComponent(component); + } + public String createComponent(MutualizedComponent component) throws RmesException { if (component.getId() != null) { throw new BadRequestException("During the creation of a new component, the id property should be null"); @@ -103,18 +115,16 @@ public String createComponent(MutualizedComponent component, String id) throws R return id; } - public String createComponent(String body) throws RmesException { - MutualizedComponent component; - try { - component = deserializeBody(body); - } catch (IOException e) { - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "IOException"); + private void createRDFForComponent(MutualizedComponent component, ValidationStatus status) throws RmesException { + + JSONArray componentsWithSameCodelistAndConcept = repoGestion.getResponseAsArray(StructureQueries.checkUnicityMutualizedComponent(component.getId(), component.getConcept(), component.getCodeList())); + + if(componentsWithSameCodelistAndConcept.length() > 0){ + throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_UNICITY, + "A component with the same code list and concept already exists", ""); } - return createComponent(component); - } - private void createRDFForComponent(MutualizedComponent component, ValidationStatus status) throws RmesException { String type = component.getType(); if (type.equals(QB.ATTRIBUTE_PROPERTY.toString())) { diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index 125976fe2..e82e72ce8 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -67,6 +67,7 @@ public class ErrorCodes { // STRUCTURES public static final int COMPONENT_FORBIDDEN_DELETE = 1001; + public static final int COMPONENT_UNICITY = 1002; /* * 404 NOTFOUNDEXCEPTIONS diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java index 448054872..70dcdd328 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java @@ -5,6 +5,7 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.FreeMarkerUtils; import fr.insee.rmes.config.Config; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.persistance.ontologies.INSEE; public class StructureQueries { @@ -30,6 +31,16 @@ public static String getStructureById(String structureId) throws RmesException { params.put("ID", structureId); return buildRequest("getStructure.ftlh", params); } + + public static String checkUnicityMutualizedComponent(String componentId, String conceptUri, String codeListUri) throws RmesException { + HashMap params = initParams(); + params.put("COMPONENT_ID", componentId); + params.put("CONCEPT_URI", INSEE.STRUCTURE_CONCEPT + conceptUri); + params.put("CODE_LIST_URI", codeListUri); + params.put("CODES_LISTS_GRAPH", Config.CODELIST_GRAPH); + params.put("CONCEPT_GRAPH", Config.CONCEPTS_GRAPH); + return buildRequest("checkUnicityMutualizedComponent.ftlh", params); + } public static String getComponentsForSearch() throws RmesException { HashMap params = initParams(); diff --git a/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh b/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh new file mode 100644 index 000000000..9a5131468 --- /dev/null +++ b/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh @@ -0,0 +1,11 @@ +SELECT DISTINCT ?component +FROM<${STRUCTURES_COMPONENTS_GRAPH}> +FROM <${CODES_LISTS_GRAPH}> +FROM <${CONCEPT_GRAPH}> +WHERE { + ?component qb:concept <${CONCEPT_URI}> ; + qb:codeList <${CODE_LIST_URI}> . + FILTER NOT EXISTS { + ?component dcterms:identifier '${COMPONENT_ID}' . + } +} \ No newline at end of file From 8539d086d1b9a7e95c8c635d8a582477e00d8015 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 18 Nov 2020 17:11:30 +0100 Subject: [PATCH 017/243] Fix issue with geo rubrics --- .../DocumentationsRubricsUtils.java | 4 ++-- .../documentations/DocumentationRubric.java | 17 ++++++++++++----- .../documentations/DocumentationsQueries.java | 2 -- .../getDocumentationRubricsQuery.ftlh | 10 +++------- 4 files changed, 17 insertions(+), 16 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java index e51f21666..d3a3783fe 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java @@ -123,7 +123,7 @@ else if (rubric.get(Constants.RANGE_TYPE).equals(RangeType.GEOGRAPHY.name())) { } private void clearGeographyRubric(JSONObject rubric) throws RmesException { - String value = rubric.getString(Constants.VALUE); + String value = rubric.getString(Constants.URI); if (StringUtils.isNotEmpty(value)) { IRI geoUri = RdfUtils.createIRI(value); JSONObject feature = geoService.getGeoFeature(geoUri); @@ -225,7 +225,7 @@ private void addRubricByRangeType(Model model, Resource graph, DocumentationRubr } break; case GEOGRAPHY: - String featureUri = rubric.getSimpleValue(); + String featureUri = rubric.getUri(); if (StringUtils.isNotEmpty(featureUri)) { RdfUtils.addTripleUri(attributeUri, predicateUri, RdfUtils.toURI(featureUri), model, graph); } diff --git a/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java b/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java index 7c1a6671a..20c7cdf7e 100644 --- a/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java +++ b/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java @@ -11,9 +11,6 @@ public class DocumentationRubric { private String idAttribute; - //@JsonProperty( "value" ) - //@JsonFormat(with = {JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY, JsonFormat.Feature.WRITE_SINGLE_ELEM_ARRAYS_UNWRAPPED}) - //@JsonFormat(with = {JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY}) private List value; private String labelLg1; @@ -23,6 +20,9 @@ public class DocumentationRubric { private List documentsLg1; private List documentsLg2; + //Used for geography only + private String uri; + public String getIdAttribute() { return StringUtils.upperCase(idAttribute); @@ -64,7 +64,8 @@ public boolean isEmpty() { StringUtils.isEmpty(labelLg2) && StringUtils.isEmpty(codeList) && (documentsLg1 == null || documentsLg1.isEmpty()) && - (documentsLg2 == null || documentsLg2.isEmpty()); + (documentsLg2 == null || documentsLg2.isEmpty()) && + StringUtils.isEmpty(uri); } public boolean hasRichTextLg1() { @@ -89,7 +90,7 @@ public String getSimpleValue() { } public void setValue(String value) { - Listval = new ArrayList(); + Listval = new ArrayList<>(); val.add(value); this.value = val; } @@ -105,6 +106,12 @@ public List getDocumentsLg2() { public void setDocumentsLg2(List documentsLg2) { this.documentsLg2 = documentsLg2; } + public String getUri() { + return uri; + } + public void setUri(String uri) { + this.uri = uri; + } } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java index 91d2954a3..a0981649d 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java @@ -109,8 +109,6 @@ public static String getDocumentationRubricsQuery(String idSims, String clLg1, S params.put("ORGANIZATIONS_GRAPH", Config.ORGANIZATIONS_GRAPH); params.put("ORG_INSEE_GRAPH", Config.ORG_INSEE_GRAPH); - params.put("COG_GRAPH", Config.GEOGRAPHY_GRAPH); - params.put("GEO_SIMS_GRAPH", Config.DOCUMENTATIONS_GEO_GRAPH); params.put("LG1_CL",clLg1); params.put("LG2_CL",clLg2); diff --git a/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh b/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh index d056f793e..7644b831e 100644 --- a/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh +++ b/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh @@ -1,12 +1,11 @@ -SELECT ?idAttribute ?value ?labelLg1 ?labelLg2 ?codeList ?rangeType ?hasDocLg1 ?hasDocLg2 ?maxOccurs +SELECT ?idAttribute ?value ?labelLg1 ?labelLg2 ?codeList ?rangeType ?hasDocLg1 ?hasDocLg2 ?maxOccurs ?uri FROM <${DOCUMENTATIONS_GRAPH}/${idSims}> FROM <${CODELIST_GRAPH}> FROM <${ORGANIZATIONS_GRAPH}> FROM <${ORG_INSEE_GRAPH}> FROM NAMED <${MSD_GRAPH}> - FROM NAMED <${COG_GRAPH}> - FROM NAMED <${GEO_SIMS_GRAPH}> + WHERE { <#-- RangeType.DATE : value --> { @@ -93,14 +92,11 @@ WHERE { UNION { ?report rdf:type sdmx-mm:MetadataReport . ?reportAttr sdmx-mm:metadataReport ?report . - ?reportAttr ?attr ?value . + ?reportAttr ?attr ?uri . GRAPH <${MSD_GRAPH}> { ?attr rdfs:range geo:Feature . } BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . - GRAPH ?g { - ?value skos:prefLabel|igeo:name|rdfs:label ?labelLg1 . - } BIND('${GEOGRAPHY.jsonType}' AS ?rangeType) . } From 33c23c5c2461fc8e2f96bf69c02656bca4fa1a12 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 18 Nov 2020 19:25:17 +0100 Subject: [PATCH 018/243] fix service to get a sims' creators --- .../operations/OperationsImpl.java | 2 +- .../documentations/DocumentationsUtils.java | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 5af31d8a9..427625715 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -361,7 +361,7 @@ public Documentation getFullSims(String id) throws RmesException { @Override public String getMetadataReportOwner(String id) throws RmesException { - return documentationsUtils.getDocumentationOwnerByIdSims(id); + return documentationsUtils.getDocumentationOwnersByIdSims(id); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index d51828e2a..be16dd846 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -478,9 +478,9 @@ public String[] getDocumentationTargetTypeAndId(String idSims) throws RmesExcept return new String[] { targetType, idDatabase }; } - public String getDocumentationOwnerByIdSims(String idSims) throws RmesException { - logger.info("Search Sims Owner's Stamp"); - String stamp = null; + public String getDocumentationOwnersByIdSims(String idSims) throws RmesException { + logger.info("Search Sims Owners' Stamps"); + String stamps = null; JSONObject target = repoGestion.getResponseAsObject(DocumentationsQueries.getTargetByIdSims(idSims)); if (target != null) { String idOperation = target.getString(Constants.ID_OPERATION); @@ -488,19 +488,19 @@ public String getDocumentationOwnerByIdSims(String idSims) throws RmesException String idIndicator = target.getString(Constants.ID_INDICATOR); if (idOperation != null && !idOperation.isEmpty()) { - stamp = seriesUtils.getSeriesJsonById( - operationsUtils.getOperationJsonById(idOperation).getJSONObject("series").getString(Constants.ID_SERIES)) - .getString(Constants.PUBLISHERS); + stamps = seriesUtils.getSeriesJsonById( + operationsUtils.getOperationJsonById(idOperation).getJSONObject("series").getString(Constants.ID)) + .getJSONArray(Constants.CREATORS).toString(); } else if (idSerie != null && !idSerie.isEmpty()) { - stamp = seriesUtils.getSeriesJsonById(idSerie).getString(Constants.PUBLISHER); + stamps = seriesUtils.getSeriesJsonById(idSerie).getJSONArray(Constants.CREATORS).toString(); } else if (idIndicator != null && !idIndicator.isEmpty()) { - stamp = indicatorsUtils.getIndicatorJsonById(idIndicator).getString(Constants.PUBLISHER); + stamps = indicatorsUtils.getIndicatorJsonById(idIndicator).getJSONArray(Constants.CREATORS).toString(); } else { throw new RmesException(HttpStatus.SC_BAD_REQUEST, "Documentation has no target", "Check your documentation creation"); } } - return stamp; + return stamps; } public File exportMetadataReport(String id) throws IOException, RmesException { From 7a1a1807aef97f127e04467b70b0dd95b8fbd219 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 19 Nov 2020 09:07:40 +0100 Subject: [PATCH 019/243] Divide PublicApi and UserAPI --- .../rmes/model/structures/Structure.java | 5 +- .../rmes/webservice/PublicResources.java | 44 +------- .../insee/rmes/webservice/UserResources.java | 102 ++++++++++++++++++ 3 files changed, 104 insertions(+), 47 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/webservice/UserResources.java diff --git a/src/main/java/fr/insee/rmes/model/structures/Structure.java b/src/main/java/fr/insee/rmes/model/structures/Structure.java index 9839f3837..728ce61ea 100644 --- a/src/main/java/fr/insee/rmes/model/structures/Structure.java +++ b/src/main/java/fr/insee/rmes/model/structures/Structure.java @@ -3,9 +3,6 @@ import java.util.List; import fr.insee.rmes.exceptions.RmesException; -import fr.insee.rmes.model.ValidationStatus; - -import javax.validation.Validation; public class Structure { @@ -27,7 +24,7 @@ public Structure() throws RmesException { } - public Structure(String id) throws RmesException { + public Structure(String id) { this.id = id; } diff --git a/src/main/java/fr/insee/rmes/webservice/PublicResources.java b/src/main/java/fr/insee/rmes/webservice/PublicResources.java index 1e9a3d65c..52636fe14 100644 --- a/src/main/java/fr/insee/rmes/webservice/PublicResources.java +++ b/src/main/java/fr/insee/rmes/webservice/PublicResources.java @@ -2,22 +2,17 @@ import java.util.TreeSet; -import javax.ws.rs.Consumes; import javax.ws.rs.GET; -import javax.ws.rs.POST; import javax.ws.rs.Path; -import javax.ws.rs.PathParam; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.annotation.Secured; import org.springframework.stereotype.Component; import com.fasterxml.jackson.core.JsonProcessingException; @@ -42,11 +37,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; /** - * WebService class for resources of Concepts - * - * - * @author N. Laval - * + * WebService class for resources * schemes: - http * * consumes: - application/json @@ -111,20 +102,6 @@ public Response getStamps() { return Response.status(HttpStatus.SC_OK).entity(entity).build(); } - @GET - @Path("/stamp") - @Produces(MediaType.APPLICATION_JSON) - @Operation(operationId = "getStamp", summary = "User's stamp", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)))}) - public Response getStamp() { - String stamp = null; - try { - stamp = stampsService.getStamp(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(stamp).build(); - } - @GET @Path("/disseminationStatus") @@ -170,23 +147,4 @@ public Response getAgents() { return Response.status(HttpStatus.SC_OK).entity(entity).build(); } - @Secured({ Roles.SPRING_ADMIN }) - @POST - @Path("/private/add/role/{role}/user/{user}") - @Consumes(MediaType.APPLICATION_JSON) - @Operation(operationId = "setAddRole", summary = "Add role") - public Response setAddRole(@PathParam("role") String role, @PathParam("user") String user) { - userRolesManagerService.setAddRole(role, user); - return Response.status(Status.NO_CONTENT).build(); - } - - @Secured({ Roles.SPRING_ADMIN }) - @POST - @Path("/private/delete/role/{role}/user/{user}") - @Consumes(MediaType.APPLICATION_JSON) - @Operation(operationId = "setDeleteRole", summary = "Delete role") - public Response setDeleteRole(@PathParam("role") String role, @PathParam("user") String user) { - userRolesManagerService.setDeleteRole(role, user); - return Response.status(Status.NO_CONTENT).build(); - } } \ No newline at end of file diff --git a/src/main/java/fr/insee/rmes/webservice/UserResources.java b/src/main/java/fr/insee/rmes/webservice/UserResources.java new file mode 100644 index 000000000..20e97b9e2 --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/UserResources.java @@ -0,0 +1,102 @@ +package fr.insee.rmes.webservice; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.apache.http.HttpStatus; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.annotation.Secured; +import org.springframework.stereotype.Component; + +import fr.insee.rmes.config.auth.roles.Roles; +import fr.insee.rmes.config.auth.roles.UserRolesManagerService; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.external_services.authentication.stamps.StampsService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + +/** + * WebService class for resources of Concepts + * + * + * @author N. Laval + * + * schemes: - http + * + * consumes: - application/json + * + * produces: - application/json + * + */ +@Component +@Path("/") +@Tag(name="User", description="User Management") +@ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Success"), + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "400", description = "Bad Request"), + @ApiResponse(responseCode = "401", description = "Unauthorized"), + @ApiResponse(responseCode = "403", description = "Forbidden"), + @ApiResponse(responseCode = "404", description = "Not found"), + @ApiResponse(responseCode = "406", description = "Not Acceptable"), + @ApiResponse(responseCode = "500", description = "Internal server error") }) +public class UserResources { + + static final Logger logger = LogManager.getLogger(UserResources.class); + + @Autowired + UserRolesManagerService userRolesManagerService; + + @Autowired + StampsService stampsService; + + + + @GET + @Path("/stamp") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "getStamp", summary = "User's stamp", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = String.class)))}) + public Response getStamp() { + String stamp = null; + try { + stamp = stampsService.getStamp(); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(stamp).build(); + } + + + @Secured({ Roles.SPRING_ADMIN }) + @POST + @Path("/private/add/role/{role}/user/{user}") + @Consumes(MediaType.APPLICATION_JSON) + @Operation(operationId = "setAddRole", summary = "Add role") + public Response setAddRole(@PathParam("role") String role, @PathParam("user") String user) { + userRolesManagerService.setAddRole(role, user); + return Response.status(Status.NO_CONTENT).build(); + } + + @Secured({ Roles.SPRING_ADMIN }) + @POST + @Path("/private/delete/role/{role}/user/{user}") + @Consumes(MediaType.APPLICATION_JSON) + @Operation(operationId = "setDeleteRole", summary = "Delete role") + public Response setDeleteRole(@PathParam("role") String role, @PathParam("user") String user) { + userRolesManagerService.setDeleteRole(role, user); + return Response.status(Status.NO_CONTENT).build(); + } +} \ No newline at end of file From 6751d3db2eb569a04bbcb3d4511383987ab7710c Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 19 Nov 2020 09:24:38 +0100 Subject: [PATCH 020/243] Remove unused --- .../rmes/bauhaus_services/code_list/CodeListServiceImpl.java | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java index ba8a254c3..d9c109a87 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java @@ -1,8 +1,5 @@ package fr.insee.rmes.bauhaus_services.code_list; -import java.util.ArrayList; -import java.util.List; - import org.apache.commons.lang.StringUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -20,9 +17,7 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.QueryUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.exceptions.RmesException; -import fr.insee.rmes.model.organizations.Organization; import fr.insee.rmes.persistance.sparql_queries.code_list.CodeListQueries; -import fr.insee.rmes.persistance.sparql_queries.organizations.OrganizationQueries; @Service public class CodeListServiceImpl extends RdfService implements CodeListService { From ae27ca4556ca7d20818ee05e737e61332f9f2ebe Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 19 Nov 2020 10:00:06 +0100 Subject: [PATCH 021/243] Update UserResources.java --- src/main/java/fr/insee/rmes/webservice/UserResources.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/webservice/UserResources.java b/src/main/java/fr/insee/rmes/webservice/UserResources.java index 20e97b9e2..f9ad1a806 100644 --- a/src/main/java/fr/insee/rmes/webservice/UserResources.java +++ b/src/main/java/fr/insee/rmes/webservice/UserResources.java @@ -42,7 +42,7 @@ * */ @Component -@Path("/") +@Path("/users") @Tag(name="User", description="User Management") @ApiResponses(value = { @ApiResponse(responseCode = "200", description = "Success"), From bf7328d402d6e4bfa9b2a44dad698e8db9d77466 Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Sat, 21 Nov 2020 14:23:31 +0100 Subject: [PATCH 022/243] feat: use ASK to check if a component already exist for the same concept and codelist --- .../structures/utils/StructureComponentUtils.java | 5 ++--- .../request/structures/checkUnicityMutualizedComponent.ftlh | 2 +- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index ac2c8786e..1296b22d2 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -118,9 +118,8 @@ public String createComponent(MutualizedComponent component, String id) throws R private void createRDFForComponent(MutualizedComponent component, ValidationStatus status) throws RmesException { - JSONArray componentsWithSameCodelistAndConcept = repoGestion.getResponseAsArray(StructureQueries.checkUnicityMutualizedComponent(component.getId(), component.getConcept(), component.getCodeList())); - - if(componentsWithSameCodelistAndConcept.length() > 0){ + Boolean componentsWithSameCodelistAndConcept = repoGestion.getResponseAsBoolean(StructureQueries.checkUnicityMutualizedComponent(component.getId(), component.getConcept(), component.getCodeList())); + if(componentsWithSameCodelistAndConcept){ throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_UNICITY, "A component with the same code list and concept already exists", ""); } diff --git a/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh b/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh index 9a5131468..daa69ee31 100644 --- a/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?component +ASK FROM<${STRUCTURES_COMPONENTS_GRAPH}> FROM <${CODES_LISTS_GRAPH}> FROM <${CONCEPT_GRAPH}> From 980c99dda418973fcac5af8338d29b2a56a2fdf5 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 24 Nov 2020 11:20:06 +0100 Subject: [PATCH 023/243] Deal with codelists in Sims export --- .../rmes/bauhaus_services/Constants.java | 5 ++ .../documentations/DocumentationsUtils.java | 49 +++++++++++++------ .../xslTransformerFiles/testXSLT.xsl | 12 ++--- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 185bc7ccd..df9f62df9 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -8,6 +8,7 @@ public class Constants { public static final String ALT_LABEL_LG2 = "altLabelLg2"; /*C*/ + public static final String CODELIST = "codeList"; public static final String CODE_LIST_FREQ = "CL_FREQ"; public static final String CODE_LIST_SOURCE_CATEGORY = "CL_SOURCE_CATEGORY"; public static final String CREATOR = "creator"; @@ -96,6 +97,10 @@ public class Constants { /*W*/ public static final String WASGENERATEDBY = "wasGeneratedBy"; + /*X*/ + public static final String XML_OPEN_CODELIST_TAG = ""; + public static final String XML_END_CODELIST_TAG = ""; + private Constants() { throw new IllegalStateException("Utility class"); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index be16dd846..e4007d550 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -9,7 +9,9 @@ import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; +import java.util.stream.Collectors; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; @@ -197,6 +199,11 @@ public String setMetadataReport(String id, String body, boolean create) throws R logger.error(e.getMessage()); throw new RmesNotAcceptableException(ErrorCodes.SIMS_INCORRECT, e.getMessage(), "IOException: cannot parse input"); } + // Fix for sims passed without target (TEMPORARY ?) + if (sims.getIdTarget()==null) { + addTarget(sims); + } + // Check idOperation/idSerie/IdIndicator and Init or check id sims String idTarget = sims.getIdTarget(); if (create) { @@ -234,6 +241,20 @@ public String setMetadataReport(String id, String body, boolean create) throws R } + private void addTarget(Documentation sims) throws RmesException { + if (sims.getIdTarget()==null) { + String[] target = getDocumentationTargetTypeAndId(sims.getId()); + + String targetType = target[0]; + String targetId = target[1]; + switch(targetType) { + case Constants.INDICATOR_UP : sims.setIdIndicator(targetId); + case Constants.OPERATION_UP : sims.setIdOperation(targetId); + case Constants.SERIES_UP : sims.setIdSeries(targetId); + } + } + } + private String getDocumentationValidationStatus(String id) throws RmesException { try { return repoGestion.getResponseAsObject(DocumentationsQueries.getPublicationState(id)).getString("state"); @@ -523,7 +544,7 @@ public File exportMetadataReport(String id) throws IOException, RmesException { Path codeListTempFile = Files.createTempFile(tempDir, "freq",".xml"); String codeListAbsolutePath = codeListTempFile.toFile().getAbsolutePath(); - + CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING }; String[] target = getDocumentationTargetTypeAndId(id); @@ -531,7 +552,7 @@ public File exportMetadataReport(String id) throws IOException, RmesException { String idDatabase = target[1]; ListneededCodeLists=new ArrayList(); - + if (targetType.equals(Constants.OPERATION_UP)) { Operation operation=operationsUtils.getOperationById(idDatabase); String idSeries=operation.getSeries().getId(); @@ -571,27 +592,23 @@ public File exportMetadataReport(String id) throws IOException, RmesException { is3 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(organizationsServiceImpl.getOrganizations()), StandardCharsets.UTF_8); Files.copy(is3, organizationsTempFile, options); - String codeListsXml=""; -// String codeList; - codeListsXml=codeListsXml.concat(""); -// codeListsXml.concat(Constants.XML_OPEN_CODELIST_TAG); + String simsXML=XMLUtils.produceResponse(getFullSims(id), "application/xml"); + neededCodeLists.addAll(XMLUtils.getTagValues(simsXML,Constants.CODELIST)); + + neededCodeLists=neededCodeLists.stream().distinct().collect(Collectors.toList()); + String codeListsXml=""; + codeListsXml=codeListsXml.concat(Constants.XML_OPEN_CODELIST_TAG); + for(String code : neededCodeLists) { codeListsXml=codeListsXml.concat(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(code))); } - codeListsXml=codeListsXml.concat(""); + codeListsXml=codeListsXml.concat(Constants.XML_END_CODELIST_TAG); is4 = IOUtils.toInputStream(codeListsXml, StandardCharsets.UTF_8); Files.copy(is4, codeListTempFile, options); - -// -// is4 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(Constants.CODE_LIST_FREQ)), StandardCharsets.UTF_8); -// Files.copy(is4, codeListFreqTempFile, options); -// -// is5 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(Constants.CODE_LIST_SOURCE_CATEGORY)), StandardCharsets.UTF_8); -// Files.copy(is5, codeListTypeTempFile, options); - - InputStream simsInputStream = IOUtils.toInputStream(XMLUtils.produceResponse(getFullSims(id), "application/xml"), StandardCharsets.UTF_8); + + InputStream simsInputStream = IOUtils.toInputStream(simsXML, StandardCharsets.UTF_8); return docExport.export(simsInputStream,absolutePath,accessoryAbsolutePath, organizationsAbsolutePath,codeListAbsolutePath,targetType); diff --git a/src/main/resources/xslTransformerFiles/testXSLT.xsl b/src/main/resources/xslTransformerFiles/testXSLT.xsl index 2576061cb..eb7c29cc3 100644 --- a/src/main/resources/xslTransformerFiles/testXSLT.xsl +++ b/src/main/resources/xslTransformerFiles/testXSLT.xsl @@ -307,8 +307,9 @@ + select="local:codeListLg1($rootVar/Documentation/rubrics/rubrics[idAttribute + = $mas]/value,$rootVar/Documentation/rubrics/rubrics[idAttribute + = $mas]/codeList)" /> @@ -360,8 +361,9 @@ + select="local:codeListLg2($rootVar/Documentation/rubrics/rubrics[idAttribute + = $mas]/value,$rootVar/Documentation/rubrics/rubrics[idAttribute + = $mas]/codeList)" /> @@ -410,8 +412,6 @@ - - From 9ee0c9829889721cad07dc407cfb5390fe79229d Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 24 Nov 2020 14:22:38 +0100 Subject: [PATCH 024/243] Remove unused --- .../operations/series/SeriesQueries.java | 11 ----------- .../operations/series/getSeriesPublishersQuery.ftlh | 10 ---------- 2 files changed, 21 deletions(-) delete mode 100644 src/main/resources/request/operations/series/getSeriesPublishersQuery.ftlh diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java index 20ec7ad41..b53508df1 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java @@ -170,17 +170,6 @@ public static String getCreatorsById(String idSeries) throws RmesException { return buildSeriesRequest("getSeriesCreatorsByIdQuery.ftlh", params); } - /** - * @param idSeries - * return publishers id (publishers are organizations) - * @return String - * @throws RmesException - */ - public static String getPublishers(String idSeries) throws RmesException { - if (params==null) {initParams();} - params.put(ID_SERIES, idSeries); - return buildSeriesRequest("getSeriesPublishersQuery.ftlh", params); - } /** * @param idSeries diff --git a/src/main/resources/request/operations/series/getSeriesPublishersQuery.ftlh b/src/main/resources/request/operations/series/getSeriesPublishersQuery.ftlh deleted file mode 100644 index 0090b60fc..000000000 --- a/src/main/resources/request/operations/series/getSeriesPublishersQuery.ftlh +++ /dev/null @@ -1,10 +0,0 @@ -SELECT distinct ?publishers - FROM <${OPERATIONS_GRAPH}> - FROM <${ORGANIZATIONS_GRAPH}> - FROM <${ORG_INSEE_GRAPH}> - WHERE { - ?series a insee:StatisticalOperationSeries . - ?series dcterms:publisher ?uri . - ?uri dcterms:identifier ?publishers . - FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES}')) . - } \ No newline at end of file From 1a082503cd442ea155b2afac47d868f66297749c Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 24 Nov 2020 14:22:58 +0100 Subject: [PATCH 025/243] Fix issue with multiple response --- .../request/operations/series/getSeriesLinksQuery.ftlh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh index 7d412cbaa..d601de410 100644 --- a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh @@ -1,4 +1,4 @@ -SELECT ?id ?labelLg1 ?labelLg2 +SELECT DISTINCT ?id ?labelLg1 ?labelLg2 FROM <${OPERATIONS_GRAPH}> FROM <${ORGANIZATIONS_GRAPH}> FROM <${ORG_INSEE_GRAPH}> From 7e9f40b2caf012bd407f06ec461ecfb347edb651 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 24 Nov 2020 14:32:36 +0100 Subject: [PATCH 026/243] Fix issue with operations in serie --- .../request/operations/series/getSeriesOperationsQuery.ftlh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/request/operations/series/getSeriesOperationsQuery.ftlh b/src/main/resources/request/operations/series/getSeriesOperationsQuery.ftlh index bcaeb9535..f6042f776 100644 --- a/src/main/resources/request/operations/series/getSeriesOperationsQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesOperationsQuery.ftlh @@ -3,9 +3,9 @@ SELECT ?id ?labelLg1 ?labelLg2 WHERE { ?series dcterms:hasPart ?uri . ?uri skos:prefLabel ?labelLg1 . - FILTER (lang(?labelLg1) = ' ${LG1} ') . + FILTER (lang(?labelLg1) = '${LG1}') . ?uri skos:prefLabel ?labelLg2 . - FILTER (lang(?labelLg2) = ' ${LG2} ') . + FILTER (lang(?labelLg2) = '${LG2}') . BIND(STRAFTER(STR(?uri),'/operations/operation/') AS ?id) . FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES}')) . } From 1c6f043f28e0fa88a3c8290848ad21040f9691cf Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 24 Nov 2020 15:31:40 +0100 Subject: [PATCH 027/243] Fix issue with rich text with both label and docs --- .../model/operations/documentations/DocumentationRubric.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java b/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java index 20c7cdf7e..9d8d8af09 100644 --- a/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java +++ b/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java @@ -69,11 +69,11 @@ public boolean isEmpty() { } public boolean hasRichTextLg1() { - return StringUtils.isNotEmpty(getLabelLg1()) && (getDocumentsLg1() == null || getDocumentsLg1().isEmpty()); + return StringUtils.isNotEmpty(getLabelLg1()) || (getDocumentsLg1() != null && !getDocumentsLg1().isEmpty()); } public boolean hasRichTextLg2() { - return StringUtils.isNotEmpty(getLabelLg2()) && (getDocumentsLg2() == null || getDocumentsLg2().isEmpty()); + return StringUtils.isNotEmpty(getLabelLg2()) || (getDocumentsLg2() != null && !getDocumentsLg2().isEmpty()); } public List getValue() { From 813df777ea96c1d8b518ec1f7f00de5f1f1e58e1 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 25 Nov 2020 10:42:27 +0100 Subject: [PATCH 028/243] Fix issue with links series indicators --- .../operations/series/getSeriesGeneratedWithQuery.ftlh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/request/operations/series/getSeriesGeneratedWithQuery.ftlh b/src/main/resources/request/operations/series/getSeriesGeneratedWithQuery.ftlh index c90de6855..8102c3337 100644 --- a/src/main/resources/request/operations/series/getSeriesGeneratedWithQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesGeneratedWithQuery.ftlh @@ -2,9 +2,9 @@ SELECT ?id ?typeOfObject ?labelLg1 ?labelLg2 FROM <${OPERATIONS_GRAPH}> WHERE { ?uri prov:wasGeneratedBy ?series . ?uri skos:prefLabel ?labelLg1 . - FILTER (lang(?labelLg1) = '${LG1} ') . ?uri skos:prefLabel ?labelLg2 . - FILTER (lang(?labelLg2) = '${LG2} ') . ?uri rdf:type ?typeOfObject . + FILTER (lang(?labelLg1) = '${LG1}') . ?uri skos:prefLabel ?labelLg2 . + FILTER (lang(?labelLg2) = '${LG2}') . ?uri rdf:type ?typeOfObject . BIND(REPLACE( STR(?uri) , '(.*/)(\\\\w+$)', '$2' ) AS ?id) . - FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES} ')) . + FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES}')) . } ORDER BY ?id \ No newline at end of file From 0876b91c68286c47525ea2a994f890191563bf42 Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Wed, 25 Nov 2020 12:43:02 +0100 Subject: [PATCH 029/243] feat: init details endpoint for structure --- .../structures/StructureService.java | 2 ++ .../structures/impl/StructureImpl.java | 8 ++++++++ .../insee/rmes/webservice/StructureResources.java | 15 +++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureService.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureService.java index ed1389508..311ad22a1 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureService.java @@ -14,4 +14,6 @@ public interface StructureService { String setStructure(String id, String body) throws RmesException; void deleteStructure(String structureId) throws RmesException; + + String getStructureByIdWithDetails(String id) throws RmesException; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java index dfdbb6045..114e1a3c9 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java @@ -41,6 +41,12 @@ public String getStructureById(String id) throws RmesException { return structureUtils.formatStructure(structure, id).toString(); } + @Override + public String getStructureByIdWithDetails(String id) throws RmesException { + logger.info("Starting to get all details of a structure"); + return this.getStructureById(id); + } + /** * Create new Structure * @throws RmesException @@ -63,4 +69,6 @@ public String setStructure(String id, String body) throws RmesException { public void deleteStructure(String structureId) throws RmesException { structureUtils.deleteStructure(structureId); } + + } diff --git a/src/main/java/fr/insee/rmes/webservice/StructureResources.java b/src/main/java/fr/insee/rmes/webservice/StructureResources.java index 6f3b081ee..2d81a81e9 100644 --- a/src/main/java/fr/insee/rmes/webservice/StructureResources.java +++ b/src/main/java/fr/insee/rmes/webservice/StructureResources.java @@ -97,6 +97,21 @@ public Response getStructureById(@PathParam(Constants.ID) String id) { return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + @GET + @Path("/structure/{id}/details") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "getStructureByIdDetails", summary = "Get all a details of a structure", + responses = {@ApiResponse(content = @Content(schema = @Schema(implementation = StructureById.class)))}) + public Response getStructureByIdDetails(@PathParam(Constants.ID) String id) { + String jsonResultat = null; + try { + jsonResultat = structureService.getStructureByIdWithDetails(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + @POST @Path("/structure") @Consumes(MediaType.APPLICATION_JSON) From ff8fdc0eca8ad3227c338c22af8a04b7e1ea9f7e Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 27 Nov 2020 11:18:50 +0100 Subject: [PATCH 030/243] improve documentationRubric --- .../model/operations/documentations/DocumentationRubric.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java b/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java index 20c7cdf7e..095fea98c 100644 --- a/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java +++ b/src/main/java/fr/insee/rmes/model/operations/documentations/DocumentationRubric.java @@ -5,12 +5,15 @@ import org.apache.commons.lang3.StringUtils; +import com.fasterxml.jackson.annotation.JsonFormat; + import fr.insee.rmes.utils.XhtmlToMarkdownUtils; public class DocumentationRubric { private String idAttribute; + @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) private List value; private String labelLg1; @@ -89,7 +92,7 @@ public String getSimpleValue() { return value.get(0); } - public void setValue(String value) { + public void setSingleValue(String value) { Listval = new ArrayList<>(); val.add(value); this.value = val; From 5e997985207d7d7f4bb040aa3fb92f7c9d556e8a Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 27 Nov 2020 16:51:07 +0100 Subject: [PATCH 031/243] Fix issue --- docs/fr/concepts.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/fr/concepts.md b/docs/fr/concepts.md index 85ecc3054..b45cb360e 100644 --- a/docs/fr/concepts.md +++ b/docs/fr/concepts.md @@ -90,7 +90,7 @@ xkos [http://rdf-vocabulary.ddialliance.org/xkos\#](http://rdf-vocabulary.ddiall | Date | dcterms:issued | | Date de publication d'une changeNote – Applicable aux objets \(instance de xkos:ExplanatoryNote\) des prédicats skos:changeNote \(datée, mais non versionnée\) | | NumeroVersion | pav:version | | Applicable aux objets \(instance de xkos:ExplanatoryNote\) des prédicats skos:scopeNote, skos:definition, xkos:exclusionNote | | TexteNote | xkos:plainText | Contenu de la note \(texte brut\) | | -| Version | Insee:conceptVersion | Version du concept à laquelle la note se rattache | | -| Langue | Dctermes:language | Fr ou en | | -| TexteNote | Evoc:noteLiteral | Contenu de la note en xhtml | | +| Version | insee:conceptVersion | Version du concept à laquelle la note se rattache | | +| Langue | dcterms:language | Fr ou en | | +| TexteNote | evoc:noteLiteral | Contenu de la note en xhtml | | From 9902f86c5d63c016e9d7d0bbe17dda324fc43d05 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 30 Nov 2020 10:39:36 +0100 Subject: [PATCH 032/243] fix bug for sims modification --- .../operations/documentations/DocumentationsUtils.java | 6 +++--- .../operations/famopeserind_utils/FamOpeSerIndUtils.java | 2 +- .../rmes/model/operations/documentations/Documentation.java | 4 ++++ .../operations/famOpeSerUtils/FamOpeSerQueries.java | 2 +- 4 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index e4007d550..de1eb7c1a 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -200,9 +200,9 @@ public String setMetadataReport(String id, String body, boolean create) throws R throw new RmesNotAcceptableException(ErrorCodes.SIMS_INCORRECT, e.getMessage(), "IOException: cannot parse input"); } // Fix for sims passed without target (TEMPORARY ?) - if (sims.getIdTarget()==null) { - addTarget(sims); - } +// if (sims.getIdTarget()==null) { +// addTarget(sims); +// } // Check idOperation/idSerie/IdIndicator and Init or check id sims String idTarget = sims.getIdTarget(); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/famopeserind_utils/FamOpeSerIndUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/famopeserind_utils/FamOpeSerIndUtils.java index b5acae62c..01440dc71 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/famopeserind_utils/FamOpeSerIndUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/famopeserind_utils/FamOpeSerIndUtils.java @@ -38,7 +38,7 @@ public String createId() throws RmesException { } public boolean checkIfObjectExists(ObjectType type, String id) throws RmesException { - return repoGestion.getResponseAsBoolean(FamOpeSerQueries.checkIfOperationExists(RdfUtils.objectIRI(type, id).toString())); + return repoGestion.getResponseAsBoolean(FamOpeSerQueries.checkIfFamOpeSerExists(RdfUtils.objectIRI(type, id).toString())); } public String getValidationStatus(String id) throws RmesException{ diff --git a/src/main/java/fr/insee/rmes/model/operations/documentations/Documentation.java b/src/main/java/fr/insee/rmes/model/operations/documentations/Documentation.java index a08a324f5..70e25f352 100644 --- a/src/main/java/fr/insee/rmes/model/operations/documentations/Documentation.java +++ b/src/main/java/fr/insee/rmes/model/operations/documentations/Documentation.java @@ -4,6 +4,8 @@ import org.apache.commons.lang3.StringUtils; +import com.fasterxml.jackson.annotation.JsonFormat; + public class Documentation { private String id; @@ -14,6 +16,8 @@ public class Documentation { private String labelLg1; private String labelLg2; + + @JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY) private List rubrics; diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/famOpeSerUtils/FamOpeSerQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/famOpeSerUtils/FamOpeSerQueries.java index 2d8c4278c..673a4e6a3 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/famOpeSerUtils/FamOpeSerQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/famOpeSerUtils/FamOpeSerQueries.java @@ -32,7 +32,7 @@ private static void initParams() { * @return * @throws RmesException */ - public static String checkIfOperationExists(String uri) throws RmesException { + public static String checkIfFamOpeSerExists(String uri) throws RmesException { if (params==null) {initParams();} params.put(Constants.URI, uri); return buildOperationRequest("checkIfFamSerOpeExistsQuery.ftlh", params); From b412fe101fe0389148f680092bfe208227190326 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 30 Nov 2020 10:40:56 +0100 Subject: [PATCH 033/243] improve sims export --- .../xslTransformerFiles/testXSLT.xsl | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/testXSLT.xsl b/src/main/resources/xslTransformerFiles/testXSLT.xsl index eb7c29cc3..122933c07 100644 --- a/src/main/resources/xslTransformerFiles/testXSLT.xsl +++ b/src/main/resources/xslTransformerFiles/testXSLT.xsl @@ -218,15 +218,13 @@ - - + + - - - - - + + + + @@ -313,15 +311,14 @@ - - - - + + + + - - - + - - - + + + + + - + - - + + - + - - - + + + From 9141801826179fbac0c43b47aab1241dae1e3a1b Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 8 Dec 2020 09:03:22 +0100 Subject: [PATCH 034/243] improve Sims export --- .../documentations/DocumentationExport.java | 40 +++++- .../external_services/export/ExportUtils.java | 2 + .../convertXhtmlToFodt.xsl | 79 ++++++++++++ .../xslTransformerFiles/testXSLT.xsl | 86 +++++++----- .../xslTransformerFiles/testXSLT2.xsl | 122 ------------------ 5 files changed, 171 insertions(+), 158 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/convertXhtmlToFodt.xsl delete mode 100644 src/main/resources/xslTransformerFiles/testXSLT2.xsl diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 6feee8ea3..4682b4717 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -2,6 +2,7 @@ import java.io.ByteArrayInputStream; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -88,6 +89,33 @@ public File transfoTest(InputStream inputFile) throws Exception { return output; } + public File convertXhtmlToFodt(InputStream inputFile) throws IOException { + + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); + output.deleteOnExit(); + + OutputStream osOutputFile = FileUtils.openOutputStream(output); + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertXhtmlToFodt.xsl"); + + PrintStream printStream= null; + + try{ + printStream = new PrintStream(osOutputFile); + StreamSource xsrc = new StreamSource(xslFile); + TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); + transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); + xsltTransformer.transform(new StreamSource(inputFile), new StreamResult(printStream)); + } catch (TransformerException e) { + logger.error(e.getMessage()); + } finally { + inputFile.close(); + osOutputFile.close(); + printStream.close(); + } + return output; + } + public File export(InputStream inputFile, String absolutePath, String accessoryAbsolutePath, String organizationsAbsolutePath, String codeListAbsolutePath, String targetType) throws RmesException, IOException { @@ -103,12 +131,15 @@ public File export(InputStream inputFile, String msdPath = msdFile.getAbsolutePath(); File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); - //File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("application/vnd.oasis.opendocument.text")); - output.deleteOnExit(); + File outputIntermediate = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("XML")); + outputIntermediate.deleteOnExit(); + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/testXSLT.xsl"); - OutputStream osOutputFile = FileUtils.openOutputStream(output); + // OutputStream osOutputFile = FileUtils.openOutputStream(output); + OutputStream osOutputFile = FileUtils.openOutputStream(outputIntermediate); + PrintStream printStream= null; try{ @@ -142,7 +173,8 @@ public File export(InputStream inputFile, printStream.close(); } logger.debug("End To export documentation"); - return output; + //return output; + return convertXhtmlToFodt(new FileInputStream(outputIntermediate)); } } diff --git a/src/main/java/fr/insee/rmes/external_services/export/ExportUtils.java b/src/main/java/fr/insee/rmes/external_services/export/ExportUtils.java index 3e88db075..7363b3c31 100644 --- a/src/main/java/fr/insee/rmes/external_services/export/ExportUtils.java +++ b/src/main/java/fr/insee/rmes/external_services/export/ExportUtils.java @@ -9,6 +9,8 @@ public static String getExtension(String acceptHeader) { return ".pdf"; } else if (acceptHeader.equals("flatODT")) { return ".fodt"; + } else if (acceptHeader.equals("XML")) { + return ".xml"; } else { return ".odt"; // default --> odt diff --git a/src/main/resources/xslTransformerFiles/convertXhtmlToFodt.xsl b/src/main/resources/xslTransformerFiles/convertXhtmlToFodt.xsl new file mode 100644 index 000000000..a6fce85e1 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/convertXhtmlToFodt.xsl @@ -0,0 +1,79 @@ + + + + + + + + + + + + + + + + + + + coucou richtext + + + + + + coucou html + + + + + + coucou html:p + + + + + + + + + + + + + + + + + coucou p + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/testXSLT.xsl b/src/main/resources/xslTransformerFiles/testXSLT.xsl index 122933c07..e2e30e6ed 100644 --- a/src/main/resources/xslTransformerFiles/testXSLT.xsl +++ b/src/main/resources/xslTransformerFiles/testXSLT.xsl @@ -296,36 +296,44 @@ - - - + + + + - - + + + + - - + + + - - - - + + + - - - + + + + + + - - + + + + - - + + + + - - - + + + + @@ -983,8 +994,10 @@ " /> - + + + + @@ -995,7 +1008,7 @@ + select="concat('<html>',replace(replace($arg,'\s+$',''),'^\s+',''),'</html>')" /> @@ -1007,16 +1020,25 @@ - + + + + + - - - - - + + + + + + + + + + diff --git a/src/main/resources/xslTransformerFiles/testXSLT2.xsl b/src/main/resources/xslTransformerFiles/testXSLT2.xsl deleted file mode 100644 index d75d93197..000000000 --- a/src/main/resources/xslTransformerFiles/testXSLT2.xsl +++ /dev/null @@ -1,122 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Sims - - - - - - Opération - - - - Série - - - - Indicateur - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 599f713dd87ec8c8478bc34ffed194e2f9a7eb1c Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 9 Dec 2020 09:48:43 +0100 Subject: [PATCH 035/243] create service to delete the sims of a series --- .../bauhaus_services/OperationsService.java | 3 ++ .../operations/OperationsImpl.java | 8 ++++++ .../documentations/DocumentationsUtils.java | 28 ++++++++++++++++--- .../operations/OperationsUtils.java | 1 + .../bauhaus_services/rdf_utils/RdfUtils.java | 2 +- .../stamps/StampsRestrictionServiceImpl.java | 15 ++++++++++ .../StampsRestrictionsService.java | 4 +++ .../fr/insee/rmes/exceptions/ErrorCodes.java | 2 ++ .../documentations/DocumentationsQueries.java | 7 +++++ .../rmes/webservice/OperationsResources.java | 25 +++++++++++++++++ .../documentations/deleteGraph.ftlh | 1 + 11 files changed, 91 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/request/operations/documentations/deleteGraph.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index 3f247b491..e0d88fbc6 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -3,6 +3,7 @@ import java.io.File; import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import fr.insee.rmes.config.swagger.model.IdLabelTwoLangs; import fr.insee.rmes.exceptions.RmesException; @@ -141,6 +142,8 @@ public interface OperationsService { String getMSDJson() throws RmesException; + Status deleteMetadataReport(String id) throws RmesException; + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 427625715..9562ff32a 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -10,6 +10,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -382,6 +383,13 @@ public String setMetadataReport(String id, String body) throws RmesException { return documentationsUtils.setMetadataReport(id, body, false); } + /** + * DELETE + */ + @Override + public Status deleteMetadataReport(String id) throws RmesException { + return documentationsUtils.deleteMetadataReport(id); + } /** * PUBLISH diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index de1eb7c1a..a3a1e23e5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -13,6 +13,8 @@ import java.util.List; import java.util.stream.Collectors; +import javax.ws.rs.core.Response.Status; + import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; @@ -51,6 +53,7 @@ import fr.insee.rmes.exceptions.RmesNotAcceptableException; import fr.insee.rmes.exceptions.RmesNotFoundException; import fr.insee.rmes.exceptions.RmesUnauthorizedException; +import fr.insee.rmes.external_services.notifications.RmesNotificationsImpl; import fr.insee.rmes.model.ValidationStatus; import fr.insee.rmes.model.operations.Operation; import fr.insee.rmes.model.operations.Series; @@ -62,6 +65,7 @@ import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.ontologies.SDMX_MM; import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentationsQueries; +import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentsQueries; import fr.insee.rmes.utils.XMLUtils; @@ -199,10 +203,6 @@ public String setMetadataReport(String id, String body, boolean create) throws R logger.error(e.getMessage()); throw new RmesNotAcceptableException(ErrorCodes.SIMS_INCORRECT, e.getMessage(), "IOException: cannot parse input"); } - // Fix for sims passed without target (TEMPORARY ?) -// if (sims.getIdTarget()==null) { -// addTarget(sims); -// } // Check idOperation/idSerie/IdIndicator and Init or check id sims String idTarget = sims.getIdTarget(); @@ -652,4 +652,24 @@ public String buildShellSims() throws RmesException { return XMLUtils.produceXMLResponse(msd); } + public Status deleteMetadataReport(String id) throws RmesException { + String[] target = getDocumentationTargetTypeAndId(id); + String targetType = target[0]; + String idDatabase = target[1]; + + if (targetType != Constants.SERIES) { + throw new RmesNotAcceptableException(ErrorCodes.SIMS_DELETION_FOR_NON_SERIES, "Only a sims that documents a series can be deleted", id); + } + + IRI targetUri=RdfUtils.objectIRI(ObjectType.SERIES, idDatabase); + if (!stampsRestrictionsService.canDeleteSims(targetUri)) { + throw new RmesUnauthorizedException(ErrorCodes.SIMS_DELETION_RIGHTS_DENIED, + "Only an admin or a manager can delete a new sims."); + } + Resource graph = RdfUtils.simsGraph(id); + + return repoGestion.executeUpdate(DocumentationsQueries.deleteGraph(graph)); + + } + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java index bb41066ec..3279399a6 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java @@ -213,6 +213,7 @@ private void createRdfOperation(Operation operation, IRI serieUri, ValidationSta public String setOperationValidation(String id) throws RmesException { Model model = new LinkedHashModel(); + //TODO: check : is it the Series id or the Ope id ? IRI seriesURI = getSeriesUri(id); if(!stampsRestrictionsService.canModifyOperation(seriesURI)) { throw new RmesUnauthorizedException(ErrorCodes.OPERATION_MODIFICATION_RIGHTS_DENIED, "Only authorized users can modify operations."); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RdfUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RdfUtils.java index 2b24e91cf..79238075b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RdfUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RdfUtils.java @@ -264,7 +264,7 @@ public static void addTripleBNode(BNode bnode, IRI predicat, String value,String model.add(bnode, predicat, RdfUtils.setLiteralString(value, lang), graph); } } - + private RdfUtils() { throw new IllegalStateException("Utility class"); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java index 2a46a1139..997215331 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java @@ -306,6 +306,19 @@ public boolean canCreateSims(List uris) throws RmesException { || (isIndicatorManager(uris) && isIndicatorContributor(user))); } + @Override + public boolean canDeleteSims(IRI targetURI) throws RmesException { + List uris = new ArrayList<>(); + uris.add(targetURI); + return canDeleteSims(uris); + } + + @Override + public boolean canDeleteSims(List uris) throws RmesException { + User user = getUser(); + return (isAdmin(user) || (isSeriesManager(uris) && isSeriesContributor(user))); + } + @Override public boolean canModifyConcept(IRI uri) throws RmesException { User user = getUser(); @@ -355,4 +368,6 @@ public boolean canManageDocumentsAndLinks() throws RmesException { return (isAdmin(user) || isSeriesContributor(user) || isIndicatorContributor(user)); } + + } diff --git a/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java b/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java index 0fa64bcd8..621eefb74 100644 --- a/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java +++ b/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java @@ -41,6 +41,10 @@ public interface StampsRestrictionsService { boolean canCreateSims(IRI targetURI) throws RmesException; + boolean canDeleteSims(IRI seriesURI) throws RmesException; + + boolean canDeleteSims(List uris) throws RmesException; + boolean canModifySeries(IRI uri) throws RmesException; boolean canValidateSeries(IRI uri) throws RmesException; diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index e82e72ce8..597b3b7f4 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -125,4 +125,6 @@ public class ErrorCodes { // SIMS public static final int SIMS_INCORRECT = 861; + public static final int SIMS_DELETION_FOR_NON_SERIES = 862; + public static final int SIMS_DELETION_RIGHTS_DENIED = 863; } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java index a0981649d..0e4895aea 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java @@ -3,6 +3,8 @@ import java.util.HashMap; import java.util.Map; +import org.eclipse.rdf4j.model.Resource; + import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.rdf_utils.FreeMarkerUtils; import fr.insee.rmes.config.Config; @@ -150,4 +152,9 @@ private static String buildRequest(String fileName, Map params) private DocumentationsQueries() { throw new IllegalStateException("Utility class"); } + + public static String deleteGraph(Resource graph) throws RmesException { + params.put("DOCUMENTATION_GRAPH", graph); + return buildRequest("deleteGraph.ftlh", params); + } } diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 1057ade22..1c57448c8 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -6,6 +6,7 @@ import java.nio.charset.StandardCharsets; import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.HeaderParam; import javax.ws.rs.POST; @@ -722,7 +723,31 @@ public Response setMetadataReportById( return Response.status(Status.NO_CONTENT).build(); } + /** + * DELETE + * @param id + * @return + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR, Roles.SPRING_CNIS }) + @DELETE + @Path("/metadataReport/delete/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "deleteMetadataReportById", summary = "Delete metadata report") + public Response deleteMetadataReportById( + @PathParam(Constants.ID) String id, + @RequestBody(description = "Report to delete", required = true, + content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { + Status result=Status.NO_CONTENT; + try { + result = operationsService.deleteMetadataReport(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(result).build(); + } + + /** * PUBLISH * @param id diff --git a/src/main/resources/request/operations/documentations/deleteGraph.ftlh b/src/main/resources/request/operations/documentations/deleteGraph.ftlh new file mode 100644 index 000000000..fe7db8268 --- /dev/null +++ b/src/main/resources/request/operations/documentations/deleteGraph.ftlh @@ -0,0 +1 @@ +DROP SILENT GRAPH <${DOCUMENTATION_GRAPH}> ; From 42378335e3630a7c932f1b32c424f7870bb93779 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 9 Dec 2020 10:21:20 +0100 Subject: [PATCH 036/243] fix rights check for sims deletion --- .../bauhaus_services/stamps/StampsRestrictionServiceImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java index 997215331..fb5295780 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java @@ -316,7 +316,8 @@ public boolean canDeleteSims(IRI targetURI) throws RmesException { @Override public boolean canDeleteSims(List uris) throws RmesException { User user = getUser(); - return (isAdmin(user) || (isSeriesManager(uris) && isSeriesContributor(user))); +// return (isAdmin(user) || (isSeriesManager(uris) && isSeriesContributor(user))); + return (isAdmin(user)); } @Override From 97867bb910cc01e97a1715178c4b68870ecffc81 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 9 Dec 2020 12:30:12 +0100 Subject: [PATCH 037/243] fix sonar smell --- .../rmes/bauhaus_services/code_list/CodeListServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java index d9c109a87..f404a5d7e 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java @@ -46,7 +46,7 @@ public CodeList buildCodeListFromJson(String codeListJson) { ObjectMapper mapper = new ObjectMapper(); CodeList codeList = new CodeList(); try { - codeList = mapper.readValue(codeListJson.toString(), CodeList.class); + codeList = mapper.readValue(codeListJson, CodeList.class); } catch (JsonProcessingException e) { logger.error("Json cannot be parsed: ".concat(e.getMessage())); } From 7e8856be692f10451aee5c8cc9795350ed98f237 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 9 Dec 2020 12:30:44 +0100 Subject: [PATCH 038/243] delete sims in publication repository --- .../documentations/DocumentationsUtils.java | 28 ++++++++++++------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index a3a1e23e5..5946ebf93 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -13,6 +13,7 @@ import java.util.List; import java.util.stream.Collectors; +import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; import org.apache.commons.io.IOUtils; @@ -47,6 +48,7 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; +import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; import fr.insee.rmes.config.Config; import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesException; @@ -64,6 +66,7 @@ import fr.insee.rmes.model.operations.documentations.MSD; import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.ontologies.SDMX_MM; +import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentationsQueries; import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentsQueries; import fr.insee.rmes.utils.XMLUtils; @@ -244,13 +247,13 @@ public String setMetadataReport(String id, String body, boolean create) throws R private void addTarget(Documentation sims) throws RmesException { if (sims.getIdTarget()==null) { String[] target = getDocumentationTargetTypeAndId(sims.getId()); - + String targetType = target[0]; String targetId = target[1]; switch(targetType) { - case Constants.INDICATOR_UP : sims.setIdIndicator(targetId); - case Constants.OPERATION_UP : sims.setIdOperation(targetId); - case Constants.SERIES_UP : sims.setIdSeries(targetId); + case Constants.INDICATOR_UP : sims.setIdIndicator(targetId); + case Constants.OPERATION_UP : sims.setIdOperation(targetId); + case Constants.SERIES_UP : sims.setIdSeries(targetId); } } } @@ -596,7 +599,7 @@ public File exportMetadataReport(String id) throws IOException, RmesException { neededCodeLists.addAll(XMLUtils.getTagValues(simsXML,Constants.CODELIST)); neededCodeLists=neededCodeLists.stream().distinct().collect(Collectors.toList()); - + String codeListsXml=""; codeListsXml=codeListsXml.concat(Constants.XML_OPEN_CODELIST_TAG); @@ -656,20 +659,25 @@ public Status deleteMetadataReport(String id) throws RmesException { String[] target = getDocumentationTargetTypeAndId(id); String targetType = target[0]; String idDatabase = target[1]; - + if (targetType != Constants.SERIES) { throw new RmesNotAcceptableException(ErrorCodes.SIMS_DELETION_FOR_NON_SERIES, "Only a sims that documents a series can be deleted", id); } - + IRI targetUri=RdfUtils.objectIRI(ObjectType.SERIES, idDatabase); if (!stampsRestrictionsService.canDeleteSims(targetUri)) { throw new RmesUnauthorizedException(ErrorCodes.SIMS_DELETION_RIGHTS_DENIED, "Only an admin or a manager can delete a new sims."); } Resource graph = RdfUtils.simsGraph(id); - - return repoGestion.executeUpdate(DocumentationsQueries.deleteGraph(graph)); - + + Response.Status result = repoGestion.executeUpdate(DocumentationsQueries.deleteGraph(graph)); + if (result.equals(Status.OK)) { + result = RepositoryPublication.executeUpdate(DocumentationsQueries.deleteGraph(graph)); + } + + return result; + } } From 0005a4889e723fd2ba63375c3275afca51e27c1f Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 9 Dec 2020 13:08:16 +0100 Subject: [PATCH 039/243] Fix bug in change document's file --- .../documentations/documents/DocumentsUtils.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index b5e1aabfb..75ce41bb8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -290,6 +290,7 @@ public Status deleteDocument(String docId, boolean isLink) throws RmesException return repoGestion.executeUpdate(DocumentsQueries.deleteDocumentQuery(docUri)); } + // Check that the document is not referred to by any sims private void checkDocumentReference(String docId, String uri) throws RmesException { JSONArray jsonResultat = repoGestion.getResponseAsArray(DocumentsQueries.getLinksToDocumentQuery(docId)); if (jsonResultat.length() > 0) { @@ -333,13 +334,13 @@ public String changeFile(String docId, InputStream documentFile, String document logger.info("Try to replace file {}, new URL is {}", documentName, newUrl); uploadFile(documentFile, documentName, newUrl, false); + // Update document's url + changeDocumentsURL(docId, docUrl, newUrl); + // Delete the old file logger.info("Delete old file {}, with URL {}", documentName, docUrl); - checkDocumentReference(docId, jsonDoc.getString(Constants.URI)); + checkDocumentReference(docId, jsonDoc.getString(Constants.URI)); deleteFile(docUrl); - - // Update document's url - changeDocumentsURL(docId, docUrl, newUrl); } return newUrl; From 7e4a6d7055b16e9b594abc5c8b236535aa412978 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 9 Dec 2020 13:13:30 +0100 Subject: [PATCH 040/243] fix controls for changing document's file --- .../operations/documentations/documents/DocumentsUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index 75ce41bb8..3ab3a7737 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -339,7 +339,6 @@ public String changeFile(String docId, InputStream documentFile, String document // Delete the old file logger.info("Delete old file {}, with URL {}", documentName, docUrl); - checkDocumentReference(docId, jsonDoc.getString(Constants.URI)); deleteFile(docUrl); } From 6bba5605e079920e6dc5be92795a2e7107c5a380 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 9 Dec 2020 16:13:34 +0100 Subject: [PATCH 041/243] fix bug getSeriesLinks --- .../request/operations/series/getSeriesLinksQuery.ftlh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh index d601de410..3da1037a9 100644 --- a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh @@ -4,7 +4,6 @@ SELECT DISTINCT ?id ?labelLg1 ?labelLg2 FROM <${ORG_INSEE_GRAPH}> WHERE { ?series <${LINK_PREDICATE}> ?uriLinked . - ?uriLinked dcterms:identifier ?id . ?uriLinked skos:prefLabel ?labelLg1 . FILTER (lang(?labelLg1) = '${LG1}') . @@ -12,6 +11,8 @@ SELECT DISTINCT ?id ?labelLg1 ?labelLg2 OPTIONAL {?uriLinked skos:prefLabel ?labelLg2 . FILTER (lang(?labelLg2) = '${LG2}')} . + BIND(STRAFTER(STR(?uriLinked),'/operations/series/') AS ?id) . + FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES}')) . } ORDER BY ?labelLg1 \ No newline at end of file From 09dba01d1e4ef2751390d3becf7bddcb61b23065 Mon Sep 17 00:00:00 2001 From: Emmanuel DEMEY Date: Thu, 10 Dec 2020 20:23:41 +0100 Subject: [PATCH 042/243] feat: define default value for SIMS --- .../bauhaus_services/OperationsService.java | 4 ++-- .../operations/OperationsImpl.java | 19 +++++++++++++------ .../rmes/webservice/OperationsResources.java | 10 ++++++++++ src/main/resources/bauhaus-sims.json | 17 +++++++++++++++++ .../checkUnpublishedCodelistOrConcept.ftlh | 0 5 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 src/main/resources/bauhaus-sims.json create mode 100644 src/main/resources/request/structures/checkUnpublishedCodelistOrConcept.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index 3f247b491..2ffd7b989 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -1,6 +1,7 @@ package fr.insee.rmes.bauhaus_services; import java.io.File; +import java.io.IOException; import javax.ws.rs.core.Response; @@ -141,6 +142,5 @@ public interface OperationsService { String getMSDJson() throws RmesException; - - + String getMetadataReportDefaultValue() throws IOException; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 427625715..d8e72126a 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -1,12 +1,8 @@ package fr.insee.rmes.bauhaus_services.operations; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileOutputStream; -import java.io.InputStream; -import java.io.OutputStream; +import java.io.*; import java.lang.reflect.Field; +import java.nio.charset.Charset; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -14,10 +10,12 @@ import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.eclipse.rdf4j.model.Resource; import org.glassfish.jersey.media.multipart.ContentDisposition; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import fr.insee.rmes.bauhaus_services.OperationsService; @@ -46,6 +44,7 @@ import fr.insee.rmes.persistance.sparql_queries.operations.operations.OperationsQueries; import fr.insee.rmes.persistance.sparql_queries.operations.series.SeriesQueries; import fr.insee.rmes.utils.XhtmlToMarkdownUtils; +import org.springframework.util.StreamUtils; @Service public class OperationsImpl extends RdfService implements OperationsService { @@ -56,6 +55,9 @@ public class OperationsImpl extends RdfService implements OperationsService { static final Logger logger = LogManager.getLogger(OperationsImpl.class); + @Value("classpath:bauhaus-sims.json") + org.springframework.core.io.Resource simsDefaultValue; + @Autowired Jasper jasper; @@ -330,6 +332,11 @@ public String getMSDJson() throws RmesException { return QueryUtils.correctEmptyGroupConcat(resQuery); } + @Override + public String getMetadataReportDefaultValue() throws IOException { + return StreamUtils.copyToString(this.simsDefaultValue.getInputStream(), Charset.defaultCharset()); + } + @Override public MSD getMSD() throws RmesException { return operationsUtils.getMSD(); diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 1057ade22..9aba41557 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -630,6 +630,16 @@ public Response getMetadataReport(@PathParam(Constants.ID) String id) { return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + @GET + @Path("/metadataReport/default") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReportDefaultValue", summary = "Get default value for metadata rpoert", + responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) + ))}) + public Response getMetadataReportDefaultValue() throws IOException { + return Response.status(HttpStatus.SC_OK).entity(operationsService.getMetadataReportDefaultValue()).build(); + } + @GET @Path("/metadataReport/fullSims/{id}") @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) diff --git a/src/main/resources/bauhaus-sims.json b/src/main/resources/bauhaus-sims.json new file mode 100644 index 000000000..6790fc59e --- /dev/null +++ b/src/main/resources/bauhaus-sims.json @@ -0,0 +1,17 @@ +{ + "S.10.6": { + "documentsLg1": [ + { + "labelLg1": "Immatriculations de voitures particuli��res neuves", + "lang": "fr", + "uri": "http://id.insee.fr/documents/document/76", + "url": "https://www.insee.fr/fr/metadonnees/source/fichier/Methodologie_immatriculations_voitures_neuves.pdf" + } + ], + "documentsLg2": [], + "labelLg2": "INSEE revises the values ​​of its statistics so that they reflect reality as accurately as possible and to ensure their relevance and reliability. It uses well-established, standardized and planned procedures according to international standards. It announces revisions simultaneously with their diffusion or in advance according to a protocol adapted to the source of the revisions, their size and the sensitivity of the statistics published. All the explanations necessary to understand these revisions accompany the diffusion of the relevant statistical sources on the Insee.fr site.", + "rangeType": "RICH_TEXT", + "labelLg1": "L’Insee révise les valeurs de ses statistiques pour qu’elles reflètent la réalité de la manière la plus exacte possible et pour garantir leur pertinence et leur fiabilité. Il a recours à des procédures bien établies, normalisées et planifiées suivant les standards internationaux. Il annonce les révisions simultanément à leur diffusion ou à l’avance selon un protocole adapté à la source des révisions, à leur ampleur et à la sensibilité des statistiques publiées. Toutes les explications nécessaires à la compréhension de ces révisions accompagnent la diffusion des sources statistiques concernées sur le site Insee.fr.", + "idAttribute": "S.10.6" + } +} \ No newline at end of file diff --git a/src/main/resources/request/structures/checkUnpublishedCodelistOrConcept.ftlh b/src/main/resources/request/structures/checkUnpublishedCodelistOrConcept.ftlh new file mode 100644 index 000000000..e69de29bb From 7a983fb4ec8077a5dbf6088a148b6d7e0bc2a3f7 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Thu, 10 Dec 2020 22:01:28 +0100 Subject: [PATCH 043/243] Show generated products in series --- .../operations/series/SeriesQueries.java | 2 ++ .../series/getSeriesGeneratedWithQuery.ftlh | 11 +++++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java index b53508df1..a164f0caf 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java @@ -20,6 +20,7 @@ private SeriesQueries() { static Map params; private static final String ID_SERIES = "ID_SERIES"; + private static final String PRODUCTS_GRAPH = "PRODUCTS_GRAPH"; private static final String URI_SERIES = "URI_SERIES"; private static final String ORGANIZATIONS_GRAPH = "ORGANIZATIONS_GRAPH"; private static final String OPERATIONS_GRAPH = "OPERATIONS_GRAPH"; @@ -190,6 +191,7 @@ public static String getGeneratedWith(String idSeries) throws RmesException { public static String getOperations(String idSeries) throws RmesException { if (params==null) {initParams();} params.put(ID_SERIES, idSeries); + params.put(PRODUCTS_GRAPH, Config.PRODUCTS_GRAPH); return buildSeriesRequest("getSeriesOperationsQuery.ftlh", params); } diff --git a/src/main/resources/request/operations/series/getSeriesGeneratedWithQuery.ftlh b/src/main/resources/request/operations/series/getSeriesGeneratedWithQuery.ftlh index 8102c3337..26e23b172 100644 --- a/src/main/resources/request/operations/series/getSeriesGeneratedWithQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesGeneratedWithQuery.ftlh @@ -1,9 +1,12 @@ SELECT ?id ?typeOfObject ?labelLg1 ?labelLg2 - FROM <${OPERATIONS_GRAPH}> + FROM <${PRODUCTS_GRAPH}> WHERE { - ?uri prov:wasGeneratedBy ?series . ?uri skos:prefLabel ?labelLg1 . - FILTER (lang(?labelLg1) = '${LG1}') . ?uri skos:prefLabel ?labelLg2 . - FILTER (lang(?labelLg2) = '${LG2}') . ?uri rdf:type ?typeOfObject . + ?uri prov:wasGeneratedBy ?series . + ?uri skos:prefLabel ?labelLg1 . + FILTER (lang(?labelLg1) = '${LG1}') . + ?uri skos:prefLabel ?labelLg2 . + FILTER (lang(?labelLg2) = '${LG2}') . + ?uri rdf:type ?typeOfObject . BIND(REPLACE( STR(?uri) , '(.*/)(\\\\w+$)', '$2' ) AS ?id) . FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES}')) . } From cf06eeb731aa9d126abed8fa115fd8a57545c5ee Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 11 Dec 2020 19:34:49 +0100 Subject: [PATCH 044/243] fix identifiers of linked objects in get series --- .../rmes/bauhaus_services/Constants.java | 1 + .../operations/series/SeriesUtils.java | 23 ++++++++++--------- .../operations/series/SeriesQueries.java | 7 +++++- .../series/getSeriesLinksQuery.ftlh | 15 ++++++++++-- .../getSeriesOrganizationsLinksQuery.ftlh | 18 +++++++++++++++ 5 files changed, 50 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/request/operations/series/getSeriesOrganizationsLinksQuery.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index df9f62df9..2bbfaa587 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -57,6 +57,7 @@ public class Constants { /*O*/ public static final String OPERATIONS = "operations"; public static final String OPERATION_UP = "OPERATION"; + public static final String ORGANIZATIONS = "organizations"; public static final String OWNER = "owner"; public static final String OUTPUT = "output"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java index 515860931..cfe692b38 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java @@ -123,9 +123,9 @@ public String getSeriesForSearch() throws RmesException { JSONObject series = resQuery.getJSONObject(i); String idSeries = series.get(Constants.ID).toString(); addSeriesCreators(idSeries, series); - addOneTypeOfLink(idSeries, series, DCTERMS.CONTRIBUTOR); - addOneTypeOfLink(idSeries, series, INSEE.DATA_COLLECTOR); - addOneTypeOfLink(idSeries, series, DCTERMS.PUBLISHER); + addOneTypeOfLink(idSeries, series, DCTERMS.CONTRIBUTOR, Constants.ORGANIZATIONS); + addOneTypeOfLink(idSeries, series, INSEE.DATA_COLLECTOR, Constants.ORGANIZATIONS); + addOneTypeOfLink(idSeries, series, DCTERMS.PUBLISHER, Constants.ORGANIZATIONS); famOpeSerIndUtils.fixOrganizationsNames(series); result.put(series); } return QueryUtils.correctEmptyGroupConcat(result.toString()); @@ -152,12 +152,12 @@ private void addSeriesFamily(String idSeries, JSONObject series) throws RmesExce } private void addSeriesLinks(String idSeries, JSONObject series) throws RmesException { - addOneTypeOfLink(idSeries, series, DCTERMS.REPLACES); - addOneTypeOfLink(idSeries, series, DCTERMS.IS_REPLACED_BY); - addOneTypeOfLink(idSeries, series, RDFS.SEEALSO); - addOneTypeOfLink(idSeries, series, DCTERMS.CONTRIBUTOR); - addOneTypeOfLink(idSeries, series, INSEE.DATA_COLLECTOR); - addOneTypeOfLink(idSeries, series, DCTERMS.PUBLISHER); + addOneTypeOfLink(idSeries, series, DCTERMS.REPLACES, Constants.OPERATIONS); + addOneTypeOfLink(idSeries, series, DCTERMS.IS_REPLACED_BY, Constants.OPERATIONS); + addOneTypeOfLink(idSeries, series, RDFS.SEEALSO, Constants.OPERATIONS); + addOneTypeOfLink(idSeries, series, DCTERMS.CONTRIBUTOR, Constants.ORGANIZATIONS); + addOneTypeOfLink(idSeries, series, INSEE.DATA_COLLECTOR, Constants.ORGANIZATIONS); + addOneTypeOfLink(idSeries, series, DCTERMS.PUBLISHER, Constants.ORGANIZATIONS); famOpeSerIndUtils.fixOrganizationsNames(series); } @@ -170,8 +170,9 @@ private void addSeriesLinks(String idSeries, JSONObject series) throws RmesExcep * @param predicate * @throws RmesException */ - private void addOneTypeOfLink(String id, JSONObject series, IRI predicate) throws RmesException { - JSONArray links = repoGestion.getResponseAsArray(SeriesQueries.seriesLinks(id, predicate)); + private void addOneTypeOfLink(String id, JSONObject series, IRI predicate, String resultType) throws RmesException { + + JSONArray links = repoGestion.getResponseAsArray(SeriesQueries.seriesLinks(id, predicate, resultType)); if (links.length() != 0) { links = QueryUtils.transformRdfTypeInString(links); } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java index a164f0caf..e0db58460 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java @@ -5,6 +5,7 @@ import org.eclipse.rdf4j.model.IRI; +import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.rdf_utils.FreeMarkerUtils; import fr.insee.rmes.config.Config; import fr.insee.rmes.exceptions.RmesException; @@ -200,10 +201,14 @@ public static String getOperations(String idSeries) throws RmesException { * @return String * @throws RmesException */ - public static String seriesLinks(String idSeries, IRI linkPredicate) throws RmesException { + public static String seriesLinks(String idSeries, IRI linkPredicate, String resultType) throws RmesException { if (params==null) {initParams();} params.put(ID_SERIES, idSeries); params.put(LINK_PREDICATE, linkPredicate); + if(resultType==Constants.ORGANIZATIONS) { + return buildSeriesRequest("getSeriesOrganizationsLinksQuery.ftlh", params); + } + params.put(PRODUCTS_GRAPH, Config.PRODUCTS_GRAPH); return buildSeriesRequest("getSeriesLinksQuery.ftlh", params); } diff --git a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh index 3da1037a9..f872b0f27 100644 --- a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh @@ -1,5 +1,6 @@ -SELECT DISTINCT ?id ?labelLg1 ?labelLg2 +SELECT DISTINCT ?id ?labelLg1 ?labelLg2 FROM <${OPERATIONS_GRAPH}> + FROM <${PRODUCTS_GRAPH}> FROM <${ORGANIZATIONS_GRAPH}> FROM <${ORG_INSEE_GRAPH}> WHERE { @@ -11,7 +12,17 @@ SELECT DISTINCT ?id ?labelLg1 ?labelLg2 OPTIONAL {?uriLinked skos:prefLabel ?labelLg2 . FILTER (lang(?labelLg2) = '${LG2}')} . - BIND(STRAFTER(STR(?uriLinked),'/operations/series/') AS ?id) . + BIND( + IF(regex(str(?uriLinked), "/operations/serie/"), + STRAFTER(STR(?uriLinked),'/operations/serie/'), + IF(regex(str(?uriLinked), "/produits/indicateur/"), + STRAFTER(STR(?uriLinked),'/produits/indicateur/'), + IF(regex(str(?uriLinked), "organisations/insee/"), + STRAFTER(STR(?uriLinked),'organisations/insee/'), + IF(regex(str(?uriLinked), "organisations/"), + STRAFTER(STR(?uriLinked),'organisations/'), + STR(?uriLinked) )))) + AS ?id) . FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES}')) . } diff --git a/src/main/resources/request/operations/series/getSeriesOrganizationsLinksQuery.ftlh b/src/main/resources/request/operations/series/getSeriesOrganizationsLinksQuery.ftlh new file mode 100644 index 000000000..0baaaf725 --- /dev/null +++ b/src/main/resources/request/operations/series/getSeriesOrganizationsLinksQuery.ftlh @@ -0,0 +1,18 @@ +SELECT DISTINCT ?id ?labelLg1 ?labelLg2 + FROM <${OPERATIONS_GRAPH}> + FROM <${ORGANIZATIONS_GRAPH}> + FROM <${ORG_INSEE_GRAPH}> + WHERE { + ?series <${LINK_PREDICATE}> ?uriLinked . + + ?uriLinked skos:prefLabel ?labelLg1 . + FILTER (lang(?labelLg1) = '${LG1}') . + + OPTIONAL {?uriLinked skos:prefLabel ?labelLg2 . + FILTER (lang(?labelLg2) = '${LG2}')} . + + ?uriLinked dcterms:identifier ?id + + FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES}')) . + } + ORDER BY ?labelLg1 \ No newline at end of file From a3403041e750334598d10340ce914e9594d12cad Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 11 Dec 2020 19:50:43 +0100 Subject: [PATCH 045/243] Update getSeriesLinksQuery.ftlh --- .../operations/series/getSeriesLinksQuery.ftlh | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh index f872b0f27..25668f9ea 100644 --- a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh @@ -13,15 +13,11 @@ SELECT DISTINCT ?id ?labelLg1 ?labelLg2 FILTER (lang(?labelLg2) = '${LG2}')} . BIND( - IF(regex(str(?uriLinked), "/operations/serie/"), - STRAFTER(STR(?uriLinked),'/operations/serie/'), - IF(regex(str(?uriLinked), "/produits/indicateur/"), - STRAFTER(STR(?uriLinked),'/produits/indicateur/'), - IF(regex(str(?uriLinked), "organisations/insee/"), - STRAFTER(STR(?uriLinked),'organisations/insee/'), - IF(regex(str(?uriLinked), "organisations/"), - STRAFTER(STR(?uriLinked),'organisations/'), - STR(?uriLinked) )))) + IF(regex(str(?uriLinked), "/operations/serie/"), + STRAFTER(STR(?uriLinked),'/operations/serie/'), + IF(regex(str(?uriLinked), "/produits/indicateur/"), + STRAFTER(STR(?uriLinked),'/produits/indicateur/'), + STR(?uriLinked) )) AS ?id) . FILTER(STRENDS(STR(?series),'/operations/serie/${ID_SERIES}')) . From 59d83eae02a3c493468a733abc094b33d2e73e63 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 14 Dec 2020 10:46:37 +0100 Subject: [PATCH 046/243] improve error codes --- .../operations/documentations/DocumentationsUtils.java | 2 +- src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 5946ebf93..2dd883738 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -667,7 +667,7 @@ public Status deleteMetadataReport(String id) throws RmesException { IRI targetUri=RdfUtils.objectIRI(ObjectType.SERIES, idDatabase); if (!stampsRestrictionsService.canDeleteSims(targetUri)) { throw new RmesUnauthorizedException(ErrorCodes.SIMS_DELETION_RIGHTS_DENIED, - "Only an admin or a manager can delete a new sims."); + "Only an admin or a manager can delete a sims."); } Resource graph = RdfUtils.simsGraph(id); diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index 597b3b7f4..78781feeb 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -56,6 +56,7 @@ public class ErrorCodes { public static final int SIMS_MODIFICATION_RIGHTS_DENIED = 802; public static final int SIMS_VALIDATION_RIGHTS_DENIED = 803; public static final int SIMS_VALIDATION_UNPUBLISHED_TARGET = 804; + public static final int SIMS_DELETION_RIGHTS_DENIED = 805; // COLLECTIONS @@ -105,8 +106,6 @@ public class ErrorCodes { public static final int GEOFEATURE_UNKNOWN = 845; public static final int GEOFEATURE_INCORRECT_BODY = 846; - - /* * 406 NOTACCEPTABLEEXCEPTIONS @@ -126,5 +125,4 @@ public class ErrorCodes { // SIMS public static final int SIMS_INCORRECT = 861; public static final int SIMS_DELETION_FOR_NON_SERIES = 862; - public static final int SIMS_DELETION_RIGHTS_DENIED = 863; } From c9117418ce38435b0fe08ba64e23cce108dca448 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 14 Dec 2020 10:47:39 +0100 Subject: [PATCH 047/243] fix bug seeAslo --- .../request/operations/series/getSeriesLinksQuery.ftlh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh index 25668f9ea..201ba0e7a 100644 --- a/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesLinksQuery.ftlh @@ -1,8 +1,6 @@ -SELECT DISTINCT ?id ?labelLg1 ?labelLg2 +SELECT DISTINCT ?id ?labelLg1 ?labelLg2 ?typeOfObject FROM <${OPERATIONS_GRAPH}> FROM <${PRODUCTS_GRAPH}> - FROM <${ORGANIZATIONS_GRAPH}> - FROM <${ORG_INSEE_GRAPH}> WHERE { ?series <${LINK_PREDICATE}> ?uriLinked . @@ -12,6 +10,8 @@ SELECT DISTINCT ?id ?labelLg1 ?labelLg2 OPTIONAL {?uriLinked skos:prefLabel ?labelLg2 . FILTER (lang(?labelLg2) = '${LG2}')} . + OPTIONAL {?uriLinked rdf:type ?typeOfObject .} + BIND( IF(regex(str(?uriLinked), "/operations/serie/"), STRAFTER(STR(?uriLinked),'/operations/serie/'), From 9280d83b52bf954a32d9096df28f20f267801c01 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 14 Dec 2020 17:34:05 +0100 Subject: [PATCH 048/243] Update changeDocument : control before upload --- .../documents/DocumentsUtils.java | 74 ++++++++++++------- 1 file changed, 46 insertions(+), 28 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index 3ab3a7737..03ac092e4 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -59,14 +59,14 @@ public class DocumentsUtils extends RdfService { private static final String SCHEME_FILE = "file://"; static final Logger logger = LogManager.getLogger(DocumentsUtils.class); - + @Autowired private LangService langService; /* * METHODS LINKS TO THE SIMS - RUBRICS */ - + public void addDocumentsToRubric(Model model, Resource graph, List documents, IRI textUri) throws RmesException { if (documents != null && !documents.isEmpty()) { @@ -92,10 +92,10 @@ public JSONArray getListDocumentLink(String idSims, String idRubric, String lang return allDocs; } - - - - + + + + /** * Get all documents * @return allDocs @@ -180,18 +180,18 @@ public void createDocument(String id, String body, boolean isLink, InputStream d logger.error(e.getMessage()); } - + if (isLink) { checkLinkDoesNotExist(id, document.getUrl()); }else { String url = createFileUrl(documentName); logger.info("URL CREATED : {}", url); document.setUrl(url); - + // upload file in storage folder uploadFile(documentFile, documentName, url, false); } - + //Write RDF graph in database try { IRI docUri = RdfUtils.toURI(document.getUri()); @@ -224,8 +224,8 @@ private void checkLinkDoesNotExist(String id, String url) throws RmesException { public void setDocument(String id, String body, boolean isLink) throws RmesException { /* Check rights */ if (!stampsRestrictionsService.canManageDocumentsAndLinks()) { - throw new RmesUnauthorizedException(ErrorCodes.LINK_MODIFICATION_RIGHTS_DENIED, - "Only an admin or a manager can modify a "+ (isLink ? "link." : "document."), id); + throw new RmesUnauthorizedException(ErrorCodes.LINK_MODIFICATION_RIGHTS_DENIED, + "Only an admin or a manager can modify a "+ (isLink ? "link." : "document."), id); } ObjectMapper mapper = new ObjectMapper(); @@ -296,22 +296,40 @@ private void checkDocumentReference(String docId, String uri) throws RmesExcepti if (jsonResultat.length() > 0) { throw new RmesUnauthorizedException(ErrorCodes.DOCUMENT_DELETION_LINKED, "The document " + uri + "cannot be deleted because it is referred to by " + jsonResultat.length() - + " sims, including: " + ((JSONObject) jsonResultat.get(0)).get("text").toString(), + + " sims, including: " + ((JSONObject) jsonResultat.get(0)).get("text").toString(), jsonResultat); } } + // Check that the document is not referred to by any other sims than allowedUri + private void checkDocumentReferences(String docId, String uri, String allowedUri) throws RmesException { + JSONArray jsonResultat = repoGestion.getResponseAsArray(DocumentsQueries.getLinksToDocumentQuery(docId)); + if (jsonResultat.length() > 0) { + for(int i=0; i create a new URL else { + // Delete the old file + logger.info("Delete old file {}, with URL {}", documentName, docUrl); + deleteFile(docUrl); + // Upload the new file newUrl = createFileUrl(documentName); logger.info("Try to replace file {}, new URL is {}", documentName, newUrl); @@ -336,10 +358,6 @@ public String changeFile(String docId, InputStream documentFile, String document // Update document's url changeDocumentsURL(docId, docUrl, newUrl); - - // Delete the old file - logger.info("Delete old file {}, with URL {}", documentName, docUrl); - deleteFile(docUrl); } return newUrl; @@ -489,10 +507,10 @@ public Document buildDocumentFromJson(JSONObject jsonDoc) { if (jsonDoc.has(Constants.URI)) { doc.setUri(jsonDoc.getString(Constants.URI)); } - + return doc ; } - + public Document buildDocumentHeadFromJson(JSONObject jsonDoc) { Document doc= new Document(); if (jsonDoc.has(Constants.URL)) { @@ -506,11 +524,11 @@ public Document buildDocumentHeadFromJson(JSONObject jsonDoc) { } return(doc); } - -// -// public Response downloadDocument(String id) throws RmesException { -// JSONObject jsonDoc = getDocument(id); -//======= + + // + // public Response downloadDocument(String id) throws RmesException { + // JSONObject jsonDoc = getDocument(id); + //======= public Response downloadDocumentFile(String id) throws RmesException { JSONObject jsonDoc = getDocument(id, false); @@ -530,7 +548,7 @@ public Response downloadDocumentFile(String id) throws RmesException { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Error downloading file"); } } - + public Path getStorageFolderPath() throws RmesException { Path path = null; @@ -544,6 +562,6 @@ public Path getStorageFolderPath() throws RmesException { return path; } - - + + } From eb19432c9f6f3d201f9f8aa58df74d01426470fc Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Tue, 15 Dec 2020 09:39:10 +0100 Subject: [PATCH 049/243] fix: solve issue when creating component --- .../structures/utils/StructureComponentUtils.java | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 1296b22d2..9a8cddbdb 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -7,6 +7,7 @@ import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesUnauthorizedException; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -118,12 +119,17 @@ public String createComponent(MutualizedComponent component, String id) throws R private void createRDFForComponent(MutualizedComponent component, ValidationStatus status) throws RmesException { - Boolean componentsWithSameCodelistAndConcept = repoGestion.getResponseAsBoolean(StructureQueries.checkUnicityMutualizedComponent(component.getId(), component.getConcept(), component.getCodeList())); - if(componentsWithSameCodelistAndConcept){ - throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_UNICITY, - "A component with the same code list and concept already exists", ""); + + if(StringUtils.isNotEmpty(component.getConcept()) && StringUtils.isNotEmpty(component.getCodeList())){ + Boolean componentsWithSameCodelistAndConcept = repoGestion.getResponseAsBoolean(StructureQueries.checkUnicityMutualizedComponent(component.getId(), component.getConcept(), component.getCodeList())); + + if(componentsWithSameCodelistAndConcept){ + throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_UNICITY, + "A component with the same code list and concept already exists", ""); + } } + String type = component.getType(); if (type.equals(QB.ATTRIBUTE_PROPERTY.toString())) { From 41cf56e873119a4d619b399a8158a426dcd816ac Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Tue, 15 Dec 2020 09:40:16 +0100 Subject: [PATCH 050/243] fix: solve typo on comment --- .../rmes/webservice/OperationsResources.java | 2 +- src/main/resources/bauhaus-dev.properties | 46 ++++++++++--------- 2 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 9aba41557..4c82b24f2 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -633,7 +633,7 @@ public Response getMetadataReport(@PathParam(Constants.ID) String id) { @GET @Path("/metadataReport/default") @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReportDefaultValue", summary = "Get default value for metadata rpoert", + @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReportDefaultValue", summary = "Get default value for metadata report", responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) ))}) public Response getMetadataReportDefaultValue() throws IOException { diff --git a/src/main/resources/bauhaus-dev.properties b/src/main/resources/bauhaus-dev.properties index 4cbd1e4c0..414847b20 100644 --- a/src/main/resources/bauhaus-dev.properties +++ b/src/main/resources/bauhaus-dev.properties @@ -2,7 +2,7 @@ fr.insee.rmes.bauhaus.appHost = https://localhost:3000/#/ # Env (XXX --> NoAuth | qf --> Form | pre-prod, prod --> Keycloak) -fr.insee.rmes.bauhaus.env = qf +fr.insee.rmes.bauhaus.env = XXX # SSL fr.insee.rmes.bauhaus.force.ssl = false @@ -11,43 +11,47 @@ fr.insee.rmes.bauhaus.force.ssl = false fr.insee.rmes.bauhaus.log.configuration = log4j2.xml # Bdd Sesame de gestion -fr.insee.rmes.bauhaus.sesame.gestion.sesameServer = **** -fr.insee.rmes.bauhaus.sesame.gestion.repository = gestion -#fr.insee.rmes.bauhaus.sesame.gestion.repository = bauhaus - +fr.insee.rmes.bauhaus.sesame.gestion.sesameServer = http://linked-open-statistics.org:7200 +fr.insee.rmes.bauhaus.sesame.gestion.repository = bauhaus fr.insee.rmes.bauhaus.sesame.gestion.baseURI = http://bauhaus/ # Bdd Sesame de publication -fr.insee.rmes.bauhaus.sesame.publication.sesameServer = **** +fr.insee.rmes.bauhaus.sesame.publication.sesameServer = http://dvrmesrdfglas01:8080/openrdf-sesame fr.insee.rmes.bauhaus.sesame.publication.repository = publication fr.insee.rmes.bauhaus.sesame.publication.baseURI = http://id.insee.fr/ +# Bdd Sesame de publication interne +fr.insee.rmes.bauhaus.sesame.publication.interne.sesameServer = http://dvrmesrdfglas01:8080/openrdf-sesame +fr.insee.rmes.bauhaus.sesame.publication.interne.repository = publicationInterne + + # Metadata-API - DDI -fr.insee.rmes.bauhaus.metadata.api.baseURI = **** +fr.insee.rmes.bauhaus.metadata.api.baseURI = https://dvrmspogbolht01.ad.insee.intra/ddi-access-services # Annuaire -fr.insee.rmes.bauhaus.ldap.url = **** +#fr.insee.rmes.bauhaus.ldap.url = SECRET +fr.insee.rmes.bauhaus.ldap.url = SECRET # SPOC -fr.insee.rmes.bauhaus.spoc.url = **** -fr.insee.rmes.bauhaus.spoc.user = **** -fr.insee.rmes.bauhaus.spoc.password = **** +fr.insee.rmes.bauhaus.spoc.url = SECRET +fr.insee.rmes.bauhaus.spoc.user = BASPOC +fr.insee.rmes.bauhaus.spoc.password = SECRET # IGESA -fr.insee.rmes.bauhaus.igesa.url = **** -fr.insee.rmes.bauhaus.igesa.id = **** -fr.insee.rmes.bauhaus.igesa.user = **** -fr.insee.rmes.bauhaus.igesa.password = **** +fr.insee.rmes.bauhaus.igesa.url = SECRET +fr.insee.rmes.bauhaus.igesa.id = RMESGNCS +fr.insee.rmes.bauhaus.igesa.user = RMESGNCS +fr.insee.rmes.bauhaus.igesa.password = SECRET # Broker -fr.insee.rmes.bauhaus.broker.url = **** -fr.insee.rmes.bauhaus.broker.user = **** -fr.insee.rmes.bauhaus.broker.password = **** +fr.insee.rmes.bauhaus.broker.url = SECRET +fr.insee.rmes.bauhaus.broker.user = admin +fr.insee.rmes.bauhaus.broker.password = SECRET # Swagger -fr.insee.rmes.bauhaus.api.host= **** -fr.insee.rmes.bauhaus.api.basepath= **** +fr.insee.rmes.bauhaus.api.host = SECRET +fr.insee.rmes.bauhaus.api.basepath= Bauhaus-Back-Office/api # Stockage -fr.insee.rmes.bauhaus.storage.document = **** \ No newline at end of file +fr.insee.rmes.bauhaus.storage.document = /tmp \ No newline at end of file From 495eb4054436f28d21c17ec5369fa18bbd7ce0c2 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Tue, 22 Dec 2020 13:57:15 +0100 Subject: [PATCH 051/243] feat: add sims to a document --- .../documentations/documents/DocumentsUtils.java | 2 +- .../operations/documentations/DocumentsQueries.java | 11 ++++++++++- .../documentations/documents/getSimsByDocument.ftlh | 12 ++++++++++++ 3 files changed, 23 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/request/operations/documentations/documents/getSimsByDocument.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index 03ac092e4..cfed8e3eb 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -264,7 +264,7 @@ public JSONObject getDocument(String id, boolean isLink) throws RmesException { if (jsonDocs.has(Constants.UPDATED_DATE)) { jsonDocs.put(Constants.UPDATED_DATE, DateUtils.getDate(jsonDocs.getString(Constants.UPDATED_DATE))); } - + jsonDocs.put("sims", repoGestion.getResponseAsArray(DocumentsQueries.getSimsByDocument(id))); return jsonDocs; } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java index 4359a2311..b6d431631 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java @@ -42,6 +42,14 @@ public static String getDocumentQuery(String id, boolean isLink) throws RmesExce return getDocuments(id,"","", isLink, "") ; } + public static String getSimsByDocument(String id) throws RmesException { + Map params = new HashMap<>(); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); + params.put("ID", Config.DOCUMENTS_BASE_URI + "/" + id); + return buildRequest("getSimsByDocument.ftlh", params); + } + public static String getAllDocumentsQuery() throws RmesException { return getDocuments("","","", null, "") ; } @@ -107,5 +115,6 @@ private DocumentsQueries() { throw new IllegalStateException("Utility class"); } - + + } diff --git a/src/main/resources/request/operations/documentations/documents/getSimsByDocument.ftlh b/src/main/resources/request/operations/documentations/documents/getSimsByDocument.ftlh new file mode 100644 index 000000000..f4a58a70a --- /dev/null +++ b/src/main/resources/request/operations/documentations/documents/getSimsByDocument.ftlh @@ -0,0 +1,12 @@ +select ?id ?labelLg1 ?labelLg2 +where { + ?simsValue insee:additionalMaterial ?document . + FILTER (regex(str(?document), '${ID}$','i')) + ?simsRubric ?p ?simsValue . + ?simsRubric sdmx-mm:metadataReport ?sims . + ?sims rdfs:label ?labelLg1 . + FILTER (lang(?labelLg1) = '${LG1}') . + ?sims rdfs:label ?labelLg2 . + FILTER (lang(?labelLg2) = '${LG2}') . + BIND(STRAFTER(STR(?sims),'/qualite/rapport/') AS ?id) . +} From 31ccc46d52f42b325a45f6e72a2dc0cdd444b97a Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 30 Dec 2020 20:58:25 +0100 Subject: [PATCH 052/243] Improve Sims Export --- .../bauhaus_services/OperationsService.java | 2 + .../operations/OperationsImpl.java | 14 ++ .../documentations/DocumentationExport.java | 39 +++- .../documentations/DocumentationsUtils.java | 4 + .../rmes/webservice/OperationsResources.java | 9 + src/main/resources/testXML.xml | 55 +++--- .../xslTransformerFiles/convertRichText.xsl | 74 +++++++ .../convertXhtmlToFodt.xsl | 55 +++--- .../xslTransformerFiles/testXSLT.xsl | 180 +++++++++++++++--- 9 files changed, 349 insertions(+), 83 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/convertRichText.xsl diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index e0d88fbc6..347fb9edb 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -138,6 +138,8 @@ public interface OperationsService { Response exportMetadataReport(String id) throws RmesException; + Response exportTestMetadataReport() throws RmesException; + String getMetadataReportOwner(String id) throws RmesException; String getMSDJson() throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 9562ff32a..8050cdbcf 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -415,6 +415,20 @@ public Response exportMetadataReport(String id) throws RmesException { return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); } + @Override + public Response exportTestMetadataReport() throws RmesException { + File output; + InputStream is; + try { + output = documentationsUtils.exportTestMetadataReport(); + is = new FileInputStream(output); + } catch (Exception e1) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); + } + String fileName = output.getName(); + ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); + return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); + } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 4682b4717..348053d29 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -89,13 +89,14 @@ public File transfoTest(InputStream inputFile) throws Exception { return output; } - public File convertXhtmlToFodt(InputStream inputFile) throws IOException { + public File convertRichText(InputStream inputFile) throws IOException { File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); output.deleteOnExit(); OutputStream osOutputFile = FileUtils.openOutputStream(output); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertXhtmlToFodt.xsl"); + //InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertXhtmlToFodt.xsl"); + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertRichText.xsl"); PrintStream printStream= null; @@ -116,6 +117,36 @@ public File convertXhtmlToFodt(InputStream inputFile) throws IOException { return output; } + public File testExport() throws IOException { + + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); + output.deleteOnExit(); + + OutputStream osOutputFile = FileUtils.openOutputStream(output); + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertRichText.xsl"); + + PrintStream printStream= null; + + InputStream inputFile = getClass().getResourceAsStream("/testXML.xml"); + try{ + printStream = new PrintStream(osOutputFile); + StreamSource xsrc = new StreamSource(xslFile); + TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); + transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); + xsltTransformer.transform(new StreamSource(inputFile), new StreamResult(printStream)); + } catch (TransformerException e) { + logger.error(e.getMessage()); + } finally { + inputFile.close(); + osOutputFile.close(); + printStream.close(); + } + return output; + } + + + public File export(InputStream inputFile, String absolutePath, String accessoryAbsolutePath, String organizationsAbsolutePath, String codeListAbsolutePath, String targetType) throws RmesException, IOException { @@ -173,8 +204,8 @@ public File export(InputStream inputFile, printStream.close(); } logger.debug("End To export documentation"); - //return output; - return convertXhtmlToFodt(new FileInputStream(outputIntermediate)); +// return convertRichText(new FileInputStream(outputIntermediate)); + return(outputIntermediate); } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 2dd883738..5ea9fa4f2 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -526,6 +526,10 @@ public String getDocumentationOwnersByIdSims(String idSims) throws RmesException } return stamps; } + + public File exportTestMetadataReport() throws IOException, RmesException { + return docExport.testExport(); + } public File exportMetadataReport(String id) throws IOException, RmesException { diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 1c57448c8..ac8d527bc 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -780,7 +780,16 @@ public Response getSimsExport(@Parameter( return operationsService.exportMetadataReport(id); } + @GET + @Path("/metadataReport/testExport") + @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") + public Response getTestSimsExport() throws RmesException { + return operationsService.exportTestMetadataReport(); + } + + private Response returnRmesException(RmesException e) { logger.error(e.getMessage(), e); return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); diff --git a/src/main/resources/testXML.xml b/src/main/resources/testXML.xml index 594ba32b3..b472d5b31 100644 --- a/src/main/resources/testXML.xml +++ b/src/main/resources/testXML.xml @@ -1,27 +1,30 @@ - - - CD - 12.95 - 19.1234 - 2008-03-01 - - - DVD - 19.95 - 19.4321 - 2008-03-02 - - - Clothes - 99.95 - 18.5678 - 2008-03-03 - - - Book - 9.49 - 18.9876 - 2008-03-04 - - \ No newline at end of file + + Ceci est un
    texte
très riche
+ + + CD + 12.95 + 19.1234 + 2008-03-01 + + + DVD + 19.95 + 19.4321 + 2008-03-02 + + + Clothes + 99.95 + 18.5678 + 2008-03-03 + + + Book + 9.49 + 18.9876 + 2008-03-04 + + + \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/convertRichText.xsl b/src/main/resources/xslTransformerFiles/convertRichText.xsl new file mode 100644 index 000000000..cf884710d --- /dev/null +++ b/src/main/resources/xslTransformerFiles/convertRichText.xsl @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/xslTransformerFiles/convertXhtmlToFodt.xsl b/src/main/resources/xslTransformerFiles/convertXhtmlToFodt.xsl index a6fce85e1..aa4881f50 100644 --- a/src/main/resources/xslTransformerFiles/convertXhtmlToFodt.xsl +++ b/src/main/resources/xslTransformerFiles/convertXhtmlToFodt.xsl @@ -1,44 +1,45 @@ - - - - - - + + + + + + - - - + + + - - coucou richtext - - - + + + + + coucou richtext + + + - coucou html + coucou html - + - coucou html:p + coucou html:p @@ -53,9 +54,9 @@ - + - coucou p + coucou p @@ -70,10 +71,10 @@ - - - - + + + + \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/testXSLT.xsl b/src/main/resources/xslTransformerFiles/testXSLT.xsl index e2e30e6ed..a89140d56 100644 --- a/src/main/resources/xslTransformerFiles/testXSLT.xsl +++ b/src/main/resources/xslTransformerFiles/testXSLT.xsl @@ -173,8 +173,6 @@ - - + + + + + + @@ -284,7 +293,7 @@ + select="upper-case(($rootVar/Documentation/rubrics/rubrics[idAttribute = $mas]/rangeType)[1])" /> @@ -314,16 +323,11 @@ - - - - - @@ -374,13 +378,15 @@ = $mas]/codeList)" /> - - - - - + + + + + + + -
+ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From cf620feff0eeaa7009a09e8479d8b631a8b8d958 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Sun, 3 Jan 2021 14:51:28 +0100 Subject: [PATCH 053/243] feat: detail view for a structure --- .../bauhaus_services/CodeListService.java | 3 + .../code_list/CodeListServiceImpl.java | 5 ++ .../operations/OperationsImpl.java | 5 +- .../structures/impl/StructureImpl.java | 77 ++++++++++++++++++- .../utils/StructureComponentUtils.java | 7 +- .../structures/utils/StructureUtils.java | 7 +- .../code_list/CodeListQueries.java | 8 ++ .../structures/StructureQueries.java | 3 +- .../rmes/webservice/OperationsResources.java | 4 +- .../request/codes-list/getCodeListByIRI.ftlh | 10 +++ .../checkUnicityMutualizedComponent.ftlh | 3 +- .../getComponentsForAStructure.ftlh | 14 +++- .../structures/utils/StructureUtilsTest.java | 4 +- 13 files changed, 132 insertions(+), 18 deletions(-) create mode 100644 src/main/resources/request/codes-list/getCodeListByIRI.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/CodeListService.java b/src/main/java/fr/insee/rmes/bauhaus_services/CodeListService.java index c0be019a8..bd7c3b763 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/CodeListService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/CodeListService.java @@ -12,4 +12,7 @@ public interface CodeListService { String getCodeUri(String notationCodeList, String notationCode) throws RmesException; String getAllCodesLists() throws RmesException; + + String geCodesListByIRI(String IRI) throws RmesException; + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java index f404a5d7e..9d41dc854 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListServiceImpl.java @@ -77,5 +77,10 @@ public String getAllCodesLists() throws RmesException { return repoGestion.getResponseAsArray(CodeListQueries.getAllCodesLists()).toString(); } + @Override + public String geCodesListByIRI(String IRI) throws RmesException { + return repoGestion.getResponseAsArray(CodeListQueries.geCodesListByIRI(IRI)).toString(); + } + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index a41596b8b..b4de63bee 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -8,6 +8,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import fr.insee.rmes.bauhaus_services.Constants; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -107,8 +108,8 @@ public String getSeriesForSearch() throws RmesException { @Override public String getSeriesWithSims() throws RmesException { logger.info("Starting to get series list with sims"); - String resQuery = repoGestion.getResponseAsArray(SeriesQueries.seriesWithSimsQuery()).toString(); - return QueryUtils.correctEmptyGroupConcat(resQuery); + JSONArray seriesArray = repoGestion.getResponseAsArray(SeriesQueries.seriesWithSimsQuery()); + return QueryUtils.correctEmptyGroupConcat(seriesArray.toString()); } @Override diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java index 114e1a3c9..dad1381db 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java @@ -1,5 +1,9 @@ package fr.insee.rmes.bauhaus_services.structures.impl; +import fr.insee.rmes.bauhaus_services.CodeListService; +import fr.insee.rmes.bauhaus_services.concepts.concepts.ConceptsUtils; +import fr.insee.rmes.persistance.ontologies.QB; +import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.json.JSONArray; @@ -20,7 +24,10 @@ public class StructureImpl extends RdfService implements StructureService { @Autowired StructureUtils structureUtils; - + + @Autowired + CodeListService codeListService; + @Override public String getStructures() throws RmesException { logger.info("Starting to get structures"); @@ -41,10 +48,76 @@ public String getStructureById(String id) throws RmesException { return structureUtils.formatStructure(structure, id).toString(); } + private void removeEmptyAttachment(JSONObject cd){ + if(((JSONArray) cd.get("attachment")).length() == 0){ + cd.remove("attachment"); + } + } @Override public String getStructureByIdWithDetails(String id) throws RmesException { logger.info("Starting to get all details of a structure"); - return this.getStructureById(id); + JSONObject structure = repoGestion.getResponseAsObject(StructureQueries.getStructureById(id)); + JSONObject structureWithComponentSpecifications = structureUtils.formatStructure(structure, id); + JSONArray componentDefinitions = (JSONArray) structureWithComponentSpecifications.get("componentDefinitions"); + componentDefinitions.forEach(o -> { + JSONObject cd = (JSONObject) o; + removeEmptyAttachment((JSONObject) o); + cd.remove("id"); + cd.remove("created"); + cd.remove("modified"); + + JSONObject component = (JSONObject) cd.get("component"); + + // We first have to rename the type property + String type = (String) component.get("type"); + if(type.equalsIgnoreCase(QB.ATTRIBUTE_PROPERTY.toString())){ + component.put("type", "attribute"); + } + if(type.equalsIgnoreCase(QB.MEASURE_PROPERTY.toString())){ + component.put("type", "measure"); + } + if(type.equalsIgnoreCase(QB.DIMENSION_PROPERTY.toString())){ + component.put("type", "dimension"); + } + + // If the codelist is defined, we have to remove the range property and fetch the codes list + if(!component.isNull("codeList")){ + component.remove("range"); + + JSONObject codeList = new JSONObject(); + codeList.put("id", component.getString("codeList")); + try { + codeList.put("codes", new JSONArray(this.codeListService.geCodesListByIRI(component.getString("codeList")))); + } catch (RmesException e) { + logger.error("Cannot fetch code list of the structure " + id); + logger.error(e); + } + + component.put("codeList", codeList); + } + + if(!component.isNull("concept")){ + try { + JSONObject concept = repoGestion.getResponseAsObject(ConceptsQueries.conceptQuery(component.getString("concept"))); + JSONObject structureConcept = new JSONObject(); + structureConcept.put("id", component.getString("concept")); + if(!concept.isNull("prefLabelLg1")){ + structureConcept.put("labelLg1", concept.getString("prefLabelLg1")); + } + if(!concept.isNull("prefLabelLg2")){ + structureConcept.put("labelLg2", concept.getString("prefLabelLg2")); + } + component.put("concept", structureConcept); + } catch (RmesException e) { + logger.error("Cannot fetch concept of the structure " + id); + logger.error(e); + } + + } + + }); + + return structureWithComponentSpecifications.toString(); } /** diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 9a8cddbdb..d08b74c7c 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -7,6 +7,7 @@ import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesUnauthorizedException; +import fr.insee.rmes.model.dissemination_status.DisseminationStatus; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -111,7 +112,7 @@ public String createComponent(MutualizedComponent component, String id) throws R String currentDate = DateUtils.getCurrentDate(); component.setCreated(currentDate); component.setUpdated(currentDate); - + component.setDisseminationStatus(DisseminationStatus.PUBLIC_GENERIC.getUrl()); createRDFForComponent(component, ValidationStatus.UNPUBLISHED); return id; } @@ -121,7 +122,7 @@ private void createRDFForComponent(MutualizedComponent component, ValidationStat if(StringUtils.isNotEmpty(component.getConcept()) && StringUtils.isNotEmpty(component.getCodeList())){ - Boolean componentsWithSameCodelistAndConcept = repoGestion.getResponseAsBoolean(StructureQueries.checkUnicityMutualizedComponent(component.getId(), component.getConcept(), component.getCodeList())); + Boolean componentsWithSameCodelistAndConcept = repoGestion.getResponseAsBoolean(StructureQueries.checkUnicityMutualizedComponent(component.getId(), component.getConcept(), component.getCodeList(), component.getType())); if(componentsWithSameCodelistAndConcept){ throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_UNICITY, @@ -129,9 +130,7 @@ private void createRDFForComponent(MutualizedComponent component, ValidationStat } } - String type = component.getType(); - if (type.equals(QB.ATTRIBUTE_PROPERTY.toString())) { createRDFForComponent(component, QB.ATTRIBUTE_PROPERTY, RdfUtils.structureComponentAttributeIRI(component.getId()), status); } else if (type.equals(QB.MEASURE_PROPERTY.toString())) { diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 5d079da24..50ee92dd6 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -8,6 +8,7 @@ import javax.ws.rs.BadRequestException; import fr.insee.rmes.model.ValidationStatus; +import fr.insee.rmes.model.dissemination_status.DisseminationStatus; import fr.insee.rmes.persistance.ontologies.INSEE; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -132,7 +133,7 @@ public String setStructure(String body) throws RmesException { validateStructure(structure); structure.setCreated(DateUtils.getCurrentDate()); structure.setUpdated(DateUtils.getCurrentDate()); - + structure.setDisseminationStatus(DisseminationStatus.PUBLIC_GENERIC.getUrl()); String id = generateNextId(); structure.setId(id); createRdfStructure(structure, ValidationStatus.UNPUBLISHED); @@ -213,12 +214,12 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru RdfUtils.addTripleString(structureIri, DCTERMS.CONTRIBUTOR, structure.getContributor(), model, graph); RdfUtils.addTripleUri(structureIri, INSEE.DISSEMINATIONSTATUS, structure.getDisseminationStatus(), model, graph); - createRdfComponentSpecifications(structureIri, structure.getComponentDefinitions(), model, graph); + createRdfComponentSpecifications(structure, structureIri, structure.getComponentDefinitions(), model, graph); repoGestion.loadSimpleObject(structureIri, model, null); } - public void createRdfComponentSpecifications(IRI structureIRI, List componentList, Model model, Resource graph) throws RmesException { + public void createRdfComponentSpecifications(Structure structure, IRI structureIRI, List componentList, Model model, Resource graph) throws RmesException { int nextID = getNextComponentSpecificationID(); for (int i = 0; i < componentList.size(); i++) { ComponentDefinition componentDefinition = componentList.get(i); diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java index a8a7c6048..072ab11df 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java @@ -79,4 +79,12 @@ public static String getCodeListNotationByUri(String uri) { + " }}"; } + public static String geCodesListByIRI(String id) throws RmesException { + HashMap params = new HashMap<>(); + params.put("CODES_LISTS_GRAPH", Config.CODELIST_GRAPH); + params.put("CODE_LIST", id); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); + return FreeMarkerUtils.buildRequest("codes-list/", "getCodeListByIRI.ftlh", params); + } } \ No newline at end of file diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java index 70dcdd328..bcd22686e 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java @@ -32,13 +32,14 @@ public static String getStructureById(String structureId) throws RmesException { return buildRequest("getStructure.ftlh", params); } - public static String checkUnicityMutualizedComponent(String componentId, String conceptUri, String codeListUri) throws RmesException { + public static String checkUnicityMutualizedComponent(String componentId, String conceptUri, String codeListUri, String type) throws RmesException { HashMap params = initParams(); params.put("COMPONENT_ID", componentId); params.put("CONCEPT_URI", INSEE.STRUCTURE_CONCEPT + conceptUri); params.put("CODE_LIST_URI", codeListUri); params.put("CODES_LISTS_GRAPH", Config.CODELIST_GRAPH); params.put("CONCEPT_GRAPH", Config.CONCEPTS_GRAPH); + params.put("TYPE", type); return buildRequest("checkUnicityMutualizedComponent.ftlh", params); } diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 7df1d1d97..ded919f32 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -744,9 +744,7 @@ public Response setMetadataReportById( @Consumes(MediaType.APPLICATION_JSON) @io.swagger.v3.oas.annotations.Operation(operationId = "deleteMetadataReportById", summary = "Delete metadata report") public Response deleteMetadataReportById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Report to delete", required = true, - content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { + @PathParam(Constants.ID) String id) { Status result=Status.NO_CONTENT; try { result = operationsService.deleteMetadataReport(id); diff --git a/src/main/resources/request/codes-list/getCodeListByIRI.ftlh b/src/main/resources/request/codes-list/getCodeListByIRI.ftlh new file mode 100644 index 000000000..553905294 --- /dev/null +++ b/src/main/resources/request/codes-list/getCodeListByIRI.ftlh @@ -0,0 +1,10 @@ +SELECT ?code ?labelLg1 ?labelLg2 +FROM <${CODES_LISTS_GRAPH}> +WHERE { +?codeList skos:inScheme <${CODE_LIST}> . +?codeList skos:notation ?code . +?codeList skos:prefLabel ?labelLg1 . +FILTER (lang(?labelLg1) = '${LG1}') +OPTIONAL {?codeList skos:prefLabel ?labelLg2 . +FILTER (lang(?labelLg2) = '${LG2}') } . +} \ No newline at end of file diff --git a/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh b/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh index daa69ee31..06ef994c5 100644 --- a/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/checkUnicityMutualizedComponent.ftlh @@ -4,7 +4,8 @@ FROM <${CODES_LISTS_GRAPH}> FROM <${CONCEPT_GRAPH}> WHERE { ?component qb:concept <${CONCEPT_URI}> ; - qb:codeList <${CODE_LIST_URI}> . + qb:codeList <${CODE_LIST_URI}> ; + rdf:type <${TYPE}> . FILTER NOT EXISTS { ?component dcterms:identifier '${COMPONENT_ID}' . } diff --git a/src/main/resources/request/structures/getComponentsForAStructure.ftlh b/src/main/resources/request/structures/getComponentsForAStructure.ftlh index 6b2c12b01..51d8b2f3f 100644 --- a/src/main/resources/request/structures/getComponentsForAStructure.ftlh +++ b/src/main/resources/request/structures/getComponentsForAStructure.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?componentDefinitionId ?componentDefinitionCreated ?componentDefinitionModified ?id ?identifiant ?labelLg1 ?labelLg2 ?type ?concept ?codeList ?range ?descriptionLg1 ?descriptionLg2 ?validationState ?order ?created ?modified ?required +SELECT DISTINCT ?componentDefinitionId ?componentDefinitionCreated ?componentDefinitionModified ?id ?identifiant ?labelLg1 ?labelLg2 ?type ?concept ?codeList ?range ?descriptionLg1 ?descriptionLg2 ?validationState ?order ?created ?modified ?required ?creator ?contributor ?disseminationStatus FROM <${STRUCTURES_COMPONENTS_GRAPH}> FROM <${STRUCTURES_GRAPH}> WHERE { @@ -37,6 +37,18 @@ WHERE { ?component dcterms:modified ?modified } . + OPTIONAL { + ?component dc:creator ?creator . + } . + + OPTIONAL { + ?component dcterms:contributor ?contributor . + } . + + OPTIONAL { + ?component insee:disseminationStatus ?disseminationStatus . + } . + OPTIONAL { ?component qb:concept ?conceptObject } . diff --git a/src/test/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtilsTest.java b/src/test/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtilsTest.java index c7a17db77..7ed4bf49e 100644 --- a/src/test/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtilsTest.java +++ b/src/test/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtilsTest.java @@ -9,6 +9,7 @@ import java.util.ArrayList; import java.util.List; +import fr.insee.rmes.model.structures.Structure; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; @@ -47,6 +48,7 @@ void shouldCallCreateComponentSpecificationForEachComponents() throws RmesExcept Model model = new LinkedHashModel(); IRI structureIRI = SimpleValueFactory.getInstance().createIRI("http://structure"); + Structure structure = new Structure(); List components = new ArrayList<>(); @@ -65,7 +67,7 @@ void shouldCallCreateComponentSpecificationForEachComponents() throws RmesExcept doNothing().when(structureUtils).createRdfComponentSpecification(any(), any(), any(), any()); - structureUtils.createRdfComponentSpecifications(structureIRI, components, model, graph); + structureUtils.createRdfComponentSpecifications(structure, structureIRI, components, model, graph); verify(structureUtils, times(2)).createRdfComponentSpecification(any(), any(), any(), any()); } From b964e8e614d6dc5f84782324061dcfb30c41463c Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 4 Jan 2021 09:58:13 +0100 Subject: [PATCH 054/243] Secure sims deletion --- src/main/java/fr/insee/rmes/webservice/OperationsResources.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 949ac791e..9e3de14b4 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -738,7 +738,7 @@ public Response setMetadataReportById( * @param id * @return */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR, Roles.SPRING_CNIS }) + @Secured({ Roles.SPRING_ADMIN }) @DELETE @Path("/metadataReport/delete/{id}") @Consumes(MediaType.APPLICATION_JSON) From 62c5adc43cc73706cbdd2af306ac8e9a893e6c82 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 4 Jan 2021 19:44:24 +0100 Subject: [PATCH 055/243] Update DocumentationExport.java --- .../operations/documentations/DocumentationExport.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 348053d29..d5c6b124d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -164,12 +164,12 @@ public File export(InputStream inputFile, File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); output.deleteOnExit(); - File outputIntermediate = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("XML")); - outputIntermediate.deleteOnExit(); +// File outputIntermediate = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("XML")); +// outputIntermediate.deleteOnExit(); InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/testXSLT.xsl"); - // OutputStream osOutputFile = FileUtils.openOutputStream(output); - OutputStream osOutputFile = FileUtils.openOutputStream(outputIntermediate); + // OutputStream osOutputFile = FileUtils.openOutputStream(outputIntermediate); + OutputStream osOutputFile = FileUtils.openOutputStream(output); PrintStream printStream= null; @@ -205,7 +205,7 @@ public File export(InputStream inputFile, } logger.debug("End To export documentation"); // return convertRichText(new FileInputStream(outputIntermediate)); - return(outputIntermediate); + return(output); } } From 7ecbf1d30af8adf6ca499908ad094bfe79bab1c2 Mon Sep 17 00:00:00 2001 From: Alice Lambois <35219063+alicela@users.noreply.github.com> Date: Tue, 5 Jan 2021 08:50:07 +0100 Subject: [PATCH 056/243] Update bauhaus-dev.properties --- src/main/resources/bauhaus-dev.properties | 26 +++++++++++------------ 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/main/resources/bauhaus-dev.properties b/src/main/resources/bauhaus-dev.properties index 414847b20..bfadfcd6f 100644 --- a/src/main/resources/bauhaus-dev.properties +++ b/src/main/resources/bauhaus-dev.properties @@ -11,23 +11,23 @@ fr.insee.rmes.bauhaus.force.ssl = false fr.insee.rmes.bauhaus.log.configuration = log4j2.xml # Bdd Sesame de gestion -fr.insee.rmes.bauhaus.sesame.gestion.sesameServer = http://linked-open-statistics.org:7200 -fr.insee.rmes.bauhaus.sesame.gestion.repository = bauhaus +fr.insee.rmes.bauhaus.sesame.gestion.sesameServer = XXX +fr.insee.rmes.bauhaus.sesame.gestion.repository = XXX fr.insee.rmes.bauhaus.sesame.gestion.baseURI = http://bauhaus/ # Bdd Sesame de publication -fr.insee.rmes.bauhaus.sesame.publication.sesameServer = http://dvrmesrdfglas01:8080/openrdf-sesame -fr.insee.rmes.bauhaus.sesame.publication.repository = publication +fr.insee.rmes.bauhaus.sesame.publication.sesameServer = XXX +fr.insee.rmes.bauhaus.sesame.publication.repository = XXX fr.insee.rmes.bauhaus.sesame.publication.baseURI = http://id.insee.fr/ # Bdd Sesame de publication interne -fr.insee.rmes.bauhaus.sesame.publication.interne.sesameServer = http://dvrmesrdfglas01:8080/openrdf-sesame -fr.insee.rmes.bauhaus.sesame.publication.interne.repository = publicationInterne +fr.insee.rmes.bauhaus.sesame.publication.interne.sesameServer = XXX +fr.insee.rmes.bauhaus.sesame.publication.interne.repository = XXX # Metadata-API - DDI -fr.insee.rmes.bauhaus.metadata.api.baseURI = https://dvrmspogbolht01.ad.insee.intra/ddi-access-services +fr.insee.rmes.bauhaus.metadata.api.baseURI = XXX # Annuaire #fr.insee.rmes.bauhaus.ldap.url = SECRET @@ -35,23 +35,23 @@ fr.insee.rmes.bauhaus.ldap.url = SECRET # SPOC fr.insee.rmes.bauhaus.spoc.url = SECRET -fr.insee.rmes.bauhaus.spoc.user = BASPOC +fr.insee.rmes.bauhaus.spoc.user = XXX fr.insee.rmes.bauhaus.spoc.password = SECRET # IGESA fr.insee.rmes.bauhaus.igesa.url = SECRET -fr.insee.rmes.bauhaus.igesa.id = RMESGNCS -fr.insee.rmes.bauhaus.igesa.user = RMESGNCS +fr.insee.rmes.bauhaus.igesa.id = XXX +fr.insee.rmes.bauhaus.igesa.user = XXX fr.insee.rmes.bauhaus.igesa.password = SECRET # Broker fr.insee.rmes.bauhaus.broker.url = SECRET -fr.insee.rmes.bauhaus.broker.user = admin +fr.insee.rmes.bauhaus.broker.user = XXX fr.insee.rmes.bauhaus.broker.password = SECRET # Swagger fr.insee.rmes.bauhaus.api.host = SECRET -fr.insee.rmes.bauhaus.api.basepath= Bauhaus-Back-Office/api +fr.insee.rmes.bauhaus.api.basepath= XXX # Stockage -fr.insee.rmes.bauhaus.storage.document = /tmp \ No newline at end of file +fr.insee.rmes.bauhaus.storage.document = /tmp From 8ce6bf5285d9aa29c3cb9dd1a399690ed74f126b Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Wed, 6 Jan 2021 09:25:16 +0100 Subject: [PATCH 057/243] fix: display rubric using a document --- .../operations/documentations/documents/getSimsByDocument.ftlh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/resources/request/operations/documentations/documents/getSimsByDocument.ftlh b/src/main/resources/request/operations/documentations/documents/getSimsByDocument.ftlh index f4a58a70a..c1343e714 100644 --- a/src/main/resources/request/operations/documentations/documents/getSimsByDocument.ftlh +++ b/src/main/resources/request/operations/documentations/documents/getSimsByDocument.ftlh @@ -1,4 +1,4 @@ -select ?id ?labelLg1 ?labelLg2 +select ?id ?labelLg1 ?labelLg2 ?simsRubricId where { ?simsValue insee:additionalMaterial ?document . FILTER (regex(str(?document), '${ID}$','i')) @@ -9,4 +9,5 @@ where { ?sims rdfs:label ?labelLg2 . FILTER (lang(?labelLg2) = '${LG2}') . BIND(STRAFTER(STR(?sims),'/qualite/rapport/') AS ?id) . + BIND(REPLACE( STR(?simsRubric) , '(.*/)(\\w.+$)', '$2' ) AS ?simsRubricId) . } From 56f526ddf8709f9e778bb6ed6c0b77b32a96dbf1 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Thu, 7 Jan 2021 16:15:29 +0100 Subject: [PATCH 058/243] Improve sims export --- .../documentations/DocumentationExport.java | 2 + .../xslTransformerFiles/testXSLT.xsl | 257 ++++++++++++++++-- 2 files changed, 233 insertions(+), 26 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index d5c6b124d..4685cc7d1 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -162,8 +162,10 @@ public File export(InputStream inputFile, String msdPath = msdFile.getAbsolutePath(); File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); + //File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("application/vnd.oasis.opendocument.text")); output.deleteOnExit(); + // File outputIntermediate = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("XML")); // outputIntermediate.deleteOnExit(); diff --git a/src/main/resources/xslTransformerFiles/testXSLT.xsl b/src/main/resources/xslTransformerFiles/testXSLT.xsl index a89140d56..034ec5b93 100644 --- a/src/main/resources/xslTransformerFiles/testXSLT.xsl +++ b/src/main/resources/xslTransformerFiles/testXSLT.xsl @@ -145,6 +145,75 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - + + + + - - - - - - - - - - - - - - - - - - + + + + @@ -1106,6 +1158,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + @@ -1177,6 +1358,9 @@ + + ' + @@ -1200,13 +1384,34 @@ select="concat('<' , 'text:line-break/', '>')" /> - + + + + + + + + + + + + + + + + + + + + + + From 5e39a2f5249ccfe8653abc04e115c31f92353f6c Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Wed, 13 Jan 2021 09:54:55 +0100 Subject: [PATCH 059/243] fix: solve issue with structures --- .../structures/impl/StructureImpl.java | 12 ++---------- .../structures/utils/StructureComponentUtils.java | 2 +- .../structures/utils/StructureUtils.java | 4 ++-- .../sparql_queries/concepts/ConceptsQueries.java | 9 +++++++++ .../concepts/conceptQueryForDetailStructure.ftlh | 12 ++++++++++++ .../structures/getComponentsForAStructure.ftlh | 2 +- .../request/structures/getMutualizedComponent.ftlh | 2 +- .../resources/request/structures/getStructure.ftlh | 2 +- 8 files changed, 29 insertions(+), 16 deletions(-) create mode 100644 src/main/resources/request/concepts/conceptQueryForDetailStructure.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java index dad1381db..a36a4b342 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java @@ -98,16 +98,8 @@ public String getStructureByIdWithDetails(String id) throws RmesException { if(!component.isNull("concept")){ try { - JSONObject concept = repoGestion.getResponseAsObject(ConceptsQueries.conceptQuery(component.getString("concept"))); - JSONObject structureConcept = new JSONObject(); - structureConcept.put("id", component.getString("concept")); - if(!concept.isNull("prefLabelLg1")){ - structureConcept.put("labelLg1", concept.getString("prefLabelLg1")); - } - if(!concept.isNull("prefLabelLg2")){ - structureConcept.put("labelLg2", concept.getString("prefLabelLg2")); - } - component.put("concept", structureConcept); + JSONObject concept = repoGestion.getResponseAsObject(ConceptsQueries.conceptQueryForDetailStructure(component.getString("concept"))); + component.put("concept", concept); } catch (RmesException e) { logger.error("Cannot fetch concept of the structure " + id); logger.error(e); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index d08b74c7c..96b9358fc 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -157,7 +157,7 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou model.add(componentURI, DCTERMS.CREATED, RdfUtils.setLiteralDateTime(component.getCreated()), graph); model.add(componentURI, DCTERMS.MODIFIED, RdfUtils.setLiteralDateTime(component.getUpdated()), graph); RdfUtils.addTripleString(componentURI, DC.CREATOR, component.getCreator(), model, graph); - RdfUtils.addTripleString(componentURI, DCTERMS.CONTRIBUTOR, component.getContributor(), model, graph); + RdfUtils.addTripleString(componentURI, DC.CONTRIBUTOR, component.getContributor(), model, graph); RdfUtils.addTripleUri(componentURI, INSEE.DISSEMINATIONSTATUS, component.getDisseminationStatus(), model, graph); RdfUtils.addTripleUri(componentURI, QB.CONCEPT, INSEE.STRUCTURE_CONCEPT + component.getConcept(), model, graph); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 50ee92dd6..075d7f792 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -133,7 +133,7 @@ public String setStructure(String body) throws RmesException { validateStructure(structure); structure.setCreated(DateUtils.getCurrentDate()); structure.setUpdated(DateUtils.getCurrentDate()); - structure.setDisseminationStatus(DisseminationStatus.PUBLIC_GENERIC.getUrl()); + //structure.setDisseminationStatus(DisseminationStatus.PUBLIC_GENERIC.getUrl()); String id = generateNextId(); structure.setId(id); createRdfStructure(structure, ValidationStatus.UNPUBLISHED); @@ -211,7 +211,7 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru RdfUtils.addTripleString(structureIri, DC.DESCRIPTION, structure.getDescriptionLg2(), Config.LG2, model, graph); RdfUtils.addTripleString(structureIri, DC.CREATOR, structure.getCreator(), model, graph); - RdfUtils.addTripleString(structureIri, DCTERMS.CONTRIBUTOR, structure.getContributor(), model, graph); + RdfUtils.addTripleString(structureIri, DC.CONTRIBUTOR, structure.getContributor(), model, graph); RdfUtils.addTripleUri(structureIri, INSEE.DISSEMINATIONSTATUS, structure.getDisseminationStatus(), model, graph); createRdfComponentSpecifications(structure, structureIri, structure.getComponentDefinitions(), model, graph); diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java index 76a89bda5..56a857a78 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java @@ -113,6 +113,15 @@ public static String conceptQuery(String id) { + "ORDER BY DESC(xsd:integer(?conceptVersion)) \n" + "LIMIT 1"; } + + public static String conceptQueryForDetailStructure(String id) throws RmesException { + Map params = new HashMap<>(); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); + params.put("ID", id); + params.put("CONCEPTS_GRAPH", Config.CONCEPTS_GRAPH); + return buildConceptRequest("conceptQueryForDetailStructure.ftlh", params); + } public static String altLabel(String id, String lang) { return "SELECT ?altLabel \n" diff --git a/src/main/resources/request/concepts/conceptQueryForDetailStructure.ftlh b/src/main/resources/request/concepts/conceptQueryForDetailStructure.ftlh new file mode 100644 index 000000000..2594836d7 --- /dev/null +++ b/src/main/resources/request/concepts/conceptQueryForDetailStructure.ftlh @@ -0,0 +1,12 @@ +SELECT ?concept ?labelLg1 ?labelLg2 +WHERE { + GRAPH <${CONCEPTS_GRAPH}> { + ?concept skos:prefLabel ?labelLg1 . + FILTER(REGEX(STR(?concept),'/concepts/definition/${ID}')) . + FILTER (lang(?labelLg1) = '${LG1}') . + OPTIONAL { + ?concept skos:prefLabel ?labelLg2 . + FILTER (lang(?labelLg2) = '${LG2}') + } + } +} diff --git a/src/main/resources/request/structures/getComponentsForAStructure.ftlh b/src/main/resources/request/structures/getComponentsForAStructure.ftlh index 51d8b2f3f..a69514764 100644 --- a/src/main/resources/request/structures/getComponentsForAStructure.ftlh +++ b/src/main/resources/request/structures/getComponentsForAStructure.ftlh @@ -42,7 +42,7 @@ WHERE { } . OPTIONAL { - ?component dcterms:contributor ?contributor . + ?component dc:contributor ?contributor . } . OPTIONAL { diff --git a/src/main/resources/request/structures/getMutualizedComponent.ftlh b/src/main/resources/request/structures/getMutualizedComponent.ftlh index e917ad1de..da51f42fe 100644 --- a/src/main/resources/request/structures/getMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponent.ftlh @@ -11,7 +11,7 @@ WHERE { } . OPTIONAL { - ?component dcterms:contributor ?contributor . + ?component dc:contributor ?contributor . } . OPTIONAL { diff --git a/src/main/resources/request/structures/getStructure.ftlh b/src/main/resources/request/structures/getStructure.ftlh index 02efe4957..e5f7e748c 100644 --- a/src/main/resources/request/structures/getStructure.ftlh +++ b/src/main/resources/request/structures/getStructure.ftlh @@ -21,7 +21,7 @@ WHERE { } . OPTIONAL { - ?structure dcterms:contributor ?contributor . + ?structure dc:contributor ?contributor . } . OPTIONAL { From 829bdb2bb8b979a1a52ac9e7349b8004472cfbf4 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 15 Jan 2021 09:45:05 +0100 Subject: [PATCH 060/243] fix: solve query fetching series --- .../resources/request/operations/series/getSeriesQuery.ftlh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/request/operations/series/getSeriesQuery.ftlh b/src/main/resources/request/operations/series/getSeriesQuery.ftlh index c7ffe4d2a..3ac609bdd 100644 --- a/src/main/resources/request/operations/series/getSeriesQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesQuery.ftlh @@ -9,7 +9,7 @@ SELECT DISTINCT ?id ?label (group_concat(?altLabelLg1;separator=' || ') as ?altL BIND(STRAFTER(STR(?series),'/operations/serie/') AS ?id) . OPTIONAL{ ?series skos:altLabel ?altLabelLg1 . - FILTER (lang(?altLabelLg1) = ' ${LG1}') + FILTER (lang(?altLabelLg1) = '${LG1}') } <#if withSims = "true"> OPTIONAL{ From cefb4fb28d6f83cb3c00cd3541d65d9651a5cf4f Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 15 Jan 2021 17:05:37 +0100 Subject: [PATCH 061/243] fix: check unicity for structure --- .../structures/utils/StructureUtils.java | 25 ++++++++++++++++++- .../fr/insee/rmes/exceptions/ErrorCodes.java | 1 + .../structures/StructureQueries.java | 9 +++++++ .../structures/checkUnicityStructure.ftlh | 25 +++++++++++++++++++ 4 files changed, 59 insertions(+), 1 deletion(-) create mode 100644 src/main/resources/request/structures/checkUnicityStructure.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 075d7f792..a58dea981 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -3,10 +3,14 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; +import java.util.stream.Collectors; import javax.validation.Validation; import javax.ws.rs.BadRequestException; +import fr.insee.rmes.exceptions.ErrorCodes; +import fr.insee.rmes.exceptions.RmesUnauthorizedException; import fr.insee.rmes.model.ValidationStatus; import fr.insee.rmes.model.dissemination_status.DisseminationStatus; import fr.insee.rmes.persistance.ontologies.INSEE; @@ -192,7 +196,25 @@ public void createRdfStructure(Structure structure, ValidationStatus status) thr createRdfStructure(structure, structureId, structureIri, graph, status); } + private void checkUnicityForStructure(Structure structure) throws RmesException { + List componentsWithoutId = structure.getComponentDefinitions().stream().filter((ComponentDefinition cd) -> { + return cd.getComponent().getId() == null; + }).collect(Collectors.toList()); + + if(componentsWithoutId.size() == 0){ + String[] ids = structure.getComponentDefinitions().stream().map(cd -> { + return cd.getComponent().getId(); + }).map(Object::toString).collect(Collectors.toList()).toArray(new String[0]); + Boolean structureWithSameComponents = repoGestion.getResponseAsBoolean(StructureQueries.checkUnicityStructure(structure.getId(), ids)); + if(structureWithSameComponents){ + throw new RmesUnauthorizedException(ErrorCodes.STRUCTURE_UNICITY, + "A structure with the same components already exists", ""); + } + } + } public void createRdfStructure(Structure structure, String structureId, IRI structureIri, Resource graph, ValidationStatus status) throws RmesException { + + Model model = new LinkedHashModel(); model.add(structureIri, RDF.TYPE, QB.DATA_STRUCTURE_DEFINITION, graph); @@ -327,7 +349,8 @@ public IRI getAttributeIRI(String id) { return RdfUtils.structureComponentAttributeIRI(id); } - private void validateStructure(Structure structure) { + private void validateStructure(Structure structure) throws RmesException { + checkUnicityForStructure(structure); if (structure.getId() == null) { throw new BadRequestException("The property identifiant is required"); } diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index 78781feeb..16950923e 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -69,6 +69,7 @@ public class ErrorCodes { public static final int COMPONENT_FORBIDDEN_DELETE = 1001; public static final int COMPONENT_UNICITY = 1002; + public static final int STRUCTURE_UNICITY = 1003; /* * 404 NOTFOUNDEXCEPTIONS diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java index bcd22686e..d4f6294d3 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java @@ -42,6 +42,15 @@ public static String checkUnicityMutualizedComponent(String componentId, String params.put("TYPE", type); return buildRequest("checkUnicityMutualizedComponent.ftlh", params); } + public static String checkUnicityStructure(String structureId, String[] ids) throws RmesException { + HashMap params = initParams(); + + params.put("NB_COMPONENT", ids.length); + params.put("IDS", ids); + params.put("STRUCTURE_ID", structureId); + + return buildRequest("checkUnicityStructure.ftlh", params); + } public static String getComponentsForSearch() throws RmesException { HashMap params = initParams(); diff --git a/src/main/resources/request/structures/checkUnicityStructure.ftlh b/src/main/resources/request/structures/checkUnicityStructure.ftlh new file mode 100644 index 000000000..4fd8983ac --- /dev/null +++ b/src/main/resources/request/structures/checkUnicityStructure.ftlh @@ -0,0 +1,25 @@ +ASK +FROM<${STRUCTURES_COMPONENTS_GRAPH}> +FROM<${STRUCTURES_GRAPH}> +{ + FILTER(?nbComponent = ${NB_COMPONENT} && ?nbShared = ?nbComponent ) + { + SELECT ?dsd (COUNT(?componentSpec) AS ?nbComponent) (COUNT(?id) AS ?nbShared) + { + ?dsd a qb:DataStructureDefinition . + ?dsd qb:component ?componentSpec . + OPTIONAL { + ?componentSpec (qb:attribute | qb:dimension | qb:measure) / dcterms:identifier ?id . + FILTER( +<#list IDS as id> +?id = "${id}" <#sep> + + ) + } + FILTER NOT EXISTS { + ?dsd dcterms:identifier '${STRUCTURE_ID}' . + } + } + GROUP BY ?dsd + } +} \ No newline at end of file From 98bd25a187db4f0a9680795e659e92dee7c3eb93 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 18 Jan 2021 13:37:57 +0100 Subject: [PATCH 062/243] add webservices to get series with a given stamp as creator --- .../rmes/bauhaus_services/Constants.java | 1 + .../bauhaus_services/OperationsService.java | 6 ++ .../operations/OperationsImpl.java | 16 +++++ .../operations/series/SeriesUtils.java | 46 ++++++++++---- .../stamps/StampsRestrictionServiceImpl.java | 9 +-- .../StampsRestrictionsService.java | 2 + .../operations/series/SeriesQueries.java | 27 ++++++++ .../rmes/webservice/OperationsResources.java | 61 ++++++++++++++++--- .../series/getSeriesByCreatorStampQuery.ftlh | 7 +++ .../series/getSeriesCreatorsByUriQuery.ftlh | 2 +- .../series/getSeriesWithStampQuery.ftlh | 19 ++++++ 11 files changed, 168 insertions(+), 28 deletions(-) create mode 100644 src/main/resources/request/operations/series/getSeriesByCreatorStampQuery.ftlh create mode 100644 src/main/resources/request/operations/series/getSeriesWithStampQuery.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 2bbfaa587..5f1d3011b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -79,6 +79,7 @@ public class Constants { public static final String SERIES_UP = "SERIES"; public static final String SERIES = "SERIES"; public static final String SEEALSO = "seeAlso"; + public static final String STAMP = "stamp"; /*T*/ public static final String TEXT_LG1 = "texte"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index d5a20feb4..ccb31e71f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -47,13 +47,18 @@ public interface OperationsService { IdLabelTwoLangs getSeriesLabelByID(String id) throws RmesException; String getSeriesWithSims() throws RmesException; + + String getSeriesWithStamp(String stamp) throws RmesException; void setSeries(String id, String body) throws RmesException; String createSeries(String body) throws RmesException; String setSeriesValidation(String body) throws RmesException; + + String getSeriesForStamp(String stamp) throws RmesException; + String getSeriesIdsForStamp(String stamp) throws RmesException; /****************************************************************************************** * OPERATIONS @@ -148,4 +153,5 @@ public interface OperationsService { String getMetadataReportDefaultValue() throws IOException; Status deleteMetadataReport(String id) throws RmesException; + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index af4ebd58f..828f13eed 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -111,6 +111,13 @@ public String getSeriesWithSims() throws RmesException { return QueryUtils.correctEmptyGroupConcat(resQuery); } + @Override + public String getSeriesWithStamp(String stamp) throws RmesException { + logger.info("Starting to get series list with sims"); + String resQuery = repoGestion.getResponseAsArray(SeriesQueries.seriesWithStampQuery(stamp)).toString(); + return QueryUtils.correctEmptyGroupConcat(resQuery); + } + @Override public Series getSeriesByID(String id) throws RmesException { return seriesUtils.getSeriesById(id); @@ -437,5 +444,14 @@ public Response exportTestMetadataReport() throws RmesException { return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); } + @Override + public String getSeriesForStamp(String stamp) throws RmesException { + return seriesUtils.getSeriesForStamp(stamp); + } + + @Override + public String getSeriesIdsForStamp(String stamp) throws RmesException { + return seriesUtils.getSeriesIdsForStamp(stamp); + } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java index cfe692b38..8633b471d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java @@ -97,7 +97,7 @@ private Series buildSeriesFromJson(JSONObject seriesJson) throws RmesException { } return series; } - + public JSONObject getSeriesJsonById(String id) throws RmesException { JSONObject series = repoGestion.getResponseAsObject(SeriesQueries.oneSeriesQuery(id)); @@ -162,16 +162,16 @@ private void addSeriesLinks(String idSeries, JSONObject series) throws RmesExcep } -/** - * Add to series the link of type "predicate". - * Links can be multiple - * @param id - * @param series - * @param predicate - * @throws RmesException - */ + /** + * Add to series the link of type "predicate". + * Links can be multiple + * @param id + * @param series + * @param predicate + * @throws RmesException + */ private void addOneTypeOfLink(String id, JSONObject series, IRI predicate, String resultType) throws RmesException { - + JSONArray links = repoGestion.getResponseAsArray(SeriesQueries.seriesLinks(id, predicate, resultType)); if (links.length() != 0) { links = QueryUtils.transformRdfTypeInString(links); @@ -287,7 +287,7 @@ private void addOperationLinksOrganization(List data, IRI predic for (OperationsLink d : data) { if (!d.isEmpty()) { RdfUtils.addTripleUri(seriesURI, predicate, - // d.getId(), + // d.getId(), organizationsService.getOrganizationUriById(d.getId()), model, RdfUtils.operationsGraph()); } @@ -407,4 +407,28 @@ public String setSeriesValidation(String id) throws RmesException { return id; } + public String getSeriesForStamp(String stamp) throws RmesException { + JSONArray resQuery = repoGestion.getResponseAsArray(SeriesQueries.getSeriesForSearch()); + JSONArray result = new JSONArray(); + for (int i = 0; i < resQuery.length(); i++) { + JSONObject series = resQuery.getJSONObject(i); + String idSeries = series.get(Constants.ID).toString(); + IRI seriesURI = RdfUtils.objectIRI(ObjectType.SERIES, idSeries); + if(stampsRestrictionsService.isSeriesManager(seriesURI)) { + addSeriesCreators(idSeries, series); + addOneTypeOfLink(idSeries, series, DCTERMS.CONTRIBUTOR, Constants.ORGANIZATIONS); + addOneTypeOfLink(idSeries, series, INSEE.DATA_COLLECTOR, Constants.ORGANIZATIONS); + addOneTypeOfLink(idSeries, series, DCTERMS.PUBLISHER, Constants.ORGANIZATIONS); + famOpeSerIndUtils.fixOrganizationsNames(series); + result.put(series); + } + } + + return QueryUtils.correctEmptyGroupConcat(result.toString()); + } + + public String getSeriesIdsForStamp(String stamp) throws RmesException { + JSONArray resQuery = repoGestion.getResponseAsArray(SeriesQueries.getSeriesIdsForStamp(stamp)); + return (resQuery.toString()); + } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java index fb5295780..9c51f256f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java @@ -190,12 +190,9 @@ private boolean isSeriesManager(List uris) throws RmesException { return true; } - private boolean isSeriesManager(IRI uri) throws RmesException { + public boolean isSeriesManager(IRI uri) throws RmesException { User user = getUser(); - StringBuilder sb = new StringBuilder(); - sb.append("<" + uri.toString() + "> "); - String uriAsString = sb.toString(); - JSONArray managers = repoGestion.getResponseAsArray(SeriesQueries.getCreatorsBySeriesUri(uriAsString)); + JSONArray managers = repoGestion.getResponseAsArray(SeriesQueries.getCreatorsBySeriesUri(uri.toString())); Boolean isSeriesManager = false; for (int i = 0; i < managers.length(); i++) { if (!managers.getJSONObject(i).getString(Constants.CREATORS).equals(user.getStamp())) { @@ -332,7 +329,7 @@ public boolean canModifyConcept(IRI uri) throws RmesException { @Override public boolean canModifySeries(IRI uri) throws RmesException { User user = getUser(); - return (isAdmin(user) || isCnis(user) || (isSeriesManager(uri) && isSeriesContributor(user))); + return ((isSeriesManager(uri) && isSeriesContributor(user)) || isAdmin(user) || isCnis(user) ); } @Override diff --git a/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java b/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java index 621eefb74..79476bf6f 100644 --- a/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java +++ b/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java @@ -29,6 +29,8 @@ public interface StampsRestrictionsService { boolean canValidateSeries(List uris) throws RmesException; + boolean isSeriesManager(IRI uri) throws RmesException; + boolean canCreateConcept() throws RmesException; boolean canModifyConcept(IRI uri) throws RmesException; diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java index e0db58460..e2b1d4761 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java @@ -22,6 +22,7 @@ private SeriesQueries() { private static final String ID_SERIES = "ID_SERIES"; private static final String PRODUCTS_GRAPH = "PRODUCTS_GRAPH"; + private static final String STAMP = "STAMP"; private static final String URI_SERIES = "URI_SERIES"; private static final String ORGANIZATIONS_GRAPH = "ORGANIZATIONS_GRAPH"; private static final String OPERATIONS_GRAPH = "OPERATIONS_GRAPH"; @@ -161,6 +162,18 @@ public static String getCreatorsBySeriesUri(String uriSeries) throws RmesExcepti return buildSeriesRequest("getSeriesCreatorsByUriQuery.ftlh", params); } + /** + * @param stamp + * @return String + * @throws RmesException + */ + public static String getSeriesIdsForStamp(String stamp) throws RmesException { + if (params==null) {initParams();} + params.put(STAMP, stamp); + return buildSeriesRequest("getSeriesByCreatorStampQuery.ftlh", params); + } + + /** * @param idSeries * @return String @@ -222,6 +235,18 @@ public static String seriesWithSimsQuery() throws RmesException { return buildSeriesRequest("getSeriesQuery.ftlh", params); } + /** + * @param stamp + * @return String + * @throws RmesException + */ + public static String seriesWithStampQuery(String stamp) throws RmesException { + if (params==null) {initParams();} + params.put(STAMP, stamp); + return buildSeriesRequest("getSeriesWithStampQuery.ftlh", params); + } + + /** * @return String * @throws RmesException @@ -231,4 +256,6 @@ public static String seriesQuery() throws RmesException { params.put("withSims", "false"); return buildSeriesRequest("getSeriesQuery.ftlh", params); } + + } diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 9e3de14b4..096a670f4 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -564,7 +564,7 @@ public Response getMSD( ) { MSD msd ; String jsonResultat = null ; - + if (header != null && header.equals(MediaType.APPLICATION_XML)) { try { msd = operationsService.getMSD(); @@ -573,7 +573,7 @@ public Response getMSD( } return Response.ok(XMLUtils.produceResponse(msd, header)).build(); } - + else { try { jsonResultat = operationsService.getMSDJson(); @@ -583,7 +583,7 @@ public Response getMSD( return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } } - + @GET @Path("/metadataAttribute/{id}") @Produces(MediaType.APPLICATION_JSON) @@ -635,7 +635,7 @@ public Response getMetadataReport(@PathParam(Constants.ID) String id) { @Path("/metadataReport/default") @Produces(MediaType.APPLICATION_JSON) @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReportDefaultValue", summary = "Get default value for metadata report", - responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) + responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) ))}) public Response getMetadataReportDefaultValue() throws IOException { return Response.status(HttpStatus.SC_OK).entity(operationsService.getMetadataReportDefaultValue()).build(); @@ -675,7 +675,7 @@ public Response getFullSims( @Produces(MediaType.APPLICATION_JSON) @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReport", summary = "Owner stamp for a Metadata report's id", responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) - ))}) + ))}) public Response getMetadataReportOwner(@PathParam(Constants.ID) String id) { String jsonResultat; try { @@ -749,15 +749,15 @@ public Response deleteMetadataReportById( content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { Status result=Status.NO_CONTENT; try { - result = operationsService.deleteMetadataReport(id); + result = operationsService.deleteMetadataReport(id); } catch (RmesException e) { return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); } return Response.status(result).build(); } - - + + /** * PUBLISH * @param id @@ -778,6 +778,46 @@ public Response setSimsValidation( return Response.status(HttpStatus.SC_OK).entity(id).build(); } + @GET + @Path("/series/seriesForStamp/{stamp}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "seriesForStamp", summary = "Series with given stamp") + public Response getSeriesForStamp(@Parameter( + description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", + required = true, + schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp + ) throws RmesException { + String jsonResultat = operationsService.getSeriesForStamp(stamp); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/series/seriesIdsForStamp/{stamp}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Ids of Series with given stamp") + public Response getSeriesIdsForStamp(@Parameter( + description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", + required = true, + schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp + ) throws RmesException { + String jsonResultat = operationsService.getSeriesIdsForStamp(stamp); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/series/seriesWithStamp/{stamp}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Series with given stamp as creator") + public Response getSeriesWithStamp(@Parameter( + description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", + required = true, + schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp + ) throws RmesException { + String jsonResultat = operationsService.getSeriesWithStamp(stamp); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET @Path("/metadataReport/export/{id}") @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) @@ -798,8 +838,9 @@ public Response getTestSimsExport() throws RmesException { return operationsService.exportTestMetadataReport(); } - - + + + private Response returnRmesException(RmesException e) { logger.error(e.getMessage(), e); return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); diff --git a/src/main/resources/request/operations/series/getSeriesByCreatorStampQuery.ftlh b/src/main/resources/request/operations/series/getSeriesByCreatorStampQuery.ftlh new file mode 100644 index 000000000..e6f203fe4 --- /dev/null +++ b/src/main/resources/request/operations/series/getSeriesByCreatorStampQuery.ftlh @@ -0,0 +1,7 @@ +SELECT ?seriesId + WHERE { + ?series dc:creator ?creators + FILTER ( STR(?creators) = "${STAMP}") + + BIND(STRAFTER(STR(?series),'/operations/serie/') AS ?seriesId) + } \ No newline at end of file diff --git a/src/main/resources/request/operations/series/getSeriesCreatorsByUriQuery.ftlh b/src/main/resources/request/operations/series/getSeriesCreatorsByUriQuery.ftlh index 5019f7d42..937cc61c6 100644 --- a/src/main/resources/request/operations/series/getSeriesCreatorsByUriQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesCreatorsByUriQuery.ftlh @@ -1,5 +1,5 @@ SELECT ?creators WHERE { ?series dc:creator ?creators . - VALUES ?series { ${URI_SERIES}} + VALUES ?series { <${URI_SERIES}>} } \ No newline at end of file diff --git a/src/main/resources/request/operations/series/getSeriesWithStampQuery.ftlh b/src/main/resources/request/operations/series/getSeriesWithStampQuery.ftlh new file mode 100644 index 000000000..2b728b94a --- /dev/null +++ b/src/main/resources/request/operations/series/getSeriesWithStampQuery.ftlh @@ -0,0 +1,19 @@ +SELECT DISTINCT ?id ?label (group_concat(?altLabelLg1;separator=' || ') as ?altLabel) + + WHERE { + GRAPH <${OPERATIONS_GRAPH}> { + ?series a insee:StatisticalOperationSeries . + ?series skos:prefLabel ?label . + ?series dc:creator ?creators + FILTER (lang(?label) = '${LG1}') + FILTER (STR(?creators) = "${STAMP}") + BIND(STRAFTER(STR(?series),'/operations/serie/') AS ?id) . + OPTIONAL{ + ?series skos:altLabel ?altLabelLg1 . + FILTER (lang(?altLabelLg1) = ' ${LG1}') + } + + } + } + GROUP BY ?id ?label + ORDER BY ?label \ No newline at end of file From 5eae4153a309bea9755486de30f20cadfcc01cd6 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 18 Jan 2021 13:38:09 +0100 Subject: [PATCH 063/243] Improve Sims export --- src/main/resources/xslTransformerFiles/parameters.xml | 10 ++++++++++ src/main/resources/xslTransformerFiles/testXSLT.xsl | 7 ++++--- 2 files changed, 14 insertions(+), 3 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/parameters.xml diff --git a/src/main/resources/xslTransformerFiles/parameters.xml b/src/main/resources/xslTransformerFiles/parameters.xml new file mode 100644 index 000000000..5e2c979f9 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/parameters.xml @@ -0,0 +1,10 @@ + + +OPERATION + +1 +2 + + + + diff --git a/src/main/resources/xslTransformerFiles/testXSLT.xsl b/src/main/resources/xslTransformerFiles/testXSLT.xsl index 034ec5b93..b1a3c25e5 100644 --- a/src/main/resources/xslTransformerFiles/testXSLT.xsl +++ b/src/main/resources/xslTransformerFiles/testXSLT.xsl @@ -572,9 +572,10 @@ - - ' - + + + + From 5098cec4caa90bb9e3daf5bc8723de00731b0b0a Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 18 Jan 2021 16:35:14 +0100 Subject: [PATCH 064/243] Update RDF4J --- pom.xml | 2 +- .../operations/documentations/DocumentationExport.java | 1 - .../operations/documentations/DocumentationsUtils.java | 4 ---- .../bauhaus_services/structures/impl/StructureImpl.java | 7 +++---- .../structures/utils/StructureComponentUtils.java | 6 +++--- .../bauhaus_services/structures/utils/StructureUtils.java | 6 ++---- .../operations/documentations/DocumentsQueries.java | 1 - .../java/fr/insee/rmes/webservice/StructureResources.java | 2 -- 8 files changed, 9 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index f478c80e9..049d1a9d3 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,7 @@ 2.19 2.10.1 - 3.2.1 + 3.5.0 2.0.9 4.3.25.RELEASE 4.2.17.RELEASE diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 4685cc7d1..3ef5a20db 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -2,7 +2,6 @@ import java.io.ByteArrayInputStream; import java.io.File; -import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 5ea9fa4f2..5fbe46529 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -9,7 +9,6 @@ import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; -import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; @@ -55,7 +54,6 @@ import fr.insee.rmes.exceptions.RmesNotAcceptableException; import fr.insee.rmes.exceptions.RmesNotFoundException; import fr.insee.rmes.exceptions.RmesUnauthorizedException; -import fr.insee.rmes.external_services.notifications.RmesNotificationsImpl; import fr.insee.rmes.model.ValidationStatus; import fr.insee.rmes.model.operations.Operation; import fr.insee.rmes.model.operations.Series; @@ -66,9 +64,7 @@ import fr.insee.rmes.model.operations.documentations.MSD; import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.ontologies.SDMX_MM; -import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentationsQueries; -import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentsQueries; import fr.insee.rmes.utils.XMLUtils; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java index a36a4b342..efd7edb2c 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java @@ -1,9 +1,5 @@ package fr.insee.rmes.bauhaus_services.structures.impl; -import fr.insee.rmes.bauhaus_services.CodeListService; -import fr.insee.rmes.bauhaus_services.concepts.concepts.ConceptsUtils; -import fr.insee.rmes.persistance.ontologies.QB; -import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.json.JSONArray; @@ -11,10 +7,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import fr.insee.rmes.bauhaus_services.CodeListService; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.structures.StructureService; import fr.insee.rmes.bauhaus_services.structures.utils.StructureUtils; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.persistance.ontologies.QB; +import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import fr.insee.rmes.persistance.sparql_queries.structures.StructureQueries; @Service diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 96b9358fc..159796bf8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -5,9 +5,6 @@ import javax.ws.rs.BadRequestException; -import fr.insee.rmes.exceptions.ErrorCodes; -import fr.insee.rmes.exceptions.RmesUnauthorizedException; -import fr.insee.rmes.model.dissemination_status.DisseminationStatus; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -31,8 +28,11 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; import fr.insee.rmes.config.Config; +import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.exceptions.RmesUnauthorizedException; import fr.insee.rmes.model.ValidationStatus; +import fr.insee.rmes.model.dissemination_status.DisseminationStatus; import fr.insee.rmes.model.structures.MutualizedComponent; import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.ontologies.QB; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 075d7f792..b055d2f62 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -4,12 +4,8 @@ import java.util.ArrayList; import java.util.List; -import javax.validation.Validation; import javax.ws.rs.BadRequestException; -import fr.insee.rmes.model.ValidationStatus; -import fr.insee.rmes.model.dissemination_status.DisseminationStatus; -import fr.insee.rmes.persistance.ontologies.INSEE; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -34,9 +30,11 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; import fr.insee.rmes.config.Config; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.ValidationStatus; import fr.insee.rmes.model.structures.ComponentDefinition; import fr.insee.rmes.model.structures.MutualizedComponent; import fr.insee.rmes.model.structures.Structure; +import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.ontologies.QB; import fr.insee.rmes.persistance.sparql_queries.structures.StructureQueries; import fr.insee.rmes.utils.DateUtils; diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java index b6d431631..b2ac198f0 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java @@ -43,7 +43,6 @@ public static String getDocumentQuery(String id, boolean isLink) throws RmesExce } public static String getSimsByDocument(String id) throws RmesException { - Map params = new HashMap<>(); params.put("LG1", Config.LG1); params.put("LG2", Config.LG2); params.put("ID", Config.DOCUMENTS_BASE_URI + "/" + id); diff --git a/src/main/java/fr/insee/rmes/webservice/StructureResources.java b/src/main/java/fr/insee/rmes/webservice/StructureResources.java index 2d81a81e9..ce5bb75d7 100644 --- a/src/main/java/fr/insee/rmes/webservice/StructureResources.java +++ b/src/main/java/fr/insee/rmes/webservice/StructureResources.java @@ -199,8 +199,6 @@ public Response getComponentById(@PathParam(Constants.ID) String id) { @Produces(MediaType.APPLICATION_JSON) @Operation(operationId = "deleteComponentById", summary = "delete a mutualized component") public Response deleteComponentById(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { structureComponentService.deleteComponent(id); } catch (RmesException e) { From 660789fd7dd5867bf4f74dd1af378405680838fa Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 19 Jan 2021 10:57:10 +0100 Subject: [PATCH 065/243] Fix solar smells --- .../fr/insee/rmes/bauhaus_services/Constants.java | 2 ++ .../documentations/DocumentationExport.java | 8 ++++---- .../documentations/DocumentationsUtils.java | 8 ++++---- .../structures/impl/StructureImpl.java | 15 ++++++++------- 4 files changed, 18 insertions(+), 15 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 5f1d3011b..c16545545 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -11,6 +11,7 @@ public class Constants { public static final String CODELIST = "codeList"; public static final String CODE_LIST_FREQ = "CL_FREQ"; public static final String CODE_LIST_SOURCE_CATEGORY = "CL_SOURCE_CATEGORY"; + public static final String CONCEPT = "concept"; public static final String CREATOR = "creator"; public static final String CREATORS = "creators"; public static final String CONTRIBUTOR = "contributor"; @@ -29,6 +30,7 @@ public class Constants { /*F*/ public static final String FAMILY = "family"; + public static final String FLAT_ODT = "flatODT"; /*H*/ public static final String HAS_DOC_LG1 = "hasDocLg1"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 4685cc7d1..04acc2df7 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -48,7 +48,7 @@ public File export(File inputFile) throws Exception { public File export(InputStream inputFile) throws Exception { logger.debug("Begin To export documentation"); - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); //File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("application/vnd.oasis.opendocument.text")); output.deleteOnExit(); @@ -91,7 +91,7 @@ public File transfoTest(InputStream inputFile) throws Exception { public File convertRichText(InputStream inputFile) throws IOException { - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); OutputStream osOutputFile = FileUtils.openOutputStream(output); @@ -119,7 +119,7 @@ public File convertRichText(InputStream inputFile) throws IOException { public File testExport() throws IOException { - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); OutputStream osOutputFile = FileUtils.openOutputStream(output); @@ -161,7 +161,7 @@ public File export(InputStream inputFile, String msdPath = msdFile.getAbsolutePath(); - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("flatODT")); + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); //File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("application/vnd.oasis.opendocument.text")); output.deleteOnExit(); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 5ea9fa4f2..3a8f9b58e 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -247,13 +247,13 @@ public String setMetadataReport(String id, String body, boolean create) throws R private void addTarget(Documentation sims) throws RmesException { if (sims.getIdTarget()==null) { String[] target = getDocumentationTargetTypeAndId(sims.getId()); - String targetType = target[0]; String targetId = target[1]; switch(targetType) { - case Constants.INDICATOR_UP : sims.setIdIndicator(targetId); - case Constants.OPERATION_UP : sims.setIdOperation(targetId); - case Constants.SERIES_UP : sims.setIdSeries(targetId); + case Constants.INDICATOR_UP : sims.setIdIndicator(targetId); break; + case Constants.OPERATION_UP : sims.setIdOperation(targetId); break; + case Constants.SERIES_UP : sims.setIdSeries(targetId); break; + default: break; } } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java index a36a4b342..062ba6ba3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java @@ -1,6 +1,7 @@ package fr.insee.rmes.bauhaus_services.structures.impl; import fr.insee.rmes.bauhaus_services.CodeListService; +import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.concepts.concepts.ConceptsUtils; import fr.insee.rmes.persistance.ontologies.QB; import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; @@ -81,25 +82,25 @@ public String getStructureByIdWithDetails(String id) throws RmesException { } // If the codelist is defined, we have to remove the range property and fetch the codes list - if(!component.isNull("codeList")){ + if(!component.isNull(Constants.CODELIST)){ component.remove("range"); JSONObject codeList = new JSONObject(); - codeList.put("id", component.getString("codeList")); + codeList.put("id", component.getString(Constants.CODELIST)); try { - codeList.put("codes", new JSONArray(this.codeListService.geCodesListByIRI(component.getString("codeList")))); + codeList.put("codes", new JSONArray(this.codeListService.geCodesListByIRI(component.getString(Constants.CODELIST)))); } catch (RmesException e) { logger.error("Cannot fetch code list of the structure " + id); logger.error(e); } - component.put("codeList", codeList); + component.put(Constants.CODELIST, codeList); } - if(!component.isNull("concept")){ + if(!component.isNull(Constants.CONCEPT)){ try { - JSONObject concept = repoGestion.getResponseAsObject(ConceptsQueries.conceptQueryForDetailStructure(component.getString("concept"))); - component.put("concept", concept); + JSONObject concept = repoGestion.getResponseAsObject(ConceptsQueries.conceptQueryForDetailStructure(component.getString(Constants.CONCEPT))); + component.put(Constants.CONCEPT, concept); } catch (RmesException e) { logger.error("Cannot fetch concept of the structure " + id); logger.error(e); From 2ff2e04ffb42600656828e0f462543ba2179f2cb Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 19 Jan 2021 11:14:14 +0100 Subject: [PATCH 066/243] fix solar smell --- .../fr/insee/rmes/exceptions/RmesException.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/insee/rmes/exceptions/RmesException.java b/src/main/java/fr/insee/rmes/exceptions/RmesException.java index af18d8231..9d8f33173 100644 --- a/src/main/java/fr/insee/rmes/exceptions/RmesException.java +++ b/src/main/java/fr/insee/rmes/exceptions/RmesException.java @@ -14,7 +14,7 @@ public class RmesException extends Exception { private static final long serialVersionUID = -7959158367542389147L; private final int status; - private final JSONObject details; + private final transient JSONObject details; /** * @@ -25,7 +25,7 @@ public class RmesException extends Exception { public RmesException(int status, String message, String details) { super(); this.status = status; - this.details = new JSONObject(); + this.details = new Details(); this.details.put(MESSAGE, message); this.details.put(DETAILS_STRING, details); } @@ -33,7 +33,7 @@ public RmesException(int status, String message, String details) { public RmesException(int status, String message, JSONArray details) { super(); this.status = status; - this.details = new JSONObject(); + this.details = new Details(); this.details.put(MESSAGE, message); this.details.put(DETAILS_STRING, details.toString()); } @@ -41,7 +41,7 @@ public RmesException(int status, String message, JSONArray details) { public RmesException(int status, int errorCode, String message, String details) { super(); this.status = status; - this.details = new JSONObject(); + this.details = new Details(); this.details.put(CODE, errorCode); this.details.put(MESSAGE, message); this.details.put(DETAILS_STRING, details); @@ -50,7 +50,7 @@ public RmesException(int status, int errorCode, String message, String details) public RmesException(int status, int errorCode, String details) { super(); this.status = status; - this.details = new JSONObject(); + this.details = new Details(); this.details.put(CODE, errorCode); this.details.put(DETAILS_STRING, details); } @@ -58,7 +58,7 @@ public RmesException(int status, int errorCode, String details) { public RmesException(int status, int errorCode, JSONArray details) { super(); this.status = status; - this.details = new JSONObject(); + this.details = new Details(); this.details.put(CODE, errorCode); this.details.put(DETAILS_STRING, details.toString()); } @@ -66,7 +66,7 @@ public RmesException(int status, int errorCode, JSONArray details) { public RmesException(int status, int errorCode, String message, JSONArray details) { super(); this.status = status; - this.details = new JSONObject(); + this.details = new Details(); this.details.put(CODE, errorCode); this.details.put(MESSAGE, message); this.details.put(DETAILS_STRING, details.toString()); From 83e9252147d0e1a7dc1e05e22ba2f87420161ef4 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 20 Jan 2021 11:41:12 +0100 Subject: [PATCH 067/243] Fix issue with rdf4j 3.5.0 --- .../bauhaus_services/operations/OperationsImpl.java | 12 ++++++++---- .../rmes/bauhaus_services/rdf_utils/RdfUtils.java | 10 +++++----- .../model/operations/documentations/RangeType.java | 6 +++--- 3 files changed, 16 insertions(+), 12 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 92316f6c8..6a7ce6aa2 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -1,6 +1,12 @@ package fr.insee.rmes.bauhaus_services.operations; -import java.io.*; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; import java.lang.reflect.Field; import java.nio.charset.Charset; @@ -8,17 +14,16 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import fr.insee.rmes.bauhaus_services.Constants; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import org.eclipse.rdf4j.model.Resource; import org.glassfish.jersey.media.multipart.ContentDisposition; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.util.StreamUtils; import fr.insee.rmes.bauhaus_services.OperationsService; import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationsUtils; @@ -46,7 +51,6 @@ import fr.insee.rmes.persistance.sparql_queries.operations.operations.OperationsQueries; import fr.insee.rmes.persistance.sparql_queries.operations.series.SeriesQueries; import fr.insee.rmes.utils.XhtmlToMarkdownUtils; -import org.springframework.util.StreamUtils; @Service public class OperationsImpl extends RdfService implements OperationsService { diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RdfUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RdfUtils.java index 79238075b..9175a9d2b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RdfUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RdfUtils.java @@ -14,7 +14,7 @@ import org.eclipse.rdf4j.model.ValueFactory; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; import org.eclipse.rdf4j.model.vocabulary.RDF; -import org.eclipse.rdf4j.model.vocabulary.XMLSchema; +import org.eclipse.rdf4j.model.vocabulary.XSD; import fr.insee.rmes.config.Config; import fr.insee.rmes.model.ValidationStatus; @@ -176,17 +176,17 @@ public static Literal setLiteralBoolean(Boolean bool) { } public static Literal setLiteralInt(String number) { - return factory.createLiteral(number, XMLSchema.INT); + return factory.createLiteral(number, XSD.INT); } public static Literal setLiteralDateTime(String date) { String parsedDate = DateTimeFormatter.ISO_DATE_TIME.format(DateUtils.parseDateTime(date)); - return factory.createLiteral(parsedDate, XMLSchema.DATETIME); + return factory.createLiteral(parsedDate, XSD.DATETIME); } public static Literal setLiteralDate(String date) { String parsedDate = new SimpleDateFormat(DATE_FORMAT).format(DateUtils.parseDate(date)); - return factory.createLiteral(parsedDate, XMLSchema.DATE); + return factory.createLiteral(parsedDate, XSD.DATE); } public static Literal setLiteralXML(String string) { @@ -194,7 +194,7 @@ public static Literal setLiteralXML(String string) { } public static Literal setLiteralLanguage(String string) { - return factory.createLiteral(string.trim(), XMLSchema.LANGUAGE); + return factory.createLiteral(string.trim(), XSD.LANGUAGE); } public static IRI toURI(String string) { diff --git a/src/main/java/fr/insee/rmes/model/operations/documentations/RangeType.java b/src/main/java/fr/insee/rmes/model/operations/documentations/RangeType.java index 6622cc753..7e7189148 100644 --- a/src/main/java/fr/insee/rmes/model/operations/documentations/RangeType.java +++ b/src/main/java/fr/insee/rmes/model/operations/documentations/RangeType.java @@ -4,7 +4,7 @@ import java.util.Map; import org.eclipse.rdf4j.model.IRI; -import org.eclipse.rdf4j.model.vocabulary.XMLSchema; +import org.eclipse.rdf4j.model.vocabulary.XSD; import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.persistance.ontologies.DCMITYPE; @@ -15,10 +15,10 @@ public enum RangeType { - STRING(XMLSchema.STRING, "TEXT"), + STRING(XSD.STRING, "TEXT"), RICHTEXT(DCMITYPE.TEXT, "RICH_TEXT"), ATTRIBUTE(SDMX_MM.REPORTED_ATTRIBUTE, "REPORTED_ATTRIBUTE"), - DATE(XMLSchema.DATE, "DATE"), + DATE(XSD.DATE, "DATE"), ORGANIZATION(ORG.ORGANIZATION,"ORGANIZATION"), CODELIST(null,"CODE_LIST"), GEOGRAPHY(GEO.FEATURE,"GEOGRAPHY"), From 2b78fc1840ab8f0e011c468fa3f453b60830256e Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 21 Jan 2021 10:00:52 +0100 Subject: [PATCH 068/243] fix: reset id for component specification --- .../structures/utils/StructureUtils.java | 23 +----- .../structures/StructureQueries.java | 4 - .../structures/checkUnicityStructure.ftlh | 2 +- .../getLastIdByComponentDefinition.ftlh | 9 --- .../structures/utils/StructureUtilsTest.java | 74 ------------------- 5 files changed, 3 insertions(+), 109 deletions(-) delete mode 100644 src/main/resources/request/structures/getLastIdByComponentDefinition.ftlh delete mode 100644 src/test/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtilsTest.java diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index a58dea981..c029ddea0 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -3,16 +3,13 @@ import java.io.IOException; import java.util.ArrayList; import java.util.List; -import java.util.Optional; import java.util.stream.Collectors; -import javax.validation.Validation; import javax.ws.rs.BadRequestException; import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesUnauthorizedException; import fr.insee.rmes.model.ValidationStatus; -import fr.insee.rmes.model.dissemination_status.DisseminationStatus; import fr.insee.rmes.persistance.ontologies.INSEE; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -205,7 +202,7 @@ private void checkUnicityForStructure(Structure structure) throws RmesException String[] ids = structure.getComponentDefinitions().stream().map(cd -> { return cd.getComponent().getId(); }).map(Object::toString).collect(Collectors.toList()).toArray(new String[0]); - Boolean structureWithSameComponents = repoGestion.getResponseAsBoolean(StructureQueries.checkUnicityStructure(structure.getId(), ids)); + Boolean structureWithSameComponents = ids.length > 0 && repoGestion.getResponseAsBoolean(StructureQueries.checkUnicityStructure(structure.getId(), ids)); if(structureWithSameComponents){ throw new RmesUnauthorizedException(ErrorCodes.STRUCTURE_UNICITY, "A structure with the same components already exists", ""); @@ -242,7 +239,6 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru } public void createRdfComponentSpecifications(Structure structure, IRI structureIRI, List componentList, Model model, Resource graph) throws RmesException { - int nextID = getNextComponentSpecificationID(); for (int i = 0; i < componentList.size(); i++) { ComponentDefinition componentDefinition = componentList.get(i); MutualizedComponent component = componentDefinition.getComponent(); @@ -260,7 +256,7 @@ public void createRdfComponentSpecifications(Structure structure, IRI structureI } componentDefinition.setModified(DateUtils.getCurrentDate()); if (componentDefinition.getId() == null) { - componentDefinition.setId("cs" + (nextID + i) ); + componentDefinition.setId("cs" + (1000 + i) ); } createRdfComponentSpecification(structureIRI, model, componentDefinition, graph); } @@ -318,21 +314,6 @@ public void createRdfComponentSpecification(IRI structureIRI, Model model, Compo } } - public int getNextComponentSpecificationID() throws RmesException { - - logger.info("Generate id for component"); - JSONObject json = repoGestion.getResponseAsObject(StructureQueries.lastIdForComponentDefinition()); - logger.debug("JSON when generating the id of a component : {}", json); - if (json.length() == 0) { - return 1000; - } - String id = json.getString(Constants.ID); - if (id.equals(Constants.UNDEFINED)) { - return 1000; - } - return (Integer.parseInt(id) + 1); - } - public IRI getComponentDefinitionIRI(String structureIRI, String componentDefinitionId) { return RdfUtils.structureComponentDefinitionIRI(structureIRI, componentDefinitionId); } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java index d4f6294d3..3d1075949 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java @@ -88,10 +88,6 @@ public static String lastStructureId() throws RmesException { return buildRequest("getLastIdStructure.ftlh", params); } - public static String lastIdForComponentDefinition() throws RmesException { - HashMap params = initParams(); - return buildRequest("getLastIdByComponentDefinition.ftlh", params); - } private static String buildRequest(String fileName, HashMap params) throws RmesException { return FreeMarkerUtils.buildRequest("structures/", fileName, params); diff --git a/src/main/resources/request/structures/checkUnicityStructure.ftlh b/src/main/resources/request/structures/checkUnicityStructure.ftlh index 4fd8983ac..07c4943a8 100644 --- a/src/main/resources/request/structures/checkUnicityStructure.ftlh +++ b/src/main/resources/request/structures/checkUnicityStructure.ftlh @@ -12,7 +12,7 @@ FROM<${STRUCTURES_GRAPH}> ?componentSpec (qb:attribute | qb:dimension | qb:measure) / dcterms:identifier ?id . FILTER( <#list IDS as id> -?id = "${id}" <#sep> +?id = "${id}" <#sep> || ) } diff --git a/src/main/resources/request/structures/getLastIdByComponentDefinition.ftlh b/src/main/resources/request/structures/getLastIdByComponentDefinition.ftlh deleted file mode 100644 index 92ce7a5e8..000000000 --- a/src/main/resources/request/structures/getLastIdByComponentDefinition.ftlh +++ /dev/null @@ -1,9 +0,0 @@ -SELECT ?id -FROM <${STRUCTURES_GRAPH}> -WHERE { - ?s a qb:ComponentSpecification . - ?s dcterms:identifier ?idp . - BIND (xsd:integer(REPLACE(str(?idp), "^cs", "")) AS ?id) -} -ORDER BY DESC(?id) -LIMIT 1 \ No newline at end of file diff --git a/src/test/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtilsTest.java b/src/test/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtilsTest.java deleted file mode 100644 index 7ed4bf49e..000000000 --- a/src/test/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtilsTest.java +++ /dev/null @@ -1,74 +0,0 @@ -package fr.insee.rmes.bauhaus_services.structures.utils; - -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; - -import java.util.ArrayList; -import java.util.List; - -import fr.insee.rmes.model.structures.Structure; -import org.eclipse.rdf4j.model.IRI; -import org.eclipse.rdf4j.model.Model; -import org.eclipse.rdf4j.model.Resource; -import org.eclipse.rdf4j.model.impl.LinkedHashModel; -import org.eclipse.rdf4j.model.impl.SimpleValueFactory; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.mockito.Spy; - -import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryGestion; -import fr.insee.rmes.exceptions.RmesException; -import fr.insee.rmes.model.structures.ComponentDefinition; -import fr.insee.rmes.model.structures.MutualizedComponent; - -class StructureUtilsTest { - - @InjectMocks - @Spy - private StructureUtils structureUtils; - - @Mock - private RepositoryGestion repoGestion; - - @BeforeEach - public void init() { - MockitoAnnotations.initMocks(this); - } - - @Test - void shouldCallCreateComponentSpecificationForEachComponents() throws RmesException { - Resource graph = null; - doReturn(1).when(structureUtils).getNextComponentSpecificationID(); - - Model model = new LinkedHashModel(); - IRI structureIRI = SimpleValueFactory.getInstance().createIRI("http://structure"); - Structure structure = new Structure(); - - List components = new ArrayList<>(); - - ComponentDefinition componentDefinition1 = new ComponentDefinition(); - MutualizedComponent component1 = new MutualizedComponent(); - component1.setId("d1001"); - componentDefinition1.setComponent(component1); - - ComponentDefinition componentDefinition2 = new ComponentDefinition(); - MutualizedComponent component2 = new MutualizedComponent(); - component2.setId("d1002"); - componentDefinition2.setComponent(component2); - - components.add(componentDefinition1); - components.add(componentDefinition2); - - doNothing().when(structureUtils).createRdfComponentSpecification(any(), any(), any(), any()); - - structureUtils.createRdfComponentSpecifications(structure, structureIRI, components, model, graph); - - verify(structureUtils, times(2)).createRdfComponentSpecification(any(), any(), any(), any()); - } -} From a37daf9fe951c301383cc24cafc2b35dbefd2670 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 21 Jan 2021 10:51:33 +0100 Subject: [PATCH 069/243] feat: init LDAP only when the config is defined --- .../authentication/stamps/RmesStampsImpl.java | 53 ++++++++++--------- 1 file changed, 29 insertions(+), 24 deletions(-) diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/stamps/RmesStampsImpl.java b/src/main/java/fr/insee/rmes/external_services/authentication/stamps/RmesStampsImpl.java index 75ace7bcd..70d6c1037 100644 --- a/src/main/java/fr/insee/rmes/external_services/authentication/stamps/RmesStampsImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/authentication/stamps/RmesStampsImpl.java @@ -33,35 +33,41 @@ public class RmesStampsImpl implements StampsService { @Override public String getStamps() throws RmesException { TreeSet stamps = new TreeSet<>(); - logger.info("Connection to LDAP : {}", Config.LDAP_URL); try { - // Connexion à la racine de l'annuaire - Hashtable environment = new Hashtable<>(); - environment.put(Context.INITIAL_CONTEXT_FACTORY, - "com.sun.jndi.ldap.LdapCtxFactory"); - environment.put(Context.PROVIDER_URL, Config.LDAP_URL); - environment.put(Context.SECURITY_AUTHENTICATION, "none"); - DirContext context; + if(Config.LDAP_URL != null && !Config.LDAP_URL.isEmpty()) { + logger.info("Connection to LDAP : {}", Config.LDAP_URL); - context = new InitialDirContext(environment); + // Connexion à la racine de l'annuaire + Hashtable environment = new Hashtable<>(); + environment.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + environment.put(Context.PROVIDER_URL, Config.LDAP_URL); + environment.put(Context.SECURITY_AUTHENTICATION, "none"); + DirContext context; - // Spécification des critères pour la recherche des unités - SearchControls controls = new SearchControls(); - controls.setSearchScope(SearchControls.SUBTREE_SCOPE); - controls.setReturningAttributes(new String[] { "ou", "description" }); - String filter = "(objectClass=inseeUnite)"; + context = new InitialDirContext(environment); - // Exécution de la recherche et parcours des résultats - NamingEnumeration results = context.search( - "ou=Unités,o=insee,c=fr", filter, controls); - while (results.hasMore()) { - SearchResult entree = results.next(); - String stamp = entree.getAttributes().get("ou").get() - .toString(); - if(!stamp.equals("AUTRE")) { - stamps.add("\"" + stamp + "\""); + // Spécification des critères pour la recherche des unités + SearchControls controls = new SearchControls(); + controls.setSearchScope(SearchControls.SUBTREE_SCOPE); + controls.setReturningAttributes(new String[] { "ou", "description" }); + String filter = "(objectClass=inseeUnite)"; + + // Exécution de la recherche et parcours des résultats + NamingEnumeration results = context.search( + "ou=Unités,o=insee,c=fr", filter, controls); + while (results.hasMore()) { + SearchResult entree = results.next(); + String stamp = entree.getAttributes().get("ou").get() + .toString(); + if(!stamp.equals("AUTRE")) { + stamps.add("\"" + stamp + "\""); + } } + + context.close(); } + // Add SSM Stamps stamps.add("\"SSM-SSP\""); stamps.add("\"SSM-DARES\""); @@ -80,7 +86,6 @@ public String getStamps() throws RmesException { stamps.add("\"SSM-SIES\""); stamps.add("\"SSM-DEPS\""); - context.close(); logger.info("Get stamps succeed"); } catch (NamingException e) { logger.error("Get stamps failed"); From 2c582d73065fc3ceb0ded3d79e8c2ccafbad5d99 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 22 Jan 2021 09:12:24 +0100 Subject: [PATCH 070/243] Fix issue with details and serializable --- .../insee/rmes/exceptions/RmesException.java | 48 +++++++++---------- 1 file changed, 22 insertions(+), 26 deletions(-) diff --git a/src/main/java/fr/insee/rmes/exceptions/RmesException.java b/src/main/java/fr/insee/rmes/exceptions/RmesException.java index 9d8f33173..686051679 100644 --- a/src/main/java/fr/insee/rmes/exceptions/RmesException.java +++ b/src/main/java/fr/insee/rmes/exceptions/RmesException.java @@ -14,7 +14,7 @@ public class RmesException extends Exception { private static final long serialVersionUID = -7959158367542389147L; private final int status; - private final transient JSONObject details; + private final String details; /** * @@ -25,63 +25,50 @@ public class RmesException extends Exception { public RmesException(int status, String message, String details) { super(); this.status = status; - this.details = new Details(); - this.details.put(MESSAGE, message); - this.details.put(DETAILS_STRING, details); + this.details = createDetails(null, message, details); } public RmesException(int status, String message, JSONArray details) { super(); this.status = status; - this.details = new Details(); - this.details.put(MESSAGE, message); - this.details.put(DETAILS_STRING, details.toString()); + this.details = createDetails(null, message, details.toString()); } public RmesException(int status, int errorCode, String message, String details) { super(); this.status = status; - this.details = new Details(); - this.details.put(CODE, errorCode); - this.details.put(MESSAGE, message); - this.details.put(DETAILS_STRING, details); + this.details = createDetails(errorCode, message, details); } public RmesException(int status, int errorCode, String details) { super(); this.status = status; - this.details = new Details(); - this.details.put(CODE, errorCode); - this.details.put(DETAILS_STRING, details); + this.details = createDetails(errorCode, null, details); } public RmesException(int status, int errorCode, JSONArray details) { super(); this.status = status; - this.details = new Details(); - this.details.put(CODE, errorCode); - this.details.put(DETAILS_STRING, details.toString()); + this.details = createDetails(errorCode, null, details.toString()); } public RmesException(int status, int errorCode, String message, JSONArray details) { super(); this.status = status; - this.details = new Details(); - this.details.put(CODE, errorCode); - this.details.put(MESSAGE, message); - this.details.put(DETAILS_STRING, details.toString()); + this.details = createDetails(errorCode, message, details.toString()); } public RmesException(int status, int errorCode, String message, JSONObject details) { super(); this.status = status; - this.details = details; - this.details.put(CODE, errorCode); - this.details.put(MESSAGE, message); + JSONObject det = details; + det.put(CODE, errorCode); + det.put(MESSAGE, message); + this.details=det.toString(); } public RestMessage toRestMessage(){ - return new RestMessage(this.status, this.getMessage(), this.details.toString()); + return new RestMessage(this.status, this.getMessage(), this.details); } public int getStatus() { @@ -89,11 +76,20 @@ public int getStatus() { } public String getDetails() { - return details.toString(); + return details; } public String getMessageAndDetails2() { return getMessage() + " " + details; } + private String createDetails(Integer errorCode, String message, String detailsParam) { + JSONObject det = new JSONObject(); + if (errorCode != null) det.put(CODE, errorCode); + if (message != null) det.put(MESSAGE, message); + if (details != null) det.put(DETAILS_STRING, detailsParam); + return det.toString(); + + } + } From 7ed000ab406d65c1bfd18543a6dbc23cb7b4bb11 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 22 Jan 2021 09:46:04 +0100 Subject: [PATCH 071/243] Update publishing series and indicators --- .../documentations/DocumentationPublication.java | 4 +--- .../indicators/IndicatorPublication.java | 16 +++++++++++++--- .../operations/series/SeriesPublication.java | 11 +++++++---- 3 files changed, 21 insertions(+), 10 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java index d0afa3ac9..7fdc04f93 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java @@ -53,9 +53,7 @@ public void publishSims(String simsId) throws RmesException { while (statements.hasNext()) { Statement st = statements.next(); // Triplets that don't get published - if ( st.getPredicate().toString().endsWith("validationState") - || st.getPredicate().toString().endsWith(Constants.PUBLISHER) - || st.getPredicate().toString().endsWith("contributor")) { + if ( st.getPredicate().toString().endsWith("validationState")){ // nothing, wouldn't copy this attr } else if ( // Other URI to transform : diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorPublication.java index 525a45da2..c4c14cf66 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorPublication.java @@ -45,10 +45,20 @@ public void publishIndicator(String indicatorId) throws RmesException { Statement st = statements.next(); // Triplets that don't get published if (st.getPredicate().toString().endsWith("isValidated") - || st.getPredicate().toString().endsWith("validationState") - || st.getPredicate().toString().endsWith(Constants.PUBLISHER) - || st.getPredicate().toString().endsWith("contributor")) { + || st.getPredicate().toString().endsWith("validationState")) { // nothing, wouldn't copy this attr + }else if (st.getPredicate().toString().endsWith("wasGeneratedBy") || + st.getPredicate().toString().endsWith("seeAlso") || + st.getPredicate().toString().endsWith("replaces") || + st.getPredicate().toString().endsWith("isReplacedBy")|| + st.getPredicate().toString().endsWith("contributor") || + st.getPredicate().toString().endsWith("publisher") || + st.getPredicate().toString().endsWith("accrualPeriodicity") + ) { + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), + st.getPredicate(), + PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), + st.getContext()); } // Literals else { diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java index b0fa733ec..5ec5cfdf2 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java @@ -68,16 +68,19 @@ public void publishSeries(String seriesId) throws RmesException { if (st.getPredicate().toString().endsWith("isPartOf") || st.getPredicate().toString().endsWith("seeAlso") || st.getPredicate().toString().endsWith("replaces") || - st.getPredicate().toString().endsWith("isReplacedBy") ) { + st.getPredicate().toString().endsWith("isReplacedBy")|| + st.getPredicate().toString().endsWith("dataCollector") || + st.getPredicate().toString().endsWith("contributor") || + st.getPredicate().toString().endsWith("publisher") || + st.getPredicate().toString().endsWith("accrualPeriodicity")|| + st.getPredicate().toString().endsWith("type") ) { model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), st.getContext()); } else if (st.getPredicate().toString().endsWith("isValidated") || st.getPredicate().toString().endsWith("validationState") - || st.getPredicate().toString().endsWith("hasPart") - || st.getPredicate().toString().endsWith(Constants.PUBLISHER) - || st.getPredicate().toString().endsWith("contributor")) { + || st.getPredicate().toString().endsWith("hasPart")) { // nothing, wouldn't copy this attr } // Literals From 26aad07826450bbca0ac4c21db65db323e7a08c5 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 22 Jan 2021 15:54:42 +0100 Subject: [PATCH 072/243] Fix issue with sims' publication --- .../DocumentationPublication.java | 87 ++++++++----------- .../documentations/DocumentationsUtils.java | 30 +++---- .../indicators/IndicatorPublication.java | 76 ++++++++-------- .../rdf_utils/PublicationUtils.java | 3 +- .../rdf_utils/RepositoryGestion.java | 7 +- 5 files changed, 87 insertions(+), 116 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java index 7fdc04f93..1b9c93b3d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java @@ -1,9 +1,11 @@ package fr.insee.rmes.bauhaus_services.operations.documentations; import org.apache.http.HttpStatus; +import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; @@ -26,74 +28,55 @@ @Repository public class DocumentationPublication extends RdfService { - + @Autowired static RepositoryUtils repoUtils; static NotificationsContract notification = new RmesNotificationsImpl(); public void publishSims(String simsId) throws RmesException { - + Model model = new LinkedHashModel(); - Resource sims= RdfUtils.objectIRI(ObjectType.DOCUMENTATION,simsId); + Resource sims = RdfUtils.objectIRI(ObjectType.DOCUMENTATION, simsId); Resource graph = RdfUtils.simsGraph(simsId); - - //TODO notify... - RepositoryConnection con = repoGestion.getConnection(); - RepositoryResult statements = repoGestion.getStatements(con, sims); - RepositoryResult metadataReportStatements = repoGestion.getMetadataReportStatements(con, sims, graph); + // TODO notify... + RepositoryConnection con = repoGestion.getConnection(); + RepositoryResult metadataReportStatements = repoGestion.getCompleteGraph(con, graph); - - try { - try { - if (!statements.hasNext()) { - throw new RmesNotFoundException(ErrorCodes.SIMS_UNKNOWN_ID,"Sims not found", simsId); - } - while (statements.hasNext()) { - Statement st = statements.next(); - // Triplets that don't get published - if ( st.getPredicate().toString().endsWith("validationState")){ - // nothing, wouldn't copy this attr - } else if ( - // Other URI to transform : - st.getPredicate().toString().endsWith("target") - || st.getPredicate().toString().endsWith("additionalMaterial") - || st.getPredicate().toString().endsWith("metadataReport")) - { - model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), - st.getPredicate(), - PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), - st.getContext()); - } - - // Literals - else { - model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), - st.getPredicate(), - st.getObject(), - st.getContext()); + try { + if (!metadataReportStatements.hasNext()) { + throw new RmesNotFoundException(ErrorCodes.SIMS_UNKNOWN_ID, "Sims not found", simsId); + } + while (metadataReportStatements.hasNext()) { + Statement st = metadataReportStatements.next(); + // Triplets that don't get published + if (st.getPredicate().toString().endsWith("validationState")) { + // nothing, wouldn't copy this attr + } else { + Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); + IRI predicate = RdfUtils + .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); + Value object = st.getObject(); + if (st.getObject() instanceof Resource) { + object = PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()); } + + model.add(subject, predicate, object, st.getContext()); } - while (metadataReportStatements.hasNext()) { - Statement st = metadataReportStatements.next(); - model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), - st.getPredicate(), - PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), - st.getContext()); - } - } catch (RepositoryException e) { - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), Constants.REPOSITORY_EXCEPTION); } - - } finally { - repoGestion.closeStatements(statements); + } catch (RepositoryException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), + Constants.REPOSITORY_EXCEPTION); + } + + finally { + repoGestion.closeStatements(metadataReportStatements); } - + Resource simsToPublishRessource = PublicationUtils.tranformBaseURIToPublish(sims); RepositoryPublication.publishResource(simsToPublishRessource, model, "sims"); - + } - } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 4bd66295e..f85f4af01 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -270,32 +270,26 @@ private String getDocumentationValidationStatus(String id) throws RmesException */ public String publishMetadataReport(String id) throws RmesException { Model model = new LinkedHashModel(); - JSONObject simsJson = getDocumentationByIdSims(id); + //JSONObject simsJson = getDocumentationByIdSims(id); Resource graph = RdfUtils.simsGraph(id); // Find target - String targetId = null; + String[] target = getDocumentationTargetTypeAndId(id); + String targetType = target[0]; + String targetId = target[1]; IRI targetUri = null; - try { - targetId = simsJson.getString(Constants.ID_INDICATOR); - if (!targetId.isEmpty()) { - targetUri = RdfUtils.objectIRI(ObjectType.INDICATOR, targetId); - } else { - targetId = simsJson.getString(Constants.ID_OPERATION); - if (!targetId.isEmpty()) { - targetUri = RdfUtils.objectIRI(ObjectType.OPERATION, targetId); - } else { - targetId = simsJson.getString(Constants.ID_SERIES); - targetUri = RdfUtils.objectIRI(ObjectType.SERIES, targetId); - } - } - } catch (JSONException e) { - throw new RmesNotFoundException(ErrorCodes.SIMS_UNKNOWN_TARGET, "target not found for this Sims", id); - } + if (targetId.isEmpty()) { throw new RmesNotFoundException(ErrorCodes.SIMS_UNKNOWN_TARGET, "target not found for this Sims", id); } + switch(targetType) { + case Constants.OPERATION_UP : targetUri = RdfUtils.objectIRI(ObjectType.OPERATION, targetId); break; + case Constants.SERIES_UP : targetUri = RdfUtils.objectIRI(ObjectType.SERIES, targetId); break; + case Constants.INDICATOR_UP : targetUri = RdfUtils.objectIRI(ObjectType.INDICATOR, targetId); break; + default : break; + }; + /* Check rights */ if (!stampsRestrictionsService.canCreateSims(targetUri)) { throw new RmesUnauthorizedException(ErrorCodes.SIMS_CREATION_RIGHTS_DENIED, diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorPublication.java index c4c14cf66..7a5b7cfe7 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorPublication.java @@ -28,58 +28,52 @@ public class IndicatorPublication extends RdfService { static NotificationsContract notification = new RmesNotificationsImpl(); public void publishIndicator(String indicatorId) throws RmesException { - + Model model = new LinkedHashModel(); - Resource indicator= RdfUtils.objectIRI(ObjectType.INDICATOR,indicatorId); - - //TODO notify... + Resource indicator = RdfUtils.objectIRI(ObjectType.INDICATOR, indicatorId); + + // TODO notify... RepositoryConnection con = repoGestion.getConnection(); RepositoryResult statements = repoGestion.getStatements(con, indicator); - try { - try { - if (!statements.hasNext()) { - throw new RmesNotFoundException(ErrorCodes.INDICATOR_UNKNOWN_ID,"Indicator not found", indicatorId); + try { + if (!statements.hasNext()) { + throw new RmesNotFoundException(ErrorCodes.INDICATOR_UNKNOWN_ID, "Indicator not found", indicatorId); + } + while (statements.hasNext()) { + Statement st = statements.next(); + // Triplets that don't get published + if (st.getPredicate().toString().endsWith("isValidated") + || st.getPredicate().toString().endsWith("validationState")) { + // nothing, wouldn't copy this attr + } else if (st.getPredicate().toString().endsWith("wasGeneratedBy") + || st.getPredicate().toString().endsWith("seeAlso") + || st.getPredicate().toString().endsWith("replaces") + || st.getPredicate().toString().endsWith("isReplacedBy") + || st.getPredicate().toString().endsWith("contributor") + || st.getPredicate().toString().endsWith("publisher") + || st.getPredicate().toString().endsWith("accrualPeriodicity")) { + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), + PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), st.getContext()); } - while (statements.hasNext()) { - Statement st = statements.next(); - // Triplets that don't get published - if (st.getPredicate().toString().endsWith("isValidated") - || st.getPredicate().toString().endsWith("validationState")) { - // nothing, wouldn't copy this attr - }else if (st.getPredicate().toString().endsWith("wasGeneratedBy") || - st.getPredicate().toString().endsWith("seeAlso") || - st.getPredicate().toString().endsWith("replaces") || - st.getPredicate().toString().endsWith("isReplacedBy")|| - st.getPredicate().toString().endsWith("contributor") || - st.getPredicate().toString().endsWith("publisher") || - st.getPredicate().toString().endsWith("accrualPeriodicity") - ) { - model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), - st.getPredicate(), - PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), - st.getContext()); - } - // Literals - else { - model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), - st.getPredicate(), - st.getObject(), - st.getContext()); - } - // Other URI to transform : none + // Literals + else { + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), + st.getObject(), st.getContext()); } - } catch (RepositoryException e) { - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), Constants.REPOSITORY_EXCEPTION); + // Other URI to transform : none } - - } finally { + } catch (RepositoryException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), + Constants.REPOSITORY_EXCEPTION); + } + + finally { repoGestion.closeStatements(statements); } Resource indicatorToPublishRessource = PublicationUtils.tranformBaseURIToPublish(indicator); RepositoryPublication.publishResource(indicatorToPublishRessource, model, "indicator"); - + } - } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/PublicationUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/PublicationUtils.java index dbdeeb548..6048809d8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/PublicationUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/PublicationUtils.java @@ -15,10 +15,11 @@ private PublicationUtils() { } public static Resource tranformBaseURIToPublish(Resource resource) { + if (!resource.toString().contains(Config.BASE_URI_GESTION)) return resource; String newResource = resource.toString().replace(Config.BASE_URI_GESTION, Config.BASE_URI_PUBLICATION); return RdfUtils.toURI(newResource); } - + public static boolean stringEndsWithItemFromList(String inputStr, String[] items) { return Arrays.stream(items).parallel().anyMatch(inputStr::endsWith); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java index f0da0f2b8..acb84b056 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java @@ -123,13 +123,12 @@ public RepositoryResult getHasPartStatements(RepositoryConnection con return statements; } - public RepositoryResult getMetadataReportStatements(RepositoryConnection con, Resource object, - Resource context) throws RmesException { + public RepositoryResult getCompleteGraph(RepositoryConnection con, Resource context) throws RmesException { RepositoryResult statements = null; try { - statements = con. getStatements(null, SDMX_MM.METADATA_REPORT_PREDICATE, object, true, context); + statements = con. getStatements(null, null, null,context); //get the complete Graph } catch (RepositoryException e) { - throwsRmesException(e, "Failure get MetadataReport statements : " + object); + throwsRmesException(e, "Failure get following graph : " + context); } return statements; } From 357385ff07ed0c8a9860fcfd6a545d17e7e0b973 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 25 Jan 2021 13:41:58 +0100 Subject: [PATCH 073/243] Fix issue with territories --- .../request/geography/getGeoFeatures.ftlh | 17 +++++++++-------- .../request/geography/getGeoUriIfExists.ftlh | 8 +++++--- .../geography/getUnionOrDifferenceForUri.ftlh | 15 +++++++++------ 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/src/main/resources/request/geography/getGeoFeatures.ftlh b/src/main/resources/request/geography/getGeoFeatures.ftlh index 12932cc21..8a2f13237 100644 --- a/src/main/resources/request/geography/getGeoFeatures.ftlh +++ b/src/main/resources/request/geography/getGeoFeatures.ftlh @@ -1,24 +1,25 @@ -SELECT DISTINCT ?id ?uri ?labelLg1 ?labelLg2 ?code ?typeTerritory ?dateCreation ?dateSuppression ?hasComposition +SELECT DISTINCT ?id ?uri ?labelLg1 ?labelLg2 ?code ?typeTerritory + ?dateCreation ?dateSuppression ?hasComposition FROM <${COG_GRAPH}> FROM <${GEO_SIMS_GRAPH}> WHERE { - { ?uri igeo:nom ?labelLg1 ; - igeo:codeINSEE ?code . + { ?uri igeo:nom ?labelLg1 . + ?uri igeo:codeINSEE ?code . OPTIONAL { - ?evenementCreation igeo:creation ?uri ; - igeo:date ?dateCreation . + ?evntCreation igeo:creation ?uri . + ?evntCreation igeo:date ?dateCreation . } OPTIONAL { - ?evenementSuppression igeo:suppression ?uri ; - igeo:date ?dateSuppression. + ?evntSuppression igeo:suppression ?uri . + ?evntSuppression igeo:date ?dateSuppression. } OPTIONAL { ?uri a ?typeTerritoryUri . BIND(STRAFTER(str(?typeTerritoryUri),"geo#") AS ?typeTerritory) } - FILTER (!BOUND(?typeTerritory) || ?typeTerritory IN ("Region","Departement","Etat")) + FILTER (!BOUND(?typeTerritory) || ?typeTerritory IN ("Region","Departement")) } UNION diff --git a/src/main/resources/request/geography/getGeoUriIfExists.ftlh b/src/main/resources/request/geography/getGeoUriIfExists.ftlh index ead8cd8a5..20281ba13 100644 --- a/src/main/resources/request/geography/getGeoUriIfExists.ftlh +++ b/src/main/resources/request/geography/getGeoUriIfExists.ftlh @@ -2,8 +2,10 @@ SELECT ?uri FROM <${COG_GRAPH}> FROM <${GEO_SIMS_GRAPH}> WHERE { - ?uri igeo:nom|rdfs:label ?labelLg1 . - OPTIONAL{ ?uri igeo:codeINSEE ?code . - } + + ?uri (igeo:nom|rdfs:label|skos:prefLabel) ?labelLg1 . + OPTIONAL{ + ?uri igeo:codeINSEE ?code . + } FILTER(REPLACE( STR(?uri) , '(.*/)(\\w.+$)', '$2' ) = "${id}") } \ No newline at end of file diff --git a/src/main/resources/request/geography/getUnionOrDifferenceForUri.ftlh b/src/main/resources/request/geography/getUnionOrDifferenceForUri.ftlh index bbafa5623..90123215e 100644 --- a/src/main/resources/request/geography/getUnionOrDifferenceForUri.ftlh +++ b/src/main/resources/request/geography/getUnionOrDifferenceForUri.ftlh @@ -1,18 +1,21 @@ -SELECT DISTINCT ?uri ?labelLg1 ?labelLg2 ?code ?descriptionLg1 ?descriptionLg2 ?typeTerritory ?dateCreation ?dateSuppression ?hasComposition +SELECT DISTINCT ?uri ?labelLg1 ?code FROM <${COG_GRAPH}> FROM <${GEO_SIMS_GRAPH}> WHERE { <#if union> - ${uri} geo:union ?uri . + <${uri}> geo:union ?uri . <#else> - ${uri} geo:difference ?uri . + <${uri}> geo:difference ?uri . - ?uri igeo:nom ?labelLg1 ; - igeo:codeINSEE ?code . + + ?uri (igeo:nom|rdfs:label|skos:prefLabel) ?labelLg1 . + OPTIONAL{ + ?uri igeo:codeINSEE ?code . + } - } +} ORDER BY ?code \ No newline at end of file From 73a3293385052ce9369763ea3b52c24e3eeeb6ab Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 25 Jan 2021 16:26:25 +0100 Subject: [PATCH 074/243] Fix issue with triple that aren't delete when publishing a sims --- .../DocumentationPublication.java | 3 +-- .../rdf_utils/RepositoryPublication.java | 24 +++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java index 1b9c93b3d..4a3914ef2 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java @@ -74,8 +74,7 @@ public void publishSims(String simsId) throws RmesException { repoGestion.closeStatements(metadataReportStatements); } - Resource simsToPublishRessource = PublicationUtils.tranformBaseURIToPublish(sims); - RepositoryPublication.publishResource(simsToPublishRessource, model, "sims"); + RepositoryPublication.publishContext(graph, model, "sims"); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryPublication.java index 1f620d4a4..ddbf30e76 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryPublication.java @@ -154,14 +154,34 @@ private static void publishResource(Resource resource, Model model, String type, conn.remove(resource, null, null); conn.add(model); conn.close(); - logger.info("Publication of {} : {}" ,type, resource); + logger.info("Publication of Resource {} : {}" ,type, resource); } catch (RepositoryException e) { - logger.error("Publication of {} : {} {}" ,type, resource, FAILED); + logger.error("Publication of Resource {} : {} {}" ,type, resource, FAILED); logger.error("{} {} {}", CONNECTION_TO, repo, FAILED); throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), CONNECTION_TO + repo + FAILED); } } + + public static void publishContext(Resource graph, Model model, String type) throws RmesException { + publishContext(graph, model, type, REPOSITORY_PUBLICATION_INTERNE); + publishContext(graph, model, type, REPOSITORY_PUBLICATION); + } + + private static void publishContext(Resource context, Model model, String type, Repository repo) throws RmesException { + if (repo == null) {return ;} + try { + RepositoryConnection conn = repo.getConnection(); + conn.clear(context); + conn.add(model); + conn.close(); + logger.info("Publication of Graph {} : {}" ,type, context); + } catch (RepositoryException e) { + logger.error("Publication of Graph {} : {} {}" ,type, context, FAILED); + logger.error("{} {} {}", CONNECTION_TO, repo, FAILED); + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), CONNECTION_TO + repo + FAILED); + } + } private static void clearConceptLinks(Resource concept, RepositoryConnection conn) throws RmesException { From 5a1d3cfd3f56dcd7cfba9134ae1ec6ac8a83a073 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Wed, 27 Jan 2021 10:53:13 +0100 Subject: [PATCH 075/243] feat: add validationState when fetching structures --- .../request/structures/getMutualizedComponents.ftlh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/resources/request/structures/getMutualizedComponents.ftlh b/src/main/resources/request/structures/getMutualizedComponents.ftlh index f7ef7438f..10eb91f45 100644 --- a/src/main/resources/request/structures/getMutualizedComponents.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponents.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?identifiant ?labelLg1 ?concept ?type ?codeList +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?concept ?type ?codeList ?validationState FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { ?component dcterms:identifier ?id ; @@ -7,6 +7,10 @@ WHERE { rdfs:label ?labelLg1 . + OPTIONAL { + ?component insee:validationState ?validationState + } . + OPTIONAL { ?component qb:codeList ?codeList } . From 744020c0ac6df648d55476efbc2abe939b9b8aad Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Wed, 27 Jan 2021 11:31:14 +0100 Subject: [PATCH 076/243] feat: add creator and validationState for advanced search --- .../request/structures/getMutualizedComponents.ftlh | 6 +++++- src/main/resources/request/structures/getStructures.ftlh | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/main/resources/request/structures/getMutualizedComponents.ftlh b/src/main/resources/request/structures/getMutualizedComponents.ftlh index 10eb91f45..61a01cc08 100644 --- a/src/main/resources/request/structures/getMutualizedComponents.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponents.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?identifiant ?labelLg1 ?concept ?type ?codeList ?validationState +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?concept ?type ?codeList ?validationState ?creator FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { ?component dcterms:identifier ?id ; @@ -7,6 +7,10 @@ WHERE { rdfs:label ?labelLg1 . + OPTIONAL { + ?component dc:creator ?creator . + } . + OPTIONAL { ?component insee:validationState ?validationState } . diff --git a/src/main/resources/request/structures/getStructures.ftlh b/src/main/resources/request/structures/getStructures.ftlh index 4e388050f..417514531 100644 --- a/src/main/resources/request/structures/getStructures.ftlh +++ b/src/main/resources/request/structures/getStructures.ftlh @@ -1,8 +1,15 @@ -SELECT DISTINCT ?id ?labelLg1 +SELECT DISTINCT ?id ?labelLg1 ?creator ?validationState FROM <${STRUCTURES_GRAPH}> WHERE { ?component dcterms:identifier ?id ; rdfs:label ?labelLg1 . + OPTIONAL { + ?component dc:creator ?creator . + } . + + OPTIONAL { + ?component insee:validationState ?validationState + } . FILTER (lang(?labelLg1) = '${LG1}') . } From 96f8ee9cb2dc20ee7097ee2e2e2aee5e0c10bd61 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 27 Jan 2021 13:17:40 +0100 Subject: [PATCH 077/243] Fix issue with multiple doc --- .../operations/documentations/documents/getDocumentQuery.ftlh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh b/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh index fd3fb98de..e313f6175 100644 --- a/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh +++ b/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh @@ -1,4 +1,4 @@ -SELECT ?uri ?url ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?updatedDate ?lang +SELECT distinct ?uri ?url ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?updatedDate ?lang FROM <${DOCUMENTS_GRAPH}> <#if idSims != ""> @@ -11,7 +11,7 @@ WHERE { ?text rdf:type dcmitype:Text . ?text insee:additionalMaterial ?uri . <#if LANG != ""> - FILTER(EXISTS{?text dcterms:language <${LANG}>}) + ?text dcterms:language <${LANG}> . From 8c60f060dd96ad9104f7398ac1aad0263ff361f5 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 28 Jan 2021 09:57:20 +0100 Subject: [PATCH 078/243] Remove warnings --- .../rmes/bauhaus_services/Constants.java | 1 - .../concepts/ConceptsImpl.java | 5 ++-- .../concepts/concepts/ConceptsUtils.java | 5 ++-- .../publication/ConceptsPublication.java | 13 ++++----- .../DocumentationPublication.java | 5 ++-- .../documentations/DocumentationsUtils.java | 14 ---------- .../documents/DocumentsUtils.java | 14 ---------- .../families/FamilyPublication.java | 12 +++++---- .../famopeserind_utils/FamOpeSerIndUtils.java | 3 ++- .../indicators/IndicatorPublication.java | 21 ++++++++------- .../indicators/IndicatorsUtils.java | 2 +- .../operations/OperationPublication.java | 5 ++-- .../operations/OperationsUtils.java | 16 ----------- .../operations/series/SeriesPublication.java | 27 ++++++++++--------- .../operations/series/SeriesUtils.java | 9 +------ .../OrganizationsServiceImpl.java | 18 ------------- .../rdf_utils/RepositoryGestion.java | 1 - .../stamps/StampsRestrictionServiceImpl.java | 13 ++++----- .../structures/impl/StructureImpl.java | 14 ++++------ .../utils/StructureComponentUtils.java | 25 ++++++++++------- .../structures/utils/StructureUtils.java | 15 +++++------ .../operations/documentations/Document.java | 7 ++--- .../insee/rmes/persistance/ontologies/QB.java | 3 ++- .../sparql_queries/links/LinksQueries.java | 3 ++- 24 files changed, 98 insertions(+), 153 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index c16545545..a8546cae5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -64,7 +64,6 @@ public class Constants { public static final String OUTPUT = "output"; /*P*/ - //public static final String PARAGRAPH = "

"; moved to class XhtmlTags public static final String PREF_LABEL_LG = "prefLabelLg"; public static final String PREF_LABEL_LG1 = "prefLabelLg1"; public static final String PREF_LABEL_LG2 = "prefLabelLg2"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java index 1770ba454..7fb23d460 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java @@ -9,6 +9,7 @@ import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.glassfish.jersey.media.multipart.ContentDisposition; import org.json.JSONArray; import org.json.JSONObject; @@ -84,7 +85,7 @@ public String getConceptByID(String id) throws RmesException{ @Override public String getRelatedConcepts(String id) throws RmesException{ - String uriConcept = RdfUtils.objectIRI(ObjectType.CONCEPT,id).toString(); + String uriConcept = ((SimpleIRI)RdfUtils.objectIRI(ObjectType.CONCEPT,id)).toString(); JSONArray resQuery = conceptsUtils.getRelatedConcepts(uriConcept); return QueryUtils.correctEmptyGroupConcat(resQuery.toString()); } @@ -97,7 +98,7 @@ public String getRelatedConcepts(String id) throws RmesException{ */ @Override public String deleteConcept(String id) throws RmesException { - String uriConcept = RdfUtils.objectIRI(ObjectType.CONCEPT,id).toString(); + String uriConcept = ((SimpleIRI)RdfUtils.objectIRI(ObjectType.CONCEPT,id)).toString(); JSONArray graphArray = conceptsUtils.getGraphsWithConcept(uriConcept); /* check concept isn't used in several graphs */ diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/concepts/ConceptsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/concepts/ConceptsUtils.java index 9b78ca521..37855f8fc 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/concepts/ConceptsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/concepts/ConceptsUtils.java @@ -13,6 +13,7 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.model.vocabulary.DC; import org.eclipse.rdf4j.model.vocabulary.DCTERMS; import org.eclipse.rdf4j.model.vocabulary.RDF; @@ -199,9 +200,9 @@ public JSONArray getRelatedConcepts(String id) throws RmesException{ } public Response.Status deleteConcept(String id) throws RmesException{ - Response.Status result = repoGestion.executeUpdate(ConceptsQueries.deleteConcept(RdfUtils.objectIRI(ObjectType.CONCEPT,id).toString(),RdfUtils.conceptGraph().toString())); + Response.Status result = repoGestion.executeUpdate(ConceptsQueries.deleteConcept(((SimpleIRI)RdfUtils.objectIRI(ObjectType.CONCEPT,id)).toString(),RdfUtils.conceptGraph().toString())); if (result.equals(Status.OK)) { - result = RepositoryPublication.executeUpdate(ConceptsQueries.deleteConcept(RdfUtils.objectIRIPublication(ObjectType.CONCEPT,id).toString(),RdfUtils.conceptGraph().toString())); + result = RepositoryPublication.executeUpdate(ConceptsQueries.deleteConcept(((SimpleIRI)RdfUtils.objectIRIPublication(ObjectType.CONCEPT,id)).toString(),RdfUtils.conceptGraph().toString())); } return result; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/publication/ConceptsPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/publication/ConceptsPublication.java index 4fef058a3..dfa15a689 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/publication/ConceptsPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/publication/ConceptsPublication.java @@ -9,6 +9,7 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.model.vocabulary.SKOS; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; @@ -60,7 +61,7 @@ public void publishConcepts(JSONArray conceptsToPublish) throws RmesException { Statement st = statements.next(); subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); graph = st.getContext(); - String predicat = st.getPredicate().toString(); + String predicat = ((SimpleIRI)st.getPredicate()).toString(); // Notes, transform URI and get attributs if (PublicationUtils.stringEndsWithItemFromList(predicat,notes)) { model.add(subject, st.getPredicate(), PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), @@ -140,7 +141,7 @@ public void publishExplanatoryNotes(RepositoryConnection con, Resource note, Mod Resource graph = null; while (statements.hasNext()) { Statement st = statements.next(); - String predicat = st.getPredicate().toString(); + String predicat = ((SimpleIRI)st.getPredicate()).toString(); subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); graph = st.getContext(); if (predicat.endsWith("conceptVersion")) { @@ -203,12 +204,12 @@ public void publishCollection(JSONArray collectionsToValidate) throws RmesExcept while (statements.hasNext()) { Statement st = statements.next(); // Other URI to transform - if (st.getPredicate().toString().endsWith("member")) { + if (((SimpleIRI)st.getPredicate()).toString().endsWith("member")) { model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), st.getContext()); - } else if (st.getPredicate().toString().endsWith("isValidated") - || st.getPredicate().toString().endsWith(Constants.CREATOR) - || st.getPredicate().toString().endsWith("contributor")) { + } else if (((SimpleIRI)st.getPredicate()).toString().endsWith("isValidated") + || ((SimpleIRI)st.getPredicate()).toString().endsWith(Constants.CREATOR) + || ((SimpleIRI)st.getPredicate()).toString().endsWith("contributor")) { // nothing, wouldn't copy this attr } // Literals diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java index 4a3914ef2..7564cfe9b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java @@ -7,6 +7,7 @@ import org.eclipse.rdf4j.model.Statement; import org.eclipse.rdf4j.model.Value; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.repository.RepositoryConnection; import org.eclipse.rdf4j.repository.RepositoryException; import org.eclipse.rdf4j.repository.RepositoryResult; @@ -14,7 +15,6 @@ import org.springframework.stereotype.Repository; import fr.insee.rmes.bauhaus_services.Constants; -import fr.insee.rmes.bauhaus_services.rdf_utils.ObjectType; import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; @@ -37,7 +37,6 @@ public class DocumentationPublication extends RdfService { public void publishSims(String simsId) throws RmesException { Model model = new LinkedHashModel(); - Resource sims = RdfUtils.objectIRI(ObjectType.DOCUMENTATION, simsId); Resource graph = RdfUtils.simsGraph(simsId); // TODO notify... @@ -51,7 +50,7 @@ public void publishSims(String simsId) throws RmesException { while (metadataReportStatements.hasNext()) { Statement st = metadataReportStatements.next(); // Triplets that don't get published - if (st.getPredicate().toString().endsWith("validationState")) { + if (((SimpleIRI)st.getPredicate()).toString().endsWith("validationState")) { // nothing, wouldn't copy this attr } else { Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index f85f4af01..e42c001c2 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -240,20 +240,6 @@ public String setMetadataReport(String id, String body, boolean create) throws R } - private void addTarget(Documentation sims) throws RmesException { - if (sims.getIdTarget()==null) { - String[] target = getDocumentationTargetTypeAndId(sims.getId()); - String targetType = target[0]; - String targetId = target[1]; - switch(targetType) { - case Constants.INDICATOR_UP : sims.setIdIndicator(targetId); break; - case Constants.OPERATION_UP : sims.setIdOperation(targetId); break; - case Constants.SERIES_UP : sims.setIdSeries(targetId); break; - default: break; - } - } - } - private String getDocumentationValidationStatus(String id) throws RmesException { try { return repoGestion.getResponseAsObject(DocumentationsQueries.getPublicationState(id)).getString("state"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index cfed8e3eb..eca3cc7d5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -301,20 +301,6 @@ private void checkDocumentReference(String docId, String uri) throws RmesExcepti } } - // Check that the document is not referred to by any other sims than allowedUri - private void checkDocumentReferences(String docId, String uri, String allowedUri) throws RmesException { - JSONArray jsonResultat = repoGestion.getResponseAsArray(DocumentsQueries.getLinksToDocumentQuery(docId)); - if (jsonResultat.length() > 0) { - for(int i=0; i publisher=series.getPublishers(); - // if (publisher!= null) { - // for(String publ : publisher) { - // RdfUtils.addTripleString(seriesURI, DCTERMS.PUBLISHER, publ, model, RdfUtils.operationsGraph()); - // } - // } - List creators=series.getCreators(); if (creators!=null) { for (String creator : creators) { @@ -223,7 +216,7 @@ private void createRdfSeries(Series series, IRI familyURI, ValidationStatus newS } } - // //Organismes responsables + //Organismes responsables addOperationLinksOrganization(series.getPublishers(),DCTERMS.PUBLISHER, model, seriesURI); //partenaires diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/organizations/OrganizationsServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/organizations/OrganizationsServiceImpl.java index 32abef8e6..f8d8d6d42 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/organizations/OrganizationsServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/organizations/OrganizationsServiceImpl.java @@ -1,6 +1,5 @@ package fr.insee.rmes.bauhaus_services.organizations; -import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -12,9 +11,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; - import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.OrganizationsService; import fr.insee.rmes.bauhaus_services.operations.famopeserind_utils.FamOpeSerIndUtils; @@ -75,18 +71,4 @@ public List getOrganizations() throws RmesException { return result; } - private Organization buildOrganizationFromJson(JSONObject organizationJson) throws RmesException { - ObjectMapper mapper = new ObjectMapper(); - mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); - - Organization organization = new Organization(); - try { - organization = mapper.readValue(organizationJson.toString(), Organization.class); - } catch (IOException e) { - logger.error(e.getMessage()); - } - return organization; - } - } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java index acb84b056..f00d665ab 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java @@ -30,7 +30,6 @@ import fr.insee.rmes.persistance.ontologies.EVOC; import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.ontologies.QB; -import fr.insee.rmes.persistance.ontologies.SDMX_MM; @Component @DependsOn("AppContext") diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java index 9c51f256f..cf243375d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java @@ -4,6 +4,7 @@ import java.util.List; import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.security.core.Authentication; @@ -30,7 +31,7 @@ public boolean isConceptOrCollectionOwner(IRI uri) throws RmesException { if (isAdmin(user)) { return true; } - String uriAsString = "<" + uri.toString() + ">"; + String uriAsString = "<" + ((SimpleIRI)uri).toString() + ">"; JSONObject owner = repoGestion.getResponseAsObject(ConceptsQueries.getOwner(uriAsString)); Boolean isConceptOwner = true; if (!owner.getString(Constants.OWNER).equals(user.getStamp())) { @@ -46,7 +47,7 @@ public boolean isConceptsOrCollectionsOwner(List uris) throws RmesException return true; } StringBuilder sb = new StringBuilder(); - uris.forEach(u -> sb.append("<" + u.toString() + "> ")); + uris.forEach(u -> sb.append("<" + ((SimpleIRI)u).toString() + "> ")); String uriAsString = sb.toString(); JSONArray owners = repoGestion.getResponseAsArray(ConceptsQueries.getOwner(uriAsString)); Boolean isConceptsOwner = true; @@ -154,7 +155,7 @@ private boolean isCnis(User user) { private boolean isConceptOwner(List uris) throws RmesException { User user = getUser(); StringBuilder sb = new StringBuilder(); - uris.forEach(u -> sb.append("<" + u.toString() + "> ")); + uris.forEach(u -> sb.append("<" + ((SimpleIRI)u).toString() + "> ")); String uriAsString = sb.toString(); JSONArray owners = repoGestion.getResponseAsArray(ConceptsQueries.getOwner(uriAsString)); Boolean isConceptOwner = true; @@ -169,7 +170,7 @@ private boolean isConceptOwner(List uris) throws RmesException { private boolean isConceptManager(List uris) throws RmesException { User user = getUser(); StringBuilder sb = new StringBuilder(); - uris.forEach(u -> sb.append("<" + u.toString() + "> ")); + uris.forEach(u -> sb.append("<" + ((SimpleIRI)u).toString() + "> ")); String uriAsString = sb.toString(); JSONArray managers = repoGestion.getResponseAsArray(ConceptsQueries.getManager(uriAsString)); Boolean isConceptManager = true; @@ -192,7 +193,7 @@ private boolean isSeriesManager(List uris) throws RmesException { public boolean isSeriesManager(IRI uri) throws RmesException { User user = getUser(); - JSONArray managers = repoGestion.getResponseAsArray(SeriesQueries.getCreatorsBySeriesUri(uri.toString())); + JSONArray managers = repoGestion.getResponseAsArray(SeriesQueries.getCreatorsBySeriesUri(((SimpleIRI)uri).toString())); Boolean isSeriesManager = false; for (int i = 0; i < managers.length(); i++) { if (!managers.getJSONObject(i).getString(Constants.CREATORS).equals(user.getStamp())) { @@ -205,7 +206,7 @@ public boolean isSeriesManager(IRI uri) throws RmesException { private boolean isIndicatorManager(List uris) throws RmesException { User user = getUser(); StringBuilder sb = new StringBuilder(); - uris.forEach(u -> sb.append("<" + u.toString() + "> ")); + uris.forEach(u -> sb.append("<" + ((SimpleIRI)u).toString() + "> ")); String uriAsString = sb.toString(); JSONArray creators = repoGestion.getResponseAsArray(IndicatorsQueries.getCreatorsByIndicatorUri(uriAsString)); Boolean isIndicatorManager = false; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java index 789d47663..f5ebec293 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java @@ -1,19 +1,15 @@ package fr.insee.rmes.bauhaus_services.structures.impl; -import fr.insee.rmes.bauhaus_services.CodeListService; -import fr.insee.rmes.bauhaus_services.Constants; -import fr.insee.rmes.bauhaus_services.concepts.concepts.ConceptsUtils; -import fr.insee.rmes.persistance.ontologies.QB; -import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; - import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import fr.insee.rmes.bauhaus_services.CodeListService; +import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.structures.StructureService; import fr.insee.rmes.bauhaus_services.structures.utils.StructureUtils; @@ -75,13 +71,13 @@ public String getStructureByIdWithDetails(String id) throws RmesException { // We first have to rename the type property String type = (String) component.get("type"); - if(type.equalsIgnoreCase(QB.ATTRIBUTE_PROPERTY.toString())){ + if(type.equalsIgnoreCase(((SimpleIRI)QB.ATTRIBUTE_PROPERTY).toString())){ component.put("type", "attribute"); } - if(type.equalsIgnoreCase(QB.MEASURE_PROPERTY.toString())){ + if(type.equalsIgnoreCase(((SimpleIRI)QB.MEASURE_PROPERTY).toString())){ component.put("type", "measure"); } - if(type.equalsIgnoreCase(QB.DIMENSION_PROPERTY.toString())){ + if(type.equalsIgnoreCase(((SimpleIRI)QB.DIMENSION_PROPERTY).toString())){ component.put("type", "dimension"); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 159796bf8..cbe4b2b15 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -13,6 +13,7 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.model.vocabulary.DC; import org.eclipse.rdf4j.model.vocabulary.DCTERMS; import org.eclipse.rdf4j.model.vocabulary.RDF; @@ -60,7 +61,7 @@ private void addStructures(JSONObject response, String id) throws RmesException private void addCodeListRange(JSONObject response) { if (response.has("codeList")) { - response.put("range", INSEE.CODELIST.toString()); + response.put("range", ((SimpleIRI)INSEE.CODELIST).toString()); } } @@ -131,9 +132,9 @@ private void createRDFForComponent(MutualizedComponent component, ValidationStat } String type = component.getType(); - if (type.equals(QB.ATTRIBUTE_PROPERTY.toString())) { + if (type.equals(((SimpleIRI)QB.ATTRIBUTE_PROPERTY).toString())) { createRDFForComponent(component, QB.ATTRIBUTE_PROPERTY, RdfUtils.structureComponentAttributeIRI(component.getId()), status); - } else if (type.equals(QB.MEASURE_PROPERTY.toString())) { + } else if (type.equals(((SimpleIRI)QB.MEASURE_PROPERTY).toString())) { createRDFForComponent(component, QB.MEASURE_PROPERTY, RdfUtils.structureComponentMeasureIRI(component.getId()), status); } else { createRDFForComponent(component, QB.DIMENSION_PROPERTY, RdfUtils.structureComponentDimensionIRI(component.getId()), status); @@ -162,7 +163,7 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou RdfUtils.addTripleUri(componentURI, QB.CONCEPT, INSEE.STRUCTURE_CONCEPT + component.getConcept(), model, graph); - if (component.getRange() != null && component.getRange().equals(INSEE.CODELIST.toString())) { + if (component.getRange() != null && component.getRange().equals(((SimpleIRI)INSEE.CODELIST).toString())) { RdfUtils.addTripleUri(componentURI, RDFS.RANGE, Config.CODE_LIST_BASE_URI + "/" + component.getCodeList() + "/Class", model, graph); } else { RdfUtils.addTripleUri(componentURI, RDFS.RANGE, component.getRange(), model, graph); @@ -176,10 +177,10 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou } private String generateNextId(String type) throws RmesException { - if (type.equals(QB.ATTRIBUTE_PROPERTY.toString())) { + if (type.equals(((SimpleIRI)QB.ATTRIBUTE_PROPERTY).toString())) { return generateNextId("a", "attribut", QB.ATTRIBUTE_PROPERTY); } - if (type.equals(QB.MEASURE_PROPERTY.toString())) { + if (type.equals(((SimpleIRI)QB.MEASURE_PROPERTY).toString())) { return generateNextId("m", "mesure", QB.MEASURE_PROPERTY); } return generateNextId("d", "dimension", QB.DIMENSION_PROPERTY); @@ -189,7 +190,7 @@ private String generateNextId(String type) throws RmesException { private String generateNextId(String prefix, String namespaceSuffix, IRI type) throws RmesException { logger.info("Generate id for component"); - JSONObject json = repoGestion.getResponseAsObject(StructureQueries.lastId(namespaceSuffix, type.toString())); + JSONObject json = repoGestion.getResponseAsObject(StructureQueries.lastId(namespaceSuffix, ((SimpleIRI)type).toString())); logger.debug("JSON when generating the id of a component : {}", json); if (json.length() == 0) { return prefix + "1000"; @@ -240,19 +241,23 @@ public void deleteComponent(JSONObject component, String id, String type) throws boolean findPublishedStructure = false; for (int i = 0; i < structures.length(); i++) { JSONObject structure = (JSONObject) structures.get(i); - if(state.equals(VALIDATED) || state.equals(MODIFIED)){ + //FIXME begin + /* I make a proposal, but I don't really know what you want to do here */ + String stateStructure = structure.getString("validationState"); //update state to test foreach + if(stateStructure.equals(VALIDATED) || stateStructure.equals(MODIFIED)){ findPublishedStructure = true; break; } + //FIXME end } if(findPublishedStructure){ throw new RmesException(ErrorCodes.COMPONENT_FORBIDDEN_DELETE, "You cannot delete a validated component", new JSONArray()); } IRI componentIri; - if (type.equalsIgnoreCase(QB.ATTRIBUTE_PROPERTY.toString())) { + if (type.equalsIgnoreCase(((SimpleIRI)QB.ATTRIBUTE_PROPERTY).toString())) { componentIri = RdfUtils.structureComponentAttributeIRI(id); - } else if (type.equalsIgnoreCase(QB.MEASURE_PROPERTY.toString())) { + } else if (type.equalsIgnoreCase(((SimpleIRI)QB.MEASURE_PROPERTY).toString())) { componentIri = RdfUtils.structureComponentMeasureIRI(id); } else { componentIri = RdfUtils.structureComponentDimensionIRI(id); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index f14ccda38..c9f20c5d0 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -7,10 +7,6 @@ import javax.ws.rs.BadRequestException; -import fr.insee.rmes.exceptions.ErrorCodes; -import fr.insee.rmes.exceptions.RmesUnauthorizedException; -import fr.insee.rmes.model.ValidationStatus; -import fr.insee.rmes.persistance.ontologies.INSEE; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -18,6 +14,7 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.model.vocabulary.DC; import org.eclipse.rdf4j.model.vocabulary.DCTERMS; import org.eclipse.rdf4j.model.vocabulary.RDF; @@ -34,7 +31,9 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; import fr.insee.rmes.config.Config; +import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.exceptions.RmesUnauthorizedException; import fr.insee.rmes.model.ValidationStatus; import fr.insee.rmes.model.structures.ComponentDefinition; import fr.insee.rmes.model.structures.MutualizedComponent; @@ -273,7 +272,7 @@ public void createRdfComponentSpecification(IRI structureIRI, Model model, Compo IRI componentSpecificationIRI; - componentSpecificationIRI = getComponentDefinitionIRI(structureIRI.toString(), componentDefinition.getId()); + componentSpecificationIRI = getComponentDefinitionIRI(((SimpleIRI)structureIRI).toString(), componentDefinition.getId()); model.add(structureIRI, QB.COMPONENT, componentSpecificationIRI, graph); @@ -303,15 +302,15 @@ public void createRdfComponentSpecification(IRI structureIRI, Model model, Compo model.add(componentSpecificationIRI, QB.COMPONENT_ATTACHMENT, attachmentIRI, graph); } MutualizedComponent component = componentDefinition.getComponent(); - if (component.getType().equals(QB.DIMENSION_PROPERTY.toString())) { + if (component.getType().equals(((SimpleIRI)QB.DIMENSION_PROPERTY).toString())) { model.add(componentSpecificationIRI, QB.DIMENSION, getDimensionIRI(component.getId()), graph); } - if (component.getType().equals(QB.ATTRIBUTE_PROPERTY.toString())) { + if (component.getType().equals(((SimpleIRI)QB.ATTRIBUTE_PROPERTY).toString())) { model.add(componentSpecificationIRI, QB.ATTRIBUTE, getAttributeIRI(component.getId()), graph); model.add(componentSpecificationIRI, QB.COMPONENT_REQUIRED, RdfUtils.setLiteralBoolean(componentDefinition.getRequired()), graph); } - if (component.getType().equals(QB.MEASURE_PROPERTY.toString())) { + if (component.getType().equals(((SimpleIRI)QB.MEASURE_PROPERTY).toString())) { model.add(componentSpecificationIRI, QB.MEASURE, getMeasureIRI(component.getId()), graph); } } diff --git a/src/main/java/fr/insee/rmes/model/operations/documentations/Document.java b/src/main/java/fr/insee/rmes/model/operations/documentations/Document.java index d003f4746..7a12f289d 100644 --- a/src/main/java/fr/insee/rmes/model/operations/documentations/Document.java +++ b/src/main/java/fr/insee/rmes/model/operations/documentations/Document.java @@ -1,6 +1,7 @@ package fr.insee.rmes.model.operations.documentations; import org.apache.commons.lang3.StringUtils; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import com.fasterxml.jackson.annotation.JsonProperty; @@ -23,12 +24,12 @@ public Document() { } public Document(String id) { - this.uri = RdfUtils.documentIRI(id).toString(); + this.uri = ((SimpleIRI)RdfUtils.documentIRI(id)).toString(); } public Document(String id, boolean isLink) { - if (isLink) {this.uri = RdfUtils.linkIRI(id).toString();} - else {this.uri = RdfUtils.documentIRI(id).toString();} + if (isLink) {this.uri = ((SimpleIRI)RdfUtils.linkIRI(id)).toString();} + else {this.uri = ((SimpleIRI)RdfUtils.documentIRI(id)).toString();} } public String getLabelLg1() { diff --git a/src/main/java/fr/insee/rmes/persistance/ontologies/QB.java b/src/main/java/fr/insee/rmes/persistance/ontologies/QB.java index 444a69527..e3bdff7f0 100644 --- a/src/main/java/fr/insee/rmes/persistance/ontologies/QB.java +++ b/src/main/java/fr/insee/rmes/persistance/ontologies/QB.java @@ -3,6 +3,7 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Namespace; import org.eclipse.rdf4j.model.ValueFactory; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.model.impl.SimpleNamespace; import org.eclipse.rdf4j.model.impl.SimpleValueFactory; @@ -66,7 +67,7 @@ public class QB { } public static String[] getURIForComponent(){ - return new String[]{MEASURE_PROPERTY.toString(), ATTRIBUTE_PROPERTY.toString(), DIMENSION_PROPERTY.toString()}; + return new String[]{((SimpleIRI)MEASURE_PROPERTY).toString(), ((SimpleIRI)ATTRIBUTE_PROPERTY).toString(), ((SimpleIRI)DIMENSION_PROPERTY).toString()}; } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/links/LinksQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/links/LinksQueries.java index c4b779229..448921bf7 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/links/LinksQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/links/LinksQueries.java @@ -1,6 +1,7 @@ package fr.insee.rmes.persistance.sparql_queries.links; import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import fr.insee.rmes.config.Config; @@ -9,7 +10,7 @@ public class LinksQueries { public static String getLinksToDelete(IRI conceptURI) { return "SELECT ?concept \n" + "WHERE { GRAPH <"+Config.CONCEPTS_GRAPH+"> { \n" - + "?concept ?b <" + conceptURI.toString() + "> \n" + + "?concept ?b <" + ((SimpleIRI)conceptURI).toString() + "> \n" + " }}"; } From 20000cb4a944e0c210933773b22033f73153bc61 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 28 Jan 2021 10:08:37 +0100 Subject: [PATCH 079/243] Fix issue with encoding < --- pom.xml | 7 +++++++ .../java/fr/insee/rmes/utils/XMLUtils.java | 19 ++++++++++++++----- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/pom.xml b/pom.xml index 049d1a9d3..e992effd2 100644 --- a/pom.xml +++ b/pom.xml @@ -445,6 +445,13 @@ flexmark-all 0.50.42
+ + + + org.apache.commons + commons-text + 1.9 + diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 8dca5ad6f..58461f5cc 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -3,6 +3,7 @@ import java.io.StringReader; import java.io.StringWriter; import java.io.Writer; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; import java.util.regex.Matcher; @@ -20,6 +21,7 @@ import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; +import org.apache.commons.text.StringEscapeUtils; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.w3c.dom.Document; @@ -40,6 +42,8 @@ public class XMLUtils { public static final String toString(Document xml) throws TransformerFactoryConfigurationError, TransformerException { TransformerFactory tf = TransformerFactory.newInstance(); + tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); + tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); Transformer transformer = tf.newTransformer(); Writer out = new StringWriter(); transformer.transform(new DOMSource(xml), new StreamResult(out)); @@ -73,7 +77,7 @@ public static String produceResponse(Object obj, String header) { catch (Exception e) { logger.error(e.getMessage()); } - return response; + return encodeXml(response); } public static String produceXMLResponse(Object obj) { @@ -85,7 +89,7 @@ public static String produceXMLResponse(Object obj) { catch (Exception e) { logger.error(e.getMessage()); } - return response; + return encodeXml(response); } public static Document convertStringToDocument(String xmlStr) { @@ -97,8 +101,7 @@ public static Document convertStringToDocument(String xmlStr) { try { builder = factory.newDocumentBuilder(); - Document doc = builder.parse( new InputSource( new StringReader( xmlStr ) ) ); - return doc; + return builder.parse( new InputSource( new StringReader( xmlStr ) ) ); } catch (Exception e) { logger.error(e.getMessage()); } @@ -107,12 +110,18 @@ public static Document convertStringToDocument(String xmlStr) { public static List getTagValues(String text, String tag) { final Pattern TAG_REGEX = Pattern.compile("<"+tag+">(.+?)", Pattern.DOTALL); - final List tagValues = new ArrayList(); + final List tagValues = new ArrayList<>(); final Matcher matcher = TAG_REGEX.matcher(text); while (matcher.find()) { tagValues.add(matcher.group(1)); } return tagValues; } + + private static String encodeXml(String response) { + String ret = StringEscapeUtils.unescapeXml(response); + ret = StringEscapeUtils.unescapeHtml4(ret); + return new String(ret.getBytes(), StandardCharsets.UTF_8); + } } From e496cf4c6b44cd6b0a1f1a313482acb738d3856f Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 28 Jan 2021 10:34:18 +0100 Subject: [PATCH 080/243] Add sonar --- pom.xml | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/pom.xml b/pom.xml index e992effd2..08a08462d 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,12 @@ 2.13.3 5.7.0 UTF-8 + + + jacoco + reuseReports + java + @@ -493,12 +499,19 @@ + + + org.sonarsource.scanner.maven + sonar-maven-plugin + 3.7.0.1746 + + org.jacoco jacoco-maven-plugin - 0.8.4 + 0.8.6 @@ -506,15 +519,11 @@ - jacoco-report + jacoco-site test report - - - target/jacoco-report - From 266f42520eb978e750be1e8d4f521ca155c4f0ae Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 1 Feb 2021 10:24:47 +0100 Subject: [PATCH 081/243] Improve unit test --- .../documentations/DocumentationsUtilsTest.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java b/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java index 6a4f5d330..9f409e76d 100644 --- a/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java +++ b/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java @@ -1,19 +1,21 @@ package fr.insee.rmes.bauhaus_services.operations.documentations; import static org.junit.jupiter.api.Assertions.fail; +import static org.mockito.Mockito.when; import org.json.JSONObject; import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.mockito.Spy; import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryGestion; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.model.operations.documentations.Documentation; +import fr.insee.rmes.model.operations.documentations.DocumentationRubric; public class DocumentationsUtilsTest { @@ -21,6 +23,9 @@ public class DocumentationsUtilsTest { @Spy private DocumentationsUtils documentationsUtils; + @Mock + protected DocumentationsRubricsUtils mockDocumentationsRubricsUtils; + @Mock private RepositoryGestion repoGestion; @@ -29,9 +34,12 @@ public void init() { MockitoAnnotations.initMocks(this); } @Test - @Disabled + //@Disabled void buildDocumentationFromJsonTest() throws RmesException{ - // Attention, mocker les méthodes de buildDocumentationFromJson qui font appel à la base rdf + + // Mocker les méthodes de buildDocumentationFromJson qui font appel à d'autres classes + when(mockDocumentationsRubricsUtils.buildRubricFromJson(Mockito.any())).thenReturn(new DocumentationRubric()); + String source="{\"rubrics\":[],\"idSeries\":\"\",\"labelLg2\":\"Metadata report 9999\",\"labelLg1\":\"Rapport de métadonnées 9999\",\"idOperation\":\"s8888\",\"idIndicator\":\"\",\"id\":\"9999\"}"; JSONObject jsonDocumentation = new JSONObject(source); Documentation sims = documentationsUtils.buildDocumentationFromJson(jsonDocumentation); From 4171f257ebed4e019cae6e7cc810b449072534fa Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 1 Feb 2021 11:51:42 +0100 Subject: [PATCH 082/243] Fix bug for XSLT --- src/main/java/fr/insee/rmes/utils/XMLUtils.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 58461f5cc..72bfdd053 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -119,8 +119,9 @@ public static List getTagValues(String text, String tag) { } private static String encodeXml(String response) { - String ret = StringEscapeUtils.unescapeXml(response); - ret = StringEscapeUtils.unescapeHtml4(ret); + String ret = StringEscapeUtils.unescapeHtml4(response); + ret = StringEscapeUtils.unescapeXml(ret); + ret = ret.replace("&[^amp;]", "&"); return new String(ret.getBytes(), StandardCharsets.UTF_8); } From 818cdb778529582f033522d0e9e373afafdff436 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 1 Feb 2021 11:52:06 +0100 Subject: [PATCH 083/243] Update for sonar coverage --- pom.xml | 92 ++++++++++++++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 84 insertions(+), 8 deletions(-) diff --git a/pom.xml b/pom.xml index 08a08462d..0772cb0e5 100644 --- a/pom.xml +++ b/pom.xml @@ -47,9 +47,18 @@ UTF-8 + src/main/java/fr/insee/rmes/queries/**/*, + src/main/java/fr/insee/rmes/modeles/**/* + ${project.groupId}:${project.artifactId} + jacoco jacoco reuseReports java + ${project.basedir}/../target/jacoco.exec + 0.8.5 + 3.7.0.1746 + -Xms256m -Xmx512m -XX:MaxPermSize=128m -ea -Dfile.encoding=UTF-8 + UTF-8 @@ -501,17 +510,15 @@ - org.sonarsource.scanner.maven - sonar-maven-plugin - 3.7.0.1746 - + org.sonarsource.scanner.maven + sonar-maven-plugin + - org.jacoco + org.jacoco jacoco-maven-plugin - 0.8.6 @@ -522,12 +529,81 @@ jacoco-site test - report + report - + + + + + + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + junit:junit + UTF-8 + UTF-8 + UTF-8 + + + + + + + test + test + + test + + + false + + **/*Test.java + + UTF-8 + + + + + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${version.maven-sonar} + + + + + + org.jacoco + jacoco-maven-plugin + ${version.maven-jacoco} + + + default-prepare-agent + + prepare-agent + + + + report + report + + report-aggregate + + + + + + + \ No newline at end of file From 3748a66399f6e4d27ee7cfea531c9e9e2671ecf6 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 1 Feb 2021 13:25:38 +0100 Subject: [PATCH 084/243] Fix & encoding --- .../java/fr/insee/rmes/utils/XMLUtils.java | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 72bfdd053..27da89959 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -34,16 +34,15 @@ import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationJsonMixIn; import fr.insee.rmes.model.operations.documentations.Documentation; - - public class XMLUtils { static final Logger logger = LogManager.getLogger(XMLUtils.class); - public static final String toString(Document xml) throws TransformerFactoryConfigurationError, TransformerException { + public static final String toString(Document xml) + throws TransformerFactoryConfigurationError, TransformerException { TransformerFactory tf = TransformerFactory.newInstance(); tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); - tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); + tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); Transformer transformer = tf.newTransformer(); Writer out = new StringWriter(); transformer.transform(new DOMSource(xml), new StreamResult(out)); @@ -65,16 +64,15 @@ public static String produceResponse(Object obj, String header) { if (header != null && header.equals(MediaType.APPLICATION_XML)) { mapper = new XmlMapper(); - } - else { + } else { mapper = new ObjectMapper(); - // TODO : make it generic for all classes or change to 'produceXmlResponse' + // TODO : make it generic for all classes or change to + // 'produceXmlResponse' mapper.addMixIn(Documentation.class, DocumentationJsonMixIn.class); } try { response = mapper.writeValueAsString(obj); - } - catch (Exception e) { + } catch (Exception e) { logger.error(e.getMessage()); } return encodeXml(response); @@ -85,31 +83,29 @@ public static String produceXMLResponse(Object obj) { String response = ""; try { response = mapper.writeValueAsString(obj); - } - catch (Exception e) { + } catch (Exception e) { logger.error(e.getMessage()); } return encodeXml(response); } public static Document convertStringToDocument(String xmlStr) { - DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // disable resolving of external DTD entities factory.setAttribute(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); factory.setAttribute(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); - DocumentBuilder builder; - try - { - builder = factory.newDocumentBuilder(); - return builder.parse( new InputSource( new StringReader( xmlStr ) ) ); - } catch (Exception e) { - logger.error(e.getMessage()); - } + DocumentBuilder builder; + try { + builder = factory.newDocumentBuilder(); + return builder.parse(new InputSource(new StringReader(xmlStr))); + } catch (Exception e) { + logger.error(e.getMessage()); + } return null; } public static List getTagValues(String text, String tag) { - final Pattern TAG_REGEX = Pattern.compile("<"+tag+">(.+?)", Pattern.DOTALL); + final Pattern TAG_REGEX = Pattern.compile("<" + tag + ">(.+?)", Pattern.DOTALL); final List tagValues = new ArrayList<>(); final Matcher matcher = TAG_REGEX.matcher(text); while (matcher.find()) { @@ -117,12 +113,16 @@ public static List getTagValues(String text, String tag) { } return tagValues; } - - private static String encodeXml(String response) { - String ret = StringEscapeUtils.unescapeHtml4(response); - ret = StringEscapeUtils.unescapeXml(ret); - ret = ret.replace("&[^amp;]", "&"); - return new String(ret.getBytes(), StandardCharsets.UTF_8); - } + + private static String encodeXml(String response) { + String ret = StringEscapeUtils.unescapeXml(response); + ret = StringEscapeUtils.unescapeHtml4(ret); + + final String regex = "&[^amp;]"; + + final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern.matcher(ret).replaceAll("&"); + return new String(ret.getBytes(), StandardCharsets.UTF_8); + } } From 1f8dce99d7b7b70e2ebaf1b625c71f34a4dbad69 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 1 Feb 2021 13:50:14 +0100 Subject: [PATCH 085/243] Fix sonar bugs --- .../documentations/DocumentationExport.java | 100 +----------------- .../documentations/DocumentationsUtils.java | 22 ++-- .../rmes/model/links/OperationsLink.java | 9 +- .../rmes/model/operations/Indicator.java | 11 +- .../operations/series/SeriesQueries.java | 2 +- .../java/fr/insee/rmes/utils/XMLUtils.java | 12 ++- 6 files changed, 40 insertions(+), 116 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index c72ec0913..53786ea10 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -27,7 +27,6 @@ import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.external_services.export.ExportUtils; -import fr.insee.rmes.external_services.export.XsltTransformer; @Component public class DocumentationExport { @@ -37,85 +36,7 @@ public class DocumentationExport { private static final Logger logger = LoggerFactory.getLogger(DocumentationExport.class); - private XsltTransformer saxonService = new XsltTransformer(); - public File export(File inputFile) throws Exception { - InputStream isInputFile = FileUtils.openInputStream(inputFile); - return export(isInputFile); - } - - public File export(InputStream inputFile) throws Exception { - logger.debug("Begin To export documentation"); - - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); - //File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("application/vnd.oasis.opendocument.text")); - - output.deleteOnExit(); - - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/testXSLT.xsl"); - OutputStream osOutputFile = FileUtils.openOutputStream(output); - - final PrintStream printStream = new PrintStream(osOutputFile); - - saxonService.transform(inputFile, xslFile, printStream); - inputFile.close(); - xslFile.close(); - //osOutputFile.close(); - printStream.close(); - - logger.debug("End To export documentation"); - return output; - } - - public File transfoTest(InputStream inputFile) throws Exception { - logger.debug("Begin transformation test"); - File output = File.createTempFile(Constants.OUTPUT, ".xml"); - output.deleteOnExit(); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/transfoXSLT.xsl"); - OutputStream osOutputFile = FileUtils.openOutputStream(output); - PrintStream printStream = new PrintStream(osOutputFile); - StreamSource xsrc = new StreamSource(xslFile); - //TransformerFactory transformerFactory = net.sf.saxon.TransformerFactoryImpl.newInstance(); - TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); - - Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); - xsltTransformer.transform(new StreamSource(inputFile), new StreamResult(printStream)); - inputFile.close(); - xslFile.close(); - osOutputFile.close(); - printStream.close(); - logger.debug("End transformation test"); - return output; - } - - public File convertRichText(InputStream inputFile) throws IOException { - - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); - output.deleteOnExit(); - - OutputStream osOutputFile = FileUtils.openOutputStream(output); - //InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertXhtmlToFodt.xsl"); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertRichText.xsl"); - - PrintStream printStream= null; - - try{ - printStream = new PrintStream(osOutputFile); - StreamSource xsrc = new StreamSource(xslFile); - TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); - transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); - xsltTransformer.transform(new StreamSource(inputFile), new StreamResult(printStream)); - } catch (TransformerException e) { - logger.error(e.getMessage()); - } finally { - inputFile.close(); - osOutputFile.close(); - printStream.close(); - } - return output; - } - public File testExport() throws IOException { File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); @@ -123,12 +44,9 @@ public File testExport() throws IOException { OutputStream osOutputFile = FileUtils.openOutputStream(output); InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertRichText.xsl"); - - PrintStream printStream= null; - InputStream inputFile = getClass().getResourceAsStream("/testXML.xml"); - try{ - printStream = new PrintStream(osOutputFile); + + try(PrintStream printStream = new PrintStream(osOutputFile) ){ StreamSource xsrc = new StreamSource(xslFile); TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); @@ -139,7 +57,6 @@ public File testExport() throws IOException { } finally { inputFile.close(); osOutputFile.close(); - printStream.close(); } return output; } @@ -161,21 +78,14 @@ public File export(InputStream inputFile, String msdPath = msdFile.getAbsolutePath(); File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); - //File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("application/vnd.oasis.opendocument.text")); output.deleteOnExit(); - -// File outputIntermediate = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension("XML")); -// outputIntermediate.deleteOnExit(); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/testXSLT.xsl"); - // OutputStream osOutputFile = FileUtils.openOutputStream(outputIntermediate); OutputStream osOutputFile = FileUtils.openOutputStream(output); - PrintStream printStream= null; - try{ - printStream = new PrintStream(osOutputFile); + try(PrintStream printStream = new PrintStream(osOutputFile) ){ + StreamSource xsrc = new StreamSource(xslFile); TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); @@ -202,10 +112,8 @@ public File export(InputStream inputFile, inputFile.close(); xslFile.close(); osOutputFile.close(); - printStream.close(); } logger.debug("End To export documentation"); -// return convertRichText(new FileInputStream(outputIntermediate)); return(output); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index e42c001c2..5a5068797 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -73,6 +73,8 @@ public class DocumentationsUtils extends RdfService{ + private static final String DOT_XML = ".xml"; + static final Logger logger = LogManager.getLogger(DocumentationsUtils.class); @Autowired @@ -256,7 +258,6 @@ private String getDocumentationValidationStatus(String id) throws RmesException */ public String publishMetadataReport(String id) throws RmesException { Model model = new LinkedHashModel(); - //JSONObject simsJson = getDocumentationByIdSims(id); Resource graph = RdfUtils.simsGraph(id); // Find target @@ -274,7 +275,7 @@ public String publishMetadataReport(String id) throws RmesException { case Constants.SERIES_UP : targetUri = RdfUtils.objectIRI(ObjectType.SERIES, targetId); break; case Constants.INDICATOR_UP : targetUri = RdfUtils.objectIRI(ObjectType.INDICATOR, targetId); break; default : break; - }; + } /* Check rights */ if (!stampsRestrictionsService.canCreateSims(targetUri)) { @@ -503,7 +504,7 @@ public String getDocumentationOwnersByIdSims(String idSims) throws RmesException return stamps; } - public File exportTestMetadataReport() throws IOException, RmesException { + public File exportTestMetadataReport() throws IOException { return docExport.testExport(); } @@ -516,16 +517,16 @@ public File exportMetadataReport(String id) throws IOException, RmesException { Path tempDir= Files.createTempDirectory("forExport"); - Path tempFile = Files.createTempFile(tempDir, "target",".xml"); + Path tempFile = Files.createTempFile(tempDir, "target",DOT_XML); String absolutePath = tempFile.toFile().getAbsolutePath(); - Path accessoryTempFile = Files.createTempFile(tempDir, "series",".xml"); + Path accessoryTempFile = Files.createTempFile(tempDir, "series",DOT_XML); String accessoryAbsolutePath = accessoryTempFile.toFile().getAbsolutePath(); - Path organizationsTempFile = Files.createTempFile(tempDir, "orga",".xml"); + Path organizationsTempFile = Files.createTempFile(tempDir, "orga",DOT_XML); String organizationsAbsolutePath = organizationsTempFile.toFile().getAbsolutePath(); - Path codeListTempFile = Files.createTempFile(tempDir, "freq",".xml"); + Path codeListTempFile = Files.createTempFile(tempDir, "freq",DOT_XML); String codeListAbsolutePath = codeListTempFile.toFile().getAbsolutePath(); CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING }; @@ -534,7 +535,7 @@ public File exportMetadataReport(String id) throws IOException, RmesException { String targetType = target[0]; String idDatabase = target[1]; - ListneededCodeLists=new ArrayList(); + ListneededCodeLists=new ArrayList<>(); if (targetType.equals(Constants.OPERATION_UP)) { Operation operation=operationsUtils.getOperationById(idDatabase); @@ -580,8 +581,7 @@ public File exportMetadataReport(String id) throws IOException, RmesException { neededCodeLists=neededCodeLists.stream().distinct().collect(Collectors.toList()); - String codeListsXml=""; - codeListsXml=codeListsXml.concat(Constants.XML_OPEN_CODELIST_TAG); + String codeListsXml=Constants.XML_OPEN_CODELIST_TAG; for(String code : neededCodeLists) { codeListsXml=codeListsXml.concat(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(code))); @@ -640,7 +640,7 @@ public Status deleteMetadataReport(String id) throws RmesException { String targetType = target[0]; String idDatabase = target[1]; - if (targetType != Constants.SERIES) { + if (!Constants.SERIES.equals(targetType)) { throw new RmesNotAcceptableException(ErrorCodes.SIMS_DELETION_FOR_NON_SERIES, "Only a sims that documents a series can be deleted", id); } diff --git a/src/main/java/fr/insee/rmes/model/links/OperationsLink.java b/src/main/java/fr/insee/rmes/model/links/OperationsLink.java index 6e36565a5..9918d2ba6 100644 --- a/src/main/java/fr/insee/rmes/model/links/OperationsLink.java +++ b/src/main/java/fr/insee/rmes/model/links/OperationsLink.java @@ -7,6 +7,8 @@ public class OperationsLink { + public static final String CLASS_NAME = "fr.insee.rmes.model.links.OperationsLink"; + @Schema(description = "Id of the resource linked", required = true) public String id; @@ -52,10 +54,15 @@ public boolean isEmpty() { } public static String getClassOperationsLink() { - return "fr.insee.rmes.model.links.OperationsLink"; + return CLASS_NAME; } + @Override + public int hashCode() { + return Objects.hash(id, labelLg1, labelLg2, type); + } + @Override public boolean equals(Object obj) { if (this == obj) diff --git a/src/main/java/fr/insee/rmes/model/operations/Indicator.java b/src/main/java/fr/insee/rmes/model/operations/Indicator.java index 97ee34e65..8e5890f95 100644 --- a/src/main/java/fr/insee/rmes/model/operations/Indicator.java +++ b/src/main/java/fr/insee/rmes/model/operations/Indicator.java @@ -174,10 +174,6 @@ public List getCreators() { return creators; } -// public void setPublishers(OperationsLink[] publishers) { -// this.publishers = Arrays.asList(publishers); -// } - public void setPublishers(List publishers) { this.publishers = publishers; } @@ -254,6 +250,13 @@ public void setId(String id) { this.id = id; } + @Override + public int hashCode() { + return Objects.hash(abstractLg1, abstractLg2, accrualPeriodicityCode, accrualPeriodicityList, altLabelLg1, + altLabelLg2, contributors, creators, historyNoteLg1, historyNoteLg2, id, idSims, isReplacedBy, + prefLabelLg1, prefLabelLg2, publishers, replaces, seeAlso, wasGeneratedBy); + } + @Override public boolean equals(Object obj) { if (this == obj) diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java index e2b1d4761..dac83c677 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java @@ -218,7 +218,7 @@ public static String seriesLinks(String idSeries, IRI linkPredicate, String resu if (params==null) {initParams();} params.put(ID_SERIES, idSeries); params.put(LINK_PREDICATE, linkPredicate); - if(resultType==Constants.ORGANIZATIONS) { + if(Constants.ORGANIZATIONS.equals(resultType)) { return buildSeriesRequest("getSeriesOrganizationsLinksQuery.ftlh", params); } params.put(PRODUCTS_GRAPH, Config.PRODUCTS_GRAPH); diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 27da89959..53b501907 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -37,6 +37,11 @@ public class XMLUtils { static final Logger logger = LogManager.getLogger(XMLUtils.class); + + private XMLUtils() { + throw new IllegalStateException("Utility class"); + } + public static final String toString(Document xml) throws TransformerFactoryConfigurationError, TransformerException { @@ -91,6 +96,8 @@ public static String produceXMLResponse(Object obj) { public static Document convertStringToDocument(String xmlStr) { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); // Compliant + factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_SCHEMA, ""); // compliant // disable resolving of external DTD entities factory.setAttribute(XMLInputFactory.IS_SUPPORTING_EXTERNAL_ENTITIES, Boolean.FALSE); factory.setAttribute(XMLConstants.FEATURE_SECURE_PROCESSING, Boolean.TRUE); @@ -105,9 +112,9 @@ public static Document convertStringToDocument(String xmlStr) { } public static List getTagValues(String text, String tag) { - final Pattern TAG_REGEX = Pattern.compile("<" + tag + ">(.+?)", Pattern.DOTALL); + final Pattern tagRegex = Pattern.compile("<" + tag + ">(.+?)", Pattern.DOTALL); final List tagValues = new ArrayList<>(); - final Matcher matcher = TAG_REGEX.matcher(text); + final Matcher matcher = tagRegex.matcher(text); while (matcher.find()) { tagValues.add(matcher.group(1)); } @@ -119,7 +126,6 @@ private static String encodeXml(String response) { ret = StringEscapeUtils.unescapeHtml4(ret); final String regex = "&[^amp;]"; - final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); ret = pattern.matcher(ret).replaceAll("&"); return new String(ret.getBytes(), StandardCharsets.UTF_8); From 5d85ddd197b214c622a7c99fb9775dc99c51c431 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 1 Feb 2021 15:09:05 +0100 Subject: [PATCH 086/243] Fix issue with indicators link Links should have a type to be vizualized --- .../indicators/IndicatorsUtils.java | 19 +++++++++++++++++-- .../indicators/IndicatorsQueries.java | 18 +----------------- 2 files changed, 18 insertions(+), 19 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java index 12be7f189..4647b7f39 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java @@ -66,6 +66,11 @@ public Indicator getIndicatorById(String id) throws RmesException{ return buildIndicatorFromJson(getIndicatorJsonById(id)); } + /** + * From json issued of the database to Java Object + * @param indicatorJson + * @return + */ public Indicator buildIndicatorFromJson(JSONObject indicatorJson) { ObjectMapper mapper = new ObjectMapper(); String id= indicatorJson.getString(Constants.ID); @@ -109,6 +114,12 @@ private List buildListFromJsonToArray(JSONObject jsonIndicator, return list; } + /** + * From database + * @param id + * @return + * @throws RmesException + */ public JSONObject getIndicatorJsonById(String id) throws RmesException { if (!checkIfIndicatorExists(id)) { throw new RmesNotFoundException(ErrorCodes.INDICATOR_UNKNOWN_ID,"Indicator not found: ", id); @@ -132,6 +143,12 @@ private void addIndicatorPublishers(String id, JSONObject indicator) throws Rmes indicator.put(Constants.PUBLISHERS, publishers); } + /** + * From database + * @param idIndic + * @param indicator + * @throws RmesException + */ private void addLinks(String idIndic, JSONObject indicator) throws RmesException { addOneTypeOfLink(idIndic,indicator,DCTERMS.REPLACES); addOneTypeOfLink(idIndic,indicator,DCTERMS.IS_REPLACED_BY); @@ -294,8 +311,6 @@ private void createRdfIndicator(Indicator indicator, ValidationStatus newStatus) } } - //repoGestion.keepHierarchicalOperationLinks(indicURI,model); - repoGestion.loadObjectWithReplaceLinks(indicURI, model); } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/indicators/IndicatorsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/indicators/IndicatorsQueries.java index a1383699b..6ef77206a 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/indicators/IndicatorsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/indicators/IndicatorsQueries.java @@ -138,24 +138,8 @@ public static String getPublishersById(String id) { + "} }" ; } - - public static String indicatorLinks(String id, IRI linkPredicate) { - return "SELECT ?id ?labelLg1 ?labelLg2 \n" - + "WHERE { \n" - + "?indic <"+linkPredicate+"> ?uriLinked . \n" - + "?uriLinked skos:prefLabel ?labelLg1 . \n" - + "FILTER (lang(?labelLg1) = '" + Config.LG1 + "') . \n" - + "OPTIONAL {?uriLinked skos:prefLabel ?labelLg2 . \n" - + "FILTER (lang(?labelLg2) = '" + Config.LG2 + "')} . \n" - + "BIND(REPLACE( STR(?uriLinked) , '(.*/)(\\\\w+$)', '$2' ) AS ?id) . \n" - - + "FILTER(STRENDS(STR(?indic),'/"+Config.PRODUCTS_BASE_URI+"/" + id + "')) . \n" - + "} \n" - + "ORDER BY ?labelLg1"; - } - - public static String indicatorLinksWithTypeOfObject(String id, IRI linkPredicate) { + public static String indicatorLinks(String id, IRI linkPredicate) { return "SELECT ?id ?typeOfObject ?labelLg1 ?labelLg2 \n" + "WHERE { \n" + "?indic <"+linkPredicate+"> ?uriLinked . \n" From 4b175fe14a413b35b722cd68ef1d4ed07e7e79e7 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 1 Feb 2021 15:51:16 +0100 Subject: [PATCH 087/243] Please sonar --- .../config/freemarker/FreemarkerConfig.java | 40 ++++++++++++------- .../fr/insee/rmes/exceptions/ErrorCodes.java | 4 ++ 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/main/java/fr/insee/rmes/config/freemarker/FreemarkerConfig.java b/src/main/java/fr/insee/rmes/config/freemarker/FreemarkerConfig.java index 8ac7e67db..f332e40b3 100644 --- a/src/main/java/fr/insee/rmes/config/freemarker/FreemarkerConfig.java +++ b/src/main/java/fr/insee/rmes/config/freemarker/FreemarkerConfig.java @@ -31,22 +31,9 @@ public static void init() { // plain directory for it, but non-file-system sources are possible too: try { - MultiTemplateLoader mtl = null; - - FileTemplateLoader ftl1 = new FileTemplateLoader(new File(FreemarkerConfig.class.getClassLoader().getResource("request").toURI())); - - FileTemplateLoader ftl2 = null; - try { - ftl2 = new FileTemplateLoader(new File(FreemarkerConfig.class.getClassLoader().getResource("xdocreport").toURI())); - } catch (NullPointerException e) { - mtl = new MultiTemplateLoader(new TemplateLoader[] { ftl1 }); - } - if (mtl == null) { - mtl = new MultiTemplateLoader(new TemplateLoader[] { ftl2, ftl1 }); - } + MultiTemplateLoader mtl = getTemplateLoader(); logger.info("Init freemarker templateloader {} , {}", FreemarkerConfig.class.getClassLoader().getResource("request"), FreemarkerConfig.class.getClassLoader().getResource("xdocreport")); cfg.setTemplateLoader(mtl); - } catch (IOException | URISyntaxException e) { logger.error(e.getMessage()); } @@ -69,6 +56,31 @@ public static void init() { } + /** + * Get template loader + * @return + * @throws IOException + * @throws URISyntaxException + */ + private static MultiTemplateLoader getTemplateLoader() throws IOException, URISyntaxException { + MultiTemplateLoader mtl = null; + + //Get request files + FileTemplateLoader ftl1 = new FileTemplateLoader(new File(FreemarkerConfig.class.getClassLoader().getResource("request").toURI())); + + //Get xdocreport files if they exist + FileTemplateLoader ftl2 = null; + try { + ftl2 = new FileTemplateLoader(new File(FreemarkerConfig.class.getClassLoader().getResource("xdocreport").toURI())); + } catch (NullPointerException e) { + mtl = new MultiTemplateLoader(new TemplateLoader[] { ftl1 }); + } + if (mtl == null) { + mtl = new MultiTemplateLoader(new TemplateLoader[] { ftl2, ftl1 }); + } + return mtl; + } + public static Configuration getCfg() { if (cfg == null) { init(); diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index 16950923e..7757e62a6 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -126,4 +126,8 @@ public class ErrorCodes { // SIMS public static final int SIMS_INCORRECT = 861; public static final int SIMS_DELETION_FOR_NON_SERIES = 862; + + private ErrorCodes() { + throw new IllegalStateException("Utility class"); + } } From 89b45c81f9d99d41b0b43bde7a21c829a15558b5 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 2 Feb 2021 08:18:09 +0100 Subject: [PATCH 088/243] change Sims export strategy --- .../operations/OperationsImpl.java | 15 + .../documentations/DocumentationExport.java | 56 +- .../documentations/DocumentationsUtils.java | 85 ++- .../java/fr/insee/rmes/utils/XMLUtils.java | 4 + .../xslTransformerFiles/rmesPattern.fodt | 529 ++++++++++++++++++ 5 files changed, 676 insertions(+), 13 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/rmesPattern.fodt diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 6a7ce6aa2..985c33e0f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -434,6 +434,21 @@ public Response exportMetadataReport(String id) throws RmesException { return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); } + public Response exportMetadataReportOld(String id) throws RmesException { + File output; + InputStream is; + try { + output = documentationsUtils.exportMetadataReportOld(id); + is = new FileInputStream(output); + } catch (Exception e1) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); + } + String fileName = output.getName(); + ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); + return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); + } + + @Override public Response exportTestMetadataReport() throws RmesException { File output; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index c72ec0913..871e02453 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -19,6 +19,7 @@ import javax.xml.transform.stream.StreamSource; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -120,12 +121,9 @@ public File testExport() throws IOException { File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); - OutputStream osOutputFile = FileUtils.openOutputStream(output); InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertRichText.xsl"); - PrintStream printStream= null; - InputStream inputFile = getClass().getResourceAsStream("/testXML.xml"); try{ printStream = new PrintStream(osOutputFile); @@ -143,10 +141,53 @@ public File testExport() throws IOException { } return output; } - - - public File export(InputStream inputFile, + public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, + String organizationsXML, String codeListsXML, String targetType) throws RmesException, IOException { + logger.debug("Begin To export documentation"); + + String msdXML = documentationsUtils.buildShellSims(); + + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); + output.deleteOnExit(); + + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/testXSLT.xsl"); + OutputStream osOutputFile = FileUtils.openOutputStream(output); + + InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); + PrintStream printStream= null; + + try{ + // prepare transformer + StreamSource xsrc = new StreamSource(xslFile); + TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); + transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); + Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); + // set parameters + xsltTransformer.setParameter("simsXML", simsXML); + xsltTransformer.setParameter("operationXML", operationXML); + xsltTransformer.setParameter("indicatorXML", indicatorXML); + xsltTransformer.setParameter("seriesXML", seriesXML); + xsltTransformer.setParameter("msdXML", msdXML); + xsltTransformer.setParameter("codeListsXML", codeListsXML); + xsltTransformer.setParameter("targetType", targetType); + // prepare output + printStream = new PrintStream(osOutputFile); + // transformation + xsltTransformer.transform(new StreamSource(odtFile), new StreamResult(printStream)); + } catch (TransformerException e) { + logger.error(e.getMessage()); + } finally { + odtFile.close(); + xslFile.close(); + osOutputFile.close(); + printStream.close(); + } + logger.debug("End To export documentation"); + return(output); + } + + public File exportOld(InputStream inputFile, String absolutePath, String accessoryAbsolutePath, String organizationsAbsolutePath, String codeListAbsolutePath, String targetType) throws RmesException, IOException { logger.debug("Begin To export documentation"); @@ -208,5 +249,6 @@ public File export(InputStream inputFile, // return convertRichText(new FileInputStream(outputIntermediate)); return(output); } - + + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index e42c001c2..56d940cdb 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -55,6 +55,7 @@ import fr.insee.rmes.exceptions.RmesNotFoundException; import fr.insee.rmes.exceptions.RmesUnauthorizedException; import fr.insee.rmes.model.ValidationStatus; +import fr.insee.rmes.model.operations.Indicator; import fr.insee.rmes.model.operations.Operation; import fr.insee.rmes.model.operations.Series; import fr.insee.rmes.model.operations.documentations.Documentation; @@ -509,22 +510,93 @@ public File exportTestMetadataReport() throws IOException, RmesException { public File exportMetadataReport(String id) throws IOException, RmesException { + String emptyXML=XMLUtils.produceEmptyXML(); + Operation operation; + Series series; + String operationXML; + String seriesXML = emptyXML; + String indicatorXML; + + String[] target = getDocumentationTargetTypeAndId(id); + String targetType = target[0]; + String idDatabase = target[1]; + + ListneededCodeLists=new ArrayList(); + + if (targetType.equals(Constants.OPERATION_UP)) { + operation=operationsUtils.getOperationById(idDatabase); + operationXML = XMLUtils.produceXMLResponse(operation); + neededCodeLists.addAll(XMLUtils.getTagValues(operationXML,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(operationXML,Constants.ACCRUAL_PERIODICITY_LIST)); + String idSeries=operation.getSeries().getId(); + series=seriesUtils.getSeriesById(idSeries); + seriesXML = XMLUtils.produceXMLResponse(series); + neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); + } else {operationXML = emptyXML;} + + + if (targetType.equals(Constants.INDICATOR_UP)) { + indicatorXML=XMLUtils.produceXMLResponse( + indicatorsUtils.getIndicatorById(idDatabase)); + neededCodeLists.addAll(XMLUtils.getTagValues(indicatorXML,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(indicatorXML,Constants.ACCRUAL_PERIODICITY_LIST)); + String idSeries=XMLUtils.getTagValues( + XMLUtils.getTagValues( + indicatorXML, + Constants.WASGENERATEDBY).iterator().next(), + Constants.ID).iterator().next(); + series=seriesUtils.getSeriesById(idSeries); + seriesXML = XMLUtils.produceXMLResponse(series); + neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); + } else {indicatorXML = emptyXML;} + + + if (targetType.equals(Constants.SERIES_UP)) { + seriesXML=XMLUtils.produceXMLResponse( + seriesUtils.getSeriesById(idDatabase)); + neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); + neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); + } + + String organizationsXML = XMLUtils.produceXMLResponse(organizationsServiceImpl.getOrganizations()); + + String simsXML=XMLUtils.produceResponse(getFullSims(id), "application/xml"); + neededCodeLists.addAll(XMLUtils.getTagValues(simsXML,Constants.CODELIST)); + + neededCodeLists=neededCodeLists.stream().distinct().collect(Collectors.toList()); + + String codeListsXML=""; + codeListsXML=codeListsXML.concat(Constants.XML_OPEN_CODELIST_TAG); + + for(String code : neededCodeLists) { + codeListsXML=codeListsXML.concat(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(code))); + } + codeListsXML=codeListsXML.concat(Constants.XML_END_CODELIST_TAG); + + return docExport.export(simsXML,operationXML,indicatorXML,seriesXML, + organizationsXML,codeListsXML,targetType); + } + + public File exportMetadataReportOld(String id) throws IOException, RmesException { + InputStream is; InputStream is2; InputStream is3; InputStream is4; Path tempDir= Files.createTempDirectory("forExport"); - + // Xml File for Operation, Indicator or Series Path tempFile = Files.createTempFile(tempDir, "target",".xml"); String absolutePath = tempFile.toFile().getAbsolutePath(); - + // Xml File for Series Path accessoryTempFile = Files.createTempFile(tempDir, "series",".xml"); String accessoryAbsolutePath = accessoryTempFile.toFile().getAbsolutePath(); - + // Xml File for Organizations Path organizationsTempFile = Files.createTempFile(tempDir, "orga",".xml"); String organizationsAbsolutePath = organizationsTempFile.toFile().getAbsolutePath(); - + // Xml File for needed CodeLists Path codeListTempFile = Files.createTempFile(tempDir, "freq",".xml"); String codeListAbsolutePath = codeListTempFile.toFile().getAbsolutePath(); @@ -593,10 +665,11 @@ public File exportMetadataReport(String id) throws IOException, RmesException { InputStream simsInputStream = IOUtils.toInputStream(simsXML, StandardCharsets.UTF_8); - return docExport.export(simsInputStream,absolutePath,accessoryAbsolutePath, + return docExport.exportOld(simsInputStream,absolutePath,accessoryAbsolutePath, organizationsAbsolutePath,codeListAbsolutePath,targetType); } - + + public MSD buildMSDFromJson(JSONArray jsonMsd) { List msd = new ArrayList<>(); MAS currentRubric; diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 58461f5cc..b92aeb8ee 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -92,6 +92,10 @@ public static String produceXMLResponse(Object obj) { return encodeXml(response); } + public static String produceEmptyXML() { + return(""); + } + public static Document convertStringToDocument(String xmlStr) { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); // disable resolving of external DTD entities diff --git a/src/main/resources/xslTransformerFiles/rmesPattern.fodt b/src/main/resources/xslTransformerFiles/rmesPattern.fodt new file mode 100644 index 000000000..6cf88458a --- /dev/null +++ b/src/main/resources/xslTransformerFiles/rmesPattern.fodt @@ -0,0 +1,529 @@ + + + + LibreOffice/5.4.6.2$Windows_X86_64 LibreOffice_project/4014ce260a04f1026ba855d3b8d91541c224eab8 + + + 0 + 0 + 24552 + 10245 + true + false + + + view2 + 7710 + 3501 + 0 + 0 + 24550 + 10243 + 0 + 1 + false + 140 + false + false + + + + + false + + + + 1 + true + false + false + true + false + false + true + true + + true + + false + 0 + true + false + false + false + 0 + false + true + false + high-resolution + false + false + false + false + false + true + false + false + false + false + true + false + true + false + + false + false + false + false + true + false + 1118261 + false + false + false + false + false + 1118261 + false + true + false + true + true + false + false + false + false + false + true + false + 0 + true + false + false + true + true + true + false + true + false + true + false + false + true + + false + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${series.prefLabelLg1} + + + + + ${series.prefLabelLg2} + + + + + + + + Informations sur la série : ${series.prefLabelLg1} + Informations about the series: ${series.prefLabelLg2} + + + + + + + + + + Nom court + ${series.altLabelLg1} + Résumé + ${series.abstractLg1} + Historique + ${series.historyNoteLg1} + Type d'opération + #if (${series.typeCode} !='') ${seriesCode.type.labelLg1} #endif + Fréquence de collecte des données + #if (${series.accrualPeriodicityCode} !='') ${seriesCode.accrualPeriodicity.labelLg1} #endif + Organismes responsables + #list(${series.publishers.labelLg1},'\n') + Partenaires + #list(${series.contributors.labelLg1},'\n') + Services collecteurs + #list(${series.dataCollectors.labelLg1},'\n') + Propriétaire + ${series.creators} + Succède à + ${series.replaces.labelLg1} + Remplacée par + ${series.isReplacedBy.labelLg1} + Indicateurs produits + #list(${series.generates.labelLg1},'\n') + Séries ou Indicateurs liés + Séries: + #list(${series.seeAlso.labelLg1},'\n') + Indicateurs: + #list(${series.seeAlso.labelLg1},'\n') + Famille parente + ${series.family.labelLg1} + Opérations filles + ${series.operations.labelLg1} + + + + + + Short name + ${series.altLabelLg2} + Summary + ${series.abstractLg2} + History + ${series.historyNoteLg2} + Operation type + #if (${series.typeCode} !='') ${seriesCode.type.labelLg2} #endif + Data collection frequency + #if (${series.accrualPeriodicityCode} !='') ${seriesCode.accrualPeriodicity.labelLg2} #endif + Replaces + ${series.replaces.labelLg2} + Replaced by + ${series.isReplacedBy.labelLg2} + Series and indicators produced + Series: + #list(${series.seeAlso.labelLg2},'\n') + Indicators: + #list(${series.seeAlso.labelLg2},'\n') + Parent Family + ${series.family.labelLg2} + Daughter operations + ${series.operations.labelLg2} + + + + + + + + Informations sur l'opération : ${operations.prefLabelLg1} + Informations about the operation: ${operations.prefLabelLg2} + + + + + + + + + + Nom court + ${operations.altLabelLg1} + Liens + Je ne sais pas d'où on les sort + Série parente + ${operations.series.labelLg1} + + + + + + Short name + ${operations.altLabelLg2} + Links + Je ne sais pas d'où on les sort + Parent series + ${operations.series.labelLg2} + + + + Informations sur le Sims : ${sims.prefLabelLg1} + + + + + + ${mas.idMas} - ${mas.masLabelLg1} + + + + + + + + + + + + ${mas.idMas} - ${mas.masLabelLg1} + ${simsRubrics.labelLg1} + + + ${mas.idMas} - ${mas.masLabelLg2} + ${simsRubrics.labelLg2} + + + + + + + \ No newline at end of file From 35a6f7fafd9bbb703687c8eb59edbefab368203c Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 2 Feb 2021 09:54:29 +0100 Subject: [PATCH 089/243] Fix issue with replaces and replacedBy (same thing) --- .../operations/indicators/IndicatorsUtils.java | 17 ++++++++++++++--- .../operations/series/SeriesUtils.java | 17 +++++++++++++++-- 2 files changed, 29 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java index 4647b7f39..0a40c3ccb 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java @@ -299,15 +299,21 @@ private void createRdfIndicator(Indicator indicator, ValidationStatus newStatus) RdfUtils.addTripleUri(indicURI, DCTERMS.ACCRUAL_PERIODICITY, accPeriodicityUri, model, RdfUtils.productsGraph()); addOneWayLink(model, indicURI, indicator.getSeeAlso(), RDFS.SEEALSO); - addOneWayLink(model, indicURI, indicator.getReplaces(), DCTERMS.REPLACES); addOneWayLink(model, indicURI, indicator.getWasGeneratedBy(), PROV.WAS_GENERATED_BY); + List replaces = indicator.getReplaces(); + if (replaces != null) { + for (OperationsLink replace : replaces) { + String replaceUri = ObjectType.getCompleteUriGestion(replace.getType(), replace.getId()); + addReplacesAndReplacedBy(model, RdfUtils.toURI(replaceUri), indicURI); + } + } + List isReplacedBys = indicator.getIsReplacedBy(); if (isReplacedBys != null) { for (OperationsLink isRepl : isReplacedBys) { String isReplUri = ObjectType.getCompleteUriGestion(isRepl.getType(), isRepl.getId()); - RdfUtils.addTripleUri(indicURI, DCTERMS.IS_REPLACED_BY ,isReplUri, model, RdfUtils.productsGraph()); - RdfUtils.addTripleUri(RdfUtils.toURI(isReplUri), DCTERMS.REPLACES ,indicURI, model, RdfUtils.productsGraph()); + addReplacesAndReplacedBy(model, indicURI, RdfUtils.toURI(isReplUri)); } } @@ -342,6 +348,11 @@ private void addOneWayLink(Model model, IRI indicURI, List links } } } + + private void addReplacesAndReplacedBy(Model model, IRI previous, IRI next) { + RdfUtils.addTripleUri(previous, DCTERMS.IS_REPLACED_BY ,next, model, RdfUtils.productsGraph()); + RdfUtils.addTripleUri(next, DCTERMS.REPLACES ,previous, model, RdfUtils.productsGraph()); + } public String createID() throws RmesException { logger.info("Generate indicator id"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java index c2bc4de2a..919f2c2c3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java @@ -233,14 +233,22 @@ private void createRdfSeries(Series series, IRI familyURI, ValidationStatus newS addOperationLinks(series.getSeeAlso(), RDFS.SEEALSO, model, seriesURI); addOperationLinks(series.getReplaces(), DCTERMS.REPLACES, model, seriesURI); + List replaces = series.getReplaces(); + if (replaces != null) { + for (OperationsLink replace : replaces) { + if(!replace.isEmpty()) { + String replUri = ObjectType.getCompleteUriGestion(replace.getType(), replace.getId()); + addReplacesAndReplacedBy(model, RdfUtils.toURI(replUri), seriesURI); + } + } + } List isReplacedBys = series.getIsReplacedBy(); if (isReplacedBys != null) { for (OperationsLink isRepl : isReplacedBys) { if(!isRepl.isEmpty()) { String isReplUri = ObjectType.getCompleteUriGestion(isRepl.getType(), isRepl.getId()); - RdfUtils.addTripleUri(seriesURI, DCTERMS.IS_REPLACED_BY ,isReplUri, model, RdfUtils.operationsGraph()); - RdfUtils.addTripleUri(RdfUtils.toURI(isReplUri), DCTERMS.REPLACES ,seriesURI, model, RdfUtils.operationsGraph()); + addReplacesAndReplacedBy(model, seriesURI, RdfUtils.toURI(isReplUri)); } } } @@ -255,6 +263,11 @@ private void createRdfSeries(Series series, IRI familyURI, ValidationStatus newS repoGestion.loadObjectWithReplaceLinks(seriesURI, model); } + + private void addReplacesAndReplacedBy(Model model, IRI previous, IRI next) { + RdfUtils.addTripleUri(previous, DCTERMS.IS_REPLACED_BY ,next, model, RdfUtils.operationsGraph()); + RdfUtils.addTripleUri(next, DCTERMS.REPLACES ,previous, model, RdfUtils.operationsGraph()); + } private void addOperationLinks(List links, IRI predicate, Model model, IRI seriesURI) { if (links != null) { From d66e7f5469260fe78fecf503240302bb51ab5cb7 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 2 Feb 2021 10:09:23 +0100 Subject: [PATCH 090/243] Add parameters for xslt transformation --- .../documentations/DocumentationExport.java | 23 +++++++++++++------ .../xslTransformerFiles/parameters.xml | 10 ++++---- 2 files changed, 21 insertions(+), 12 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index e0b802c84..ebe8782a5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -39,13 +39,13 @@ public class DocumentationExport { public File testExport() throws IOException { - + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); OutputStream osOutputFile = FileUtils.openOutputStream(output); InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertRichText.xsl"); InputStream inputFile = getClass().getResourceAsStream("/testXML.xml"); - + try(PrintStream printStream = new PrintStream(osOutputFile) ){ StreamSource xsrc = new StreamSource(xslFile); TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); @@ -60,12 +60,21 @@ public File testExport() throws IOException { } return output; } - + public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, String organizationsXML, String codeListsXML, String targetType) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXML = documentationsUtils.buildShellSims(); + String parametersXML =""; + InputStream parametersXMLFile = getClass().getResourceAsStream("/xslTransformerFiles/parameters.xml"); + + try { + parametersXML = IOUtils.toString(parametersXMLFile, StandardCharsets.UTF_8); + } catch (IOException e) { + logger.error("Failed to read the xml : ", e); + } + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); @@ -89,7 +98,7 @@ public File export(String simsXML,String operationXML,String indicatorXML,String xsltTransformer.setParameter("seriesXML", seriesXML); xsltTransformer.setParameter("msdXML", msdXML); xsltTransformer.setParameter("codeListsXML", codeListsXML); - xsltTransformer.setParameter("targetType", targetType); + xsltTransformer.setParameter("parametersXML", parametersXML); // prepare output printStream = new PrintStream(osOutputFile); // transformation @@ -128,7 +137,7 @@ public File exportOld(InputStream inputFile, try(PrintStream printStream = new PrintStream(osOutputFile) ){ - + StreamSource xsrc = new StreamSource(xslFile); TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); @@ -159,6 +168,6 @@ public File exportOld(InputStream inputFile, logger.debug("End To export documentation"); return(output); } - - + + } diff --git a/src/main/resources/xslTransformerFiles/parameters.xml b/src/main/resources/xslTransformerFiles/parameters.xml index 5e2c979f9..2981ed851 100644 --- a/src/main/resources/xslTransformerFiles/parameters.xml +++ b/src/main/resources/xslTransformerFiles/parameters.xml @@ -1,10 +1,10 @@ -OPERATION - -1 -2 - + OPERATION + + 1 + 2 + From 19e1edce734c2c54684daaa1acd8e4163b8688ff Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 2 Feb 2021 11:59:57 +0100 Subject: [PATCH 091/243] Remove class with too many lines --- .../webservice/OperationsAbstResources.java | 44 + .../rmes/webservice/OperationsResources.java | 847 ------------------ .../operations/FamilyResources.java | 130 +++ .../operations/IndicatorsResources.java | 156 ++++ .../operations/MetadataReportResources.java | 291 ++++++ .../operations/OperationsResources.java | 168 ++++ .../operations/SeriesResources.java | 214 +++++ 7 files changed, 1003 insertions(+), 847 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java delete mode 100644 src/main/java/fr/insee/rmes/webservice/OperationsResources.java create mode 100644 src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java create mode 100644 src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java create mode 100644 src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java create mode 100644 src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java create mode 100644 src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java new file mode 100644 index 000000000..a515ca2ae --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java @@ -0,0 +1,44 @@ +package fr.insee.rmes.webservice; + +import javax.ws.rs.Path; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import fr.insee.rmes.bauhaus_services.OperationsService; +import fr.insee.rmes.exceptions.RmesException; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; + + +@Component +@Path("/operations") +@Tag(name="Operations", description="Operation API") +@ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Success"), + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "400", description = "Bad Request"), + @ApiResponse(responseCode = "401", description = "Unauthorized"), + @ApiResponse(responseCode = "403", description = "Forbidden"), + @ApiResponse(responseCode = "404", description = "Not found"), + @ApiResponse(responseCode = "406", description = "Not Acceptable"), + @ApiResponse(responseCode = "500", description = "Internal server error") }) +public abstract class OperationsAbstResources { + + protected static final Logger logger = LogManager.getLogger(OperationsAbstResources.class); + + @Autowired + protected OperationsService operationsService; + + + protected Response returnRmesException(RmesException e) { + logger.error(e.getMessage(), e); + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + +} diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java deleted file mode 100644 index 6cf570365..000000000 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ /dev/null @@ -1,847 +0,0 @@ -package fr.insee.rmes.webservice; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; - -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - -import org.apache.commons.io.IOUtils; -import org.apache.http.HttpStatus; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.glassfish.jersey.media.multipart.FormDataParam; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.annotation.Secured; -import org.springframework.stereotype.Component; - -import fr.insee.rmes.bauhaus_services.Constants; -import fr.insee.rmes.bauhaus_services.OperationsService; -import fr.insee.rmes.config.auth.roles.Roles; -import fr.insee.rmes.config.swagger.model.IdLabel; -import fr.insee.rmes.config.swagger.model.IdLabelAltLabel; -import fr.insee.rmes.config.swagger.model.IdLabelAltLabelSims; -import fr.insee.rmes.config.swagger.model.operations.documentation.Attribute; -import fr.insee.rmes.exceptions.RmesException; -import fr.insee.rmes.model.operations.Family; -import fr.insee.rmes.model.operations.Indicator; -import fr.insee.rmes.model.operations.Operation; -import fr.insee.rmes.model.operations.Series; -import fr.insee.rmes.model.operations.documentations.Documentation; -import fr.insee.rmes.model.operations.documentations.MAS; -import fr.insee.rmes.model.operations.documentations.MSD; -import fr.insee.rmes.utils.XMLUtils; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.parameters.RequestBody; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; - - -@Component -@Path("/operations") -@Tag(name="Operations", description="Operation API") -@ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "Success"), - @ApiResponse(responseCode = "204", description = "No Content"), - @ApiResponse(responseCode = "400", description = "Bad Request"), - @ApiResponse(responseCode = "401", description = "Unauthorized"), - @ApiResponse(responseCode = "403", description = "Forbidden"), - @ApiResponse(responseCode = "404", description = "Not found"), - @ApiResponse(responseCode = "406", description = "Not Acceptable"), - @ApiResponse(responseCode = "500", description = "Internal server error") }) -public class OperationsResources { - - static final Logger logger = LogManager.getLogger(OperationsResources.class); - - @Autowired - OperationsService operationsService; - - - /*************************************************************************************************** - * FAMILY - ******************************************************************************************************/ - @GET - @Path("/families") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getFamilies", summary = "List of families", - responses = {@ApiResponse(content=@Content(array=@ArraySchema(schema=@Schema(implementation=IdLabel.class))))}) - public Response getFamilies() throws RmesException { - String jsonResultat = operationsService.getFamilies(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/families/advanced-search") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getFamiliesForSearch", summary = "List of families for search", - responses = {@ApiResponse(content=@Content(array=@ArraySchema(schema=@Schema(implementation=Family.class))))}) - public Response getFamiliesForSearch() throws RmesException { - String jsonResultat = operationsService.getFamiliesForSearch(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/family/{id}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getFamilyByID", summary = "Get a family", - responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Family.class)))} - ) - public Response getFamilyByID(@PathParam(Constants.ID) String id) throws RmesException { - String jsonResultat = operationsService.getFamilyByID(id); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - /** - * UPDATE - * @param id, body - * @return response - */ - - @Secured({ Roles.SPRING_ADMIN }) - @PUT - @Path("/family/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setFamilyById", summary = "Update family" ) - public Response setFamilyById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Family to update", required = true, - content = @Content(schema = @Schema(implementation = Family.class))) String body) { - try { - operationsService.setFamily(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - - /** - * CREATE - * @param body - * @return response - */ - @Secured({ Roles.SPRING_ADMIN }) - @POST - @Path("/family") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "createFamily", summary = "Create family") - public Response createFamily( - @RequestBody(description = "Family to create", required = true, - content = @Content(schema = @Schema(implementation = Family.class))) String body) { - String id = null; - try { - id = operationsService.createFamily(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - @Secured({ Roles.SPRING_ADMIN }) - @PUT - @Path("/family/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setFamilyValidation", summary = "Family validation") - public Response setFamilyValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.setFamilyValidation(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - - - /*************************************************************************************************** - * SERIES - ******************************************************************************************************/ - @GET - @Path("/series") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSeries", summary = "List of series", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) - public Response getSeries() throws RmesException { - String jsonResultat = operationsService.getSeries(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/series/withSims") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesWithSims", summary = "List of series with related sims", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabelSims.class)))}) - public Response getSeriesWIthSims() throws RmesException { - String jsonResultat = operationsService.getSeriesWithSims(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/series/{id}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesByID", - summary = "Series", responses = { @ApiResponse(content = @Content(schema = @Schema(implementation = Series.class)))}) - public Response getSeriesByID(@PathParam(Constants.ID) String id, - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { - String resultat; - if (header != null && header.equals(MediaType.APPLICATION_XML)) { - try { - resultat=XMLUtils.produceXMLResponse(operationsService.getSeriesByID(id)); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } else { - try { - resultat = operationsService.getSeriesJsonByID(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } - return Response.status(HttpStatus.SC_OK).entity(resultat).build(); - } - - @GET - @Path("/series/advanced-search") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesForSearch", summary = "Series", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Series.class)))}) - public Response getSeriesForSearch() { - String jsonResultat; - try { - jsonResultat = operationsService.getSeriesForSearch(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_CNIS }) - @PUT - @Path("/series/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setSeriesById", summary = "Update series") - public Response setSeriesById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Series to update", required = true, - content = @Content(schema = @Schema(implementation = Series.class)))String body) { - try { - operationsService.setSeries(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - @GET - @Path("/series/{id}/operationsWithoutReport") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getOperationsWithoutReport", summary = "Operations without metadataReport", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=Operation.class)))}) - public Response getOperationsWithoutReport(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { - jsonResultat = operationsService.getOperationsWithoutReport(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - - /** - * CREATE - * @param body - * @return response - */ - @Secured({ Roles.SPRING_ADMIN }) - @POST - @Path("/series") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "createSeries", summary = "Create series") - public Response createSeries( - @RequestBody(description = "Series to create", required = true, - content = @Content(schema = @Schema(implementation = Series.class))) String body) { - String id = null; - try { - id = operationsService.createSeries(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - /** - * PUBLISH - * @param id - * @return response - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) - @PUT - @Path("/series/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setSeriesValidation", summary = "Series validation") - public Response setSeriesValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.setSeriesValidation(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - /*************************************************************************************************** - * OPERATIONS - ******************************************************************************************************/ - - - - @GET - @Path("/operations") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getOperations", summary = "List of operations", - responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) - public Response getOperations() throws RmesException { - String jsonResultat = operationsService.getOperations(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - - } - - - @GET - @Path("/operation/{id}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getOperationByID", summary = "Operation", - responses = { @ApiResponse(content = @Content(/*mediaType = "application/json",*/ schema = @Schema(implementation = Operation.class)))}) - public Response getOperationByID(@PathParam(Constants.ID) String id, - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { - String resultat; - if (header != null && header.equals(MediaType.APPLICATION_XML)) { - try { - resultat=XMLUtils.produceXMLResponse(operationsService.getOperationById(id)); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } else { - try { - resultat = operationsService.getOperationJsonByID(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } - return Response.status(HttpStatus.SC_OK).entity(resultat).build(); - } - - - @POST - @Path("/operation/codebook") - @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @Consumes({MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @io.swagger.v3.oas.annotations.Operation(operationId = "getCodeBook", summary = "Produce a codebook from a DDI") - public Response getCodeBook( @HeaderParam("Accept") String acceptHeader, - @Parameter(schema = @Schema(type = "string", format = "binary", description = "file in DDI")) - @FormDataParam("file") InputStream isDDI, - @Parameter(schema = @Schema(type = "string", format = "binary", description = "file 2")) - @FormDataParam(value = "dicoVar") InputStream isCodeBook) throws IOException, RmesException { - String ddi = IOUtils.toString(isDDI, StandardCharsets.UTF_8); - File codeBookFile = fr.insee.rmes.utils.FileUtils.streamToFile(isCodeBook, "dicoVar",".odt"); - return operationsService.getCodeBookExport(ddi,codeBookFile, acceptHeader); - } - - /** - * UPDATE - * @param id - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_CNIS }) - @PUT - @Path("/operation/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setOperationById", summary = "Update operation") - public Response setOperationById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Operation to update", required = true, - content = @Content(schema = @Schema(implementation = Operation.class))) String body) { - try { - operationsService.setOperation(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - /** - * CREATE - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) - @POST - @Path("/operation") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "createOperation", summary = "Create operation") - public Response createOperation( - @RequestBody(description = "Operation to create", required = true, - content = @Content(schema = @Schema(implementation = Operation.class))) String body) { - String id = null; - try { - id = operationsService.createOperation(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - /** - * PUBLISH - * @param id - * @return response - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) - @PUT - @Path("/operation/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setOperationValidation", summary = "Operation validation") - public Response setOperationValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.setOperationValidation(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - - /*************************************************************************************************** - * INDICATORS - ******************************************************************************************************/ - @GET - @Path("/indicators") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicators", summary = "List of indicators", - responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) - public Response getIndicators() throws RmesException { - String jsonResultat = operationsService.getIndicators(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - - } - - @GET - @Path("/indicators/advanced-search") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicatorsForSearch", summary = "List of indicators for search", - responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=Indicator.class)))}) - public Response getIndicatorsForSearch() throws RmesException { - String jsonResultat = operationsService.getIndicatorsForSearch(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - - } - - @GET - @Path("/indicator/{id}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicatorByID", summary = "Indicator", - responses = { @ApiResponse(content = @Content(schema = @Schema(implementation = Indicator.class)))}) - public Response getIndicatorByID(@PathParam(Constants.ID) String id, - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { - String resultat; - if (header != null && header.equals(MediaType.APPLICATION_XML)) { - try { - resultat=XMLUtils.produceXMLResponse(operationsService.getIndicatorById(id)); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } else { - try { - resultat = operationsService.getIndicatorJsonByID(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } - return Response.status(HttpStatus.SC_OK).entity(resultat).build(); - } - - /** - * UPDATE - * @param id - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @PUT - @Path("/indicator/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicatorById", summary = "Update indicator") - public Response setIndicatorById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Indicator to update", required = true, - content = @Content(schema = @Schema(implementation = Indicator.class))) String body) { - try { - operationsService.setIndicator(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - /** - * PUBLISH - * @param id - * @return response - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @PUT - @Path("/indicator/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicatorValidation", summary = "Indicator validation") - public Response setIndicatorValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.setIndicatorValidation(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - /** - * CREATE - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @POST - @Path("/indicator") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicator", summary = "Create indicator", - responses = { @ApiResponse(content = @Content(mediaType = MediaType.TEXT_PLAIN))}) - public Response setIndicator(@RequestBody(description = "Indicator to create", required = true, - content = @Content(schema = @Schema(implementation = Indicator.class))) String body) { - logger.info("POST indicator"); - String id = null; - try { - id = operationsService.setIndicator(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - if (id == null) {return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(id).build();} - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - - - /*************************************************************************************************** - * DOCUMENTATION - ******************************************************************************************************/ - - @GET - @Path("/metadataStructureDefinition") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMsd", summary = "Metadata structure definition", - responses = { @ApiResponse(content = @Content(/*mediaType = "application/json",*/ schema = @Schema(implementation = MAS.class)))}) - public Response getMSD( - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header - ) { - MSD msd ; - String jsonResultat = null ; - - if (header != null && header.equals(MediaType.APPLICATION_XML)) { - try { - msd = operationsService.getMSD(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.ok(XMLUtils.produceResponse(msd, header)).build(); - } - - else { - try { - jsonResultat = operationsService.getMSDJson(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - } - - @GET - @Path("/metadataAttribute/{id}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMA", summary = "Metadata attribute specification and property", - responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Attribute.class)))}) - public Response getMetadataAttribute(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { - jsonResultat = operationsService.getMetadataAttribute(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/metadataAttributes") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMAs", summary = "Metadata attributes specification and property", - responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(type="array",implementation = Attribute.class)))}) - public Response getMetadataAttributes() { - String jsonResultat; - try { - jsonResultat = operationsService.getMetadataAttributes(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - - @GET - @Path("/metadataReport/{id}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReport", summary = "Metadata report for an id", - responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) - ))}) - public Response getMetadataReport(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { - jsonResultat = operationsService.getMetadataReport(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/metadataReport/default") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReportDefaultValue", summary = "Get default value for metadata report", - responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) - ))}) - public Response getMetadataReportDefaultValue() throws IOException { - return Response.status(HttpStatus.SC_OK).entity(operationsService.getMetadataReportDefaultValue()).build(); - } - - @GET - @Path("/metadataReport/fullSims/{id}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getFullSims", summary = "Full sims for an id", - responses = { @ApiResponse(content = @Content(/*mediaType = "application/json" ,*/ schema = @Schema(implementation = Documentation.class) - ))}) - public Response getFullSims( - @Parameter( - description = "Identifiant de la documentation (format : [0-9]{4})", - required = true, - schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id, - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header - ) { - Documentation fullsims; - try { - fullsims = operationsService.getFullSims(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - - return Response.ok(XMLUtils.produceResponse(fullsims, header)).build(); - } - - /** - * GET - * @param id - * @return - */ - - @GET - @Path("/metadataReport/Owner/{id}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReport", summary = "Owner stamp for a Metadata report's id", - responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) - ))}) - public Response getMetadataReportOwner(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { - jsonResultat = operationsService.getMetadataReportOwner(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - /** - * CREATE - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @POST - @Path("/metadataReport") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReport", summary = "Create metadata report", - responses = { @ApiResponse(content = @Content(mediaType = MediaType.TEXT_PLAIN))}) - public Response setMetadataReport(@RequestBody(description = "Metadata report to create", required = true, - content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { - logger.info("POST Metadata report"); - String id = null; - try { - id = operationsService.createMetadataReport(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - if (id == null) {return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(id).build();} - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - /** - * UPDATE - * @param id - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR, Roles.SPRING_CNIS }) - @PUT - @Path("/metadataReport/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReportById", summary = "Update metadata report") - public Response setMetadataReportById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Report to update", required = true, - content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { - try { - operationsService.setMetadataReport(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - /** - * DELETE - * @param id - * @return - */ - @Secured({ Roles.SPRING_ADMIN }) - @DELETE - @Path("/metadataReport/delete/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "deleteMetadataReportById", summary = "Delete metadata report") - public Response deleteMetadataReportById( - @PathParam(Constants.ID) String id) { - Status result=Status.NO_CONTENT; - try { - result = operationsService.deleteMetadataReport(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(result).build(); - } - - - - /** - * PUBLISH - * @param id - * @return response - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @PUT - @Path("/metadataReport/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReportValidation", summary = "Sims validation") - public Response setSimsValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.publishMetadataReport(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - @GET - @Path("/series/seriesForStamp/{stamp}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesForStamp", summary = "Series with given stamp") - public Response getSeriesForStamp(@Parameter( - description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", - required = true, - schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp - ) throws RmesException { - String jsonResultat = operationsService.getSeriesForStamp(stamp); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/series/seriesIdsForStamp/{stamp}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Ids of Series with given stamp") - public Response getSeriesIdsForStamp(@Parameter( - description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", - required = true, - schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp - ) throws RmesException { - String jsonResultat = operationsService.getSeriesIdsForStamp(stamp); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/series/seriesWithStamp/{stamp}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Series with given stamp as creator") - public Response getSeriesWithStamp(@Parameter( - description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", - required = true, - schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp - ) throws RmesException { - String jsonResultat = operationsService.getSeriesWithStamp(stamp); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - - @GET - @Path("/metadataReport/export/{id}") - @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") - public Response getSimsExport(@Parameter( - description = "Identifiant de la documentation (format : [0-9]{4})", - required = true, - schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id - ) throws RmesException { - return operationsService.exportMetadataReport(id); - } - - @GET - @Path("/metadataReport/testExport") - @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") - public Response getTestSimsExport() throws RmesException { - return operationsService.exportTestMetadataReport(); - } - - - - - private Response returnRmesException(RmesException e) { - logger.error(e.getMessage(), e); - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - -} diff --git a/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java b/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java new file mode 100644 index 000000000..f54f674fd --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java @@ -0,0 +1,130 @@ +package fr.insee.rmes.webservice.operations; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.apache.http.HttpStatus; +import org.springframework.security.access.annotation.Secured; +import org.springframework.stereotype.Component; + +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.config.auth.roles.Roles; +import fr.insee.rmes.config.swagger.model.IdLabel; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.operations.Family; +import fr.insee.rmes.webservice.OperationsAbstResources; +import io.swagger.v3.oas.annotations.media.ArraySchema; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; + +/*************************************************************************************************** + * FAMILY + ******************************************************************************************************/ +@Component +@Path("/operations") +public class FamilyResources extends OperationsAbstResources { + + @GET + @Path("/families") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getFamilies", summary = "List of families", + responses = {@ApiResponse(content=@Content(array=@ArraySchema(schema=@Schema(implementation=IdLabel.class))))}) + public Response getFamilies() throws RmesException { + String jsonResultat = operationsService.getFamilies(); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/families/advanced-search") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getFamiliesForSearch", summary = "List of families for search", + responses = {@ApiResponse(content=@Content(array=@ArraySchema(schema=@Schema(implementation=Family.class))))}) + public Response getFamiliesForSearch() throws RmesException { + String jsonResultat = operationsService.getFamiliesForSearch(); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/family/{id}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getFamilyByID", summary = "Get a family", + responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Family.class)))} + ) + public Response getFamilyByID(@PathParam(Constants.ID) String id) throws RmesException { + String jsonResultat = operationsService.getFamilyByID(id); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + /** + * UPDATE + * @param id, body + * @return response + */ + + @Secured({ Roles.SPRING_ADMIN }) + @PUT + @Path("/family/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setFamilyById", summary = "Update family" ) + public Response setFamilyById( + @PathParam(Constants.ID) String id, + @RequestBody(description = "Family to update", required = true, + content = @Content(schema = @Schema(implementation = Family.class))) String body) { + try { + operationsService.setFamily(id, body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(Status.NO_CONTENT).build(); + } + + + /** + * CREATE + * @param body + * @return response + */ + @Secured({ Roles.SPRING_ADMIN }) + @POST + @Path("/family") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "createFamily", summary = "Create family") + public Response createFamily( + @RequestBody(description = "Family to create", required = true, + content = @Content(schema = @Schema(implementation = Family.class))) String body) { + String id = null; + try { + id = operationsService.createFamily(body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + @Secured({ Roles.SPRING_ADMIN }) + @PUT + @Path("/family/validate/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setFamilyValidation", summary = "Family validation") + public Response setFamilyValidation( + @PathParam(Constants.ID) String id) throws RmesException { + try { + operationsService.setFamilyValidation(id); + } catch (RmesException e) { + return returnRmesException(e); + } + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + +} diff --git a/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java new file mode 100644 index 000000000..9b118a082 --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java @@ -0,0 +1,156 @@ +package fr.insee.rmes.webservice.operations; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.apache.http.HttpStatus; +import org.springframework.security.access.annotation.Secured; +import org.springframework.stereotype.Component; + +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.config.auth.roles.Roles; +import fr.insee.rmes.config.swagger.model.IdLabelAltLabel; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.operations.Indicator; +import fr.insee.rmes.utils.XMLUtils; +import fr.insee.rmes.webservice.OperationsAbstResources; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; + + +@Component +@Path("/operations") +public class IndicatorsResources extends OperationsAbstResources { + + + /*************************************************************************************************** + * INDICATORS + ******************************************************************************************************/ + @GET + @Path("/indicators") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicators", summary = "List of indicators", + responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) + public Response getIndicators() throws RmesException { + String jsonResultat = operationsService.getIndicators(); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + + } + + @GET + @Path("/indicators/advanced-search") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicatorsForSearch", summary = "List of indicators for search", + responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=Indicator.class)))}) + public Response getIndicatorsForSearch() throws RmesException { + String jsonResultat = operationsService.getIndicatorsForSearch(); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + + } + + @GET + @Path("/indicator/{id}") + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicatorByID", summary = "Indicator", + responses = { @ApiResponse(content = @Content(schema = @Schema(implementation = Indicator.class)))}) + public Response getIndicatorByID(@PathParam(Constants.ID) String id, + @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { + String resultat; + if (header != null && header.equals(MediaType.APPLICATION_XML)) { + try { + resultat=XMLUtils.produceXMLResponse(operationsService.getIndicatorById(id)); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + } else { + try { + resultat = operationsService.getIndicatorJsonByID(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + } + return Response.status(HttpStatus.SC_OK).entity(resultat).build(); + } + + /** + * UPDATE + * @param id + * @param body + * @return + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) + @PUT + @Path("/indicator/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicatorById", summary = "Update indicator") + public Response setIndicatorById( + @PathParam(Constants.ID) String id, + @RequestBody(description = "Indicator to update", required = true, + content = @Content(schema = @Schema(implementation = Indicator.class))) String body) { + try { + operationsService.setIndicator(id, body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(Status.NO_CONTENT).build(); + } + + /** + * PUBLISH + * @param id + * @return response + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) + @PUT + @Path("/indicator/validate/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicatorValidation", summary = "Indicator validation") + public Response setIndicatorValidation( + @PathParam(Constants.ID) String id) throws RmesException { + try { + operationsService.setIndicatorValidation(id); + } catch (RmesException e) { + return returnRmesException(e); + } + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + /** + * CREATE + * @param body + * @return + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) + @POST + @Path("/indicator") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicator", summary = "Create indicator", + responses = { @ApiResponse(content = @Content(mediaType = MediaType.TEXT_PLAIN))}) + public Response setIndicator(@RequestBody(description = "Indicator to create", required = true, + content = @Content(schema = @Schema(implementation = Indicator.class))) String body) { + logger.info("POST indicator"); + String id = null; + try { + id = operationsService.setIndicator(body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + if (id == null) {return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(id).build();} + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + +} diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java new file mode 100644 index 000000000..68eb0d1bd --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -0,0 +1,291 @@ +package fr.insee.rmes.webservice.operations; + +import java.io.IOException; + +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.apache.http.HttpStatus; +import org.springframework.security.access.annotation.Secured; +import org.springframework.stereotype.Component; + +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.config.auth.roles.Roles; +import fr.insee.rmes.config.swagger.model.operations.documentation.Attribute; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.operations.documentations.Documentation; +import fr.insee.rmes.model.operations.documentations.MAS; +import fr.insee.rmes.model.operations.documentations.MSD; +import fr.insee.rmes.utils.XMLUtils; +import fr.insee.rmes.webservice.OperationsAbstResources; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; + + +@Component +@Path("/operations") +public class MetadataReportResources extends OperationsAbstResources { + + + /*************************************************************************************************** + * DOCUMENTATION + ******************************************************************************************************/ + + @GET + @Path("/metadataStructureDefinition") + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @io.swagger.v3.oas.annotations.Operation(operationId = "getMsd", summary = "Metadata structure definition", + responses = { @ApiResponse(content = @Content(/*mediaType = "application/json",*/ schema = @Schema(implementation = MAS.class)))}) + public Response getMSD( + @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header + ) { + MSD msd ; + String jsonResultat = null ; + + if (header != null && header.equals(MediaType.APPLICATION_XML)) { + try { + msd = operationsService.getMSD(); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.ok(XMLUtils.produceResponse(msd, header)).build(); + } + + else { + try { + jsonResultat = operationsService.getMSDJson(); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + } + + @GET + @Path("/metadataAttribute/{id}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getMA", summary = "Metadata attribute specification and property", + responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Attribute.class)))}) + public Response getMetadataAttribute(@PathParam(Constants.ID) String id) { + String jsonResultat; + try { + jsonResultat = operationsService.getMetadataAttribute(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/metadataAttributes") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getMAs", summary = "Metadata attributes specification and property", + responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(type="array",implementation = Attribute.class)))}) + public Response getMetadataAttributes() { + String jsonResultat; + try { + jsonResultat = operationsService.getMetadataAttributes(); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + + @GET + @Path("/metadataReport/{id}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReport", summary = "Metadata report for an id", + responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) + ))}) + public Response getMetadataReport(@PathParam(Constants.ID) String id) { + String jsonResultat; + try { + jsonResultat = operationsService.getMetadataReport(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/metadataReport/default") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReportDefaultValue", summary = "Get default value for metadata report", + responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) + ))}) + public Response getMetadataReportDefaultValue() throws IOException { + return Response.status(HttpStatus.SC_OK).entity(operationsService.getMetadataReportDefaultValue()).build(); + } + + @GET + @Path("/metadataReport/fullSims/{id}") + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @io.swagger.v3.oas.annotations.Operation(operationId = "getFullSims", summary = "Full sims for an id", + responses = { @ApiResponse(content = @Content(/*mediaType = "application/json" ,*/ schema = @Schema(implementation = Documentation.class) + ))}) + public Response getFullSims( + @Parameter( + description = "Identifiant de la documentation (format : [0-9]{4})", + required = true, + schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id, + @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header + ) { + Documentation fullsims; + try { + fullsims = operationsService.getFullSims(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + + return Response.ok(XMLUtils.produceResponse(fullsims, header)).build(); + } + + /** + * GET + * @param id + * @return + */ + + @GET + @Path("/metadataReport/Owner/{id}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReport", summary = "Owner stamp for a Metadata report's id", + responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) + ))}) + public Response getMetadataReportOwner(@PathParam(Constants.ID) String id) { + String jsonResultat; + try { + jsonResultat = operationsService.getMetadataReportOwner(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + /** + * CREATE + * @param body + * @return + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR }) + @POST + @Path("/metadataReport") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReport", summary = "Create metadata report", + responses = { @ApiResponse(content = @Content(mediaType = MediaType.TEXT_PLAIN))}) + public Response setMetadataReport(@RequestBody(description = "Metadata report to create", required = true, + content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { + logger.info("POST Metadata report"); + String id = null; + try { + id = operationsService.createMetadataReport(body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + if (id == null) {return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(id).build();} + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + /** + * UPDATE + * @param id + * @param body + * @return + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR, Roles.SPRING_CNIS }) + @PUT + @Path("/metadataReport/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReportById", summary = "Update metadata report") + public Response setMetadataReportById( + @PathParam(Constants.ID) String id, + @RequestBody(description = "Report to update", required = true, + content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { + try { + operationsService.setMetadataReport(id, body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(Status.NO_CONTENT).build(); + } + + /** + * DELETE + * @param id + * @return + */ + @Secured({ Roles.SPRING_ADMIN }) + @DELETE + @Path("/metadataReport/delete/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "deleteMetadataReportById", summary = "Delete metadata report") + public Response deleteMetadataReportById( + @PathParam(Constants.ID) String id) { + Status result=Status.NO_CONTENT; + try { + result = operationsService.deleteMetadataReport(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(result).build(); + } + + + + /** + * PUBLISH + * @param id + * @return response + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR }) + @PUT + @Path("/metadataReport/validate/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReportValidation", summary = "Sims validation") + public Response setSimsValidation( + @PathParam(Constants.ID) String id) throws RmesException { + try { + operationsService.publishMetadataReport(id); + } catch (RmesException e) { + return returnRmesException(e); + } + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + + @GET + @Path("/metadataReport/export/{id}") + @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") + public Response getSimsExport(@Parameter( + description = "Identifiant de la documentation (format : [0-9]{4})", + required = true, + schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id + ) throws RmesException { + return operationsService.exportMetadataReport(id); + } + + @GET + @Path("/metadataReport/testExport") + @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") + public Response getTestSimsExport() throws RmesException { + return operationsService.exportTestMetadataReport(); + } + +} diff --git a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java new file mode 100644 index 000000000..62e437032 --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java @@ -0,0 +1,168 @@ +package fr.insee.rmes.webservice.operations; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.nio.charset.StandardCharsets; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpStatus; +import org.glassfish.jersey.media.multipart.FormDataParam; +import org.springframework.security.access.annotation.Secured; +import org.springframework.stereotype.Component; + +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.config.auth.roles.Roles; +import fr.insee.rmes.config.swagger.model.IdLabelAltLabel; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.operations.Operation; +import fr.insee.rmes.utils.XMLUtils; +import fr.insee.rmes.webservice.OperationsAbstResources; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; + + +@Component +@Path("/operations") +public class OperationsResources extends OperationsAbstResources { + + /*************************************************************************************************** + * OPERATIONS + ******************************************************************************************************/ + + + + @GET + @Path("/operations") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getOperations", summary = "List of operations", + responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) + public Response getOperations() throws RmesException { + String jsonResultat = operationsService.getOperations(); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + + } + + + @GET + @Path("/operation/{id}") + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @io.swagger.v3.oas.annotations.Operation(operationId = "getOperationByID", summary = "Operation", + responses = { @ApiResponse(content = @Content(/*mediaType = "application/json",*/ schema = @Schema(implementation = Operation.class)))}) + public Response getOperationByID(@PathParam(Constants.ID) String id, + @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { + String resultat; + if (header != null && header.equals(MediaType.APPLICATION_XML)) { + try { + resultat=XMLUtils.produceXMLResponse(operationsService.getOperationById(id)); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + } else { + try { + resultat = operationsService.getOperationJsonByID(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + } + return Response.status(HttpStatus.SC_OK).entity(resultat).build(); + } + + + @POST + @Path("/operation/codebook") + @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) + @Consumes({MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) + @io.swagger.v3.oas.annotations.Operation(operationId = "getCodeBook", summary = "Produce a codebook from a DDI") + public Response getCodeBook( @HeaderParam("Accept") String acceptHeader, + @Parameter(schema = @Schema(type = "string", format = "binary", description = "file in DDI")) + @FormDataParam("file") InputStream isDDI, + @Parameter(schema = @Schema(type = "string", format = "binary", description = "file 2")) + @FormDataParam(value = "dicoVar") InputStream isCodeBook) throws IOException, RmesException { + String ddi = IOUtils.toString(isDDI, StandardCharsets.UTF_8); + File codeBookFile = fr.insee.rmes.utils.FileUtils.streamToFile(isCodeBook, "dicoVar",".odt"); + return operationsService.getCodeBookExport(ddi,codeBookFile, acceptHeader); + } + + /** + * UPDATE + * @param id + * @param body + * @return + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_CNIS }) + @PUT + @Path("/operation/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setOperationById", summary = "Update operation") + public Response setOperationById( + @PathParam(Constants.ID) String id, + @RequestBody(description = "Operation to update", required = true, + content = @Content(schema = @Schema(implementation = Operation.class))) String body) { + try { + operationsService.setOperation(id, body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(Status.NO_CONTENT).build(); + } + + /** + * CREATE + * @param body + * @return + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) + @POST + @Path("/operation") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "createOperation", summary = "Create operation") + public Response createOperation( + @RequestBody(description = "Operation to create", required = true, + content = @Content(schema = @Schema(implementation = Operation.class))) String body) { + String id = null; + try { + id = operationsService.createOperation(body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + /** + * PUBLISH + * @param id + * @return response + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) + @PUT + @Path("/operation/validate/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setOperationValidation", summary = "Operation validation") + public Response setOperationValidation( + @PathParam(Constants.ID) String id) throws RmesException { + try { + operationsService.setOperationValidation(id); + } catch (RmesException e) { + return returnRmesException(e); + } + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + +} diff --git a/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java b/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java new file mode 100644 index 000000000..2adf43bd5 --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java @@ -0,0 +1,214 @@ +package fr.insee.rmes.webservice.operations; + +import javax.ws.rs.Consumes; +import javax.ws.rs.GET; +import javax.ws.rs.HeaderParam; +import javax.ws.rs.POST; +import javax.ws.rs.PUT; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.HttpHeaders; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.Response.Status; + +import org.apache.http.HttpStatus; +import org.springframework.security.access.annotation.Secured; +import org.springframework.stereotype.Component; + +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.config.auth.roles.Roles; +import fr.insee.rmes.config.swagger.model.IdLabelAltLabel; +import fr.insee.rmes.config.swagger.model.IdLabelAltLabelSims; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.operations.Operation; +import fr.insee.rmes.model.operations.Series; +import fr.insee.rmes.utils.XMLUtils; +import fr.insee.rmes.webservice.OperationsAbstResources; +import io.swagger.v3.oas.annotations.Parameter; +import io.swagger.v3.oas.annotations.media.Content; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.parameters.RequestBody; +import io.swagger.v3.oas.annotations.responses.ApiResponse; + + +@Component +@Path("/operations") +public class SeriesResources extends OperationsAbstResources { + + + /*************************************************************************************************** + * SERIES + ******************************************************************************************************/ + @GET + @Path("/series") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSeries", summary = "List of series", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) + public Response getSeries() throws RmesException { + String jsonResultat = operationsService.getSeries(); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/series/withSims") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesWithSims", summary = "List of series with related sims", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabelSims.class)))}) + public Response getSeriesWIthSims() throws RmesException { + String jsonResultat = operationsService.getSeriesWithSims(); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/series/{id}") + @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesByID", + summary = "Series", responses = { @ApiResponse(content = @Content(schema = @Schema(implementation = Series.class)))}) + public Response getSeriesByID(@PathParam(Constants.ID) String id, + @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { + String resultat; + if (header != null && header.equals(MediaType.APPLICATION_XML)) { + try { + resultat=XMLUtils.produceXMLResponse(operationsService.getSeriesByID(id)); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + } else { + try { + resultat = operationsService.getSeriesJsonByID(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + } + return Response.status(HttpStatus.SC_OK).entity(resultat).build(); + } + + @GET + @Path("/series/advanced-search") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesForSearch", summary = "Series", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Series.class)))}) + public Response getSeriesForSearch() { + String jsonResultat; + try { + jsonResultat = operationsService.getSeriesForSearch(); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_CNIS }) + @PUT + @Path("/series/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setSeriesById", summary = "Update series") + public Response setSeriesById( + @PathParam(Constants.ID) String id, + @RequestBody(description = "Series to update", required = true, + content = @Content(schema = @Schema(implementation = Series.class)))String body) { + try { + operationsService.setSeries(id, body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(Status.NO_CONTENT).build(); + } + + @GET + @Path("/series/{id}/operationsWithoutReport") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getOperationsWithoutReport", summary = "Operations without metadataReport", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=Operation.class)))}) + public Response getOperationsWithoutReport(@PathParam(Constants.ID) String id) { + String jsonResultat; + try { + jsonResultat = operationsService.getOperationsWithoutReport(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + + /** + * CREATE + * @param body + * @return response + */ + @Secured({ Roles.SPRING_ADMIN }) + @POST + @Path("/series") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "createSeries", summary = "Create series") + public Response createSeries( + @RequestBody(description = "Series to create", required = true, + content = @Content(schema = @Schema(implementation = Series.class))) String body) { + String id = null; + try { + id = operationsService.createSeries(body); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + /** + * PUBLISH + * @param id + * @return response + */ + @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) + @PUT + @Path("/series/validate/{id}") + @Consumes(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "setSeriesValidation", summary = "Series validation") + public Response setSeriesValidation( + @PathParam(Constants.ID) String id) throws RmesException { + try { + operationsService.setSeriesValidation(id); + } catch (RmesException e) { + return returnRmesException(e); + } + return Response.status(HttpStatus.SC_OK).entity(id).build(); + } + + + @GET + @Path("/series/seriesForStamp/{stamp}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "seriesForStamp", summary = "Series with given stamp") + public Response getSeriesForStamp(@Parameter( + description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", + required = true, + schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp + ) throws RmesException { + String jsonResultat = operationsService.getSeriesForStamp(stamp); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/series/seriesIdsForStamp/{stamp}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Ids of Series with given stamp") + public Response getSeriesIdsForStamp(@Parameter( + description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", + required = true, + schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp + ) throws RmesException { + String jsonResultat = operationsService.getSeriesIdsForStamp(stamp); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET + @Path("/series/seriesWithStamp/{stamp}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Series with given stamp as creator") + public Response getSeriesWithStamp(@Parameter( + description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", + required = true, + schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp + ) throws RmesException { + String jsonResultat = operationsService.getSeriesWithStamp(stamp); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + +} From 40435b1b8da25e4e5389d4984155944c59e31146 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 2 Feb 2021 12:20:33 +0100 Subject: [PATCH 092/243] Improve ldap connexion for sonar --- .../authentication/LdapConnexion.java | 40 +++++++++++++++++++ .../authentication/stamps/RmesStampsImpl.java | 15 +------ .../RmesUserRolesManagerImpl.java | 16 ++------ 3 files changed, 46 insertions(+), 25 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/external_services/authentication/LdapConnexion.java diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/LdapConnexion.java b/src/main/java/fr/insee/rmes/external_services/authentication/LdapConnexion.java new file mode 100644 index 000000000..933c55047 --- /dev/null +++ b/src/main/java/fr/insee/rmes/external_services/authentication/LdapConnexion.java @@ -0,0 +1,40 @@ +package fr.insee.rmes.external_services.authentication; + +import java.util.Hashtable; + +import javax.naming.Context; +import javax.naming.NamingException; +import javax.naming.directory.DirContext; +import javax.naming.directory.InitialDirContext; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.stereotype.Service; + +import fr.insee.rmes.config.Config; +import fr.insee.rmes.exceptions.RmesException; + +@Service +public class LdapConnexion { + + private LdapConnexion() { + throw new IllegalStateException("Utility class"); + } + + static final Logger logger = LogManager.getLogger(LdapConnexion.class); + + public static DirContext getLdapContext() throws NamingException, RmesException { + if(Config.LDAP_URL != null && !Config.LDAP_URL.isEmpty()) { + logger.info("Connection to LDAP : {}", Config.LDAP_URL); + // Connexion à la racine de l'annuaire + Hashtable environment = new Hashtable<>(); + environment.put(Context.INITIAL_CONTEXT_FACTORY, + "com.sun.jndi.ldap.LdapCtxFactory"); + environment.put(Context.PROVIDER_URL, Config.LDAP_URL); + environment.put(Context.SECURITY_AUTHENTICATION, "none"); + return new InitialDirContext(environment); + }else throw new RmesException(500, "LDAP not found", "Config file is null or empty"); + } + + +} diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/stamps/RmesStampsImpl.java b/src/main/java/fr/insee/rmes/external_services/authentication/stamps/RmesStampsImpl.java index 70d6c1037..8a30ed91b 100644 --- a/src/main/java/fr/insee/rmes/external_services/authentication/stamps/RmesStampsImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/authentication/stamps/RmesStampsImpl.java @@ -1,13 +1,10 @@ package fr.insee.rmes.external_services.authentication.stamps; -import java.util.Hashtable; import java.util.TreeSet; -import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.DirContext; -import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; @@ -21,6 +18,7 @@ import fr.insee.rmes.config.Config; import fr.insee.rmes.config.auth.security.restrictions.StampsRestrictionsService; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.external_services.authentication.LdapConnexion; @Service public class RmesStampsImpl implements StampsService { @@ -35,17 +33,8 @@ public String getStamps() throws RmesException { TreeSet stamps = new TreeSet<>(); try { if(Config.LDAP_URL != null && !Config.LDAP_URL.isEmpty()) { - logger.info("Connection to LDAP : {}", Config.LDAP_URL); - // Connexion à la racine de l'annuaire - Hashtable environment = new Hashtable<>(); - environment.put(Context.INITIAL_CONTEXT_FACTORY, - "com.sun.jndi.ldap.LdapCtxFactory"); - environment.put(Context.PROVIDER_URL, Config.LDAP_URL); - environment.put(Context.SECURITY_AUTHENTICATION, "none"); - DirContext context; - - context = new InitialDirContext(environment); + DirContext context = LdapConnexion.getLdapContext(); // Spécification des critères pour la recherche des unités SearchControls controls = new SearchControls(); diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java index ec1a70bb2..3adf42103 100644 --- a/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/authentication/user_roles_manager/RmesUserRolesManagerImpl.java @@ -2,15 +2,12 @@ import java.io.StringReader; import java.text.MessageFormat; -import java.util.Hashtable; import java.util.List; import java.util.TreeSet; -import javax.naming.Context; import javax.naming.NamingEnumeration; import javax.naming.NamingException; import javax.naming.directory.DirContext; -import javax.naming.directory.InitialDirContext; import javax.naming.directory.SearchControls; import javax.naming.directory.SearchResult; import javax.ws.rs.client.Client; @@ -32,6 +29,7 @@ import fr.insee.rmes.config.Config; import fr.insee.rmes.config.auth.roles.UserRolesManagerService; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.external_services.authentication.LdapConnexion; import fr.insee.rmes.utils.JSONComparator; @Service @@ -101,16 +99,10 @@ public String getRoles() throws RmesException { @Override public String getAgents() throws RmesException { TreeSet agents = new TreeSet<>(new JSONComparator(Constants.LABEL)); - logger.info("Connection to LDAP : {0}", Config.LDAP_URL); + logger.info("Connection to LDAP : {}", Config.LDAP_URL); try { // Connexion à la racine de l'annuaire - Hashtable environment = new Hashtable<>(); - environment.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory"); - environment.put(Context.PROVIDER_URL, Config.LDAP_URL); - environment.put(Context.SECURITY_AUTHENTICATION, "none"); - DirContext context; - - context = new InitialDirContext(environment); + DirContext context = LdapConnexion.getLdapContext(); // Spécification des critères pour la recherche des unités SearchControls controls = new SearchControls(); @@ -130,7 +122,7 @@ public String getAgents() throws RmesException { context.close(); logger.info("Get agents succeed"); } catch (NamingException e) { - logger.error("Get agents failed : {0}", e.getMessage()); + logger.error("Get agents failed : {}", e.getMessage()); throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Get agents failed"); } return agents.toString(); From bb59ca913ee9044bc8877b99001c676bf66f9d68 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 2 Feb 2021 13:32:53 +0100 Subject: [PATCH 093/243] Remove fixme and todo --- .../bauhaus_services/operations/series/SeriesPublication.java | 1 - .../structures/utils/StructureComponentUtils.java | 3 --- 2 files changed, 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java index a0b67c501..97c7eefe9 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java @@ -28,7 +28,6 @@ @Repository public class SeriesPublication extends RdfService { -// TODO : merge into SeriesUtils ? @Autowired FamOpeSerIndUtils famOpeSerUtils; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index cbe4b2b15..add93a7d1 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -241,14 +241,11 @@ public void deleteComponent(JSONObject component, String id, String type) throws boolean findPublishedStructure = false; for (int i = 0; i < structures.length(); i++) { JSONObject structure = (JSONObject) structures.get(i); - //FIXME begin - /* I make a proposal, but I don't really know what you want to do here */ String stateStructure = structure.getString("validationState"); //update state to test foreach if(stateStructure.equals(VALIDATED) || stateStructure.equals(MODIFIED)){ findPublishedStructure = true; break; } - //FIXME end } if(findPublishedStructure){ From 1dac523b6c681d598b69ec78c6508c581f0d2f0d Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 2 Feb 2021 13:55:58 +0100 Subject: [PATCH 094/243] Please sonar --- .../external_services/notifications/RmesNotificationsImpl.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/fr/insee/rmes/external_services/notifications/RmesNotificationsImpl.java b/src/main/java/fr/insee/rmes/external_services/notifications/RmesNotificationsImpl.java index 85c375348..a1c108159 100644 --- a/src/main/java/fr/insee/rmes/external_services/notifications/RmesNotificationsImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/notifications/RmesNotificationsImpl.java @@ -1,5 +1,7 @@ package fr.insee.rmes.external_services.notifications; +import java.util.Arrays; + import javax.jms.Connection; import javax.jms.DeliveryMode; import javax.jms.Destination; @@ -53,6 +55,7 @@ public void notifyCollectionUpdate(String id, String uri) throws RmesException { public void sendMessageToBrocker(String message) throws RmesException { String url = BROKER_URL; ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(Config.BROKER_USER, Config.BROKER_PASSWORD, url); + connectionFactory.setTrustedPackages(Arrays.asList("fr.insee.rmes")); Connection connection = null; try { From 8d29e5d14756409d31d7d5449e957b5c010325bf Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 2 Feb 2021 14:04:06 +0100 Subject: [PATCH 095/243] add parameter file to xslt transformation --- .../documentations/DocumentationExport.java | 26 +++++++++++++++++-- .../xslTransformerFiles/parameters.xml | 1 - 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index ebe8782a5..430e262c7 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -12,6 +12,9 @@ import java.nio.file.StandardCopyOption; import javax.xml.XMLConstants; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; @@ -24,6 +27,10 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.xml.sax.SAXException; import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.exceptions.RmesException; @@ -68,7 +75,22 @@ public File export(String simsXML,String operationXML,String indicatorXML,String String msdXML = documentationsUtils.buildShellSims(); String parametersXML =""; InputStream parametersXMLFile = getClass().getResourceAsStream("/xslTransformerFiles/parameters.xml"); - + + DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); + domFactory.setIgnoringComments(true); + DocumentBuilder docBuilder; + Document doc = null; + try { + docBuilder = domFactory.newDocumentBuilder(); + doc = docBuilder.parse(parametersXMLFile); + Node root=doc.getFirstChild(); + Element newserver=doc.createElement("targetType"); + newserver.setNodeValue(targetType); + root.appendChild(newserver); + } catch (Exception e) { + e.printStackTrace(); + } + try { parametersXML = IOUtils.toString(parametersXMLFile, StandardCharsets.UTF_8); } catch (IOException e) { @@ -98,7 +120,7 @@ public File export(String simsXML,String operationXML,String indicatorXML,String xsltTransformer.setParameter("seriesXML", seriesXML); xsltTransformer.setParameter("msdXML", msdXML); xsltTransformer.setParameter("codeListsXML", codeListsXML); - xsltTransformer.setParameter("parametersXML", parametersXML); + xsltTransformer.setParameter("parametersXML", doc.toString()); // prepare output printStream = new PrintStream(osOutputFile); // transformation diff --git a/src/main/resources/xslTransformerFiles/parameters.xml b/src/main/resources/xslTransformerFiles/parameters.xml index 2981ed851..43c26c2f1 100644 --- a/src/main/resources/xslTransformerFiles/parameters.xml +++ b/src/main/resources/xslTransformerFiles/parameters.xml @@ -1,6 +1,5 @@ - OPERATION 1 2 From 5c760f67b229735aedc25e20c605ce437685e1ac Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Tue, 2 Feb 2021 20:36:22 +0100 Subject: [PATCH 096/243] feat: fake login --- .../stamps/StampsRestrictionServiceImpl.java | 19 ++++++++++++++++++- .../StampsRestrictionsService.java | 3 +++ .../insee/rmes/webservice/UserResources.java | 16 +++++++++++++++- 3 files changed, 36 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java index cf243375d..82a810e3e 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java @@ -3,6 +3,9 @@ import java.util.ArrayList; import java.util.List; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.json.JSONArray; @@ -25,6 +28,8 @@ @Service public class StampsRestrictionServiceImpl extends RdfService implements StampsRestrictionsService { + private User fakeUser; + @Override public boolean isConceptOrCollectionOwner(IRI uri) throws RmesException { User user = getUser(); @@ -67,12 +72,24 @@ public User getUser() { return dvOrQfUser(); } + private User dvOrQfUser() { + if(this.fakeUser != null){ + return this.fakeUser; + } + JSONArray roles = new JSONArray(); roles.put("ROLE_offline_access"); roles.put("ROLE_Administrateur_RMESGNCS"); roles.put("ROLE_uma_authorization"); - return new User(roles, "fakeStampForDvAndQf"); + return new User(roles, "fakeStampForDvAndQf"); + } + + public void setFakeUser(String user) throws JsonProcessingException { + ObjectMapper mapper = new ObjectMapper(); + mapper.configure( + DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + this.fakeUser = mapper.readValue(user, User.class); } private boolean isAdmin(User user) { diff --git a/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java b/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java index 79476bf6f..9c053f87d 100644 --- a/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java +++ b/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java @@ -2,6 +2,7 @@ import java.util.List; +import com.fasterxml.jackson.core.JsonProcessingException; import org.eclipse.rdf4j.model.IRI; import fr.insee.rmes.config.auth.user.User; @@ -60,4 +61,6 @@ public interface StampsRestrictionsService { boolean canValidateIndicator(IRI uri) throws RmesException; boolean canManageDocumentsAndLinks() throws RmesException; + + void setFakeUser(String user) throws JsonProcessingException; } diff --git a/src/main/java/fr/insee/rmes/webservice/UserResources.java b/src/main/java/fr/insee/rmes/webservice/UserResources.java index f9ad1a806..f5d45fe84 100644 --- a/src/main/java/fr/insee/rmes/webservice/UserResources.java +++ b/src/main/java/fr/insee/rmes/webservice/UserResources.java @@ -10,6 +10,10 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import com.fasterxml.jackson.core.JsonProcessingException; +import fr.insee.rmes.config.auth.security.restrictions.StampsRestrictionsService; +import fr.insee.rmes.config.auth.user.User; +import io.swagger.v3.oas.annotations.parameters.RequestBody; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -63,7 +67,8 @@ public class UserResources { @Autowired StampsService stampsService; - + @Autowired + StampsRestrictionsService stampsRestrictionService; @GET @Path("/stamp") @@ -78,6 +83,15 @@ public Response getStamp() { } return Response.status(HttpStatus.SC_OK).entity(stamp).build(); } + + @POST + @Path("/login") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "login", summary = "Fake Login", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = User.class)))}) + public Response login(@RequestBody(description = "Component", required = true) String user) throws JsonProcessingException { + stampsRestrictionService.setFakeUser(user); + return Response.status(HttpStatus.SC_OK).build(); + } @Secured({ Roles.SPRING_ADMIN }) From 635285ad5d1377e4053694060d679cd2ad5bb440 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 3 Feb 2021 08:30:58 +0100 Subject: [PATCH 097/243] Update Config.java --- src/main/java/fr/insee/rmes/config/Config.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/config/Config.java b/src/main/java/fr/insee/rmes/config/Config.java index 841a57c23..16f0467af 100644 --- a/src/main/java/fr/insee/rmes/config/Config.java +++ b/src/main/java/fr/insee/rmes/config/Config.java @@ -5,7 +5,6 @@ public class Config { - public static Object CODE_LIST_BASE_URI = ""; public static String APP_HOST = ""; public static String ENV = ""; @@ -61,6 +60,8 @@ public class Config { public static String CODELIST_GRAPH = ""; + public static String CODE_LIST_BASE_URI = ""; + public static String ORGANIZATIONS_GRAPH = ""; public static String ORG_INSEE_GRAPH = ""; From 6a717e3a53cd6cd61f5070bf0646233f5d886dda Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 3 Feb 2021 09:05:52 +0100 Subject: [PATCH 098/243] Fix issue with spring needed a constructor --- .../rmes/external_services/authentication/LdapConnexion.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/external_services/authentication/LdapConnexion.java b/src/main/java/fr/insee/rmes/external_services/authentication/LdapConnexion.java index 933c55047..4972cacb9 100644 --- a/src/main/java/fr/insee/rmes/external_services/authentication/LdapConnexion.java +++ b/src/main/java/fr/insee/rmes/external_services/authentication/LdapConnexion.java @@ -17,10 +17,6 @@ @Service public class LdapConnexion { - private LdapConnexion() { - throw new IllegalStateException("Utility class"); - } - static final Logger logger = LogManager.getLogger(LdapConnexion.class); public static DirContext getLdapContext() throws NamingException, RmesException { From 3f6a991f6dc7afaf9021f83bbad8fa6694f0d435 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 3 Feb 2021 09:46:25 +0100 Subject: [PATCH 099/243] Refactor series WithStamp and ForStamp --- .../bauhaus_services/OperationsService.java | 5 +- .../operations/OperationsImpl.java | 16 +++--- .../operations/series/SeriesUtils.java | 32 +++-------- .../operations/series/SeriesQueries.java | 7 ++- .../operations/SeriesResources.java | 53 ++++++++++--------- .../series/getSeriesByCreatorStampQuery.ftlh | 7 --- .../series/getSeriesWithStampQuery.ftlh | 2 +- 7 files changed, 49 insertions(+), 73 deletions(-) delete mode 100644 src/main/resources/request/operations/series/getSeriesByCreatorStampQuery.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index ccb31e71f..5394fdff3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -56,9 +56,8 @@ public interface OperationsService { String setSeriesValidation(String body) throws RmesException; - String getSeriesForStamp(String stamp) throws RmesException; + String getSeriesForSearchWithStamp(String stamp) throws RmesException; - String getSeriesIdsForStamp(String stamp) throws RmesException; /****************************************************************************************** * OPERATIONS @@ -150,7 +149,7 @@ public interface OperationsService { String getMSDJson() throws RmesException; - String getMetadataReportDefaultValue() throws IOException; + String getMetadataReportDefaultValue() throws IOException; Status deleteMetadataReport(String id) throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 6a7ce6aa2..134783cde 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -106,7 +106,7 @@ public String getSeries() throws RmesException { @Override public String getSeriesForSearch() throws RmesException { - return seriesUtils.getSeriesForSearch(); + return seriesUtils.getSeriesForSearch(null); } @Override @@ -123,6 +123,11 @@ public String getSeriesWithStamp(String stamp) throws RmesException { return QueryUtils.correctEmptyGroupConcat(resQuery); } + @Override + public String getSeriesForSearchWithStamp(String stamp) throws RmesException { + return seriesUtils.getSeriesForSearch(stamp); + } + @Override public Series getSeriesByID(String id) throws RmesException { return seriesUtils.getSeriesById(id); @@ -449,14 +454,7 @@ public Response exportTestMetadataReport() throws RmesException { return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); } - @Override - public String getSeriesForStamp(String stamp) throws RmesException { - return seriesUtils.getSeriesForStamp(stamp); - } + - @Override - public String getSeriesIdsForStamp(String stamp) throws RmesException { - return seriesUtils.getSeriesIdsForStamp(stamp); - } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java index 919f2c2c3..04b667a70 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java @@ -116,8 +116,9 @@ public JSONObject getSeriesJsonById(String id) throws RmesException { return series; } - public String getSeriesForSearch() throws RmesException { - JSONArray resQuery = repoGestion.getResponseAsArray(SeriesQueries.getSeriesForSearch()); + + public String getSeriesForSearch(String stamp) throws RmesException { + JSONArray resQuery = repoGestion.getResponseAsArray(SeriesQueries.getSeriesForSearch(stamp)); JSONArray result = new JSONArray(); for (int i = 0; i < resQuery.length(); i++) { JSONObject series = resQuery.getJSONObject(i); @@ -126,10 +127,11 @@ public String getSeriesForSearch() throws RmesException { addOneTypeOfLink(idSeries, series, DCTERMS.CONTRIBUTOR, Constants.ORGANIZATIONS); addOneTypeOfLink(idSeries, series, INSEE.DATA_COLLECTOR, Constants.ORGANIZATIONS); addOneTypeOfLink(idSeries, series, DCTERMS.PUBLISHER, Constants.ORGANIZATIONS); - famOpeSerIndUtils.fixOrganizationsNames(series); result.put(series); + famOpeSerIndUtils.fixOrganizationsNames(series); + result.put(series); } return QueryUtils.correctEmptyGroupConcat(result.toString()); - } + } private void addSeriesOperations(String idSeries, JSONObject series) throws RmesException { JSONArray operations = repoGestion.getResponseAsArray(SeriesQueries.getOperations(idSeries)); @@ -413,28 +415,6 @@ public String setSeriesValidation(String id) throws RmesException { return id; } - public String getSeriesForStamp(String stamp) throws RmesException { - JSONArray resQuery = repoGestion.getResponseAsArray(SeriesQueries.getSeriesForSearch()); - JSONArray result = new JSONArray(); - for (int i = 0; i < resQuery.length(); i++) { - JSONObject series = resQuery.getJSONObject(i); - String idSeries = series.get(Constants.ID).toString(); - IRI seriesURI = RdfUtils.objectIRI(ObjectType.SERIES, idSeries); - if(stampsRestrictionsService.isSeriesManager(seriesURI)) { - addSeriesCreators(idSeries, series); - addOneTypeOfLink(idSeries, series, DCTERMS.CONTRIBUTOR, Constants.ORGANIZATIONS); - addOneTypeOfLink(idSeries, series, INSEE.DATA_COLLECTOR, Constants.ORGANIZATIONS); - addOneTypeOfLink(idSeries, series, DCTERMS.PUBLISHER, Constants.ORGANIZATIONS); - famOpeSerIndUtils.fixOrganizationsNames(series); - result.put(series); - } - } - return QueryUtils.correctEmptyGroupConcat(result.toString()); - } - public String getSeriesIdsForStamp(String stamp) throws RmesException { - JSONArray resQuery = repoGestion.getResponseAsArray(SeriesQueries.getSeriesIdsForStamp(stamp)); - return (resQuery.toString()); - } } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java index dac83c677..269da1317 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java @@ -39,11 +39,16 @@ public static String oneSeriesQuery(String id) { return "SELECT " + variables.toString() + " WHERE { \n" + whereClause.toString() + "} \n" + "LIMIT 1"; } - public static String getSeriesForSearch() { + public static String getSeriesForSearch(String stamp) { variables = null; whereClause = null; getSimpleAttr(null); getCodesLists(); + + if (stamp != null) { + addClauseToWhereClause(" ?series dc:creator ?crea ." + + " FILTER (str(?crea) = '" + stamp + "' ) . \n "); + } return "SELECT DISTINCT " + variables.toString() + " WHERE { \n" + whereClause.toString() + "} \n"; } diff --git a/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java b/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java index 2adf43bd5..2a3d9ecb5 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java @@ -96,6 +96,26 @@ public Response getSeriesForSearch() { } return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + + /** + * Get series where stamp is the creator + * If only id, label, altlabel are needed, prefere /series/seriesWithStamp/{stamp} + * @param stamp + * @return + * @throws RmesException + */ + @GET + @Path("/series/advanced-search/{stamp}") + @Produces(MediaType.APPLICATION_JSON) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesForSearchWithStamps", summary = "Series", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Series.class)))}) + public Response getSeriesForSearchWithStamps(@Parameter( + description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", + required = true, + schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp + ) throws RmesException { + String jsonResultat = operationsService.getSeriesForSearchWithStamp(stamp); + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_CNIS }) @PUT @@ -172,36 +192,17 @@ public Response setSeriesValidation( } - @GET - @Path("/series/seriesForStamp/{stamp}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesForStamp", summary = "Series with given stamp") - public Response getSeriesForStamp(@Parameter( - description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", - required = true, - schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp - ) throws RmesException { - String jsonResultat = operationsService.getSeriesForStamp(stamp); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - @GET - @Path("/series/seriesIdsForStamp/{stamp}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Ids of Series with given stamp") - public Response getSeriesIdsForStamp(@Parameter( - description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", - required = true, - schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp - ) throws RmesException { - String jsonResultat = operationsService.getSeriesIdsForStamp(stamp); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - + /** + * Get series where stamp is the creator + * @param stamp + * @return id / label / altLabel + * @throws RmesException + */ @GET @Path("/series/seriesWithStamp/{stamp}") @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Series with given stamp as creator") + @io.swagger.v3.oas.annotations.Operation(operationId = "seriesWithStamp", summary = "Series with given stamp as creator") public Response getSeriesWithStamp(@Parameter( description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", required = true, diff --git a/src/main/resources/request/operations/series/getSeriesByCreatorStampQuery.ftlh b/src/main/resources/request/operations/series/getSeriesByCreatorStampQuery.ftlh deleted file mode 100644 index e6f203fe4..000000000 --- a/src/main/resources/request/operations/series/getSeriesByCreatorStampQuery.ftlh +++ /dev/null @@ -1,7 +0,0 @@ -SELECT ?seriesId - WHERE { - ?series dc:creator ?creators - FILTER ( STR(?creators) = "${STAMP}") - - BIND(STRAFTER(STR(?series),'/operations/serie/') AS ?seriesId) - } \ No newline at end of file diff --git a/src/main/resources/request/operations/series/getSeriesWithStampQuery.ftlh b/src/main/resources/request/operations/series/getSeriesWithStampQuery.ftlh index 2b728b94a..8d9d8b205 100644 --- a/src/main/resources/request/operations/series/getSeriesWithStampQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesWithStampQuery.ftlh @@ -10,7 +10,7 @@ SELECT DISTINCT ?id ?label (group_concat(?altLabelLg1;separator=' || ') as ?altL BIND(STRAFTER(STR(?series),'/operations/serie/') AS ?id) . OPTIONAL{ ?series skos:altLabel ?altLabelLg1 . - FILTER (lang(?altLabelLg1) = ' ${LG1}') + FILTER (lang(?altLabelLg1) = '${LG1}') } } From 94e96eed73443c62bb326a2549ce92dc6dc294dd Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 3 Feb 2021 09:48:13 +0100 Subject: [PATCH 100/243] Remove unused --- .../operations/series/SeriesQueries.java | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java index 269da1317..00741abf1 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/series/SeriesQueries.java @@ -167,17 +167,6 @@ public static String getCreatorsBySeriesUri(String uriSeries) throws RmesExcepti return buildSeriesRequest("getSeriesCreatorsByUriQuery.ftlh", params); } - /** - * @param stamp - * @return String - * @throws RmesException - */ - public static String getSeriesIdsForStamp(String stamp) throws RmesException { - if (params==null) {initParams();} - params.put(STAMP, stamp); - return buildSeriesRequest("getSeriesByCreatorStampQuery.ftlh", params); - } - /** * @param idSeries From 03c1b1764d9ae5c854a04c1dd4dabc0312e8b0c3 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 4 Feb 2021 10:00:55 +0100 Subject: [PATCH 101/243] feat: fake login need to use spring role --- .../stamps/StampsRestrictionServiceImpl.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java index 82a810e3e..2d2eaf93d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java @@ -25,6 +25,8 @@ import fr.insee.rmes.persistance.sparql_queries.operations.indicators.IndicatorsQueries; import fr.insee.rmes.persistance.sparql_queries.operations.series.SeriesQueries; +import static fr.insee.rmes.config.auth.roles.Roles.SPRING_PREFIX; + @Service public class StampsRestrictionServiceImpl extends RdfService implements StampsRestrictionsService { @@ -89,7 +91,14 @@ public void setFakeUser(String user) throws JsonProcessingException { ObjectMapper mapper = new ObjectMapper(); mapper.configure( DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); - this.fakeUser = mapper.readValue(user, User.class); + JSONObject userObject = new JSONObject(user); + + JSONArray roles = userObject.getJSONArray("roles"); + + JSONArray springRoles = new JSONArray(); + roles.forEach(role -> springRoles.put(SPRING_PREFIX + role)); + + this.fakeUser = new User(springRoles, userObject.getString("stamp")); } private boolean isAdmin(User user) { From e3b8d1b11c506791018df0efa8f4f46791c0f438 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 8 Feb 2021 09:07:35 +0100 Subject: [PATCH 102/243] feat: a component / structure should stay Unpublished after an update if the previous state was unpublished --- .../structures/utils/StructureComponentUtils.java | 13 ++++++++++++- .../structures/utils/StructureUtils.java | 13 ++++++++++++- .../sparql_queries/structures/StructureQueries.java | 5 +++++ .../request/structures/getValidationStatus.ftlh | 7 +++++++ 4 files changed, 36 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/request/structures/getValidationStatus.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index cbe4b2b15..c58477bd0 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.util.Arrays; +import javax.validation.Validation; import javax.ws.rs.BadRequestException; import org.apache.commons.lang3.StringUtils; @@ -65,6 +66,10 @@ private void addCodeListRange(JSONObject response) { } } + private String getValidationStatus(String id) throws RmesException { + return repoGestion.getResponseAsObject(StructureQueries.getValidationStatus(id)).getString("state"); + } + public String updateComponent(String componentId, String body) throws RmesException { MutualizedComponent component; try { @@ -80,7 +85,13 @@ public String updateComponent(String componentId, String body) throws RmesExcept validateComponent(component); component.setUpdated(DateUtils.getCurrentDate()); - createRDFForComponent(component, ValidationStatus.MODIFIED); + String status= getValidationStatus(componentId); + if (status.equals(ValidationStatus.UNPUBLISHED.getValue()) || status.equals(Constants.UNDEFINED)) { + createRDFForComponent(component, ValidationStatus.UNPUBLISHED); + } else { + createRDFForComponent(component, ValidationStatus.MODIFIED); + } + return component.getId(); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index c9f20c5d0..128daaa89 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -158,6 +158,10 @@ private String generateNextId() throws RmesException { return prefix + (Integer.parseInt(id) + 1); } + private String getValidationStatus(String id) throws RmesException { + return repoGestion.getResponseAsObject(StructureQueries.getValidationStatus(id)).getString("state"); + } + public String setStructure(String id, String body) throws RmesException { ObjectMapper mapper = new ObjectMapper(); mapper.configure( @@ -175,7 +179,14 @@ public String setStructure(String id, String body) throws RmesException { structure.setUpdated(DateUtils.getCurrentDate()); IRI structureIri = RdfUtils.structureIRI(structure.getId()); repoGestion.clearStructureNodeAndComponents(structureIri); - createRdfStructure(structure, ValidationStatus.MODIFIED); + + String status= getValidationStatus(id); + if (status.equals(ValidationStatus.UNPUBLISHED.getValue()) || status.equals(Constants.UNDEFINED)) { + createRdfStructure(structure, ValidationStatus.UNPUBLISHED); + } else { + createRdfStructure(structure, ValidationStatus.MODIFIED); + } + logger.info("Update Structure : {} - {}", structure.getId(), structure.getLabelLg1()); return structure.getId(); } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java index 3d1075949..363ba4e20 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java @@ -14,6 +14,11 @@ public static String getStructures() throws RmesException { return buildRequest("getStructures.ftlh", params); } + public static String getValidationStatus(String id) throws RmesException { + HashMap params = initParams(); + params.put("id", id); + return buildRequest("getValidationStatus.ftlh", params); + } public static String getStructuresAttachments(String id) throws RmesException { HashMap params = initParams(); params.put("COMPONENT_SPECIFICATION_ID", id); diff --git a/src/main/resources/request/structures/getValidationStatus.ftlh b/src/main/resources/request/structures/getValidationStatus.ftlh new file mode 100644 index 000000000..90f317395 --- /dev/null +++ b/src/main/resources/request/structures/getValidationStatus.ftlh @@ -0,0 +1,7 @@ +SELECT ?state +FROM <${STRUCTURES_GRAPH}> +FROM <${STRUCTURES_COMPONENTS_GRAPH}> +WHERE { + ?structureOrComponent insee:validationState ?state . + FILTER(STRENDS(STR(?structureOrComponent), '${id}')) +} \ No newline at end of file From 03df3b42cb879447c58d6b37eca3f9292f6ac995 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 8 Feb 2021 09:26:01 +0100 Subject: [PATCH 103/243] fix: when deleting a structure, should not delete component --- .../structures/utils/StructureUtils.java | 9 --------- 1 file changed, 9 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 128daaa89..e54a66728 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -356,15 +356,6 @@ private void validateStructure(Structure structure) throws RmesException { } public void deleteStructure(String structureId) throws RmesException { - JSONArray components = repoGestion.getResponseAsArray(StructureQueries.getComponentsForStructure(structureId)); - components.forEach(component -> { - String id = ((JSONObject) component).getString("id"); - String type = ((JSONObject) component).getString("type"); - try { - structureComponentUtils.deleteComponent((JSONObject) component, id, type); - } catch (RmesException e) { - } - }); IRI structureIri = RdfUtils.structureIRI(structureId); repoGestion.clearStructureNodeAndComponents(structureIri); repoGestion.deleteObject(structureIri, null); From 9f37900dc103bcc3108a2716533f5536b830f102 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 12:05:47 +0100 Subject: [PATCH 104/243] Fix issue with Saxon -Spring and Transformer security --- .../operations/operations/VarBookExportBuilder.java | 4 ---- src/main/java/fr/insee/rmes/utils/XMLUtils.java | 4 +--- 2 files changed, 1 insertion(+), 7 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/VarBookExportBuilder.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/VarBookExportBuilder.java index d692c55c6..fd9d66a87 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/VarBookExportBuilder.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/VarBookExportBuilder.java @@ -18,9 +18,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.fusesource.hawtbuf.ByteArrayInputStream; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.springframework.web.client.RestTemplate; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; @@ -39,8 +37,6 @@ public class VarBookExportBuilder { static final Logger logger = LogManager.getLogger(VarBookExportBuilder.class); - @Autowired - RestTemplate restTemplate; public String getData(String xml) throws RmesException { Document xmlReadyToExport = transformXml(xml); diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 53b501907..69467b5ed 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -45,9 +45,7 @@ private XMLUtils() { public static final String toString(Document xml) throws TransformerFactoryConfigurationError, TransformerException { - TransformerFactory tf = TransformerFactory.newInstance(); - tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_DTD, ""); - tf.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, ""); + TransformerFactory tf = TransformerFactory.newDefaultInstance(); Transformer transformer = tf.newTransformer(); Writer out = new StringWriter(); transformer.transform(new DOMSource(xml), new StreamResult(out)); From e85677e68b87f7c0808c5d9642728fecfbfd7968 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 12:43:33 +0100 Subject: [PATCH 105/243] Fix minor issues --- .../rmes/external_services/export/Jasper.java | 34 ------------------- .../external_services/export/XDocReport.java | 2 +- 2 files changed, 1 insertion(+), 35 deletions(-) diff --git a/src/main/java/fr/insee/rmes/external_services/export/Jasper.java b/src/main/java/fr/insee/rmes/external_services/export/Jasper.java index 0a0f2a57d..e7600fbfa 100644 --- a/src/main/java/fr/insee/rmes/external_services/export/Jasper.java +++ b/src/main/java/fr/insee/rmes/external_services/export/Jasper.java @@ -4,7 +4,6 @@ import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; -import java.util.HashMap; import java.util.Map; import org.apache.http.HttpStatus; @@ -28,7 +27,6 @@ import net.sf.jasperreports.engine.JasperPrint; import net.sf.jasperreports.engine.JasperReport; import net.sf.jasperreports.engine.JasperReportsContext; -import net.sf.jasperreports.engine.data.JRXmlDataSource; import net.sf.jasperreports.engine.design.JasperDesign; import net.sf.jasperreports.engine.export.JRPdfExporter; import net.sf.jasperreports.engine.export.JRRtfExporter; @@ -70,16 +68,6 @@ public InputStream exportCollection(JSONObject json, String acceptHeader) { return null; } - public InputStream exportVariableBook(String xml, String acceptHeader) { - InputStream is = getClass().getClassLoader().getResourceAsStream("jasper/export_varBook.jrxml"); - try { - return exportXml(xml, is, acceptHeader); - } catch (Exception e) { - logger.error(e.getMessage(), e); - } - return null; - } - /** * Generic export method from json data * @param json data to export @@ -106,28 +94,6 @@ private static InputStream exportJson(JSONObject json, InputStream is, String ac return new ByteArrayInputStream(output.toByteArray()); } - /** - * Generic export method from xml data - * @param xml data to export - * @param is jasper template - * @param acceptHeader mimeType - * @return - * @throws JRException - * @throws Exception - */ - private InputStream exportXml(String xml, InputStream is, String acceptHeader) throws JRException { - Map jasperParams = new HashMap<>(); - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); - String pathJasper = classLoader.getResource("jasper/export_varBook.jrxml").getPath() - .replace("export_varBook.jrxml", "").substring(1).replace("%20", " "); - jasperParams.put("PATH_JASPER", pathJasper); - InputStream xmlInput = new ByteArrayInputStream(xml.getBytes()); - JRDataSource datasource = new JRXmlDataSource(xmlInput, "/*[local-name()='DDIInstance']", true); - getJrProperties(); - ByteArrayOutputStream output = exportReport(is, acceptHeader, jasperParams, datasource); - return new ByteArrayInputStream(output.toByteArray()); - } - @SuppressWarnings({ "unchecked", "rawtypes" }) private static ByteArrayOutputStream exportReport(InputStream is, String acceptHeader, Map jasperParams, JRDataSource dataSource) throws JRException { diff --git a/src/main/java/fr/insee/rmes/external_services/export/XDocReport.java b/src/main/java/fr/insee/rmes/external_services/export/XDocReport.java index 0d6735966..11cd40dea 100644 --- a/src/main/java/fr/insee/rmes/external_services/export/XDocReport.java +++ b/src/main/java/fr/insee/rmes/external_services/export/XDocReport.java @@ -60,7 +60,7 @@ public OutputStream exportVariableBookInPdf(String xmlFilename, String odtTempla } @Deprecated - public OutputStream exportVariableBookInOdt(String xml, String odtTemplate) throws Exception { + public OutputStream exportVariableBookInOdt(String xml, String odtTemplate) throws IOException, XDocReportException, RmesException { // 1) Load DOCX into XWPFDocument IXDocReport report = getReportTemplate(odtTemplate); From d4f002ee493f63f2d9cb7dcfc34cc520492edfe2 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 12:45:07 +0100 Subject: [PATCH 106/243] Log --- .../external_services/export/XDocReport.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/fr/insee/rmes/external_services/export/XDocReport.java b/src/main/java/fr/insee/rmes/external_services/export/XDocReport.java index 11cd40dea..611cc8d0a 100644 --- a/src/main/java/fr/insee/rmes/external_services/export/XDocReport.java +++ b/src/main/java/fr/insee/rmes/external_services/export/XDocReport.java @@ -52,8 +52,7 @@ public OutputStream exportVariableBookInPdf(String xmlFilename, String odtTempla report.convert(context, options, oFile); } catch (XDocReportException | IOException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + logger.error(e.getMessage()); } return oFile; @@ -81,14 +80,14 @@ public OutputStream exportVariableBookInOdt(String xml, File odtTemplate) throws try { report = getReportTemplate(odtTemplate); - // 2) Create Java model context - IContext context = getXmlData(report, xml); - - // 3) Generate report by merging Java model with the ODT - oFile = createOutputFile(false); - report.process(context, oFile);} catch (IOException | XDocReportException e) { - // TODO Auto-generated catch block - e.printStackTrace(); + // 2) Create Java model context + IContext context = getXmlData(report, xml); + + // 3) Generate report by merging Java model with the ODT + oFile = createOutputFile(false); + report.process(context, oFile); + }catch (IOException | XDocReportException e) { + logger.error(e.getMessage()); } return oFile; } From 7b332c22a521fcd0b4ac5f7fe8f5c4ebbf619176 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 13:39:59 +0100 Subject: [PATCH 107/243] Remove unused --- pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 0772cb0e5..f7cae151d 100644 --- a/pom.xml +++ b/pom.xml @@ -441,12 +441,7 @@ jdom 1.0 - - - jaxen - jaxen - 1.1.1 - + org.jsoup @@ -494,7 +489,6 @@ maven-surefire-plugin - 2.22.2 **/*Test.java From ec1099244bd08e0284e3c95e2db9d5b8b04169bc Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 13:41:36 +0100 Subject: [PATCH 108/243] Update pom.xml --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index f7cae151d..c4ac2dce8 100644 --- a/pom.xml +++ b/pom.xml @@ -45,6 +45,7 @@ 2.13.3 5.7.0 UTF-8 + 2.22.2 src/main/java/fr/insee/rmes/queries/**/*, From c79d591c3e9ff62c721a682ed57b37b47b5c63c7 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 13:51:14 +0100 Subject: [PATCH 109/243] Try to fix issue --- src/main/java/fr/insee/rmes/utils/XMLUtils.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 69467b5ed..927c4c2da 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -33,6 +33,7 @@ import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationJsonMixIn; import fr.insee.rmes.model.operations.documentations.Documentation; +import net.sf.saxon.TransformerFactoryImpl; public class XMLUtils { @@ -45,7 +46,7 @@ private XMLUtils() { public static final String toString(Document xml) throws TransformerFactoryConfigurationError, TransformerException { - TransformerFactory tf = TransformerFactory.newDefaultInstance(); + TransformerFactory tf = TransformerFactoryImpl.newDefaultInstance(); Transformer transformer = tf.newTransformer(); Writer out = new StringWriter(); transformer.transform(new DOMSource(xml), new StreamResult(out)); From e3a34205c9c27ecdcefd7252ce5af79ae28a935c Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 13:54:59 +0100 Subject: [PATCH 110/243] Update XMLUtils.java --- src/main/java/fr/insee/rmes/utils/XMLUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 927c4c2da..69467b5ed 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -33,7 +33,6 @@ import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationJsonMixIn; import fr.insee.rmes.model.operations.documentations.Documentation; -import net.sf.saxon.TransformerFactoryImpl; public class XMLUtils { @@ -46,7 +45,7 @@ private XMLUtils() { public static final String toString(Document xml) throws TransformerFactoryConfigurationError, TransformerException { - TransformerFactory tf = TransformerFactoryImpl.newDefaultInstance(); + TransformerFactory tf = TransformerFactory.newDefaultInstance(); Transformer transformer = tf.newTransformer(); Writer out = new StringWriter(); transformer.transform(new DOMSource(xml), new StreamResult(out)); From a71ef9ce17736c168f7be2de357768ee7e5f12af Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 14:00:20 +0100 Subject: [PATCH 111/243] Try... --- pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pom.xml b/pom.xml index c4ac2dce8..1c20c2829 100644 --- a/pom.xml +++ b/pom.xml @@ -442,6 +442,13 @@ jdom 1.0 + + + + jaxen + jaxen + 1.1.1 + From c55eac57d379e130f9c20c5a6fbf800fe96a03cd Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 14:07:58 +0100 Subject: [PATCH 112/243] Revert "Try..." This reverts commit a71ef9ce17736c168f7be2de357768ee7e5f12af. --- pom.xml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/pom.xml b/pom.xml index 1c20c2829..c4ac2dce8 100644 --- a/pom.xml +++ b/pom.xml @@ -442,13 +442,6 @@ jdom 1.0 - - - - jaxen - jaxen - 1.1.1 - From 05e1d076c8bf00fd3aa66608d484e9a10a095930 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 8 Feb 2021 14:12:36 +0100 Subject: [PATCH 113/243] Update XMLUtils.java --- src/main/java/fr/insee/rmes/utils/XMLUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 69467b5ed..43896f951 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -45,7 +45,7 @@ private XMLUtils() { public static final String toString(Document xml) throws TransformerFactoryConfigurationError, TransformerException { - TransformerFactory tf = TransformerFactory.newDefaultInstance(); + TransformerFactory tf = TransformerFactory.newInstance(); Transformer transformer = tf.newTransformer(); Writer out = new StringWriter(); transformer.transform(new DOMSource(xml), new StreamResult(out)); From b204cc73fd1fed5296a46d004bb8d52aa376d3ca Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 10 Feb 2021 15:28:44 +0100 Subject: [PATCH 114/243] Fix issue with LDAP connexion --- pom.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/pom.xml b/pom.xml index c4ac2dce8..5283aa9c3 100644 --- a/pom.xml +++ b/pom.xml @@ -449,6 +449,14 @@ jsoup 1.7.2 + + + + + jaxen + jaxen + 1.1.1 + From f6fa279f636712c2046c93ced698b90ee126ab3e Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 10 Feb 2021 15:32:05 +0100 Subject: [PATCH 115/243] adapt sims export --- .../rmes/bauhaus_services/Constants.java | 10 + .../bauhaus_services/OperationsService.java | 2 +- .../operations/OperationsImpl.java | 4 +- .../documentations/DocumentationExport.java | 109 +- .../documentations/DocumentationsUtils.java | 32 +- .../java/fr/insee/rmes/utils/XMLUtils.java | 2 +- .../rmes/webservice/OperationsResources.java | 2 +- .../xslTransformerFiles/parameters.xml | 1 + .../xslTransformerFiles/rmesPattern.fodt | 962 ++++++++---------- .../xslTransformerFiles/sims2fodt.xsl | 480 +++++++++ .../xslTransformerFiles/sims2fodt_v5.xsl | 536 ++++++++++ .../xslTransformerFiles/sims2fodt_v6.xsl | 480 +++++++++ 12 files changed, 2031 insertions(+), 589 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/sims2fodt.xsl create mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v5.xsl create mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index a8546cae5..644cbac14 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -103,6 +103,16 @@ public class Constants { /*X*/ public static final String XML_OPEN_CODELIST_TAG = ""; public static final String XML_END_CODELIST_TAG = ""; + public static final String XML_OPEN_PARAMETERS_TAG = ""; + public static final String XML_END_PARAMETERS_TAG = ""; + public static final String XML_OPEN_LANGUAGES_TAG = ""; + public static final String XML_END_LANGUAGES_TAG = ""; + public static final String XML_OPEN_LANGUAGE_TAG = ""; + public static final String XML_END_LANGUAGE_TAG = ""; + public static final String XML_OPEN_TARGET_TYPE_TAG = ""; + public static final String XML_END_TARGET_TYPE_TAG = ""; + public static final String XML_OPEN_INCLUDE_EMPTY_MAS_TAG = ""; + public static final String XML_END_INCLUDE_EMPTY_MAS_TAG = ""; private Constants() { throw new IllegalStateException("Utility class"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index ccb31e71f..c3eed3945 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -142,7 +142,7 @@ public interface OperationsService { String publishMetadataReport(String id) throws RmesException; - Response exportMetadataReport(String id) throws RmesException; + Response exportMetadataReport(String id, Boolean includeEmptyMas) throws RmesException; Response exportTestMetadataReport() throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 985c33e0f..526c9edb3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -420,11 +420,11 @@ public String publishMetadataReport(String id) throws RmesException { @Override - public Response exportMetadataReport(String id) throws RmesException { + public Response exportMetadataReport(String id, Boolean includeEmptyMas) throws RmesException { File output; InputStream is; try { - output = documentationsUtils.exportMetadataReport(id); + output = documentationsUtils.exportMetadataReport(id,includeEmptyMas); is = new FileInputStream(output); } catch (Exception e1) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 430e262c7..f64bd7cf8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -10,11 +10,10 @@ import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.StandardCopyOption; +import java.util.ArrayList; +import java.util.List; import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; import javax.xml.transform.TransformerFactory; @@ -22,19 +21,15 @@ import javax.xml.transform.stream.StreamSource; import org.apache.commons.io.FileUtils; -import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.xml.sax.SAXException; import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.external_services.export.ExportUtils; +import fr.insee.rmes.utils.XMLUtils; @Component public class DocumentationExport { @@ -69,39 +64,18 @@ public File testExport() throws IOException { } public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, - String organizationsXML, String codeListsXML, String targetType) throws RmesException, IOException { + String organizationsXML, String codeListsXML, String targetType, Boolean includeEmptyMas) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXML = documentationsUtils.buildShellSims(); - String parametersXML =""; - InputStream parametersXMLFile = getClass().getResourceAsStream("/xslTransformerFiles/parameters.xml"); - - DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); - domFactory.setIgnoringComments(true); - DocumentBuilder docBuilder; - Document doc = null; - try { - docBuilder = domFactory.newDocumentBuilder(); - doc = docBuilder.parse(parametersXMLFile); - Node root=doc.getFirstChild(); - Element newserver=doc.createElement("targetType"); - newserver.setNodeValue(targetType); - root.appendChild(newserver); - } catch (Exception e) { - e.printStackTrace(); - } - - try { - parametersXML = IOUtils.toString(parametersXMLFile, StandardCharsets.UTF_8); - } catch (IOException e) { - logger.error("Failed to read the xml : ", e); - } + List languages = new ArrayList(); + String parametersXML = buildParams(languages,includeEmptyMas,targetType); File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/testXSLT.xsl"); + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt_v6.xsl"); OutputStream osOutputFile = FileUtils.openOutputStream(output); InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); @@ -114,13 +88,15 @@ public File export(String simsXML,String operationXML,String indicatorXML,String transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); // set parameters - xsltTransformer.setParameter("simsXML", simsXML); - xsltTransformer.setParameter("operationXML", operationXML); - xsltTransformer.setParameter("indicatorXML", indicatorXML); - xsltTransformer.setParameter("seriesXML", seriesXML); - xsltTransformer.setParameter("msdXML", msdXML); - xsltTransformer.setParameter("codeListsXML", codeListsXML); - xsltTransformer.setParameter("parametersXML", doc.toString()); + xsltTransformer.setParameter("Sims", simsXML); + xsltTransformer.setParameter("Organizations", organizationsXML); + xsltTransformer.setParameter("Operation", operationXML); + xsltTransformer.setParameter("Indicator", indicatorXML); + xsltTransformer.setParameter("Series", seriesXML); + xsltTransformer.setParameter("Msd", msdXML); + xsltTransformer.setParameter("CodeLists", codeListsXML); + xsltTransformer.setParameter("parameters", XMLUtils.convertStringToDocument(parametersXML)); + //xsltTransformer.setParameter("parameters", doc.toString()); // prepare output printStream = new PrintStream(osOutputFile); // transformation @@ -137,6 +113,59 @@ public File export(String simsXML,String operationXML,String indicatorXML,String return(output); } + private String buildParams(List languages, Boolean includeEmptyMas, String targetType) { + String includeEmptyMasString=( includeEmptyMas ? "true" : "false"); + String parametersXML=""; + parametersXML=parametersXML.concat(Constants.XML_OPEN_PARAMETERS_TAG); + + parametersXML=parametersXML.concat(Constants.XML_OPEN_LANGUAGES_TAG); + // for(String language : languages) { + // parametersXML=parametersXML.concat(Constants.XML_OPEN_LANGUAGE_TAG); + // parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGE_TAG); + // } + parametersXML=parametersXML.concat("1\r\n2"); + parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGES_TAG); + + parametersXML=parametersXML.concat(Constants.XML_OPEN_INCLUDE_EMPTY_MAS_TAG); + parametersXML=parametersXML.concat(includeEmptyMasString); + parametersXML=parametersXML.concat(Constants.XML_END_INCLUDE_EMPTY_MAS_TAG); + + parametersXML=parametersXML.concat(Constants.XML_OPEN_TARGET_TYPE_TAG); + parametersXML=parametersXML.concat(targetType); + parametersXML=parametersXML.concat(Constants.XML_END_TARGET_TYPE_TAG); + + parametersXML=parametersXML.concat(Constants.XML_END_PARAMETERS_TAG); + return XMLUtils.encodeXml(parametersXML); + + // return XMLUtils.convertStringToDocument(parametersXML).toString(); + + /* + InputStream parametersXMLFile = getClass().getResourceAsStream("/xslTransformerFiles/parameters.xml"); + DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); + domFactory.setIgnoringComments(true); + DocumentBuilder docBuilder; + Document doc = null; + try { + docBuilder = domFactory.newDocumentBuilder(); + doc = docBuilder.parse(parametersXMLFile); + Node root=doc.getFirstChild(); + Element targetTypeNode=doc.createElement("targetType"); + targetTypeNode.setNodeValue(targetType); + Element includeEmptyMasNode=doc.createElement("includeEmptyMas"); + includeEmptyMasNode.setNodeValue(includeEmptyMasString); + root.appendChild(targetTypeNode); + root.appendChild(includeEmptyMasNode); + } catch (Exception e) { + e.printStackTrace(); + } + try { + parametersXML = IOUtils.toString(parametersXMLFile, StandardCharsets.UTF_8); + } catch (IOException e) { + logger.error("Failed to read the xml : ", e); + } + */ + } + public File exportOld(InputStream inputFile, String absolutePath, String accessoryAbsolutePath, String organizationsAbsolutePath, String codeListAbsolutePath, String targetType) throws RmesException, IOException { diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 7c40d0185..80e8ccac9 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -266,18 +266,18 @@ public String publishMetadataReport(String id) throws RmesException { String targetType = target[0]; String targetId = target[1]; IRI targetUri = null; - + if (targetId.isEmpty()) { throw new RmesNotFoundException(ErrorCodes.SIMS_UNKNOWN_TARGET, "target not found for this Sims", id); } switch(targetType) { - case Constants.OPERATION_UP : targetUri = RdfUtils.objectIRI(ObjectType.OPERATION, targetId); break; - case Constants.SERIES_UP : targetUri = RdfUtils.objectIRI(ObjectType.SERIES, targetId); break; - case Constants.INDICATOR_UP : targetUri = RdfUtils.objectIRI(ObjectType.INDICATOR, targetId); break; - default : break; + case Constants.OPERATION_UP : targetUri = RdfUtils.objectIRI(ObjectType.OPERATION, targetId); break; + case Constants.SERIES_UP : targetUri = RdfUtils.objectIRI(ObjectType.SERIES, targetId); break; + case Constants.INDICATOR_UP : targetUri = RdfUtils.objectIRI(ObjectType.INDICATOR, targetId); break; + default : break; } - + /* Check rights */ if (!stampsRestrictionsService.canCreateSims(targetUri)) { throw new RmesUnauthorizedException(ErrorCodes.SIMS_CREATION_RIGHTS_DENIED, @@ -504,12 +504,12 @@ public String getDocumentationOwnersByIdSims(String idSims) throws RmesException } return stamps; } - + public File exportTestMetadataReport() throws IOException { return docExport.testExport(); } - public File exportMetadataReport(String id) throws IOException, RmesException { + public File exportMetadataReport(String id, Boolean includeEmptyMas) throws IOException, RmesException { String emptyXML=XMLUtils.produceEmptyXML(); Operation operation; @@ -517,7 +517,7 @@ public File exportMetadataReport(String id) throws IOException, RmesException { String operationXML; String seriesXML = emptyXML; String indicatorXML; - + String[] target = getDocumentationTargetTypeAndId(id); String targetType = target[0]; String idDatabase = target[1]; @@ -551,16 +551,16 @@ public File exportMetadataReport(String id) throws IOException, RmesException { seriesXML = XMLUtils.produceXMLResponse(series); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); - } else {indicatorXML = emptyXML;} - - + } else {indicatorXML = emptyXML;} + + if (targetType.equals(Constants.SERIES_UP)) { seriesXML=XMLUtils.produceXMLResponse( seriesUtils.getSeriesById(idDatabase)); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); } - + String organizationsXML = XMLUtils.produceXMLResponse(organizationsServiceImpl.getOrganizations()); String simsXML=XMLUtils.produceResponse(getFullSims(id), "application/xml"); @@ -577,7 +577,7 @@ public File exportMetadataReport(String id) throws IOException, RmesException { codeListsXML=codeListsXML.concat(Constants.XML_END_CODELIST_TAG); return docExport.export(simsXML,operationXML,indicatorXML,seriesXML, - organizationsXML,codeListsXML,targetType); + organizationsXML,codeListsXML,targetType,includeEmptyMas); } public File exportMetadataReportOld(String id) throws IOException, RmesException { @@ -670,8 +670,8 @@ public File exportMetadataReportOld(String id) throws IOException, RmesException return docExport.exportOld(simsInputStream,absolutePath,accessoryAbsolutePath, organizationsAbsolutePath,codeListAbsolutePath,targetType); } - - + + public MSD buildMSDFromJson(JSONArray jsonMsd) { List msd = new ArrayList<>(); MAS currentRubric; diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 337c1e392..bd2e92fe8 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -125,7 +125,7 @@ public static List getTagValues(String text, String tag) { return tagValues; } - private static String encodeXml(String response) { + public static String encodeXml(String response) { String ret = StringEscapeUtils.unescapeXml(response); ret = StringEscapeUtils.unescapeHtml4(ret); diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 6cf570365..5cede907c 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -825,7 +825,7 @@ public Response getSimsExport(@Parameter( required = true, schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id ) throws RmesException { - return operationsService.exportMetadataReport(id); + return operationsService.exportMetadataReport(id,true); } @GET diff --git a/src/main/resources/xslTransformerFiles/parameters.xml b/src/main/resources/xslTransformerFiles/parameters.xml index 43c26c2f1..738a1fbe9 100644 --- a/src/main/resources/xslTransformerFiles/parameters.xml +++ b/src/main/resources/xslTransformerFiles/parameters.xml @@ -4,6 +4,7 @@ 1 2 + true diff --git a/src/main/resources/xslTransformerFiles/rmesPattern.fodt b/src/main/resources/xslTransformerFiles/rmesPattern.fodt index 6cf88458a..3b4043f0d 100644 --- a/src/main/resources/xslTransformerFiles/rmesPattern.fodt +++ b/src/main/resources/xslTransformerFiles/rmesPattern.fodt @@ -1,529 +1,435 @@ - - - LibreOffice/5.4.6.2$Windows_X86_64 LibreOffice_project/4014ce260a04f1026ba855d3b8d91541c224eab8 - - - 0 - 0 - 24552 - 10245 - true - false - - - view2 - 7710 - 3501 - 0 - 0 - 24550 - 10243 - 0 - 1 - false - 140 - false - false - - - - - false - - - - 1 - true - false - false - true - false - false - true - true - - true - - false - 0 - true - false - false - false - 0 - false - true - false - high-resolution - false - false - false - false - false - true - false - false - false - false - true - false - true - false - - false - false - false - false - true - false - 1118261 - false - false - false - false - false - 1118261 - false - true - false - true - true - false - false - false - false - false - true - false - 0 - true - false - false - true - true - true - false - true - false - true - false - false - true - - false - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${series.prefLabelLg1} - - - - - ${series.prefLabelLg2} - - - - - - - - Informations sur la série : ${series.prefLabelLg1} - Informations about the series: ${series.prefLabelLg2} - - - - - - - - - - Nom court - ${series.altLabelLg1} - Résumé - ${series.abstractLg1} - Historique - ${series.historyNoteLg1} - Type d'opération - #if (${series.typeCode} !='') ${seriesCode.type.labelLg1} #endif - Fréquence de collecte des données - #if (${series.accrualPeriodicityCode} !='') ${seriesCode.accrualPeriodicity.labelLg1} #endif - Organismes responsables - #list(${series.publishers.labelLg1},'\n') - Partenaires - #list(${series.contributors.labelLg1},'\n') - Services collecteurs - #list(${series.dataCollectors.labelLg1},'\n') - Propriétaire - ${series.creators} - Succède à - ${series.replaces.labelLg1} - Remplacée par - ${series.isReplacedBy.labelLg1} - Indicateurs produits - #list(${series.generates.labelLg1},'\n') - Séries ou Indicateurs liés - Séries: - #list(${series.seeAlso.labelLg1},'\n') - Indicateurs: - #list(${series.seeAlso.labelLg1},'\n') - Famille parente - ${series.family.labelLg1} - Opérations filles - ${series.operations.labelLg1} - - - - - - Short name - ${series.altLabelLg2} - Summary - ${series.abstractLg2} - History - ${series.historyNoteLg2} - Operation type - #if (${series.typeCode} !='') ${seriesCode.type.labelLg2} #endif - Data collection frequency - #if (${series.accrualPeriodicityCode} !='') ${seriesCode.accrualPeriodicity.labelLg2} #endif - Replaces - ${series.replaces.labelLg2} - Replaced by - ${series.isReplacedBy.labelLg2} - Series and indicators produced - Series: - #list(${series.seeAlso.labelLg2},'\n') - Indicators: - #list(${series.seeAlso.labelLg2},'\n') - Parent Family - ${series.family.labelLg2} - Daughter operations - ${series.operations.labelLg2} - - - - - - - - Informations sur l'opération : ${operations.prefLabelLg1} - Informations about the operation: ${operations.prefLabelLg2} - - - - - - - - - - Nom court - ${operations.altLabelLg1} - Liens - Je ne sais pas d'où on les sort - Série parente - ${operations.series.labelLg1} - - - - - - Short name - ${operations.altLabelLg2} - Links - Je ne sais pas d'où on les sort - Parent series - ${operations.series.labelLg2} - - - - Informations sur le Sims : ${sims.prefLabelLg1} - - - - - - ${mas.idMas} - ${mas.masLabelLg1} - - - - - - - - - - - - ${mas.idMas} - ${mas.masLabelLg1} - ${simsRubrics.labelLg1} - - - ${mas.idMas} - ${mas.masLabelLg2} - ${simsRubrics.labelLg2} - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${series.prefLabelLg1} + + + + + ${series.prefLabelLg2} + + + + + + + + + ${operation.prefLabelLg1} + + + + + ${operation.prefLabelLg2} + + + + + + + + + ${indicator.prefLabelLg1} + + + + + ${indicator.prefLabelLg2} + + + + + + + + + Informations sur la série : ${series.prefLabelLg1} + Informations about the series: ${series.prefLabelLg2} + + + + + + + + + + Nom court + ${series.altLabelLg1} + Résumé + ${series.abstractLg1} + Historique + ${series.historyNoteLg1} + Type d'opération + ${seriesCode.type.labelLg1} + Fréquence de collecte des données + ${seriesCode.accrualPeriodicity.labelLg1} + Organismes responsables + #list(${series.publishers.labelLg1},'L1') + Partenaires + #list(${series.contributors.labelLg1},'L1') + Services collecteurs + #list(${series.dataCollectors.labelLg1},'L1') + Propriétaire + ${series.creators} + Succède à + ${series.replaces.labelLg1} + Remplacée par + ${series.isReplacedBy.labelLg1} + Indicateurs produits + #list(${series.generates.labelLg1},'L1') + Séries ou Indicateurs liés + Séries: + #list(${series.seeAlso.labelLg1},'L1') + Indicateurs: + #list(${series.seeAlso.labelLg1},'L1') + Famille parente + #list(${series.family.labelLg1},'L1') + Opérations filles + #list(${series.operations.labelLg1},'L1') + + + + Short name + ${series.altLabelLg2} + Summary + ${series.abstractLg2} + History + ${series.historyNoteLg2} + Operation type + ${seriesCode.type.labelLg2} + Data collection frequency + ${seriesCode.accrualPeriodicity.labelLg2} + Replaces + ${series.replaces.labelLg2} + Replaced by + ${series.isReplacedBy.labelLg2} + Series and indicators produced + Series: + #list(${series.seeAlso.labelLg2},'L1') + Indicators: + #list(${series.seeAlso.labelLg2},'L1') + Parent Family + #list(${series.family.labelLg2},'L1') + Daughter operations + #list(${series.operations.labelLg2},'L1') + + + + + + + + + Informations sur l'opération : ${operation.prefLabelLg1} + Informations about the operation: ${operation.prefLabelLg2} + + + + + + + + + + Nom court + ${operation.altLabelLg1} + Liens + Je ne sais pas d'où on les sort + Série parente + ${operation.series.labelLg1} + + + + Short name + ${operation.altLabelLg2} + Links + Je ne sais pas d'où on les sort + Parent series + ${operation.series.labelLg2} + + + + Informations sur le Sims : ${sims.prefLabelLg1} + + + + + + + ${mas.idMas} - ${mas.masLabelLg1} + + + + + + + + + ${mas.idMas} - ${mas.masLabelLg1} + ${simsRubrics.labelLg1} + + + ${mas.idMas} - ${mas.masLabelLg2} + ${simsRubrics.labelLg2} + + + + + + + diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl new file mode 100644 index 000000000..4f00e13e2 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -0,0 +1,480 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Root template + + + + + + + + + + + default template : copy the fodt file, element by element + + + + + + + + + loop on the mas + + + + + + + + + + + + + + + + + + + + + elements with @id are used to filter the pattern, depending on parameters or + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transform variable-name into nodes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v5.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v5.xsl new file mode 100644 index 000000000..67a993179 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/sims2fodt_v5.xsl @@ -0,0 +1,536 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Root template + + + + + + + + + + + default template : copy the fodt file, element by element + + + + + + + + + loop on the mas + + + + + + + + + + + + + + + + + + + + + elements with @id are used to filter the pattern, depending on parameters or + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transform variable-name into nodes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl new file mode 100644 index 000000000..be46d9f5c --- /dev/null +++ b/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl @@ -0,0 +1,480 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Root template + + + + + + + + + + + default template : copy the fodt file, element by element + + + + + + + + + loop on the mas + + + + + + + + + + + + + + + + + + + + + elements with @id are used to filter the pattern, depending on parameters or + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transform variable-name into nodes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From add30fd8d68e4e07bfefc664e6068fedd742701f Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 10 Feb 2021 16:25:30 +0100 Subject: [PATCH 116/243] fix argument --- .../rmes/webservice/operations/MetadataReportResources.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index 68eb0d1bd..aee56efc2 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -277,7 +277,7 @@ public Response getSimsExport(@Parameter( required = true, schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id ) throws RmesException { - return operationsService.exportMetadataReport(id); + return operationsService.exportMetadataReport(id,true); } @GET From a38655200616695b8d0e11464376dd045e84772c Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 10 Feb 2021 16:28:08 +0100 Subject: [PATCH 117/243] Update OperationsResources.java --- .../rmes/webservice/OperationsResources.java | 25 ------------------- 1 file changed, 25 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java index 5cede907c..e76215e63 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java @@ -776,31 +776,6 @@ public Response setSimsValidation( return Response.status(HttpStatus.SC_OK).entity(id).build(); } - @GET - @Path("/series/seriesForStamp/{stamp}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesForStamp", summary = "Series with given stamp") - public Response getSeriesForStamp(@Parameter( - description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", - required = true, - schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp - ) throws RmesException { - String jsonResultat = operationsService.getSeriesForStamp(stamp); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/series/seriesIdsForStamp/{stamp}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Ids of Series with given stamp") - public Response getSeriesIdsForStamp(@Parameter( - description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", - required = true, - schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp - ) throws RmesException { - String jsonResultat = operationsService.getSeriesIdsForStamp(stamp); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } @GET @Path("/series/seriesWithStamp/{stamp}") From ab056df74a4f7f9f2dc61c4545485bdd7f56390c Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 11 Feb 2021 11:58:16 +0100 Subject: [PATCH 118/243] feat: publish a structure component --- .../structures/StructureComponent.java | 2 +- .../impl/StructureComponentImpl.java | 5 ++ .../utils/ComponentPublication.java | 56 +++++++++++++++++++ .../utils/StructureComponentUtils.java | 46 +++++++++++++++ .../fr/insee/rmes/exceptions/ErrorCodes.java | 4 +- .../concepts/ConceptsQueries.java | 6 ++ .../rmes/webservice/StructureResources.java | 14 +++++ .../request/concepts/isConceptValidated.ftlh | 6 ++ 8 files changed, 137 insertions(+), 2 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java create mode 100644 src/main/resources/request/concepts/isConceptValidated.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureComponent.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureComponent.java index e5445ac21..cc5ac99a3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureComponent.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureComponent.java @@ -15,5 +15,5 @@ public interface StructureComponent { public void deleteComponent(String id) throws RmesException; - + public String publishComponent(String id) throws RmesException; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java index 5f7fd876a..95a0d9efc 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureComponentImpl.java @@ -72,4 +72,9 @@ public void deleteComponent(String id) throws RmesException { String type = response.getString("type"); structureComponentUtils.deleteComponent(response, id, type); } + + @Override + public String publishComponent(String id) throws RmesException { + return structureComponentUtils.publishComponent(this.getComponentObject(id)); + } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java new file mode 100644 index 000000000..937fe33de --- /dev/null +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java @@ -0,0 +1,56 @@ +package fr.insee.rmes.bauhaus_services.structures.utils; + +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; +import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; +import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; +import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; +import fr.insee.rmes.exceptions.ErrorCodes; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.exceptions.RmesNotFoundException; +import fr.insee.rmes.external_services.notifications.NotificationsContract; +import fr.insee.rmes.external_services.notifications.RmesNotificationsImpl; +import org.apache.http.HttpStatus; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.repository.RepositoryResult; +import org.springframework.stereotype.Repository; + +@Repository +public class ComponentPublication extends RdfService { + + public void publishComponent(Resource component) throws RmesException { + + Model model = new LinkedHashModel(); + //TODO notify... + RepositoryConnection con = repoGestion.getConnection(); + RepositoryResult statements = repoGestion.getStatements(con, component); + + try { + try { + while (statements.hasNext()) { + Statement st = statements.next(); + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), + st.getPredicate(), + st.getObject(), + st.getContext()); + } + } catch (RepositoryException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), Constants.REPOSITORY_EXCEPTION); + } + + } finally { + repoGestion.closeStatements(statements); + } + Resource componentToPublishRessource = PublicationUtils.tranformBaseURIToPublish(component); + RepositoryPublication.publishResource(componentToPublishRessource, model, Constants.FAMILY); + + } + +} + diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index c58477bd0..46f644155 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -6,6 +6,7 @@ import javax.validation.Validation; import javax.ws.rs.BadRequestException; +import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -21,6 +22,7 @@ import org.eclipse.rdf4j.model.vocabulary.RDFS; import org.json.JSONArray; import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import com.fasterxml.jackson.databind.DeserializationFeature; @@ -47,6 +49,9 @@ public class StructureComponentUtils extends RdfService { public static final String VALIDATED = "Validated"; public static final String MODIFIED = "Modified"; + @Autowired + ComponentPublication componentPublication; + public JSONObject formatComponent(String id, JSONObject response) throws RmesException { response.put(Constants.ID, id); addCodeListRange(response); @@ -275,4 +280,45 @@ public void deleteComponent(JSONObject component, String id, String type) throws } repoGestion.deleteObject(componentIri, null); } + + public String publishComponent(JSONObject component) throws RmesException { + + if(component.isNull("creator") || "".equals(component.getString("creator"))){ + throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_EMPTY_CREATOR, "The creator should not be empty", new JSONArray()); + } + + if(component.isNull("disseminationStatus") || "".equals(component.getString("disseminationStatus"))){ + throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_EMPTY_STATUS, "The dissemination status should not be empty", new JSONArray()); + } + + if(!component.isNull("concept") && !"".equals(component.getString("concept"))){ + if(!repoGestion.getResponseAsBoolean(ConceptsQueries.isConceptValidated(component.getString("concept")))){ + throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_VALIDATED_CONCEPT, "The concept should be validated", new JSONArray()); + } + } + + MutualizedComponent mutualizedComponent; + try { + mutualizedComponent = deserializeBody(component.toString()); + } catch (IOException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "IOException"); + } + mutualizedComponent.setUpdated(DateUtils.getCurrentDate()); + createRDFForComponent(mutualizedComponent, ValidationStatus.VALIDATED); + + String type = component.getString("type"); + String id = component.getString("id"); + + if (type.equals(((SimpleIRI)QB.ATTRIBUTE_PROPERTY).toString())) { + componentPublication.publishComponent(RdfUtils.structureComponentAttributeIRI(id)); + } + if (type.equals(((SimpleIRI)QB.MEASURE_PROPERTY).toString())) { + componentPublication.publishComponent(RdfUtils.structureComponentMeasureIRI(id)); + } + if (type.equals(((SimpleIRI)QB.DIMENSION_PROPERTY).toString())) { + componentPublication.publishComponent(RdfUtils.structureComponentDimensionIRI(id)); + } + + return id; + } } diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index 16950923e..bfcb8509c 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -70,7 +70,9 @@ public class ErrorCodes { public static final int COMPONENT_FORBIDDEN_DELETE = 1001; public static final int COMPONENT_UNICITY = 1002; public static final int STRUCTURE_UNICITY = 1003; - + public static final int COMPONENT_PUBLICATION_EMPTY_CREATOR = 1004; + public static final int COMPONENT_PUBLICATION_EMPTY_STATUS = 1005; + public static final int COMPONENT_PUBLICATION_VALIDATED_CONCEPT = 1006; /* * 404 NOTFOUNDEXCEPTIONS */ diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java index 56a857a78..1f5c44ffa 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java @@ -301,6 +301,12 @@ public static String deleteConcept(String uriConcept, String uriGraph) throws Rm return buildConceptRequest("deleteConceptAndNotesQuery.ftlh", params); } + public static String isConceptValidated(String conceptId) throws RmesException { + if (params==null) {initParams();} + params.put("CONCEPTS_GRAPH", Config.CONCEPTS_GRAPH); + params.put("ID", conceptId); + return buildConceptRequest("isConceptValidated.ftlh", params); + } /** * @param uriConcept diff --git a/src/main/java/fr/insee/rmes/webservice/StructureResources.java b/src/main/java/fr/insee/rmes/webservice/StructureResources.java index ce5bb75d7..473b4ed90 100644 --- a/src/main/java/fr/insee/rmes/webservice/StructureResources.java +++ b/src/main/java/fr/insee/rmes/webservice/StructureResources.java @@ -194,6 +194,20 @@ public Response getComponentById(@PathParam(Constants.ID) String id) { return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + @GET + @Path("/components/{id}/publish") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "publishComponentById", summary = "Publish a component") + public Response publishComponentById(@PathParam(Constants.ID) String id) { + String jsonResultat; + try { + jsonResultat = structureComponentService.publishComponent(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + @DELETE @Path("/components/{id}") @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/resources/request/concepts/isConceptValidated.ftlh b/src/main/resources/request/concepts/isConceptValidated.ftlh new file mode 100644 index 000000000..35df631c7 --- /dev/null +++ b/src/main/resources/request/concepts/isConceptValidated.ftlh @@ -0,0 +1,6 @@ +ASK +FROM <${CONCEPTS_GRAPH}> +WHERE { + ?codelist skos:notation '${ID}' . + ?codelist insee:isValidated true . +} \ No newline at end of file From 9dba9b28fd40f8a5e415c59a88b08c821012b22a Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 11 Feb 2021 14:40:33 +0100 Subject: [PATCH 119/243] fix: should not set hard coded disseminiationStatus --- .../structures/utils/StructureComponentUtils.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 46f644155..73826f38e 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -129,7 +129,6 @@ public String createComponent(MutualizedComponent component, String id) throws R String currentDate = DateUtils.getCurrentDate(); component.setCreated(currentDate); component.setUpdated(currentDate); - component.setDisseminationStatus(DisseminationStatus.PUBLIC_GENERIC.getUrl()); createRDFForComponent(component, ValidationStatus.UNPUBLISHED); return id; } From f5aaba419f209709338201d356d1012580c6ecf6 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 11 Feb 2021 16:40:41 +0100 Subject: [PATCH 120/243] feat: consultation gestion API --- .../ConsultationGestionService.java | 9 +++ .../ConsultationGestionServiceImpl.java | 60 ++++++++++++++++ .../rmes/webservice/ConsultationGestion.java | 71 +++++++++++++++++++ .../consultation-gestion/getAllConcepts.ftlh | 8 +++ .../getDetailedConcept.ftlh | 19 +++++ 5 files changed, 167 insertions(+) create mode 100644 src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java create mode 100644 src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java create mode 100644 src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java create mode 100644 src/main/resources/request/consultation-gestion/getAllConcepts.ftlh create mode 100644 src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java new file mode 100644 index 000000000..99f712d30 --- /dev/null +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java @@ -0,0 +1,9 @@ +package fr.insee.rmes.bauhaus_services.consutation_gestion; + +import fr.insee.rmes.exceptions.RmesException; + +public interface ConsultationGestionService { + String getDetailedConcept(String id) throws RmesException; + + String getAllConcepts() throws RmesException; +} diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java new file mode 100644 index 000000000..1c87e1d64 --- /dev/null +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java @@ -0,0 +1,60 @@ +package fr.insee.rmes.bauhaus_services.consutation_gestion; + +import fr.insee.rmes.bauhaus_services.rdf_utils.FreeMarkerUtils; +import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; +import fr.insee.rmes.config.Config; +import fr.insee.rmes.exceptions.RmesException; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.stereotype.Service; + +import java.util.HashMap; + +@Service +public class ConsultationGestionServiceImpl extends RdfService implements ConsultationGestionService { + @Override + public String getDetailedConcept(String id) throws RmesException { + HashMap params = new HashMap<>(); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); + params.put("ID", id); + params.put("CONCEPTS_GRAPH", Config.CONCEPTS_GRAPH); + + JSONObject concept = repoGestion.getResponseAsObject(buildRequest("getDetailedConcept.ftlh", params)); + JSONArray labels = new JSONArray(); + + + String labelLg1 = concept.getString("prefLabelLg1"); + JSONObject labelLg1Object = new JSONObject(); + labelLg1Object.put("langue", Config.LG1); + labelLg1Object.put("contenu", labelLg1); + labels.put(labelLg1Object); + concept.remove("prefLabelLg1"); + + if(concept.has("prefLabelLg2")){ + String labelLg2 = concept.getString("prefLabelLg2"); + JSONObject labelLg2Object = new JSONObject(); + labelLg2Object.put("langue", Config.LG2); + labelLg2Object.put("contenu", labelLg2); + labels.put(labelLg2Object); + concept.remove("prefLabelLg2"); + } + + concept.put("label", labels); + + return concept.toString(); + } + + @Override + public String getAllConcepts() throws RmesException { + HashMap params = new HashMap<>(); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); + params.put("CONCEPTS_GRAPH", Config.CONCEPTS_GRAPH); + return repoGestion.getResponseAsArray(buildRequest("getAllConcepts.ftlh", params)).toString(); + } + + private static String buildRequest(String fileName, HashMap params) throws RmesException { + return FreeMarkerUtils.buildRequest("consultation-gestion/", fileName, params); + } +} diff --git a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java new file mode 100644 index 000000000..d0019f901 --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java @@ -0,0 +1,71 @@ +package fr.insee.rmes.webservice; + +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.consutation_gestion.ConsultationGestionService; +import fr.insee.rmes.exceptions.RmesException; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; +import io.swagger.v3.oas.annotations.tags.Tag; +import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + + +@Component +@Path("/consultation-gestion") +@Tag(name = "Consultation Gestion", description = "Consultation Gestion API") +@ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Success"), + @ApiResponse(responseCode = "204", description = "No Content"), + @ApiResponse(responseCode = "400", description = "Bad Request"), + @ApiResponse(responseCode = "401", description = "Unauthorized"), + @ApiResponse(responseCode = "403", description = "Forbidden"), + @ApiResponse(responseCode = "404", description = "Not found"), + @ApiResponse(responseCode = "406", description = "Not Acceptable"), + @ApiResponse(responseCode = "500", description = "Internal server error")}) +public class ConsultationGestion { + + private static final String TEXT_PLAIN = "text/plain"; + + @Autowired + ConsultationGestionService consultationGestionService; + + + + @GET() + @Path("/{id}") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "getDetailedConcept", summary = "Get a concept") + public Response getDetailedConcept(@PathParam(Constants.ID) String id) { + String jsonResultat; + try { + jsonResultat = consultationGestionService.getDetailedConcept(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + @GET() + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "getAllConcepts", summary = "Get all concepts") + public Response getAllConcepts() { + String jsonResultat; + try { + jsonResultat = consultationGestionService.getAllConcepts(); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + +} diff --git a/src/main/resources/request/consultation-gestion/getAllConcepts.ftlh b/src/main/resources/request/consultation-gestion/getAllConcepts.ftlh new file mode 100644 index 000000000..022bfd5b2 --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getAllConcepts.ftlh @@ -0,0 +1,8 @@ +SELECT DISTINCT ?id ?modified ?isValidated +FROM <${CONCEPTS_GRAPH}> +WHERE { + ?concept rdf:type skos:Concept . + BIND(STRAFTER(STR(?concept),'/concepts/definition/') AS ?id) . + ?concept dcterms:modified ?modified . + ?concept insee:isValidated ?isValidated . +} \ No newline at end of file diff --git a/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh b/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh new file mode 100644 index 000000000..c43bc8ad5 --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh @@ -0,0 +1,19 @@ +SELECT ?id ?prefLabelLg1 ?prefLabelLg2 ?namingHint ?created ?modified ?valid ?isValidated +FROM <${CONCEPTS_GRAPH}> +WHERE { + ?concept skos:prefLabel ?prefLabelLg1 . + FILTER (lang(?prefLabelLg1) = '${LG1}') . + FILTER(REGEX(STR(?concept),'/concepts/definition/${ID}')) . + BIND(STRAFTER(STR(?concept),'/definition/') AS ?id) . + ?concept skos:prefLabel ?prefLabelLg2 . + FILTER (lang(?prefLabelLg2) = '${LG2}') . + OPTIONAL { + ?concept skos:closeMatch ?conceptSDMX . + FILTER(strStarts(STR(?conceptSDMX),'urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept')) + BIND(STRAFTER(STR(?conceptSDMX),').') AS ?namingHint) . + } . + ?concept dcterms:created ?created . + ?concept dcterms:modified ?modified . + ?concept insee:isValidated ?isValidated . + OPTIONAL { ?concept dcterms:valid ?valid . } . +} LIMIT 1 \ No newline at end of file From 31d7ade734266197d44d4615db620bd563c1d13c Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 12 Feb 2021 08:43:37 +0100 Subject: [PATCH 121/243] Improve sims export --- .../rmes/bauhaus_services/Constants.java | 1 + .../documentations/DocumentationExport.java | 4 +- .../rmes/webservice/OperationsResources.java | 822 ------------------ 3 files changed, 4 insertions(+), 823 deletions(-) delete mode 100644 src/main/java/fr/insee/rmes/webservice/OperationsResources.java diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 644cbac14..272b72563 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -101,6 +101,7 @@ public class Constants { public static final String WASGENERATEDBY = "wasGeneratedBy"; /*X*/ + public static final String XML_START_DOCUMENT = ""; public static final String XML_OPEN_CODELIST_TAG = ""; public static final String XML_END_CODELIST_TAG = ""; public static final String XML_OPEN_PARAMETERS_TAG = ""; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index f64bd7cf8..eed4e9653 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -95,7 +95,7 @@ public File export(String simsXML,String operationXML,String indicatorXML,String xsltTransformer.setParameter("Series", seriesXML); xsltTransformer.setParameter("Msd", msdXML); xsltTransformer.setParameter("CodeLists", codeListsXML); - xsltTransformer.setParameter("parameters", XMLUtils.convertStringToDocument(parametersXML)); + xsltTransformer.setParameter("parameters", parametersXML); //xsltTransformer.setParameter("parameters", doc.toString()); // prepare output printStream = new PrintStream(osOutputFile); @@ -116,6 +116,8 @@ public File export(String simsXML,String operationXML,String indicatorXML,String private String buildParams(List languages, Boolean includeEmptyMas, String targetType) { String includeEmptyMasString=( includeEmptyMas ? "true" : "false"); String parametersXML=""; + parametersXML=parametersXML.concat(Constants.XML_START_DOCUMENT); + parametersXML=parametersXML.concat(Constants.XML_OPEN_PARAMETERS_TAG); parametersXML=parametersXML.concat(Constants.XML_OPEN_LANGUAGES_TAG); diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsResources.java deleted file mode 100644 index e76215e63..000000000 --- a/src/main/java/fr/insee/rmes/webservice/OperationsResources.java +++ /dev/null @@ -1,822 +0,0 @@ -package fr.insee.rmes.webservice; - -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; - -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.GET; -import javax.ws.rs.HeaderParam; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.HttpHeaders; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.Status; - -import org.apache.commons.io.IOUtils; -import org.apache.http.HttpStatus; -import org.apache.logging.log4j.LogManager; -import org.apache.logging.log4j.Logger; -import org.glassfish.jersey.media.multipart.FormDataParam; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.security.access.annotation.Secured; -import org.springframework.stereotype.Component; - -import fr.insee.rmes.bauhaus_services.Constants; -import fr.insee.rmes.bauhaus_services.OperationsService; -import fr.insee.rmes.config.auth.roles.Roles; -import fr.insee.rmes.config.swagger.model.IdLabel; -import fr.insee.rmes.config.swagger.model.IdLabelAltLabel; -import fr.insee.rmes.config.swagger.model.IdLabelAltLabelSims; -import fr.insee.rmes.config.swagger.model.operations.documentation.Attribute; -import fr.insee.rmes.exceptions.RmesException; -import fr.insee.rmes.model.operations.Family; -import fr.insee.rmes.model.operations.Indicator; -import fr.insee.rmes.model.operations.Operation; -import fr.insee.rmes.model.operations.Series; -import fr.insee.rmes.model.operations.documentations.Documentation; -import fr.insee.rmes.model.operations.documentations.MAS; -import fr.insee.rmes.model.operations.documentations.MSD; -import fr.insee.rmes.utils.XMLUtils; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.media.ArraySchema; -import io.swagger.v3.oas.annotations.media.Content; -import io.swagger.v3.oas.annotations.media.Schema; -import io.swagger.v3.oas.annotations.parameters.RequestBody; -import io.swagger.v3.oas.annotations.responses.ApiResponse; -import io.swagger.v3.oas.annotations.responses.ApiResponses; -import io.swagger.v3.oas.annotations.tags.Tag; - - -@Component -@Path("/operations") -@Tag(name="Operations", description="Operation API") -@ApiResponses(value = { - @ApiResponse(responseCode = "200", description = "Success"), - @ApiResponse(responseCode = "204", description = "No Content"), - @ApiResponse(responseCode = "400", description = "Bad Request"), - @ApiResponse(responseCode = "401", description = "Unauthorized"), - @ApiResponse(responseCode = "403", description = "Forbidden"), - @ApiResponse(responseCode = "404", description = "Not found"), - @ApiResponse(responseCode = "406", description = "Not Acceptable"), - @ApiResponse(responseCode = "500", description = "Internal server error") }) -public class OperationsResources { - - static final Logger logger = LogManager.getLogger(OperationsResources.class); - - @Autowired - OperationsService operationsService; - - - /*************************************************************************************************** - * FAMILY - ******************************************************************************************************/ - @GET - @Path("/families") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getFamilies", summary = "List of families", - responses = {@ApiResponse(content=@Content(array=@ArraySchema(schema=@Schema(implementation=IdLabel.class))))}) - public Response getFamilies() throws RmesException { - String jsonResultat = operationsService.getFamilies(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/families/advanced-search") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getFamiliesForSearch", summary = "List of families for search", - responses = {@ApiResponse(content=@Content(array=@ArraySchema(schema=@Schema(implementation=Family.class))))}) - public Response getFamiliesForSearch() throws RmesException { - String jsonResultat = operationsService.getFamiliesForSearch(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/family/{id}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getFamilyByID", summary = "Get a family", - responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Family.class)))} - ) - public Response getFamilyByID(@PathParam(Constants.ID) String id) throws RmesException { - String jsonResultat = operationsService.getFamilyByID(id); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - /** - * UPDATE - * @param id, body - * @return response - */ - - @Secured({ Roles.SPRING_ADMIN }) - @PUT - @Path("/family/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setFamilyById", summary = "Update family" ) - public Response setFamilyById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Family to update", required = true, - content = @Content(schema = @Schema(implementation = Family.class))) String body) { - try { - operationsService.setFamily(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - - /** - * CREATE - * @param body - * @return response - */ - @Secured({ Roles.SPRING_ADMIN }) - @POST - @Path("/family") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "createFamily", summary = "Create family") - public Response createFamily( - @RequestBody(description = "Family to create", required = true, - content = @Content(schema = @Schema(implementation = Family.class))) String body) { - String id = null; - try { - id = operationsService.createFamily(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - @Secured({ Roles.SPRING_ADMIN }) - @PUT - @Path("/family/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setFamilyValidation", summary = "Family validation") - public Response setFamilyValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.setFamilyValidation(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - - - /*************************************************************************************************** - * SERIES - ******************************************************************************************************/ - @GET - @Path("/series") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSeries", summary = "List of series", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) - public Response getSeries() throws RmesException { - String jsonResultat = operationsService.getSeries(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/series/withSims") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesWithSims", summary = "List of series with related sims", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabelSims.class)))}) - public Response getSeriesWIthSims() throws RmesException { - String jsonResultat = operationsService.getSeriesWithSims(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/series/{id}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesByID", - summary = "Series", responses = { @ApiResponse(content = @Content(schema = @Schema(implementation = Series.class)))}) - public Response getSeriesByID(@PathParam(Constants.ID) String id, - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { - String resultat; - if (header != null && header.equals(MediaType.APPLICATION_XML)) { - try { - resultat=XMLUtils.produceXMLResponse(operationsService.getSeriesByID(id)); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } else { - try { - resultat = operationsService.getSeriesJsonByID(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } - return Response.status(HttpStatus.SC_OK).entity(resultat).build(); - } - - @GET - @Path("/series/advanced-search") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSeriesForSearch", summary = "Series", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Series.class)))}) - public Response getSeriesForSearch() { - String jsonResultat; - try { - jsonResultat = operationsService.getSeriesForSearch(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_CNIS }) - @PUT - @Path("/series/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setSeriesById", summary = "Update series") - public Response setSeriesById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Series to update", required = true, - content = @Content(schema = @Schema(implementation = Series.class)))String body) { - try { - operationsService.setSeries(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - @GET - @Path("/series/{id}/operationsWithoutReport") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getOperationsWithoutReport", summary = "Operations without metadataReport", responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=Operation.class)))}) - public Response getOperationsWithoutReport(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { - jsonResultat = operationsService.getOperationsWithoutReport(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - - /** - * CREATE - * @param body - * @return response - */ - @Secured({ Roles.SPRING_ADMIN }) - @POST - @Path("/series") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "createSeries", summary = "Create series") - public Response createSeries( - @RequestBody(description = "Series to create", required = true, - content = @Content(schema = @Schema(implementation = Series.class))) String body) { - String id = null; - try { - id = operationsService.createSeries(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - /** - * PUBLISH - * @param id - * @return response - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) - @PUT - @Path("/series/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setSeriesValidation", summary = "Series validation") - public Response setSeriesValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.setSeriesValidation(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - /*************************************************************************************************** - * OPERATIONS - ******************************************************************************************************/ - - - - @GET - @Path("/operations") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getOperations", summary = "List of operations", - responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) - public Response getOperations() throws RmesException { - String jsonResultat = operationsService.getOperations(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - - } - - - @GET - @Path("/operation/{id}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getOperationByID", summary = "Operation", - responses = { @ApiResponse(content = @Content(/*mediaType = "application/json",*/ schema = @Schema(implementation = Operation.class)))}) - public Response getOperationByID(@PathParam(Constants.ID) String id, - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { - String resultat; - if (header != null && header.equals(MediaType.APPLICATION_XML)) { - try { - resultat=XMLUtils.produceXMLResponse(operationsService.getOperationById(id)); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } else { - try { - resultat = operationsService.getOperationJsonByID(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } - return Response.status(HttpStatus.SC_OK).entity(resultat).build(); - } - - - @POST - @Path("/operation/codebook") - @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @Consumes({MediaType.MULTIPART_FORM_DATA, MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @io.swagger.v3.oas.annotations.Operation(operationId = "getCodeBook", summary = "Produce a codebook from a DDI") - public Response getCodeBook( @HeaderParam("Accept") String acceptHeader, - @Parameter(schema = @Schema(type = "string", format = "binary", description = "file in DDI")) - @FormDataParam("file") InputStream isDDI, - @Parameter(schema = @Schema(type = "string", format = "binary", description = "file 2")) - @FormDataParam(value = "dicoVar") InputStream isCodeBook) throws IOException, RmesException { - String ddi = IOUtils.toString(isDDI, StandardCharsets.UTF_8); - File codeBookFile = fr.insee.rmes.utils.FileUtils.streamToFile(isCodeBook, "dicoVar",".odt"); - return operationsService.getCodeBookExport(ddi,codeBookFile, acceptHeader); - } - - /** - * UPDATE - * @param id - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_CNIS }) - @PUT - @Path("/operation/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setOperationById", summary = "Update operation") - public Response setOperationById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Operation to update", required = true, - content = @Content(schema = @Schema(implementation = Operation.class))) String body) { - try { - operationsService.setOperation(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - /** - * CREATE - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) - @POST - @Path("/operation") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "createOperation", summary = "Create operation") - public Response createOperation( - @RequestBody(description = "Operation to create", required = true, - content = @Content(schema = @Schema(implementation = Operation.class))) String body) { - String id = null; - try { - id = operationsService.createOperation(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - /** - * PUBLISH - * @param id - * @return response - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR }) - @PUT - @Path("/operation/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setOperationValidation", summary = "Operation validation") - public Response setOperationValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.setOperationValidation(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - - /*************************************************************************************************** - * INDICATORS - ******************************************************************************************************/ - @GET - @Path("/indicators") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicators", summary = "List of indicators", - responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=IdLabelAltLabel.class)))}) - public Response getIndicators() throws RmesException { - String jsonResultat = operationsService.getIndicators(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - - } - - @GET - @Path("/indicators/advanced-search") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicatorsForSearch", summary = "List of indicators for search", - responses = {@ApiResponse(content=@Content(schema=@Schema(type="array",implementation=Indicator.class)))}) - public Response getIndicatorsForSearch() throws RmesException { - String jsonResultat = operationsService.getIndicatorsForSearch(); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - - } - - @GET - @Path("/indicator/{id}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getIndicatorByID", summary = "Indicator", - responses = { @ApiResponse(content = @Content(schema = @Schema(implementation = Indicator.class)))}) - public Response getIndicatorByID(@PathParam(Constants.ID) String id, - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header) { - String resultat; - if (header != null && header.equals(MediaType.APPLICATION_XML)) { - try { - resultat=XMLUtils.produceXMLResponse(operationsService.getIndicatorById(id)); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } else { - try { - resultat = operationsService.getIndicatorJsonByID(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - } - return Response.status(HttpStatus.SC_OK).entity(resultat).build(); - } - - /** - * UPDATE - * @param id - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @PUT - @Path("/indicator/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicatorById", summary = "Update indicator") - public Response setIndicatorById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Indicator to update", required = true, - content = @Content(schema = @Schema(implementation = Indicator.class))) String body) { - try { - operationsService.setIndicator(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - /** - * PUBLISH - * @param id - * @return response - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @PUT - @Path("/indicator/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicatorValidation", summary = "Indicator validation") - public Response setIndicatorValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.setIndicatorValidation(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - /** - * CREATE - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @POST - @Path("/indicator") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setIndicator", summary = "Create indicator", - responses = { @ApiResponse(content = @Content(mediaType = MediaType.TEXT_PLAIN))}) - public Response setIndicator(@RequestBody(description = "Indicator to create", required = true, - content = @Content(schema = @Schema(implementation = Indicator.class))) String body) { - logger.info("POST indicator"); - String id = null; - try { - id = operationsService.setIndicator(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - if (id == null) {return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(id).build();} - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - - - /*************************************************************************************************** - * DOCUMENTATION - ******************************************************************************************************/ - - @GET - @Path("/metadataStructureDefinition") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMsd", summary = "Metadata structure definition", - responses = { @ApiResponse(content = @Content(/*mediaType = "application/json",*/ schema = @Schema(implementation = MAS.class)))}) - public Response getMSD( - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header - ) { - MSD msd ; - String jsonResultat = null ; - - if (header != null && header.equals(MediaType.APPLICATION_XML)) { - try { - msd = operationsService.getMSD(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.ok(XMLUtils.produceResponse(msd, header)).build(); - } - - else { - try { - jsonResultat = operationsService.getMSDJson(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - } - - @GET - @Path("/metadataAttribute/{id}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMA", summary = "Metadata attribute specification and property", - responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Attribute.class)))}) - public Response getMetadataAttribute(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { - jsonResultat = operationsService.getMetadataAttribute(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/metadataAttributes") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMAs", summary = "Metadata attributes specification and property", - responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(type="array",implementation = Attribute.class)))}) - public Response getMetadataAttributes() { - String jsonResultat; - try { - jsonResultat = operationsService.getMetadataAttributes(); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - - @GET - @Path("/metadataReport/{id}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReport", summary = "Metadata report for an id", - responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) - ))}) - public Response getMetadataReport(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { - jsonResultat = operationsService.getMetadataReport(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - @GET - @Path("/metadataReport/default") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReportDefaultValue", summary = "Get default value for metadata report", - responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) - ))}) - public Response getMetadataReportDefaultValue() throws IOException { - return Response.status(HttpStatus.SC_OK).entity(operationsService.getMetadataReportDefaultValue()).build(); - } - - @GET - @Path("/metadataReport/fullSims/{id}") - @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) - @io.swagger.v3.oas.annotations.Operation(operationId = "getFullSims", summary = "Full sims for an id", - responses = { @ApiResponse(content = @Content(/*mediaType = "application/json" ,*/ schema = @Schema(implementation = Documentation.class) - ))}) - public Response getFullSims( - @Parameter( - description = "Identifiant de la documentation (format : [0-9]{4})", - required = true, - schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id, - @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header - ) { - Documentation fullsims; - try { - fullsims = operationsService.getFullSims(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - - return Response.ok(XMLUtils.produceResponse(fullsims, header)).build(); - } - - /** - * GET - * @param id - * @return - */ - - @GET - @Path("/metadataReport/Owner/{id}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "getMetadataReport", summary = "Owner stamp for a Metadata report's id", - responses = { @ApiResponse(content = @Content(mediaType = "application/json" , schema = @Schema(implementation = Documentation.class) - ))}) - public Response getMetadataReportOwner(@PathParam(Constants.ID) String id) { - String jsonResultat; - try { - jsonResultat = operationsService.getMetadataReportOwner(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - /** - * CREATE - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @POST - @Path("/metadataReport") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReport", summary = "Create metadata report", - responses = { @ApiResponse(content = @Content(mediaType = MediaType.TEXT_PLAIN))}) - public Response setMetadataReport(@RequestBody(description = "Metadata report to create", required = true, - content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { - logger.info("POST Metadata report"); - String id = null; - try { - id = operationsService.createMetadataReport(body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - if (id == null) {return Response.status(HttpStatus.SC_INTERNAL_SERVER_ERROR).entity(id).build();} - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - /** - * UPDATE - * @param id - * @param body - * @return - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR, Roles.SPRING_CNIS }) - @PUT - @Path("/metadataReport/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReportById", summary = "Update metadata report") - public Response setMetadataReportById( - @PathParam(Constants.ID) String id, - @RequestBody(description = "Report to update", required = true, - content = @Content(schema = @Schema(implementation = Documentation.class))) String body) { - try { - operationsService.setMetadataReport(id, body); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(Status.NO_CONTENT).build(); - } - - /** - * DELETE - * @param id - * @return - */ - @Secured({ Roles.SPRING_ADMIN }) - @DELETE - @Path("/metadataReport/delete/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "deleteMetadataReportById", summary = "Delete metadata report") - public Response deleteMetadataReportById( - @PathParam(Constants.ID) String id) { - Status result=Status.NO_CONTENT; - try { - result = operationsService.deleteMetadataReport(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - return Response.status(result).build(); - } - - - - /** - * PUBLISH - * @param id - * @return response - */ - @Secured({ Roles.SPRING_ADMIN, Roles.SPRING_SERIES_CONTRIBUTOR, Roles.SPRING_INDICATOR_CONTRIBUTOR }) - @PUT - @Path("/metadataReport/validate/{id}") - @Consumes(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "setMetadataReportValidation", summary = "Sims validation") - public Response setSimsValidation( - @PathParam(Constants.ID) String id) throws RmesException { - try { - operationsService.publishMetadataReport(id); - } catch (RmesException e) { - return returnRmesException(e); - } - return Response.status(HttpStatus.SC_OK).entity(id).build(); - } - - - @GET - @Path("/series/seriesWithStamp/{stamp}") - @Produces(MediaType.APPLICATION_JSON) - @io.swagger.v3.oas.annotations.Operation(operationId = "seriesIdsForStamp", summary = "Series with given stamp as creator") - public Response getSeriesWithStamp(@Parameter( - description = "Timbre d'un utilisateur (format : ([A-Za-z0-9_-]+))", - required = true, - schema = @Schema(pattern = "([A-Za-z0-9_-]+)", type = "string")) @PathParam(Constants.STAMP) String stamp - ) throws RmesException { - String jsonResultat = operationsService.getSeriesWithStamp(stamp); - return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); - } - - - @GET - @Path("/metadataReport/export/{id}") - @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") - public Response getSimsExport(@Parameter( - description = "Identifiant de la documentation (format : [0-9]{4})", - required = true, - schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id - ) throws RmesException { - return operationsService.exportMetadataReport(id,true); - } - - @GET - @Path("/metadataReport/testExport") - @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") - public Response getTestSimsExport() throws RmesException { - return operationsService.exportTestMetadataReport(); - } - - - - - private Response returnRmesException(RmesException e) { - logger.error(e.getMessage(), e); - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); - } - -} From b0bd9dc0a5cf39a0664ed2bc6b832f4bcdd8eff7 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 12 Feb 2021 16:12:24 +0100 Subject: [PATCH 122/243] fix: review publishing structure component --- .../utils/ComponentPublication.java | 26 +++++++++++-------- .../utils/StructureComponentUtils.java | 13 ++++++---- 2 files changed, 23 insertions(+), 16 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java index 937fe33de..52e7d387d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java @@ -3,14 +3,10 @@ import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; -import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; -import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesException; -import fr.insee.rmes.exceptions.RmesNotFoundException; -import fr.insee.rmes.external_services.notifications.NotificationsContract; -import fr.insee.rmes.external_services.notifications.RmesNotificationsImpl; import org.apache.http.HttpStatus; +import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; @@ -24,7 +20,7 @@ @Repository public class ComponentPublication extends RdfService { - public void publishComponent(Resource component) throws RmesException { + public void publishComponent(Resource component, IRI type) throws RmesException { Model model = new LinkedHashModel(); //TODO notify... @@ -35,10 +31,18 @@ public void publishComponent(Resource component) throws RmesException { try { while (statements.hasNext()) { Statement st = statements.next(); - model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), - st.getPredicate(), - st.getObject(), - st.getContext()); + String pred = ((SimpleIRI) st.getPredicate()).toString(); + + if (pred.endsWith("validationState")) { + // nothing, wouldn't copy this attr + } + else { + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), + st.getPredicate(), + st.getObject(), + st.getContext()); + } + } } catch (RepositoryException e) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), Constants.REPOSITORY_EXCEPTION); @@ -48,7 +52,7 @@ public void publishComponent(Resource component) throws RmesException { repoGestion.closeStatements(statements); } Resource componentToPublishRessource = PublicationUtils.tranformBaseURIToPublish(component); - RepositoryPublication.publishResource(componentToPublishRessource, model, Constants.FAMILY); + RepositoryPublication.publishResource(componentToPublishRessource, model, type.toString()); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 73826f38e..c0fe8d26f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -176,7 +176,9 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou RdfUtils.addTripleString(componentURI, DC.CONTRIBUTOR, component.getContributor(), model, graph); RdfUtils.addTripleUri(componentURI, INSEE.DISSEMINATIONSTATUS, component.getDisseminationStatus(), model, graph); - RdfUtils.addTripleUri(componentURI, QB.CONCEPT, INSEE.STRUCTURE_CONCEPT + component.getConcept(), model, graph); + if(component.getConcept() != null){ + RdfUtils.addTripleUri(componentURI, QB.CONCEPT, INSEE.STRUCTURE_CONCEPT + component.getConcept(), model, graph); + } if (component.getRange() != null && component.getRange().equals(((SimpleIRI)INSEE.CODELIST).toString())) { RdfUtils.addTripleUri(componentURI, RDFS.RANGE, Config.CODE_LIST_BASE_URI + "/" + component.getCodeList() + "/Class", model, graph); @@ -303,21 +305,22 @@ public String publishComponent(JSONObject component) throws RmesException { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "IOException"); } mutualizedComponent.setUpdated(DateUtils.getCurrentDate()); - createRDFForComponent(mutualizedComponent, ValidationStatus.VALIDATED); String type = component.getString("type"); String id = component.getString("id"); if (type.equals(((SimpleIRI)QB.ATTRIBUTE_PROPERTY).toString())) { - componentPublication.publishComponent(RdfUtils.structureComponentAttributeIRI(id)); + componentPublication.publishComponent(RdfUtils.structureComponentAttributeIRI(id), QB.ATTRIBUTE_PROPERTY); } if (type.equals(((SimpleIRI)QB.MEASURE_PROPERTY).toString())) { - componentPublication.publishComponent(RdfUtils.structureComponentMeasureIRI(id)); + componentPublication.publishComponent(RdfUtils.structureComponentMeasureIRI(id), QB.MEASURE_PROPERTY); } if (type.equals(((SimpleIRI)QB.DIMENSION_PROPERTY).toString())) { - componentPublication.publishComponent(RdfUtils.structureComponentDimensionIRI(id)); + componentPublication.publishComponent(RdfUtils.structureComponentDimensionIRI(id), QB.DIMENSION_PROPERTY); } + createRDFForComponent(mutualizedComponent, ValidationStatus.VALIDATED); + return id; } } From 32c64470a580b8121ebd1bfcd248f6374d19392c Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 12 Feb 2021 16:45:16 +0100 Subject: [PATCH 123/243] feat: when publishing a component, the code list should be validated --- .../structures/utils/StructureComponentUtils.java | 8 ++++++++ src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java | 2 ++ .../sparql_queries/code_list/CodeListQueries.java | 8 ++++++++ .../request/codes-list/isCodesListValidated.ftlh | 5 +++++ 4 files changed, 23 insertions(+) create mode 100644 src/main/resources/request/codes-list/isCodesListValidated.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index c0fe8d26f..18d7fc704 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -6,6 +6,7 @@ import javax.validation.Validation; import javax.ws.rs.BadRequestException; +import fr.insee.rmes.persistance.sparql_queries.code_list.CodeListQueries; import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; @@ -298,6 +299,13 @@ public String publishComponent(JSONObject component) throws RmesException { } } + if(!component.isNull("codeList") && !"".equals(component.getString("codeList"))){ + if(!repoGestion.getResponseAsBoolean(CodeListQueries.isCodesListValidated(component.getString("codeList")))){ + throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_VALIDATED_CODESLIST, "The codes list should be validated", new JSONArray()); + } + } + + MutualizedComponent mutualizedComponent; try { mutualizedComponent = deserializeBody(component.toString()); diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index bfcb8509c..20f2fe51b 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -73,6 +73,8 @@ public class ErrorCodes { public static final int COMPONENT_PUBLICATION_EMPTY_CREATOR = 1004; public static final int COMPONENT_PUBLICATION_EMPTY_STATUS = 1005; public static final int COMPONENT_PUBLICATION_VALIDATED_CONCEPT = 1006; + public static final int COMPONENT_PUBLICATION_VALIDATED_CODESLIST = 1007; + /* * 404 NOTFOUNDEXCEPTIONS */ diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java index 072ab11df..3f93a65e3 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java @@ -7,6 +7,14 @@ import java.util.HashMap; public class CodeListQueries { + + public static String isCodesListValidated(String codesListUri) throws RmesException { + HashMap params = new HashMap<>(); + params.put("CODES_LISTS_GRAPH", Config.CODELIST_GRAPH); + params.put("IRI", codesListUri); + return FreeMarkerUtils.buildRequest("codes-list/", "isCodesListValidated.ftlh", params); + } + public static String getAllCodesLists() throws RmesException { HashMap params = new HashMap<>(); diff --git a/src/main/resources/request/codes-list/isCodesListValidated.ftlh b/src/main/resources/request/codes-list/isCodesListValidated.ftlh new file mode 100644 index 000000000..00b03f969 --- /dev/null +++ b/src/main/resources/request/codes-list/isCodesListValidated.ftlh @@ -0,0 +1,5 @@ +ASK +FROM <${CODES_LISTS_GRAPH}> +{ + <${IRI}> insee:validationState 'Validated' . +} \ No newline at end of file From b96239be16c5f369041396aea0e0cd3c6d68566c Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 12 Feb 2021 18:01:13 +0100 Subject: [PATCH 124/243] feat: publish structure --- .../structures/impl/StructureImpl.java | 5 ++ .../utils/StructurePublication.java | 61 +++++++++++++++++++ .../structures/utils/StructureUtils.java | 32 ++++++++++ .../fr/insee/rmes/exceptions/ErrorCodes.java | 1 + .../structures/StructureQueries.java | 8 +++ .../rmes/webservice/StructureResources.java | 16 +++++ .../getCountOfUnValidatedComponent.ftlh | 14 +++++ 7 files changed, 137 insertions(+) create mode 100644 src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java create mode 100644 src/main/resources/request/structures/getCountOfUnValidatedComponent.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java index f5ebec293..b5f042ec6 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/impl/StructureImpl.java @@ -113,6 +113,11 @@ public String getStructureByIdWithDetails(String id) throws RmesException { return structureWithComponentSpecifications.toString(); } + @Override + public String publishStructureById(String id) throws RmesException { + return structureUtils.publishStructure(new JSONObject(this.getStructureById(id))); + } + /** * Create new Structure * @throws RmesException diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java new file mode 100644 index 000000000..654efea5e --- /dev/null +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java @@ -0,0 +1,61 @@ +package fr.insee.rmes.bauhaus_services.structures.utils; + +import com.sun.xml.bind.v2.runtime.reflect.opt.Const; +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; +import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; +import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; +import fr.insee.rmes.exceptions.RmesException; +import org.apache.http.HttpStatus; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.repository.RepositoryResult; +import org.springframework.stereotype.Repository; + +@Repository +public class StructurePublication extends RdfService { + + public void publish(Resource structure) throws RmesException { + + Model model = new LinkedHashModel(); + //TODO notify... + RepositoryConnection con = repoGestion.getConnection(); + RepositoryResult statements = repoGestion.getStatements(con, structure); + + try { + try { + while (statements.hasNext()) { + Statement st = statements.next(); + String pred = ((SimpleIRI) st.getPredicate()).toString(); + + if (pred.endsWith("validationState")) { + // nothing, wouldn't copy this attr + } + else { + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), + st.getPredicate(), + st.getObject(), + st.getContext()); + } + + } + } catch (RepositoryException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), Constants.REPOSITORY_EXCEPTION); + } + + } finally { + repoGestion.closeStatements(statements); + } + Resource componentToPublishRessource = PublicationUtils.tranformBaseURIToPublish(structure); + RepositoryPublication.publishResource(componentToPublishRessource, model, "Structure"); + + } + +} + diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index e54a66728..7729e2a5e 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -57,6 +57,9 @@ public class StructureUtils extends RdfService { @Autowired StructureComponentUtils structureComponentUtils; + @Autowired + StructurePublication structurePublication; + public JSONArray formatStructuresForSearch(JSONArray structures) throws RmesException { for (int i = 0; i < structures.length(); i++) { JSONObject current = structures.getJSONObject(i); @@ -360,4 +363,33 @@ public void deleteStructure(String structureId) throws RmesException { repoGestion.clearStructureNodeAndComponents(structureIri); repoGestion.deleteObject(structureIri, null); } + + public String publishStructure(JSONObject structure) throws RmesException { + String id = structure.getString("id"); + JSONObject response = repoGestion.getResponseAsObject(StructureQueries.getCountOfUnValidatedComponent(id)); + int count = response.getInt("count"); + if(count > 0){ + throw new RmesUnauthorizedException(ErrorCodes.STRUCTURE_PUBLICATION_VALIDATED_COMPONENT, "All components must be validated", new JSONArray()); + } + + ObjectMapper mapper = new ObjectMapper(); + mapper.configure( + DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); + Structure structureObject = new Structure(id); + try { + structureObject = mapper.readerForUpdating(structureObject).readValue(structure.toString()); + } catch (IOException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "IOException"); + } + + IRI structureIri = RdfUtils.structureIRI(structureObject.getId()); + + this.structurePublication.publish(structureIri); + + structureObject.setUpdated(DateUtils.getCurrentDate()); + repoGestion.clearStructureNodeAndComponents(structureIri); + createRdfStructure(structureObject, ValidationStatus.VALIDATED); + + return structure.toString(); + } } diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index 20f2fe51b..9dec6b610 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -74,6 +74,7 @@ public class ErrorCodes { public static final int COMPONENT_PUBLICATION_EMPTY_STATUS = 1005; public static final int COMPONENT_PUBLICATION_VALIDATED_CONCEPT = 1006; public static final int COMPONENT_PUBLICATION_VALIDATED_CODESLIST = 1007; + public static final int STRUCTURE_PUBLICATION_VALIDATED_COMPONENT = 1008; /* * 404 NOTFOUNDEXCEPTIONS diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java index 363ba4e20..cc5788308 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java @@ -94,6 +94,12 @@ public static String lastStructureId() throws RmesException { return buildRequest("getLastIdStructure.ftlh", params); } + public static String getCountOfUnValidatedComponent(String structureById) throws RmesException { + HashMap params = initParams(); + params.put("ID", structureById); + return buildRequest("getCountOfUnValidatedComponent.ftlh", params); + } + private static String buildRequest(String fileName, HashMap params) throws RmesException { return FreeMarkerUtils.buildRequest("structures/", fileName, params); } @@ -107,4 +113,6 @@ private static HashMap initParams() { return params; } + + } \ No newline at end of file diff --git a/src/main/java/fr/insee/rmes/webservice/StructureResources.java b/src/main/java/fr/insee/rmes/webservice/StructureResources.java index 473b4ed90..fded59ec6 100644 --- a/src/main/java/fr/insee/rmes/webservice/StructureResources.java +++ b/src/main/java/fr/insee/rmes/webservice/StructureResources.java @@ -97,6 +97,22 @@ public Response getStructureById(@PathParam(Constants.ID) String id) { return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + @GET + @Path("/structure/{id}/publish") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "publishStructureById", summary = "Publish a structure") + public Response publishStructureById(@PathParam(Constants.ID) String id) { + String jsonResultat = null; + try { + jsonResultat = structureService.publishStructureById(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } catch( Exception e ) { + System.out.println(e); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + @GET @Path("/structure/{id}/details") @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/resources/request/structures/getCountOfUnValidatedComponent.ftlh b/src/main/resources/request/structures/getCountOfUnValidatedComponent.ftlh new file mode 100644 index 000000000..6e295e95c --- /dev/null +++ b/src/main/resources/request/structures/getCountOfUnValidatedComponent.ftlh @@ -0,0 +1,14 @@ +SELECT (count(?component) as ?count) +FROM <${STRUCTURES_COMPONENTS_GRAPH}> +FROM <${STRUCTURES_GRAPH}> +WHERE +{ + ?structure dcterms:identifier '${ID}' . + ?structure qb:component ?componentSpecification . + ?componentSpecification (qb:dimension|qb:measure|qb:attribute) ?component . + ?component insee:validationState ?isValidated + + MINUS { + VALUES ?isValidated { "Validated" } + } +} \ No newline at end of file From 997a90ff878675b216a75a850d6e707989a1e8b7 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 12 Feb 2021 18:01:37 +0100 Subject: [PATCH 125/243] fix: filter property to publish --- .../rmes/bauhaus_services/structures/StructureService.java | 2 ++ .../structures/utils/ComponentPublication.java | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureService.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureService.java index 311ad22a1..80f04a1a3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/StructureService.java @@ -16,4 +16,6 @@ public interface StructureService { void deleteStructure(String structureId) throws RmesException; String getStructureByIdWithDetails(String id) throws RmesException; + + String publishStructureById(String id) throws RmesException; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java index 52e7d387d..3e0dda1e6 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java @@ -5,6 +5,7 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.persistance.ontologies.QB; import org.apache.http.HttpStatus; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; @@ -35,6 +36,11 @@ public void publishComponent(Resource component, IRI type) throws RmesException if (pred.endsWith("validationState")) { // nothing, wouldn't copy this attr + }else if (pred.endsWith("attribute") + || pred.endsWith("dimension") + || pred.endsWith("measure")) { + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), + PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), st.getContext()); } else { model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), From a936188ecfbaf6c690ae7b8b756cdc3f785789af Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 12 Feb 2021 19:04:51 +0100 Subject: [PATCH 126/243] improve Sims export --- .../rmes/bauhaus_services/Constants.java | 2 +- .../documentations/DocumentationExport.java | 48 +- .../java/fr/insee/rmes/utils/XMLUtils.java | 11 +- .../xslTransformerFiles/sims2fodt_v6.xsl | 125 ++++- .../xslTransformerFiles/sims2fodt_v6bis.xsl | 478 ++++++++++++++++++ 5 files changed, 642 insertions(+), 22 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v6bis.xsl diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 272b72563..bd8eff30c 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -26,7 +26,7 @@ public class Constants { public static final String DOCUMENT = "document"; public static final String DOCUMENTS_LG1 = "documentsLg1"; public static final String DOCUMENTS_LG2 = "documentsLg2"; - + public static final String DOT_XML = ".xml"; /*F*/ public static final String FAMILY = "family"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index eed4e9653..acfb7140c 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -9,6 +9,7 @@ import java.nio.charset.StandardCharsets; import java.nio.file.CopyOption; import java.nio.file.Files; +import java.nio.file.Path; import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; @@ -21,6 +22,7 @@ import javax.xml.transform.stream.StreamSource; import org.apache.commons.io.FileUtils; +import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -87,16 +89,28 @@ public File export(String simsXML,String operationXML,String indicatorXML,String TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); - // set parameters - xsltTransformer.setParameter("Sims", simsXML); - xsltTransformer.setParameter("Organizations", organizationsXML); - xsltTransformer.setParameter("Operation", operationXML); - xsltTransformer.setParameter("Indicator", indicatorXML); - xsltTransformer.setParameter("Series", seriesXML); - xsltTransformer.setParameter("Msd", msdXML); - xsltTransformer.setParameter("CodeLists", codeListsXML); - xsltTransformer.setParameter("parameters", parametersXML); - //xsltTransformer.setParameter("parameters", doc.toString()); + + // set parameters as Strings +// xsltTransformer.setParameter("Sims", simsXML); +// xsltTransformer.setParameter("Organizations", organizationsXML); +// xsltTransformer.setParameter("Operation", operationXML); +// xsltTransformer.setParameter("Indicator", indicatorXML); +// xsltTransformer.setParameter("Series", seriesXML); +// xsltTransformer.setParameter("Msd", msdXML); +// xsltTransformer.setParameter("CodeLists", codeListsXML); +// xsltTransformer.setParameter("parameters", parametersXML); + + // Pass parameters in a file + Path tempDir= Files.createTempDirectory("forExport"); + addParameter ( xsltTransformer, "parametersFile", parametersXML,tempDir); + addParameter ( xsltTransformer, "simsFile", simsXML,tempDir); + addParameter ( xsltTransformer, "seriesFile", seriesXML,tempDir); + addParameter ( xsltTransformer, "operationFile", operationXML,tempDir); + addParameter ( xsltTransformer, "indicatorFile", indicatorXML,tempDir); + addParameter ( xsltTransformer, "msdFile", msdXML,tempDir); + addParameter ( xsltTransformer, "codeListsFile", codeListsXML,tempDir); + addParameter ( xsltTransformer, "organizationsFile", organizationsXML,tempDir); + // prepare output printStream = new PrintStream(osOutputFile); // transformation @@ -116,7 +130,7 @@ public File export(String simsXML,String operationXML,String indicatorXML,String private String buildParams(List languages, Boolean includeEmptyMas, String targetType) { String includeEmptyMasString=( includeEmptyMas ? "true" : "false"); String parametersXML=""; - parametersXML=parametersXML.concat(Constants.XML_START_DOCUMENT); + // parametersXML=parametersXML.concat(Constants.XML_START_DOCUMENT); parametersXML=parametersXML.concat(Constants.XML_OPEN_PARAMETERS_TAG); @@ -168,6 +182,18 @@ private String buildParams(List languages, Boolean includeEmptyMas, Stri */ } + private void addParameter (Transformer xsltTransformer, String paramName, String paramData, Path tempDir) throws IOException { + // Pass parameters in a file + CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING }; + Path tempFile = Files.createTempFile(tempDir, paramName,Constants.DOT_XML); + String absolutePath = tempFile.toFile().getAbsolutePath(); + InputStream is = IOUtils.toInputStream(paramData, StandardCharsets.UTF_8); + Files.copy(is, tempFile, options); + absolutePath = absolutePath.replace('\\', '/'); + xsltTransformer.setParameter(paramName, absolutePath); + } + + public File exportOld(InputStream inputFile, String absolutePath, String accessoryAbsolutePath, String organizationsAbsolutePath, String codeListAbsolutePath, String targetType) throws RmesException, IOException { diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 18c4b6039..a6ac614b9 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -93,7 +93,7 @@ public static String produceXMLResponse(Object obj) { } public static String produceEmptyXML() { - return(""); + return("<>"); } public static Document convertStringToDocument(String xmlStr) { @@ -130,6 +130,15 @@ public static String encodeXml(String response) { final String regex = "&[^amp;]"; final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); ret = pattern.matcher(ret).replaceAll("&"); + + final String regex2 = "<"; + final Pattern pattern2 = Pattern.compile(regex2, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern2.matcher(ret).replaceAll("&lt;"); + + final String regex3 = ">"; + final Pattern pattern3 = Pattern.compile(regex3, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern3.matcher(ret).replaceAll("&gt;"); + return new String(ret.getBytes(), StandardCharsets.UTF_8); } diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl index be46d9f5c..be7801099 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl @@ -20,30 +20,86 @@ - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + @@ -67,6 +123,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + loop on the mas diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v6bis.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v6bis.xsl new file mode 100644 index 000000000..063804e5c --- /dev/null +++ b/src/main/resources/xslTransformerFiles/sims2fodt_v6bis.xsl @@ -0,0 +1,478 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Root template + + + + + + + + + + + default template : copy the fodt file, element by element + + + + + + + + + loop on the mas + + + + + + + + + + + + + + + + + + + + + elements with @id are used to filter the pattern, depending on parameters or + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transform variable-name into nodes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From 3894d273a5a6de428c49440eb095a2cbadd155d6 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 15 Feb 2021 09:26:42 +0100 Subject: [PATCH 127/243] Disable failing test --- .../operations/documentations/DocumentationsUtilsTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java b/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java index 9f409e76d..85331d86f 100644 --- a/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java +++ b/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java @@ -5,6 +5,7 @@ import org.json.JSONObject; import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.mockito.InjectMocks; import org.mockito.Mock; @@ -34,7 +35,7 @@ public void init() { MockitoAnnotations.initMocks(this); } @Test - //@Disabled + @Disabled void buildDocumentationFromJsonTest() throws RmesException{ // Mocker les méthodes de buildDocumentationFromJson qui font appel à d'autres classes From b7c30cfeb4dd0fd050c4f72d315c5631d9a1a98e Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 15 Feb 2021 11:23:32 +0100 Subject: [PATCH 128/243] Update Constants.java --- src/main/java/fr/insee/rmes/bauhaus_services/Constants.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index bd8eff30c..fa54f339d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -112,8 +112,8 @@ public class Constants { public static final String XML_END_LANGUAGE_TAG = ""; public static final String XML_OPEN_TARGET_TYPE_TAG = ""; public static final String XML_END_TARGET_TYPE_TAG = ""; - public static final String XML_OPEN_INCLUDE_EMPTY_MAS_TAG = ""; - public static final String XML_END_INCLUDE_EMPTY_MAS_TAG = ""; + public static final String XML_OPEN_INCLUDE_EMPTY_MAS_TAG = ""; + public static final String XML_END_INCLUDE_EMPTY_MAS_TAG = ""; private Constants() { throw new IllegalStateException("Utility class"); From 5bb3fa182307ec569d37373b2f071b353bddfaa7 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 15 Feb 2021 16:44:43 +0100 Subject: [PATCH 129/243] feat: publish a structure --- .../structures/utils/StructureUtils.java | 16 ++++++++++++---- .../structures/StructureQueries.java | 4 ++-- ...mponent.ftlh => getUnValidatedComponent.ftlh} | 5 +++-- 3 files changed, 17 insertions(+), 8 deletions(-) rename src/main/resources/request/structures/{getCountOfUnValidatedComponent.ftlh => getUnValidatedComponent.ftlh} (75%) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 7729e2a5e..23380f6a5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -7,6 +7,7 @@ import javax.ws.rs.BadRequestException; +import fr.insee.rmes.bauhaus_services.structures.StructureComponent; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -54,6 +55,9 @@ public class StructureUtils extends RdfService { public static final String COMPONENT_DEFINITION_MODIFIED = "componentDefinitionModified"; public static final String COMPONENT_DEFINITION_ID = "componentDefinitionId"; + @Autowired + StructureComponent structureComponent; + @Autowired StructureComponentUtils structureComponentUtils; @@ -366,10 +370,14 @@ public void deleteStructure(String structureId) throws RmesException { public String publishStructure(JSONObject structure) throws RmesException { String id = structure.getString("id"); - JSONObject response = repoGestion.getResponseAsObject(StructureQueries.getCountOfUnValidatedComponent(id)); - int count = response.getInt("count"); - if(count > 0){ - throw new RmesUnauthorizedException(ErrorCodes.STRUCTURE_PUBLICATION_VALIDATED_COMPONENT, "All components must be validated", new JSONArray()); + JSONArray ids = repoGestion.getResponseAsArray(StructureQueries.getUnValidatedComponent(id)); + for (int i = 0; i < ids.length(); i++) { + String idComponent = ((JSONObject) ids.get(i)).getString("id"); + try { + structureComponent.publishComponent(idComponent); + } catch (RmesException e) { + throw new RmesUnauthorizedException(ErrorCodes.STRUCTURE_PUBLICATION_VALIDATED_COMPONENT, "The component " + idComponent + " component can not be published", new JSONArray()); + } } ObjectMapper mapper = new ObjectMapper(); diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java index cc5788308..456fcbdea 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java @@ -94,10 +94,10 @@ public static String lastStructureId() throws RmesException { return buildRequest("getLastIdStructure.ftlh", params); } - public static String getCountOfUnValidatedComponent(String structureById) throws RmesException { + public static String getUnValidatedComponent(String structureById) throws RmesException { HashMap params = initParams(); params.put("ID", structureById); - return buildRequest("getCountOfUnValidatedComponent.ftlh", params); + return buildRequest("getUnValidatedComponent.ftlh", params); } private static String buildRequest(String fileName, HashMap params) throws RmesException { diff --git a/src/main/resources/request/structures/getCountOfUnValidatedComponent.ftlh b/src/main/resources/request/structures/getUnValidatedComponent.ftlh similarity index 75% rename from src/main/resources/request/structures/getCountOfUnValidatedComponent.ftlh rename to src/main/resources/request/structures/getUnValidatedComponent.ftlh index 6e295e95c..7d178e3c7 100644 --- a/src/main/resources/request/structures/getCountOfUnValidatedComponent.ftlh +++ b/src/main/resources/request/structures/getUnValidatedComponent.ftlh @@ -1,4 +1,4 @@ -SELECT (count(?component) as ?count) +SELECT ?id FROM <${STRUCTURES_COMPONENTS_GRAPH}> FROM <${STRUCTURES_GRAPH}> WHERE @@ -6,7 +6,8 @@ WHERE ?structure dcterms:identifier '${ID}' . ?structure qb:component ?componentSpecification . ?componentSpecification (qb:dimension|qb:measure|qb:attribute) ?component . - ?component insee:validationState ?isValidated + ?component insee:validationState ?isValidated . + ?component dcterms:identifier ?id . MINUS { VALUES ?isValidated { "Validated" } From 87fea5966e9e70c5ca1ef5791ae73938671f6419 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 19 Feb 2021 10:05:50 +0100 Subject: [PATCH 130/243] fix: review for the ConsultationGestion API --- .../rmes/webservice/ConsultationGestion.java | 3 +- .../consultation-gestion/getAllConcepts.ftlh | 5 ++-- .../getDetailedConcept.ftlh | 29 ++++++++++++------- 3 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java index d0019f901..05905e89e 100644 --- a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java +++ b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java @@ -41,7 +41,7 @@ public class ConsultationGestion { @GET() - @Path("/{id}") + @Path("/concept/{id}") @Produces(MediaType.APPLICATION_JSON) @Operation(operationId = "getDetailedConcept", summary = "Get a concept") public Response getDetailedConcept(@PathParam(Constants.ID) String id) { @@ -55,6 +55,7 @@ public Response getDetailedConcept(@PathParam(Constants.ID) String id) { } @GET() + @Path("/concepts") @Produces(MediaType.APPLICATION_JSON) @Operation(operationId = "getAllConcepts", summary = "Get all concepts") public Response getAllConcepts() { diff --git a/src/main/resources/request/consultation-gestion/getAllConcepts.ftlh b/src/main/resources/request/consultation-gestion/getAllConcepts.ftlh index 022bfd5b2..57aaa011f 100644 --- a/src/main/resources/request/consultation-gestion/getAllConcepts.ftlh +++ b/src/main/resources/request/consultation-gestion/getAllConcepts.ftlh @@ -1,8 +1,9 @@ -SELECT DISTINCT ?id ?modified ?isValidated +SELECT DISTINCT ?id ?dateMiseAJour ?statutValidation FROM <${CONCEPTS_GRAPH}> WHERE { ?concept rdf:type skos:Concept . BIND(STRAFTER(STR(?concept),'/concepts/definition/') AS ?id) . - ?concept dcterms:modified ?modified . + ?concept dcterms:modified ?dateMiseAJour . ?concept insee:isValidated ?isValidated . + BIND( if(?isValidated,"Publié","Provisoire") as ?statutValidation ) } \ No newline at end of file diff --git a/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh b/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh index c43bc8ad5..551118453 100644 --- a/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh +++ b/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh @@ -1,19 +1,26 @@ -SELECT ?id ?prefLabelLg1 ?prefLabelLg2 ?namingHint ?created ?modified ?valid ?isValidated +SELECT ?id ?prefLabelLg1 ?prefLabelLg2 ?namingHint ?dateCreation ?dateMiseAjour ?dateFinValidite ?statutValidation ?uri (max(?numVersion) as?version) FROM <${CONCEPTS_GRAPH}> WHERE { - ?concept skos:prefLabel ?prefLabelLg1 . + ?uri skos:prefLabel ?prefLabelLg1 . FILTER (lang(?prefLabelLg1) = '${LG1}') . - FILTER(REGEX(STR(?concept),'/concepts/definition/${ID}')) . - BIND(STRAFTER(STR(?concept),'/definition/') AS ?id) . - ?concept skos:prefLabel ?prefLabelLg2 . + FILTER(REGEX(STR(?uri),'/concepts/definition/${ID}')) . + BIND(STRAFTER(STR(?uri),'/definition/') AS ?id) . + ?uri skos:prefLabel ?prefLabelLg2 . FILTER (lang(?prefLabelLg2) = '${LG2}') . OPTIONAL { - ?concept skos:closeMatch ?conceptSDMX . + ?uri skos:closeMatch ?conceptSDMX . FILTER(strStarts(STR(?conceptSDMX),'urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept')) BIND(STRAFTER(STR(?conceptSDMX),').') AS ?namingHint) . } . - ?concept dcterms:created ?created . - ?concept dcterms:modified ?modified . - ?concept insee:isValidated ?isValidated . - OPTIONAL { ?concept dcterms:valid ?valid . } . -} LIMIT 1 \ No newline at end of file + ?uri dcterms:created ?dateCreation . + ?uri dcterms:modified ?dateMiseAjour . + ?uri insee:isValidated ?statutValidation . + OPTIONAL { ?uri dcterms:valid ?dateFinValidite . } . + OPTIONAL { + ?uri skos:definition ?definition . + ?definition dcterms:language "fr"^^xsd:language . + ?definition insee:conceptVersion ?numVersion . + } . +} +GROUP BY ?id ?uri ?prefLabelLg1 ?prefLabelLg2 ?namingHint ?dateCreation ?dateMiseAjour ?dateFinValidite ?statutValidation +LIMIT 1 \ No newline at end of file From 2cdd734c128901a49efe54fca453faa1e5f377bb Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 19 Feb 2021 10:35:13 +0100 Subject: [PATCH 131/243] fix: define content type for export --- .../insee/rmes/bauhaus_services/operations/OperationsImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 6a7ce6aa2..530071cd1 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -431,7 +431,7 @@ public Response exportMetadataReport(String id) throws RmesException { } String fileName = output.getName(); ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); - return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); + return Response.ok(is, "application/vnd.oasis.opendocument.text").header(CONTENT_DISPOSITION, content).build(); } @Override From 1741f8992f25ff9e041a4b198a76b2d51b2c7212 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 19 Feb 2021 11:06:11 +0100 Subject: [PATCH 132/243] add parameters for sims export : empty rubrics, english --- .../bauhaus_services/OperationsService.java | 2 +- .../operations/OperationsImpl.java | 4 +- .../documentations/DocumentationExport.java | 14 +- .../documentations/DocumentationsUtils.java | 4 +- .../java/fr/insee/rmes/utils/XMLUtils.java | 2 +- .../operations/MetadataReportResources.java | 21 +- .../xslTransformerFiles/sims2fodt_v7.xsl | 548 ++++++++++++++++++ 7 files changed, 581 insertions(+), 14 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index 5792ec6ef..18259fc2d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -141,7 +141,7 @@ public interface OperationsService { String publishMetadataReport(String id) throws RmesException; - Response exportMetadataReport(String id, Boolean includeEmptyMas) throws RmesException; + Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean english) throws RmesException; Response exportTestMetadataReport() throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 077f63189..bd459e089 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -425,11 +425,11 @@ public String publishMetadataReport(String id) throws RmesException { @Override - public Response exportMetadataReport(String id, Boolean includeEmptyMas) throws RmesException { + public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean english) throws RmesException { File output; InputStream is; try { - output = documentationsUtils.exportMetadataReport(id,includeEmptyMas); + output = documentationsUtils.exportMetadataReport(id,includeEmptyMas, english); is = new FileInputStream(output); } catch (Exception e1) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index acfb7140c..950f505dd 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -66,18 +66,19 @@ public File testExport() throws IOException { } public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, - String organizationsXML, String codeListsXML, String targetType, Boolean includeEmptyMas) throws RmesException, IOException { + String organizationsXML, String codeListsXML, String targetType, + Boolean includeEmptyMas, Boolean english) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXML = documentationsUtils.buildShellSims(); - List languages = new ArrayList(); - String parametersXML = buildParams(languages,includeEmptyMas,targetType); + // List languages = new ArrayList(); + String parametersXML = buildParams(english,includeEmptyMas,targetType); File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt_v6.xsl"); + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt_v7.xsl"); OutputStream osOutputFile = FileUtils.openOutputStream(output); InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); @@ -127,7 +128,7 @@ public File export(String simsXML,String operationXML,String indicatorXML,String return(output); } - private String buildParams(List languages, Boolean includeEmptyMas, String targetType) { + private String buildParams(Boolean english, Boolean includeEmptyMas, String targetType) { String includeEmptyMasString=( includeEmptyMas ? "true" : "false"); String parametersXML=""; // parametersXML=parametersXML.concat(Constants.XML_START_DOCUMENT); @@ -139,7 +140,8 @@ private String buildParams(List languages, Boolean includeEmptyMas, Stri // parametersXML=parametersXML.concat(Constants.XML_OPEN_LANGUAGE_TAG); // parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGE_TAG); // } - parametersXML=parametersXML.concat("1\r\n2"); + parametersXML=parametersXML.concat("1"); + if(english) parametersXML=parametersXML.concat("\r\n2"); parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGES_TAG); parametersXML=parametersXML.concat(Constants.XML_OPEN_INCLUDE_EMPTY_MAS_TAG); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 80e8ccac9..5441d9641 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -509,7 +509,7 @@ public File exportTestMetadataReport() throws IOException { return docExport.testExport(); } - public File exportMetadataReport(String id, Boolean includeEmptyMas) throws IOException, RmesException { + public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean english) throws IOException, RmesException { String emptyXML=XMLUtils.produceEmptyXML(); Operation operation; @@ -577,7 +577,7 @@ public File exportMetadataReport(String id, Boolean includeEmptyMas) throws IOEx codeListsXML=codeListsXML.concat(Constants.XML_END_CODELIST_TAG); return docExport.export(simsXML,operationXML,indicatorXML,seriesXML, - organizationsXML,codeListsXML,targetType,includeEmptyMas); + organizationsXML,codeListsXML,targetType,includeEmptyMas,english); } public File exportMetadataReportOld(String id) throws IOException, RmesException { diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index a6ac614b9..51e0e911f 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -93,7 +93,7 @@ public static String produceXMLResponse(Object obj) { } public static String produceEmptyXML() { - return("<>"); + return(""); } public static Document convertStringToDocument(String xmlStr) { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index aee56efc2..63c2fd948 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -268,16 +268,33 @@ public Response setSimsValidation( } + /** + * EXPORT + * @param id + * @param english + * @param includeEmptyMas + * @return response + */ + @GET - @Path("/metadataReport/export/{id}") + @Path("/metadataReport/export/{id}/{emptyMas}/{en}") @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") public Response getSimsExport(@Parameter( description = "Identifiant de la documentation (format : [0-9]{4})", required = true, schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id + , + @Parameter( + description = "Inclure les champs vides", + required = false) @PathParam("emptyMas") Boolean includeEmptyMas, + @Parameter( + description = "Version anglaise", + required = false) @PathParam("en") Boolean english ) throws RmesException { - return operationsService.exportMetadataReport(id,true); + if (includeEmptyMas==null) {includeEmptyMas=true;} + if (english==null) {english=true;} + return operationsService.exportMetadataReport(id,includeEmptyMas,english); } @GET diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl new file mode 100644 index 000000000..74ab37466 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl @@ -0,0 +1,548 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Root template + + + + + + + + + + + default template : copy the fodt file, element by element + + + + + + + + + + + + + + + + + + + + + loop on the mas + + + + + + + + + + + + + + + + + + + + + elements with @id are used to filter the pattern, depending on parameters or + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transform variable-name into nodes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From d9295374a659a6a9b38483391136ceb920f4b332 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 22 Feb 2021 17:30:56 +0100 Subject: [PATCH 133/243] export sims with three parameters : emptyMas, francais, english --- .../fr/insee/rmes/bauhaus_services/Constants.java | 1 + .../rmes/bauhaus_services/OperationsService.java | 2 +- .../bauhaus_services/operations/OperationsImpl.java | 13 ++++++++++--- .../documentations/DocumentationExport.java | 10 +++++----- .../documentations/DocumentationsUtils.java | 4 ++-- .../java/fr/insee/rmes/exceptions/ErrorCodes.java | 1 + src/main/java/fr/insee/rmes/utils/XMLUtils.java | 7 ++++--- .../operations/MetadataReportResources.java | 12 +++++++++--- 8 files changed, 33 insertions(+), 17 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index fa54f339d..ab1a5ebe2 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -101,6 +101,7 @@ public class Constants { public static final String WASGENERATEDBY = "wasGeneratedBy"; /*X*/ + public static final String XML_EMPTY_TAG = ""; public static final String XML_START_DOCUMENT = ""; public static final String XML_OPEN_CODELIST_TAG = ""; public static final String XML_END_CODELIST_TAG = ""; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index 18259fc2d..cb7df88bd 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -141,7 +141,7 @@ public interface OperationsService { String publishMetadataReport(String id) throws RmesException; - Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean english) throws RmesException; + Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean francais, Boolean english) throws RmesException; Response exportTestMetadataReport() throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index bd459e089..2f07323b0 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -36,6 +36,7 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.QueryUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.config.swagger.model.IdLabelTwoLangs; +import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.external_services.export.ExportUtils; import fr.insee.rmes.external_services.export.Jasper; @@ -423,13 +424,19 @@ public String publishMetadataReport(String id) throws RmesException { return documentationsUtils.publishMetadataReport(id); } - + /** + * EXPORT + */ @Override - public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean english) throws RmesException { + public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean francais, Boolean english) throws RmesException { + + if(!(francais) && !(english)) throw new RmesException(HttpStatus.SC_NOT_ACCEPTABLE, + ErrorCodes.SIMS_EXPORT_WITHOUT_LANGUAGE, + "at least one language must be selected for export"); File output; InputStream is; try { - output = documentationsUtils.exportMetadataReport(id,includeEmptyMas, english); + output = documentationsUtils.exportMetadataReport(id,includeEmptyMas, francais, english); is = new FileInputStream(output); } catch (Exception e1) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 950f505dd..256e9b7dc 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -67,13 +67,13 @@ public File testExport() throws IOException { public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, String organizationsXML, String codeListsXML, String targetType, - Boolean includeEmptyMas, Boolean english) throws RmesException, IOException { + Boolean includeEmptyMas, Boolean francais, Boolean english) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXML = documentationsUtils.buildShellSims(); // List languages = new ArrayList(); - String parametersXML = buildParams(english,includeEmptyMas,targetType); + String parametersXML = buildParams(francais,english,includeEmptyMas,targetType); File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); @@ -128,7 +128,7 @@ public File export(String simsXML,String operationXML,String indicatorXML,String return(output); } - private String buildParams(Boolean english, Boolean includeEmptyMas, String targetType) { + private String buildParams(Boolean francais,Boolean english, Boolean includeEmptyMas, String targetType) { String includeEmptyMasString=( includeEmptyMas ? "true" : "false"); String parametersXML=""; // parametersXML=parametersXML.concat(Constants.XML_START_DOCUMENT); @@ -140,8 +140,8 @@ private String buildParams(Boolean english, Boolean includeEmptyMas, String targ // parametersXML=parametersXML.concat(Constants.XML_OPEN_LANGUAGE_TAG); // parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGE_TAG); // } - parametersXML=parametersXML.concat("1"); - if(english) parametersXML=parametersXML.concat("\r\n2"); + if(francais) parametersXML=parametersXML.concat("1"); + if(english) parametersXML=parametersXML.concat("2"); parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGES_TAG); parametersXML=parametersXML.concat(Constants.XML_OPEN_INCLUDE_EMPTY_MAS_TAG); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 5441d9641..65f150a1b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -509,7 +509,7 @@ public File exportTestMetadataReport() throws IOException { return docExport.testExport(); } - public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean english) throws IOException, RmesException { + public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean francais, Boolean english) throws IOException, RmesException { String emptyXML=XMLUtils.produceEmptyXML(); Operation operation; @@ -577,7 +577,7 @@ public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean eng codeListsXML=codeListsXML.concat(Constants.XML_END_CODELIST_TAG); return docExport.export(simsXML,operationXML,indicatorXML,seriesXML, - organizationsXML,codeListsXML,targetType,includeEmptyMas,english); + organizationsXML,codeListsXML,targetType,includeEmptyMas,francais,english); } public File exportMetadataReportOld(String id) throws IOException, RmesException { diff --git a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java index fc66f6dd4..dd1474fd9 100644 --- a/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java +++ b/src/main/java/fr/insee/rmes/exceptions/ErrorCodes.java @@ -130,6 +130,7 @@ public class ErrorCodes { // SIMS public static final int SIMS_INCORRECT = 861; public static final int SIMS_DELETION_FOR_NON_SERIES = 862; + public static final int SIMS_EXPORT_WITHOUT_LANGUAGE = 863; private ErrorCodes() { throw new IllegalStateException("Utility class"); diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 51e0e911f..ee49168ba 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -31,6 +31,7 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.dataformat.xml.XmlMapper; +import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationJsonMixIn; import fr.insee.rmes.model.operations.documentations.Documentation; @@ -93,7 +94,7 @@ public static String produceXMLResponse(Object obj) { } public static String produceEmptyXML() { - return(""); + return(Constants.XML_EMPTY_TAG); } public static Document convertStringToDocument(String xmlStr) { @@ -133,11 +134,11 @@ public static String encodeXml(String response) { final String regex2 = "<"; final Pattern pattern2 = Pattern.compile(regex2, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); - ret = pattern2.matcher(ret).replaceAll("&lt;"); + ret = pattern2.matcher(ret).replaceAll("&amp;lt;"); final String regex3 = ">"; final Pattern pattern3 = Pattern.compile(regex3, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); - ret = pattern3.matcher(ret).replaceAll("&gt;"); + ret = pattern3.matcher(ret).replaceAll("&amp;gt;"); return new String(ret.getBytes(), StandardCharsets.UTF_8); } diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index 63c2fd948..3a3e5acc6 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -277,7 +277,7 @@ public Response setSimsValidation( */ @GET - @Path("/metadataReport/export/{id}/{emptyMas}/{en}") + @Path("/metadataReport/export/{id}/{emptyMas}/{fr}/{en}") @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") public Response getSimsExport(@Parameter( @@ -287,14 +287,20 @@ public Response getSimsExport(@Parameter( , @Parameter( description = "Inclure les champs vides", - required = false) @PathParam("emptyMas") Boolean includeEmptyMas, + required = false) @PathParam("emptyMas") Boolean includeEmptyMas + , + @Parameter( + description = "Version française", + required = false) @PathParam("fr") Boolean francais + , @Parameter( description = "Version anglaise", required = false) @PathParam("en") Boolean english ) throws RmesException { if (includeEmptyMas==null) {includeEmptyMas=true;} + if (francais==null) {francais=true;} if (english==null) {english=true;} - return operationsService.exportMetadataReport(id,includeEmptyMas,english); + return operationsService.exportMetadataReport(id,includeEmptyMas,francais,english); } @GET From a5925f22765ee41aa934e47f489e2b2ed51d972f Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 24 Feb 2021 15:26:11 +0100 Subject: [PATCH 134/243] Remove warnings --- .../documentations/DocumentationExport.java | 2 -- .../documentations/DocumentationsUtils.java | 1 - .../structures/utils/ComponentPublication.java | 14 +++++++------- .../structures/utils/StructureComponentUtils.java | 6 ++---- .../structures/utils/StructurePublication.java | 13 ++++++------- 5 files changed, 15 insertions(+), 21 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 256e9b7dc..536f6d133 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -11,8 +11,6 @@ import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; -import java.util.ArrayList; -import java.util.List; import javax.xml.XMLConstants; import javax.xml.transform.Transformer; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 65f150a1b..4a4ba62a8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -55,7 +55,6 @@ import fr.insee.rmes.exceptions.RmesNotFoundException; import fr.insee.rmes.exceptions.RmesUnauthorizedException; import fr.insee.rmes.model.ValidationStatus; -import fr.insee.rmes.model.operations.Indicator; import fr.insee.rmes.model.operations.Operation; import fr.insee.rmes.model.operations.Series; import fr.insee.rmes.model.operations.documentations.Documentation; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java index 3e0dda1e6..14b105250 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java @@ -1,11 +1,5 @@ package fr.insee.rmes.bauhaus_services.structures.utils; -import fr.insee.rmes.bauhaus_services.Constants; -import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; -import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; -import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; -import fr.insee.rmes.exceptions.RmesException; -import fr.insee.rmes.persistance.ontologies.QB; import org.apache.http.HttpStatus; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; @@ -18,6 +12,12 @@ import org.eclipse.rdf4j.repository.RepositoryResult; import org.springframework.stereotype.Repository; +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; +import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; +import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; +import fr.insee.rmes.exceptions.RmesException; + @Repository public class ComponentPublication extends RdfService { @@ -58,7 +58,7 @@ public void publishComponent(Resource component, IRI type) throws RmesException repoGestion.closeStatements(statements); } Resource componentToPublishRessource = PublicationUtils.tranformBaseURIToPublish(component); - RepositoryPublication.publishResource(componentToPublishRessource, model, type.toString()); + RepositoryPublication.publishResource(componentToPublishRessource, model, ((SimpleIRI) type).toString()); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index da666410b..3e4977fcd 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -3,11 +3,8 @@ import java.io.IOException; import java.util.Arrays; -import javax.validation.Validation; import javax.ws.rs.BadRequestException; -import fr.insee.rmes.persistance.sparql_queries.code_list.CodeListQueries; -import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -37,10 +34,11 @@ import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.exceptions.RmesUnauthorizedException; import fr.insee.rmes.model.ValidationStatus; -import fr.insee.rmes.model.dissemination_status.DisseminationStatus; import fr.insee.rmes.model.structures.MutualizedComponent; import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.ontologies.QB; +import fr.insee.rmes.persistance.sparql_queries.code_list.CodeListQueries; +import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; import fr.insee.rmes.persistance.sparql_queries.structures.StructureQueries; import fr.insee.rmes.utils.DateUtils; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java index 654efea5e..2cebc1362 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java @@ -1,13 +1,6 @@ package fr.insee.rmes.bauhaus_services.structures.utils; -import com.sun.xml.bind.v2.runtime.reflect.opt.Const; -import fr.insee.rmes.bauhaus_services.Constants; -import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; -import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; -import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; -import fr.insee.rmes.exceptions.RmesException; import org.apache.http.HttpStatus; -import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; @@ -18,6 +11,12 @@ import org.eclipse.rdf4j.repository.RepositoryResult; import org.springframework.stereotype.Repository; +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; +import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; +import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; +import fr.insee.rmes.exceptions.RmesException; + @Repository public class StructurePublication extends RdfService { From 9c7809c52267fbf223200b655a53892ab728a977 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 24 Feb 2021 15:27:20 +0100 Subject: [PATCH 135/243] Remove warning --- src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java index 05905e89e..6d77aa061 100644 --- a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java +++ b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java @@ -33,8 +33,6 @@ @ApiResponse(responseCode = "500", description = "Internal server error")}) public class ConsultationGestion { - private static final String TEXT_PLAIN = "text/plain"; - @Autowired ConsultationGestionService consultationGestionService; From 09bceb5d99ef68e934ecf24fa8a9f9da898aa3d1 Mon Sep 17 00:00:00 2001 From: BulotF Date: Thu, 25 Feb 2021 09:48:59 +0100 Subject: [PATCH 136/243] improve pattern --- .../xslTransformerFiles/rmesPattern.fodt | 399 ++++++++++++++---- .../xslTransformerFiles/sims2fodt_v7.xsl | 115 +++-- 2 files changed, 382 insertions(+), 132 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/rmesPattern.fodt b/src/main/resources/xslTransformerFiles/rmesPattern.fodt index 3b4043f0d..6499fc792 100644 --- a/src/main/resources/xslTransformerFiles/rmesPattern.fodt +++ b/src/main/resources/xslTransformerFiles/rmesPattern.fodt @@ -42,7 +42,7 @@ fo:margin-top="1cm" style:justify-single-word="false" fo:background-color="#012a83"/> - + - + - + + style:font-name="Arial1"/> - - - - - + - ${series.prefLabelLg1} + ${series/prefLabelLg1} - ${series.prefLabelLg2} + ${series/prefLabelLg2} - + - ${operation.prefLabelLg1} + ${operation/prefLabelLg1} - ${operation.prefLabelLg2} + ${operation/prefLabelLg2} - + - ${indicator.prefLabelLg1} + ${indicator/prefLabelLg1} - ${indicator.prefLabelLg2} + ${indicator/prefLabelLg2} - + - Informations sur la série : ${series.prefLabelLg1} - Informations about the series: ${series.prefLabelLg2} + + Informations sur la série : + ${series/prefLabelLg1} + Informations about the series: + ${series/prefLabelLg2} + - + + + + + + Informations sur l'indicateur : + ${indicator/prefLabelLg1} + Informations about the indicator: + ${indicator/prefLabelLg2} + + + + + - + Nom court - ${series.altLabelLg1} + ${series/altLabelLg1} + + + + Short name + ${series/altLabelLg2} + + + + Résumé - ${series.abstractLg1} + ${series/abstractLg1} + + + + Summary + ${series/abstractLg2} + + + + Historique - ${series.historyNoteLg1} + ${series/historyNoteLg1} + + + + History + ${series/historyNoteLg2} + + + + Type d'opération - ${seriesCode.type.labelLg1} + ${seriesCode/type/labelLg1} + + + + Operation type + ${seriesCode/type/labelLg2} + + + + Fréquence de collecte des données - ${seriesCode.accrualPeriodicity.labelLg1} + ${seriesCode/accrualPeriodicity/labelLg1} + + + + Data frequency of dissemination + ${seriesCode/accrualPeriodicity/labelLg2} + + + + Organismes responsables - #list(${series.publishers.labelLg1},'L1') + #list(${series/publishers/labelLg1},'L1') + + + + Partenaires - #list(${series.contributors.labelLg1},'L1') + #list(${series/contributors/labelLg1},'L1') + + + + Services collecteurs - #list(${series.dataCollectors.labelLg1},'L1') + #list(${series/dataCollectors/labelLg1},'L1') + + + + Propriétaire - ${series.creators} + ${series/creators} + + + + Succède à - ${series.replaces.labelLg1} - Remplacée par - ${series.isReplacedBy.labelLg1} + ${series/replaces/labelLg1} + + + + Replaces + ${series/replaces/labelLg2} + + + + + Remplacé par + ${series/isReplacedBy/labelLg1} + + + + Replaced by + ${series/isReplacedBy/labelLg2} + + + + Indicateurs produits - #list(${series.generates.labelLg1},'L1') + #list(${series/generates/labelLg1},'L1') + + + + Séries ou Indicateurs liés Séries: - #list(${series.seeAlso.labelLg1},'L1') + #list(${series/seeAlso-series/labelLg1},'L1') Indicateurs: - #list(${series.seeAlso.labelLg1},'L1') - Famille parente - #list(${series.family.labelLg1},'L1') - Opérations filles - #list(${series.operations.labelLg1},'L1') + #list(${series/seeAlso-indicator/labelLg1},'L1') - - - Short name - ${series.altLabelLg2} - Summary - ${series.abstractLg2} - History - ${series.historyNoteLg2} - Operation type - ${seriesCode.type.labelLg2} - Data collection frequency - ${seriesCode.accrualPeriodicity.labelLg2} - Replaces - ${series.replaces.labelLg2} - Replaced by - ${series.isReplacedBy.labelLg2} + + Series and indicators produced Series: - #list(${series.seeAlso.labelLg2},'L1') + #list(${series/seeAlso-series/labelLg2},'L1') Indicators: - #list(${series.seeAlso.labelLg2},'L1') + #list(${series/seeAlso-indicator/labelLg2},'L1') + + + + + Famille parente + #list(${series/family/labelLg1},'L1') + + + Parent Family - #list(${series.family.labelLg2},'L1') + #list(${series/family/labelLg2},'L1') + + + + + Opérations filles + #list(${series/operations/labelLg1},'L1') + + + Daughter operations - #list(${series.operations.labelLg2},'L1') + #list(${series/operations/labelLg2},'L1') - + - Informations sur l'opération : ${operation.prefLabelLg1} - Informations about the operation: ${operation.prefLabelLg2} + + Informations sur l'opération : + ${operation/prefLabelLg1} + Informations about the operation: + ${operation/prefLabelLg2} + - + + + + + + + Nom court + ${indicator/altLabelLg1} + + + + Short name + ${indicator/altLabelLg2} + + + + + Résumé + ${indicator/abstractLg1} + + + + Summary + ${indicator/abstractLg2} + + + + + Historique + ${indicator/historyNoteLg1} + + + + History + ${indicator/historyNoteLg2} + + + + + Fréquence de diffusion + ${indicatorCode/accrualPeriodicity/labelLg1} + + + + Data frequency of dissemination + ${indicatorCode/accrualPeriodicity/labelLg2} + + + + + Organismes responsables + #list(${indicator/publishers},'L1') + + + + + Propriétaire + ${indicator/creators} + + + + + Partenaires + #list(${indicator/contributors},'L1') + + + + + Succède à + ${indicator/replaces/labelLg1} + + + + Replaces + ${indicator/replaces/labelLg2} + + + + + Remplacé par + ${indicator/isReplacedBy/labelLg1} + + + + Replaced by + ${indicator/isReplacedBy/labelLg2} + + + + + Produit de + #list(${indicator/wasGeneratedBy/labelLg1},'L1') + + + + Produced from + #list(${indicator/wasGeneratedBy/labelLg2},'L1') + + + + + Séries ou Indicateurs liés + Séries: + #list(${indicator/seeAlso-series/labelLg1},'L1') + Indicateurs: + #list(${indicator/seeAlso-indicator/labelLg1},'L1') + + + + Series and indicators produced + Series: + #list(${indicator/seeAlso-series/labelLg2},'L1') + Indicators: + #list(${indicator/seeAlso-indicator/labelLg2},'L1') + + + + + - + Nom court - ${operation.altLabelLg1} - Liens - Je ne sais pas d'où on les sort - Série parente - ${operation.series.labelLg1} + ${operation/altLabelLg1} - - + + Short name - ${operation.altLabelLg2} - Links - Je ne sais pas d'où on les sort + ${operation/altLabelLg2} + + + + + Série parente + ${operation/series/labelLg1} + + + Parent series - ${operation.series.labelLg2} + ${operation/series/labelLg2} - Informations sur le Sims : ${sims.prefLabelLg1} + Rapport qualité : ${sims/prefLabelLg1} - ${mas.idMas} - ${mas.masLabelLg1} + ${mas/idMas} - ${mas/masLabelLg1} @@ -420,12 +633,12 @@ - ${mas.idMas} - ${mas.masLabelLg1} - ${simsRubrics.labelLg1} + ${mas/idMas} - ${mas/masLabelLg1} + ${simsRubrics/labelLg1} - ${mas.idMas} - ${mas.masLabelLg2} - ${simsRubrics.labelLg2} + ${mas/idMas} - ${mas/masLabelLg2} + ${simsRubrics/labelLg2} diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl index 74ab37466..dd9dbfe13 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl @@ -1,6 +1,6 @@ - + @@ -123,18 +123,6 @@ - - - - - - - - - - - - loop on the mas @@ -154,7 +142,7 @@ - + @@ -172,7 +160,7 @@ - + - - - - - - - - - + + + + + + + + + + + + + + + + + + @@ -403,37 +400,52 @@ - - + + - + + + + - + - + - + - + + + + - + - - + + + + + + + + + @@ -484,9 +496,28 @@ - + + + + + + + + + + + + + + + + @@ -519,7 +550,7 @@ - + @@ -536,6 +567,12 @@ + + + + + + From f5a7b795b2f9a5ddd2d52e7e0fba5c5fc75a5594 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 25 Feb 2021 10:04:53 +0100 Subject: [PATCH 137/243] Fix issue with authorizations --- .../documentations/DocumentationsUtils.java | 19 +-- .../operations/OperationsUtils.java | 15 ++- .../stamps/StampsRestrictionServiceImpl.java | 113 +++++------------- .../StampsRestrictionsService.java | 73 +++++++---- .../fr/insee/rmes/config/auth/user/User.java | 6 +- 5 files changed, 100 insertions(+), 126 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 4a4ba62a8..e2cd28646 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -24,6 +24,7 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.RDFS; import org.json.JSONArray; @@ -208,7 +209,7 @@ public String setMetadataReport(String id, String body, boolean create) throws R // Check idOperation/idSerie/IdIndicator and Init or check id sims String idTarget = sims.getIdTarget(); if (create) { - id = prepareCreation(idTarget); + id = checkTargetHasNoSimsAndcreateSimsId(idTarget); sims.setId(id); checkIfTargetIsASeriesWithOperations(idTarget); } else { @@ -219,14 +220,18 @@ public String setMetadataReport(String id, String body, boolean create) throws R String status = getDocumentationValidationStatus(id); // Create or update rdf + IRI seriesOrIndicatorUri = targetUri; + if (((SimpleIRI) targetUri).toString().contains(Config.OPERATIONS_BASE_URI)) { + seriesOrIndicatorUri = operationsUtils.getSeriesUri(idTarget); + } if (create) { - if (!stampsRestrictionsService.canCreateSims(targetUri)) { + if (!stampsRestrictionsService.canCreateSims(seriesOrIndicatorUri)) { throw new RmesUnauthorizedException(ErrorCodes.SIMS_CREATION_RIGHTS_DENIED, "Only an admin or a manager can create a new sims."); } saveRdfMetadataReport(sims, targetUri, ValidationStatus.UNPUBLISHED); } else { - if (!stampsRestrictionsService.canModifySims(targetUri)) { + if (!stampsRestrictionsService.canModifySims(seriesOrIndicatorUri)) { throw new RmesUnauthorizedException(ErrorCodes.SIMS_MODIFICATION_RIGHTS_DENIED, "Only an admin, CNIS, or a manager can modify this sims.", id); } @@ -394,7 +399,7 @@ private void checkIdsBeforeUpdate(String idRequest, String idSims, String idTarg * @return * @throws RmesException */ - private String prepareCreation(String idTarget) throws RmesException { + private String checkTargetHasNoSimsAndcreateSimsId(String idTarget) throws RmesException { if (idTarget == null) { logger.error("Can't create a documentation if operation/serie/indicator doesn't exist"); throw new RmesException(HttpStatus.SC_BAD_REQUEST, "id operation/serie/indicator can't be null", @@ -521,7 +526,7 @@ public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean fra String targetType = target[0]; String idDatabase = target[1]; - ListneededCodeLists=new ArrayList(); + ListneededCodeLists=new ArrayList<>(); if (targetType.equals(Constants.OPERATION_UP)) { operation=operationsUtils.getOperationById(idDatabase); @@ -712,14 +717,12 @@ public String buildShellSims() throws RmesException { public Status deleteMetadataReport(String id) throws RmesException { String[] target = getDocumentationTargetTypeAndId(id); String targetType = target[0]; - String idDatabase = target[1]; if (!Constants.SERIES.equals(targetType)) { throw new RmesNotAcceptableException(ErrorCodes.SIMS_DELETION_FOR_NON_SERIES, "Only a sims that documents a series can be deleted", id); } - IRI targetUri=RdfUtils.objectIRI(ObjectType.SERIES, idDatabase); - if (!stampsRestrictionsService.canDeleteSims(targetUri)) { + if (!stampsRestrictionsService.canDeleteSims()) { throw new RmesUnauthorizedException(ErrorCodes.SIMS_DELETION_RIGHTS_DENIED, "Only an admin or a manager can delete a sims."); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java index c580a4bc2..94a0c875e 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java @@ -65,10 +65,16 @@ public JSONObject getOperationJsonById(String id) throws RmesException { return operation; } - private void getOperationSeries(String id, JSONObject operation) throws RmesException { - JSONObject series = repoGestion.getResponseAsObject(OperationsQueries.seriesQuery(id)); + private void getOperationSeries(String idOperation, JSONObject operation) throws RmesException { + JSONObject series = repoGestion.getResponseAsObject(OperationsQueries.seriesQuery(idOperation)); operation.put("series", series); } + + public IRI getSeriesUri(String idOperation) throws RmesException{ + JSONObject series = repoGestion.getResponseAsObject(OperationsQueries.seriesQuery(idOperation)); + if (series != null && series.has("id")) return RdfUtils.objectIRI(ObjectType.SERIES, series.getString("id")); + return null; + } private Operation buildOperationFromJson(JSONObject operationJson) { ObjectMapper mapper = new ObjectMapper(); @@ -145,7 +151,6 @@ public String setOperation(String body) throws RmesException { * @throws RmesException */ public String setOperation(String id, String body) throws RmesException { - IRI seriesURI=getSeriesUri(id); if(!stampsRestrictionsService.canModifyOperation(seriesURI)) { throw new RmesUnauthorizedException(ErrorCodes.OPERATION_MODIFICATION_RIGHTS_DENIED, "Only authorized users can modify operations."); @@ -217,9 +222,7 @@ public String setOperationValidation(String id) throws RmesException { return id; } - private IRI getSeriesUri(String id){ - return RdfUtils.objectIRI(ObjectType.SERIES, id); - } + public MSD getMSD() throws RmesException { // String resQuery = repoGestion.getResponseAsArray(DocumentationsQueries.msdQuery()).toString(); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java index 2d2eaf93d..f96c38da0 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java @@ -3,9 +3,6 @@ import java.util.ArrayList; import java.util.List; -import com.fasterxml.jackson.core.JsonProcessingException; -import com.fasterxml.jackson.databind.DeserializationFeature; -import com.fasterxml.jackson.databind.ObjectMapper; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.json.JSONArray; @@ -14,6 +11,10 @@ import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; + import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.config.Config; @@ -25,8 +26,6 @@ import fr.insee.rmes.persistance.sparql_queries.operations.indicators.IndicatorsQueries; import fr.insee.rmes.persistance.sparql_queries.operations.series.SeriesQueries; -import static fr.insee.rmes.config.auth.roles.Roles.SPRING_PREFIX; - @Service public class StampsRestrictionServiceImpl extends RdfService implements StampsRestrictionsService { @@ -95,17 +94,19 @@ public void setFakeUser(String user) throws JsonProcessingException { JSONArray roles = userObject.getJSONArray("roles"); - JSONArray springRoles = new JSONArray(); - roles.forEach(role -> springRoles.put(SPRING_PREFIX + role)); - - this.fakeUser = new User(springRoles, userObject.getString("stamp")); + this.fakeUser = new User(roles, userObject.getString("stamp")); } + private boolean isAdmin() { + User user = getUser(); + return (isAdmin(user)); + } + private boolean isAdmin(User user) { Boolean isAdmin = false; JSONArray roles = user.getRoles(); for (int i = 0; i < roles.length(); i++) { - if (roles.getString(i).equals(Roles.SPRING_ADMIN)) { + if (roles.getString(i).equals(Roles.ADMIN)) { isAdmin = true; } } @@ -171,7 +172,7 @@ private boolean isCnis(User user) { Boolean isCnis = false; JSONArray roles = user.getRoles(); for (int i = 0; i < roles.length(); i++) { - if (roles.getString(i).equals(Roles.SPRING_CNIS)) { + if (roles.getString(i).equals(Roles.CNIS)) { isCnis = true; } } @@ -208,37 +209,26 @@ private boolean isConceptManager(List uris) throws RmesException { return isConceptManager; } - private boolean isSeriesManager(List uris) throws RmesException { - for (IRI uri : uris) { - if (!isSeriesManager(uri)) { - return false; - } - } - return true; - } - public boolean isSeriesManager(IRI uri) throws RmesException { User user = getUser(); JSONArray managers = repoGestion.getResponseAsArray(SeriesQueries.getCreatorsBySeriesUri(((SimpleIRI)uri).toString())); Boolean isSeriesManager = false; for (int i = 0; i < managers.length(); i++) { - if (!managers.getJSONObject(i).getString(Constants.CREATORS).equals(user.getStamp())) { + if (managers.getJSONObject(i).getString(Constants.CREATORS).equals(user.getStamp())) { isSeriesManager = true; } } return isSeriesManager; } - private boolean isIndicatorManager(List uris) throws RmesException { + private boolean isIndicatorManager(IRI iri) throws RmesException { User user = getUser(); - StringBuilder sb = new StringBuilder(); - uris.forEach(u -> sb.append("<" + ((SimpleIRI)u).toString() + "> ")); - String uriAsString = sb.toString(); + String uriAsString = "<" + ((SimpleIRI)iri).toString() + "> "; JSONArray creators = repoGestion.getResponseAsArray(IndicatorsQueries.getCreatorsByIndicatorUri(uriAsString)); Boolean isIndicatorManager = false; if (creators.length() > 0) { for (int i = 0; i < creators.length(); i++) { - if (!creators.getJSONObject(i).getString(Constants.CREATORS).equals(user.getStamp())) { + if (creators.getJSONObject(i).getString(Constants.CREATORS).equals(user.getStamp())) { isIndicatorManager = true; } } @@ -246,42 +236,26 @@ private boolean isIndicatorManager(List uris) throws RmesException { return isIndicatorManager; } - private boolean canModifyOrValidateIndicator(List uris) throws RmesException { + private boolean canModifyOrValidateIndicator(IRI iri) throws RmesException { User user = getUser(); - return (isAdmin(user) || (isIndicatorManager(uris) && isIndicatorContributor(user))); - } - - @Override - public boolean canModifyIndicator(List uris) throws RmesException { - return canModifyOrValidateIndicator(uris); - } - - @Override - public boolean canValidateIndicator(List uris) throws RmesException { - return canModifyOrValidateIndicator(uris); + return (isAdmin(user) || (isIndicatorManager(iri) && isIndicatorContributor(user))); } @Override public boolean canModifyIndicator(IRI uri) throws RmesException { - List uris = new ArrayList<>(); - uris.add(uri); - return canModifyIndicator(uris); + return canModifyOrValidateIndicator(uri); } @Override public boolean canValidateIndicator(IRI uri) throws RmesException { - List uris = new ArrayList<>(); - uris.add(uri); - return canValidateIndicator(uris); + return canModifyOrValidateIndicator(uri); } @Override - public boolean canModifySims(IRI targetURI) throws RmesException { + public boolean canModifySims(IRI seriesOrIndicatorUri) throws RmesException { User user = getUser(); - List uris = new ArrayList<>(); - uris.add(targetURI); - return (isAdmin(user) || isCnis(user) || (isSeriesManager(uris) && isSeriesContributor(user)) - || (isIndicatorManager(uris) && isIndicatorContributor(user))); + return (isAdmin(user) || isCnis(user) || (isSeriesManager(seriesOrIndicatorUri) && isSeriesContributor(user)) + || (isIndicatorManager(seriesOrIndicatorUri) && isIndicatorContributor(user))); } @Override @@ -296,8 +270,7 @@ public boolean canCreateFamily() throws RmesException { } private boolean canCreateFamilySeriesOrIndicator() { - User user = getUser(); - return (isAdmin(user)); + return isAdmin(); } @Override @@ -317,31 +290,15 @@ public boolean canCreateOperation(IRI seriesURI) throws RmesException { } @Override - public boolean canCreateSims(IRI targetURI) throws RmesException { - List uris = new ArrayList<>(); - uris.add(targetURI); - return canCreateSims(uris); - } - - @Override - public boolean canCreateSims(List uris) throws RmesException { + public boolean canCreateSims(IRI seriesOrIndicatorUri) throws RmesException { User user = getUser(); - return (isAdmin(user) || (isSeriesManager(uris) && isSeriesContributor(user)) - || (isIndicatorManager(uris) && isIndicatorContributor(user))); + return (isAdmin(user) || (isSeriesManager(seriesOrIndicatorUri) && isSeriesContributor(user)) + || (isIndicatorManager(seriesOrIndicatorUri) && isIndicatorContributor(user))); } @Override - public boolean canDeleteSims(IRI targetURI) throws RmesException { - List uris = new ArrayList<>(); - uris.add(targetURI); - return canDeleteSims(uris); - } - - @Override - public boolean canDeleteSims(List uris) throws RmesException { - User user = getUser(); -// return (isAdmin(user) || (isSeriesManager(uris) && isSeriesContributor(user))); - return (isAdmin(user)); + public boolean canDeleteSims() throws RmesException { + return isAdmin(); } @Override @@ -359,12 +316,6 @@ public boolean canModifySeries(IRI uri) throws RmesException { return ((isSeriesManager(uri) && isSeriesContributor(user)) || isAdmin(user) || isCnis(user) ); } - @Override - public boolean canModifySeries(List uris) throws RmesException { - User user = getUser(); - return (isAdmin(user) || isCnis(user) || (isSeriesManager(uris) && isSeriesContributor(user))); - } - @Override public boolean canModifyOperation(IRI seriesURI) throws RmesException { return canModifySeries(seriesURI); @@ -376,12 +327,6 @@ public boolean canValidateSeries(IRI uri) throws RmesException { return (isAdmin(user) || (isSeriesManager(uri) && isSeriesContributor(user))); } - @Override - public boolean canValidateSeries(List uris) throws RmesException { - User user = getUser(); - return (isAdmin(user) || (isSeriesManager(uris) && isSeriesContributor(user))); - } - @Override public boolean canValidateOperation(IRI seriesURI) throws RmesException { return canValidateSeries(seriesURI); diff --git a/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java b/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java index 9c053f87d..7de02efe8 100644 --- a/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java +++ b/src/main/java/fr/insee/rmes/config/auth/security/restrictions/StampsRestrictionsService.java @@ -10,57 +10,80 @@ public interface StampsRestrictionsService { + /* + * USER + */ + User getUser() throws RmesException; + void setFakeUser(String user) throws JsonProcessingException; + + + /* + * CONCEPTS AND COLLECTIONS + */ + boolean isConceptOrCollectionOwner(IRI uri) throws RmesException; boolean isConceptsOrCollectionsOwner(List uris) throws RmesException; - boolean canModifyIndicator(List uris) throws RmesException; - - boolean canValidateIndicator(List uris) throws RmesException; + boolean canCreateConcept() throws RmesException; - boolean canModifySims(IRI targetUri) throws RmesException; + boolean canModifyConcept(IRI uri) throws RmesException; - boolean canCreateOperation(IRI seriesURI) throws RmesException; - boolean canCreateSims(List uris) throws RmesException; - boolean canModifySeries(List uris) throws RmesException; - - boolean canValidateSeries(List uris) throws RmesException; - - boolean isSeriesManager(IRI uri) throws RmesException; + /* + * INDICATORS + */ + boolean canCreateIndicator() throws RmesException; - boolean canCreateConcept() throws RmesException; + boolean canModifyIndicator(IRI uri) throws RmesException; - boolean canModifyConcept(IRI uri) throws RmesException; + boolean canValidateIndicator(IRI uri) throws RmesException; - boolean canCreateFamily() throws RmesException; + + /* + * DOCUMENTATION SIMS (OPERATION MODULE) + */ + boolean canCreateSims(IRI seriesOrIndicatorUri) throws RmesException; - boolean canCreateSeries() throws RmesException; + boolean canModifySims(IRI seriesOrIndicatorUri) throws RmesException; - boolean canCreateIndicator() throws RmesException; + boolean canDeleteSims() throws RmesException; - boolean canCreateSims(IRI targetURI) throws RmesException; + + /* + * OPERATIONS + */ + boolean canCreateOperation(IRI seriesURI) throws RmesException; + + boolean canModifyOperation(IRI seriesURI) throws RmesException; + + boolean canValidateOperation(IRI seriesURI) throws RmesException; - boolean canDeleteSims(IRI seriesURI) throws RmesException; - boolean canDeleteSims(List uris) throws RmesException; + /* + * SERIES + */ + boolean canCreateSeries() throws RmesException; + boolean canModifySeries(IRI uri) throws RmesException; boolean canValidateSeries(IRI uri) throws RmesException; - boolean canModifyOperation(IRI seriesURI) throws RmesException; - - boolean canValidateOperation(IRI seriesURI) throws RmesException; + boolean isSeriesManager(IRI uri) throws RmesException; - boolean canModifyIndicator(IRI uri) throws RmesException; + /* + * FAMILIES (OPERATION MODULE) + */ + boolean canCreateFamily() throws RmesException; - boolean canValidateIndicator(IRI uri) throws RmesException; + /* + * DOCUMENTS + */ boolean canManageDocumentsAndLinks() throws RmesException; - void setFakeUser(String user) throws JsonProcessingException; } diff --git a/src/main/java/fr/insee/rmes/config/auth/user/User.java b/src/main/java/fr/insee/rmes/config/auth/user/User.java index 598510148..12e1040cd 100644 --- a/src/main/java/fr/insee/rmes/config/auth/user/User.java +++ b/src/main/java/fr/insee/rmes/config/auth/user/User.java @@ -7,9 +7,9 @@ public class User { - JSONArray roles; - String stamp = ""; - Collection authorities; + private JSONArray roles; + private String stamp = ""; + private Collection authorities; public User() { super(); From f6b9d01ce1ffce40e05fab77db61698ac5cdaabf Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Thu, 25 Feb 2021 10:06:40 +0100 Subject: [PATCH 138/243] Improve export --- .../documentations/DocumentationExport.java | 4 +- .../.~lock.rmesPattern.fodt# | 1 + .../xslTransformerFiles/rmesPattern4.fodt | 648 ++++++++++++++++++ .../xslTransformerFiles/sims2fodt_v9.xsl | 585 ++++++++++++++++ 4 files changed, 1236 insertions(+), 2 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/.~lock.rmesPattern.fodt# create mode 100644 src/main/resources/xslTransformerFiles/rmesPattern4.fodt create mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 256e9b7dc..c432e0cb6 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -78,10 +78,10 @@ public File export(String simsXML,String operationXML,String indicatorXML,String File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt_v7.xsl"); + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt_v9.xsl"); OutputStream osOutputFile = FileUtils.openOutputStream(output); - InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); + InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern4.fodt"); PrintStream printStream= null; try{ diff --git a/src/main/resources/xslTransformerFiles/.~lock.rmesPattern.fodt# b/src/main/resources/xslTransformerFiles/.~lock.rmesPattern.fodt# new file mode 100644 index 000000000..204023244 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/.~lock.rmesPattern.fodt# @@ -0,0 +1 @@ +,AD/mmajr1,,20.02.2021 07:39,file:///D:/MMAJR1/Donn%C3%A9es%20d'applications/LibreOffice/5.4; \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/rmesPattern4.fodt b/src/main/resources/xslTransformerFiles/rmesPattern4.fodt new file mode 100644 index 000000000..6499fc792 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/rmesPattern4.fodt @@ -0,0 +1,648 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${series/prefLabelLg1} + + + + + ${series/prefLabelLg2} + + + + + + + + + ${operation/prefLabelLg1} + + + + + ${operation/prefLabelLg2} + + + + + + + + + ${indicator/prefLabelLg1} + + + + + ${indicator/prefLabelLg2} + + + + + + + + + + Informations sur la série : + ${series/prefLabelLg1} + Informations about the series: + ${series/prefLabelLg2} + + + + + + + + + + Informations sur l'indicateur : + ${indicator/prefLabelLg1} + Informations about the indicator: + ${indicator/prefLabelLg2} + + + + + + + + + + + Nom court + ${series/altLabelLg1} + + + + Short name + ${series/altLabelLg2} + + + + + Résumé + ${series/abstractLg1} + + + + Summary + ${series/abstractLg2} + + + + + Historique + ${series/historyNoteLg1} + + + + History + ${series/historyNoteLg2} + + + + + Type d'opération + ${seriesCode/type/labelLg1} + + + + Operation type + ${seriesCode/type/labelLg2} + + + + + Fréquence de collecte des données + ${seriesCode/accrualPeriodicity/labelLg1} + + + + Data frequency of dissemination + ${seriesCode/accrualPeriodicity/labelLg2} + + + + + Organismes responsables + #list(${series/publishers/labelLg1},'L1') + + + + + Partenaires + #list(${series/contributors/labelLg1},'L1') + + + + + Services collecteurs + #list(${series/dataCollectors/labelLg1},'L1') + + + + + Propriétaire + ${series/creators} + + + + + Succède à + ${series/replaces/labelLg1} + + + + Replaces + ${series/replaces/labelLg2} + + + + + Remplacé par + ${series/isReplacedBy/labelLg1} + + + + Replaced by + ${series/isReplacedBy/labelLg2} + + + + + Indicateurs produits + #list(${series/generates/labelLg1},'L1') + + + + + Séries ou Indicateurs liés + Séries: + #list(${series/seeAlso-series/labelLg1},'L1') + Indicateurs: + #list(${series/seeAlso-indicator/labelLg1},'L1') + + + + Series and indicators produced + Series: + #list(${series/seeAlso-series/labelLg2},'L1') + Indicators: + #list(${series/seeAlso-indicator/labelLg2},'L1') + + + + + Famille parente + #list(${series/family/labelLg1},'L1') + + + + Parent Family + #list(${series/family/labelLg2},'L1') + + + + + Opérations filles + #list(${series/operations/labelLg1},'L1') + + + + Daughter operations + #list(${series/operations/labelLg2},'L1') + + + + + + + + + + Informations sur l'opération : + ${operation/prefLabelLg1} + Informations about the operation: + ${operation/prefLabelLg2} + + + + + + + + + + + Nom court + ${indicator/altLabelLg1} + + + + Short name + ${indicator/altLabelLg2} + + + + + Résumé + ${indicator/abstractLg1} + + + + Summary + ${indicator/abstractLg2} + + + + + Historique + ${indicator/historyNoteLg1} + + + + History + ${indicator/historyNoteLg2} + + + + + Fréquence de diffusion + ${indicatorCode/accrualPeriodicity/labelLg1} + + + + Data frequency of dissemination + ${indicatorCode/accrualPeriodicity/labelLg2} + + + + + Organismes responsables + #list(${indicator/publishers},'L1') + + + + + Propriétaire + ${indicator/creators} + + + + + Partenaires + #list(${indicator/contributors},'L1') + + + + + Succède à + ${indicator/replaces/labelLg1} + + + + Replaces + ${indicator/replaces/labelLg2} + + + + + Remplacé par + ${indicator/isReplacedBy/labelLg1} + + + + Replaced by + ${indicator/isReplacedBy/labelLg2} + + + + + Produit de + #list(${indicator/wasGeneratedBy/labelLg1},'L1') + + + + Produced from + #list(${indicator/wasGeneratedBy/labelLg2},'L1') + + + + + Séries ou Indicateurs liés + Séries: + #list(${indicator/seeAlso-series/labelLg1},'L1') + Indicateurs: + #list(${indicator/seeAlso-indicator/labelLg1},'L1') + + + + Series and indicators produced + Series: + #list(${indicator/seeAlso-series/labelLg2},'L1') + Indicators: + #list(${indicator/seeAlso-indicator/labelLg2},'L1') + + + + + + + + + + + Nom court + ${operation/altLabelLg1} + + + + Short name + ${operation/altLabelLg2} + + + + + Série parente + ${operation/series/labelLg1} + + + + Parent series + ${operation/series/labelLg2} + + + + Rapport qualité : ${sims/prefLabelLg1} + + + + + + + ${mas/idMas} - ${mas/masLabelLg1} + + + + + + + + + ${mas/idMas} - ${mas/masLabelLg1} + ${simsRubrics/labelLg1} + + + ${mas/idMas} - ${mas/masLabelLg2} + ${simsRubrics/labelLg2} + + + + + + + diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl new file mode 100644 index 000000000..dd9dbfe13 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl @@ -0,0 +1,585 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Root template + + + + + + + + + + + default template : copy the fodt file, element by element + + + + + + + + + loop on the mas + + + + + + + + + + + + + + + + + + + + + elements with @id are used to filter the pattern, depending on parameters or + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Transform variable-name into nodes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TODO + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From ef1771bb2feb515d5a3e3bc442b21b18f1d1bcb4 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Thu, 25 Feb 2021 10:27:37 +0100 Subject: [PATCH 139/243] Update OperationsImpl.java --- .../rmes/bauhaus_services/operations/OperationsImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 2f07323b0..3e04c63c3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -38,6 +38,7 @@ import fr.insee.rmes.config.swagger.model.IdLabelTwoLangs; import fr.insee.rmes.exceptions.ErrorCodes; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.exceptions.RmesNotAcceptableException; import fr.insee.rmes.external_services.export.ExportUtils; import fr.insee.rmes.external_services.export.Jasper; import fr.insee.rmes.external_services.export.XDocReport; @@ -430,9 +431,10 @@ public String publishMetadataReport(String id) throws RmesException { @Override public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean francais, Boolean english) throws RmesException { - if(!(francais) && !(english)) throw new RmesException(HttpStatus.SC_NOT_ACCEPTABLE, + if(!(francais) && !(english)) throw new RmesNotAcceptableException( ErrorCodes.SIMS_EXPORT_WITHOUT_LANGUAGE, - "at least one language must be selected for export"); + "at least one language must be selected for export", + "in export of sims: "+id); File output; InputStream is; try { From 9eae8ad4e76cde2139ffcd939f5fa56476b860e6 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 25 Feb 2021 12:29:54 +0100 Subject: [PATCH 140/243] Try to reduce getSims time --- .../documentations/DocumentationsUtils.java | 7 ++--- .../MetadataStructureDefUtils.java | 9 ++---- .../operations/series/SeriesUtils.java | 9 ++++++ .../code_list/CodeListQueries.java | 16 ---------- .../documentations/DocumentationsQueries.java | 29 ++++++++++--------- .../documentations/DocumentsQueries.java | 3 +- .../getAttributeSpecificationQuery.ftlh | 7 +++-- .../getDocumentationRubricsQuery.ftlh | 28 +++++++----------- .../getPublicationStatusQuery.ftlh | 3 +- .../series/getSeriesCreatorsByUriQuery.ftlh | 1 + 10 files changed, 49 insertions(+), 63 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index e2cd28646..c5dfcc886 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -494,11 +494,10 @@ public String getDocumentationOwnersByIdSims(String idSims) throws RmesException String idIndicator = target.getString(Constants.ID_INDICATOR); if (idOperation != null && !idOperation.isEmpty()) { - stamps = seriesUtils.getSeriesJsonById( - operationsUtils.getOperationJsonById(idOperation).getJSONObject("series").getString(Constants.ID)) - .getJSONArray(Constants.CREATORS).toString(); + IRI seriesUri = operationsUtils.getSeriesUri(idOperation); + stamps = seriesUtils.getSeriesCreators(seriesUri).toString(); } else if (idSerie != null && !idSerie.isEmpty()) { - stamps = seriesUtils.getSeriesJsonById(idSerie).getJSONArray(Constants.CREATORS).toString(); + stamps = seriesUtils.getSeriesCreators(idSerie).toString(); } else if (idIndicator != null && !idIndicator.isEmpty()) { stamps = indicatorsUtils.getIndicatorJsonById(idIndicator).getJSONArray(Constants.CREATORS).toString(); } else { diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/MetadataStructureDefUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/MetadataStructureDefUtils.java index 7469350f8..6d26e5bee 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/MetadataStructureDefUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/MetadataStructureDefUtils.java @@ -16,7 +16,6 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.model.operations.documentations.RangeType; -import fr.insee.rmes.persistance.sparql_queries.code_list.CodeListQueries; import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentationsQueries; @Component @@ -42,12 +41,8 @@ public void transformRangeType(JSONObject mas) throws RmesException { mas.put(Constants.RANGE_TYPE, type.getJsonType()); mas.remove(RANGE); - if (type.equals(RangeType.CODELIST)) { - JSONObject codeList = repoGestion.getResponseAsObject(CodeListQueries.getCodeListNotationByUri(rangeUri)); - if (codeList != null && !codeList.isNull("notation")) { - String codeListNotation = codeList.getString("notation"); - mas.put("codeList", codeListNotation); - } + if (!type.equals(RangeType.CODELIST)) { + mas.remove("codeList"); } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java index 04b667a70..46af8e25d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java @@ -10,6 +10,7 @@ import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.model.vocabulary.DC; import org.eclipse.rdf4j.model.vocabulary.DCTERMS; import org.eclipse.rdf4j.model.vocabulary.RDF; @@ -185,6 +186,14 @@ private void addSeriesCreators(String id, JSONObject series) throws RmesExceptio JSONArray creators = repoGestion.getResponseAsJSONList(SeriesQueries.getCreatorsById(id)); series.put(Constants.CREATORS, creators); } + + public JSONArray getSeriesCreators(String id) throws RmesException { + return repoGestion.getResponseAsJSONList(SeriesQueries.getCreatorsById(id)); + } + + public JSONArray getSeriesCreators(IRI iri) throws RmesException { + return repoGestion.getResponseAsJSONList(SeriesQueries.getCreatorsBySeriesUri(((SimpleIRI)iri).toString())); + } /*WRITE*/ diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java index 3f93a65e3..09173539c 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java @@ -70,22 +70,6 @@ public static String getCodeUriByNotation(String notationCodeList, String notati + "?uri skos:notation '"+notationCode +"' . \n" + " }}"; } - - public static String getCodeListNotationByUri(String uri) { - return "SELECT ?notation \n" - + "WHERE { GRAPH <"+Config.CODELIST_GRAPH+"> { \n" - - + " OPTIONAL {<"+uri+"> rdfs:seeAlso ?codeListCS . \n" - + " ?codeListCS rdf:type skos:ConceptScheme . \n" - +" ?codeListCS skos:notation ?notation " - + " } \n" - - + " OPTIONAL {<"+uri+"> rdf:type skos:ConceptScheme . \n" - +" <"+uri+"> skos:notation ?notation " - + " } \n" - - + " }}"; - } public static String geCodesListByIRI(String id) throws RmesException { HashMap params = new HashMap<>(); diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java index 0e4895aea..be66efbae 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentationsQueries.java @@ -14,14 +14,14 @@ public class DocumentationsQueries { private static final String ID_SIMS = Constants.ID_SIMS; - static Map params ; + /** * @return ?idMas ?masLabelLg1 ?masLabelLg2 ?idParent ?isPresentational * @throws RmesException */ public static String msdQuery() throws RmesException{ - if (params==null) {initParams();} + Map params = initParams(); return buildRequest("msdQuery.ftlh", params); } @@ -31,7 +31,7 @@ public static String msdQuery() throws RmesException{ * @throws RmesException */ public static String getAttributeSpecificationQuery(String idMas) throws RmesException { - if (params==null) {initParams();} + Map params = initParams(); params.put("idMas", idMas); params.put("uniqueAttr","true"); params.put("MSD_GRAPH",Config.MSD_GRAPH); @@ -45,7 +45,7 @@ public static String getAttributeSpecificationQuery(String idMas) throws RmesExc * @throws RmesException */ public static String getAttributesQuery() throws RmesException { - if (params==null) {initParams();} + Map params = initParams(); params.put("uniqueAttr","false"); return buildRequest("getAttributeSpecificationQuery.ftlh", params); } @@ -55,7 +55,7 @@ public static String getAttributesQuery() throws RmesException { * @throws RmesException */ public static String getAttributesUriQuery() throws RmesException { - if (params==null) {initParams();} + Map params = initParams(); return buildRequest("getAttributesUriQuery.ftlh", params); } @@ -66,7 +66,7 @@ public static String getAttributesUriQuery() throws RmesException { * @throws RmesException */ public static String getDocumentationTitleQuery(String idSims) throws RmesException { - if (params==null) {initParams();} + Map params = initParams(); params.put(ID_SIMS, idSims); return buildRequest("getDocumentationTitleQuery.ftlh", params); } @@ -77,7 +77,7 @@ public static String getDocumentationTitleQuery(String idSims) throws RmesExcept * @throws RmesException */ public static String getTargetByIdSims(String idSims) throws RmesException { - if (params==null) {initParams();} + Map params = initParams(); params.put(ID_SIMS, idSims); return buildRequest("getTargetByIdSimsQuery.ftlh", params); } @@ -88,7 +88,7 @@ public static String getTargetByIdSims(String idSims) throws RmesException { * @throws RmesException */ public static String getSimsByTarget(String idTarget) throws RmesException { - if (params==null) {initParams();} + Map params = initParams(); params.put("idTarget", idTarget); return buildRequest("getSimsByIdTargetQuery.ftlh", params); } @@ -99,7 +99,7 @@ public static String getSimsByTarget(String idTarget) throws RmesException { * @throws RmesException */ public static String getDocumentationRubricsQuery(String idSims, String clLg1, String clLg2) throws RmesException { - if (params==null) {initParams();} + Map params = initParams(); params.put(ID_SIMS, idSims); params.put("DATE", RangeType.DATE); params.put("STRING", RangeType.STRING); @@ -127,20 +127,22 @@ public static String lastID() throws RmesException { public static String getPublicationState(String id) throws RmesException{ - if (params==null) {initParams();} - params.put(Constants.ID, id); + Map params = initParams(); + params.put(Constants.ID_SIMS, id); + params.put("DOCUMENTATIONS_GRAPH", Config.DOCUMENTATIONS_GRAPH); return buildRequest("getPublicationStatusQuery.ftlh", params); } - private static void initParams() { - params = new HashMap<>(); + private static Map initParams() { + Map params = new HashMap<>(); params.put("LG1", Config.LG1); params.put("LG2", Config.LG2); params.put("DOCUMENTATIONS_GRAPH", Config.DOCUMENTATIONS_GRAPH); params.put("MSD_GRAPH",Config.MSD_GRAPH); params.put("CODELIST_GRAPH",Config.CODELIST_GRAPH); params.put("MSD_CONCEPTS_GRAPH", Config.MSD_CONCEPTS_GRAPH); + return params; } @@ -154,6 +156,7 @@ private DocumentationsQueries() { } public static String deleteGraph(Resource graph) throws RmesException { + Map params = initParams(); params.put("DOCUMENTATION_GRAPH", graph); return buildRequest("deleteGraph.ftlh", params); } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java index b2ac198f0..50e6a8677 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java @@ -43,8 +43,7 @@ public static String getDocumentQuery(String id, boolean isLink) throws RmesExce } public static String getSimsByDocument(String id) throws RmesException { - params.put("LG1", Config.LG1); - params.put("LG2", Config.LG2); + if (params==null) {initParams();} params.put("ID", Config.DOCUMENTS_BASE_URI + "/" + id); return buildRequest("getSimsByDocument.ftlh", params); } diff --git a/src/main/resources/request/operations/documentations/getAttributeSpecificationQuery.ftlh b/src/main/resources/request/operations/documentations/getAttributeSpecificationQuery.ftlh index f5cf1e851..6b3d05e50 100644 --- a/src/main/resources/request/operations/documentations/getAttributeSpecificationQuery.ftlh +++ b/src/main/resources/request/operations/documentations/getAttributeSpecificationQuery.ftlh @@ -1,4 +1,4 @@ -SELECT ?id ?masLabelLg1 ?masLabelLg2 ?range ?isPresentational ?maxOccurs +SELECT ?id ?masLabelLg1 ?masLabelLg2 ?range ?isPresentational ?maxOccurs ?codeList FROM <${MSD_GRAPH}> FROM <${CODELIST_GRAPH}> FROM <${MSD_CONCEPTS_GRAPH}> @@ -8,7 +8,10 @@ SELECT ?id ?masLabelLg1 ?masLabelLg2 ?range ?isPresentational ?maxOccurs OPTIONAL {?mas sdmx-mm:maxOccurs ?maxOccurs} ?mas sdmx-mm:metadataAttributeProperty ?map . - OPTIONAL {?map rdfs:range ?range } + ?map rdfs:range ?range . + + OPTIONAL {?range rdfs:seeAlso/skos:notation|skos:notation ?codeList .} + ?map sdmx-mm:concept ?concept . ?concept skos:prefLabel ?masLabelLg1 ; diff --git a/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh b/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh index 7644b831e..424640bf8 100644 --- a/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh +++ b/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh @@ -7,21 +7,21 @@ SELECT ?idAttribute ?value ?labelLg1 ?labelLg2 ?codeList ?rangeType ?hasDocLg1 ? FROM NAMED <${MSD_GRAPH}> WHERE { - <#-- RangeType.DATE : value --> - { ?report rdf:type sdmx-mm:MetadataReport . ?reportAttr sdmx-mm:metadataReport ?report . - BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . + + + <#-- RangeType.DATE : value --> + {{ ?reportAttr ?attr ?value . FILTER ( datatype(?value) = <${DATE.rdfType}> ) BIND('${DATE.jsonType}' AS ?rangeType) . + BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . + } <#-- RangeType.RICHTEXT : label, hasDoc --> UNION { - ?report rdf:type sdmx-mm:MetadataReport . - ?reportAttr sdmx-mm:metadataReport ?report . - ?reportAttr ?attr ?textLg1 . ?textLg1 rdf:type dcmitype:Text . FILTER(EXISTS{?textLg1 dcterms:language <${LG1_CL}>}) @@ -44,26 +44,22 @@ WHERE { BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . - BIND('${RICHTEXT.jsonType}' AS ?rangeType) . } <#-- RangeType.STRING : label --> UNION { - ?report rdf:type sdmx-mm:MetadataReport . - ?reportAttr sdmx-mm:metadataReport ?report . - BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . ?reportAttr ?attr ?labelLg1 . FILTER(lang(?labelLg1) = '${LG1}') OPTIONAL{?reportAttr ?attr ?labelLg2 . - FILTER(lang(?labelLg2) = '${LG2}') } + FILTER(lang(?labelLg2) = '${LG2}') } BIND('${STRING.jsonType}' AS ?rangeType) . + BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . + } <#-- RangeType.CODELIST : value, codelist, maxoccurs --> UNION { - ?report rdf:type sdmx-mm:MetadataReport . - ?reportAttr sdmx-mm:metadataReport ?report . BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . ?reportAttr ?attr ?codeUri . ?codeUri skos:notation ?value . @@ -80,8 +76,6 @@ WHERE { } <#-- RangeType.ORGANIZATION : value --> UNION { - ?report rdf:type sdmx-mm:MetadataReport . - ?reportAttr sdmx-mm:metadataReport ?report . ?reportAttr ?attr ?organisationUri . BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . ?organisationUri dcterms:identifier ?value . @@ -90,14 +84,12 @@ WHERE { <#-- RangeType.GEOGRAPHY : value (uri), label --> UNION { - ?report rdf:type sdmx-mm:MetadataReport . - ?reportAttr sdmx-mm:metadataReport ?report . ?reportAttr ?attr ?uri . GRAPH <${MSD_GRAPH}> { ?attr rdfs:range geo:Feature . } BIND(REPLACE( STR(?attr) , '(.*/)(\\w.+$)', '$2' ) AS ?idAttribute) . BIND('${GEOGRAPHY.jsonType}' AS ?rangeType) . - } + } } } \ No newline at end of file diff --git a/src/main/resources/request/operations/documentations/getPublicationStatusQuery.ftlh b/src/main/resources/request/operations/documentations/getPublicationStatusQuery.ftlh index c651e90a8..7c9cec5d3 100644 --- a/src/main/resources/request/operations/documentations/getPublicationStatusQuery.ftlh +++ b/src/main/resources/request/operations/documentations/getPublicationStatusQuery.ftlh @@ -1,5 +1,6 @@ SELECT ?state +FROM <${DOCUMENTATIONS_GRAPH}/${idSims}> WHERE { ?doc insee:validationState ?state . - FILTER(STRENDS(STR(?doc), '${id}')) + FILTER(STRENDS(STR(?doc), '${idSims}')) } \ No newline at end of file diff --git a/src/main/resources/request/operations/series/getSeriesCreatorsByUriQuery.ftlh b/src/main/resources/request/operations/series/getSeriesCreatorsByUriQuery.ftlh index 937cc61c6..1892dd947 100644 --- a/src/main/resources/request/operations/series/getSeriesCreatorsByUriQuery.ftlh +++ b/src/main/resources/request/operations/series/getSeriesCreatorsByUriQuery.ftlh @@ -1,4 +1,5 @@ SELECT ?creators +FROM <${OPERATIONS_GRAPH}> WHERE { ?series dc:creator ?creators . VALUES ?series { <${URI_SERIES}>} From 47382bea64a3e929e71631016d2a26ea5acb4a42 Mon Sep 17 00:00:00 2001 From: BulotF Date: Thu, 25 Feb 2021 14:49:48 +0100 Subject: [PATCH 141/243] manage RangeType = 'DATE' --- .../resources/xslTransformerFiles/sims2fodt_v9.xsl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl index dd9dbfe13..58d269647 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl @@ -470,6 +470,17 @@ + + + + + + + + + + + From 74fca6ebafbc1c63f88ae78e6c315323f2ca54db Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 25 Feb 2021 16:20:57 +0100 Subject: [PATCH 142/243] Fix issue to publish a sims --- .../operations/documentations/DocumentationsUtils.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index c5dfcc886..d2b2cc93b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -283,7 +283,11 @@ public String publishMetadataReport(String id) throws RmesException { } /* Check rights */ - if (!stampsRestrictionsService.canCreateSims(targetUri)) { + IRI seriesOrIndicatorUri = targetUri; + if (((SimpleIRI) targetUri).toString().contains(Config.OPERATIONS_BASE_URI)) { + seriesOrIndicatorUri = operationsUtils.getSeriesUri(targetId); + } + if (!stampsRestrictionsService.canCreateSims(seriesOrIndicatorUri)) { throw new RmesUnauthorizedException(ErrorCodes.SIMS_CREATION_RIGHTS_DENIED, "Only an admin or a manager can create a new sims."); } From 7f6a9ae93b1276a1a8aeafb546c781c68144ff17 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 25 Feb 2021 16:26:29 +0100 Subject: [PATCH 143/243] Update DocumentationsUtils.java --- .../operations/documentations/DocumentationsUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index d2b2cc93b..fb8d6150e 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -284,7 +284,7 @@ public String publishMetadataReport(String id) throws RmesException { /* Check rights */ IRI seriesOrIndicatorUri = targetUri; - if (((SimpleIRI) targetUri).toString().contains(Config.OPERATIONS_BASE_URI)) { + if (targetType.equals(Constants.OPERATION_UP)) { seriesOrIndicatorUri = operationsUtils.getSeriesUri(targetId); } if (!stampsRestrictionsService.canCreateSims(seriesOrIndicatorUri)) { From dce2bec99dbbbdb136affad0b972752bb264e6fd Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 26 Feb 2021 06:12:52 +0100 Subject: [PATCH 144/243] refactor export --- .../bauhaus_services/OperationsService.java | 2 +- .../operations/OperationsImpl.java | 6 +- .../documentations/DocumentationExport.java | 20 +- .../documentations/DocumentationsUtils.java | 4 +- .../operations/MetadataReportResources.java | 14 +- .../xslTransformerFiles/rmesPattern4.fodt | 648 ------------------ .../xslTransformerFiles/sims2fodt.xsl | 181 ++++- .../xslTransformerFiles/sims2fodt_v5.xsl | 536 --------------- .../xslTransformerFiles/sims2fodt_v6.xsl | 587 ---------------- .../xslTransformerFiles/sims2fodt_v6bis.xsl | 478 ------------- .../xslTransformerFiles/sims2fodt_v7.xsl | 585 ---------------- .../xslTransformerFiles/sims2fodt_v9.xsl | 585 ---------------- .../xslTransformerFiles/transfoXSLT.xsl | 13 - 13 files changed, 164 insertions(+), 3495 deletions(-) delete mode 100644 src/main/resources/xslTransformerFiles/rmesPattern4.fodt delete mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v5.xsl delete mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl delete mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v6bis.xsl delete mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl delete mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl delete mode 100644 src/main/resources/xslTransformerFiles/transfoXSLT.xsl diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index cb7df88bd..e9d7c3016 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -141,7 +141,7 @@ public interface OperationsService { String publishMetadataReport(String id) throws RmesException; - Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean francais, Boolean english) throws RmesException; + Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException; Response exportTestMetadataReport() throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 3e04c63c3..54925cb51 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -429,16 +429,16 @@ public String publishMetadataReport(String id) throws RmesException { * EXPORT */ @Override - public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean francais, Boolean english) throws RmesException { + public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException { - if(!(francais) && !(english)) throw new RmesNotAcceptableException( + if(!(lg1) && !(lg2)) throw new RmesNotAcceptableException( ErrorCodes.SIMS_EXPORT_WITHOUT_LANGUAGE, "at least one language must be selected for export", "in export of sims: "+id); File output; InputStream is; try { - output = documentationsUtils.exportMetadataReport(id,includeEmptyMas, francais, english); + output = documentationsUtils.exportMetadataReport(id,includeEmptyMas, lg1, lg2); is = new FileInputStream(output); } catch (Exception e1) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index c432e0cb6..1b81a8071 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -67,21 +67,20 @@ public File testExport() throws IOException { public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, String organizationsXML, String codeListsXML, String targetType, - Boolean includeEmptyMas, Boolean francais, Boolean english) throws RmesException, IOException { + Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXML = documentationsUtils.buildShellSims(); - // List languages = new ArrayList(); - String parametersXML = buildParams(francais,english,includeEmptyMas,targetType); + String parametersXML = buildParams(lg1,lg2,includeEmptyMas,targetType); File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); output.deleteOnExit(); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt_v9.xsl"); + InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt.xsl"); OutputStream osOutputFile = FileUtils.openOutputStream(output); - InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern4.fodt"); + InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); PrintStream printStream= null; try{ @@ -128,7 +127,7 @@ public File export(String simsXML,String operationXML,String indicatorXML,String return(output); } - private String buildParams(Boolean francais,Boolean english, Boolean includeEmptyMas, String targetType) { + private String buildParams(Boolean lg1, Boolean lg2, Boolean includeEmptyMas, String targetType) { String includeEmptyMasString=( includeEmptyMas ? "true" : "false"); String parametersXML=""; // parametersXML=parametersXML.concat(Constants.XML_START_DOCUMENT); @@ -136,12 +135,9 @@ private String buildParams(Boolean francais,Boolean english, Boolean includeEmpt parametersXML=parametersXML.concat(Constants.XML_OPEN_PARAMETERS_TAG); parametersXML=parametersXML.concat(Constants.XML_OPEN_LANGUAGES_TAG); - // for(String language : languages) { - // parametersXML=parametersXML.concat(Constants.XML_OPEN_LANGUAGE_TAG); - // parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGE_TAG); - // } - if(francais) parametersXML=parametersXML.concat("1"); - if(english) parametersXML=parametersXML.concat("2"); + + if(lg1) parametersXML=parametersXML.concat("1"); + if(lg2) parametersXML=parametersXML.concat("2"); parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGES_TAG); parametersXML=parametersXML.concat(Constants.XML_OPEN_INCLUDE_EMPTY_MAS_TAG); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 65f150a1b..6a2a69925 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -509,7 +509,7 @@ public File exportTestMetadataReport() throws IOException { return docExport.testExport(); } - public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean francais, Boolean english) throws IOException, RmesException { + public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws IOException, RmesException { String emptyXML=XMLUtils.produceEmptyXML(); Operation operation; @@ -577,7 +577,7 @@ public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean fra codeListsXML=codeListsXML.concat(Constants.XML_END_CODELIST_TAG); return docExport.export(simsXML,operationXML,indicatorXML,seriesXML, - organizationsXML,codeListsXML,targetType,includeEmptyMas,francais,english); + organizationsXML,codeListsXML,targetType,includeEmptyMas,lg1,lg2); } public File exportMetadataReportOld(String id) throws IOException, RmesException { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index 3a3e5acc6..9c987adbe 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -271,13 +271,13 @@ public Response setSimsValidation( /** * EXPORT * @param id - * @param english + * @param lg2 * @param includeEmptyMas * @return response */ @GET - @Path("/metadataReport/export/{id}/{emptyMas}/{fr}/{en}") + @Path("/metadataReport/export/{id}/{emptyMas}/{lg1}/{lg2}") @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") public Response getSimsExport(@Parameter( @@ -291,16 +291,16 @@ public Response getSimsExport(@Parameter( , @Parameter( description = "Version française", - required = false) @PathParam("fr") Boolean francais + required = false) @PathParam("lg1") Boolean lg1 , @Parameter( description = "Version anglaise", - required = false) @PathParam("en") Boolean english + required = false) @PathParam("lg2") Boolean lg2 ) throws RmesException { if (includeEmptyMas==null) {includeEmptyMas=true;} - if (francais==null) {francais=true;} - if (english==null) {english=true;} - return operationsService.exportMetadataReport(id,includeEmptyMas,francais,english); + if (lg1==null) {lg1=true;} + if (lg2==null) {lg2=true;} + return operationsService.exportMetadataReport(id,includeEmptyMas,lg1,lg2); } @GET diff --git a/src/main/resources/xslTransformerFiles/rmesPattern4.fodt b/src/main/resources/xslTransformerFiles/rmesPattern4.fodt deleted file mode 100644 index 6499fc792..000000000 --- a/src/main/resources/xslTransformerFiles/rmesPattern4.fodt +++ /dev/null @@ -1,648 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ${series/prefLabelLg1} - - - - - ${series/prefLabelLg2} - - - - - - - - - ${operation/prefLabelLg1} - - - - - ${operation/prefLabelLg2} - - - - - - - - - ${indicator/prefLabelLg1} - - - - - ${indicator/prefLabelLg2} - - - - - - - - - - Informations sur la série : - ${series/prefLabelLg1} - Informations about the series: - ${series/prefLabelLg2} - - - - - - - - - - Informations sur l'indicateur : - ${indicator/prefLabelLg1} - Informations about the indicator: - ${indicator/prefLabelLg2} - - - - - - - - - - - Nom court - ${series/altLabelLg1} - - - - Short name - ${series/altLabelLg2} - - - - - Résumé - ${series/abstractLg1} - - - - Summary - ${series/abstractLg2} - - - - - Historique - ${series/historyNoteLg1} - - - - History - ${series/historyNoteLg2} - - - - - Type d'opération - ${seriesCode/type/labelLg1} - - - - Operation type - ${seriesCode/type/labelLg2} - - - - - Fréquence de collecte des données - ${seriesCode/accrualPeriodicity/labelLg1} - - - - Data frequency of dissemination - ${seriesCode/accrualPeriodicity/labelLg2} - - - - - Organismes responsables - #list(${series/publishers/labelLg1},'L1') - - - - - Partenaires - #list(${series/contributors/labelLg1},'L1') - - - - - Services collecteurs - #list(${series/dataCollectors/labelLg1},'L1') - - - - - Propriétaire - ${series/creators} - - - - - Succède à - ${series/replaces/labelLg1} - - - - Replaces - ${series/replaces/labelLg2} - - - - - Remplacé par - ${series/isReplacedBy/labelLg1} - - - - Replaced by - ${series/isReplacedBy/labelLg2} - - - - - Indicateurs produits - #list(${series/generates/labelLg1},'L1') - - - - - Séries ou Indicateurs liés - Séries: - #list(${series/seeAlso-series/labelLg1},'L1') - Indicateurs: - #list(${series/seeAlso-indicator/labelLg1},'L1') - - - - Series and indicators produced - Series: - #list(${series/seeAlso-series/labelLg2},'L1') - Indicators: - #list(${series/seeAlso-indicator/labelLg2},'L1') - - - - - Famille parente - #list(${series/family/labelLg1},'L1') - - - - Parent Family - #list(${series/family/labelLg2},'L1') - - - - - Opérations filles - #list(${series/operations/labelLg1},'L1') - - - - Daughter operations - #list(${series/operations/labelLg2},'L1') - - - - - - - - - - Informations sur l'opération : - ${operation/prefLabelLg1} - Informations about the operation: - ${operation/prefLabelLg2} - - - - - - - - - - - Nom court - ${indicator/altLabelLg1} - - - - Short name - ${indicator/altLabelLg2} - - - - - Résumé - ${indicator/abstractLg1} - - - - Summary - ${indicator/abstractLg2} - - - - - Historique - ${indicator/historyNoteLg1} - - - - History - ${indicator/historyNoteLg2} - - - - - Fréquence de diffusion - ${indicatorCode/accrualPeriodicity/labelLg1} - - - - Data frequency of dissemination - ${indicatorCode/accrualPeriodicity/labelLg2} - - - - - Organismes responsables - #list(${indicator/publishers},'L1') - - - - - Propriétaire - ${indicator/creators} - - - - - Partenaires - #list(${indicator/contributors},'L1') - - - - - Succède à - ${indicator/replaces/labelLg1} - - - - Replaces - ${indicator/replaces/labelLg2} - - - - - Remplacé par - ${indicator/isReplacedBy/labelLg1} - - - - Replaced by - ${indicator/isReplacedBy/labelLg2} - - - - - Produit de - #list(${indicator/wasGeneratedBy/labelLg1},'L1') - - - - Produced from - #list(${indicator/wasGeneratedBy/labelLg2},'L1') - - - - - Séries ou Indicateurs liés - Séries: - #list(${indicator/seeAlso-series/labelLg1},'L1') - Indicateurs: - #list(${indicator/seeAlso-indicator/labelLg1},'L1') - - - - Series and indicators produced - Series: - #list(${indicator/seeAlso-series/labelLg2},'L1') - Indicators: - #list(${indicator/seeAlso-indicator/labelLg2},'L1') - - - - - - - - - - - Nom court - ${operation/altLabelLg1} - - - - Short name - ${operation/altLabelLg2} - - - - - Série parente - ${operation/series/labelLg1} - - - - Parent series - ${operation/series/labelLg2} - - - - Rapport qualité : ${sims/prefLabelLg1} - - - - - - - ${mas/idMas} - ${mas/masLabelLg1} - - - - - - - - - ${mas/idMas} - ${mas/masLabelLg1} - ${simsRubrics/labelLg1} - - - ${mas/idMas} - ${mas/masLabelLg2} - ${simsRubrics/labelLg2} - - - - - - - diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 4f00e13e2..dd9dbfe13 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -1,6 +1,6 @@ - - + + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + - + + + + + + + + @@ -86,7 +142,7 @@ - + @@ -104,7 +160,7 @@ - + + @@ -201,7 +257,7 @@ - + @@ -244,7 +300,7 @@ - + @@ -279,15 +335,24 @@ - - - - - - - - - + + + + + + + + + + + + + + + + + + @@ -335,37 +400,52 @@ - - + + - + + + + - + - + - + - + + + + - + - - + + + + + + + + + @@ -416,9 +496,28 @@ - + + + + + + + + + + + + + + + + @@ -451,7 +550,7 @@ - + @@ -468,6 +567,12 @@ + + + + + + diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v5.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v5.xsl deleted file mode 100644 index 67a993179..000000000 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v5.xsl +++ /dev/null @@ -1,536 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Root template - - - - - - - - - - - default template : copy the fodt file, element by element - - - - - - - - - loop on the mas - - - - - - - - - - - - - - - - - - - - - elements with @id are used to filter the pattern, depending on parameters or - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Transform variable-name into nodes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl deleted file mode 100644 index be7801099..000000000 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v6.xsl +++ /dev/null @@ -1,587 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Root template - - - - - - - - - - - default template : copy the fodt file, element by element - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - loop on the mas - - - - - - - - - - - - - - - - - - - - - elements with @id are used to filter the pattern, depending on parameters or - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Transform variable-name into nodes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v6bis.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v6bis.xsl deleted file mode 100644 index 063804e5c..000000000 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v6bis.xsl +++ /dev/null @@ -1,478 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Root template - - - - - - - - - - - default template : copy the fodt file, element by element - - - - - - - - - loop on the mas - - - - - - - - - - - - - - - - - - - - - elements with @id are used to filter the pattern, depending on parameters or - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Transform variable-name into nodes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl deleted file mode 100644 index dd9dbfe13..000000000 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v7.xsl +++ /dev/null @@ -1,585 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Root template - - - - - - - - - - - default template : copy the fodt file, element by element - - - - - - - - - loop on the mas - - - - - - - - - - - - - - - - - - - - - elements with @id are used to filter the pattern, depending on parameters or - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Transform variable-name into nodes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl deleted file mode 100644 index dd9dbfe13..000000000 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl +++ /dev/null @@ -1,585 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Root template - - - - - - - - - - - default template : copy the fodt file, element by element - - - - - - - - - loop on the mas - - - - - - - - - - - - - - - - - - - - - elements with @id are used to filter the pattern, depending on parameters or - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Transform variable-name into nodes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/transfoXSLT.xsl b/src/main/resources/xslTransformerFiles/transfoXSLT.xsl deleted file mode 100644 index 36d3dd979..000000000 --- a/src/main/resources/xslTransformerFiles/transfoXSLT.xsl +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file From a86ec40785c0001295baa89a190031de9d64c355 Mon Sep 17 00:00:00 2001 From: BulotF Date: Fri, 26 Feb 2021 11:56:52 +0100 Subject: [PATCH 145/243] remove unuseful files --- .../.~lock.rmesPattern.fodt# | 1 - .../xslTransformerFiles/sims2fodt_v9.xsl | 596 ------------------ 2 files changed, 597 deletions(-) delete mode 100644 src/main/resources/xslTransformerFiles/.~lock.rmesPattern.fodt# delete mode 100644 src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl diff --git a/src/main/resources/xslTransformerFiles/.~lock.rmesPattern.fodt# b/src/main/resources/xslTransformerFiles/.~lock.rmesPattern.fodt# deleted file mode 100644 index 204023244..000000000 --- a/src/main/resources/xslTransformerFiles/.~lock.rmesPattern.fodt# +++ /dev/null @@ -1 +0,0 @@ -,AD/mmajr1,,20.02.2021 07:39,file:///D:/MMAJR1/Donn%C3%A9es%20d'applications/LibreOffice/5.4; \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl b/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl deleted file mode 100644 index 58d269647..000000000 --- a/src/main/resources/xslTransformerFiles/sims2fodt_v9.xsl +++ /dev/null @@ -1,596 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Root template - - - - - - - - - - - default template : copy the fodt file, element by element - - - - - - - - - loop on the mas - - - - - - - - - - - - - - - - - - - - - elements with @id are used to filter the pattern, depending on parameters or - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Transform variable-name into nodes - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - TODO - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file From 5a3988bd4e02d52644ad4c2f4b2eb986c05751c6 Mon Sep 17 00:00:00 2001 From: BulotF Date: Fri, 26 Feb 2021 11:57:04 +0100 Subject: [PATCH 146/243] manage date format --- src/main/resources/xslTransformerFiles/sims2fodt.xsl | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index dd9dbfe13..58d269647 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -470,6 +470,17 @@ + + + + + + + + + + + From 9020c545e53afc072c5703e84d20c78fad952ba6 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Sun, 28 Feb 2021 09:00:31 +0100 Subject: [PATCH 147/243] fix: return creators of the series of the operation --- .../operations/operations/OperationsUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java index c580a4bc2..7207630ab 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/OperationsUtils.java @@ -2,6 +2,7 @@ import java.io.IOException; +import fr.insee.rmes.persistance.sparql_queries.operations.series.SeriesQueries; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.eclipse.rdf4j.model.IRI; @@ -10,6 +11,7 @@ import org.eclipse.rdf4j.model.vocabulary.DCTERMS; import org.eclipse.rdf4j.model.vocabulary.RDF; import org.eclipse.rdf4j.model.vocabulary.SKOS; +import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -67,6 +69,8 @@ public JSONObject getOperationJsonById(String id) throws RmesException { private void getOperationSeries(String id, JSONObject operation) throws RmesException { JSONObject series = repoGestion.getResponseAsObject(OperationsQueries.seriesQuery(id)); + JSONArray creators = repoGestion.getResponseAsJSONList(SeriesQueries.getCreatorsById(series.getString("id"))); + series.put(Constants.CREATORS, creators); operation.put("series", series); } From 412680dc9749a15c7f386c9929e2d9fb970ecf63 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 1 Mar 2021 08:55:34 +0100 Subject: [PATCH 148/243] escape <,> and & in rich text for export --- .../rmes/bauhaus_services/Constants.java | 3 + .../bauhaus_services/OperationsService.java | 4 +- .../operations/OperationsImpl.java | 9 +- .../documentations/DocumentationExport.java | 39 ------ .../DocumentationsRubricsUtils.java | 131 ++++++++++++------ .../documentations/DocumentationsUtils.java | 18 ++- .../java/fr/insee/rmes/utils/XMLUtils.java | 27 +++- .../operations/MetadataReportResources.java | 27 +++- 8 files changed, 157 insertions(+), 101 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index ab1a5ebe2..863254f68 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -115,6 +115,9 @@ public class Constants { public static final String XML_END_TARGET_TYPE_TAG = ""; public static final String XML_OPEN_INCLUDE_EMPTY_MAS_TAG = ""; public static final String XML_END_INCLUDE_EMPTY_MAS_TAG = ""; + public static final String XML_INF_REPLACEMENT = "replacementForInf"; + public static final String XML_SUP_REPLACEMENT = "replacementForSup"; + public static final String XML_ESPERLUETTE_REPLACEMENT = "replacementForEsperluette"; private Constants() { throw new IllegalStateException("Utility class"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index e9d7c3016..a7d8c95ff 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -133,8 +133,10 @@ public interface OperationsService { //SIMS String getMetadataReport(String id) throws RmesException; - Documentation getFullSims(String id) throws RmesException; + Documentation getFullSimsForXml(String id) throws RmesException; + String getFullSimsForJson(String id) throws RmesException; + String createMetadataReport(String body) throws RmesException; String setMetadataReport(String id, String body) throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 01b427d18..adcb22663 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -382,10 +382,15 @@ public String getMetadataReport(String id) throws RmesException { } @Override - public Documentation getFullSims(String id) throws RmesException { - return documentationsUtils.getFullSims(id); + public Documentation getFullSimsForXml(String id) throws RmesException { + return documentationsUtils.getFullSimsForXml(id); } + @Override + public String getFullSimsForJson(String id) throws RmesException { + return documentationsUtils.getFullSimsForJson(id).toString(); + } + @Override public String getMetadataReportOwner(String id) throws RmesException { return documentationsUtils.getDocumentationOwnersByIdSims(id); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index d48418b9a..3d57b13b9 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -88,16 +88,6 @@ public File export(String simsXML,String operationXML,String indicatorXML,String transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); - // set parameters as Strings -// xsltTransformer.setParameter("Sims", simsXML); -// xsltTransformer.setParameter("Organizations", organizationsXML); -// xsltTransformer.setParameter("Operation", operationXML); -// xsltTransformer.setParameter("Indicator", indicatorXML); -// xsltTransformer.setParameter("Series", seriesXML); -// xsltTransformer.setParameter("Msd", msdXML); -// xsltTransformer.setParameter("CodeLists", codeListsXML); -// xsltTransformer.setParameter("parameters", parametersXML); - // Pass parameters in a file Path tempDir= Files.createTempDirectory("forExport"); addParameter ( xsltTransformer, "parametersFile", parametersXML,tempDir); @@ -133,7 +123,6 @@ private String buildParams(Boolean lg1, Boolean lg2, Boolean includeEmptyMas, St parametersXML=parametersXML.concat(Constants.XML_OPEN_PARAMETERS_TAG); parametersXML=parametersXML.concat(Constants.XML_OPEN_LANGUAGES_TAG); - if(lg1) parametersXML=parametersXML.concat("1"); if(lg2) parametersXML=parametersXML.concat("2"); parametersXML=parametersXML.concat(Constants.XML_END_LANGUAGES_TAG); @@ -148,34 +137,6 @@ private String buildParams(Boolean lg1, Boolean lg2, Boolean includeEmptyMas, St parametersXML=parametersXML.concat(Constants.XML_END_PARAMETERS_TAG); return XMLUtils.encodeXml(parametersXML); - - // return XMLUtils.convertStringToDocument(parametersXML).toString(); - - /* - InputStream parametersXMLFile = getClass().getResourceAsStream("/xslTransformerFiles/parameters.xml"); - DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance(); - domFactory.setIgnoringComments(true); - DocumentBuilder docBuilder; - Document doc = null; - try { - docBuilder = domFactory.newDocumentBuilder(); - doc = docBuilder.parse(parametersXMLFile); - Node root=doc.getFirstChild(); - Element targetTypeNode=doc.createElement("targetType"); - targetTypeNode.setNodeValue(targetType); - Element includeEmptyMasNode=doc.createElement("includeEmptyMas"); - includeEmptyMasNode.setNodeValue(includeEmptyMasString); - root.appendChild(targetTypeNode); - root.appendChild(includeEmptyMasNode); - } catch (Exception e) { - e.printStackTrace(); - } - try { - parametersXML = IOUtils.toString(parametersXMLFile, StandardCharsets.UTF_8); - } catch (IOException e) { - logger.error("Failed to read the xml : ", e); - } - */ } private void addParameter (Transformer xsltTransformer, String paramName, String paramData, Path tempDir) throws IOException { diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java index d3a3783fe..dba2f9a64 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java @@ -1,11 +1,14 @@ package fr.insee.rmes.bauhaus_services.operations.documentations; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.regex.Pattern; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.text.StringEscapeUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -56,13 +59,13 @@ public class DocumentationsRubricsUtils extends RdfService { @Autowired private CodeListService codeListService; - + @Autowired private LangService langService; - + @Autowired private GeographyService geoService; - + /** * GETTER @@ -110,7 +113,7 @@ else if (rubric.get(Constants.RANGE_TYPE).equals(RangeType.DATE)) { else if (rubric.has("maxOccurs")) { putMultipleValueInList(docRubrics, tempMultipleCodeList, i, rubric); } - + //Format Geo features else if (rubric.get(Constants.RANGE_TYPE).equals(RangeType.GEOGRAPHY.name())) { clearGeographyRubric(rubric); @@ -198,40 +201,40 @@ public void addRubricsToModel(Model model, String simsId, Resource graph, List docs = new ArrayList<>(); @@ -363,5 +410,5 @@ private void addJsonDocumentToObjectRubric(JSONObject rubric, DocumentationRubri documentationRubric.setDocumentsLg2(docs); } } - + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 9c667580a..02185406b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -128,10 +128,14 @@ public JSONObject getDocumentationByIdSims(String idSims) throws RmesException { return doc; } - public Documentation getFullSims(String id) throws RmesException { - return buildDocumentationFromJson(getDocumentationByIdSims(id)); + public Documentation getFullSimsForXml(String id) throws RmesException { + return buildDocumentationFromJson(getDocumentationByIdSims(id),true); } + public JSONObject getFullSimsForJson(String id) throws RmesException { + return getDocumentationByIdSims(id); + } + /** * Java Object Builder @@ -141,7 +145,7 @@ public Documentation getFullSims(String id) throws RmesException { */ /* Not Used */ public ExtensiveSims buildExtensiveDocumentationFromJson(JSONObject jsonSims) throws RmesException { - Documentation sims = buildDocumentationFromJson(jsonSims); + Documentation sims = buildDocumentationFromJson(jsonSims,false); return new ExtensiveSims(sims); } @@ -153,7 +157,7 @@ public ExtensiveSims buildExtensiveDocumentationFromJson(JSONObject jsonSims) th * @throws RmesException */ - public Documentation buildDocumentationFromJson(JSONObject jsonSims) throws RmesException { + public Documentation buildDocumentationFromJson(JSONObject jsonSims, Boolean forXml) throws RmesException { Documentation sims = new Documentation(); String idSims=jsonSims.getString(Constants.ID); @@ -180,7 +184,7 @@ public Documentation buildDocumentationFromJson(JSONObject jsonSims) throws Rmes for (int i = 0; i < docRubrics.length(); i++) { JSONObject rubric = docRubrics.getJSONObject(i); - currentRubric = documentationsRubricsUtils.buildRubricFromJson(rubric); + currentRubric = documentationsRubricsUtils.buildRubricFromJson(rubric,forXml); rubrics.add(currentRubric); } sims.setRubrics(rubrics); @@ -570,7 +574,7 @@ public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1 String organizationsXML = XMLUtils.produceXMLResponse(organizationsServiceImpl.getOrganizations()); - String simsXML=XMLUtils.produceResponse(getFullSims(id), "application/xml"); + String simsXML=XMLUtils.produceResponse(getFullSimsForXml(id), "application/xml"); neededCodeLists.addAll(XMLUtils.getTagValues(simsXML,Constants.CODELIST)); neededCodeLists=neededCodeLists.stream().distinct().collect(Collectors.toList()); @@ -657,7 +661,7 @@ public File exportMetadataReportOld(String id) throws IOException, RmesException is3 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(organizationsServiceImpl.getOrganizations()), StandardCharsets.UTF_8); Files.copy(is3, organizationsTempFile, options); - String simsXML=XMLUtils.produceResponse(getFullSims(id), "application/xml"); + String simsXML=XMLUtils.produceResponse(getFullSimsForXml(id), "application/xml"); neededCodeLists.addAll(XMLUtils.getTagValues(simsXML,Constants.CODELIST)); neededCodeLists=neededCodeLists.stream().distinct().collect(Collectors.toList()); diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index ee49168ba..388b8fbf3 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -128,17 +128,34 @@ public static String encodeXml(String response) { String ret = StringEscapeUtils.unescapeXml(response); ret = StringEscapeUtils.unescapeHtml4(ret); - final String regex = "&[^amp;]"; + final String regex = "&"; final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); ret = pattern.matcher(ret).replaceAll("&"); - final String regex2 = "<"; + final String regex2 = "&amp;"; final Pattern pattern2 = Pattern.compile(regex2, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); - ret = pattern2.matcher(ret).replaceAll("&amp;lt;"); + ret = pattern2.matcher(ret).replaceAll("&"); - final String regex3 = ">"; + final String regex3 = "&gt;"; final Pattern pattern3 = Pattern.compile(regex3, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); - ret = pattern3.matcher(ret).replaceAll("&amp;gt;"); + ret = pattern3.matcher(ret).replaceAll(">"); + + final String regex4 = "&lt;"; + final Pattern pattern4 = Pattern.compile(regex4, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern4.matcher(ret).replaceAll("<"); + + final String regex5 = Constants.XML_ESPERLUETTE_REPLACEMENT; + final Pattern pattern5 = Pattern.compile(regex5, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern5.matcher(ret).replaceAll("&"); + + final String regex6 = Constants.XML_SUP_REPLACEMENT; + final Pattern pattern6 = Pattern.compile(regex6, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern6.matcher(ret).replaceAll(">"); + + final String regex7 = Constants.XML_INF_REPLACEMENT; + final Pattern pattern7 = Pattern.compile(regex7, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern7.matcher(ret).replaceAll("<"); + return new String(ret.getBytes(), StandardCharsets.UTF_8); } diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index 9c987adbe..d9f603875 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -146,13 +146,30 @@ public Response getFullSims( @Parameter(hidden = true) @HeaderParam(HttpHeaders.ACCEPT) String header ) { Documentation fullsims; - try { - fullsims = operationsService.getFullSims(id); - } catch (RmesException e) { - return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + String jsonResultat; + + if (header != null && header.equals(MediaType.APPLICATION_XML)) { + try { + fullsims = operationsService.getFullSimsForXml(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + + return Response.ok(XMLUtils.produceResponse(fullsims, header)).build(); } - return Response.ok(XMLUtils.produceResponse(fullsims, header)).build(); + else { + try { + jsonResultat = operationsService.getFullSimsForJson(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + + + + } /** From ebb805c2b620b1bfabe9756a5bf8effaefaa4a27 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 1 Mar 2021 09:35:11 +0100 Subject: [PATCH 149/243] Fix issue --- .../documentations/documents/changeDocumentUrlQuery.ftlh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/request/operations/documentations/documents/changeDocumentUrlQuery.ftlh b/src/main/resources/request/operations/documentations/documents/changeDocumentUrlQuery.ftlh index 82095d1c2..1d161f8a3 100644 --- a/src/main/resources/request/operations/documentations/documents/changeDocumentUrlQuery.ftlh +++ b/src/main/resources/request/operations/documentations/documents/changeDocumentUrlQuery.ftlh @@ -1,4 +1,4 @@ -WITH <${uriGraph}> +WITH <${DOCUMENTS_GRAPH}> DELETE { ?uri ?url . @@ -11,7 +11,7 @@ WHERE { } ; -WITH <${uriGraph}> +WITH <${DOCUMENTS_GRAPH}> INSERT { ?uri <${newUrl}> From e669ebb4fe052a6dfcd55c9f3f21cc1b93589150 Mon Sep 17 00:00:00 2001 From: BulotF Date: Mon, 1 Mar 2021 16:27:29 +0100 Subject: [PATCH 150/243] =?UTF-8?q?fodt=20export=20for=20Comit=C3=A9=20du?= =?UTF-8?q?=20Label?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../xslTransformerFiles/labelPattern.odt | Bin 0 -> 16416 bytes .../labelPatternContent.xml | 477 ++++++++++++++++++ .../xslTransformerFiles/sims2fodt.xsl | 10 + 3 files changed, 487 insertions(+) create mode 100644 src/main/resources/xslTransformerFiles/labelPattern.odt create mode 100644 src/main/resources/xslTransformerFiles/labelPatternContent.xml diff --git a/src/main/resources/xslTransformerFiles/labelPattern.odt b/src/main/resources/xslTransformerFiles/labelPattern.odt new file mode 100644 index 0000000000000000000000000000000000000000..2e5eef2f50eaa77e9e1db8420476e1645193f7a6 GIT binary patch literal 16416 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/labelPatternContent.xml b/src/main/resources/xslTransformerFiles/labelPatternContent.xml new file mode 100644 index 000000000..07020672d --- /dev/null +++ b/src/main/resources/xslTransformerFiles/labelPatternContent.xml @@ -0,0 +1,477 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Table des matières + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Table des matières + + 1. Demande de label d’intérêt général et de qualité statistique avec le caractère obligatoire2 + 2. Contexte de l’enquête2 + 2.1. Avis d’opportunité du Cnis2 + 2.2. Règlement européen2 + 2.3. Service producteur et services réalisant la collecte2 + 2.4. Objectifs détaillés des enquêtes et principaux thèmes abordés2 + 2.5. Instances de concertation avec les partenaires sociaux2 + 2.6. Autres éléments de la comitologie3 + 2.7. Calendrier de l’enquête3 + 2.8. Exploitation et diffusion des résultats3 + 2.9. Bilan d’exécution de l’enquête précédente et des résultats produits3 + 2.10. Bilan de la mise en œuvre des recommandations du Comité du label3 + 3. Méthodologie statistique4 + 3.1. Champ de l’enquête et unités enquêtées4 + 3.2. Paramètres d’intérêt de l’enquête4 + 3.3. Description du sondage4 + 3.4. Traitements statistiques5 + 4. Description du mode de collecte6 + 4.1. Protocole de collecte6 + 4.2. Sécurité des données et protection du secret statistique6 + 4.3. Lettres-avis définitives, notices ou plaquettes d’informations6 + 5. Questionnaire7 + 5.1. Compte-rendu détaillé des tests7 + 5.2. Questionnaire définitif7 + 6. Coût des enquêtes8 + + + + Demande de label d’intérêt général et de qualité statistique avec le caractère obligatoire + + Contexte de l’enquête + Avis d’opportunité du Cnis + Numéro de visa : + ${identifiedSims/I.6.3/labelLg1} + + Règlement européen + Actes juridiques et autres accords : + ${identifiedSims/S.6.1/labelLg1} + + Service producteur et services réalisant la collecte + Organisme responsable : + #list(${series/publishers/labelLg1},'L1') + Service collecteur : + #list(${series/dataCollectors/labelLg1},'L1') + + Objectifs détaillés des enquêtes et principaux thèmes abordés + Résumé : + ${series/abstractLg1} + + Instances de concertation avec les partenaires sociaux + Partenaires : + #list(${series/contributors/labelLg1},'L1') + Instance de concertation : + ${identifiedSims/C.12.1.1/labelLg1} + + Autres éléments de la comitologie + Partenaires : + #list(${series/contributors/labelLg1},'L1') + Comitologie : + ${identifiedSims/C.11.1.2/labelLg1} + + Calendrier de l’enquête + Calendrier de diffusion : + ${identifiedSims/S.8.1/labelLg1} + Accès aux micro-données : + ${identifiedSims/S.10.4/labelLg1} + Période de collecte : + ${identifiedSims/I.18.1/labelLg1} + + Exploitation et diffusion des résultats + Publications : + ${identifiedSims/S.10.2/labelLg1} + Base de données en ligne : + ${identifiedSims/S.10.3/labelLg1} + + Bilan d’exécution de l’enquête précédente et des résultats produits + Faits marquants : + ${identifiedSims/C.3.1/labelLg1} + + Bilan de la mise en œuvre des recommandations du Comité du label + + + Méthodologie statistique + Champ de l’enquête et unités enquêtées + Couverture sectorielle : + ${identifiedSims/S.3.3/labelLg1} + Unité statistique : + ${identifiedSims/S.3.5/labelLg1} + Population statistique : + ${identifiedSims/S.3.6/labelLg1} + Zone géographique de référence : + ${identifiedSims/S.3.7/labelLg1} + Erreur de couverture : + ${identifiedSims/S.13.3.1/labelLg1} + Unités enquêtées : + ${identifiedSims/I.18.3/labelLg1} + + Paramètres d’intérêt de l’enquête + Description des données + ${identifiedSims/S.3.1/labelLg1} + Nomenclature + ${identifiedSims/S.3.2/labelLg1} + + Description du sondage + Plan de sondage + ${identifiedSims/I.18.4/labelLg1} + Taille de l’échantillon + ${identifiedSims/I.18.5/labelLg1} + + Traitements statistiques + Élaboration des données + ${identifiedSims/S.18.5/labelLg1} + Ajustement + ${identifiedSims/S.18.6/labelLg1} + + Description du mode de collecte + Protocole de collecte + Données sources + ${identifiedSims/S.18.1/labelLg1} + Fréquence de collecte des données + ${identifiedSims/S.18.2/labelLg1} + Collecte des données + ${identifiedSims/S.18.3/labelLg1} + Mode de collecte + ${identifiedSims/I.18.2/labelLg1} + + Sécurité des données et protection du secret statistique + Politique de confidentialité + ${identifiedSims/S.7.1/labelLg1} + Confidentialité — traitement des données + ${identifiedSims/S.7.2/labelLg1} + + Lettres-avis définitives, notices ou plaquettes d’informations + Documents de collecte + ${identifiedSims/I.18.6/labelLg1} + Questionnaire + Compte-rendu détaillé des tests + + Questionnaire définitif + Documents de collecte + ${identifiedSims/I.18.6/labelLg1} + Coût des enquêtes + Coût et charges + ${identifiedSims/S.16/labelLg1} + + + diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 58d269647..36502f449 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -535,6 +535,16 @@ + + + + + + + + + + TODO From 061842aae451c7b75bbc0df99a85e42ac3f04800 Mon Sep 17 00:00:00 2001 From: BulotF Date: Mon, 1 Mar 2021 17:11:01 +0100 Subject: [PATCH 151/243] unuseful namespace removed --- src/main/resources/xslTransformerFiles/sims2fodt.xsl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 36502f449..2ecff8fe9 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -1,6 +1,6 @@ Date: Tue, 2 Mar 2021 09:23:40 +0100 Subject: [PATCH 152/243] Update DocumentationsUtilsTest.java --- .../operations/documentations/DocumentationsUtilsTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java b/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java index 85331d86f..aa8fec6f1 100644 --- a/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java +++ b/src/test/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtilsTest.java @@ -39,11 +39,11 @@ public void init() { void buildDocumentationFromJsonTest() throws RmesException{ // Mocker les méthodes de buildDocumentationFromJson qui font appel à d'autres classes - when(mockDocumentationsRubricsUtils.buildRubricFromJson(Mockito.any())).thenReturn(new DocumentationRubric()); + when(mockDocumentationsRubricsUtils.buildRubricFromJson(Mockito.any(),true)).thenReturn(new DocumentationRubric()); String source="{\"rubrics\":[],\"idSeries\":\"\",\"labelLg2\":\"Metadata report 9999\",\"labelLg1\":\"Rapport de métadonnées 9999\",\"idOperation\":\"s8888\",\"idIndicator\":\"\",\"id\":\"9999\"}"; JSONObject jsonDocumentation = new JSONObject(source); - Documentation sims = documentationsUtils.buildDocumentationFromJson(jsonDocumentation); + Documentation sims = documentationsUtils.buildDocumentationFromJson(jsonDocumentation,true); if (!sims.getId().equals("9999")) { fail("false id"); } From 33bc1bb6cfa21ecda7ce4303e3aaeb93db917e6b Mon Sep 17 00:00:00 2001 From: BulotF Date: Tue, 2 Mar 2021 13:44:04 +0100 Subject: [PATCH 153/243] add comments --- .../xslTransformerFiles/sims2fodt.xsl | 98 ++++++++----------- 1 file changed, 39 insertions(+), 59 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 2ecff8fe9..1fa4dea57 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -211,6 +211,10 @@ + + text:p elements containing ${referenceToData} are filled with the referenced data + referenced data may contain paragraphs with their own style or simple strings + @@ -230,6 +234,14 @@ + + + Recognize grammar structures : + #if (condition) content #endif + #list(content,'list style') + ${dataReference} + + @@ -248,47 +260,22 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + - - - - - - - - + + + + + + + + @@ -299,27 +286,17 @@ - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + @@ -551,6 +528,9 @@ + + replace html elements with libreOffice ones + From 4292e001874e031e2b153fe77ae3f033065e09da Mon Sep 17 00:00:00 2001 From: BulotF Date: Tue, 2 Mar 2021 15:53:34 +0100 Subject: [PATCH 154/243] filter empty rows with $parameters//includeEmptyMas = 'false' --- .../xslTransformerFiles/sims2fodt.xsl | 56 ++++++++++--------- 1 file changed, 29 insertions(+), 27 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 1fa4dea57..e26caa4d7 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -1,6 +1,6 @@ - + @@ -178,31 +178,7 @@ - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -211,6 +187,32 @@ + + filter rows when $parameters//includeEmptyMas is false + + + + + + + + + + + + + + + + + + + + + + + + text:p elements containing ${referenceToData} are filled with the referenced data referenced data may contain paragraphs with their own style or simple strings From 0937f97ee5b071b3e16e576333778ad6846e14c8 Mon Sep 17 00:00:00 2001 From: BulotF Date: Thu, 4 Mar 2021 17:42:59 +0100 Subject: [PATCH 155/243] rich text contains < and > instead of < and > --- .../xslTransformerFiles/sims2fodt.xsl | 137 +++++++++++------- 1 file changed, 85 insertions(+), 52 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index e26caa4d7..90effd41d 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -436,7 +436,11 @@ - + + + + + @@ -531,58 +535,87 @@ - replace html elements with libreOffice ones + replace html elements with libreOffice ones + , because there is no difference between a tag and < blabla in comment > in the text...]]> + - + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + p + span + list + + + + + + Bold + Italic + L1 + L2 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file From f6817c70028396920a24d54a68588619ac758e58 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 5 Mar 2021 10:09:32 +0100 Subject: [PATCH 156/243] Fix issue to download documents --- .../documents/DocumentsUtils.java | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index eca3cc7d5..e5f9ccd7b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -14,7 +14,9 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; +import javax.ws.rs.core.StreamingOutput; +import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -419,6 +421,7 @@ private void deleteFile(String docUrl) { } private String getDocumentNameFromUrl(String docUrl) { + if (docUrl.contains("\\")) return StringUtils.substringAfterLast(docUrl, "\\"); return StringUtils.substringAfterLast(docUrl, "/"); } @@ -511,28 +514,29 @@ public Document buildDocumentHeadFromJson(JSONObject jsonDoc) { return(doc); } - // - // public Response downloadDocument(String id) throws RmesException { - // JSONObject jsonDoc = getDocument(id); - //======= + /** + * Download a document by id + * @param id + * @return Response containing the file (inputStream) + * @throws RmesException + */ public Response downloadDocumentFile(String id) throws RmesException { JSONObject jsonDoc = getDocument(id, false); - String url = getDocumentUrlFromDocument(jsonDoc); - - Path path = Paths.get(url.replace(SCHEME_FILE, "")); - ContentDisposition content = null; - try (InputStream is = new FileInputStream(path.toFile())) - { - String fileName = getDocumentNameFromUrl(url); - content = ContentDisposition.type("attachment").fileName(fileName).build(); - return Response.ok(is).header("Content-Disposition", content).build(); - - } catch (Exception e) { - logger.error(e.getMessage()); - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Error downloading file"); - } + String fileName = getDocumentNameFromUrl(url); + Path path = Paths.get(url); + ContentDisposition content = ContentDisposition.type("attachment").fileName(fileName).build(); + try { + return Response.ok( (StreamingOutput) output -> { + InputStream input = new FileInputStream( path.toFile() ); + IOUtils.copy(input, output); + output.flush(); + } ).header( "Content-Disposition", content ).build(); + } catch ( Exception e ) { + logger.error(e.getMessage()); + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Error downloading file"); + } } From 9eb875bb09896b346eaa665cca9126a9c0695f4f Mon Sep 17 00:00:00 2001 From: BulotF Date: Fri, 5 Mar 2021 11:22:09 +0100 Subject: [PATCH 157/243] improve comments --- .../xslTransformerFiles/sims2fodt.xsl | 95 ++++++++++--------- 1 file changed, 52 insertions(+), 43 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 90effd41d..5a1351588 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -148,7 +148,7 @@ - elements with @id are used to filter the pattern, depending on parameters or + elements with @id are used to filter the pattern, depending on parameters or mas/isPresentational @@ -239,9 +239,9 @@ Recognize grammar structures : - #if (condition) content #endif - #list(content,'list style') ${dataReference} + #if (${dataReference}) content #endif + #list(${dataReference},'list style') @@ -249,8 +249,8 @@ - - + + @@ -266,6 +266,9 @@ + + + @@ -280,7 +283,7 @@ - + @@ -301,43 +304,40 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + @@ -593,10 +593,18 @@ - - - - + + + + + + + + + + + + @@ -606,6 +614,7 @@ + From 692009517de1d8a498316b6261f98ee84f6af6a5 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 5 Mar 2021 12:34:38 +0100 Subject: [PATCH 158/243] export with QueryParams --- .../webservice/operations/MetadataReportResources.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index d9f603875..d9cde76cc 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -11,6 +11,7 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -304,15 +305,15 @@ public Response getSimsExport(@Parameter( , @Parameter( description = "Inclure les champs vides", - required = false) @PathParam("emptyMas") Boolean includeEmptyMas + required = false) @QueryParam("emptyMas") Boolean includeEmptyMas , @Parameter( description = "Version française", - required = false) @PathParam("lg1") Boolean lg1 + required = false) @QueryParam("lg1") Boolean lg1 , @Parameter( description = "Version anglaise", - required = false) @PathParam("lg2") Boolean lg2 + required = false) @QueryParam("lg2") Boolean lg2 ) throws RmesException { if (includeEmptyMas==null) {includeEmptyMas=true;} if (lg1==null) {lg1=true;} From 269058dd1a6a6f8647f9c386d2167acf76f03a1c Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Fri, 5 Mar 2021 15:59:31 +0100 Subject: [PATCH 159/243] Create HealthcheckApi.java --- .../insee/rmes/webservice/HealthcheckApi.java | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java diff --git a/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java b/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java new file mode 100644 index 000000000..6d6bbfdfd --- /dev/null +++ b/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java @@ -0,0 +1,104 @@ +package fr.insee.rmes.webservice; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.Produces; +import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; + +import org.apache.commons.lang3.StringUtils; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; + +import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryGestion; +import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; +import fr.insee.rmes.config.Config; +import fr.insee.rmes.exceptions.RmesException; +import io.swagger.v3.oas.annotations.responses.ApiResponse; +import io.swagger.v3.oas.annotations.responses.ApiResponses; + +@ApiResponses(value = { + @ApiResponse(responseCode = "200", description = "Opération réussie"), + @ApiResponse(responseCode = "400", description = "La syntaxe de la requête est incorrecte"), + @ApiResponse(responseCode = "401", description = "Une authentification est nécessaire pour accéder à la ressource"), + @ApiResponse(responseCode = "404", description = "Ressource non trouvée"), + @ApiResponse(responseCode = "406", description = "L'en-tête HTTP 'Accept' contient une valeur non acceptée"), + @ApiResponse(responseCode = "500", description = "Erreur interne du serveur") + }) +@Path("/healthcheck") +public class HealthcheckApi { + + String sparlQuery = "SELECT * { ?s a ?t } LIMIT 1"; + + @Autowired + protected RepositoryGestion repoGestion; + + private static final Logger logger = LogManager.getLogger(HealthcheckApi.class); + + @GET + @Produces({ + MediaType.TEXT_PLAIN + }) + public Response getHealthcheck() { + String errorMessage = ""; + String stateResult = "Database connexion \n"; + logger.info("Begin healthCheck"); + + //Test database connexion + try { + if (StringUtils.isEmpty(RepositoryPublication.getResponse(sparlQuery))){ + errorMessage = errorMessage.concat("- Repository publication doesn't return statement \n"); + stateResult = stateResult.concat(" - Connexion publication : KO \n"); + }else { + stateResult = stateResult.concat(" - Connexion publication : OK \n"); + } + if (StringUtils.isEmpty( repoGestion.getResponse(sparlQuery))) { + errorMessage = errorMessage.concat("- Repository gestion doesn't return statement \n"); + stateResult = stateResult.concat(" - Connexion gestion : KO \n"); + }else { + stateResult = stateResult.concat(" - Connexion gestion : OK \n"); + } + } catch (RmesException e) { + errorMessage = errorMessage.concat("- "+e.getMessage()+ " \n"); + stateResult = stateResult.concat(" - Connexion database : KO \n"); + } + + stateResult = stateResult.concat("Document storage \n"); + //Test access to storage + String dirPath = Config.DOCUMENTS_STORAGE + "testHealthcheck.txt"; + File testFile = new File(dirPath); + try { + if (!testFile.createNewFile()) { + errorMessage = errorMessage.concat("- File for healthcheck already exists \n"); + stateResult = stateResult.concat(" - File creation : KO \n"); + }else { + stateResult = stateResult.concat(" - File creation : OK \n"); + } + if (!Files.deleteIfExists(testFile.toPath())) { + errorMessage = errorMessage.concat("- Can't delete test file \n"); + stateResult = stateResult.concat(" - File deletion : KO \n"); + }else { + stateResult = stateResult.concat(" - File deletion : OK \n"); + } + } catch (IOException e) { + errorMessage = errorMessage.concat("- IOException to save file in "+Config.DOCUMENTS_STORAGE+" - "+e.getMessage()+ " \n"); + stateResult = stateResult.concat(" - Document storage : KO \n"); + } + + logger.info(stateResult); + logger.info("End healthcheck"); + + if (!"".equals(errorMessage)) { + logger.error(errorMessage); + return Response.serverError().entity(errorMessage).build(); + } + else { + return Response.ok(stateResult).build(); + } + } +} \ No newline at end of file From a32b7b9b7ad43d9ba55af00c5e85ab1c327f5905 Mon Sep 17 00:00:00 2001 From: BulotF Date: Fri, 5 Mar 2021 16:12:18 +0100 Subject: [PATCH 160/243] exchange simsRubrics and identifiedSims --- .../xslTransformerFiles/sims2fodt.xsl | 97 +++++++++---------- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 5a1351588..33990a889 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -307,37 +307,40 @@ - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - + @@ -432,18 +435,24 @@ - + + + + + + + - + - + @@ -456,7 +465,7 @@ - + @@ -466,9 +475,9 @@ - + - + @@ -493,11 +502,11 @@ + /*[local-name()=$rubric-element]) > 1"> + /*[local-name()=$rubric-element]"> @@ -509,24 +518,14 @@ + /*[local-name()=$rubric-element]"/> - - - - - - - - - - - + TODO From b32fc47e93b599b95bba75e8a8e6a4067a352470 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 10 Mar 2021 11:49:19 +0100 Subject: [PATCH 161/243] Fix issue with lang (en in lg1 /fr in lg2 was a mistake) --- .../documentations/getDocumentationRubricsQuery.ftlh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh b/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh index 424640bf8..9263dc88b 100644 --- a/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh +++ b/src/main/resources/request/operations/documentations/getDocumentationRubricsQuery.ftlh @@ -24,7 +24,7 @@ WHERE { UNION { ?reportAttr ?attr ?textLg1 . ?textLg1 rdf:type dcmitype:Text . - FILTER(EXISTS{?textLg1 dcterms:language <${LG1_CL}>}) + ?textLg1 dcterms:language <${LG1_CL}> OPTIONAL{ ?textLg1 rdf:value ?labelLg1 @@ -34,7 +34,7 @@ WHERE { OPTIONAL { ?reportAttr ?attr ?textLg2 . ?textLg2 rdf:type dcmitype:Text . - FILTER(EXISTS{?textLg2 dcterms:language <${LG2_CL}>}) + ?textLg2 dcterms:language <${LG2_CL}> OPTIONAL{ ?textLg2 rdf:value ?labelLg2 From 1ae60b72154be3524c60c9387c7d11d092b0b4df Mon Sep 17 00:00:00 2001 From: BulotF Date: Wed, 10 Mar 2021 16:46:15 +0100 Subject: [PATCH 162/243] bug with RICH_TEXT call --- .../xslTransformerFiles/sims2fodt.xsl | 67 +++++++++---------- 1 file changed, 32 insertions(+), 35 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 33990a889..a70630021 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -307,40 +307,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + @@ -447,7 +444,7 @@ - + @@ -498,7 +495,7 @@ - + - + From 65e82ef9909537ed80b282d5b1c31a65ac86a8c3 Mon Sep 17 00:00:00 2001 From: BulotF Date: Thu, 11 Mar 2021 09:50:52 +0100 Subject: [PATCH 163/243] update Label pattern --- .../xslTransformerFiles/labelPattern.odt | Bin 16416 -> 16615 bytes .../labelPatternContent.xml | 18 +++++++++--------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/labelPattern.odt b/src/main/resources/xslTransformerFiles/labelPattern.odt index 2e5eef2f50eaa77e9e1db8420476e1645193f7a6..15eee58a877caf15cc4b5cae8e0be4b2e358dd11 100644 GIT binary patch delta 4259 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 delta 4005 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 d’opportunité du Cnis Numéro de visa : - ${identifiedSims/I.6.3/labelLg1} + ${identifiedSims/I.6.4/labelLg1} Règlement européenAccès aux micro-données : ${identifiedSims/S.10.4/labelLg1} Période de collecte : - ${identifiedSims/I.18.1/labelLg1} + ${identifiedSims/I.18.7/labelLg1} Exploitation et diffusion des résultatsBilan d’exécution de l’enquête précédente et des résultats produits Faits marquants : - ${identifiedSims/C.3.1/labelLg1} + ${identifiedSims/C.3.10/labelLg1} Bilan de la mise en œuvre des recommandations du Comité du labelErreur de couverture : ${identifiedSims/S.13.3.1/labelLg1} Unités enquêtées : - ${identifiedSims/I.18.3/labelLg1} + ${identifiedSims/I.18.9/labelLg1} Paramètres d’intérêt de l’enquêteDescription du sondage Plan de sondage - ${identifiedSims/I.18.4/labelLg1} + ${identifiedSims/I.18.10/labelLg1} Taille de l’échantillon - ${identifiedSims/I.18.5/labelLg1} + ${identifiedSims/I.18.11/labelLg1} Collecte des données ${identifiedSims/S.18.3/labelLg1} Mode de collecte - ${identifiedSims/I.18.2/labelLg1} + ${identifiedSims/I.18.8/labelLg1} Sécurité des données et protection du secret statistiqueLettres-avis définitives, notices ou plaquettes d’informations Documents de collecte - ${identifiedSims/I.18.6/labelLg1} + ${identifiedSims/I.18.12/labelLg1} Questionnaire @@ -466,7 +466,7 @@ text:name="__RefHeading___Toc8979_1782290185"/>Questionnaire définitif Documents de collecte - ${identifiedSims/I.18.6/labelLg1} + ${identifiedSims/I.18.12/labelLg1} Coût des enquêtes From e040c7d662078711c639a253f36787ab51dc1cf0 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 11 Mar 2021 09:56:46 +0100 Subject: [PATCH 164/243] feat: add range when fetching mutualized components --- .../request/structures/getMutualizedComponents.ftlh | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/main/resources/request/structures/getMutualizedComponents.ftlh b/src/main/resources/request/structures/getMutualizedComponents.ftlh index 61a01cc08..1921667d5 100644 --- a/src/main/resources/request/structures/getMutualizedComponents.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponents.ftlh @@ -1,4 +1,4 @@ -SELECT DISTINCT ?id ?identifiant ?labelLg1 ?concept ?type ?codeList ?validationState ?creator +SELECT DISTINCT ?id ?identifiant ?labelLg1 ?concept ?type ?codeList ?validationState ?creator ?range FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { ?component dcterms:identifier ?id ; @@ -25,6 +25,10 @@ WHERE { ?component qb:concept ?conceptObject } . + OPTIONAL { + ?component rdfs:range ?range + } . + BIND(STRAFTER(STR(?conceptObject),'/concepts/definition/') AS ?concept) . } From 7f6ba20bde610d752ada2596c4d3c08881c37290 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 11 Mar 2021 09:57:13 +0100 Subject: [PATCH 165/243] feat: add controls when publishing a structure --- .../bauhaus_services/structures/utils/StructureUtils.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 23380f6a5..77e284566 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -369,6 +369,14 @@ public void deleteStructure(String structureId) throws RmesException { } public String publishStructure(JSONObject structure) throws RmesException { + if(structure.isNull("creator") || "".equals(structure.getString("creator"))){ + throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_EMPTY_CREATOR, "The creator should not be empty", new JSONArray()); + } + + if(structure.isNull("disseminationStatus") || "".equals(structure.getString("disseminationStatus"))){ + throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_EMPTY_STATUS, "The dissemination status should not be empty", new JSONArray()); + } + String id = structure.getString("id"); JSONArray ids = repoGestion.getResponseAsArray(StructureQueries.getUnValidatedComponent(id)); for (int i = 0; i < ids.length(); i++) { From c5b5f840136a25cfcf0e3518b63b48f78969246d Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 11 Mar 2021 14:17:48 +0100 Subject: [PATCH 166/243] Change pathParam to QueryParam --- .../webservice/operations/MetadataReportResources.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index d9f603875..fb775eb18 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -11,6 +11,7 @@ import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; +import javax.ws.rs.QueryParam; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; @@ -136,7 +137,7 @@ public Response getMetadataReportDefaultValue() throws IOException { @Path("/metadataReport/fullSims/{id}") @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) @io.swagger.v3.oas.annotations.Operation(operationId = "getFullSims", summary = "Full sims for an id", - responses = { @ApiResponse(content = @Content(/*mediaType = "application/json" ,*/ schema = @Schema(implementation = Documentation.class) + responses = { @ApiResponse(content = @Content(schema = @Schema(implementation = Documentation.class) ))}) public Response getFullSims( @Parameter( @@ -304,15 +305,15 @@ public Response getSimsExport(@Parameter( , @Parameter( description = "Inclure les champs vides", - required = false) @PathParam("emptyMas") Boolean includeEmptyMas + required = false) @QueryParam("emptyMas") Boolean includeEmptyMas , @Parameter( description = "Version française", - required = false) @PathParam("lg1") Boolean lg1 + required = false) @QueryParam("lg1") Boolean lg1 , @Parameter( description = "Version anglaise", - required = false) @PathParam("lg2") Boolean lg2 + required = false) @QueryParam("lg2") Boolean lg2 ) throws RmesException { if (includeEmptyMas==null) {includeEmptyMas=true;} if (lg1==null) {lg1=true;} From 69fb65e25097fae80c1d1e618b66bc3861507a1b Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 15 Mar 2021 09:41:45 +0100 Subject: [PATCH 167/243] Add log to show if envproperties are read --- .../insee/rmes/config/ApplicationContext.java | 3 +++ .../java/fr/insee/rmes/config/Config.java | 21 ++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/config/ApplicationContext.java b/src/main/java/fr/insee/rmes/config/ApplicationContext.java index 285554c5e..1b1988c50 100644 --- a/src/main/java/fr/insee/rmes/config/ApplicationContext.java +++ b/src/main/java/fr/insee/rmes/config/ApplicationContext.java @@ -32,6 +32,8 @@ public class ApplicationContext { @Autowired Environment env; + + @Bean public HttpClientBuilder httpClientBuilder() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { @@ -50,6 +52,7 @@ public RestTemplate restTemplate() throws KeyManagementException, KeyStoreExcept @PostConstruct public void setUp() { Config.setConfig(env); + Config.printMajorConfig(); } diff --git a/src/main/java/fr/insee/rmes/config/Config.java b/src/main/java/fr/insee/rmes/config/Config.java index 16f0467af..a9a332121 100644 --- a/src/main/java/fr/insee/rmes/config/Config.java +++ b/src/main/java/fr/insee/rmes/config/Config.java @@ -1,10 +1,13 @@ package fr.insee.rmes.config; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.springframework.core.env.Environment; public class Config { - + private static final Logger logger = LogManager.getLogger(ApplicationContext.class); + public static String APP_HOST = ""; public static String ENV = ""; @@ -227,4 +230,20 @@ private static void readConfigForStructures(Environment env) { Config.STRUCTURES_COMPONENTS_GRAPH = BASE_GRAPH + env.getProperty("fr.insee.rmes.bauhaus.structures.components.graph"); Config.STRUCTURES_COMPONENTS_BASE_URI = env.getProperty("fr.insee.rmes.bauhaus.structures.components.baseURI"); } + + public static void printMajorConfig() { + logger.info("*********************** CONFIG USED ***********************************"); + + logger.info("ENV : {}", ENV); + logger.info("SERVEUR GESTION : {} _ REPO : {} _ BASEURI : {}",SESAME_SERVER_GESTION,REPOSITORY_ID_GESTION, BASE_URI_GESTION); + logger.info("SERVEUR PUBLICATION : {} _ REPO : {} _ BASEURI : {}",SESAME_SERVER_PUBLICATION, REPOSITORY_ID_PUBLICATION, BASE_URI_PUBLICATION); + logger.info("SERVEUR PUB INTERNE : {} _ REPO : {}",SESAME_SERVER_PUBLICATION_INTERNE,REPOSITORY_ID_PUBLICATION_INTERNE); + + logger.info("DOCUMENT STORAGE : {}", DOCUMENTS_STORAGE); + + logger.info("*********************** END CONFIG USED ***********************************"); + + + } + } \ No newline at end of file From d5056eeaa82a70ededaad12fe5ac42d347e34803 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 15 Mar 2021 10:11:00 +0100 Subject: [PATCH 168/243] Try to improve properties reading Properties are not read in dv env --- .../java/fr/insee/rmes/config/ApplicationContext.java | 10 +++++++--- src/main/java/fr/insee/rmes/config/Config.java | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/config/ApplicationContext.java b/src/main/java/fr/insee/rmes/config/ApplicationContext.java index 1b1988c50..988b1ebfb 100644 --- a/src/main/java/fr/insee/rmes/config/ApplicationContext.java +++ b/src/main/java/fr/insee/rmes/config/ApplicationContext.java @@ -18,15 +18,19 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; +import org.springframework.context.annotation.PropertySources; import org.springframework.core.env.Environment; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; import org.springframework.web.client.RestTemplate; @Configuration("AppContext") -@PropertySource(value = { "classpath:bauhaus-core.properties", "classpath:bauhaus-dev.properties", - "file:${catalina.base}/webapps/bauhaus-dev.properties", "file:${catalina.base}/webapps/bauhaus-qf.properties","file:${catalina.base}/webapps/bauhaus-production.properties", - "file:${catalina.base}/webapps/production.properties", }, ignoreResourceNotFound = true) +@PropertySource(value = "classpath:bauhaus-core.properties") +@PropertySource(value = "classpath:bauhaus-dev.properties") +@PropertySource(value = "file:${catalina.base}/webapps/bauhaus-dev.properties", ignoreResourceNotFound = true) +@PropertySource(value = "file:${catalina.base}/webapps/bauhaus-qf.properties", ignoreResourceNotFound = true) +@PropertySource(value = "file:${catalina.base}/webapps/bauhaus-production.properties", ignoreResourceNotFound = true) +@PropertySource(value = "file:${catalina.base}/webapps/production.properties", ignoreResourceNotFound = true) public class ApplicationContext { @Autowired diff --git a/src/main/java/fr/insee/rmes/config/Config.java b/src/main/java/fr/insee/rmes/config/Config.java index a9a332121..b41c6a7c1 100644 --- a/src/main/java/fr/insee/rmes/config/Config.java +++ b/src/main/java/fr/insee/rmes/config/Config.java @@ -6,7 +6,7 @@ public class Config { - private static final Logger logger = LogManager.getLogger(ApplicationContext.class); + private static final Logger logger = LogManager.getLogger(Config.class); public static String APP_HOST = ""; From 44abd96554d345a297da079b99082b59b85a66bb Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 15 Mar 2021 11:39:19 +0100 Subject: [PATCH 169/243] Try to have log... --- .../insee/rmes/config/ApplicationContext.java | 1 - .../config/Log4j2ServletContextListener.java | 28 +++++++++++-------- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/src/main/java/fr/insee/rmes/config/ApplicationContext.java b/src/main/java/fr/insee/rmes/config/ApplicationContext.java index 988b1ebfb..26fa2fec1 100644 --- a/src/main/java/fr/insee/rmes/config/ApplicationContext.java +++ b/src/main/java/fr/insee/rmes/config/ApplicationContext.java @@ -18,7 +18,6 @@ import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.PropertySource; -import org.springframework.context.annotation.PropertySources; import org.springframework.core.env.Environment; import org.springframework.http.client.ClientHttpRequestFactory; import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; diff --git a/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java b/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java index 71e25c013..e00c961e9 100644 --- a/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java +++ b/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java @@ -55,20 +55,26 @@ private void getEnvironmentProperties() throws IOException { private Properties getProperties() throws IOException { Properties props = new Properties(); props.load(getClass().getClassLoader().getResourceAsStream("bauhaus-dev.properties")); - loadPropertiesIfExist(props, "bauhaus-dev.properties"); - loadPropertiesIfExist(props, "bauhaus-qf.properties"); - loadPropertiesIfExist(props, "bauhaus-production.properties"); - loadPropertiesIfExist(props, "production.properties"); + props = this.loadIfExists(props, "bauhaus-dev.properties"); + props = this.loadIfExists(props, "bauhaus-qf.properties"); + props = this.loadIfExists(props, "bauhaus-production.properties"); + props = this.loadIfExists(props, "production.properties"); return props; } - private void loadPropertiesIfExist(Properties props, String fileName) throws IOException{ - File f = new File(String.format(WEBAPPS, System.getProperty(CATALINA_BASE), fileName)); - if(f.exists() && !f.isDirectory()) { - FileReader r = new FileReader(f); - props.load(r); - r.close(); - } + /* + * load properties on catalina base + */ + private Properties loadIfExists(Properties props, String filename) throws IOException { + File f = new File(String.format(WEBAPPS, System.getProperty(CATALINA_BASE), filename)); + if (f.exists() && !f.isDirectory()) { + try (FileReader r = new FileReader(f);){ + props.load(r); + return props; + } + } + return props; } + } From 2f64832ebd4df64f8676629e03718972a754541f Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 15 Mar 2021 12:44:22 +0100 Subject: [PATCH 170/243] prepare label export --- .../bauhaus_services/OperationsService.java | 3 ++ .../operations/MetadataReportResources.java | 36 +++++++++++++++++++ 2 files changed, 39 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index a7d8c95ff..5731e6e09 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -145,6 +145,8 @@ public interface OperationsService { Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException; + Response exportMetadataReportForLabel(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException; + Response exportTestMetadataReport() throws RmesException; String getMetadataReportOwner(String id) throws RmesException; @@ -155,4 +157,5 @@ public interface OperationsService { Status deleteMetadataReport(String id) throws RmesException; + } diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index d9cde76cc..ee68685e7 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -321,6 +321,42 @@ public Response getSimsExport(@Parameter( return operationsService.exportMetadataReport(id,includeEmptyMas,lg1,lg2); } + /** + * EXPORTFORLABEL + * @param id + * @param lg2 + * @param includeEmptyMas + * @return response + */ + + @GET + @Path("/metadataReport/export/label/{id}/{emptyMas}/{lg1}/{lg2}") + @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") + public Response getSimsLabelExport(@Parameter( + description = "Identifiant de la documentation (format : [0-9]{4})", + required = true, + schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id + , + @Parameter( + description = "Inclure les champs vides", + required = false) @QueryParam("emptyMas") Boolean includeEmptyMas + , + @Parameter( + description = "Version française", + required = false) @QueryParam("lg1") Boolean lg1 + , + @Parameter( + description = "Version anglaise", + required = false) @QueryParam("lg2") Boolean lg2 + ) throws RmesException { + if (includeEmptyMas==null) {includeEmptyMas=true;} + if (lg1==null) {lg1=true;} + if (lg2==null) {lg2=true;} + return operationsService.exportMetadataReportForLabel(id,includeEmptyMas,lg1,lg2); + } + + @GET @Path("/metadataReport/testExport") @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) From f73ec0cdb97a15d3b8db017f657a6470c0d24ae8 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 15 Mar 2021 13:31:19 +0100 Subject: [PATCH 171/243] fix: when publishing a structure, we should also publish the component specification. --- .../structures/utils/StructurePublication.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java index 2cebc1362..8899fb323 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java @@ -35,6 +35,13 @@ public void publish(Resource structure) throws RmesException { if (pred.endsWith("validationState")) { // nothing, wouldn't copy this attr + } if(pred.endsWith("component")){ + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), + st.getPredicate(), + PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), + st.getContext()); + + publish((Resource) st.getObject()); } else { model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), From 41c215a6bc28f287ad4ba86087334c728e82bc1a Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 15 Mar 2021 15:31:39 +0100 Subject: [PATCH 172/243] feat: rename identifiant to skos.notation --- .../structures/utils/StructureComponentUtils.java | 7 ++----- .../bauhaus_services/structures/utils/StructureUtils.java | 7 ++----- .../request/structures/getComponentsForAStructure.ftlh | 2 +- .../request/structures/getMutualizedComponent.ftlh | 2 +- .../request/structures/getMutualizedComponents.ftlh | 2 +- src/main/resources/request/structures/getStructure.ftlh | 2 +- 6 files changed, 8 insertions(+), 14 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 3e4977fcd..4c215d2ac 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -14,10 +14,7 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.model.impl.SimpleIRI; -import org.eclipse.rdf4j.model.vocabulary.DC; -import org.eclipse.rdf4j.model.vocabulary.DCTERMS; -import org.eclipse.rdf4j.model.vocabulary.RDF; -import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.model.vocabulary.*; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; @@ -167,7 +164,7 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou model.add(componentURI, RDFS.LABEL, RdfUtils.setLiteralString(component.getLabelLg1(), Config.LG1), graph); model.add(componentURI, RDFS.LABEL, RdfUtils.setLiteralString(component.getLabelLg2(), Config.LG2), graph); - model.add(componentURI, INSEE.IDENTIFIANT_METIER, RdfUtils.setLiteralString(component.getIdentifiant()), graph); + model.add(componentURI, SKOS.NOTATION, RdfUtils.setLiteralString(component.getIdentifiant()), graph); model.add(componentURI, INSEE.VALIDATION_STATE, RdfUtils.setLiteralString(status), graph); model.add(componentURI, DCTERMS.CREATED, RdfUtils.setLiteralDateTime(component.getCreated()), graph); model.add(componentURI, DCTERMS.MODIFIED, RdfUtils.setLiteralDateTime(component.getUpdated()), graph); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 77e284566..c5158cda4 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -16,10 +16,7 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.model.impl.SimpleIRI; -import org.eclipse.rdf4j.model.vocabulary.DC; -import org.eclipse.rdf4j.model.vocabulary.DCTERMS; -import org.eclipse.rdf4j.model.vocabulary.RDF; -import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.model.vocabulary.*; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; @@ -236,7 +233,7 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru model.add(structureIri, RDF.TYPE, QB.DATA_STRUCTURE_DEFINITION, graph); /*Required*/ model.add(structureIri, DCTERMS.IDENTIFIER, RdfUtils.setLiteralString(structureId), graph); - model.add(structureIri, INSEE.IDENTIFIANT_METIER, RdfUtils.setLiteralString(structure.getIdentifiant()), graph); + model.add(structureIri, SKOS.NOTATION, RdfUtils.setLiteralString(structure.getIdentifiant()), graph); model.add(structureIri, RDFS.LABEL, RdfUtils.setLiteralString(structure.getLabelLg1(), Config.LG1), graph); model.add(structureIri, INSEE.VALIDATION_STATE, RdfUtils.setLiteralString(status.toString()), graph); diff --git a/src/main/resources/request/structures/getComponentsForAStructure.ftlh b/src/main/resources/request/structures/getComponentsForAStructure.ftlh index a69514764..e8ae832f3 100644 --- a/src/main/resources/request/structures/getComponentsForAStructure.ftlh +++ b/src/main/resources/request/structures/getComponentsForAStructure.ftlh @@ -23,7 +23,7 @@ WHERE { OPTIONAL { - ?component insee:identifiantMetier ?identifiant . + ?component skos:notation ?identifiant . } . OPTIONAL { diff --git a/src/main/resources/request/structures/getMutualizedComponent.ftlh b/src/main/resources/request/structures/getMutualizedComponent.ftlh index da51f42fe..e36771f03 100644 --- a/src/main/resources/request/structures/getMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponent.ftlh @@ -2,7 +2,7 @@ SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?type ?concept ?codeList ?r FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { ?component dcterms:identifier '${ID}' ; - insee:identifiantMetier ?identifiant ; + skos:notation ?identifiant ; rdf:type ?type ; rdfs:label ?labelLg1 . diff --git a/src/main/resources/request/structures/getMutualizedComponents.ftlh b/src/main/resources/request/structures/getMutualizedComponents.ftlh index 1921667d5..a50b3f1c2 100644 --- a/src/main/resources/request/structures/getMutualizedComponents.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponents.ftlh @@ -2,7 +2,7 @@ SELECT DISTINCT ?id ?identifiant ?labelLg1 ?concept ?type ?codeList ?validationS FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { ?component dcterms:identifier ?id ; - insee:identifiantMetier ?identifiant ; + skos:notation ?identifiant ; rdf:type ?type ; rdfs:label ?labelLg1 . diff --git a/src/main/resources/request/structures/getStructure.ftlh b/src/main/resources/request/structures/getStructure.ftlh index e5f7e748c..7418f3f40 100644 --- a/src/main/resources/request/structures/getStructure.ftlh +++ b/src/main/resources/request/structures/getStructure.ftlh @@ -2,7 +2,7 @@ SELECT DISTINCT ?id ?identifiant ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptio FROM <${STRUCTURES_GRAPH}> WHERE { ?structure dcterms:identifier "${ID}" ; - insee:identifiantMetier ?identifiant ; + skos:notation ?identifiant ; rdfs:label ?labelLg1 ; rdfs:label ?labelLg2 . FILTER (lang(?labelLg1) = '${LG1}') From 0a5c4832e8d86ba8fc4c92c209363ce19f18ce4b Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 15 Mar 2021 15:58:28 +0100 Subject: [PATCH 173/243] Add closeMatch to GET and SET concept --- .../bauhaus_services/links/LinksUtils.java | 8 +++ .../fr/insee/rmes/model/concepts/Concept.java | 1 - .../java/fr/insee/rmes/model/links/Link.java | 5 ++ .../concepts/ConceptsQueries.java | 39 +++------------ .../request/concepts/getConceptLinksById.ftlh | 49 +++++++++++++++++++ 5 files changed, 68 insertions(+), 34 deletions(-) create mode 100644 src/main/resources/request/concepts/getConceptLinksById.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/links/LinksUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/links/LinksUtils.java index e96a5ca4e..43b75c719 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/links/LinksUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/links/LinksUtils.java @@ -34,10 +34,18 @@ else if (link.getTypeOfLink().equals("succeed")) { else if (link.getTypeOfLink().equals("related")) { addTripleRelated(conceptURI, link.getIds(), model); } + else if (link.getTypeOfLink().equals("closeMatch")){ + addTripleCloseMatch(conceptURI, link.getUrn(), model); + } + }); } + private void addTripleCloseMatch(IRI conceptURI, List urn, Model model) { + urn.forEach(urnToAdd -> model.add(conceptURI, SKOS.CLOSE_MATCH, RdfUtils.toURI(urnToAdd), RdfUtils.conceptGraph())); + } + private void addTripleBroader(IRI conceptURI, List conceptsIDToLink, Model model) { conceptsIDToLink.forEach(conceptIDToLink -> { model.add(conceptURI, SKOS.NARROWER, RdfUtils.conceptIRI(conceptIDToLink), RdfUtils.conceptGraph()); diff --git a/src/main/java/fr/insee/rmes/model/concepts/Concept.java b/src/main/java/fr/insee/rmes/model/concepts/Concept.java index d8be742b6..ac0566902 100644 --- a/src/main/java/fr/insee/rmes/model/concepts/Concept.java +++ b/src/main/java/fr/insee/rmes/model/concepts/Concept.java @@ -41,7 +41,6 @@ public Concept(String id, boolean isNew) { this.versioning = false; }else { this.creation = false; - } } diff --git a/src/main/java/fr/insee/rmes/model/links/Link.java b/src/main/java/fr/insee/rmes/model/links/Link.java index e45986f8a..30ec2e3e8 100644 --- a/src/main/java/fr/insee/rmes/model/links/Link.java +++ b/src/main/java/fr/insee/rmes/model/links/Link.java @@ -6,6 +6,7 @@ public class Link { private String typeOfLink; private List ids; + private List urn; public Link() { //nothing to do @@ -18,4 +19,8 @@ public List getIds() { return ids; } + public List getUrn() { + return urn; + } + } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java index 1f5c44ffa..d86fee600 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/concepts/ConceptsQueries.java @@ -189,41 +189,14 @@ public static String conceptNotesQuery(String id, int conceptVersion) { + "}} \n"; } - public static String conceptLinks(String id) { - return "SELECT ?id ?typeOfLink ?prefLabelLg1 ?prefLabelLg2 \n" - + "WHERE { GRAPH <"+Config.CONCEPTS_GRAPH+"> { \n" - - + "?concept rdf:type skos:Concept . \n" - + "FILTER(REGEX(STR(?concept),'/concepts/definition/" + id + "')) . \n" - - //TODO Note for later : why "?concept skos:notation '" + id + "' . \n" doesn't work anymore => RDF4J add a type and our triplestore doesn't manage it. - - + "{?concept skos:narrower ?conceptlinked . \n" - + "BIND('narrower' AS ?typeOfLink)} \n" - + "UNION" - + "{?concept skos:broader ?conceptlinked . \n" - + "BIND('broader' AS ?typeOfLink)} \n" - + "UNION" - + "{?concept dcterms:references ?conceptlinked . \n" - + "BIND('references' AS ?typeOfLink)} \n" - + "UNION" - + "{?concept dcterms:replaces ?conceptlinked . \n" - + "BIND('succeed' AS ?typeOfLink)} \n" - + "UNION" - + "{?concept skos:related ?conceptlinked . \n" - + "BIND('related' AS ?typeOfLink)} \n" - - + "?conceptlinked skos:prefLabel ?prefLabelLg1 . \n" - + "FILTER (lang(?prefLabelLg1) = '" + Config.LG1 + "') . \n" - + "OPTIONAL {?conceptlinked skos:prefLabel ?prefLabelLg2 . \n" - + "FILTER (lang(?prefLabelLg2) = '" + Config.LG2 + "')} . \n" - + "BIND(STRAFTER(STR(?conceptlinked),'/definition/') AS ?id) . \n" - + "}} \n" - + "ORDER BY ?typeOfLink"; + public static String conceptLinks(String idConcept) throws RmesException { + if (params==null) {initParams();} + params.put("ID_CONCEPT", idConcept); + params.put("CONCEPTS_GRAPH", Config.CONCEPTS_GRAPH); + return buildConceptRequest("getConceptLinksById.ftlh", params); + //TODO Note for later : why "?concept skos:notation '" + id + "' . \n" doesn't work anymore => RDF4J add a type and our triplestore doesn't manage it. } - - public static String getNarrowers(String id) { return "SELECT ?narrowerId { \n" //+ "?concept skos:notation '" + id + "' . \n" diff --git a/src/main/resources/request/concepts/getConceptLinksById.ftlh b/src/main/resources/request/concepts/getConceptLinksById.ftlh new file mode 100644 index 000000000..ff148786e --- /dev/null +++ b/src/main/resources/request/concepts/getConceptLinksById.ftlh @@ -0,0 +1,49 @@ +SELECT ?id ?typeOfLink ?prefLabelLg1 ?prefLabelLg2 ?urn +WHERE { + GRAPH <${CONCEPTS_GRAPH} > { + + ?concept rdf:type skos:Concept . + FILTER(REGEX(STR(?concept),'/concepts/definition/${ID_CONCEPT}')) . + + { + ?concept skos:narrower ?conceptlinked . + BIND('narrower' AS ?typeOfLink) + } + UNION + { + ?concept skos:broader ?conceptlinked . + BIND('broader' AS ?typeOfLink) + } + UNION + { + ?concept dcterms:references ?conceptlinked . + BIND('references' AS ?typeOfLink) + } + UNION + { + ?concept dcterms:replaces ?conceptlinked . + BIND('succeed' AS ?typeOfLink) + } + UNION + { + ?concept skos:related ?conceptlinked . + BIND('related' AS ?typeOfLink) + } + UNION + { + ?concept skos:closeMatch ?urn . + BIND('closeMatch' AS ?typeOfLink) + } + + OPTIONAL{ + ?conceptlinked skos:prefLabel ?prefLabelLg1 . + FILTER (lang(?prefLabelLg1) = '${LG1}') + } . + OPTIONAL { + ?conceptlinked skos:prefLabel ?prefLabelLg2 . + FILTER (lang(?prefLabelLg2) = '${LG2}') + } . + BIND(STRAFTER(STR(?conceptlinked),'/definition/') AS ?id) . + } +} +ORDER BY ?typeOfLink \ No newline at end of file From eed2acaa2a6895c5bb009dd17a2bef931501cb4b Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 16 Mar 2021 11:13:09 +0100 Subject: [PATCH 174/243] Add error message for RepresentedVariable without name --- .../operations/VarBookExportBuilder.java | 15 +++++++++++++-- .../operations/OperationsResources.java | 8 +++++++- 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/VarBookExportBuilder.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/VarBookExportBuilder.java index fd9d66a87..b50201a26 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/VarBookExportBuilder.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/operations/VarBookExportBuilder.java @@ -26,6 +26,7 @@ import org.xml.sax.SAXException; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.exceptions.RmesNotAcceptableException; import fr.insee.rmes.utils.DocumentBuilders; import fr.insee.rmes.utils.StringUtils; import fr.insee.rmes.utils.XMLUtils; @@ -150,9 +151,10 @@ private static void removeNamespaces(Node node, Document document) { * * @param xml * @return + * @throws RmesNotAcceptableException * @throws RmesException */ - private static Document addSortedVariableList(Document xmlInput) { + private static Document addSortedVariableList(Document xmlInput) throws RmesNotAcceptableException { if (xmlInput == null) { return null; } @@ -163,10 +165,19 @@ private static Document addSortedVariableList(Document xmlInput) { // copy all variables NodeList list = xmlInput.getElementsByTagName("RepresentedVariable"); Map sortedList = new TreeMap<>(); + String lastVarOk = ""; for (int i = 0; i < list.getLength(); i++) { Node variableNode = list.item(i); - sortedList.put(getVariableName(variableNode), variableNode); + if (variableNode == null) throw new RmesNotAcceptableException("One represented variable is null. Last variable ok is "+lastVarOk, ""); + String variableName ; + try { + variableName = getVariableName(variableNode); + }catch(NullPointerException e) { + throw new RmesNotAcceptableException("One represented variable has no RepresentedVariableName. Last variable ok is "+lastVarOk, ""); + } + sortedList.put(variableName, variableNode); + lastVarOk = variableName; } for (Entry entry : sortedList.entrySet()) { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java index 62e437032..76d5d3ea1 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java @@ -97,7 +97,13 @@ public Response getCodeBook( @HeaderParam("Accept") String acceptHeader, @FormDataParam(value = "dicoVar") InputStream isCodeBook) throws IOException, RmesException { String ddi = IOUtils.toString(isDDI, StandardCharsets.UTF_8); File codeBookFile = fr.insee.rmes.utils.FileUtils.streamToFile(isCodeBook, "dicoVar",".odt"); - return operationsService.getCodeBookExport(ddi,codeBookFile, acceptHeader); + Response response; + try { + response = operationsService.getCodeBookExport(ddi,codeBookFile, acceptHeader); + } catch (RmesException e) { + return returnRmesException(e); + } + return response; } /** From a8772409ad7e14d5ba5e830f904fd7d2890bdd32 Mon Sep 17 00:00:00 2001 From: Fabrice Bibonne Date: Wed, 17 Mar 2021 11:23:56 +0100 Subject: [PATCH 175/243] ignore itellij files --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 48c1bfaf8..f1d5f99f3 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ node_modules .project .idea graphdb +*.iml From 889990476a2bbde1aa6f3007b1e41b8dd20488d2 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 18 Mar 2021 21:04:13 +0100 Subject: [PATCH 176/243] feat: get all structures for Melodi --- .../ConsultationGestionService.java | 2 ++ .../ConsultationGestionServiceImpl.java | 23 +++++++++++++++++++ .../rmes/webservice/ConsultationGestion.java | 13 +++++++++++ .../consultation-gestion/getStructures.ftlh | 9 ++++++++ 4 files changed, 47 insertions(+) create mode 100644 src/main/resources/request/consultation-gestion/getStructures.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java index 99f712d30..5abb66021 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java @@ -6,4 +6,6 @@ public interface ConsultationGestionService { String getDetailedConcept(String id) throws RmesException; String getAllConcepts() throws RmesException; + + String getAllStructures() throws RmesException; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java index 1c87e1d64..c550e35ca 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java @@ -54,6 +54,29 @@ public String getAllConcepts() throws RmesException { return repoGestion.getResponseAsArray(buildRequest("getAllConcepts.ftlh", params)).toString(); } + @Override + public String getAllStructures() throws RmesException { + HashMap params = new HashMap<>(); + params.put("STRUCTURES_GRAPH", Config.STRUCTURES_GRAPH); + JSONArray structures = repoGestion.getResponseAsArray(buildRequest("getStructures.ftlh", params)); + + for (int i = 0; i < structures.length(); i++) { + JSONObject structure = structures.getJSONObject(i); + String validationState = structure.getString("validationState"); + if("Validated".equalsIgnoreCase(validationState)){ + structure.put("validationState", "Publiée"); + } + if("Modified".equalsIgnoreCase(validationState)){ + structure.put("validationState", "Provisoire, déjà publiée"); + } + if("Unpublished".equalsIgnoreCase(validationState)){ + structure.put("validationState", "Provisoire, jamais publiée"); + } + } + + return structures.toString(); + } + private static String buildRequest(String fileName, HashMap params) throws RmesException { return FreeMarkerUtils.buildRequest("consultation-gestion/", fileName, params); } diff --git a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java index 6d77aa061..f815a7111 100644 --- a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java +++ b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java @@ -66,5 +66,18 @@ public Response getAllConcepts() { return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + @GET() + @Path("/structures") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "getAllStructures", summary = "Get all structures") + public Response getAllStructures() { + String jsonResultat; + try { + jsonResultat = consultationGestionService.getAllStructures(); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } } diff --git a/src/main/resources/request/consultation-gestion/getStructures.ftlh b/src/main/resources/request/consultation-gestion/getStructures.ftlh new file mode 100644 index 000000000..8c4b7f9cd --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getStructures.ftlh @@ -0,0 +1,9 @@ +SELECT DISTINCT ?id ?modified ?validationState +FROM <${STRUCTURES_GRAPH}> +WHERE { + ?structure rdf:type qb:DataStructureDefinition . + ?structure dcterms:identifier ?id . + ?structure dcterms:modified ?modified . + ?structure insee:validationState ?validationState . +} + From e1f9ae5c797af7bae8a9a28f9977474b530012e0 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Thu, 18 Mar 2021 21:12:14 +0100 Subject: [PATCH 177/243] feat: rewrite URI when publishing a structure --- .../structures/utils/StructurePublication.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java index 8899fb323..692509804 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java @@ -42,6 +42,11 @@ public void publish(Resource structure) throws RmesException { st.getContext()); publish((Resource) st.getObject()); + } else if(pred.endsWith("attribute") || pred.endsWith("measure") || pred.endsWith("dimension")){ + model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), + st.getPredicate(), + PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), + st.getContext()); } else { model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), From 12d1c6fb063032a629b9ca4d28615256bc931f76 Mon Sep 17 00:00:00 2001 From: BulotF Date: Fri, 19 Mar 2021 18:30:06 +0100 Subject: [PATCH 178/243] documents and links in RICH_TEXT exports --- .../xslTransformerFiles/sims2fodt.xsl | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index a70630021..3c7e83e23 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -222,6 +222,7 @@ + @@ -377,6 +378,7 @@ + @@ -447,6 +449,105 @@ + + + + + + Lien : + + + Link: + + + Liens : + + + Links: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Document : + + + Document: + + + Documents : + + + Document: + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ec0cf8aac293794bb6cf09d4211cede913550f95 Mon Sep 17 00:00:00 2001 From: BulotF Date: Fri, 19 Mar 2021 18:36:33 +0100 Subject: [PATCH 179/243] wrong test to identify links and documents --- src/main/resources/xslTransformerFiles/sims2fodt.xsl | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 3c7e83e23..382b89085 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -449,8 +449,8 @@ - - + + @@ -466,7 +466,7 @@ Links: - + @@ -516,7 +516,7 @@ Document: - + From 36bffd71b67a538513b1504d3ca87aae2829cb22 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 19 Mar 2021 20:12:07 +0100 Subject: [PATCH 180/243] feat: add get all codes list api for Melodi --- .../ConsultationGestionService.java | 2 ++ .../ConsultationGestionServiceImpl.java | 17 +++++++++++++++++ .../rmes/webservice/ConsultationGestion.java | 14 ++++++++++++++ .../consultation-gestion/getAllCodesLists.ftlh | 9 +++++++++ 4 files changed, 42 insertions(+) create mode 100644 src/main/resources/request/consultation-gestion/getAllCodesLists.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java index 5abb66021..0982b539b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java @@ -8,4 +8,6 @@ public interface ConsultationGestionService { String getAllConcepts() throws RmesException; String getAllStructures() throws RmesException; + + String getAllCodesLists() throws RmesException; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java index c550e35ca..f0b5094d8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java @@ -77,6 +77,23 @@ public String getAllStructures() throws RmesException { return structures.toString(); } + @Override + public String getAllCodesLists() throws RmesException { + String defaultDate = "2020-01-01T00:00:00.000"; + + HashMap params = new HashMap<>(); + params.put("CODELIST_GRAPH", Config.CODELIST_GRAPH); + + JSONArray codesLists = repoGestion.getResponseAsArray(buildRequest("getAllCodesLists.ftlh", params)); + for (int i = 0; i < codesLists.length(); i++) { + JSONObject codesList = codesLists.getJSONObject(i); + if(!codesList.has("modified")){ + codesList.put("modified", defaultDate); + } + } + return codesLists.toString(); + } + private static String buildRequest(String fileName, HashMap params) throws RmesException { return FreeMarkerUtils.buildRequest("consultation-gestion/", fileName, params); } diff --git a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java index f815a7111..b850ea2c6 100644 --- a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java +++ b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java @@ -80,4 +80,18 @@ public Response getAllStructures() { return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + @GET() + @Path("/listesCodes") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "getAllCodesLists", summary = "Get all codes lists") + public Response getAllCodesLists() { + String jsonResultat; + try { + jsonResultat = consultationGestionService.getAllCodesLists(); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + } diff --git a/src/main/resources/request/consultation-gestion/getAllCodesLists.ftlh b/src/main/resources/request/consultation-gestion/getAllCodesLists.ftlh new file mode 100644 index 000000000..36f55c809 --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getAllCodesLists.ftlh @@ -0,0 +1,9 @@ +SELECT DISTINCT ?notation ?modified ?validationState +FROM <${CODELIST_GRAPH}> +WHERE { + ?listeCode rdf:type skos:ConceptScheme . + ?listeCode skos:notation ?notation . + OPTIONAL {?listeCode dcterms:modified ?modified . } + OPTIONAL {?listeCode insee:validationState ?validationState . } +} + From 774e76baa2cf54cef86c1a616052109f8d67c9eb Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 19 Mar 2021 20:29:09 +0100 Subject: [PATCH 181/243] feat: should rewrite concept and codelist URI when publishing a component --- .../structures/utils/ComponentPublication.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java index 14b105250..5b6df833a 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java @@ -33,12 +33,13 @@ public void publishComponent(Resource component, IRI type) throws RmesException while (statements.hasNext()) { Statement st = statements.next(); String pred = ((SimpleIRI) st.getPredicate()).toString(); - if (pred.endsWith("validationState")) { // nothing, wouldn't copy this attr }else if (pred.endsWith("attribute") || pred.endsWith("dimension") - || pred.endsWith("measure")) { + || pred.endsWith("measure") + || pred.endsWith("codeList") + || pred.endsWith("concept")) { model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), st.getContext()); } From 9b591f83af4cf208b577e456ab812a00ad2d0207 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Sun, 21 Mar 2021 13:49:08 +0100 Subject: [PATCH 182/243] feat: add getCodeList for Melodi --- .../rmes/bauhaus_services/Constants.java | 3 + .../ConsultationGestionService.java | 2 + .../ConsultationGestionServiceImpl.java | 99 ++++++++++++++++--- .../rmes/webservice/ConsultationGestion.java | 14 +++ .../getAllCodesLists.ftlh | 6 +- .../consultation-gestion/getCodes.ftlh | 13 +++ .../consultation-gestion/getCodesList.ftlh | 15 +++ .../consultation-gestion/getStructures.ftlh | 6 +- 8 files changed, 140 insertions(+), 18 deletions(-) create mode 100644 src/main/resources/request/consultation-gestion/getCodes.ftlh create mode 100644 src/main/resources/request/consultation-gestion/getCodesList.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index ab1a5ebe2..c3a885e41 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -55,6 +55,9 @@ public class Constants { /*M*/ public static final String MANAGER = "manager"; + + /*N*/ + public static final String NOTATION = "notation"; /*O*/ public static final String OPERATIONS = "operations"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java index 0982b539b..fcf1b4ab3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java @@ -10,4 +10,6 @@ public interface ConsultationGestionService { String getAllStructures() throws RmesException; String getAllCodesLists() throws RmesException; + + String getCodesList(String notation) throws RmesException; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java index f0b5094d8..9ce42c7fb 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java @@ -62,21 +62,27 @@ public String getAllStructures() throws RmesException { for (int i = 0; i < structures.length(); i++) { JSONObject structure = structures.getJSONObject(i); - String validationState = structure.getString("validationState"); - if("Validated".equalsIgnoreCase(validationState)){ - structure.put("validationState", "Publiée"); - } - if("Modified".equalsIgnoreCase(validationState)){ - structure.put("validationState", "Provisoire, déjà publiée"); - } - if("Unpublished".equalsIgnoreCase(validationState)){ - structure.put("validationState", "Provisoire, jamais publiée"); - } + String validationState = structure.getString("statutValidation"); + structure.put("statutValidation", this.getValidationState(validationState)); } return structures.toString(); } + private String getValidationState(String validationState){ + if("Validated".equalsIgnoreCase(validationState)){ + return "Publiée"; + } + if("Modified".equalsIgnoreCase(validationState)){ + return "Provisoire, déjà publiée"; + } + if("Unpublished".equalsIgnoreCase(validationState)){ + return "Provisoire, jamais publiée"; + } + + return validationState; + } + @Override public String getAllCodesLists() throws RmesException { String defaultDate = "2020-01-01T00:00:00.000"; @@ -87,13 +93,82 @@ public String getAllCodesLists() throws RmesException { JSONArray codesLists = repoGestion.getResponseAsArray(buildRequest("getAllCodesLists.ftlh", params)); for (int i = 0; i < codesLists.length(); i++) { JSONObject codesList = codesLists.getJSONObject(i); - if(!codesList.has("modified")){ - codesList.put("modified", defaultDate); + if(!codesList.has("dateMiseAJour")){ + codesList.put("dateMiseAJour", defaultDate); + } + if(codesList.has("statutValidation")){ + String validationState = codesList.getString("statutValidation"); + codesList.put("statutValidation", this.getValidationState(validationState)); } } return codesLists.toString(); } + @Override + public String getCodesList(String notation) throws RmesException { + String defaultDate = "2020-01-01T00:00:00.000"; + + HashMap params = new HashMap<>(); + params.put("CODELIST_GRAPH", Config.CODELIST_GRAPH); + params.put("NOTATION", notation); + + JSONObject codesList = repoGestion.getResponseAsObject(buildRequest("getCodesList.ftlh", params)); + + codesList.put("label", this.formatLabel(codesList)); + codesList.remove("prefLabelLg1"); + codesList.remove("prefLabelLg2"); + + if(codesList.has("statutValidation")){ + String validationState = codesList.getString("statutValidation"); + codesList.put("statutValidation", this.getValidationState(validationState)); + } + + if(!codesList.has("dateCréation")){ + codesList.put("dateCréation", defaultDate); + } + if(!codesList.has("dateMiseAJour")){ + codesList.put("dateMiseAJour", defaultDate); + } + + codesList.put("codes", this.getCodes(notation)); + + return codesList.toString(); + } + + private JSONArray getCodes(String notation) throws RmesException { + HashMap params = new HashMap<>(); + params.put("CODELIST_GRAPH", Config.CODELIST_GRAPH); + params.put("NOTATION", notation); + + JSONArray codes = repoGestion.getResponseAsArray(buildRequest("getCodes.ftlh", params)); + + for (int i = 0; i < codes.length(); i++) { + JSONObject code = codes.getJSONObject(i); + code.put("label", this.formatLabel(code)); + code.remove("prefLabelLg1"); + code.remove("prefLabelLg2"); + } + + return codes; + } + + private JSONArray formatLabel(JSONObject obj) { + JSONArray label = new JSONArray(); + + JSONObject lg1 = new JSONObject(); + JSONObject lg2 = new JSONObject(); + + lg1.put("langue", Config.LG1); + lg2.put("langue", Config.LG2); + lg1.put("contenu", obj.getString("prefLabelLg1")); + lg2.put("contenu", obj.getString("prefLabelLg2")); + + label.put(lg1); + label.put(lg2); + + return label; + } + private static String buildRequest(String fileName, HashMap params) throws RmesException { return FreeMarkerUtils.buildRequest("consultation-gestion/", fileName, params); } diff --git a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java index b850ea2c6..6c488b2ca 100644 --- a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java +++ b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java @@ -94,4 +94,18 @@ public Response getAllCodesLists() { return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + @GET() + @Path("/listeCode/{notation}") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "getCodesList", summary = "Get one codes list") + public Response getCodesList(@PathParam(Constants.NOTATION) String notation) { + String jsonResultat; + try { + jsonResultat = consultationGestionService.getCodesList(notation); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + } diff --git a/src/main/resources/request/consultation-gestion/getAllCodesLists.ftlh b/src/main/resources/request/consultation-gestion/getAllCodesLists.ftlh index 36f55c809..c4671ab7c 100644 --- a/src/main/resources/request/consultation-gestion/getAllCodesLists.ftlh +++ b/src/main/resources/request/consultation-gestion/getAllCodesLists.ftlh @@ -1,9 +1,9 @@ -SELECT DISTINCT ?notation ?modified ?validationState +SELECT DISTINCT ?notation ?dateMiseAJour ?statutValidation FROM <${CODELIST_GRAPH}> WHERE { ?listeCode rdf:type skos:ConceptScheme . ?listeCode skos:notation ?notation . - OPTIONAL {?listeCode dcterms:modified ?modified . } - OPTIONAL {?listeCode insee:validationState ?validationState . } + OPTIONAL {?listeCode dcterms:modified ?dateMiseAJour . } + OPTIONAL {?listeCode insee:validationState ?statutValidation . } } diff --git a/src/main/resources/request/consultation-gestion/getCodes.ftlh b/src/main/resources/request/consultation-gestion/getCodes.ftlh new file mode 100644 index 000000000..f535fecc5 --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getCodes.ftlh @@ -0,0 +1,13 @@ +SELECT ?uri ?notation ?prefLabelLg1 ?prefLabelLg2 +FROM <${CODELIST_GRAPH}> +WHERE { + ?uriListe rdf:type skos:ConceptScheme . + ?uriListe skos:notation "${NOTATION}" . + ?uri rdf:type skos:Concept . + ?uri skos:inScheme ?uriListe . + ?uri skos:notation ?notation . + ?uri skos:prefLabel ?prefLabelLg1 . + FILTER (lang(?prefLabelLg1) = 'fr') . + ?uri skos:prefLabel ?prefLabelLg2 . + FILTER (lang(?prefLabelLg2) = 'en') . +} \ No newline at end of file diff --git a/src/main/resources/request/consultation-gestion/getCodesList.ftlh b/src/main/resources/request/consultation-gestion/getCodesList.ftlh new file mode 100644 index 000000000..101922d9b --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getCodesList.ftlh @@ -0,0 +1,15 @@ +SELECT ?uri ?notation ?prefLabelLg1 ?prefLabelLg2 ?dateCréation ?dateMiseAJour ?dateFinValidité ?statutValidation +FROM <${CODELIST_GRAPH}> +WHERE { + ?uri rdf:type skos:ConceptScheme . + ?uri skos:notation "${NOTATION}" . + BIND("CL_FREQ" AS ?notation) . + ?uri skos:prefLabel ?prefLabelLg1 . + FILTER (lang(?prefLabelLg1) = 'fr') . + ?uri skos:prefLabel ?prefLabelLg2 . + FILTER (lang(?prefLabelLg2) = 'en') . + OPTIONAL {?listeCode dcterms:created ?dateCréation . } + OPTIONAL {?listeCode dcterms:modified ?dateMiseAJour . } + OPTIONAL {?listeCode dcterms:valid ?dateFinValidité . } + OPTIONAL {?listeCode insee:validationState ?statutValidation . } +} \ No newline at end of file diff --git a/src/main/resources/request/consultation-gestion/getStructures.ftlh b/src/main/resources/request/consultation-gestion/getStructures.ftlh index 8c4b7f9cd..1407af4de 100644 --- a/src/main/resources/request/consultation-gestion/getStructures.ftlh +++ b/src/main/resources/request/consultation-gestion/getStructures.ftlh @@ -1,9 +1,9 @@ -SELECT DISTINCT ?id ?modified ?validationState +SELECT DISTINCT ?id ?dateMiseAJour ?statutValidation FROM <${STRUCTURES_GRAPH}> WHERE { ?structure rdf:type qb:DataStructureDefinition . ?structure dcterms:identifier ?id . - ?structure dcterms:modified ?modified . - ?structure insee:validationState ?validationState . + ?structure dcterms:modified ?dateMiseAJour . + ?structure insee:validationState ?statutValidation . } From 42957a475e316ac7551c2fe9950321cf80beabb0 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Sun, 21 Mar 2021 13:52:35 +0100 Subject: [PATCH 183/243] fix: use constant for validation status --- .../ConsultationGestionServiceImpl.java | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java index 9ce42c7fb..5f9c89e29 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java @@ -4,6 +4,7 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.config.Config; import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.model.ValidationStatus; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.stereotype.Service; @@ -70,13 +71,13 @@ public String getAllStructures() throws RmesException { } private String getValidationState(String validationState){ - if("Validated".equalsIgnoreCase(validationState)){ + if(ValidationStatus.VALIDATED.toString().equalsIgnoreCase(validationState)){ return "Publiée"; } - if("Modified".equalsIgnoreCase(validationState)){ + if(ValidationStatus.MODIFIED.toString().equalsIgnoreCase(validationState)){ return "Provisoire, déjà publiée"; } - if("Unpublished".equalsIgnoreCase(validationState)){ + if(ValidationStatus.UNPUBLISHED.toString().equalsIgnoreCase(validationState)){ return "Provisoire, jamais publiée"; } From 47bd4606b966725c0041c3cb6a24c852d66045ec Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Tue, 23 Mar 2021 09:18:47 +0100 Subject: [PATCH 184/243] feat: review request fetching codes lists --- .../code_list/CodeListQueries.java | 2 + .../request/codes-list/getAllCodesLists.ftlh | 38 ++++++++++--------- .../request/codes-list/getCodeListByIRI.ftlh | 12 +++--- 3 files changed, 29 insertions(+), 23 deletions(-) diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java index 09173539c..13877ef91 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/code_list/CodeListQueries.java @@ -19,6 +19,8 @@ public static String getAllCodesLists() throws RmesException { HashMap params = new HashMap<>(); params.put("CODES_LISTS_GRAPH", Config.CODELIST_GRAPH); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); return FreeMarkerUtils.buildRequest("codes-list/", "getAllCodesLists.ftlh", params); } public static String getCodeListItemsByNotation(String notation) { diff --git a/src/main/resources/request/codes-list/getAllCodesLists.ftlh b/src/main/resources/request/codes-list/getAllCodesLists.ftlh index 326368c50..ca76e26e6 100644 --- a/src/main/resources/request/codes-list/getAllCodesLists.ftlh +++ b/src/main/resources/request/codes-list/getAllCodesLists.ftlh @@ -1,19 +1,23 @@ -SELECT ?uri ?label ?range ?notation +SELECT ?uri ?labelLg1 ?labelLg2 ?range ?notation WHERE { -{ -GRAPH <${CODES_LISTS_GRAPH}> { -?uri rdf:type skos:ConceptScheme . -?uri skos:prefLabel ?label . -?uri skos:notation ?notation . -FILTER(lang(?label) = 'fr') . -?range rdfs:seeAlso ?uri -} -} -UNION -{ -?uri rdf:type xkos:ClassificationLevel . -?uri skos:prefLabel ?label . -FILTER(lang(?label) = 'fr') . -?uri xkos:organizedBy ?range -} + { + GRAPH <${CODES_LISTS_GRAPH}> { + ?uri rdf:type skos:ConceptScheme . + ?uri skos:prefLabel ?labelLg1 . + ?uri skos:notation ?notation . + FILTER(lang(?labelLg1) = '${LG1}') . + OPTIONAL {?uri skos:prefLabel ?labelLg2 . + FILTER (lang(?labelLg2) = '${LG2}') } . + ?range rdfs:seeAlso ?uri + } + } + UNION + { + ?uri rdf:type xkos:ClassificationLevel . + ?uri skos:prefLabel ?labelLg1 . + FILTER(lang(?labelLg1) = '${LG1}') . + OPTIONAL {?uri skos:prefLabel ?labelLg2 . + FILTER (lang(?labelLg2) = '${LG2}') } . + ?uri xkos:organizedBy ?range + } } \ No newline at end of file diff --git a/src/main/resources/request/codes-list/getCodeListByIRI.ftlh b/src/main/resources/request/codes-list/getCodeListByIRI.ftlh index 553905294..5bebc219c 100644 --- a/src/main/resources/request/codes-list/getCodeListByIRI.ftlh +++ b/src/main/resources/request/codes-list/getCodeListByIRI.ftlh @@ -1,10 +1,10 @@ SELECT ?code ?labelLg1 ?labelLg2 FROM <${CODES_LISTS_GRAPH}> WHERE { -?codeList skos:inScheme <${CODE_LIST}> . -?codeList skos:notation ?code . -?codeList skos:prefLabel ?labelLg1 . -FILTER (lang(?labelLg1) = '${LG1}') -OPTIONAL {?codeList skos:prefLabel ?labelLg2 . -FILTER (lang(?labelLg2) = '${LG2}') } . + ?codeList skos:inScheme <${CODE_LIST}> . + ?codeList skos:notation ?code . + ?codeList skos:prefLabel ?labelLg1 . + FILTER (lang(?labelLg1) = '${LG1}') + OPTIONAL {?codeList skos:prefLabel ?labelLg2 . + FILTER (lang(?labelLg2) = '${LG2}') } . } \ No newline at end of file From 1af765a200e4ca6fead040d731a24d56a6c765ff Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Tue, 23 Mar 2021 13:08:46 +0100 Subject: [PATCH 185/243] feat: add structure API for Melodi --- .../ConsultationGestionService.java | 2 + .../ConsultationGestionServiceImpl.java | 86 +++++++++++++++++++ .../structures/utils/StructureUtils.java | 1 + .../rmes/webservice/ConsultationGestion.java | 14 +++ .../consultation-gestion/getCodes.ftlh | 4 +- .../consultation-gestion/getCodesList.ftlh | 4 +- .../consultation-gestion/getStructure.ftlh | 17 ++++ .../getStructureComponents.ftlh | 20 +++++ 8 files changed, 144 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/request/consultation-gestion/getStructure.ftlh create mode 100644 src/main/resources/request/consultation-gestion/getStructureComponents.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java index fcf1b4ab3..96b46d776 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionService.java @@ -12,4 +12,6 @@ public interface ConsultationGestionService { String getAllCodesLists() throws RmesException; String getCodesList(String notation) throws RmesException; + + String getStructure(String id) throws RmesException; } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java index 5f9c89e29..9b04b3472 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java @@ -105,6 +105,88 @@ public String getAllCodesLists() throws RmesException { return codesLists.toString(); } + @Override + public String getStructure(String id) throws RmesException { + String defaultDate = "2020-01-01T00:00:00.000"; + HashMap params = new HashMap<>(); + params.put("STRUCTURES_GRAPH", Config.STRUCTURES_GRAPH); + params.put("STRUCTURE_ID", id); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); + + JSONObject structure = repoGestion.getResponseAsObject(buildRequest("getStructure.ftlh", params)); + + structure.put("label", this.formatLabel(structure)); + structure.remove("prefLabelLg1"); + structure.remove("prefLabelLg2"); + + if(structure.has("statutValidation")){ + String validationState = structure.getString("statutValidation"); + structure.put("statutValidation", this.getValidationState(validationState)); + } + + if(!structure.has("dateCréation")){ + structure.put("dateCréation", defaultDate); + } + if(!structure.has("dateMiseAJour")){ + structure.put("dateMiseAJour", defaultDate); + } + + getStructureComponents(id, structure); + return structure.toString(); + } + + private void getStructureComponents(String id, JSONObject structure) throws RmesException { + HashMap params = new HashMap<>(); + params.put("STRUCTURES_GRAPH", Config.STRUCTURES_GRAPH); + params.put("STRUCTURES_COMPONENTS_GRAPH", Config.STRUCTURES_COMPONENTS_GRAPH); + params.put("STRUCTURE_ID", id); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); + + JSONArray components = repoGestion.getResponseAsArray(buildRequest("getStructureComponents.ftlh", params)); + + JSONArray measures = new JSONArray(); + JSONArray dimensions = new JSONArray(); + JSONArray attributes = new JSONArray(); + + for (int i = 0; i < components.length(); i++) { + JSONObject component = components.getJSONObject(i); + component.put("label", this.formatLabel(component)); + component.remove("prefLabelLg1"); + component.remove("prefLabelLg2"); + + if(component.has("listeCode")){ + component.put("representation", "liste de code"); + } + + if(component.has("representation")){ + if(component.getString("representation").endsWith("date")){ + component.put("representation", "date"); + } else if(component.getString("representation").endsWith("integer")){ + component.put("representation", "entier"); + } else if(component.getString("representation").endsWith("float")){ + component.put("representation", "décimal"); + } + } + + String idComponent = component.getString("id"); + component.remove("id"); + if(idComponent.startsWith("a")){ + attributes.put(component); + } + if(idComponent.startsWith("m")){ + measures.put(component); + } + if(idComponent.startsWith("d")){ + dimensions.put(component); + } + } + structure.put("attributs", attributes); + structure.put("mesures", measures); + structure.put("dimensions", dimensions); + } + @Override public String getCodesList(String notation) throws RmesException { String defaultDate = "2020-01-01T00:00:00.000"; @@ -112,6 +194,8 @@ public String getCodesList(String notation) throws RmesException { HashMap params = new HashMap<>(); params.put("CODELIST_GRAPH", Config.CODELIST_GRAPH); params.put("NOTATION", notation); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); JSONObject codesList = repoGestion.getResponseAsObject(buildRequest("getCodesList.ftlh", params)); @@ -140,6 +224,8 @@ private JSONArray getCodes(String notation) throws RmesException { HashMap params = new HashMap<>(); params.put("CODELIST_GRAPH", Config.CODELIST_GRAPH); params.put("NOTATION", notation); + params.put("LG1", Config.LG1); + params.put("LG2", Config.LG2); JSONArray codes = repoGestion.getResponseAsArray(buildRequest("getCodes.ftlh", params)); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index c5158cda4..3295bdbaa 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -227,6 +227,7 @@ private void checkUnicityForStructure(Structure structure) throws RmesException } public void createRdfStructure(Structure structure, String structureId, IRI structureIri, Resource graph, ValidationStatus status) throws RmesException { + repoGestion.clearStructureNodeAndComponents(structureIri); Model model = new LinkedHashModel(); diff --git a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java index 6c488b2ca..889ad363d 100644 --- a/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java +++ b/src/main/java/fr/insee/rmes/webservice/ConsultationGestion.java @@ -80,6 +80,20 @@ public Response getAllStructures() { return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); } + @GET() + @Path("/structure/{id}") + @Produces(MediaType.APPLICATION_JSON) + @Operation(operationId = "getStructure", summary = "Get a structure") + public Response getStructure(@PathParam(Constants.ID) String id) { + String jsonResultat; + try { + jsonResultat = consultationGestionService.getStructure(id); + } catch (RmesException e) { + return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); + } + return Response.status(HttpStatus.SC_OK).entity(jsonResultat).build(); + } + @GET() @Path("/listesCodes") @Produces(MediaType.APPLICATION_JSON) diff --git a/src/main/resources/request/consultation-gestion/getCodes.ftlh b/src/main/resources/request/consultation-gestion/getCodes.ftlh index f535fecc5..18f49b73e 100644 --- a/src/main/resources/request/consultation-gestion/getCodes.ftlh +++ b/src/main/resources/request/consultation-gestion/getCodes.ftlh @@ -7,7 +7,7 @@ WHERE { ?uri skos:inScheme ?uriListe . ?uri skos:notation ?notation . ?uri skos:prefLabel ?prefLabelLg1 . - FILTER (lang(?prefLabelLg1) = 'fr') . + FILTER (lang(?prefLabelLg1) = '${LG1}') . ?uri skos:prefLabel ?prefLabelLg2 . - FILTER (lang(?prefLabelLg2) = 'en') . + FILTER (lang(?prefLabelLg2) = '${LG2}') . } \ No newline at end of file diff --git a/src/main/resources/request/consultation-gestion/getCodesList.ftlh b/src/main/resources/request/consultation-gestion/getCodesList.ftlh index 101922d9b..99ec37871 100644 --- a/src/main/resources/request/consultation-gestion/getCodesList.ftlh +++ b/src/main/resources/request/consultation-gestion/getCodesList.ftlh @@ -5,9 +5,9 @@ WHERE { ?uri skos:notation "${NOTATION}" . BIND("CL_FREQ" AS ?notation) . ?uri skos:prefLabel ?prefLabelLg1 . - FILTER (lang(?prefLabelLg1) = 'fr') . + FILTER (lang(?prefLabelLg1) = '${LG1}') . ?uri skos:prefLabel ?prefLabelLg2 . - FILTER (lang(?prefLabelLg2) = 'en') . + FILTER (lang(?prefLabelLg2) = '${LG2}') . OPTIONAL {?listeCode dcterms:created ?dateCréation . } OPTIONAL {?listeCode dcterms:modified ?dateMiseAJour . } OPTIONAL {?listeCode dcterms:valid ?dateFinValidité . } diff --git a/src/main/resources/request/consultation-gestion/getStructure.ftlh b/src/main/resources/request/consultation-gestion/getStructure.ftlh new file mode 100644 index 000000000..2f2f4cc12 --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getStructure.ftlh @@ -0,0 +1,17 @@ +SELECT ?uri ?id ?notation ?prefLabelLg1 ?prefLabelLg2 ?dateCréation ?dateMiseAJour ?dateFinValidité ?statutValidation ?version +FROM <${STRUCTURES_GRAPH}> +WHERE { + ?uri rdf:type qb:DataStructureDefinition . + ?uri dcterms:identifier "${STRUCTURE_ID}" . + BIND("${STRUCTURE_ID}" AS ?id) . + ?uri skos:notation ?notation . + ?uri rdfs:label ?prefLabelLg1 . + FILTER (lang(?prefLabelLg1) = '${LG1}') . + ?uri rdfs:label ?prefLabelLg2 . + FILTER (lang(?prefLabelLg2) = '${LG2}') . + ?uri dcterms:created ?dateCréation . + ?uri dcterms:modified ?dateMiseAJour . + OPTIONAL {?uri dcterms:valid ?dateFinValidité . } + ?uri insee:validationState ?statutValidation . + OPTIONAL {?uri pav:version ?version . } +} \ No newline at end of file diff --git a/src/main/resources/request/consultation-gestion/getStructureComponents.ftlh b/src/main/resources/request/consultation-gestion/getStructureComponents.ftlh new file mode 100644 index 000000000..619336d4f --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getStructureComponents.ftlh @@ -0,0 +1,20 @@ +SELECT ?uri ?id ?notation ?prefLabelLg1 ?prefLabelLg2 ?concept ?representation ?listeCode ?ordre +FROM <${STRUCTURES_GRAPH}> +FROM <${STRUCTURES_COMPONENTS_GRAPH}> +WHERE { + ?uriDSD rdf:type qb:DataStructureDefinition . + ?uriDSD dcterms:identifier "${STRUCTURE_ID}" . + ?uriDSD qb:component ?uriComponentSpecification . + ?uriComponentSpecification (qb:measure|qb:dimension|qb:attribute) ?uri . + ?uri dcterms:identifier ?id . + ?uri skos:notation ?notation . + ?uri rdfs:label ?prefLabelLg1 . + FILTER (lang(?prefLabelLg1) = '${LG1}') . + ?uri rdfs:label ?prefLabelLg2 . + FILTER (lang(?prefLabelLg2) = '${LG2}') . + OPTIONAL { ?uri qb:concept ?concept . } + OPTIONAL { ?uri rdfs:range ?representation . } + OPTIONAL { ?uri qb:codeList ?listeCode . } + OPTIONAL { ?uriComponentSpecification qb:order ?ordre . } + +} \ No newline at end of file From 8dcc0bdd0b8a25ae503825c644a29bd68359a45c Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 24 Mar 2021 15:32:42 +0100 Subject: [PATCH 186/243] Remove unused --- .../bauhaus_services/OperationsService.java | 4 +- .../code_list/CodeListItem.java | 10 +- .../operations/OperationsImpl.java | 40 +------ .../documentations/DocumentationExport.java | 79 +------------ .../documentations/DocumentationsUtils.java | 107 +----------------- .../rmes/persistance/ontologies/XKOS.java | 4 +- .../operations/MetadataReportResources.java | 10 +- 7 files changed, 13 insertions(+), 241 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index a7d8c95ff..9fa36de8d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -143,10 +143,8 @@ public interface OperationsService { String publishMetadataReport(String id) throws RmesException; - Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException; + Response exportMetadataReport(String id, boolean includeEmptyMas, boolean lg1, boolean lg2) throws RmesException; - Response exportTestMetadataReport() throws RmesException; - String getMetadataReportOwner(String id) throws RmesException; String getMSDJson() throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListItem.java b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListItem.java index 0592278b8..37970679c 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListItem.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/code_list/CodeListItem.java @@ -4,14 +4,15 @@ public class CodeListItem { + @Schema(description = "Code", required = true) - public String code; + private String code; @Schema(description = "Label lg1", required = true) - public String labelLg1; + private String labelLg1; @Schema(description = "Label lg2") - public String labelLg2; + private String labelLg2; public CodeListItem(String code, String labelLg1, String labelLg2) { super(); @@ -28,9 +29,6 @@ public String getCode() { return this.code; } - public static String getClassCodeLabelTwoLangs() { - return "fr.insee.rmes.config.swagger.model.CodeLabelTwoLangs"; - } public String getLabelLg1() { return labelLg1; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index adcb22663..6faed3887 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -434,12 +434,10 @@ public String publishMetadataReport(String id) throws RmesException { * EXPORT */ @Override - public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException { + public Response exportMetadataReport(String id, boolean includeEmptyMas, boolean lg1, boolean lg2) throws RmesException { - if(!(lg1) && !(lg2)) throw new RmesNotAcceptableException( - ErrorCodes.SIMS_EXPORT_WITHOUT_LANGUAGE, - "at least one language must be selected for export", - "in export of sims: "+id); + if(!(lg1) && !(lg2)) throw new RmesNotAcceptableException(ErrorCodes.SIMS_EXPORT_WITHOUT_LANGUAGE, + "at least one language must be selected for export","in export of sims: "+id); File output; InputStream is; try { @@ -452,38 +450,6 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); return Response.ok(is, "application/vnd.oasis.opendocument.text").header(CONTENT_DISPOSITION, content).build(); } - - public Response exportMetadataReportOld(String id) throws RmesException { - File output; - InputStream is; - try { - output = documentationsUtils.exportMetadataReportOld(id); - is = new FileInputStream(output); - } catch (Exception e1) { - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); - } - String fileName = output.getName(); - ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); - return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); - } - - - @Override - public Response exportTestMetadataReport() throws RmesException { - File output; - InputStream is; - try { - output = documentationsUtils.exportTestMetadataReport(); - is = new FileInputStream(output); - } catch (Exception e1) { - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); - } - String fileName = output.getName(); - ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); - return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); - } - - } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 3d57b13b9..aa77e1060 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -1,6 +1,5 @@ package fr.insee.rmes.bauhaus_services.operations.documentations; -import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; import java.io.InputStream; @@ -40,32 +39,9 @@ public class DocumentationExport { private static final Logger logger = LoggerFactory.getLogger(DocumentationExport.class); - public File testExport() throws IOException { - - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); - output.deleteOnExit(); - OutputStream osOutputFile = FileUtils.openOutputStream(output); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/convertRichText.xsl"); - InputStream inputFile = getClass().getResourceAsStream("/testXML.xml"); - - try(PrintStream printStream = new PrintStream(osOutputFile) ){ - StreamSource xsrc = new StreamSource(xslFile); - TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); - transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); - xsltTransformer.transform(new StreamSource(inputFile), new StreamResult(printStream)); - } catch (TransformerException e) { - logger.error(e.getMessage()); - } finally { - inputFile.close(); - osOutputFile.close(); - } - return output; - } - public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, String organizationsXML, String codeListsXML, String targetType, - Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException, IOException { + boolean includeEmptyMas, boolean lg1, boolean lg2) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXML = documentationsUtils.buildShellSims(); @@ -151,59 +127,6 @@ private void addParameter (Transformer xsltTransformer, String paramName, String } - public File exportOld(InputStream inputFile, - String absolutePath, String accessoryAbsolutePath, String organizationsAbsolutePath, - String codeListAbsolutePath, String targetType) throws RmesException, IOException { - logger.debug("Begin To export documentation"); - - String msdXml = documentationsUtils.buildShellSims(); - File msdFile = File.createTempFile("msdXml", ".xml"); - CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING }; - - InputStream is = new ByteArrayInputStream(msdXml.getBytes(StandardCharsets.UTF_8)); - Files.copy(is, msdFile.toPath(), options); - - String msdPath = msdFile.getAbsolutePath(); - - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); - output.deleteOnExit(); - - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/testXSLT.xsl"); - OutputStream osOutputFile = FileUtils.openOutputStream(output); - - - try(PrintStream printStream = new PrintStream(osOutputFile) ){ - - StreamSource xsrc = new StreamSource(xslFile); - TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); - transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - - Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); - - absolutePath = absolutePath.replace('\\', '/'); - accessoryAbsolutePath = accessoryAbsolutePath.replace('\\', '/'); - organizationsAbsolutePath = organizationsAbsolutePath.replace('\\', '/'); - msdPath = msdPath.replace('\\', '/'); - codeListAbsolutePath = codeListAbsolutePath.replace('\\', '/'); - - xsltTransformer.setParameter("tempFile", absolutePath); - xsltTransformer.setParameter("accessoryTempFile", accessoryAbsolutePath); - xsltTransformer.setParameter("orga", organizationsAbsolutePath); - xsltTransformer.setParameter("msd", msdPath); - xsltTransformer.setParameter("codeList", codeListAbsolutePath); - xsltTransformer.setParameter("targetType", targetType); - - xsltTransformer.transform(new StreamSource(inputFile), new StreamResult(printStream)); - } catch (TransformerException e) { - logger.error(e.getMessage()); - } finally { - inputFile.close(); - xslFile.close(); - osOutputFile.close(); - } - logger.debug("End To export documentation"); - return(output); - } } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 02185406b..4acaa596f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -2,12 +2,6 @@ import java.io.File; import java.io.IOException; -import java.io.InputStream; -import java.nio.charset.StandardCharsets; -import java.nio.file.CopyOption; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.StandardCopyOption; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -15,7 +9,6 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.Response.Status; -import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -72,10 +65,6 @@ @Component public class DocumentationsUtils extends RdfService{ - - - private static final String DOT_XML = ".xml"; - static final Logger logger = LogManager.getLogger(DocumentationsUtils.class); @Autowired @@ -516,11 +505,7 @@ public String getDocumentationOwnersByIdSims(String idSims) throws RmesException return stamps; } - public File exportTestMetadataReport() throws IOException { - return docExport.testExport(); - } - - public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws IOException, RmesException { + public File exportMetadataReport(String id, boolean includeEmptyMas, boolean lg1, boolean lg2) throws IOException, RmesException { String emptyXML=XMLUtils.produceEmptyXML(); Operation operation; @@ -591,96 +576,6 @@ public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1 organizationsXML,codeListsXML,targetType,includeEmptyMas,lg1,lg2); } - public File exportMetadataReportOld(String id) throws IOException, RmesException { - - InputStream is; - InputStream is2; - InputStream is3; - InputStream is4; - - Path tempDir= Files.createTempDirectory("forExport"); - - // Xml File for Operation, Indicator or Series - Path tempFile = Files.createTempFile(tempDir, "target",DOT_XML); - String absolutePath = tempFile.toFile().getAbsolutePath(); - // Xml File for Series - Path accessoryTempFile = Files.createTempFile(tempDir, "series",DOT_XML); - String accessoryAbsolutePath = accessoryTempFile.toFile().getAbsolutePath(); - // Xml File for Organizations - Path organizationsTempFile = Files.createTempFile(tempDir, "orga",DOT_XML); - String organizationsAbsolutePath = organizationsTempFile.toFile().getAbsolutePath(); - // Xml File for needed CodeLists - Path codeListTempFile = Files.createTempFile(tempDir, "freq",DOT_XML); - - String codeListAbsolutePath = codeListTempFile.toFile().getAbsolutePath(); - - CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING }; - - String[] target = getDocumentationTargetTypeAndId(id); - String targetType = target[0]; - String idDatabase = target[1]; - - ListneededCodeLists=new ArrayList<>(); - - if (targetType.equals(Constants.OPERATION_UP)) { - Operation operation=operationsUtils.getOperationById(idDatabase); - String idSeries=operation.getSeries().getId(); - Series series=seriesUtils.getSeriesById(idSeries); - String operationXML = XMLUtils.produceXMLResponse(operation); - is = IOUtils.toInputStream(operationXML, StandardCharsets.UTF_8); - Files.copy(is, tempFile, options); - neededCodeLists.addAll(XMLUtils.getTagValues(operationXML,Constants.TYPELIST)); - neededCodeLists.addAll(XMLUtils.getTagValues(operationXML,Constants.ACCRUAL_PERIODICITY_LIST)); - String seriesXML = XMLUtils.produceXMLResponse(series); - is2 = IOUtils.toInputStream(seriesXML, StandardCharsets.UTF_8); - Files.copy(is2, accessoryTempFile, options); - neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); - neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); - } - - if (targetType.equals(Constants.SERIES_UP)) { - String response=XMLUtils.produceXMLResponse( - seriesUtils.getSeriesById(idDatabase)); - is = IOUtils.toInputStream(response,StandardCharsets.UTF_8); - Files.copy(is, accessoryTempFile, options); - is2 = IOUtils.toInputStream(response, StandardCharsets.UTF_8); - Files.copy(is2, tempFile, options); - neededCodeLists.addAll(XMLUtils.getTagValues(response,Constants.TYPELIST)); - neededCodeLists.addAll(XMLUtils.getTagValues(response,Constants.ACCRUAL_PERIODICITY_LIST)); - } - - if (targetType.equals(Constants.INDICATOR_UP)) { - String response=XMLUtils.produceXMLResponse( - indicatorsUtils.getIndicatorById(idDatabase)); - is = IOUtils.toInputStream(response, StandardCharsets.UTF_8); - Files.copy(is, tempFile, options); - neededCodeLists.addAll(XMLUtils.getTagValues(response,Constants.TYPELIST)); - neededCodeLists.addAll(XMLUtils.getTagValues(response,Constants.ACCRUAL_PERIODICITY_LIST)); - } - - is3 = IOUtils.toInputStream(XMLUtils.produceXMLResponse(organizationsServiceImpl.getOrganizations()), StandardCharsets.UTF_8); - Files.copy(is3, organizationsTempFile, options); - - String simsXML=XMLUtils.produceResponse(getFullSimsForXml(id), "application/xml"); - neededCodeLists.addAll(XMLUtils.getTagValues(simsXML,Constants.CODELIST)); - - neededCodeLists=neededCodeLists.stream().distinct().collect(Collectors.toList()); - - String codeListsXml=Constants.XML_OPEN_CODELIST_TAG; - - for(String code : neededCodeLists) { - codeListsXml=codeListsXml.concat(XMLUtils.produceXMLResponse(codeListServiceImpl.getCodeList(code))); - } - codeListsXml=codeListsXml.concat(Constants.XML_END_CODELIST_TAG); - - is4 = IOUtils.toInputStream(codeListsXml, StandardCharsets.UTF_8); - Files.copy(is4, codeListTempFile, options); - - InputStream simsInputStream = IOUtils.toInputStream(simsXML, StandardCharsets.UTF_8); - - return docExport.exportOld(simsInputStream,absolutePath,accessoryAbsolutePath, - organizationsAbsolutePath,codeListAbsolutePath,targetType); - } public MSD buildMSDFromJson(JSONArray jsonMsd) { diff --git a/src/main/java/fr/insee/rmes/persistance/ontologies/XKOS.java b/src/main/java/fr/insee/rmes/persistance/ontologies/XKOS.java index 585f2086d..9c02a2891 100644 --- a/src/main/java/fr/insee/rmes/persistance/ontologies/XKOS.java +++ b/src/main/java/fr/insee/rmes/persistance/ontologies/XKOS.java @@ -17,12 +17,12 @@ public class XKOS { /** * The XKOS namespace: http://rdf-vocabulary.ddialliance.org/xkos# */ - public static final String NAMESPACE = "http://rdf-vocabulary.ddialliance.org/xkos#"; + private static final String NAMESPACE = "http://rdf-vocabulary.ddialliance.org/xkos#"; /** * The recommended prefix for the SKOS namespace: "xkos" */ - public static final String PREFIX = "xkos"; + private static final String PREFIX = "xkos"; /** * An immutable {@link Namespace} constant that represents the XKOS namespace. diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index fb775eb18..d6bcb459e 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -295,7 +295,7 @@ public Response setSimsValidation( */ @GET - @Path("/metadataReport/export/{id}/{emptyMas}/{lg1}/{lg2}") + @Path("/metadataReport/export/{id}") @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") public Response getSimsExport(@Parameter( @@ -321,12 +321,4 @@ public Response getSimsExport(@Parameter( return operationsService.exportMetadataReport(id,includeEmptyMas,lg1,lg2); } - @GET - @Path("/metadataReport/testExport") - @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") - public Response getTestSimsExport() throws RmesException { - return operationsService.exportTestMetadataReport(); - } - } From 761ef56c8ae72fa03c636259ca8b884ac790c2c2 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 24 Mar 2021 16:45:41 +0100 Subject: [PATCH 187/243] Try another config --- src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java b/src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java index ff5954847..7b9f3df12 100644 --- a/src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java +++ b/src/main/java/fr/insee/rmes/config/swagger/SwaggerConfig.java @@ -11,6 +11,7 @@ import org.apache.logging.log4j.Logger; import org.glassfish.jersey.media.multipart.MultiPartFeature; import org.glassfish.jersey.server.ResourceConfig; +import org.springframework.context.annotation.DependsOn; import fr.insee.rmes.config.Config; import io.swagger.v3.jaxrs2.integration.resources.OpenApiResource; @@ -20,6 +21,7 @@ import io.swagger.v3.oas.models.servers.Server; @ApplicationPath("/") +@DependsOn("AppContext") public class SwaggerConfig extends ResourceConfig { private static final Logger logger = LogManager.getLogger(SwaggerConfig.class); From c8bae0181d5045d7fb6ac99c766c2ee1200ce5c3 Mon Sep 17 00:00:00 2001 From: BulotF Date: Wed, 24 Mar 2021 17:25:31 +0100 Subject: [PATCH 188/243] export odt : bug with

into

  • --- .../xslTransformerFiles/sims2fodt.xsl | 42 +++++++++++++++---- 1 file changed, 35 insertions(+), 7 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 382b89085..5424852b2 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -519,18 +519,36 @@ - + + - + - + - + + + + + + + + + + + + + + + + + + @@ -679,11 +697,21 @@ + - - - + + + + + + + + + + + + From d0a11173db0ca7ecf7e57b07ddd2036de19a1ecb Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 25 Mar 2021 10:57:58 +0100 Subject: [PATCH 189/243] Fix warning in log (spring multiple beans) --- .../java/fr/insee/rmes/webservice/OperationsAbstResources.java | 2 -- .../fr/insee/rmes/webservice/operations/FamilyResources.java | 2 ++ .../insee/rmes/webservice/operations/IndicatorsResources.java | 2 ++ .../rmes/webservice/operations/MetadataReportResources.java | 2 ++ .../insee/rmes/webservice/operations/OperationsResources.java | 2 ++ .../fr/insee/rmes/webservice/operations/SeriesResources.java | 2 ++ 6 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java index a515ca2ae..2cb379574 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java @@ -7,7 +7,6 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Component; import fr.insee.rmes.bauhaus_services.OperationsService; import fr.insee.rmes.exceptions.RmesException; @@ -16,7 +15,6 @@ import io.swagger.v3.oas.annotations.tags.Tag; -@Component @Path("/operations") @Tag(name="Operations", description="Operation API") @ApiResponses(value = { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java b/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java index f54f674fd..5debf7ccc 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java @@ -12,6 +12,7 @@ import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.annotation.Secured; import org.springframework.stereotype.Component; @@ -31,6 +32,7 @@ * FAMILY ******************************************************************************************************/ @Component +@Qualifier("Family") @Path("/operations") public class FamilyResources extends OperationsAbstResources { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java index 9b118a082..921c7df63 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java @@ -14,6 +14,7 @@ import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.annotation.Secured; import org.springframework.stereotype.Component; @@ -32,6 +33,7 @@ @Component +@Qualifier("Indicator") @Path("/operations") public class IndicatorsResources extends OperationsAbstResources { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index fb775eb18..8f03b0df0 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -18,6 +18,7 @@ import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.annotation.Secured; import org.springframework.stereotype.Component; @@ -38,6 +39,7 @@ @Component +@Qualifier("Report") @Path("/operations") public class MetadataReportResources extends OperationsAbstResources { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java index 62e437032..71ac1f9d2 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java @@ -21,6 +21,7 @@ import org.apache.commons.io.IOUtils; import org.apache.http.HttpStatus; import org.glassfish.jersey.media.multipart.FormDataParam; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.annotation.Secured; import org.springframework.stereotype.Component; @@ -39,6 +40,7 @@ @Component +@Qualifier("Operation") @Path("/operations") public class OperationsResources extends OperationsAbstResources { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java b/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java index 2a3d9ecb5..ad0ec3273 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java @@ -14,6 +14,7 @@ import javax.ws.rs.core.Response.Status; import org.apache.http.HttpStatus; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.security.access.annotation.Secured; import org.springframework.stereotype.Component; @@ -34,6 +35,7 @@ @Component +@Qualifier("Series") @Path("/operations") public class SeriesResources extends OperationsAbstResources { From 5689612d59f0e26b3b003e300d970924f7813611 Mon Sep 17 00:00:00 2001 From: BulotF Date: Thu, 25 Mar 2021 11:14:38 +0100 Subject: [PATCH 190/243] =?UTF-8?q?prepare=20odt=20export=20for=20RM=C3=A9?= =?UTF-8?q?S=20format=20instead=20of=20fodt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rmesPatternContent.xml + sims2fodt.xsl -> content.xml used to replace the one in rmesPattern.odt --- .../xslTransformerFiles/rmesPattern.odt | Bin 0 -> 17705 bytes .../rmesPatternContent.xml | 647 ++++++++++++++++++ 2 files changed, 647 insertions(+) create mode 100644 src/main/resources/xslTransformerFiles/rmesPattern.odt create mode 100644 src/main/resources/xslTransformerFiles/rmesPatternContent.xml diff --git a/src/main/resources/xslTransformerFiles/rmesPattern.odt b/src/main/resources/xslTransformerFiles/rmesPattern.odt new file mode 100644 index 0000000000000000000000000000000000000000..01d306a5a98278c5f54b021bd3fd3f735df159c2 GIT binary patch literal 17705 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 HfA9StX4yn5 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/rmesPatternContent.xml b/src/main/resources/xslTransformerFiles/rmesPatternContent.xml new file mode 100644 index 000000000..b2d02b26a --- /dev/null +++ b/src/main/resources/xslTransformerFiles/rmesPatternContent.xml @@ -0,0 +1,647 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ${series/prefLabelLg1} + + + + + ${series/prefLabelLg2} + + + + + + + + + ${operation/prefLabelLg1} + + + + + ${operation/prefLabelLg2} + + + + + + + + + ${indicator/prefLabelLg1} + + + + + ${indicator/prefLabelLg2} + + + + + + + + + + Informations sur la série : + ${series/prefLabelLg1} + Informations about the series: + ${series/prefLabelLg2} + + + + + + + + + + Informations sur l'indicateur : + ${indicator/prefLabelLg1} + Informations about the indicator: + ${indicator/prefLabelLg2} + + + + + + + + + + + Nom court + ${series/altLabelLg1} + + + + Short name + ${series/altLabelLg2} + + + + + Résumé + ${series/abstractLg1} + + + + Summary + ${series/abstractLg2} + + + + + Historique + ${series/historyNoteLg1} + + + + History + ${series/historyNoteLg2} + + + + + Type d'opération + ${seriesCode/type/labelLg1} + + + + Operation type + ${seriesCode/type/labelLg2} + + + + + Fréquence de collecte des données + ${seriesCode/accrualPeriodicity/labelLg1} + + + + Data frequency of dissemination + ${seriesCode/accrualPeriodicity/labelLg2} + + + + + Organismes responsables + #list(${series/publishers/labelLg1},'L1') + + + + + Partenaires + #list(${series/contributors/labelLg1},'L1') + + + + + Services collecteurs + #list(${series/dataCollectors/labelLg1},'L1') + + + + + Propriétaire + ${series/creators} + + + + + Succède à + ${series/replaces/labelLg1} + + + + Replaces + ${series/replaces/labelLg2} + + + + + Remplacé par + ${series/isReplacedBy/labelLg1} + + + + Replaced by + ${series/isReplacedBy/labelLg2} + + + + + Indicateurs produits + #list(${series/generates/labelLg1},'L1') + + + + + Séries ou Indicateurs liés + Séries: + #list(${series/seeAlso-series/labelLg1},'L1') + Indicateurs: + #list(${series/seeAlso-indicator/labelLg1},'L1') + + + + Series and indicators produced + Series: + #list(${series/seeAlso-series/labelLg2},'L1') + Indicators: + #list(${series/seeAlso-indicator/labelLg2},'L1') + + + + + Famille parente + #list(${series/family/labelLg1},'L1') + + + + Parent Family + #list(${series/family/labelLg2},'L1') + + + + + Opérations filles + #list(${series/operations/labelLg1},'L1') + + + + Daughter operations + #list(${series/operations/labelLg2},'L1') + + + + + + + + + + Informations sur l'opération : + ${operation/prefLabelLg1} + Informations about the operation: + ${operation/prefLabelLg2} + + + + + + + + + + + Nom court + ${indicator/altLabelLg1} + + + + Short name + ${indicator/altLabelLg2} + + + + + Résumé + ${indicator/abstractLg1} + + + + Summary + ${indicator/abstractLg2} + + + + + Historique + ${indicator/historyNoteLg1} + + + + History + ${indicator/historyNoteLg2} + + + + + Fréquence de diffusion + ${indicatorCode/accrualPeriodicity/labelLg1} + + + + Data frequency of dissemination + ${indicatorCode/accrualPeriodicity/labelLg2} + + + + + Organismes responsables + #list(${indicator/publishers},'L1') + + + + + Propriétaire + ${indicator/creators} + + + + + Partenaires + #list(${indicator/contributors},'L1') + + + + + Succède à + ${indicator/replaces/labelLg1} + + + + Replaces + ${indicator/replaces/labelLg2} + + + + + Remplacé par + ${indicator/isReplacedBy/labelLg1} + + + + Replaced by + ${indicator/isReplacedBy/labelLg2} + + + + + Produit de + #list(${indicator/wasGeneratedBy/labelLg1},'L1') + + + + Produced from + #list(${indicator/wasGeneratedBy/labelLg2},'L1') + + + + + Séries ou Indicateurs liés + Séries: + #list(${indicator/seeAlso-series/labelLg1},'L1') + Indicateurs: + #list(${indicator/seeAlso-indicator/labelLg1},'L1') + + + + Series and indicators produced + Series: + #list(${indicator/seeAlso-series/labelLg2},'L1') + Indicators: + #list(${indicator/seeAlso-indicator/labelLg2},'L1') + + + + + + + + + + + Nom court + ${operation/altLabelLg1} + + + + Short name + ${operation/altLabelLg2} + + + + + Série parente + ${operation/series/labelLg1} + + + + Parent series + ${operation/series/labelLg2} + + + + Rapport qualité : ${sims/prefLabelLg1} + + + + + + + ${mas/idMas} - ${mas/masLabelLg1} + + + + + + + + + ${mas/idMas} - ${mas/masLabelLg1} + ${simsRubrics/labelLg1} + + + ${mas/idMas} - ${mas/masLabelLg2} + ${simsRubrics/labelLg2} + + + + + + + From 946cc283c56379c5864afb989adef2f9f1464136 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 26 Mar 2021 10:19:20 +0100 Subject: [PATCH 191/243] Prepare zip to odt --- pom.xml | 182 +++++++++--------- .../rmes/bauhaus_services/Constants.java | 6 + .../bauhaus_services/OperationsService.java | 2 +- .../concepts/ConceptsImpl.java | 4 +- .../operations/OperationsImpl.java | 20 +- .../documentations/DocumentationExport.java | 68 +++++-- .../DocumentationsRubricsUtils.java | 12 -- .../documentations/DocumentationsUtils.java | 4 +- .../keycloak/RmesKeycloakConfigResolver.java | 4 +- .../mail_sender/RmesMailSenderImpl.java | 4 +- .../utils/{FileUtils.java => FilesUtils.java} | 20 +- .../operations/MetadataReportResources.java | 24 +-- .../operations/OperationsResources.java | 2 +- .../xslTransformerFiles/labelPattern.zip | Bin 0 -> 16615 bytes .../xslTransformerFiles/toZipForLabel.zip | Bin 0 -> 13707 bytes .../toZipForLabel/META-INF/manifest.xml | 12 ++ .../toZipForLabel/Thumbnails/thumbnail.png | Bin 0 -> 5098 bytes .../toZipForLabel/layout-cache | Bin 0 -> 72 bytes .../toZipForLabel/manifest.rdf | 18 ++ .../toZipForLabel/meta.xml | 2 + .../toZipForLabel/mimetype | 1 + .../toZipForLabel/settings.xml | 2 + .../toZipForLabel/styles.xml | 2 + .../fr/insee/rmes/utils/FileUtilsTest.java | 4 +- 24 files changed, 246 insertions(+), 147 deletions(-) rename src/main/java/fr/insee/rmes/utils/{FileUtils.java => FilesUtils.java} (81%) create mode 100644 src/main/resources/xslTransformerFiles/labelPattern.zip create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel.zip create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/META-INF/manifest.xml create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/Thumbnails/thumbnail.png create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/layout-cache create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/manifest.rdf create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/meta.xml create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/mimetype create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/settings.xml create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/styles.xml diff --git a/pom.xml b/pom.xml index 5283aa9c3..016907cc0 100644 --- a/pom.xml +++ b/pom.xml @@ -46,21 +46,22 @@ 5.7.0 UTF-8 2.22.2 - + src/main/java/fr/insee/rmes/queries/**/*, src/main/java/fr/insee/rmes/modeles/**/* ${project.groupId}:${project.artifactId} jacoco jacoco - reuseReports - java - ${project.basedir}/../target/jacoco.exec - 0.8.5 + reuseReports + java + ${project.basedir}/../target/jacoco.exec + 0.8.5 3.7.0.1746 - -Xms256m -Xmx512m -XX:MaxPermSize=128m -ea -Dfile.encoding=UTF-8 - UTF-8 - + -Xms256m -Xmx512m -XX:MaxPermSize=128m -ea + -Dfile.encoding=UTF-8 + UTF-8 + @@ -82,7 +83,12 @@ jackson-dataformat-xml ${jackson.version} - + + org.zeroturnaround + zt-zip + 1.14 + jar + org.glassfish.jersey.containers jersey-container-servlet-core @@ -258,10 +264,10 @@ test - org.junit.jupiter - junit-jupiter-params + org.junit.jupiter + junit-jupiter-params ${junit.version} - test + test org.mockito @@ -449,8 +455,8 @@ jsoup 1.7.2 - - + + jaxen @@ -464,12 +470,12 @@ flexmark-all 0.50.42 - - + + - org.apache.commons - commons-text - 1.9 + org.apache.commons + commons-text + 1.9 @@ -494,9 +500,9 @@ 1.8 - - - + + + maven-surefire-plugin @@ -511,16 +517,16 @@ - + - org.sonarsource.scanner.maven - sonar-maven-plugin + org.sonarsource.scanner.maven + sonar-maven-plugin - + - org.jacoco + org.jacoco jacoco-maven-plugin @@ -532,81 +538,83 @@ jacoco-site test - report + report - + - - org.apache.maven.plugins - maven-surefire-plugin - ${maven-surefire-plugin.version} - - - junit:junit - UTF-8 - UTF-8 - UTF-8 - - - + + org.apache.maven.plugins + maven-surefire-plugin + ${maven-surefire-plugin.version} + + + junit:junit + UTF-8 + UTF-8 + UTF-8 + + + + + + + test + test + + test + + + false + + **/*Test.java + + UTF-8 + + + + + - - - test - test - - test - - - false - - **/*Test.java - - UTF-8 - - - - - - - org.sonarsource.scanner.maven - sonar-maven-plugin - ${version.maven-sonar} - - - - + org.sonarsource.scanner.maven + sonar-maven-plugin + ${version.maven-sonar} + + + + org.jacoco - jacoco-maven-plugin - ${version.maven-jacoco} - - - default-prepare-agent - - prepare-agent - - - - report - report - - report-aggregate - - - + jacoco-maven-plugin + ${version.maven-jacoco} + + + default-prepare-agent + + prepare-agent + + + + report + report + + report-aggregate + + + - + - + \ No newline at end of file diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 863254f68..1d95c0297 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -32,6 +32,11 @@ public class Constants { public static final String FAMILY = "family"; public static final String FLAT_ODT = "flatODT"; + /*G*/ + public static final String GOAL_COMITE_LABEL = "goalLabel"; + public static final String GOAL_RMES = "goalRmes"; + + /*H*/ public static final String HAS_DOC_LG1 = "hasDocLg1"; public static final String HAS_DOC_LG2 = "hasDocLg2"; @@ -101,6 +106,7 @@ public class Constants { public static final String WASGENERATEDBY = "wasGeneratedBy"; /*X*/ + public static final String XML = "xml"; public static final String XML_EMPTY_TAG = ""; public static final String XML_START_DOCUMENT = ""; public static final String XML_OPEN_CODELIST_TAG = ""; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index 5731e6e09..6bab11f32 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -145,7 +145,7 @@ public interface OperationsService { Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException; - Response exportMetadataReportForLabel(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException; + Response exportMetadataReportForLabel(String id) throws RmesException; Response exportTestMetadataReport() throws RmesException; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java index 7fb23d460..a650ccedc 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/concepts/ConceptsImpl.java @@ -32,7 +32,7 @@ import fr.insee.rmes.model.mail_sender.MailSenderContract; import fr.insee.rmes.persistance.sparql_queries.concepts.CollectionsQueries; import fr.insee.rmes.persistance.sparql_queries.concepts.ConceptsQueries; -import fr.insee.rmes.utils.FileUtils; +import fr.insee.rmes.utils.FilesUtils; @Service public class ConceptsImpl extends RdfService implements ConceptsService { @@ -239,7 +239,7 @@ public Response getConceptExport(String id, String acceptHeader) { return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); } InputStream is = jasper.exportConcept(concept, acceptHeader); - String fileName = FileUtils.cleanFileNameAndAddExtension(concept.getString(Constants.PREF_LABEL_LG1), jasper.getExtension(acceptHeader)) ; + String fileName = FilesUtils.cleanFileNameAndAddExtension(concept.getString(Constants.PREF_LABEL_LG1), jasper.getExtension(acceptHeader)) ; ContentDisposition content = ContentDisposition.type("attachment").fileName(fileName).build(); return Response.ok(is, acceptHeader) .header("Content-Disposition", content) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index adcb22663..db5d0ea0d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -25,6 +25,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.StreamUtils; +import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.OperationsService; import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationsUtils; import fr.insee.rmes.bauhaus_services.operations.documentations.MetadataStructureDefUtils; @@ -443,7 +444,7 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean File output; InputStream is; try { - output = documentationsUtils.exportMetadataReport(id,includeEmptyMas, lg1, lg2); + output = documentationsUtils.exportMetadataReport(id,includeEmptyMas, lg1, lg2,Constants.GOAL_RMES); is = new FileInputStream(output); } catch (Exception e1) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); @@ -453,6 +454,23 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean return Response.ok(is, "application/vnd.oasis.opendocument.text").header(CONTENT_DISPOSITION, content).build(); } + @Override + public Response exportMetadataReportForLabel(String id) throws RmesException { + + File output; + InputStream is; + try { + output = documentationsUtils.exportMetadataReport(id,true, true, false, Constants.GOAL_COMITE_LABEL); + is = new FileInputStream(output); + } catch (Exception e1) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); + } + String fileName = output.getName(); + ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); + return Response.ok(is, "application/vnd.oasis.opendocument.text").header(CONTENT_DISPOSITION, content).build(); + } + + public Response exportMetadataReportOld(String id) throws RmesException { File output; InputStream is; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 3d57b13b9..d3f4617d3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -10,6 +10,7 @@ import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import javax.xml.XMLConstants; @@ -29,6 +30,7 @@ import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.external_services.export.ExportUtils; +import fr.insee.rmes.utils.FilesUtils; import fr.insee.rmes.utils.XMLUtils; @Component @@ -63,23 +65,57 @@ public File testExport() throws IOException { return output; } +// public File callXsltEmportTransfo(String paramPath,String goal)throws RmesException, IOException { +// +// File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); +// output.deleteOnExit(); +// +// InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt.xsl"); +// OutputStream osOutputFile = FileUtils.openOutputStream(output); +// InputStream odtFile ; +// if(goal == Constants.GOAL_RMES){ +// odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); +// } +// if(goal == Constants.GOAL_COMITE_LABEL){ +// odtFile = getClass().getResourceAsStream("/xslTransformerFiles/labelPattern.fodt"); +// } +// PrintStream printStream= null; +// +// try{ +// // prepare transformer +// StreamSource xsrc = new StreamSource(xslFile); +// TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); +// transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); +// Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); +// } +// +// return null; +// +// } + public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, String organizationsXML, String codeListsXML, String targetType, - Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws RmesException, IOException { + Boolean includeEmptyMas, Boolean lg1, Boolean lg2, String goal) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXML = documentationsUtils.buildShellSims(); - String parametersXML = buildParams(lg1,lg2,includeEmptyMas,targetType); - - File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); - output.deleteOnExit(); - + File output = null; InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt.xsl"); - OutputStream osOutputFile = FileUtils.openOutputStream(output); - InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); + InputStream odtFile = null ; + if(goal == Constants.GOAL_RMES){ + odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); + output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); + } + if(goal == Constants.GOAL_COMITE_LABEL){ + odtFile = getClass().getResourceAsStream("/xslTransformerFiles/labelPatternContent.xml"); + output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.XML)); + } + OutputStream osOutputFile = FileUtils.openOutputStream(output); + output.deleteOnExit(); PrintStream printStream= null; + Path tempDir= Files.createTempDirectory("forExport"); try{ // prepare transformer @@ -89,7 +125,6 @@ public File export(String simsXML,String operationXML,String indicatorXML,String Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); // Pass parameters in a file - Path tempDir= Files.createTempDirectory("forExport"); addParameter ( xsltTransformer, "parametersFile", parametersXML,tempDir); addParameter ( xsltTransformer, "simsFile", simsXML,tempDir); addParameter ( xsltTransformer, "seriesFile", seriesXML,tempDir); @@ -103,6 +138,13 @@ public File export(String simsXML,String operationXML,String indicatorXML,String printStream = new PrintStream(osOutputFile); // transformation xsltTransformer.transform(new StreamSource(odtFile), new StreamResult(printStream)); + + //create odt + if(goal == Constants.GOAL_COMITE_LABEL){ + FilesUtils.addFileToZipFolder(output,new File("/xslTransformerFiles/toZipForLabel.zip")); + FileUtils.copyFile(new File("/xslTransformerFiles/toZipForLabel.zip"), output); + Files.move(output.toPath(), tempDir.resolve(Paths.get("export.odt")), StandardCopyOption.REPLACE_EXISTING); + } } catch (TransformerException e) { logger.error(e.getMessage()); } finally { @@ -112,7 +154,11 @@ public File export(String simsXML,String operationXML,String indicatorXML,String printStream.close(); } logger.debug("End To export documentation"); - return(output); + + if(goal == Constants.GOAL_RMES){ + return(output); + } + return (new File(tempDir.toString(),"export.odt")); } private String buildParams(Boolean lg1, Boolean lg2, Boolean includeEmptyMas, String targetType) { @@ -142,7 +188,7 @@ private String buildParams(Boolean lg1, Boolean lg2, Boolean includeEmptyMas, St private void addParameter (Transformer xsltTransformer, String paramName, String paramData, Path tempDir) throws IOException { // Pass parameters in a file CopyOption[] options = { StandardCopyOption.REPLACE_EXISTING }; - Path tempFile = Files.createTempFile(tempDir, paramName,Constants.DOT_XML); + Path tempFile = Files.createTempFile(tempDir, paramName, Constants.DOT_XML); String absolutePath = tempFile.toFile().getAbsolutePath(); InputStream is = IOUtils.toInputStream(paramData, StandardCharsets.UTF_8); Files.copy(is, tempFile, options); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java index dba2f9a64..d8eab4d80 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java @@ -378,18 +378,6 @@ private String solveSpecialXmlcharacters(String rubric) { final Pattern pattern3 = Pattern.compile(regex3, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); ret = pattern3.matcher(ret).replaceAll(Constants.XML_SUP_REPLACEMENT); -// final String regex4 = "&amp;"; -// final Pattern pattern4 = Pattern.compile(regex4, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); -// ret = pattern4.matcher(ret).replaceAll("&"); -// -// final String regex5 = "&gt;"; -// final Pattern pattern5 = Pattern.compile(regex5, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); -// ret = pattern5.matcher(ret).replaceAll(">"); -// -// final String regex6 = "&lt;"; -// final Pattern pattern6 = Pattern.compile(regex6, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); -// ret = pattern6.matcher(ret).replaceAll("<"); - return new String(ret.getBytes(), StandardCharsets.UTF_8); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 02185406b..44daa1401 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -520,7 +520,7 @@ public File exportTestMetadataReport() throws IOException { return docExport.testExport(); } - public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2) throws IOException, RmesException { + public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2, String goal) throws IOException, RmesException { String emptyXML=XMLUtils.produceEmptyXML(); Operation operation; @@ -588,7 +588,7 @@ public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1 codeListsXML=codeListsXML.concat(Constants.XML_END_CODELIST_TAG); return docExport.export(simsXML,operationXML,indicatorXML,seriesXML, - organizationsXML,codeListsXML,targetType,includeEmptyMas,lg1,lg2); + organizationsXML,codeListsXML,targetType,includeEmptyMas,lg1,lg2,goal); } public File exportMetadataReportOld(String id) throws IOException, RmesException { diff --git a/src/main/java/fr/insee/rmes/config/auth/security/keycloak/RmesKeycloakConfigResolver.java b/src/main/java/fr/insee/rmes/config/auth/security/keycloak/RmesKeycloakConfigResolver.java index a1cde9196..480e1597e 100644 --- a/src/main/java/fr/insee/rmes/config/auth/security/keycloak/RmesKeycloakConfigResolver.java +++ b/src/main/java/fr/insee/rmes/config/auth/security/keycloak/RmesKeycloakConfigResolver.java @@ -8,7 +8,7 @@ import org.keycloak.adapters.KeycloakDeploymentBuilder; import org.keycloak.adapters.OIDCHttpFacade; -import fr.insee.rmes.utils.FileUtils; +import fr.insee.rmes.utils.FilesUtils; public class RmesKeycloakConfigResolver implements KeycloakConfigResolver { @@ -37,7 +37,7 @@ public KeycloakDeployment resolve(OIDCHttpFacade.Request request) { private InputStream updateInputStreamIfFileExists(InputStream is, String url) { File f = new File(url); if(f.exists() && !f.isDirectory()) { - is = FileUtils.fileToIS(f); + is = FilesUtils.fileToIS(f); } return is; } diff --git a/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java b/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java index dd4dc3bea..df36dd7a8 100644 --- a/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java +++ b/src/main/java/fr/insee/rmes/external_services/mail_sender/RmesMailSenderImpl.java @@ -37,7 +37,7 @@ import fr.insee.rmes.external_services.mail_sender.SendRequest.Recipients; import fr.insee.rmes.model.mail_sender.Mail; import fr.insee.rmes.model.mail_sender.MailSenderContract; -import fr.insee.rmes.utils.FileUtils; +import fr.insee.rmes.utils.FilesUtils; @Service public class RmesMailSenderImpl implements MailSenderContract { @@ -78,7 +78,7 @@ public boolean sendMailCollection(String id, String body) throws RmesException private boolean sendMail(Mail mail, InputStream is, JSONObject json) { String fileName = json.getString(Constants.PREF_LABEL_LG1); - fileName = FileUtils.cleanFileNameAndAddExtension(fileName,"odt"); + fileName = FilesUtils.cleanFileNameAndAddExtension(fileName,"odt"); MessageTemplate messagetemplate = new MessageTemplate(); diff --git a/src/main/java/fr/insee/rmes/utils/FileUtils.java b/src/main/java/fr/insee/rmes/utils/FilesUtils.java similarity index 81% rename from src/main/java/fr/insee/rmes/utils/FileUtils.java rename to src/main/java/fr/insee/rmes/utils/FilesUtils.java index f883b4f57..ec63951a2 100644 --- a/src/main/java/fr/insee/rmes/utils/FileUtils.java +++ b/src/main/java/fr/insee/rmes/utils/FilesUtils.java @@ -20,10 +20,11 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.zeroturnaround.zip.ZipUtil; -public class FileUtils { +public class FilesUtils { - private static final Logger log = LoggerFactory.getLogger(FileUtils.class); + private static final Logger log = LoggerFactory.getLogger(FilesUtils.class); public static InputStream fileToIS(File file) { InputStream is = null; @@ -43,7 +44,7 @@ public static File streamToFile(InputStream in, String fileName, String fileExte } return tempFile; } - + public static String cleanFileNameAndAddExtension(String fileName, String extension) { fileName = fileName.toLowerCase().trim(); fileName = StringUtils.normalizeSpace(fileName); @@ -78,8 +79,19 @@ public static File zipFile(File inputFile) throws IOException { finally { if (zipfs != null) zipfs.close();} } + public static void zipFolder(String folderToZip, String zipName) throws IOException { + ZipUtil.pack(new File("D:\\reports\\january\\"), new File("D:\\reports\\january.zip")); + } + + public static void addFileToZipFolder(File fileToAdd, File zipArchive) { + ZipUtil.packEntry(fileToAdd, zipArchive); + } + + public static void renameFile(Path filePath, String newName, Path newFolder) { + + } - private FileUtils() { + private FilesUtils() { throw new IllegalStateException("Utility class"); } diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index 33a05f8bf..92a04944c 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -289,6 +289,7 @@ public Response setSimsValidation( /** * EXPORT * @param id + * @param lg1 * @param lg2 * @param includeEmptyMas * @return response @@ -324,36 +325,19 @@ public Response getSimsExport(@Parameter( /** * EXPORTFORLABEL * @param id - * @param lg2 - * @param includeEmptyMas * @return response */ @GET - @Path("/metadataReport/export/label/{id}/{emptyMas}/{lg1}/{lg2}") + @Path("/metadataReport/export/label/{id}") @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) - @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") + @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report for label comitee") public Response getSimsLabelExport(@Parameter( description = "Identifiant de la documentation (format : [0-9]{4})", required = true, schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id - , - @Parameter( - description = "Inclure les champs vides", - required = false) @QueryParam("emptyMas") Boolean includeEmptyMas - , - @Parameter( - description = "Version française", - required = false) @QueryParam("lg1") Boolean lg1 - , - @Parameter( - description = "Version anglaise", - required = false) @QueryParam("lg2") Boolean lg2 ) throws RmesException { - if (includeEmptyMas==null) {includeEmptyMas=true;} - if (lg1==null) {lg1=true;} - if (lg2==null) {lg2=true;} - return operationsService.exportMetadataReportForLabel(id,includeEmptyMas,lg1,lg2); + return operationsService.exportMetadataReportForLabel(id); } diff --git a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java index 62e437032..504d7ab05 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java @@ -96,7 +96,7 @@ public Response getCodeBook( @HeaderParam("Accept") String acceptHeader, @Parameter(schema = @Schema(type = "string", format = "binary", description = "file 2")) @FormDataParam(value = "dicoVar") InputStream isCodeBook) throws IOException, RmesException { String ddi = IOUtils.toString(isDDI, StandardCharsets.UTF_8); - File codeBookFile = fr.insee.rmes.utils.FileUtils.streamToFile(isCodeBook, "dicoVar",".odt"); + File codeBookFile = fr.insee.rmes.utils.FilesUtils.streamToFile(isCodeBook, "dicoVar",".odt"); return operationsService.getCodeBookExport(ddi,codeBookFile, acceptHeader); } diff --git a/src/main/resources/xslTransformerFiles/labelPattern.zip b/src/main/resources/xslTransformerFiles/labelPattern.zip new file mode 100644 index 0000000000000000000000000000000000000000..15eee58a877caf15cc4b5cae8e0be4b2e358dd11 GIT binary patch literal 16615 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 y2!9$Z&R$ literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel.zip b/src/main/resources/xslTransformerFiles/toZipForLabel.zip new file mode 100644 index 0000000000000000000000000000000000000000..0eece7e73c947a7371650abfa27d6ddb3ea77537 GIT binary patch literal 13707 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/META-INF/manifest.xml b/src/main/resources/xslTransformerFiles/toZipForLabel/META-INF/manifest.xml new file mode 100644 index 000000000..373e8f670 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForLabel/META-INF/manifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/Thumbnails/thumbnail.png b/src/main/resources/xslTransformerFiles/toZipForLabel/Thumbnails/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..af1d5b8333e19e0f35e38d223d0b07769b1c12e3 GIT binary patch literal 5098 zcmc(jS2!CE)W)?oElN?VN~tPhlPE<|C040DYyOSUAVF-kN7df5M(x#DL8`>AP0ZMP zkJ#nw{rBB}H|KYr_c_mb-mCZGjnL9ien`PgK|nz8Q02X%_CF#C2<{P(5&qkL|LxxT z2U9Jzk4mhptel*j002NtOiWr@T0ubp3lpdb#*8d>esJd0|NuY!^89Q^BWr*2L}h|=jV5KcmLl1n~g4AhXe$4 z?^P7#KYGsWnNViT0>2KZIjQ*E^9hh?XgI&~-=KeKSbx(qJnimsW?V{V9MA1x2nf<8 z7+<(OkcD1KXi<+7;^k!i7hLjgcN&auM*^ip){K7GRzk?NsVS|7<|{SLZi@+FQr?bZ z(@J#ZAL}<3Bk^)BGIcQv75tTp6P+*a-u%FHZVgo%pl+b~h*!n3x9%H-dRCjehgMss z%9&`*VjJ5_h!!^FE;D%ylzO7Q?KHT-3*adkJie6HT-fjt>74>iVgA0sGKZ;L7gJkQ zk3$^It*1q%5W%7@2(&5)i1vk6k$pxHA zlla;rr@J_xx(S?`rlv||H@n}DFb>eOKFlvxVCc6;OAci6z;|@d_0M({+!KS&d6lHO z*;Ccl-h1(K0qMJIV)<7^E}uN;9*EQ7i0qW2OQfa!`o4WhKiGhm$O@!L6$r_-Qd}E# ztKf~&6s-;sT0wsg+MxYHnf!xf73EG9ZmKD=flmv~r{V+mm8 zx1-pS#-=MA(^`3t)YN^9#LTA3jcBF*{te>czihy8c13*v@~jug=H-PGD+}XV$>8g$NAIE;KZBrs zBFek=*ZSj4FE=~cWw6cr(1Tkj_mz!tJ)8Ff>31D6Qn*kRP$t|nWp?3+PPDmf*{9v^ zp-Po~=S0-9Z#y@}7M@oin8cwcrIlg;{uU7UC|9uu72n$aL}c(a`eK@R1^rP5hM}ph z-TrLL864NiWuV~nKA4y=^Yi5+MWNHA6i+A3yo%-@nNDSojXmWKr_M+o)K9@}=T(|T zonAlBu5N(X$ONC7PKI|Xo|k_7r}l4HQv`k+ zSEwjByqXT^Gil^9`5NpJm{9fPmN+iDPV<=M5V58mBQ?#>V6HC`K5Frddg zV0Lg!GQ`|2Fy=hp!&O#cF{ahf6IPAr8hc213Rw$X(}KkdZi=g+$M;# zypKP+=eFwHbKc#ug+>kV;1u5;)GM#l6YJ&cF&MXg9iczt(d}6JZ6drEfm4@u9!TyG zDs^3w;lEemlLC_{C6mKyUXOwAkW|{AmE<3?Jd4gN#sF3y5zCCFWrpF-ib!0R=8g)z z*)a$>NhwZVl@P!aWEmJho)C4%T;(WOW!i~Wy%qZsMAeeK)@k8kYmD>t2OSOOQjSL03JG{X@-VTh&;)J) zp+4CeKA{mHSwcJLPDKIr?BZqn{F8; zPkA3V1CbYLLWB!*P)c2>T2Dv=Z7`QF)`-itmgxtYj^Dnty(UiXo8}9#xQE`9`o>PD za@zvI5yh56_ml49_q_B@wiPNnH-t7Ur>!^Q`xsIwf>dJv3^KsN4fU(DGMdzPWN(I) z^eN8G9Dz8aL+azlqhb<6uhKG9V}x33EHvbt#<6eR+Nv8Gk1<6>2pV;Y9S*W=Vn+6N z_gf-MyA`t_@uAJ_M4nEO`6L;S*S{JuJ6x3|V5#dmg=am652?5BN`tf4?&qYEfYKeB z{PV7jW+ix-gIJ#7uMl1~f&Y!}q>tk*B`+fRO7(d;Ixm7cs!Q8dsqdBGXI}ytyNg)Y zL`?(B<7BMF5ErIIJFAOcd2U}`r1_9NNp}ts3aqsie@Mk2Ci^**PK=TY38 z?Vh3S8d9ii_D|!sfQWou?fMXnYZF64q@d6P6;V=Rw7s%${B)~tmZ^x$l1ZW3Y7hRC&awqwjt#EQSzpFA!rsI?ld+pBp-+X*) zy#E1zW z7dW`xaSi!&o_L_!z#c7n4U}<1G-qXx4Z@i0sc!N!E}|$rD&Z$aLQ|zF(j%_fEET^9_cO5rJHwQR

    Gyja9MX)z$ZDN9ej;013!#WBBZ{+|?&UeS;q3P^ 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 I-&zFy4@(vqr~m)} literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/layout-cache b/src/main/resources/xslTransformerFiles/toZipForLabel/layout-cache new file mode 100644 index 0000000000000000000000000000000000000000..5245bebe255187b5bc12a67f0c9898ea924b5d0a GIT binary patch literal 72 ocmZQ%U}Pw8VPIeg;ACK6QGhY5VT>>sqY%a@hcUWgjEO)70L*p;_W%F@ literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/manifest.rdf b/src/main/resources/xslTransformerFiles/toZipForLabel/manifest.rdf new file mode 100644 index 000000000..927e206bb --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForLabel/manifest.rdf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/meta.xml b/src/main/resources/xslTransformerFiles/toZipForLabel/meta.xml new file mode 100644 index 000000000..58001e16b --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForLabel/meta.xml @@ -0,0 +1,2 @@ + +François Bulot2021-02-26T15:29:35.5330000002021-03-01T14:48:24.350000000François BulotPT28M19S7LibreOffice/6.4.6.2$Windows_X86_64 LibreOffice_project/0ce51a4fd21bff07a5c061082cc82c5ed232f115 \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/mimetype b/src/main/resources/xslTransformerFiles/toZipForLabel/mimetype new file mode 100644 index 000000000..2e95b81c9 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForLabel/mimetype @@ -0,0 +1 @@ +application/vnd.oasis.opendocument.text \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/settings.xml b/src/main/resources/xslTransformerFiles/toZipForLabel/settings.xml new file mode 100644 index 000000000..5f0eb9e35 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForLabel/settings.xml @@ -0,0 +1,2 @@ + +004207121142truefalseview212534292500420692114001false100falsefalsefalse1truefalsefalsetruefalsetruefalsetruetruetruefalsefalse0truefalsetruefalsefalse0falsetruefalsefalsefalsefalsehigh-resolutionfalsefalsetruefalsefalsefalsefalsetruefalsetruefalsefalsefalsefalsefalsefalse1620460falsefalsefalsefalsetrue2305386falsefalsetruefalsetruetruefalsefalsetruetruetruefalsefalsetruetruetruefalsefalsefalsetrue0truefalsefalsetruetruetruefalsetruefalsetruefalsefalsetruefalsetrue \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/styles.xml b/src/main/resources/xslTransformerFiles/toZipForLabel/styles.xml new file mode 100644 index 000000000..755b20147 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForLabel/styles.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/test/java/fr/insee/rmes/utils/FileUtilsTest.java b/src/test/java/fr/insee/rmes/utils/FileUtilsTest.java index 1f2b30d2b..af2381b91 100644 --- a/src/test/java/fr/insee/rmes/utils/FileUtilsTest.java +++ b/src/test/java/fr/insee/rmes/utils/FileUtilsTest.java @@ -14,14 +14,14 @@ class FileUtilsTest { @ValueSource(strings = { "Carrières complètes ", "carrières-complètes", " Carrières complètes " }) void givenCleanFileName_whenString_thenResponseIsClean(String name) throws RmesException { - String cleanFileName = FileUtils.cleanFileNameAndAddExtension(name, "odt"); + String cleanFileName = FilesUtils.cleanFileNameAndAddExtension(name, "odt"); assertEquals("carrières-complètes.odt", cleanFileName); } @Test void givenCleanFileName_whenStringWithPointExtension_thenResponseIsClean() throws RmesException { - String cleanFileName = FileUtils.cleanFileNameAndAddExtension("test de nommage bidon ", ".odt"); + String cleanFileName = FilesUtils.cleanFileNameAndAddExtension("test de nommage bidon ", ".odt"); assertEquals("test-de-nommage-bidon.odt", cleanFileName); } From af78bac98f1c9d29bce528e6127160e33f1f41b6 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Sat, 27 Mar 2021 13:55:44 +0100 Subject: [PATCH 192/243] feat: solve issue with Structure --- .../ConsultationGestionServiceImpl.java | 2 +- .../utils/ComponentPublication.java | 2 +- .../utils/StructurePublication.java | 31 ++++++++++++------- .../structures/utils/StructureUtils.java | 4 +-- .../consultation-gestion/getCodesList.ftlh | 10 +++--- .../getStructureComponents.ftlh | 5 +-- 6 files changed, 31 insertions(+), 23 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java index 9b04b3472..c11efc767 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java @@ -163,7 +163,7 @@ private void getStructureComponents(String id, JSONObject structure) throws Rmes if(component.has("representation")){ if(component.getString("representation").endsWith("date")){ component.put("representation", "date"); - } else if(component.getString("representation").endsWith("integer")){ + } else if(component.getString("representation").endsWith("int")){ component.put("representation", "entier"); } else if(component.getString("representation").endsWith("float")){ component.put("representation", "décimal"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java index 5b6df833a..5d825695b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java @@ -33,7 +33,7 @@ public void publishComponent(Resource component, IRI type) throws RmesException while (statements.hasNext()) { Statement st = statements.next(); String pred = ((SimpleIRI) st.getPredicate()).toString(); - if (pred.endsWith("validationState")) { + if (pred.endsWith("validationState") || pred.endsWith(Constants.CONTRIBUTOR) || pred.endsWith(Constants.CREATOR)) { // nothing, wouldn't copy this attr }else if (pred.endsWith("attribute") || pred.endsWith("dimension") diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java index 692509804..77be15eba 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java @@ -17,31 +17,32 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; import fr.insee.rmes.exceptions.RmesException; +import java.util.Arrays; + @Repository public class StructurePublication extends RdfService { - public void publish(Resource structure) throws RmesException { - - Model model = new LinkedHashModel(); - //TODO notify... - RepositoryConnection con = repoGestion.getConnection(); + + private void copyTriplet(Resource structure, Model model, RepositoryConnection con, String[] denyList) throws RmesException { RepositoryResult statements = repoGestion.getStatements(con, structure); - try { + try { try { + while (statements.hasNext()) { Statement st = statements.next(); String pred = ((SimpleIRI) st.getPredicate()).toString(); - - if (pred.endsWith("validationState")) { + boolean result = Arrays.stream(denyList).anyMatch(entry -> pred.endsWith(entry)); + if (Arrays.stream(denyList).anyMatch(entry -> pred.endsWith(entry))) { // nothing, wouldn't copy this attr - } if(pred.endsWith("component")){ + boolean r = result; + } else if(pred.endsWith("component")){ model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), st.getContext()); - publish((Resource) st.getObject()); + copyTriplet((Resource) st.getObject(), model, con, new String[]{"identifier", "created", "modified"}); } else if(pred.endsWith("attribute") || pred.endsWith("measure") || pred.endsWith("dimension")){ model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), @@ -59,10 +60,18 @@ public void publish(Resource structure) throws RmesException { } catch (RepositoryException e) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), Constants.REPOSITORY_EXCEPTION); } - + } finally { repoGestion.closeStatements(statements); } + } + + public void publish(Resource structure) throws RmesException { + + Model model = new LinkedHashModel(); + RepositoryConnection con = repoGestion.getConnection(); + + this.copyTriplet(structure, model, con, new String[]{"validationState", Constants.CREATOR, Constants.CONTRIBUTOR}); Resource componentToPublishRessource = PublicationUtils.tranformBaseURIToPublish(structure); RepositoryPublication.publishResource(componentToPublishRessource, model, "Structure"); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index 3295bdbaa..a436fb0e7 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -272,9 +272,7 @@ public void createRdfComponentSpecifications(Structure structure, IRI structureI componentDefinition.setCreated(DateUtils.getCurrentDate()); } componentDefinition.setModified(DateUtils.getCurrentDate()); - if (componentDefinition.getId() == null) { - componentDefinition.setId("cs" + (1000 + i) ); - } + componentDefinition.setId("cs" + (1000 + i) ); createRdfComponentSpecification(structureIRI, model, componentDefinition, graph); } } diff --git a/src/main/resources/request/consultation-gestion/getCodesList.ftlh b/src/main/resources/request/consultation-gestion/getCodesList.ftlh index 99ec37871..e77faf4f6 100644 --- a/src/main/resources/request/consultation-gestion/getCodesList.ftlh +++ b/src/main/resources/request/consultation-gestion/getCodesList.ftlh @@ -3,13 +3,13 @@ FROM <${CODELIST_GRAPH}> WHERE { ?uri rdf:type skos:ConceptScheme . ?uri skos:notation "${NOTATION}" . - BIND("CL_FREQ" AS ?notation) . + BIND("${NOTATION}" AS ?notation) . ?uri skos:prefLabel ?prefLabelLg1 . FILTER (lang(?prefLabelLg1) = '${LG1}') . ?uri skos:prefLabel ?prefLabelLg2 . FILTER (lang(?prefLabelLg2) = '${LG2}') . - OPTIONAL {?listeCode dcterms:created ?dateCréation . } - OPTIONAL {?listeCode dcterms:modified ?dateMiseAJour . } - OPTIONAL {?listeCode dcterms:valid ?dateFinValidité . } - OPTIONAL {?listeCode insee:validationState ?statutValidation . } + OPTIONAL {?uri dcterms:created ?dateCréation . } + OPTIONAL {?uri dcterms:modified ?dateMiseAJour . } + OPTIONAL {?uri dcterms:valid ?dateFinValidité . } + OPTIONAL {?uri insee:validationState ?statutValidation . } } \ No newline at end of file diff --git a/src/main/resources/request/consultation-gestion/getStructureComponents.ftlh b/src/main/resources/request/consultation-gestion/getStructureComponents.ftlh index 619336d4f..65eafb346 100644 --- a/src/main/resources/request/consultation-gestion/getStructureComponents.ftlh +++ b/src/main/resources/request/consultation-gestion/getStructureComponents.ftlh @@ -1,4 +1,4 @@ -SELECT ?uri ?id ?notation ?prefLabelLg1 ?prefLabelLg2 ?concept ?representation ?listeCode ?ordre +SELECT ?uri ?id ?notation ?prefLabelLg1 ?prefLabelLg2 ?concept ?representation ?listeCode ?ordre ?attachement ?obligatoire FROM <${STRUCTURES_GRAPH}> FROM <${STRUCTURES_COMPONENTS_GRAPH}> WHERE { @@ -16,5 +16,6 @@ WHERE { OPTIONAL { ?uri rdfs:range ?representation . } OPTIONAL { ?uri qb:codeList ?listeCode . } OPTIONAL { ?uriComponentSpecification qb:order ?ordre . } - + OPTIONAL {?uriComponentSpecification qb:componentAttachment ?attachement . } + OPTIONAL {?uriComponentSpecification qb:componentRequired ?obligatoire . } } \ No newline at end of file From fbb0629f1b7a83259a14d990eea8143a975cca4d Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 29 Mar 2021 12:20:37 +0200 Subject: [PATCH 193/243] fix: solve query to fetch links for a concept --- .../request/concepts/getConceptLinksById.ftlh | 73 ++++++++++--------- 1 file changed, 37 insertions(+), 36 deletions(-) diff --git a/src/main/resources/request/concepts/getConceptLinksById.ftlh b/src/main/resources/request/concepts/getConceptLinksById.ftlh index ff148786e..64172864c 100644 --- a/src/main/resources/request/concepts/getConceptLinksById.ftlh +++ b/src/main/resources/request/concepts/getConceptLinksById.ftlh @@ -1,48 +1,49 @@ SELECT ?id ?typeOfLink ?prefLabelLg1 ?prefLabelLg2 ?urn WHERE { - GRAPH <${CONCEPTS_GRAPH} > { + GRAPH <${CONCEPTS_GRAPH}> { ?concept rdf:type skos:Concept . - FILTER(REGEX(STR(?concept),'/concepts/definition/${ID_CONCEPT}')) . - + FILTER(REGEX(STR(?concept),'/concepts/definition/${ID_CONCEPT}')) . { - ?concept skos:narrower ?conceptlinked . - BIND('narrower' AS ?typeOfLink) - } - UNION - { - ?concept skos:broader ?conceptlinked . - BIND('broader' AS ?typeOfLink) - } - UNION - { - ?concept dcterms:references ?conceptlinked . - BIND('references' AS ?typeOfLink) - } - UNION - { - ?concept dcterms:replaces ?conceptlinked . - BIND('succeed' AS ?typeOfLink) - } - UNION - { - ?concept skos:related ?conceptlinked . - BIND('related' AS ?typeOfLink) - } + { + ?concept skos:narrower ?conceptlinked . + BIND('narrower' AS ?typeOfLink) . + } + UNION + { + ?concept skos:broader ?conceptlinked . + BIND('broader' AS ?typeOfLink) + } + UNION + { + ?concept dcterms:references ?conceptlinked . + BIND('references' AS ?typeOfLink) + } + UNION + { + ?concept dcterms:replaces ?conceptlinked . + BIND('succeed' AS ?typeOfLink) + } + UNION + { + ?concept skos:related ?conceptlinked . + BIND('related' AS ?typeOfLink) + } + OPTIONAL{ + ?conceptlinked skos:prefLabel ?prefLabelLg1 . + FILTER (lang(?prefLabelLg1) = '${LG1}') + } . + OPTIONAL { + ?conceptlinked skos:prefLabel ?prefLabelLg2 . + FILTER (lang(?prefLabelLg2) = '${LG2}') + } . + +} UNION { ?concept skos:closeMatch ?urn . BIND('closeMatch' AS ?typeOfLink) - } - - OPTIONAL{ - ?conceptlinked skos:prefLabel ?prefLabelLg1 . - FILTER (lang(?prefLabelLg1) = '${LG1}') - } . - OPTIONAL { - ?conceptlinked skos:prefLabel ?prefLabelLg2 . - FILTER (lang(?prefLabelLg2) = '${LG2}') - } . + } BIND(STRAFTER(STR(?conceptlinked),'/definition/') AS ?id) . } } From ee07f095d132addf5e0344afcf5db376511bbadd Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 29 Mar 2021 13:37:44 +0200 Subject: [PATCH 194/243] feat: last change when publishing a component --- .../structures/utils/ComponentPublication.java | 3 ++- .../structures/utils/StructureComponentUtils.java | 15 ++++++++++++--- .../structures/StructureQueries.java | 10 ++++++++-- .../request/structures/getUriClasseOwl.ftlh | 6 ++++++ 4 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 src/main/resources/request/structures/getUriClasseOwl.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java index 5d825695b..83511fff7 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/ComponentPublication.java @@ -39,7 +39,8 @@ public void publishComponent(Resource component, IRI type) throws RmesException || pred.endsWith("dimension") || pred.endsWith("measure") || pred.endsWith("codeList") - || pred.endsWith("concept")) { + || pred.endsWith("concept") + || pred.endsWith("range")) { model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), st.getContext()); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 4c215d2ac..51e3e1d57 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -5,6 +5,7 @@ import javax.ws.rs.BadRequestException; +import fr.insee.rmes.bauhaus_services.structures.StructureComponent; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -177,7 +178,15 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou } if (component.getRange() != null && component.getRange().equals(((SimpleIRI)INSEE.CODELIST).toString())) { - RdfUtils.addTripleUri(componentURI, RDFS.RANGE, Config.CODE_LIST_BASE_URI + "/" + component.getCodeList() + "/Class", model, graph); + RdfUtils.addTripleUri(componentURI, RDF.TYPE, QB.CODED_PROPERTY, model, graph); + + JSONObject object = repoGestion.getResponseAsObject(StructureQueries.getUriClasseOwl(component.getCodeList())); + + if(object.has("uriClasseOwl")){ + RdfUtils.addTripleUri(componentURI, RDFS.RANGE, object.getString("uriClasseOwl"), model, graph); + } else { + RdfUtils.addTripleUri(componentURI, RDFS.RANGE, SKOS.CONCEPT, model, graph); + } } else { RdfUtils.addTripleUri(componentURI, RDFS.RANGE, component.getRange(), model, graph); } @@ -290,12 +299,12 @@ public String publishComponent(JSONObject component) throws RmesException { throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_VALIDATED_CONCEPT, "The concept should be validated", new JSONArray()); } } - +/* if(!component.isNull("codeList") && !"".equals(component.getString("codeList"))){ if(!repoGestion.getResponseAsBoolean(CodeListQueries.isCodesListValidated(component.getString("codeList")))){ throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_VALIDATED_CODESLIST, "The codes list should be validated", new JSONArray()); } - } + }*/ MutualizedComponent mutualizedComponent; diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java index 456fcbdea..780265e46 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/structures/StructureQueries.java @@ -100,6 +100,14 @@ public static String getUnValidatedComponent(String structureById) throws RmesEx return buildRequest("getUnValidatedComponent.ftlh", params); } + public static String getUriClasseOwl(String codeList) throws RmesException { + HashMap params = initParams(); + params.put("CODES_LISTS_GRAPH", Config.CODELIST_GRAPH); + params.put("CODES_LIST", codeList); + + return buildRequest("getUriClasseOwl.ftlh", params); + } + private static String buildRequest(String fileName, HashMap params) throws RmesException { return FreeMarkerUtils.buildRequest("structures/", fileName, params); } @@ -113,6 +121,4 @@ private static HashMap initParams() { return params; } - - } \ No newline at end of file diff --git a/src/main/resources/request/structures/getUriClasseOwl.ftlh b/src/main/resources/request/structures/getUriClasseOwl.ftlh new file mode 100644 index 000000000..39553a83d --- /dev/null +++ b/src/main/resources/request/structures/getUriClasseOwl.ftlh @@ -0,0 +1,6 @@ +SELECT DISTINCT ?uriClasseOwl +FROM <${CODES_LISTS_GRAPH}> +WHERE { + ?uriClasseOWL rdf:type owl:Class . + ?uriClasseOwl rdfs:seeAlso <${CODES_LIST}> . +} \ No newline at end of file From bb3f52cc269ac62bf65aa4c150831e16606419d5 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 29 Mar 2021 13:39:37 +0200 Subject: [PATCH 195/243] feat: uncomment comments --- .../structures/utils/StructureComponentUtils.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index 51e3e1d57..c3b608d68 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -299,12 +299,12 @@ public String publishComponent(JSONObject component) throws RmesException { throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_VALIDATED_CONCEPT, "The concept should be validated", new JSONArray()); } } -/* + if(!component.isNull("codeList") && !"".equals(component.getString("codeList"))){ if(!repoGestion.getResponseAsBoolean(CodeListQueries.isCodesListValidated(component.getString("codeList")))){ throw new RmesUnauthorizedException(ErrorCodes.COMPONENT_PUBLICATION_VALIDATED_CODESLIST, "The codes list should be validated", new JSONArray()); } - }*/ + } MutualizedComponent mutualizedComponent; From 2bfd800df9e939aa849cf0ee55d5c972de708f43 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 30 Mar 2021 16:09:49 +0200 Subject: [PATCH 196/243] Fix issue with warning abstract class couldnt be instantiate --- ...tionsAbstResources.java => OperationsCommonResources.java} | 4 ++-- .../fr/insee/rmes/webservice/operations/FamilyResources.java | 4 ++-- .../insee/rmes/webservice/operations/IndicatorsResources.java | 4 ++-- .../rmes/webservice/operations/MetadataReportResources.java | 4 ++-- .../insee/rmes/webservice/operations/OperationsResources.java | 4 ++-- .../fr/insee/rmes/webservice/operations/SeriesResources.java | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) rename src/main/java/fr/insee/rmes/webservice/{OperationsAbstResources.java => OperationsCommonResources.java} (95%) diff --git a/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java b/src/main/java/fr/insee/rmes/webservice/OperationsCommonResources.java similarity index 95% rename from src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java rename to src/main/java/fr/insee/rmes/webservice/OperationsCommonResources.java index 2cb379574..fdb012598 100644 --- a/src/main/java/fr/insee/rmes/webservice/OperationsAbstResources.java +++ b/src/main/java/fr/insee/rmes/webservice/OperationsCommonResources.java @@ -26,9 +26,9 @@ @ApiResponse(responseCode = "404", description = "Not found"), @ApiResponse(responseCode = "406", description = "Not Acceptable"), @ApiResponse(responseCode = "500", description = "Internal server error") }) -public abstract class OperationsAbstResources { +public class OperationsCommonResources { - protected static final Logger logger = LogManager.getLogger(OperationsAbstResources.class); + protected static final Logger logger = LogManager.getLogger(OperationsCommonResources.class); @Autowired protected OperationsService operationsService; diff --git a/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java b/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java index 5debf7ccc..d5379e8a0 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/FamilyResources.java @@ -21,7 +21,7 @@ import fr.insee.rmes.config.swagger.model.IdLabel; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.model.operations.Family; -import fr.insee.rmes.webservice.OperationsAbstResources; +import fr.insee.rmes.webservice.OperationsCommonResources; import io.swagger.v3.oas.annotations.media.ArraySchema; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -34,7 +34,7 @@ @Component @Qualifier("Family") @Path("/operations") -public class FamilyResources extends OperationsAbstResources { +public class FamilyResources extends OperationsCommonResources { @GET @Path("/families") diff --git a/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java index 921c7df63..6eb5cf835 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/IndicatorsResources.java @@ -24,7 +24,7 @@ import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.model.operations.Indicator; import fr.insee.rmes.utils.XMLUtils; -import fr.insee.rmes.webservice.OperationsAbstResources; +import fr.insee.rmes.webservice.OperationsCommonResources; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -35,7 +35,7 @@ @Component @Qualifier("Indicator") @Path("/operations") -public class IndicatorsResources extends OperationsAbstResources { +public class IndicatorsResources extends OperationsCommonResources { /*************************************************************************************************** diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index 8f03b0df0..d52decb9a 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -30,7 +30,7 @@ import fr.insee.rmes.model.operations.documentations.MAS; import fr.insee.rmes.model.operations.documentations.MSD; import fr.insee.rmes.utils.XMLUtils; -import fr.insee.rmes.webservice.OperationsAbstResources; +import fr.insee.rmes.webservice.OperationsCommonResources; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -41,7 +41,7 @@ @Component @Qualifier("Report") @Path("/operations") -public class MetadataReportResources extends OperationsAbstResources { +public class MetadataReportResources extends OperationsCommonResources { /*************************************************************************************************** diff --git a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java index 71ac1f9d2..71274d27d 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java @@ -31,7 +31,7 @@ import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.model.operations.Operation; import fr.insee.rmes.utils.XMLUtils; -import fr.insee.rmes.webservice.OperationsAbstResources; +import fr.insee.rmes.webservice.OperationsCommonResources; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -42,7 +42,7 @@ @Component @Qualifier("Operation") @Path("/operations") -public class OperationsResources extends OperationsAbstResources { +public class OperationsResources extends OperationsCommonResources { /*************************************************************************************************** * OPERATIONS diff --git a/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java b/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java index ad0ec3273..9c30b1b2a 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/SeriesResources.java @@ -26,7 +26,7 @@ import fr.insee.rmes.model.operations.Operation; import fr.insee.rmes.model.operations.Series; import fr.insee.rmes.utils.XMLUtils; -import fr.insee.rmes.webservice.OperationsAbstResources; +import fr.insee.rmes.webservice.OperationsCommonResources; import io.swagger.v3.oas.annotations.Parameter; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -37,7 +37,7 @@ @Component @Qualifier("Series") @Path("/operations") -public class SeriesResources extends OperationsAbstResources { +public class SeriesResources extends OperationsCommonResources { /*************************************************************************************************** From 2e318a97a367938583ddf08f65dbdf0d538a66e9 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 30 Mar 2021 16:25:16 +0200 Subject: [PATCH 197/243] Remove warning because of empty path --- src/main/java/fr/insee/rmes/webservice/CodeListsResources.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/webservice/CodeListsResources.java b/src/main/java/fr/insee/rmes/webservice/CodeListsResources.java index 859741816..8945950c0 100644 --- a/src/main/java/fr/insee/rmes/webservice/CodeListsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/CodeListsResources.java @@ -45,7 +45,6 @@ public class CodeListsResources { @GET - @Path("/") @Produces(MediaType.APPLICATION_JSON) @Operation(operationId = "getAllCodesLists", summary = "List of codes", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(type = "array", implementation = CodeList.class)))}) From 9853fa54d5cd29291846c9cb4fe3b40dae50a58f Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 31 Mar 2021 09:32:08 +0200 Subject: [PATCH 198/243] Remove warning when running test --- pom.xml | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 5283aa9c3..74c757761 100644 --- a/pom.xml +++ b/pom.xml @@ -503,13 +503,7 @@ **/*Test.java - - - org.junit.platform - junit-platform-surefire-provider - 1.3.2 - - + ${maven-surefire-plugin.version} From 29b90934e5f17f7d76ef245d8ed3b58b0962aad5 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 31 Mar 2021 09:32:38 +0200 Subject: [PATCH 199/243] Upgrade spring (can't update to v5 because of jasperreport) --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 74c757761..54ae6e9b4 100644 --- a/pom.xml +++ b/pom.xml @@ -40,7 +40,7 @@ 2.10.1 3.5.0 2.0.9 - 4.3.25.RELEASE + 4.3.30.RELEASE 4.2.17.RELEASE 2.13.3 5.7.0 From fde00bf920de8d72691337ed344fd3152a500333 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 31 Mar 2021 11:02:55 +0200 Subject: [PATCH 200/243] Remove warnings --- pom.xml | 1 - .../structures/utils/StructureComponentUtils.java | 7 +++++-- .../structures/utils/StructurePublication.java | 6 ++---- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/pom.xml b/pom.xml index 54ae6e9b4..bf8be2e02 100644 --- a/pom.xml +++ b/pom.xml @@ -503,7 +503,6 @@ **/*Test.java - ${maven-surefire-plugin.version} diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index c3b608d68..12bbb8608 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -5,7 +5,6 @@ import javax.ws.rs.BadRequestException; -import fr.insee.rmes.bauhaus_services.structures.StructureComponent; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; @@ -15,7 +14,11 @@ import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.impl.LinkedHashModel; import org.eclipse.rdf4j.model.impl.SimpleIRI; -import org.eclipse.rdf4j.model.vocabulary.*; +import org.eclipse.rdf4j.model.vocabulary.DC; +import org.eclipse.rdf4j.model.vocabulary.DCTERMS; +import org.eclipse.rdf4j.model.vocabulary.RDF; +import org.eclipse.rdf4j.model.vocabulary.RDFS; +import org.eclipse.rdf4j.model.vocabulary.SKOS; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.beans.factory.annotation.Autowired; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java index 77be15eba..6764e066b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructurePublication.java @@ -1,5 +1,7 @@ package fr.insee.rmes.bauhaus_services.structures.utils; +import java.util.Arrays; + import org.apache.http.HttpStatus; import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; @@ -17,8 +19,6 @@ import fr.insee.rmes.bauhaus_services.rdf_utils.RepositoryPublication; import fr.insee.rmes.exceptions.RmesException; -import java.util.Arrays; - @Repository public class StructurePublication extends RdfService { @@ -32,10 +32,8 @@ private void copyTriplet(Resource structure, Model model, RepositoryConnection c while (statements.hasNext()) { Statement st = statements.next(); String pred = ((SimpleIRI) st.getPredicate()).toString(); - boolean result = Arrays.stream(denyList).anyMatch(entry -> pred.endsWith(entry)); if (Arrays.stream(denyList).anyMatch(entry -> pred.endsWith(entry))) { // nothing, wouldn't copy this attr - boolean r = result; } else if(pred.endsWith("component")){ model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), st.getPredicate(), From bc97626aca0bb692b734e8c93f3f89ea52a19344 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 31 Mar 2021 11:28:51 +0200 Subject: [PATCH 201/243] Try to reconfigure log if external file --- .../rmes/config/Log4j2ServletContextListener.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java b/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java index e00c961e9..6ce51e9fa 100644 --- a/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java +++ b/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java @@ -8,6 +8,8 @@ import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.core.LoggerContext; import org.apache.logging.log4j.web.Log4jServletContextListener; import org.apache.logging.log4j.web.Log4jWebSupport; @@ -24,7 +26,16 @@ public class Log4j2ServletContextListener implements ServletContextListener { public Log4j2ServletContextListener() { this.listener = new Log4jServletContextListener(); try { + //Get the appropriate log4j2.xml file this.getEnvironmentProperties(); + + //Force a reconfiguration + //Documentation on https://logging.apache.org/log4j/log4j-2.5/faq.html + if (!log4j2ConfigFile.equals("log4j2.xml")){//case of external file + LoggerContext context = (org.apache.logging.log4j.core.LoggerContext) LogManager.getContext(false); + File file = new File(log4j2ConfigFile); + context.setConfigLocation(file.toURI()); + } } catch (IOException e) { e.printStackTrace(); } From 82b35155ef64dfe48dec19edb5032f92fb83d9f8 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Wed, 31 Mar 2021 11:31:39 +0200 Subject: [PATCH 202/243] fix: get sims linked to a document or link --- .../operations/documentations/documents/DocumentsUtils.java | 2 +- .../operations/documentations/DocumentsQueries.java | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index e5f9ccd7b..731323a5a 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -266,7 +266,7 @@ public JSONObject getDocument(String id, boolean isLink) throws RmesException { if (jsonDocs.has(Constants.UPDATED_DATE)) { jsonDocs.put(Constants.UPDATED_DATE, DateUtils.getDate(jsonDocs.getString(Constants.UPDATED_DATE))); } - jsonDocs.put("sims", repoGestion.getResponseAsArray(DocumentsQueries.getSimsByDocument(id))); + jsonDocs.put("sims", repoGestion.getResponseAsArray(DocumentsQueries.getSimsByDocument(id, isLink))); return jsonDocs; } diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java index 50e6a8677..555591b9c 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java @@ -42,9 +42,9 @@ public static String getDocumentQuery(String id, boolean isLink) throws RmesExce return getDocuments(id,"","", isLink, "") ; } - public static String getSimsByDocument(String id) throws RmesException { + public static String getSimsByDocument(String id, boolean isLink) throws RmesException { if (params==null) {initParams();} - params.put("ID", Config.DOCUMENTS_BASE_URI + "/" + id); + params.put("ID", (isLink ? Config.LINKS_BASE_URI : Config.DOCUMENTS_BASE_URI) + "/" + id); return buildRequest("getSimsByDocument.ftlh", params); } From 64aed0dfdd7301063c311c5f7759f6717ea6f759 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Wed, 31 Mar 2021 13:58:22 +0200 Subject: [PATCH 203/243] feat: return stamp of sims when fetchin documents/links --- .../documentations/documents/DocumentsUtils.java | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index 731323a5a..43fc0c34d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -16,6 +16,7 @@ import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.StreamingOutput; +import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationsUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; @@ -64,7 +65,8 @@ public class DocumentsUtils extends RdfService { @Autowired private LangService langService; - + @Autowired + DocumentationsUtils documentationsUtils; /* * METHODS LINKS TO THE SIMS - RUBRICS */ @@ -248,7 +250,7 @@ public void setDocument(String id, String body, boolean isLink) throws RmesExcep /** * Get RDF for a document or a link by ID * @param id - * @param documentType + * @param isLink * @return * @throws RmesException */ @@ -266,7 +268,15 @@ public JSONObject getDocument(String id, boolean isLink) throws RmesException { if (jsonDocs.has(Constants.UPDATED_DATE)) { jsonDocs.put(Constants.UPDATED_DATE, DateUtils.getDate(jsonDocs.getString(Constants.UPDATED_DATE))); } - jsonDocs.put("sims", repoGestion.getResponseAsArray(DocumentsQueries.getSimsByDocument(id, isLink))); + + JSONArray sims = repoGestion.getResponseAsArray(DocumentsQueries.getSimsByDocument(id, isLink)); + + for (int i = 0; i < sims.length(); i++) { + JSONObject sim = sims.getJSONObject(i); + sim.put("creators", new JSONArray(documentationsUtils.getDocumentationOwnersByIdSims(sim.getString("id")))); + } + + jsonDocs.put("sims", sims); return jsonDocs; } From d0d2fee5800547769be9af923dc9cd1ba8270f2f Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Wed, 31 Mar 2021 16:01:04 +0200 Subject: [PATCH 204/243] feat: wrong predicate when fetching structure --- .../structures/utils/StructureComponentUtils.java | 4 ++-- src/main/resources/request/structures/getStructure.ftlh | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java index c3b608d68..6ed667a43 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureComponentUtils.java @@ -192,8 +192,8 @@ private void createRDFForComponent(MutualizedComponent component, Resource resou } RdfUtils.addTripleUri(componentURI, QB.CODE_LIST, component.getCodeList(), model, graph); - RdfUtils.addTripleStringMdToXhtml(componentURI, RDFS.COMMENT, component.getDescriptionLg1(), Config.LG1, model, graph); - RdfUtils.addTripleStringMdToXhtml(componentURI, RDFS.COMMENT, component.getDescriptionLg2(), Config.LG2, model, graph); + RdfUtils.addTripleString(componentURI, RDFS.COMMENT, component.getDescriptionLg1(), Config.LG1, model, graph); + RdfUtils.addTripleString(componentURI, RDFS.COMMENT, component.getDescriptionLg2(), Config.LG2, model, graph); repoGestion.loadSimpleObject(componentURI, model, null); } diff --git a/src/main/resources/request/structures/getStructure.ftlh b/src/main/resources/request/structures/getStructure.ftlh index 7418f3f40..34b28d92a 100644 --- a/src/main/resources/request/structures/getStructure.ftlh +++ b/src/main/resources/request/structures/getStructure.ftlh @@ -34,11 +34,11 @@ WHERE { } . OPTIONAL { - ?structure rdfs:comment ?descriptionLg1 . + ?structure dc:description ?descriptionLg1 . FILTER (lang(?descriptionLg1) = '${LG1}') } . OPTIONAL { - ?structure rdfs:comment ?descriptionLg2 + ?structure dc:description ?descriptionLg2 FILTER (lang(?descriptionLg2) = '${LG2}') } . } From ff205b0699124565e7b0b3f6e6d0febbb2d3ae87 Mon Sep 17 00:00:00 2001 From: Fabrice Bibonne Date: Wed, 31 Mar 2021 16:37:35 +0200 Subject: [PATCH 205/243] Use home made ServletContainerInitializer to intialize log4j on startup before everyone. Use programatic read for external props --- WebContent/WEB-INF/web.xml | 8 +- .../config/Log4j2ServletContextListener.java | 80 ------------------- ...Log4jInseeServletContainerInitializer.java | 60 ++++++++++++++ .../fr/insee/rmes/utils/PropertiesUtils.java | 28 +++++++ 4 files changed, 90 insertions(+), 86 deletions(-) delete mode 100644 src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java create mode 100644 src/main/java/fr/insee/rmes/config/Log4jInseeServletContainerInitializer.java create mode 100644 src/main/java/fr/insee/rmes/utils/PropertiesUtils.java diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml index 53c8c078d..5ca4cdded 100644 --- a/WebContent/WEB-INF/web.xml +++ b/WebContent/WEB-INF/web.xml @@ -1,8 +1,8 @@ + xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" + id="WebApp_ID" version="4.0"> bauhaus-core @@ -20,10 +20,6 @@ /WEB-INF/applicationContext*.xml - - fr.insee.rmes.config.Log4j2ServletContextListener - - org.springframework.web.context.ContextLoaderListener diff --git a/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java b/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java deleted file mode 100644 index e00c961e9..000000000 --- a/src/main/java/fr/insee/rmes/config/Log4j2ServletContextListener.java +++ /dev/null @@ -1,80 +0,0 @@ -package fr.insee.rmes.config; - -import java.io.File; -import java.io.FileReader; -import java.io.IOException; -import java.util.Properties; - -import javax.servlet.ServletContextEvent; -import javax.servlet.ServletContextListener; - -import org.apache.logging.log4j.web.Log4jServletContextListener; -import org.apache.logging.log4j.web.Log4jWebSupport; - -public class Log4j2ServletContextListener implements ServletContextListener { - - private static final String WEBAPPS = "%s/webapps/%s"; - - private static final String CATALINA_BASE = "catalina.base"; - - private String log4j2ConfigFile; - - private Log4jServletContextListener listener; - - public Log4j2ServletContextListener() { - this.listener = new Log4jServletContextListener(); - try { - this.getEnvironmentProperties(); - } catch (IOException e) { - e.printStackTrace(); - } - } - - @Override - public void contextInitialized(ServletContextEvent servletContextEvent) { - servletContextEvent.getServletContext().setInitParameter(Log4jWebSupport.LOG4J_CONFIG_LOCATION, - log4j2ConfigFile); - listener.contextInitialized(servletContextEvent); - } - - @Override - public void contextDestroyed(ServletContextEvent servletContextEvent) { - listener.contextDestroyed(servletContextEvent); - } - - private void getEnvironmentProperties() throws IOException { - Properties props = this.getProperties(); - String log4JExternalFile = props.getProperty("fr.insee.rmes.bauhaus.log.configuration"); - this.log4j2ConfigFile = "log4j2.xml"; - File f = new File(log4JExternalFile); - if (f.exists() && !f.isDirectory()) { - this.log4j2ConfigFile = String.format(log4JExternalFile); - } - } - - private Properties getProperties() throws IOException { - Properties props = new Properties(); - props.load(getClass().getClassLoader().getResourceAsStream("bauhaus-dev.properties")); - props = this.loadIfExists(props, "bauhaus-dev.properties"); - props = this.loadIfExists(props, "bauhaus-qf.properties"); - props = this.loadIfExists(props, "bauhaus-production.properties"); - props = this.loadIfExists(props, "production.properties"); - return props; - } - - /* - * load properties on catalina base - */ - private Properties loadIfExists(Properties props, String filename) throws IOException { - File f = new File(String.format(WEBAPPS, System.getProperty(CATALINA_BASE), filename)); - if (f.exists() && !f.isDirectory()) { - try (FileReader r = new FileReader(f);){ - props.load(r); - return props; - } - } - return props; - } - - -} diff --git a/src/main/java/fr/insee/rmes/config/Log4jInseeServletContainerInitializer.java b/src/main/java/fr/insee/rmes/config/Log4jInseeServletContainerInitializer.java new file mode 100644 index 000000000..722f9ee1f --- /dev/null +++ b/src/main/java/fr/insee/rmes/config/Log4jInseeServletContainerInitializer.java @@ -0,0 +1,60 @@ +package fr.insee.rmes.config; + + +import fr.insee.rmes.utils.PropertiesUtils; +import org.apache.logging.log4j.web.Log4jServletContainerInitializer; +import org.apache.logging.log4j.web.Log4jWebSupport; + +import javax.servlet.ServletContext; +import javax.servlet.ServletException; +import java.net.URISyntaxException; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Objects; +import java.util.Optional; +import java.util.Set; +import java.util.stream.Stream; + +public class Log4jInseeServletContainerInitializer extends Log4jServletContainerInitializer { + + private static final String WEBAPPS = "%s/webapps/%s"; + + private static final String CATALINA_BASE = "catalina.base"; + + @Override + public void onStartup(final Set> classes, final ServletContext servletContext) throws ServletException { + servletContext.setInitParameter(Log4jWebSupport.LOG4J_CONFIG_LOCATION,findLog4jConfFile()); + switchOnLog4jServletContainerInitializer(servletContext); + super.onStartup(classes, servletContext); + switchOffLog4jServletContainerInitializer(servletContext); + } + + private void switchOnLog4jServletContainerInitializer(ServletContext servletContext) { + servletContext.setInitParameter(Log4jWebSupport.IS_LOG4J_AUTO_INITIALIZATION_DISABLED,"false"); + } + + private void switchOffLog4jServletContainerInitializer(ServletContext servletContext) { + servletContext.setInitParameter(Log4jWebSupport.IS_LOG4J_AUTO_INITIALIZATION_DISABLED,"true"); + } + + private String findLog4jConfFile() { + + Path bauhausDevPropsInClassPath; + try { + bauhausDevPropsInClassPath=Paths.get(getClass().getClassLoader().getResource("bauhaus-dev.properties").toURI()); + } catch (URISyntaxException e) { + bauhausDevPropsInClassPath=null; + } + return Stream.of(Paths.get(String.format(WEBAPPS, System.getProperty(CATALINA_BASE), "production.properties")), + Paths.get(String.format(WEBAPPS, System.getProperty(CATALINA_BASE), "bauhaus-production.properties")), + Paths.get(String.format(WEBAPPS, System.getProperty(CATALINA_BASE), "bauhaus-qf.properties")), + Paths.get(String.format(WEBAPPS, System.getProperty(CATALINA_BASE), "bauhaus-dev.properties")), + bauhausDevPropsInClassPath) + .filter(Objects::nonNull) + .map(p->PropertiesUtils.readPropertyFromFile("fr.insee.rmes.bauhaus.log.configuration",p)) + .filter(Optional::isPresent) + .map(Optional::get) + .findFirst() + .orElse("log4j2.xml"); + } +} diff --git a/src/main/java/fr/insee/rmes/utils/PropertiesUtils.java b/src/main/java/fr/insee/rmes/utils/PropertiesUtils.java new file mode 100644 index 000000000..3f8f1f867 --- /dev/null +++ b/src/main/java/fr/insee/rmes/utils/PropertiesUtils.java @@ -0,0 +1,28 @@ + +package fr.insee.rmes.utils; + +import javax.validation.constraints.NotNull; +import java.io.FileReader; +import java.io.IOException; +import java.io.Reader; +import java.nio.file.Path; +import java.util.Optional; +import java.util.Properties; + +public class PropertiesUtils { + + private static final Properties propsForReadPropertyFromFile=new Properties(); + + public static Optional readPropertyFromFile(@NotNull String propertyName,@NotNull Path filePath){ + propsForReadPropertyFromFile.remove(propertyName); + // Use OS charset : for example windows-1252 for windows, UTF-8 for linux, ... + // switch to java 11 to specify charset + try(Reader readerFromFile=new FileReader(filePath.toFile())){ + propsForReadPropertyFromFile.load(readerFromFile); + }catch (IOException e){ + //propsForReadPropertyFromFile remain empty if file cannot be read + } + return Optional.ofNullable(propsForReadPropertyFromFile.getProperty(propertyName)); + } + +} From 9acd40b9acc7b68e85c7d790d82dc8a54b5ca123 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 31 Mar 2021 16:45:53 +0200 Subject: [PATCH 206/243] Fix issue in dev mode --- .../bauhaus_services/stamps/StampsRestrictionServiceImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java index f96c38da0..c320b6541 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/stamps/StampsRestrictionServiceImpl.java @@ -81,7 +81,7 @@ private User dvOrQfUser() { JSONArray roles = new JSONArray(); roles.put("ROLE_offline_access"); - roles.put("ROLE_Administrateur_RMESGNCS"); + roles.put("Administrateur_RMESGNCS"); roles.put("ROLE_uma_authorization"); return new User(roles, "fakeStampForDvAndQf"); } From 2af2a251390e6dba5384573f75f6f6babca2c158 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 31 Mar 2021 16:46:37 +0200 Subject: [PATCH 207/243] Publish both replaces and isReplacedBy for series --- .../operations/series/SeriesPublication.java | 31 ++++++++++++------- .../operations/series/SeriesUtils.java | 2 +- .../rdf_utils/RepositoryGestion.java | 21 +++++++++++-- 3 files changed, 40 insertions(+), 14 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java index 97c7eefe9..a942ee3d3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesPublication.java @@ -56,6 +56,8 @@ public void publishSeries(String seriesId) throws RmesException { RepositoryResult statements = repoGestion.getStatements(con, series); RepositoryResult hasPartStatements = repoGestion.getHasPartStatements(con, series); + RepositoryResult replacesStatements = repoGestion.getReplacesStatements(con, series); + RepositoryResult isReplacedByStatements = repoGestion.getIsReplacedByStatements(con, series); try { try { @@ -76,10 +78,7 @@ public void publishSeries(String seriesId) throws RmesException { pred.endsWith("publisher") || pred.endsWith("accrualPeriodicity")|| pred.endsWith("type") ) { - model.add(PublicationUtils.tranformBaseURIToPublish(st.getSubject()), - st.getPredicate(), - PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()), - st.getContext()); + transformSubjectAndObject(model, st); } else if (pred.endsWith("isValidated") || pred.endsWith("validationState") || pred.endsWith("hasPart")) { @@ -93,13 +92,9 @@ public void publishSeries(String seriesId) throws RmesException { st.getContext() ); } - while (hasPartStatements.hasNext()) { - Statement hpst = hasPartStatements.next(); - model.add(PublicationUtils.tranformBaseURIToPublish(hpst.getSubject()), - hpst.getPredicate(), - PublicationUtils.tranformBaseURIToPublish((Resource) hpst.getObject()), - hpst.getContext()); - } + addStatementsToModel(model, hasPartStatements); + addStatementsToModel(model, replacesStatements); + addStatementsToModel(model, isReplacedByStatements); } } catch (RepositoryException e) { @@ -115,5 +110,19 @@ public void publishSeries(String seriesId) throws RmesException { } + public void addStatementsToModel(Model model, RepositoryResult statements) { + while (statements.hasNext()) { + Statement statement = statements.next(); + transformSubjectAndObject(model, statement); + } + } + + public void transformSubjectAndObject(Model model, Statement statement) { + model.add(PublicationUtils.tranformBaseURIToPublish(statement.getSubject()), + statement.getPredicate(), + PublicationUtils.tranformBaseURIToPublish((Resource) statement.getObject()), + statement.getContext()); + } + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java index 46af8e25d..97be73b55 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java @@ -242,7 +242,7 @@ private void createRdfSeries(Series series, IRI familyURI, ValidationStatus newS addCodeList(series.getAccrualPeriodicityList(), series.getAccrualPeriodicityCode(), DCTERMS.ACCRUAL_PERIODICITY, model, seriesURI); addOperationLinks(series.getSeeAlso(), RDFS.SEEALSO, model, seriesURI); - addOperationLinks(series.getReplaces(), DCTERMS.REPLACES, model, seriesURI); + //addOperationLinks(series.getReplaces(), DCTERMS.REPLACES, model, seriesURI); List replaces = series.getReplaces(); if (replaces != null) { diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java index f00d665ab..7c7f6c543 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/rdf_utils/RepositoryGestion.java @@ -13,6 +13,7 @@ import org.eclipse.rdf4j.model.Model; import org.eclipse.rdf4j.model.Resource; import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.impl.SimpleIRI; import org.eclipse.rdf4j.model.vocabulary.DCTERMS; import org.eclipse.rdf4j.model.vocabulary.SKOS; import org.eclipse.rdf4j.repository.Repository; @@ -113,11 +114,27 @@ public RepositoryResult getStatements(RepositoryConnection con, Resou public RepositoryResult getHasPartStatements(RepositoryConnection con, Resource object) throws RmesException { + return getStatementsPredicatObject(con, DCTERMS.HAS_PART,object); + } + + public RepositoryResult getReplacesStatements(RepositoryConnection con, Resource object) + throws RmesException { + return getStatementsPredicatObject(con, DCTERMS.REPLACES,object); + } + + public RepositoryResult getIsReplacedByStatements(RepositoryConnection con, Resource object) + throws RmesException { + return getStatementsPredicatObject(con, DCTERMS.IS_REPLACED_BY,object); + } + + + private RepositoryResult getStatementsPredicatObject(RepositoryConnection con, IRI predicate, Resource object) + throws RmesException { RepositoryResult statements = null; try { - statements = con.getStatements(null, DCTERMS.HAS_PART, object, false); + statements = con.getStatements(null, predicate, object, false); } catch (RepositoryException e) { - throwsRmesException(e, "Failure get hasPart statements : " + object); + throwsRmesException(e, "Failure get " +((SimpleIRI)predicate).toString() + " statements : " + object); } return statements; } From 01733c0d5a06df7c8958d543d47c400bf1b70f83 Mon Sep 17 00:00:00 2001 From: Fabrice Bibonne Date: Fri, 2 Apr 2021 14:53:02 +0200 Subject: [PATCH 208/243] Log4j initialisation with properties --- WebContent/WEB-INF/web.xml | 8 +++--- pom.xml | 27 ++++++++++++++++--- ...Log4jInseeServletContainerInitializer.java | 11 +++----- .../fr/insee/rmes/utils/PropertiesUtils.java | 2 +- .../javax.servlet.ServletContainerInitializer | 1 + src/main/resources/log4j2.xml | 11 +++++++- 6 files changed, 43 insertions(+), 17 deletions(-) create mode 100644 src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer diff --git a/WebContent/WEB-INF/web.xml b/WebContent/WEB-INF/web.xml index 5ca4cdded..72d0c2381 100644 --- a/WebContent/WEB-INF/web.xml +++ b/WebContent/WEB-INF/web.xml @@ -10,10 +10,10 @@ index.html - - isLog4jAutoInitializationDisabled - true - + + + log4j + contextConfigLocation diff --git a/pom.xml b/pom.xml index 54ae6e9b4..10be17a3b 100644 --- a/pom.xml +++ b/pom.xml @@ -530,7 +530,30 @@ - + + + + org.codehaus.cargo + cargo-maven3-plugin + 1.9.3 + + + + existing + c:/insee/catalinaBase-cargo + + + tomcat9x + installed + c:/INSEE/apache-tomcat-9.0.40 + + c:/INSEE/catalinaBase-cargo/webapps + + + + + + @@ -544,8 +567,6 @@ junit:junit UTF-8 - UTF-8 - UTF-8 diff --git a/src/main/java/fr/insee/rmes/config/Log4jInseeServletContainerInitializer.java b/src/main/java/fr/insee/rmes/config/Log4jInseeServletContainerInitializer.java index 722f9ee1f..7edbc4c44 100644 --- a/src/main/java/fr/insee/rmes/config/Log4jInseeServletContainerInitializer.java +++ b/src/main/java/fr/insee/rmes/config/Log4jInseeServletContainerInitializer.java @@ -24,17 +24,12 @@ public class Log4jInseeServletContainerInitializer extends Log4jServletContainer @Override public void onStartup(final Set> classes, final ServletContext servletContext) throws ServletException { servletContext.setInitParameter(Log4jWebSupport.LOG4J_CONFIG_LOCATION,findLog4jConfFile()); - switchOnLog4jServletContainerInitializer(servletContext); super.onStartup(classes, servletContext); switchOffLog4jServletContainerInitializer(servletContext); } - private void switchOnLog4jServletContainerInitializer(ServletContext servletContext) { - servletContext.setInitParameter(Log4jWebSupport.IS_LOG4J_AUTO_INITIALIZATION_DISABLED,"false"); - } - - private void switchOffLog4jServletContainerInitializer(ServletContext servletContext) { - servletContext.setInitParameter(Log4jWebSupport.IS_LOG4J_AUTO_INITIALIZATION_DISABLED,"true"); + private boolean switchOffLog4jServletContainerInitializer(ServletContext servletContext) { + return servletContext.setInitParameter(Log4jWebSupport.IS_LOG4J_AUTO_INITIALIZATION_DISABLED,"true"); } private String findLog4jConfFile() { @@ -51,7 +46,7 @@ private String findLog4jConfFile() { Paths.get(String.format(WEBAPPS, System.getProperty(CATALINA_BASE), "bauhaus-dev.properties")), bauhausDevPropsInClassPath) .filter(Objects::nonNull) - .map(p->PropertiesUtils.readPropertyFromFile("fr.insee.rmes.bauhaus.log.configuration",p)) + .map(p->PropertiesUtils.readPropertyFromPath("fr.insee.rmes.bauhaus.log.configuration",p)) .filter(Optional::isPresent) .map(Optional::get) .findFirst() diff --git a/src/main/java/fr/insee/rmes/utils/PropertiesUtils.java b/src/main/java/fr/insee/rmes/utils/PropertiesUtils.java index 3f8f1f867..00a592914 100644 --- a/src/main/java/fr/insee/rmes/utils/PropertiesUtils.java +++ b/src/main/java/fr/insee/rmes/utils/PropertiesUtils.java @@ -13,7 +13,7 @@ public class PropertiesUtils { private static final Properties propsForReadPropertyFromFile=new Properties(); - public static Optional readPropertyFromFile(@NotNull String propertyName,@NotNull Path filePath){ + public static Optional readPropertyFromPath(@NotNull String propertyName, @NotNull Path filePath){ propsForReadPropertyFromFile.remove(propertyName); // Use OS charset : for example windows-1252 for windows, UTF-8 for linux, ... // switch to java 11 to specify charset diff --git a/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer b/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer new file mode 100644 index 000000000..4ad0f4719 --- /dev/null +++ b/src/main/resources/META-INF/services/javax.servlet.ServletContainerInitializer @@ -0,0 +1 @@ +fr.insee.rmes.config.Log4jInseeServletContainerInitializer \ No newline at end of file diff --git a/src/main/resources/log4j2.xml b/src/main/resources/log4j2.xml index 5b6f27c73..8e6460bd7 100644 --- a/src/main/resources/log4j2.xml +++ b/src/main/resources/log4j2.xml @@ -2,6 +2,15 @@ + + + + [%-5level] %d{yyyy-MM-dd HH:mm:ss.SSS} [%t] %c{1} - %msg%n + + + + + @@ -18,7 +27,7 @@ - + \ No newline at end of file From 6264060d31477ed70405c43552331a3c58da584d Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Fri, 2 Apr 2021 18:12:54 +0200 Subject: [PATCH 209/243] Filter sims rubrics for publication --- .../DocumentationPublication.java | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java index 7564cfe9b..c5beb9706 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java @@ -1,5 +1,8 @@ package fr.insee.rmes.bauhaus_services.operations.documentations; +import java.util.ArrayList; +import java.util.List; + import org.apache.http.HttpStatus; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; @@ -34,6 +37,8 @@ public class DocumentationPublication extends RdfService { static NotificationsContract notification = new RmesNotificationsImpl(); + static final String[] rubricsNotForPublication = {"S.1.3","S.1.4","S.1.6","S.1.7","validationState"}; + public void publishSims(String simsId) throws RmesException { Model model = new LinkedHashModel(); @@ -50,18 +55,19 @@ public void publishSims(String simsId) throws RmesException { while (metadataReportStatements.hasNext()) { Statement st = metadataReportStatements.next(); // Triplets that don't get published - if (((SimpleIRI)st.getPredicate()).toString().endsWith("validationState")) { + String predicate = ((SimpleIRI)st.getPredicate()).toString(); + if (!isTripletForPublication(predicate)) { // nothing, wouldn't copy this attr } else { Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); - IRI predicate = RdfUtils + IRI predicateIRI = RdfUtils .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); Value object = st.getObject(); if (st.getObject() instanceof Resource) { object = PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()); } - model.add(subject, predicate, object, st.getContext()); + model.add(subject, predicateIRI, object, st.getContext()); } } } catch (RepositoryException e) { @@ -77,4 +83,10 @@ public void publishSims(String simsId) throws RmesException { } + private boolean isTripletForPublication(String predicate) { + for(String rubric : rubricsNotForPublication) { + if (predicate.endsWith(rubric)) return false;} + return true; + } + } From 5d63efc7d605931415526e721ee28a3a79648e13 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 6 Apr 2021 09:08:30 +0200 Subject: [PATCH 210/243] Change query to be more accurate --- .../operations/documentations/documents/getDocumentQuery.ftlh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh b/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh index e313f6175..3494b33d7 100644 --- a/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh +++ b/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh @@ -40,7 +40,7 @@ WHERE { FILTER(REPLACE( STR(?uri) , '(.*/)(\\w.+$)', '$2' ) = '${id}') -<#if idSims != ""> +<#if idRubric != ""> FILTER(REGEX(STR(?text), '${idRubric}')) <#if type != ""> From 4a43e13276c33165dd47dc2f1ccb050d0f528e57 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 6 Apr 2021 09:09:19 +0200 Subject: [PATCH 211/243] Change storage properties (publish physical files) --- .../java/fr/insee/rmes/config/Config.java | 26 ++++++++++++++----- src/main/resources/bauhaus-dev.properties | 4 ++- 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/insee/rmes/config/Config.java b/src/main/java/fr/insee/rmes/config/Config.java index b41c6a7c1..218bfa6c8 100644 --- a/src/main/java/fr/insee/rmes/config/Config.java +++ b/src/main/java/fr/insee/rmes/config/Config.java @@ -49,7 +49,9 @@ public class Config { public static String LINKS_BASE_URI = ""; public static String DOCUMENTS_GRAPH = ""; - public static String DOCUMENTS_STORAGE = ""; + public static String DOCUMENTS_STORAGE_GESTION = ""; + public static String DOCUMENTS_STORAGE_PUBLICATION_EXTERNE = ""; + public static String DOCUMENTS_STORAGE_PUBLICATION_INTERNE = ""; public static String PRODUCTS_GRAPH = ""; @@ -218,7 +220,10 @@ private static void readConfigForOperations(Environment env) { Config.DOCUMENTS_BASE_URI = env.getProperty("fr.insee.rmes.bauhaus.documents.baseURI"); Config.LINKS_BASE_URI = env.getProperty("fr.insee.rmes.bauhaus.links.baseURI"); Config.DOCUMENTS_GRAPH = BASE_GRAPH + env.getProperty("fr.insee.rmes.bauhaus.documents.graph"); - Config.DOCUMENTS_STORAGE = env.getProperty("fr.insee.rmes.bauhaus.storage.document"); + Config.DOCUMENTS_STORAGE_GESTION = env.getProperty("fr.insee.rmes.bauhaus.storage.document.gestion"); + Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE = env.getProperty("fr.insee.rmes.bauhaus.storage.document.publication"); + Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE = env.getProperty("fr.insee.rmes.bauhaus.storage.document.publication.interne"); + Config.PRODUCTS_GRAPH = BASE_GRAPH + env.getProperty("fr.insee.rmes.bauhaus.products.graph"); Config.PRODUCTS_BASE_URI = env.getProperty("fr.insee.rmes.bauhaus.products.baseURI"); @@ -235,11 +240,20 @@ public static void printMajorConfig() { logger.info("*********************** CONFIG USED ***********************************"); logger.info("ENV : {}", ENV); - logger.info("SERVEUR GESTION : {} _ REPO : {} _ BASEURI : {}",SESAME_SERVER_GESTION,REPOSITORY_ID_GESTION, BASE_URI_GESTION); - logger.info("SERVEUR PUBLICATION : {} _ REPO : {} _ BASEURI : {}",SESAME_SERVER_PUBLICATION, REPOSITORY_ID_PUBLICATION, BASE_URI_PUBLICATION); - logger.info("SERVEUR PUB INTERNE : {} _ REPO : {}",SESAME_SERVER_PUBLICATION_INTERNE,REPOSITORY_ID_PUBLICATION_INTERNE); - logger.info("DOCUMENT STORAGE : {}", DOCUMENTS_STORAGE); + logger.info("SERVEUR RDF : "); + + logger.info(" GESTION : {} _ REPO : {} _ BASEURI : {}",SESAME_SERVER_GESTION,REPOSITORY_ID_GESTION, BASE_URI_GESTION); + logger.info(" PUB EXTERNE : {} _ REPO : {} _ BASEURI : {}",SESAME_SERVER_PUBLICATION, REPOSITORY_ID_PUBLICATION, BASE_URI_PUBLICATION); + logger.info(" PUB INTERNE : {} _ REPO : {}",SESAME_SERVER_PUBLICATION_INTERNE,REPOSITORY_ID_PUBLICATION_INTERNE); + + logger.info("DOCUMENT STORAGE : "); + + logger.info(" GESTION : {}", DOCUMENTS_STORAGE_GESTION); + logger.info(" PUB EXTERNE : {}", DOCUMENTS_STORAGE_PUBLICATION_EXTERNE); + logger.info(" PUB INTERNE : {}", DOCUMENTS_STORAGE_PUBLICATION_INTERNE); + + logger.info("*********************** END CONFIG USED ***********************************"); diff --git a/src/main/resources/bauhaus-dev.properties b/src/main/resources/bauhaus-dev.properties index bfadfcd6f..8655f6407 100644 --- a/src/main/resources/bauhaus-dev.properties +++ b/src/main/resources/bauhaus-dev.properties @@ -54,4 +54,6 @@ fr.insee.rmes.bauhaus.api.host = SECRET fr.insee.rmes.bauhaus.api.basepath= XXX # Stockage -fr.insee.rmes.bauhaus.storage.document = /tmp +fr.insee.rmes.bauhaus.storage.document.gestion = C:/Temp/bauhaus/storage/documents/gestion +fr.insee.rmes.bauhaus.storage.document.publication = C:/Temp/bauhaus/storage/documents/pub1 +fr.insee.rmes.bauhaus.storage.document.publication.interne = C:/Temp/bauhaus/storage/documents/pub2 From 6b8353c83410629bb74b47a8cc8fb8fe21aad904 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 6 Apr 2021 09:09:39 +0200 Subject: [PATCH 212/243] Check if all folders are ok --- .../insee/rmes/webservice/HealthcheckApi.java | 84 +++++++++++-------- 1 file changed, 49 insertions(+), 35 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java b/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java index 6d6bbfdfd..a8866d7f9 100644 --- a/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java +++ b/src/main/java/fr/insee/rmes/webservice/HealthcheckApi.java @@ -3,6 +3,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Files; +import java.util.StringJoiner; import javax.ws.rs.GET; import javax.ws.rs.Path; @@ -33,6 +34,10 @@ @Path("/healthcheck") public class HealthcheckApi { + private static final String OK_STATE = ": OK \n"; + + private static final String KO_STATE = ": KO \n"; + String sparlQuery = "SELECT * { ?s a ?t } LIMIT 1"; @Autowired @@ -45,60 +50,69 @@ public class HealthcheckApi { MediaType.TEXT_PLAIN }) public Response getHealthcheck() { - String errorMessage = ""; - String stateResult = "Database connexion \n"; - logger.info("Begin healthCheck"); + + StringJoiner errorMessage = new StringJoiner(" "); + StringJoiner stateResult = new StringJoiner(" "); + stateResult.add("Database connexion \n"); + logger.info(" Begin healthCheck"); //Test database connexion try { if (StringUtils.isEmpty(RepositoryPublication.getResponse(sparlQuery))){ - errorMessage = errorMessage.concat("- Repository publication doesn't return statement \n"); - stateResult = stateResult.concat(" - Connexion publication : KO \n"); + errorMessage.add("- Repository publication doesn't return statement \n"); + stateResult = stateResult.add(" - Connexion publication").add(KO_STATE); }else { - stateResult = stateResult.concat(" - Connexion publication : OK \n"); + stateResult = stateResult.add(" - Connexion publication").add(OK_STATE); } if (StringUtils.isEmpty( repoGestion.getResponse(sparlQuery))) { - errorMessage = errorMessage.concat("- Repository gestion doesn't return statement \n"); - stateResult = stateResult.concat(" - Connexion gestion : KO \n"); + errorMessage.add("- Repository gestion doesn't return statement \n"); + stateResult = stateResult.add(" - Connexion gestion").add(KO_STATE); }else { - stateResult = stateResult.concat(" - Connexion gestion : OK \n"); + stateResult = stateResult.add(" - Connexion gestion").add(OK_STATE); } } catch (RmesException e) { - errorMessage = errorMessage.concat("- "+e.getMessage()+ " \n"); - stateResult = stateResult.concat(" - Connexion database : KO \n"); + errorMessage.add("- "+e.getMessage()+ " \n"); + stateResult = stateResult.add(" - Connexion database").add(KO_STATE); } - stateResult = stateResult.concat("Document storage \n"); + stateResult = stateResult.add("Document storage \n"); //Test access to storage - String dirPath = Config.DOCUMENTS_STORAGE + "testHealthcheck.txt"; - File testFile = new File(dirPath); - try { + checkDocumentStorage(Config.DOCUMENTS_STORAGE_GESTION,"Gestion", stateResult, errorMessage); + checkDocumentStorage(Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE,"Publication Externe", stateResult, errorMessage); + checkDocumentStorage(Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE,"Publication Interne", stateResult, errorMessage); + + logger.info("{}",stateResult); + logger.info("End healthcheck"); + + if (!"".equals(errorMessage.toString())) { + logger.error("{}",errorMessage); + return Response.serverError().entity(errorMessage.toString()).build(); + } + else { + return Response.ok(stateResult.toString()).build(); + } + } + + private void checkDocumentStorage(String pathToStorage, String storageType, StringJoiner stateResult, StringJoiner errorMessage) { + String dirPath = pathToStorage + "testHealthcheck.txt"; + File testFile = new File(dirPath); + try { if (!testFile.createNewFile()) { - errorMessage = errorMessage.concat("- File for healthcheck already exists \n"); - stateResult = stateResult.concat(" - File creation : KO \n"); + errorMessage.add("- File for healthcheck already exists in").add(storageType).add("\n"); + stateResult.add(" - File creation").add(storageType).add(KO_STATE); }else { - stateResult = stateResult.concat(" - File creation : OK \n"); + stateResult.add(" - File creation").add(storageType).add(OK_STATE); } if (!Files.deleteIfExists(testFile.toPath())) { - errorMessage = errorMessage.concat("- Can't delete test file \n"); - stateResult = stateResult.concat(" - File deletion : KO \n"); + errorMessage.add("- Can't delete test file").add(storageType).add("\n"); + stateResult.add(" - File deletion").add(storageType).add(KO_STATE); }else { - stateResult = stateResult.concat(" - File deletion : OK \n"); + stateResult.add(" - File deletion").add(storageType).add(OK_STATE); } - } catch (IOException e) { - errorMessage = errorMessage.concat("- IOException to save file in "+Config.DOCUMENTS_STORAGE+" - "+e.getMessage()+ " \n"); - stateResult = stateResult.concat(" - Document storage : KO \n"); + } catch (IOException e) { + errorMessage.add("- IOException to save file in").add(pathToStorage).add("-").add(e.getMessage()).add("\n"); + stateResult.add(" - Document storage").add(storageType).add(KO_STATE); } - - logger.info(stateResult); - logger.info("End healthcheck"); - - if (!"".equals(errorMessage)) { - logger.error(errorMessage); - return Response.serverError().entity(errorMessage).build(); - } - else { - return Response.ok(stateResult).build(); - } } + } \ No newline at end of file From 8e0225e89a1982a4008057f678ede31d71d58984 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 6 Apr 2021 09:10:53 +0200 Subject: [PATCH 213/243] Change properties --- .../documentations/documents/DocumentsUtils.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index e5f9ccd7b..1eb01640b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -426,7 +426,7 @@ private String getDocumentNameFromUrl(String docUrl) { } private String createFileUrl(String name) throws RmesException { - String url = getStorageFolderPath().resolve(name).toString(); + String url = getGestionStorageFolderPath().resolve(name).toString(); Pattern p = Pattern.compile("^(?:[a-zA-Z]+:/)"); Matcher m = p.matcher(url); if (m.find()) {// absolute URL @@ -540,11 +540,11 @@ public Response downloadDocumentFile(String id) throws RmesException { } - public Path getStorageFolderPath() throws RmesException { + public Path getGestionStorageFolderPath() throws RmesException { Path path = null; - File dir = new File(Config.DOCUMENTS_STORAGE); + File dir = new File(Config.DOCUMENTS_STORAGE_GESTION); if (dir.exists()) { - path = Paths.get(Config.DOCUMENTS_STORAGE); + path = Paths.get(Config.DOCUMENTS_STORAGE_GESTION); } else { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, "Storage folder not found", "Config.DOCUMENTS_STORAGE"); From 862cc49d56bad099bee9cf60bd4ef9b68997cff6 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 6 Apr 2021 13:55:20 +0200 Subject: [PATCH 214/243] Publish documents when publishing a sims --- .../DocumentationPublication.java | 5 + .../documents/DocumentsPublication.java | 122 ++++++++++++++++++ .../documents/DocumentsUtils.java | 22 +++- .../java/fr/insee/rmes/config/Config.java | 2 + .../documentations/DocumentsQueries.java | 7 +- src/main/resources/bauhaus-dev.properties | 1 + 6 files changed, 152 insertions(+), 7 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java index 7564cfe9b..a52a1870c 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java @@ -15,6 +15,7 @@ import org.springframework.stereotype.Repository; import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.operations.documentations.documents.DocumentsPublication; import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; @@ -33,6 +34,9 @@ public class DocumentationPublication extends RdfService { static RepositoryUtils repoUtils; static NotificationsContract notification = new RmesNotificationsImpl(); + + @Autowired + DocumentsPublication documentsPublication; public void publishSims(String simsId) throws RmesException { @@ -64,6 +68,7 @@ public void publishSims(String simsId) throws RmesException { model.add(subject, predicate, object, st.getContext()); } } + documentsPublication.publishAllDocumentsInSims(simsId,model); } catch (RepositoryException e) { throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), Constants.REPOSITORY_EXCEPTION); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java new file mode 100644 index 000000000..09ee5c4c1 --- /dev/null +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java @@ -0,0 +1,122 @@ +package fr.insee.rmes.bauhaus_services.operations.documentations.documents; + +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardCopyOption; +import java.util.HashMap; +import java.util.Map; + +import org.apache.http.HttpStatus; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.eclipse.rdf4j.model.IRI; +import org.eclipse.rdf4j.model.Model; +import org.eclipse.rdf4j.model.Resource; +import org.eclipse.rdf4j.model.Statement; +import org.eclipse.rdf4j.model.Value; +import org.eclipse.rdf4j.model.impl.LinkedHashModel; +import org.eclipse.rdf4j.model.impl.SimpleIRI; +import org.eclipse.rdf4j.repository.RepositoryConnection; +import org.eclipse.rdf4j.repository.RepositoryException; +import org.eclipse.rdf4j.repository.RepositoryResult; +import org.json.JSONArray; +import org.json.JSONObject; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import fr.insee.rmes.bauhaus_services.Constants; +import fr.insee.rmes.bauhaus_services.rdf_utils.PublicationUtils; +import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; +import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; +import fr.insee.rmes.config.Config; +import fr.insee.rmes.exceptions.ErrorCodes; +import fr.insee.rmes.exceptions.RmesException; +import fr.insee.rmes.exceptions.RmesNotFoundException; + +@Component +public class DocumentsPublication extends RdfService{ + + @Autowired + DocumentsUtils docUtils; + + + static final Logger logger = LogManager.getLogger(DocumentsPublication.class); + + public void publishAllDocumentsInSims(String idSims, Model model) throws RmesException { + // Get all files + JSONArray listDoc = docUtils.getListDocumentSims(idSims); + Map mapIdUrls = new HashMap<>(); + listDoc.forEach(doc -> mapIdUrls.put(docUtils.getIdFromJson((JSONObject) doc), docUtils.getDocumentUrlFromDocument((JSONObject) doc))); + + for (Map.Entry doc : mapIdUrls.entrySet()) { + String docId = doc.getKey().toString(); + String originalPath = doc.getValue(); + String filename = docUtils.getDocumentNameFromUrl(originalPath); + // Publish the physical files + copyFileInPublicationFolders(originalPath, filename); + + // Change url in document + model.addAll(getModelToPublish(docId,filename)); + } + + + + } + + private void copyFileInPublicationFolders(String originalPath, String filename) throws RmesException { + Path targetPathInt = Path.of(Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE, filename); + Path targetPathExt = Path.of(Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE, filename); + + try { + Files.copy(Path.of(originalPath), targetPathInt, StandardCopyOption.REPLACE_EXISTING); + Files.copy(Path.of(originalPath), targetPathExt, StandardCopyOption.REPLACE_EXISTING); + } catch (IOException e) { + logger.error(e.getMessage()); + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), + "IOException - Can't copy files"); + } + } + + private Model getModelToPublish(String documentId, String filename) throws RmesException { + Model model = new LinkedHashModel(); + Resource document = RdfUtils.documentIRI(documentId); + + RepositoryConnection con = repoGestion.getConnection(); + RepositoryResult documentStatements = repoGestion.getStatements(con, document); + + try { + if (!documentStatements.hasNext()) { + throw new RmesNotFoundException(ErrorCodes.DOCUMENT_UNKNOWN_ID, "Document not found", documentId); + } + while (documentStatements.hasNext()) { + Statement st = documentStatements.next(); + if (((SimpleIRI)st.getPredicate()).toString().endsWith("url")) { + Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); + IRI predicate = RdfUtils + .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); + Value object = RdfUtils.toURI(Path.of(Config.DOCUMENTS_BASEURL,filename).toString()); + model.add(subject, predicate, object, st.getContext()); + } else { + Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); + IRI predicate = RdfUtils + .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); + Value object = st.getObject(); + if (st.getObject() instanceof Resource) { + object = PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()); + } + model.add(subject, predicate, object, st.getContext()); + } + } + } catch (RepositoryException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), + Constants.REPOSITORY_EXCEPTION); + } + + finally { + repoGestion.closeStatements(documentStatements); + } + return model; + } + +} \ No newline at end of file diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index 1eb01640b..8020c6ff4 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -89,12 +89,22 @@ public void addDocumentsToRubric(Model model, Resource graph, List doc * @throws RmesException */ public JSONArray getListDocumentLink(String idSims, String idRubric, String lang) throws RmesException { - JSONArray allDocs = repoGestion.getResponseAsArray(DocumentsQueries.getDocumentsForSimsQuery(idSims, idRubric, langService.getLanguageByConfigLg(lang))); + JSONArray allDocs = repoGestion.getResponseAsArray(DocumentsQueries.getDocumentsForSimsRubricQuery(idSims, idRubric, langService.getLanguageByConfigLg(lang))); + formatDateInJsonArray(allDocs); + return allDocs; + } + + /** + * Get documents link to a metadata report + * @param idSims + * @return + * @throws RmesException + */ + public JSONArray getListDocumentSims(String idSims) throws RmesException { + JSONArray allDocs = repoGestion.getResponseAsArray(DocumentsQueries.getDocumentsForSimsQuery(idSims)); formatDateInJsonArray(allDocs); return allDocs; } - - @@ -143,7 +153,7 @@ protected String createDocumentID() throws RmesException { return id.toString(); } - private Integer getIdFromJson(JSONObject json) { + public Integer getIdFromJson(JSONObject json) { if (json.length() == 0) { return null; } else { @@ -420,7 +430,7 @@ private void deleteFile(String docUrl) { } } - private String getDocumentNameFromUrl(String docUrl) { + public String getDocumentNameFromUrl(String docUrl) { if (docUrl.contains("\\")) return StringUtils.substringAfterLast(docUrl, "\\"); return StringUtils.substringAfterLast(docUrl, "/"); } @@ -451,7 +461,7 @@ private IRI getDocumentUri(IRI url) throws RmesException { return RdfUtils.toURI(uri.getString(Constants.DOCUMENT)); } - private String getDocumentUrlFromDocument(JSONObject jsonDoc) { + public String getDocumentUrlFromDocument(JSONObject jsonDoc) { return jsonDoc.getString(Constants.URL).replace(SCHEME_FILE, ""); } diff --git a/src/main/java/fr/insee/rmes/config/Config.java b/src/main/java/fr/insee/rmes/config/Config.java index 218bfa6c8..870bfcd95 100644 --- a/src/main/java/fr/insee/rmes/config/Config.java +++ b/src/main/java/fr/insee/rmes/config/Config.java @@ -52,6 +52,7 @@ public class Config { public static String DOCUMENTS_STORAGE_GESTION = ""; public static String DOCUMENTS_STORAGE_PUBLICATION_EXTERNE = ""; public static String DOCUMENTS_STORAGE_PUBLICATION_INTERNE = ""; + public static String DOCUMENTS_BASEURL = ""; public static String PRODUCTS_GRAPH = ""; @@ -223,6 +224,7 @@ private static void readConfigForOperations(Environment env) { Config.DOCUMENTS_STORAGE_GESTION = env.getProperty("fr.insee.rmes.bauhaus.storage.document.gestion"); Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE = env.getProperty("fr.insee.rmes.bauhaus.storage.document.publication"); Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE = env.getProperty("fr.insee.rmes.bauhaus.storage.document.publication.interne"); + Config.DOCUMENTS_BASEURL = env.getProperty("fr.insee.web4g.baseURL"); Config.PRODUCTS_GRAPH = BASE_GRAPH + env.getProperty("fr.insee.rmes.bauhaus.products.graph"); diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java index 50e6a8677..501a26c37 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java @@ -34,10 +34,15 @@ public static String getDocumentUriQuery(IRI url) throws RmesException { return buildRequest("getDocumentUriFromUrlQuery.ftlh", params); } - public static String getDocumentsForSimsQuery(String idSims, String idRubric, String uriLang) throws RmesException { + public static String getDocumentsForSimsRubricQuery(String idSims, String idRubric, String uriLang) throws RmesException { return getDocuments("",idSims,idRubric,null, uriLang) ; } + public static String getDocumentsForSimsQuery(String idSims) throws RmesException { + return getDocuments("",idSims,"",null, "") ; + } + + public static String getDocumentQuery(String id, boolean isLink) throws RmesException { return getDocuments(id,"","", isLink, "") ; } diff --git a/src/main/resources/bauhaus-dev.properties b/src/main/resources/bauhaus-dev.properties index 8655f6407..0fa6ae138 100644 --- a/src/main/resources/bauhaus-dev.properties +++ b/src/main/resources/bauhaus-dev.properties @@ -57,3 +57,4 @@ fr.insee.rmes.bauhaus.api.basepath= XXX fr.insee.rmes.bauhaus.storage.document.gestion = C:/Temp/bauhaus/storage/documents/gestion fr.insee.rmes.bauhaus.storage.document.publication = C:/Temp/bauhaus/storage/documents/pub1 fr.insee.rmes.bauhaus.storage.document.publication.interne = C:/Temp/bauhaus/storage/documents/pub2 +fr.insee.web4g.baseURL = https://www.insee.fr/fr/metadonnees/source/fichier From 5246d5b31859d1089a289d13f7696e26c72e7765 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 6 Apr 2021 14:36:10 +0200 Subject: [PATCH 215/243] Update OperationsResources.java --- .../insee/rmes/webservice/operations/OperationsResources.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java index d5dc7e9c7..81724c710 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/OperationsResources.java @@ -30,6 +30,7 @@ import fr.insee.rmes.config.swagger.model.IdLabelAltLabel; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.model.operations.Operation; +import fr.insee.rmes.utils.FilesUtils; import fr.insee.rmes.utils.XMLUtils; import fr.insee.rmes.webservice.OperationsCommonResources; import io.swagger.v3.oas.annotations.Parameter; @@ -98,7 +99,7 @@ public Response getCodeBook( @HeaderParam("Accept") String acceptHeader, @Parameter(schema = @Schema(type = "string", format = "binary", description = "file 2")) @FormDataParam(value = "dicoVar") InputStream isCodeBook) throws IOException, RmesException { String ddi = IOUtils.toString(isDDI, StandardCharsets.UTF_8); - File codeBookFile = fr.insee.rmes.utils.FileUtils.streamToFile(isCodeBook, "dicoVar",".odt"); + File codeBookFile = FilesUtils.streamToFile(isCodeBook, "dicoVar",".odt"); Response response; try { response = operationsService.getCodeBookExport(ddi,codeBookFile, acceptHeader); From bc42d3162c1c13dac7d8ced718ccba00a654b289 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 6 Apr 2021 16:10:52 +0200 Subject: [PATCH 216/243] Publish links --- .../documents/DocumentsPublication.java | 55 ++++++++++++++++--- .../documents/DocumentsUtils.java | 18 +++++- .../documentations/DocumentsQueries.java | 9 ++- 3 files changed, 68 insertions(+), 14 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java index 09ee5c4c1..80d511460 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java @@ -44,8 +44,9 @@ public class DocumentsPublication extends RdfService{ static final Logger logger = LogManager.getLogger(DocumentsPublication.class); public void publishAllDocumentsInSims(String idSims, Model model) throws RmesException { - // Get all files + // Get all documents JSONArray listDoc = docUtils.getListDocumentSims(idSims); + Map mapIdUrls = new HashMap<>(); listDoc.forEach(doc -> mapIdUrls.put(docUtils.getIdFromJson((JSONObject) doc), docUtils.getDocumentUrlFromDocument((JSONObject) doc))); @@ -59,8 +60,12 @@ public void publishAllDocumentsInSims(String idSims, Model model) throws RmesExc // Change url in document model.addAll(getModelToPublish(docId,filename)); } - + //Get all links + JSONArray listLinks = docUtils.getListLinksSims(idSims); + for (Object link : listLinks) { + model.addAll(getLinkModelToPublish(docUtils.getIdFromJson((JSONObject)link).toString())); + } } @@ -99,13 +104,7 @@ private Model getModelToPublish(String documentId, String filename) throws RmesE model.add(subject, predicate, object, st.getContext()); } else { Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); - IRI predicate = RdfUtils - .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); - Value object = st.getObject(); - if (st.getObject() instanceof Resource) { - object = PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()); - } - model.add(subject, predicate, object, st.getContext()); + renameAndAddTripleToModel(model, st, subject); } } } catch (RepositoryException e) { @@ -118,5 +117,43 @@ private Model getModelToPublish(String documentId, String filename) throws RmesE } return model; } + + private Model getLinkModelToPublish(String linkId) throws RmesException { + Model model = new LinkedHashModel(); + Resource link = RdfUtils.linkIRI(linkId); + + RepositoryConnection con = repoGestion.getConnection(); + RepositoryResult linkStatements = repoGestion.getStatements(con, link); + + try { + if (!linkStatements.hasNext()) { + throw new RmesNotFoundException(ErrorCodes.LINK_UNKNOWN_ID, "Link not found", linkId); + } + while (linkStatements.hasNext()) { + Statement st = linkStatements.next(); + Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); + renameAndAddTripleToModel(model, st, subject); + + } + } catch (RepositoryException e) { + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), + Constants.REPOSITORY_EXCEPTION); + } + + finally { + repoGestion.closeStatements(linkStatements); + } + return model; + } + + public void renameAndAddTripleToModel(Model model, Statement st, Resource subject) { + IRI predicate = RdfUtils + .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); + Value object = st.getObject(); + if (st.getObject() instanceof Resource) { + object = PublicationUtils.tranformBaseURIToPublish((Resource) st.getObject()); + } + model.add(subject, predicate, object, st.getContext()); + } } \ No newline at end of file diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index 15ddee85f..7d5963d37 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -97,7 +97,7 @@ public JSONArray getListDocumentLink(String idSims, String idRubric, String lang } /** - * Get documents link to a metadata report + * Get documents link to a metadata report (no links) * @param idSims * @return * @throws RmesException @@ -108,7 +108,17 @@ public JSONArray getListDocumentSims(String idSims) throws RmesException { return allDocs; } - + /** + * Get links link to a metadata report (no document) + * @param idSims + * @return + * @throws RmesException + */ + public JSONArray getListLinksSims(String idSims) throws RmesException { + JSONArray allLinks = repoGestion.getResponseAsArray(DocumentsQueries.getLinksForSimsQuery(idSims)); + formatDateInJsonArray(allLinks); + return allLinks; + } /** * Get all documents @@ -474,6 +484,10 @@ private IRI getDocumentUri(IRI url) throws RmesException { public String getDocumentUrlFromDocument(JSONObject jsonDoc) { return jsonDoc.getString(Constants.URL).replace(SCHEME_FILE, ""); } + + public boolean isDocument(JSONObject jsonDoc) { + return jsonDoc.getString(Constants.URI).matches(Config.DOCUMENTS_BASE_URI); + } public void checkFileNameValidity(String fileName) throws RmesNotAcceptableException { if (fileName == null || fileName.trim().isEmpty()) { diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java index 5365eb108..4cd06b354 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java @@ -39,9 +39,12 @@ public static String getDocumentsForSimsRubricQuery(String idSims, String idRubr } public static String getDocumentsForSimsQuery(String idSims) throws RmesException { - return getDocuments("",idSims,"",null, "") ; + return getDocuments("",idSims,"",false, "") ; } + public static String getLinksForSimsQuery(String idSims) throws RmesException { + return getDocuments("",idSims,"",true, "") ; + } public static String getDocumentQuery(String id, boolean isLink) throws RmesException { return getDocuments(id,"","", isLink, "") ; @@ -49,7 +52,7 @@ public static String getDocumentQuery(String id, boolean isLink) throws RmesExce public static String getSimsByDocument(String id, boolean isLink) throws RmesException { if (params==null) {initParams();} - params.put("ID", (isLink ? Config.LINKS_BASE_URI : Config.DOCUMENTS_BASE_URI) + "/" + id); + params.put("ID", getDocType(isLink) + "/" + id); return buildRequest("getSimsByDocument.ftlh", params); } @@ -72,7 +75,7 @@ private static String getDocType(Boolean isLink) { if (isLink == null) { return ""; } - return (Boolean.TRUE.equals(isLink) ? "/page/" :"/document/"); + return (Boolean.TRUE.equals(isLink) ? Config.LINKS_BASE_URI :Config.DOCUMENTS_BASE_URI); } From 8ea33c8ce0a78e580345fb14aa2d4245a1cfebca Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Wed, 7 Apr 2021 13:16:48 +0200 Subject: [PATCH 217/243] feat: solve issue with Structure --- .../bauhaus_services/structures/utils/StructureUtils.java | 4 ++-- .../resources/request/structures/getMutualizedComponent.ftlh | 2 +- .../resources/request/structures/getMutualizedComponents.ftlh | 2 +- src/main/resources/request/structures/getStructure.ftlh | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java index a436fb0e7..7d7c38e5c 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/structures/utils/StructureUtils.java @@ -243,8 +243,8 @@ public void createRdfStructure(Structure structure, String structureId, IRI stru RdfUtils.addTripleDateTime(structureIri, DCTERMS.MODIFIED, structure.getUpdated(), model, graph); RdfUtils.addTripleString(structureIri, RDFS.LABEL, structure.getLabelLg2(), Config.LG2, model, graph); - RdfUtils.addTripleString(structureIri, DC.DESCRIPTION, structure.getDescriptionLg1(), Config.LG1, model, graph); - RdfUtils.addTripleString(structureIri, DC.DESCRIPTION, structure.getDescriptionLg2(), Config.LG2, model, graph); + RdfUtils.addTripleString(structureIri, RDFS.COMMENT, structure.getDescriptionLg1(), Config.LG1, model, graph); + RdfUtils.addTripleString(structureIri, RDFS.COMMENT, structure.getDescriptionLg2(), Config.LG2, model, graph); RdfUtils.addTripleString(structureIri, DC.CREATOR, structure.getCreator(), model, graph); RdfUtils.addTripleString(structureIri, DC.CONTRIBUTOR, structure.getContributor(), model, graph); diff --git a/src/main/resources/request/structures/getMutualizedComponent.ftlh b/src/main/resources/request/structures/getMutualizedComponent.ftlh index e36771f03..52e33c379 100644 --- a/src/main/resources/request/structures/getMutualizedComponent.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponent.ftlh @@ -5,7 +5,7 @@ WHERE { skos:notation ?identifiant ; rdf:type ?type ; rdfs:label ?labelLg1 . - + filter ( ?type = qb:DimensionProperty || ?type = qb:AttributeProperty || ?type = qb:MeasureProperty ) OPTIONAL { ?component dc:creator ?creator . } . diff --git a/src/main/resources/request/structures/getMutualizedComponents.ftlh b/src/main/resources/request/structures/getMutualizedComponents.ftlh index a50b3f1c2..d92663f70 100644 --- a/src/main/resources/request/structures/getMutualizedComponents.ftlh +++ b/src/main/resources/request/structures/getMutualizedComponents.ftlh @@ -6,7 +6,7 @@ WHERE { rdf:type ?type ; rdfs:label ?labelLg1 . - + filter ( ?type = qb:DimensionProperty || ?type = qb:AttributeProperty || ?type = qb:MeasureProperty ) OPTIONAL { ?component dc:creator ?creator . } . diff --git a/src/main/resources/request/structures/getStructure.ftlh b/src/main/resources/request/structures/getStructure.ftlh index 34b28d92a..7418f3f40 100644 --- a/src/main/resources/request/structures/getStructure.ftlh +++ b/src/main/resources/request/structures/getStructure.ftlh @@ -34,11 +34,11 @@ WHERE { } . OPTIONAL { - ?structure dc:description ?descriptionLg1 . + ?structure rdfs:comment ?descriptionLg1 . FILTER (lang(?descriptionLg1) = '${LG1}') } . OPTIONAL { - ?structure dc:description ?descriptionLg2 + ?structure rdfs:comment ?descriptionLg2 FILTER (lang(?descriptionLg2) = '${LG2}') } . } From 79261a90d5feb494815205ef6905f2ad19fd4354 Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Fri, 9 Apr 2021 13:43:38 +0200 Subject: [PATCH 218/243] fix: solve issue when fetching component for a structure --- .../resources/request/structures/getComponentsForAStructure.ftlh | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/resources/request/structures/getComponentsForAStructure.ftlh b/src/main/resources/request/structures/getComponentsForAStructure.ftlh index e8ae832f3..f02f4fae2 100644 --- a/src/main/resources/request/structures/getComponentsForAStructure.ftlh +++ b/src/main/resources/request/structures/getComponentsForAStructure.ftlh @@ -21,6 +21,7 @@ WHERE { rdf:type ?type ; rdfs:label ?labelLg1 . + filter ( ?type = qb:DimensionProperty || ?type = qb:AttributeProperty || ?type = qb:MeasureProperty ) OPTIONAL { ?component skos:notation ?identifiant . From 8987f609e2929a5d4753181f0ce2815dc8adc407 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 12 Apr 2021 14:02:59 +0200 Subject: [PATCH 219/243] Remove unused import --- .../operations/documentations/DocumentationPublication.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java index cbc6cbdee..fb06dfdc6 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java @@ -1,8 +1,5 @@ package fr.insee.rmes.bauhaus_services.operations.documentations; -import java.util.ArrayList; -import java.util.List; - import org.apache.http.HttpStatus; import org.eclipse.rdf4j.model.IRI; import org.eclipse.rdf4j.model.Model; From fc9c5f18c0ee6d82a52c20285041b1eb48b9d6bf Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 12 Apr 2021 14:37:22 +0200 Subject: [PATCH 220/243] Add active modules for front --- .../rmes/webservice/PublicResources.java | 22 +++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/webservice/PublicResources.java b/src/main/java/fr/insee/rmes/webservice/PublicResources.java index 52636fe14..ac8e69adf 100644 --- a/src/main/java/fr/insee/rmes/webservice/PublicResources.java +++ b/src/main/java/fr/insee/rmes/webservice/PublicResources.java @@ -1,5 +1,10 @@ package fr.insee.rmes.webservice; +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; import java.util.TreeSet; import javax.ws.rs.GET; @@ -8,6 +13,7 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; +import org.apache.commons.io.FileUtils; import org.apache.http.HttpStatus; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; @@ -71,7 +77,7 @@ public class PublicResources { @Path("/init") @Produces(MediaType.APPLICATION_JSON) @Operation(operationId = "getInit", summary = "Initial properties", responses = { @ApiResponse(content = @Content(mediaType = "application/json", schema = @Schema(implementation = Init.class)))}) - public Response getProperties() { + public Response getProperties() throws RmesException { JSONObject props = new JSONObject(); try { props.put("appHost", Config.APP_HOST); @@ -81,13 +87,25 @@ public Response getProperties() { props.put("lg1", Config.LG1); props.put("lg2", Config.LG2); props.put("authType", AuthType.getAuthType()); + props.put("modules", getActiveModules()); } catch (Exception e) { logger.error(e.getMessage(), e); - throw e; + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR,e.getMessage(),e.getClass().getSimpleName()); } return Response.status(HttpStatus.SC_OK).entity(props.toString()).build(); } + private List getActiveModules() { + String dirPath = Config.DOCUMENTS_STORAGE_GESTION + "\\BauhausActiveModules.txt"; + File file = new File(dirPath); + try { + return FileUtils.readLines(file, StandardCharsets.UTF_8);//Read lines in a list + } catch (IOException e) { + logger.error(e.getMessage(), e); + return new ArrayList<>(); + } + } + @GET @Path("/stamps") @Produces(MediaType.APPLICATION_JSON) From a13829453d5dbb33f8fef8c3a457e0a962e9a6c7 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 12 Apr 2021 16:01:54 +0200 Subject: [PATCH 221/243] Improvements for export (non-achieved) --- .../rmes/bauhaus_services/Constants.java | 1 + .../documentations/DocumentationExport.java | 51 ++++++++++-------- .../operations/MetadataReportResources.java | 2 +- .../xslTransformerFiles/exportRmes.zip | Bin 0 -> 17705 bytes .../xslTransformerFiles/rmesPattern.zip | Bin 0 -> 17705 bytes .../toZipForLabel/export.zip | Bin 0 -> 12819 bytes .../xslTransformerFiles/toZipForRmes.zip | Bin 0 -> 15933 bytes .../toZipForRmes/META-INF/manifest.xml | 12 +++++ .../toZipForRmes/Thumbnails/thumbnail.png | Bin 0 -> 7271 bytes .../toZipForRmes/export.zip | Bin 0 -> 14268 bytes .../toZipForRmes/layout-cache | Bin 0 -> 35 bytes .../toZipForRmes/manifest.rdf | 18 +++++++ .../xslTransformerFiles/toZipForRmes/meta.xml | 2 + .../xslTransformerFiles/toZipForRmes/mimetype | 1 + .../toZipForRmes/settings.xml | 2 + .../toZipForRmes/styles.xml | 2 + 16 files changed, 68 insertions(+), 23 deletions(-) create mode 100644 src/main/resources/xslTransformerFiles/exportRmes.zip create mode 100644 src/main/resources/xslTransformerFiles/rmesPattern.zip create mode 100644 src/main/resources/xslTransformerFiles/toZipForLabel/export.zip create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes.zip create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/META-INF/manifest.xml create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/Thumbnails/thumbnail.png create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/export.zip create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/layout-cache create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/manifest.rdf create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/meta.xml create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/mimetype create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/settings.xml create mode 100644 src/main/resources/xslTransformerFiles/toZipForRmes/styles.xml diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 1d95c0297..e41063561 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -12,6 +12,7 @@ public class Constants { public static final String CODE_LIST_FREQ = "CL_FREQ"; public static final String CODE_LIST_SOURCE_CATEGORY = "CL_SOURCE_CATEGORY"; public static final String CONCEPT = "concept"; + public static final String CONTENT = "content"; public static final String CREATOR = "creator"; public static final String CREATORS = "creators"; public static final String CONTRIBUTOR = "contributor"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index d3f4617d3..5d089ad88 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -100,26 +100,31 @@ public File export(String simsXML,String operationXML,String indicatorXML,String String msdXML = documentationsUtils.buildShellSims(); String parametersXML = buildParams(lg1,lg2,includeEmptyMas,targetType); - File output = null; - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt.xsl"); - - InputStream odtFile = null ; + File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.XML)); + InputStream xslFileIS = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt.xsl"); + InputStream zipToCompleteIS = null; + InputStream odtFileIS = null ; + if(goal == Constants.GOAL_RMES){ - odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); - output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); + odtFileIS = getClass().getResourceAsStream("/xslTransformerFiles/rmesPatternContent.xml"); + zipToCompleteIS = getClass().getResourceAsStream("/xslTransformerFiles/toZipForRmes/export.zip"); + } if(goal == Constants.GOAL_COMITE_LABEL){ - odtFile = getClass().getResourceAsStream("/xslTransformerFiles/labelPatternContent.xml"); - output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.XML)); + odtFileIS = getClass().getResourceAsStream("/xslTransformerFiles/labelPatternContent.xml"); + zipToCompleteIS = getClass().getResourceAsStream("/xslTransformerFiles/toZipForLabel/export.zip"); } + OutputStream osOutputFile = FileUtils.openOutputStream(output); output.deleteOnExit(); PrintStream printStream= null; Path tempDir= Files.createTempDirectory("forExport"); - + String fileName="export.odt"; + Path finalPath = Paths.get(tempDir.toString()+"/"+fileName); + try{ // prepare transformer - StreamSource xsrc = new StreamSource(xslFile); + StreamSource xsrc = new StreamSource(xslFileIS); TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); @@ -137,28 +142,30 @@ public File export(String simsXML,String operationXML,String indicatorXML,String // prepare output printStream = new PrintStream(osOutputFile); // transformation - xsltTransformer.transform(new StreamSource(odtFile), new StreamResult(printStream)); + xsltTransformer.transform(new StreamSource(odtFileIS), new StreamResult(printStream)); //create odt - if(goal == Constants.GOAL_COMITE_LABEL){ - FilesUtils.addFileToZipFolder(output,new File("/xslTransformerFiles/toZipForLabel.zip")); - FileUtils.copyFile(new File("/xslTransformerFiles/toZipForLabel.zip"), output); - Files.move(output.toPath(), tempDir.resolve(Paths.get("export.odt")), StandardCopyOption.REPLACE_EXISTING); - } + Path contentPath = Paths.get(tempDir.toString()+"/content.xml"); + Files.copy(Paths.get(output.getAbsolutePath()), contentPath, + StandardCopyOption.REPLACE_EXISTING); + Path zipPath = Paths.get(tempDir.toString()+"/export.zip"); + Files.copy(zipToCompleteIS, zipPath, + StandardCopyOption.REPLACE_EXISTING); + FilesUtils.addFileToZipFolder(contentPath.toFile(),zipPath.toFile()); + Files.copy(zipPath, finalPath, + StandardCopyOption.REPLACE_EXISTING); + } catch (TransformerException e) { logger.error(e.getMessage()); } finally { - odtFile.close(); - xslFile.close(); + odtFileIS.close(); + xslFileIS.close(); osOutputFile.close(); printStream.close(); } logger.debug("End To export documentation"); - if(goal == Constants.GOAL_RMES){ - return(output); - } - return (new File(tempDir.toString(),"export.odt")); + return (finalPath.toFile()); } private String buildParams(Boolean lg1, Boolean lg2, Boolean includeEmptyMas, String targetType) { diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index 92a04944c..2991966bc 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -296,7 +296,7 @@ public Response setSimsValidation( */ @GET - @Path("/metadataReport/export/{id}/{emptyMas}/{lg1}/{lg2}") + @Path("/metadataReport/export/{id}") @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") public Response getSimsExport(@Parameter( diff --git a/src/main/resources/xslTransformerFiles/exportRmes.zip b/src/main/resources/xslTransformerFiles/exportRmes.zip new file mode 100644 index 0000000000000000000000000000000000000000..01d306a5a98278c5f54b021bd3fd3f735df159c2 GIT binary patch literal 17705 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 HfA9StX4yn5 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/rmesPattern.zip b/src/main/resources/xslTransformerFiles/rmesPattern.zip new file mode 100644 index 0000000000000000000000000000000000000000..01d306a5a98278c5f54b021bd3fd3f735df159c2 GIT binary patch literal 17705 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 HfA9StX4yn5 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForLabel/export.zip b/src/main/resources/xslTransformerFiles/toZipForLabel/export.zip new file mode 100644 index 0000000000000000000000000000000000000000..f248b63a28a9021e51e83087fd89b0c305fff186 GIT binary patch literal 12819 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 O{gk|VD2jAHzx_YC*NLD2 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes.zip b/src/main/resources/xslTransformerFiles/toZipForRmes.zip new file mode 100644 index 0000000000000000000000000000000000000000..bbfacda12ef0dc691dfd0dd47faa54da52b094a3 GIT binary patch literal 15933 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/META-INF/manifest.xml b/src/main/resources/xslTransformerFiles/toZipForRmes/META-INF/manifest.xml new file mode 100644 index 000000000..373e8f670 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForRmes/META-INF/manifest.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/Thumbnails/thumbnail.png b/src/main/resources/xslTransformerFiles/toZipForRmes/Thumbnails/thumbnail.png new file mode 100644 index 0000000000000000000000000000000000000000..a3c657ca309bcad76437d90bd1d3cf07379d9d7c GIT binary patch literal 7271 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/export.zip b/src/main/resources/xslTransformerFiles/toZipForRmes/export.zip new file mode 100644 index 0000000000000000000000000000000000000000..0e3cc39f797d79c00ebc0eb95f70a6eaf2715e02 GIT binary patch literal 14268 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/layout-cache b/src/main/resources/xslTransformerFiles/toZipForRmes/layout-cache new file mode 100644 index 0000000000000000000000000000000000000000..632800f39ad2bf9a030c69a79357a53795e880b9 GIT binary patch literal 35 gcmZQ%U}PweXJB9m;bmap&;c?yV4MR$1`7}a04s6=TmS$7 literal 0 HcmV?d00001 diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/manifest.rdf b/src/main/resources/xslTransformerFiles/toZipForRmes/manifest.rdf new file mode 100644 index 000000000..927e206bb --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForRmes/manifest.rdf @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + + + + diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/meta.xml b/src/main/resources/xslTransformerFiles/toZipForRmes/meta.xml new file mode 100644 index 000000000..856e4b838 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForRmes/meta.xml @@ -0,0 +1,2 @@ + +LibreOffice/6.4.6.2$Windows_X86_64 LibreOffice_project/0ce51a4fd21bff07a5c061082cc82c5ed232f115 \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/mimetype b/src/main/resources/xslTransformerFiles/toZipForRmes/mimetype new file mode 100644 index 000000000..2e95b81c9 --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForRmes/mimetype @@ -0,0 +1 @@ +application/vnd.oasis.opendocument.text \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/settings.xml b/src/main/resources/xslTransformerFiles/toZipForRmes/settings.xml new file mode 100644 index 000000000..8921be01d --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForRmes/settings.xml @@ -0,0 +1,2 @@ + +004207120110truefalseview217568350100420692010801false100falsefalsefalse1truefalsefalsetruefalsetruefalsetruetruetruefalsefalse0truefalsetruefalsefalse0falsetruefalsefalsefalsefalsehigh-resolutionfalsefalsetruefalsefalsefalsefalsetruefalsetruefalsefalsefalsefalsetruefalse1621125falsefalsefalsefalsefalse1621125falsefalsetruefalsetruetruefalsefalsetruefalsetruefalsefalsefalsefalsetruefalsefalsefalsefalse0truefalsefalsetruetruetruefalsetruefalsetruefalsefalsetruefalsetrue \ No newline at end of file diff --git a/src/main/resources/xslTransformerFiles/toZipForRmes/styles.xml b/src/main/resources/xslTransformerFiles/toZipForRmes/styles.xml new file mode 100644 index 000000000..e9ebbb56a --- /dev/null +++ b/src/main/resources/xslTransformerFiles/toZipForRmes/styles.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file From 7afe379a08241404a0a7b6d1685f3f0b17d4b274 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Mon, 12 Apr 2021 16:57:20 +0200 Subject: [PATCH 222/243] Fix issue (openjdk11 instead of openjdk8) --- .../documents/DocumentsPublication.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java index 80d511460..19850a534 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java @@ -3,6 +3,7 @@ import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import java.util.HashMap; import java.util.Map; @@ -70,12 +71,12 @@ public void publishAllDocumentsInSims(String idSims, Model model) throws RmesExc } private void copyFileInPublicationFolders(String originalPath, String filename) throws RmesException { - Path targetPathInt = Path.of(Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE, filename); - Path targetPathExt = Path.of(Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE, filename); + Path targetPathInt = Paths.get(Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE, filename); + Path targetPathExt = Paths.get(Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE, filename); try { - Files.copy(Path.of(originalPath), targetPathInt, StandardCopyOption.REPLACE_EXISTING); - Files.copy(Path.of(originalPath), targetPathExt, StandardCopyOption.REPLACE_EXISTING); + Files.copy(Paths.get(originalPath), targetPathInt, StandardCopyOption.REPLACE_EXISTING); + Files.copy(Paths.get(originalPath), targetPathExt, StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { logger.error(e.getMessage()); throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), @@ -100,7 +101,7 @@ private Model getModelToPublish(String documentId, String filename) throws RmesE Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); IRI predicate = RdfUtils .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); - Value object = RdfUtils.toURI(Path.of(Config.DOCUMENTS_BASEURL,filename).toString()); + Value object = RdfUtils.toURI(Paths.get(Config.DOCUMENTS_BASEURL,filename).toString()); model.add(subject, predicate, object, st.getContext()); } else { Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); From 7933f2a832438598613ae81dc85582a6d2f74e68 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 13 Apr 2021 10:24:15 +0200 Subject: [PATCH 223/243] Fix issue with adding file that erase all others --- src/main/java/fr/insee/rmes/utils/FilesUtils.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/main/java/fr/insee/rmes/utils/FilesUtils.java b/src/main/java/fr/insee/rmes/utils/FilesUtils.java index ec63951a2..3f325edeb 100644 --- a/src/main/java/fr/insee/rmes/utils/FilesUtils.java +++ b/src/main/java/fr/insee/rmes/utils/FilesUtils.java @@ -20,6 +20,8 @@ import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.zeroturnaround.zip.FileSource; +import org.zeroturnaround.zip.ZipEntrySource; import org.zeroturnaround.zip.ZipUtil; public class FilesUtils { @@ -79,17 +81,12 @@ public static File zipFile(File inputFile) throws IOException { finally { if (zipfs != null) zipfs.close();} } - public static void zipFolder(String folderToZip, String zipName) throws IOException { - ZipUtil.pack(new File("D:\\reports\\january\\"), new File("D:\\reports\\january.zip")); - } public static void addFileToZipFolder(File fileToAdd, File zipArchive) { - ZipUtil.packEntry(fileToAdd, zipArchive); + ZipEntrySource entry = new FileSource(fileToAdd.getName(), fileToAdd); + ZipUtil.addEntry(zipArchive, entry); } - public static void renameFile(Path filePath, String newName, Path newFolder) { - - } private FilesUtils() { throw new IllegalStateException("Utility class"); From 4c9a4135e596d51f61de8f5c60dceeb9a07bfe80 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 13 Apr 2021 16:04:37 +0200 Subject: [PATCH 224/243] Fix issue (missing id when publishing a document or link) --- .../documentations/documents/getDocumentQuery.ftlh | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh b/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh index 3494b33d7..03db2e4ca 100644 --- a/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh +++ b/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh @@ -1,4 +1,4 @@ -SELECT distinct ?uri ?url ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?updatedDate ?lang +SELECT distinct ?id ?uri ?url ?labelLg1 ?labelLg2 ?descriptionLg1 ?descriptionLg2 ?updatedDate ?lang FROM <${DOCUMENTS_GRAPH}> <#if idSims != ""> @@ -38,7 +38,10 @@ WHERE { <#if id != ""> FILTER(REPLACE( STR(?uri) , '(.*/)(\\w.+$)', '$2' ) = '${id}') - + BIND('${id}' ) AS ?id) . +<#else> + BIND(REPLACE( STR(?uri) , '(.*/)(\\w.+$)', '$2' ) AS ?id) . + <#if idRubric != ""> FILTER(REGEX(STR(?text), '${idRubric}')) From 1cef776c769c4b1d5e7a65d1e3d8c5ac410052e8 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 13 Apr 2021 16:19:58 +0200 Subject: [PATCH 225/243] Try to fix misnor issue --- src/main/java/fr/insee/rmes/webservice/PublicResources.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/webservice/PublicResources.java b/src/main/java/fr/insee/rmes/webservice/PublicResources.java index ac8e69adf..6f54b2325 100644 --- a/src/main/java/fr/insee/rmes/webservice/PublicResources.java +++ b/src/main/java/fr/insee/rmes/webservice/PublicResources.java @@ -96,7 +96,7 @@ public Response getProperties() throws RmesException { } private List getActiveModules() { - String dirPath = Config.DOCUMENTS_STORAGE_GESTION + "\\BauhausActiveModules.txt"; + String dirPath = Config.DOCUMENTS_STORAGE_GESTION + "/BauhausActiveModules.txt"; File file = new File(dirPath); try { return FileUtils.readLines(file, StandardCharsets.UTF_8);//Read lines in a list From fd1114081e903d01203756b22fcfd907c046a67e Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 13 Apr 2021 16:45:38 +0200 Subject: [PATCH 226/243] Update copy document to avoid null error --- .../documentations/documents/DocumentsPublication.java | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java index 19850a534..1cb8a4ae8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java @@ -71,12 +71,13 @@ public void publishAllDocumentsInSims(String idSims, Model model) throws RmesExc } private void copyFileInPublicationFolders(String originalPath, String filename) throws RmesException { - Path targetPathInt = Paths.get(Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE, filename); - Path targetPathExt = Paths.get(Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE, filename); + Path file = Paths.get(originalPath); + Path targetPathInt = Paths.get(Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE); + Path targetPathExt = Paths.get(Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE); try { - Files.copy(Paths.get(originalPath), targetPathInt, StandardCopyOption.REPLACE_EXISTING); - Files.copy(Paths.get(originalPath), targetPathExt, StandardCopyOption.REPLACE_EXISTING); + Files.copy(file, targetPathInt.resolve(file.getFileName()), StandardCopyOption.REPLACE_EXISTING); + Files.copy(file, targetPathExt.resolve(file.getFileName()), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { logger.error(e.getMessage()); throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), From 57217c3e6720da5a033cdc7901c07c73ef58763b Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Tue, 13 Apr 2021 16:56:50 +0200 Subject: [PATCH 227/243] Add log to understand error --- .../documentations/documents/DocumentsPublication.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java index 1cb8a4ae8..16038c39b 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java @@ -56,7 +56,7 @@ public void publishAllDocumentsInSims(String idSims, Model model) throws RmesExc String originalPath = doc.getValue(); String filename = docUtils.getDocumentNameFromUrl(originalPath); // Publish the physical files - copyFileInPublicationFolders(originalPath, filename); + copyFileInPublicationFolders(originalPath); // Change url in document model.addAll(getModelToPublish(docId,filename)); @@ -70,7 +70,7 @@ public void publishAllDocumentsInSims(String idSims, Model model) throws RmesExc } - private void copyFileInPublicationFolders(String originalPath, String filename) throws RmesException { + private void copyFileInPublicationFolders(String originalPath) throws RmesException { Path file = Paths.get(originalPath); Path targetPathInt = Paths.get(Config.DOCUMENTS_STORAGE_PUBLICATION_INTERNE); Path targetPathExt = Paths.get(Config.DOCUMENTS_STORAGE_PUBLICATION_EXTERNE); @@ -80,8 +80,8 @@ private void copyFileInPublicationFolders(String originalPath, String filename) Files.copy(file, targetPathExt.resolve(file.getFileName()), StandardCopyOption.REPLACE_EXISTING); } catch (IOException e) { logger.error(e.getMessage()); - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), - "IOException - Can't copy files"); + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getClass() + e.getMessage(), + e.getClass() + " - Can't copy files"); } } From 2577ca021c52b79eb8ffe0768e16c34a4b59a397 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 13 Apr 2021 18:16:51 +0200 Subject: [PATCH 228/243] Export sims as odt files --- .../operations/OperationsImpl.java | 46 +++++++---------- .../documentations/DocumentationExport.java | 51 +++++++------------ .../documentations/DocumentationsUtils.java | 2 +- 3 files changed, 38 insertions(+), 61 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index db5d0ea0d..af6f195b5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -125,12 +125,12 @@ public String getSeriesWithStamp(String stamp) throws RmesException { String resQuery = repoGestion.getResponseAsArray(SeriesQueries.seriesWithStampQuery(stamp)).toString(); return QueryUtils.correctEmptyGroupConcat(resQuery); } - + @Override public String getSeriesForSearchWithStamp(String stamp) throws RmesException { return seriesUtils.getSeriesForSearch(stamp); } - + @Override public Series getSeriesByID(String id) throws RmesException { return seriesUtils.getSeriesById(id); @@ -208,9 +208,9 @@ private InputStream transformFileOutputStreamInInputStream(OutputStream os) { path = (String) pathField.get(os); fis= new FileInputStream(path); - } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException | FileNotFoundException e) { - logger.error(e.getMessage(),e); - } + } catch (NoSuchFieldException | SecurityException | IllegalArgumentException | IllegalAccessException | FileNotFoundException e) { + logger.error(e.getMessage(),e); + } return(fis); } @@ -391,7 +391,7 @@ public Documentation getFullSimsForXml(String id) throws RmesException { public String getFullSimsForJson(String id) throws RmesException { return documentationsUtils.getFullSimsForJson(id).toString(); } - + @Override public String getMetadataReportOwner(String id) throws RmesException { return documentationsUtils.getDocumentationOwnersByIdSims(id); @@ -441,36 +441,26 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean ErrorCodes.SIMS_EXPORT_WITHOUT_LANGUAGE, "at least one language must be selected for export", "in export of sims: "+id); - File output; - InputStream is; try { - output = documentationsUtils.exportMetadataReport(id,includeEmptyMas, lg1, lg2,Constants.GOAL_RMES); - is = new FileInputStream(output); - } catch (Exception e1) { - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); + return documentationsUtils.exportMetadataReport(id,includeEmptyMas, lg1, lg2,Constants.GOAL_RMES); + } catch (IOException e) { + e.printStackTrace(); + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Error exporting sims"); } - String fileName = output.getName(); - ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); - return Response.ok(is, "application/vnd.oasis.opendocument.text").header(CONTENT_DISPOSITION, content).build(); } @Override public Response exportMetadataReportForLabel(String id) throws RmesException { - File output; - InputStream is; try { - output = documentationsUtils.exportMetadataReport(id,true, true, false, Constants.GOAL_COMITE_LABEL); - is = new FileInputStream(output); - } catch (Exception e1) { - throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e1.getMessage(), "Error export"); + return documentationsUtils.exportMetadataReport(id,true, true, false, Constants.GOAL_COMITE_LABEL); + } catch (IOException e) { + e.printStackTrace(); + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Error exporting sims"); } - String fileName = output.getName(); - ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); - return Response.ok(is, "application/vnd.oasis.opendocument.text").header(CONTENT_DISPOSITION, content).build(); } - + public Response exportMetadataReportOld(String id) throws RmesException { File output; InputStream is; @@ -484,8 +474,8 @@ public Response exportMetadataReportOld(String id) throws RmesException { ContentDisposition content = ContentDisposition.type(ATTACHMENT).fileName(fileName).build(); return Response.ok(is, MediaType.APPLICATION_OCTET_STREAM).header(CONTENT_DISPOSITION, content).build(); } - - + + @Override public Response exportTestMetadataReport() throws RmesException { File output; @@ -502,6 +492,6 @@ public Response exportTestMetadataReport() throws RmesException { } - + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 5d089ad88..4825d1460 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -2,6 +2,7 @@ import java.io.ByteArrayInputStream; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -13,6 +14,8 @@ import java.nio.file.Paths; import java.nio.file.StandardCopyOption; +import javax.ws.rs.core.Response; +import javax.ws.rs.core.StreamingOutput; import javax.xml.XMLConstants; import javax.xml.transform.Transformer; import javax.xml.transform.TransformerException; @@ -22,6 +25,8 @@ import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; +import org.apache.http.HttpStatus; +import org.glassfish.jersey.media.multipart.ContentDisposition; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -64,36 +69,8 @@ public File testExport() throws IOException { } return output; } - -// public File callXsltEmportTransfo(String paramPath,String goal)throws RmesException, IOException { -// -// File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.FLAT_ODT)); -// output.deleteOnExit(); -// -// InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt.xsl"); -// OutputStream osOutputFile = FileUtils.openOutputStream(output); -// InputStream odtFile ; -// if(goal == Constants.GOAL_RMES){ -// odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); -// } -// if(goal == Constants.GOAL_COMITE_LABEL){ -// odtFile = getClass().getResourceAsStream("/xslTransformerFiles/labelPattern.fodt"); -// } -// PrintStream printStream= null; -// -// try{ -// // prepare transformer -// StreamSource xsrc = new StreamSource(xslFile); -// TransformerFactory transformerFactory = new net.sf.saxon.TransformerFactoryImpl(); -// transformerFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); -// Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); -// } -// -// return null; -// -// } - public File export(String simsXML,String operationXML,String indicatorXML,String seriesXML, + public Response export(String simsXML,String operationXML,String indicatorXML,String seriesXML, String organizationsXML, String codeListsXML, String targetType, Boolean includeEmptyMas, Boolean lg1, Boolean lg2, String goal) throws RmesException, IOException { logger.debug("Begin To export documentation"); @@ -165,13 +142,23 @@ public File export(String simsXML,String operationXML,String indicatorXML,String } logger.debug("End To export documentation"); - return (finalPath.toFile()); - } + ContentDisposition content = ContentDisposition.type("attachment").fileName(fileName).build(); + + try { + return Response.ok( (StreamingOutput) out -> { + InputStream input = new FileInputStream( finalPath.toFile() ); + IOUtils.copy(input, out); + out.flush(); + } ).header( "Content-Disposition", content ).build(); + } catch ( Exception e ) { + logger.error(e.getMessage()); + throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Error downloading file"); + } + } private String buildParams(Boolean lg1, Boolean lg2, Boolean includeEmptyMas, String targetType) { String includeEmptyMasString=( includeEmptyMas ? "true" : "false"); String parametersXML=""; - // parametersXML=parametersXML.concat(Constants.XML_START_DOCUMENT); parametersXML=parametersXML.concat(Constants.XML_OPEN_PARAMETERS_TAG); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 44daa1401..a53ec9138 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -520,7 +520,7 @@ public File exportTestMetadataReport() throws IOException { return docExport.testExport(); } - public File exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2, String goal) throws IOException, RmesException { + public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean lg1, Boolean lg2, String goal) throws IOException, RmesException { String emptyXML=XMLUtils.produceEmptyXML(); Operation operation; From 38fe85ce043fc9cf619bfb07420eb0ad54286aa0 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 14 Apr 2021 09:05:54 +0200 Subject: [PATCH 229/243] Fix query when get a document --- .../operations/documentations/documents/getDocumentQuery.ftlh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh b/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh index 03db2e4ca..0f4251060 100644 --- a/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh +++ b/src/main/resources/request/operations/documentations/documents/getDocumentQuery.ftlh @@ -38,7 +38,7 @@ WHERE { <#if id != ""> FILTER(REPLACE( STR(?uri) , '(.*/)(\\w.+$)', '$2' ) = '${id}') - BIND('${id}' ) AS ?id) . + BIND('${id}' AS ?id) . <#else> BIND(REPLACE( STR(?uri) , '(.*/)(\\w.+$)', '$2' ) AS ?id) . From d63fe90ffdabeb4c615db4d4be996c62b78b8a35 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 14 Apr 2021 14:28:35 +0200 Subject: [PATCH 230/243] Use logger in exception --- .../rmes/bauhaus_services/operations/OperationsImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index af6f195b5..df463cad8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -444,7 +444,7 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean try { return documentationsUtils.exportMetadataReport(id,includeEmptyMas, lg1, lg2,Constants.GOAL_RMES); } catch (IOException e) { - e.printStackTrace(); + logger.error(e.getMessage()); throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Error exporting sims"); } } @@ -455,7 +455,7 @@ public Response exportMetadataReportForLabel(String id) throws RmesException { try { return documentationsUtils.exportMetadataReport(id,true, true, false, Constants.GOAL_COMITE_LABEL); } catch (IOException e) { - e.printStackTrace(); + logger.error(e.getMessage()); throw new RmesException(HttpStatus.SC_INTERNAL_SERVER_ERROR, e.getMessage(), "Error exporting sims"); } } From 80351a5eeb30c9eaeda024362cac71864b2ee0e5 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Wed, 14 Apr 2021 14:51:54 +0200 Subject: [PATCH 231/243] Fix merging bugs --- .../bauhaus_services/OperationsService.java | 2 ++ .../operations/OperationsImpl.java | 1 + .../documentations/DocumentationExport.java | 12 +++++------ .../documentations/DocumentationsUtils.java | 4 +--- .../operations/MetadataReportResources.java | 20 +++++++++++++++++++ 5 files changed, 29 insertions(+), 10 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java index 9fa36de8d..08e9e60c3 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/OperationsService.java @@ -153,4 +153,6 @@ public interface OperationsService { Status deleteMetadataReport(String id) throws RmesException; + Response exportMetadataReportForLabel(String id) throws RmesException; + } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index 89f65602b..c9eef48b5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -25,6 +25,7 @@ import org.springframework.stereotype.Service; import org.springframework.util.StreamUtils; +import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.OperationsService; import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationsUtils; import fr.insee.rmes.bauhaus_services.operations.documentations.MetadataStructureDefUtils; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java index 54a9db99f..455a67559 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationExport.java @@ -10,6 +10,7 @@ import java.nio.file.CopyOption; import java.nio.file.Files; import java.nio.file.Path; +import java.nio.file.Paths; import java.nio.file.StandardCopyOption; import javax.ws.rs.core.Response; @@ -33,6 +34,7 @@ import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.exceptions.RmesException; import fr.insee.rmes.external_services.export.ExportUtils; +import fr.insee.rmes.utils.FilesUtils; import fr.insee.rmes.utils.XMLUtils; @Component @@ -47,13 +49,14 @@ public class DocumentationExport { public Response export(String simsXML,String operationXML,String indicatorXML,String seriesXML, String organizationsXML, String codeListsXML, String targetType, - boolean includeEmptyMas, boolean lg1, boolean lg2) throws RmesException, IOException { + boolean includeEmptyMas, boolean lg1, boolean lg2, String goal) throws RmesException, IOException { logger.debug("Begin To export documentation"); String msdXML = documentationsUtils.buildShellSims(); String parametersXML = buildParams(lg1,lg2,includeEmptyMas,targetType); File output = File.createTempFile(Constants.OUTPUT, ExportUtils.getExtension(Constants.XML)); + output.deleteOnExit(); InputStream xslFileIS = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt.xsl"); InputStream zipToCompleteIS = null; InputStream odtFileIS = null ; @@ -68,17 +71,13 @@ public Response export(String simsXML,String operationXML,String indicatorXML,St zipToCompleteIS = getClass().getResourceAsStream("/xslTransformerFiles/toZipForLabel/export.zip"); } - OutputStream osOutputFile = FileUtils.openOutputStream(output); - - output.deleteOnExit(); - InputStream xslFile = getClass().getResourceAsStream("/xslTransformerFiles/sims2fodt.xsl"); OutputStream osOutputFile = FileUtils.openOutputStream(output); InputStream odtFile = getClass().getResourceAsStream("/xslTransformerFiles/rmesPattern.fodt"); PrintStream printStream= null; - Path tempDir= Files.createTempDirectory("forExport"); + Path tempDir= Files.createTempDirectory("forExport"); String fileName="export.odt"; Path finalPath = Paths.get(tempDir.toString()+"/"+fileName); @@ -90,7 +89,6 @@ public Response export(String simsXML,String operationXML,String indicatorXML,St Transformer xsltTransformer = transformerFactory.newTransformer(xsrc); // Pass parameters in a file - Path tempDir= Files.createTempDirectory("forExport"); addParameter ( xsltTransformer, "parametersFile", parametersXML,tempDir); addParameter ( xsltTransformer, "simsFile", simsXML,tempDir); addParameter ( xsltTransformer, "seriesFile", seriesXML,tempDir); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index 1e6afd0b4..fea502da5 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -574,11 +574,9 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean codeListsXML=codeListsXML.concat(Constants.XML_END_CODELIST_TAG); return docExport.export(simsXML,operationXML,indicatorXML,seriesXML, - organizationsXML,codeListsXML,targetType,includeEmptyMas,lg1,lg2); + organizationsXML,codeListsXML,targetType,includeEmptyMas,lg1,lg2,goal); } - - public MSD buildMSDFromJson(JSONArray jsonMsd) { List msd = new ArrayList<>(); MAS currentRubric; diff --git a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java index 7b8ec7b0e..f48c12cd3 100644 --- a/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java +++ b/src/main/java/fr/insee/rmes/webservice/operations/MetadataReportResources.java @@ -291,6 +291,7 @@ public Response setSimsValidation( /** * EXPORT * @param id + * @param lg1 * @param lg2 * @param includeEmptyMas * @return response @@ -323,4 +324,23 @@ public Response getSimsExport(@Parameter( return operationsService.exportMetadataReport(id,includeEmptyMas,lg1,lg2); } + /** + * EXPORT FOR LABEL + * @param id + * @return response + */ + + @GET + @Path("/metadataReport/export/label/{id}") + @Produces({ MediaType.APPLICATION_OCTET_STREAM, "application/vnd.oasis.opendocument.text" }) + @io.swagger.v3.oas.annotations.Operation(operationId = "getSimsExport", summary = "Produce a document with a metadata report") + public Response getSimsExportForLabel(@Parameter( + description = "Identifiant de la documentation (format : [0-9]{4})", + required = true, + schema = @Schema(pattern = "[0-9]{4}", type = "string")) @PathParam(Constants.ID) String id + ) throws RmesException { + + return operationsService.exportMetadataReportForLabel(id); + } + } From b9dfeec021eb270b957655dbbdc94b613e2ddd87 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Wed, 14 Apr 2021 15:39:40 +0200 Subject: [PATCH 232/243] Try to fix issue with ordered list example in rich text contenu 1.un 2.deux contenu --- .../java/fr/insee/rmes/utils/XhtmlToMarkdownUtils.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/fr/insee/rmes/utils/XhtmlToMarkdownUtils.java b/src/main/java/fr/insee/rmes/utils/XhtmlToMarkdownUtils.java index e9a6a5def..3da599514 100644 --- a/src/main/java/fr/insee/rmes/utils/XhtmlToMarkdownUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XhtmlToMarkdownUtils.java @@ -6,6 +6,7 @@ import com.vladsch.flexmark.html.HtmlRenderer; import com.vladsch.flexmark.html2md.converter.FlexmarkHtmlConverter; import com.vladsch.flexmark.parser.Parser; +import com.vladsch.flexmark.parser.ParserEmulationProfile; import com.vladsch.flexmark.util.ast.Node; import com.vladsch.flexmark.util.data.MutableDataSet; @@ -17,6 +18,7 @@ private static void init(){ if (optionsXhtmlToMd==null || optionsXhtmlToMd.getKeys().size()==0) { optionsXhtmlToMd = new MutableDataSet(); optionsXhtmlToMd.set(FlexmarkHtmlConverter.SKIP_CHAR_ESCAPE,true); + //optionsXhtmlToMd.set(FlexmarkHtmlConverter.LISTS_END_ON_DOUBLE_BLANK,true); } } @@ -30,7 +32,13 @@ private static String xhtmlToMarkdown(String xhtml) { } public static String markdownToXhtml(String md) { + if (md == "") return md; MutableDataSet options = new MutableDataSet(); + options.set(FlexmarkHtmlConverter.LISTS_END_ON_DOUBLE_BLANK,true); + options.setFrom(ParserEmulationProfile.MARKDOWN); + + //convert soft-breaks to hard breaks + options.set(HtmlRenderer.SOFT_BREAK, "
    \n"); Parser parser = Parser.builder(options).build(); HtmlRenderer renderer = HtmlRenderer.builder(options).build(); From cfc773c0f218765a44d1c8bb5622fdd1f3628368 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 15 Apr 2021 10:09:32 +0200 Subject: [PATCH 233/243] Fix issue with same filename comparing lowercase --- .../bauhaus_services/DocumentsService.java | 2 +- .../documentations/DocumentationsUtils.java | 1 - .../documents/DocumentsImpl.java | 4 +- .../documents/DocumentsUtils.java | 88 +++++++++++-------- .../documentations/DocumentsQueries.java | 12 ++- .../java/fr/insee/rmes/utils/FilesUtils.java | 2 +- .../java/fr/insee/rmes/utils/StringUtils.java | 2 +- .../java/fr/insee/rmes/utils/UriUtils.java | 12 +++ .../rmes/webservice/DocumentsResources.java | 2 +- .../documents/getDocumentUriFromUrlQuery.ftlh | 4 +- 10 files changed, 79 insertions(+), 50 deletions(-) create mode 100644 src/main/java/fr/insee/rmes/utils/UriUtils.java diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/DocumentsService.java b/src/main/java/fr/insee/rmes/bauhaus_services/DocumentsService.java index f85f3a3ee..d5abadb28 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/DocumentsService.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/DocumentsService.java @@ -27,7 +27,7 @@ public interface DocumentsService { /** * Create a document */ - public String setDocument(String body, InputStream documentFile, String documentName) throws RmesException ; + public String createDocument(String body, InputStream documentFile, String documentName) throws RmesException ; /** * Update diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index fea502da5..2b012145f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -1,6 +1,5 @@ package fr.insee.rmes.bauhaus_services.operations.documentations; -import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.List; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsImpl.java index dc195882d..4ee9cd808 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsImpl.java @@ -51,10 +51,10 @@ public Object getLink(String id) throws RmesException { /* * Create - * @see fr.insee.rmes.bauhaus_services.DocumentsService#setDocument(java.lang.String) + * @see fr.insee.rmes.bauhaus_services.DocumentsService#createDocument(java.lang.String) */ @Override - public String setDocument(String body, InputStream documentFile,String documentName) throws RmesException { + public String createDocument(String body, InputStream documentFile,String documentName) throws RmesException { documentsUtils.checkFileNameValidity(documentName); String id=documentsUtils.createDocumentID(); logger.debug("Create document : {}", id); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index 7d5963d37..98e85c118 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -16,7 +16,6 @@ import javax.ws.rs.core.Response.Status; import javax.ws.rs.core.StreamingOutput; -import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationsUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpStatus; @@ -41,6 +40,7 @@ import fr.insee.rmes.bauhaus_services.Constants; import fr.insee.rmes.bauhaus_services.code_list.LangService; +import fr.insee.rmes.bauhaus_services.operations.documentations.DocumentationsUtils; import fr.insee.rmes.bauhaus_services.rdf_utils.ObjectType; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfService; import fr.insee.rmes.bauhaus_services.rdf_utils.RdfUtils; @@ -56,6 +56,7 @@ import fr.insee.rmes.persistance.ontologies.SCHEMA; import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentsQueries; import fr.insee.rmes.utils.DateUtils; +import fr.insee.rmes.utils.UriUtils; @Component public class DocumentsUtils extends RdfService { @@ -132,6 +133,7 @@ public JSONArray getAllDocuments() throws RmesException { formatDateInJsonArray(allDocs); } catch (RmesException e) { logger.error(e.getMessage()); + throw e; } return allDocs; } @@ -140,15 +142,19 @@ private void formatDateInJsonArray(JSONArray allDocs) { if (allDocs.length() != 0) { for (int i = 0; i < allDocs.length(); i++) { JSONObject doc = allDocs.getJSONObject(i); - if (doc.has(Constants.UPDATED_DATE)) { - String formatedDate = DateUtils.getDate(doc.getString(Constants.UPDATED_DATE)); - doc.remove(Constants.UPDATED_DATE); - doc.put(Constants.UPDATED_DATE, formatedDate); - } + formatDateInJsonObject(doc); } } } + public void formatDateInJsonObject(JSONObject doc) { + if (doc.has(Constants.UPDATED_DATE)) { + String formatedDate = DateUtils.getDate(doc.getString(Constants.UPDATED_DATE)); + doc.remove(Constants.UPDATED_DATE); + doc.put(Constants.UPDATED_DATE, formatedDate); + } + } + /** * Generate a new ID for document or link * @return @@ -209,6 +215,7 @@ public void createDocument(String id, String body, boolean isLink, InputStream d checkLinkDoesNotExist(id, document.getUrl()); }else { String url = createFileUrl(documentName); + checkDocumentDoesNotExist(id, url); logger.info("URL CREATED : {}", url); document.setUrl(url); @@ -232,14 +239,34 @@ private void checkLinkDoesNotExist(String id, String url) throws RmesException { throw new RmesNotAcceptableException(ErrorCodes.LINK_EMPTY_URL, "A link must have a non-empty url. ", id); } // Check if the url is already used by a link - IRI uriUrl = RdfUtils.toURI(url); - JSONObject uri = repoGestion - .getResponseAsObject(DocumentsQueries.getDocumentUriQuery(uriUrl)); - if (uri.length() > 0) { - throw new RmesNotAcceptableException(ErrorCodes.LINK_EXISTING_URL, - "This url is already referenced by another link.", uri.getString(Constants.DOCUMENT)); + checkUrlDoesNotExist(id, url, ErrorCodes.LINK_EXISTING_URL,"This url is already referenced by another link."); + } + + private void checkDocumentDoesNotExist(String id, String url) throws RmesException { + if (StringUtils.isEmpty(url)) { + throw new RmesNotAcceptableException(ErrorCodes.DOCUMENT_EMPTY_NAME, "A document must have a non-empty url. ", id); + } + if (url.contains(SCHEME_FILE)) { + url = url.replace(SCHEME_FILE, ""); + } + + // Check if the url is already used by another document + checkUrlDoesNotExist(id, getDocumentNameFromUrl(url), ErrorCodes.DOCUMENT_CREATION_EXISTING_FILE, "This url is already referenced by another document."); + } + + + public void checkUrlDoesNotExist(String id, String url, int errorCode, String errorMessage) throws RmesException { + JSONObject existingUriJson = repoGestion.getResponseAsObject(DocumentsQueries.getDocumentUriQuery(url)); + if (existingUriJson.length() > 0) { + String uri = existingUriJson.getString("document"); + String existingId = getIdFromUri(uri); + if (!existingId.equals(id)) { + throw new RmesNotAcceptableException(errorCode,errorMessage, uri); + } } } + + /** * Update a document or link @@ -269,6 +296,7 @@ public void setDocument(String id, String body, boolean isLink) throws RmesExcep /** * Get RDF for a document or a link by ID + * with associated sims (and their creators) * @param id * @param isLink * @return @@ -283,12 +311,9 @@ public JSONObject getDocument(String id, boolean isLink) throws RmesException { } if (jsonDocs.isNull(Constants.URI)) { - throw new RmesNotFoundException(ErrorCodes.DOCUMENT_UNKNOWN_ID, "Cannot find Document with id: ", id); - } - if (jsonDocs.has(Constants.UPDATED_DATE)) { - jsonDocs.put(Constants.UPDATED_DATE, DateUtils.getDate(jsonDocs.getString(Constants.UPDATED_DATE))); + throw new RmesNotFoundException(ErrorCodes.DOCUMENT_UNKNOWN_ID, "Cannot find "+ (isLink ? "Link" : "Document")+" with id: ", id); } - + formatDateInJsonObject(jsonDocs); JSONArray sims = repoGestion.getResponseAsArray(DocumentsQueries.getSimsByDocument(id, isLink)); for (int i = 0; i < sims.length(); i++) { @@ -451,8 +476,11 @@ private void deleteFile(String docUrl) { } public String getDocumentNameFromUrl(String docUrl) { - if (docUrl.contains("\\")) return StringUtils.substringAfterLast(docUrl, "\\"); - return StringUtils.substringAfterLast(docUrl, "/"); + return UriUtils.getLastPartFromUri(docUrl); + } + + private String getIdFromUri(String uri) { + return UriUtils.getLastPartFromUri(uri); } private String createFileUrl(String name) throws RmesException { @@ -473,7 +501,7 @@ private String createFileUrl(String name) throws RmesException { */ private IRI getDocumentUri(IRI url) throws RmesException { JSONObject uri = repoGestion - .getResponseAsObject(DocumentsQueries.getDocumentUriQuery(url)); + .getResponseAsObject(DocumentsQueries.getDocumentUriQuery(getDocumentNameFromUrl(url.stringValue()))); if (uri.length() == 0 || !uri.has(Constants.DOCUMENT)) { String id = createDocumentID(); return RdfUtils.objectIRI(ObjectType.DOCUMENT, id); @@ -484,10 +512,6 @@ private IRI getDocumentUri(IRI url) throws RmesException { public String getDocumentUrlFromDocument(JSONObject jsonDoc) { return jsonDoc.getString(Constants.URL).replace(SCHEME_FILE, ""); } - - public boolean isDocument(JSONObject jsonDoc) { - return jsonDoc.getString(Constants.URI).matches(Config.DOCUMENTS_BASE_URI); - } public void checkFileNameValidity(String fileName) throws RmesNotAcceptableException { if (fileName == null || fileName.trim().isEmpty()) { @@ -534,20 +558,6 @@ public Document buildDocumentFromJson(JSONObject jsonDoc) { return doc ; } - public Document buildDocumentHeadFromJson(JSONObject jsonDoc) { - Document doc= new Document(); - if (jsonDoc.has(Constants.URL)) { - doc.setUrl(jsonDoc.getString(Constants.URL)); - } - if (jsonDoc.has(Constants.LABEL_LG1)) { - doc.setLabelLg1(jsonDoc.getString(Constants.LABEL_LG1)); - } - if (jsonDoc.has(Constants.LABEL_LG2)) { - doc.setLabelLg1(jsonDoc.getString(Constants.LABEL_LG2)); - } - return(doc); - } - /** * Download a document by id * @param id @@ -574,7 +584,7 @@ public Response downloadDocumentFile(String id) throws RmesException { } - public Path getGestionStorageFolderPath() throws RmesException { + private Path getGestionStorageFolderPath() throws RmesException { Path path = null; File dir = new File(Config.DOCUMENTS_STORAGE_GESTION); if (dir.exists()) { diff --git a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java index 4cd06b354..12a4497a6 100644 --- a/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java +++ b/src/main/java/fr/insee/rmes/persistance/sparql_queries/operations/documentations/DocumentsQueries.java @@ -3,6 +3,7 @@ import java.util.HashMap; import java.util.Map; +import org.apache.commons.lang3.StringUtils; import org.eclipse.rdf4j.model.IRI; import fr.insee.rmes.bauhaus_services.Constants; @@ -27,10 +28,15 @@ public static String deleteDocumentQuery(IRI uri) throws RmesException { return buildRequest("deleteDocumentQuery.ftlh", params); } - - public static String getDocumentUriQuery(IRI url) throws RmesException { + /** + * + * @param url = link or filename + * @return + * @throws RmesException + */ + public static String getDocumentUriQuery(String url) throws RmesException { if (params==null) {initParams();} - params.put(Constants.URL, url); + params.put(Constants.URL, StringUtils.lowerCase(url)); return buildRequest("getDocumentUriFromUrlQuery.ftlh", params); } diff --git a/src/main/java/fr/insee/rmes/utils/FilesUtils.java b/src/main/java/fr/insee/rmes/utils/FilesUtils.java index 3f325edeb..ce042218a 100644 --- a/src/main/java/fr/insee/rmes/utils/FilesUtils.java +++ b/src/main/java/fr/insee/rmes/utils/FilesUtils.java @@ -73,7 +73,7 @@ public static File zipFile(File inputFile) throws IOException { zipfs = FileSystems.newFileSystem(uri, env); String sourcePath = inputFile.getPath(); Path source = Paths.get(sourcePath); - Path pathInZipfile = zipfs.getPath(StringUtils.substringAfterLast(sourcePath, "/")); + Path pathInZipfile = zipfs.getPath(UriUtils.getLastPartFromUri(sourcePath)); // copy a file into the zip file Files.copy( source,pathInZipfile, StandardCopyOption.REPLACE_EXISTING ); diff --git a/src/main/java/fr/insee/rmes/utils/StringUtils.java b/src/main/java/fr/insee/rmes/utils/StringUtils.java index 05c07d4d4..d1eec143f 100644 --- a/src/main/java/fr/insee/rmes/utils/StringUtils.java +++ b/src/main/java/fr/insee/rmes/utils/StringUtils.java @@ -11,7 +11,7 @@ public static boolean stringContainsItemFromList(String string, String[] list) { } public static List stringToList(String value) { - List val = new ArrayList(); + List val = new ArrayList<>(); val.add(value); return val; } diff --git a/src/main/java/fr/insee/rmes/utils/UriUtils.java b/src/main/java/fr/insee/rmes/utils/UriUtils.java new file mode 100644 index 000000000..8d77b9a90 --- /dev/null +++ b/src/main/java/fr/insee/rmes/utils/UriUtils.java @@ -0,0 +1,12 @@ +package fr.insee.rmes.utils; + +import org.apache.commons.lang3.StringUtils; + +public class UriUtils { + + public static String getLastPartFromUri(String uri) { + if (uri.contains("\\")) return StringUtils.substringAfterLast(uri, "\\"); + return StringUtils.substringAfterLast(uri, "/"); + } + +} diff --git a/src/main/java/fr/insee/rmes/webservice/DocumentsResources.java b/src/main/java/fr/insee/rmes/webservice/DocumentsResources.java index 8f3d63d6d..ee4863ef4 100644 --- a/src/main/java/fr/insee/rmes/webservice/DocumentsResources.java +++ b/src/main/java/fr/insee/rmes/webservice/DocumentsResources.java @@ -146,7 +146,7 @@ public Response setDocument( String id = null; String documentName = fileDisposition.getFileName(); try { - id = documentsService.setDocument(body, documentFile, documentName); + id = documentsService.createDocument(body, documentFile, documentName); } catch (RmesException e) { return Response.status(e.getStatus()).entity(e.getDetails()).type(MediaType.TEXT_PLAIN).build(); } diff --git a/src/main/resources/request/operations/documentations/documents/getDocumentUriFromUrlQuery.ftlh b/src/main/resources/request/operations/documentations/documents/getDocumentUriFromUrlQuery.ftlh index 6ca3f1a83..91362d232 100644 --- a/src/main/resources/request/operations/documentations/documents/getDocumentUriFromUrlQuery.ftlh +++ b/src/main/resources/request/operations/documentations/documents/getDocumentUriFromUrlQuery.ftlh @@ -2,5 +2,7 @@ SELECT ?document FROM <${DOCUMENTS_GRAPH}> WHERE { ?document rdf:type foaf:Document . - ?document <${url}> + ?document ?url + + FILTER(REGEX(lcase(STR(?url)), '${url}')) } \ No newline at end of file From 22e52d4defaa64a423465381f3be374979c252ed Mon Sep 17 00:00:00 2001 From: Emmanuel Demey Date: Mon, 19 Apr 2021 11:11:55 +0200 Subject: [PATCH 234/243] fix: review getConcept for Consultation Gestion API --- .../ConsultationGestionServiceImpl.java | 6 ++++++ .../consultation-gestion/getConceptsSdmx.ftlh | 13 +++++++++++++ .../consultation-gestion/getDetailedConcept.ftlh | 5 ----- 3 files changed, 19 insertions(+), 5 deletions(-) create mode 100644 src/main/resources/request/consultation-gestion/getConceptsSdmx.ftlh diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java index c11efc767..da90a5dd8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/consutation_gestion/ConsultationGestionServiceImpl.java @@ -25,6 +25,7 @@ public String getDetailedConcept(String id) throws RmesException { JSONArray labels = new JSONArray(); + String labelLg1 = concept.getString("prefLabelLg1"); JSONObject labelLg1Object = new JSONObject(); labelLg1Object.put("langue", Config.LG1); @@ -43,6 +44,11 @@ public String getDetailedConcept(String id) throws RmesException { concept.put("label", labels); + JSONArray conceptsSdmx = repoGestion.getResponseAsArray(buildRequest("getConceptsSdmx.ftlh", params)); + if(conceptsSdmx.length() > 0){ + concept.put("conceptsSdmx", conceptsSdmx); + } + return concept.toString(); } diff --git a/src/main/resources/request/consultation-gestion/getConceptsSdmx.ftlh b/src/main/resources/request/consultation-gestion/getConceptsSdmx.ftlh new file mode 100644 index 000000000..f5ee2111d --- /dev/null +++ b/src/main/resources/request/consultation-gestion/getConceptsSdmx.ftlh @@ -0,0 +1,13 @@ +SELECT ?agence ?id +FROM <${CONCEPTS_GRAPH}> +WHERE { + ?concept rdf:type skos:Concept . + ?concept skos:notation "${ID}" . + ?concept skos:closeMatch ?conceptSDMX . + FILTER(strStarts(str(?conceptSDMX),'urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept')) + BIND(strAfter(str(?conceptSDMX),'=') AS ?segmentAParser) . + BIND(strBefore(?segmentAParser,':') AS ?agence) . + BIND(strBefore(strAfter(?segmentAParser,':'),'(') AS ?scheme) . + BIND(strBefore(strAfter(?segmentAParser,'('),')') AS ?version) . + BIND(strAfter(?segmentAParser,').') AS ?id) . +} \ No newline at end of file diff --git a/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh b/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh index 551118453..f948280cc 100644 --- a/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh +++ b/src/main/resources/request/consultation-gestion/getDetailedConcept.ftlh @@ -7,11 +7,6 @@ WHERE { BIND(STRAFTER(STR(?uri),'/definition/') AS ?id) . ?uri skos:prefLabel ?prefLabelLg2 . FILTER (lang(?prefLabelLg2) = '${LG2}') . - OPTIONAL { - ?uri skos:closeMatch ?conceptSDMX . - FILTER(strStarts(STR(?conceptSDMX),'urn:sdmx:org.sdmx.infomodel.conceptscheme.Concept')) - BIND(STRAFTER(STR(?conceptSDMX),').') AS ?namingHint) . - } . ?uri dcterms:created ?dateCreation . ?uri dcterms:modified ?dateMiseAjour . ?uri insee:isValidated ?statutValidation . From b94b982707b13f7716a12cd6971916e03c45deee Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Mon, 19 Apr 2021 16:27:47 +0200 Subject: [PATCH 235/243] Fix documents' language and updatedDate --- .../java/fr/insee/rmes/bauhaus_services/Constants.java | 1 + .../documentations/documents/DocumentsUtils.java | 8 ++++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java index 173acce37..901a86715 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/Constants.java @@ -58,6 +58,7 @@ public class Constants { public static final String LABEL = "label"; public static final String LABEL_LG1 = "labelLg1"; public static final String LABEL_LG2 = "labelLg2"; + public static final String LANG = "lang"; /*M*/ public static final String MANAGER = "manager"; diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java index 7d5963d37..5e7e7fa1a 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsUtils.java @@ -518,11 +518,11 @@ public Document buildDocumentFromJson(JSONObject jsonDoc) { if (jsonDoc.has(Constants.DESCRIPTION_LG2)) { doc.setDescriptionLg2(jsonDoc.getString(Constants.DESCRIPTION_LG2)); } - if (jsonDoc.has("dateMiseAJour")) { - doc.setDateMiseAJour(jsonDoc.getString("dateMiseAJour")); + if (jsonDoc.has(Constants.UPDATED_DATE)) { + doc.setDateMiseAJour(jsonDoc.getString(Constants.UPDATED_DATE)); } - if (jsonDoc.has("langue")) { - doc.setLangue(jsonDoc.getString("langue")); + if (jsonDoc.has(Constants.LANG)) { + doc.setLangue(jsonDoc.getString(Constants.LANG)); } if (jsonDoc.has(Constants.URL)) { doc.setUrl(jsonDoc.getString(Constants.URL)); From 45bb37b387ab48f77e6c5dd71ef0eca8571b5f8a Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 20 Apr 2021 13:08:05 +0200 Subject: [PATCH 236/243] Update DocumentationPublication.java --- .../operations/documentations/DocumentationPublication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java index fb06dfdc6..ccefdde84 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationPublication.java @@ -38,7 +38,7 @@ public class DocumentationPublication extends RdfService { @Autowired DocumentsPublication documentsPublication; - static final String[] rubricsNotForPublication = {"S.1.3","S.1.4","S.1.6","S.1.7","validationState"}; + static final String[] rubricsNotForPublication = {"S.1.3","S.1.4","S.1.5","S.1.6","S.1.7","S.1.8","validationState"}; public void publishSims(String simsId) throws RmesException { From 8b603b586b8042a39f362178c8bb1e1f7325f077 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 20 Apr 2021 15:51:08 +0200 Subject: [PATCH 237/243] Deal with < and > in series and indicators rich text --- .../operations/OperationsImpl.java | 4 +-- .../DocumentationsRubricsUtils.java | 27 +++---------------- .../documentations/DocumentationsUtils.java | 22 +++------------ .../indicators/IndicatorsUtils.java | 10 ++++--- .../operations/series/SeriesUtils.java | 12 +++++---- .../documentations/ExtensiveSims.java | 23 ---------------- .../java/fr/insee/rmes/utils/XMLUtils.java | 20 ++++++++++++++ 7 files changed, 43 insertions(+), 75 deletions(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java index c9eef48b5..cd9700c90 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/OperationsImpl.java @@ -133,7 +133,7 @@ public String getSeriesForSearchWithStamp(String stamp) throws RmesException { @Override public Series getSeriesByID(String id) throws RmesException { - return seriesUtils.getSeriesById(id); + return seriesUtils.getSeriesById(id,false); } @Override @@ -315,7 +315,7 @@ public String getIndicatorJsonByID(String id) throws RmesException { @Override public Indicator getIndicatorById(String id) throws RmesException { - return indicatorsUtils.getIndicatorById(id); + return indicatorsUtils.getIndicatorById(id,false); } @Override diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java index d8eab4d80..af770d27f 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsRubricsUtils.java @@ -42,6 +42,7 @@ import fr.insee.rmes.persistance.sparql_queries.operations.documentations.DocumentationsQueries; import fr.insee.rmes.utils.DateUtils; import fr.insee.rmes.utils.JSONUtils; +import fr.insee.rmes.utils.XMLUtils; @Component public class DocumentationsRubricsUtils extends RdfService { @@ -329,7 +330,7 @@ public DocumentationRubric buildRubricFromJson(JSONObject jsonRubric, Boolean fo } if (jsonRubric.has(Constants.LABEL_LG1)) { if(forXml) { - documentationRubric.setLabelLg1(solveSpecialXmlcharacters(jsonRubric.getString(Constants.LABEL_LG1))); + documentationRubric.setLabelLg1(XMLUtils.solveSpecialXmlcharacters(jsonRubric.getString(Constants.LABEL_LG1))); } else { @@ -338,7 +339,7 @@ public DocumentationRubric buildRubricFromJson(JSONObject jsonRubric, Boolean fo } if (jsonRubric.has(Constants.LABEL_LG2)) { if(forXml) { - documentationRubric.setLabelLg2(solveSpecialXmlcharacters(jsonRubric.getString(Constants.LABEL_LG2))); + documentationRubric.setLabelLg2(XMLUtils.solveSpecialXmlcharacters(jsonRubric.getString(Constants.LABEL_LG2))); } else { @@ -360,27 +361,7 @@ public DocumentationRubric buildRubricFromJson(JSONObject jsonRubric, Boolean fo } return documentationRubric; } - - private String solveSpecialXmlcharacters(String rubric) { - String ret = StringEscapeUtils.unescapeXml(rubric); - ret = StringEscapeUtils.unescapeHtml4(ret); - //ret=rubric - - final String regex = "&"; - final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); - ret = pattern.matcher(ret).replaceAll(Constants.XML_ESPERLUETTE_REPLACEMENT); - - final String regex2 = "<"; - final Pattern pattern2 = Pattern.compile(regex2, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); - ret = pattern2.matcher(ret).replaceAll(Constants.XML_INF_REPLACEMENT); - - final String regex3 = ">"; - final Pattern pattern3 = Pattern.compile(regex3, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); - ret = pattern3.matcher(ret).replaceAll(Constants.XML_SUP_REPLACEMENT); - - return new String(ret.getBytes(), StandardCharsets.UTF_8); - } - + private void addJsonDocumentToObjectRubric(JSONObject rubric, DocumentationRubric documentationRubric, String documentsWithRubricLang) { List docs = new ArrayList<>(); diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java index fea502da5..7c32343ec 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/DocumentationsUtils.java @@ -125,20 +125,6 @@ public JSONObject getFullSimsForJson(String id) throws RmesException { return getDocumentationByIdSims(id); } - - /** - * Java Object Builder - * @param jsonSims - * @return ExtensiveSims - * @throws RmesException - */ - /* Not Used */ - public ExtensiveSims buildExtensiveDocumentationFromJson(JSONObject jsonSims) throws RmesException { - Documentation sims = buildDocumentationFromJson(jsonSims,false); - return new ExtensiveSims(sims); - } - - /** * Java Object Builder * @param jsonSims @@ -527,7 +513,7 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean neededCodeLists.addAll(XMLUtils.getTagValues(operationXML,Constants.TYPELIST)); neededCodeLists.addAll(XMLUtils.getTagValues(operationXML,Constants.ACCRUAL_PERIODICITY_LIST)); String idSeries=operation.getSeries().getId(); - series=seriesUtils.getSeriesById(idSeries); + series=seriesUtils.getSeriesById(idSeries,true); seriesXML = XMLUtils.produceXMLResponse(series); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); @@ -536,7 +522,7 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean if (targetType.equals(Constants.INDICATOR_UP)) { indicatorXML=XMLUtils.produceXMLResponse( - indicatorsUtils.getIndicatorById(idDatabase)); + indicatorsUtils.getIndicatorById(idDatabase,true)); neededCodeLists.addAll(XMLUtils.getTagValues(indicatorXML,Constants.TYPELIST)); neededCodeLists.addAll(XMLUtils.getTagValues(indicatorXML,Constants.ACCRUAL_PERIODICITY_LIST)); String idSeries=XMLUtils.getTagValues( @@ -544,7 +530,7 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean indicatorXML, Constants.WASGENERATEDBY).iterator().next(), Constants.ID).iterator().next(); - series=seriesUtils.getSeriesById(idSeries); + series=seriesUtils.getSeriesById(idSeries,true); seriesXML = XMLUtils.produceXMLResponse(series); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); @@ -553,7 +539,7 @@ public Response exportMetadataReport(String id, Boolean includeEmptyMas, Boolean if (targetType.equals(Constants.SERIES_UP)) { seriesXML=XMLUtils.produceXMLResponse( - seriesUtils.getSeriesById(idDatabase)); + seriesUtils.getSeriesById(idDatabase,true)); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.TYPELIST)); neededCodeLists.addAll(XMLUtils.getTagValues(seriesXML,Constants.ACCRUAL_PERIODICITY_LIST)); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java index 0a40c3ccb..c289e8f0d 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java @@ -43,6 +43,7 @@ import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.ontologies.PROV; import fr.insee.rmes.persistance.sparql_queries.operations.indicators.IndicatorsQueries; +import fr.insee.rmes.utils.XMLUtils; import fr.insee.rmes.utils.XhtmlToMarkdownUtils; @Component @@ -62,8 +63,8 @@ public class IndicatorsUtils extends RdfService { @Autowired FamOpeSerIndUtils famOpeSerIndUtils; - public Indicator getIndicatorById(String id) throws RmesException{ - return buildIndicatorFromJson(getIndicatorJsonById(id)); + public Indicator getIndicatorById(String id, boolean forXML) throws RmesException{ + return buildIndicatorFromJson(getIndicatorJsonById(id), forXML); } /** @@ -71,12 +72,13 @@ public Indicator getIndicatorById(String id) throws RmesException{ * @param indicatorJson * @return */ - public Indicator buildIndicatorFromJson(JSONObject indicatorJson) { + public Indicator buildIndicatorFromJson(JSONObject indicatorJson, boolean forXML) { ObjectMapper mapper = new ObjectMapper(); String id= indicatorJson.getString(Constants.ID); Indicator indicator = new Indicator(id); try { - indicator = mapper.readValue(indicatorJson.toString(), Indicator.class); + if(forXML) indicator = mapper.readValue(XMLUtils.solveSpecialXmlcharacters(indicatorJson.toString()), Indicator.class); + else indicator = mapper.readValue(indicatorJson.toString(), Indicator.class); } catch (JsonProcessingException e) { logger.error("Json cannot be parsed: ".concat(e.getMessage())); } diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java index 97be73b55..e704cc233 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/series/SeriesUtils.java @@ -46,6 +46,7 @@ import fr.insee.rmes.persistance.ontologies.INSEE; import fr.insee.rmes.persistance.sparql_queries.operations.series.SeriesQueries; import fr.insee.rmes.utils.JSONUtils; +import fr.insee.rmes.utils.XMLUtils; import fr.insee.rmes.utils.XhtmlToMarkdownUtils; @Component @@ -73,12 +74,12 @@ public IdLabelTwoLangs getSeriesLabelById(String id) throws RmesException { return famOpeSerIndUtils.buildIdLabelTwoLangsFromJson(getSeriesJsonById(id)); } - public Series getSeriesById(String id) throws RmesException { - return buildSeriesFromJson(getSeriesJsonById(id)); + public Series getSeriesById(String id, boolean forXml) throws RmesException { + return buildSeriesFromJson(getSeriesJsonById(id),forXml); } - private Series buildSeriesFromJson(JSONObject seriesJson) throws RmesException { + private Series buildSeriesFromJson(JSONObject seriesJson, boolean forXml) throws RmesException { ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); mapper.configure(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY, true); @@ -89,7 +90,8 @@ private Series buildSeriesFromJson(JSONObject seriesJson) throws RmesException { id= famOpeSerIndUtils.createId();} Series series = new Series(); try { - series = mapper.readValue(seriesJson.toString(), Series.class); + if (forXml) series = mapper.readValue(XMLUtils.solveSpecialXmlcharacters(seriesJson.toString()), Series.class); + else series = mapper.readValue(seriesJson.toString(), Series.class); } catch (IOException e) { logger.error(e.getMessage()); } @@ -317,7 +319,7 @@ public String createSeries(String body) throws RmesException { throw new RmesUnauthorizedException(ErrorCodes.SERIES_CREATION_RIGHTS_DENIED, "Only an admin can create a new series."); } - Series series = buildSeriesFromJson(new JSONObject(body)); + Series series = buildSeriesFromJson(new JSONObject(body),false); checkSimsWithOperations(series); // Tester l'existence de la famille diff --git a/src/main/java/fr/insee/rmes/model/operations/documentations/ExtensiveSims.java b/src/main/java/fr/insee/rmes/model/operations/documentations/ExtensiveSims.java index a9e857afc..579cfe452 100644 --- a/src/main/java/fr/insee/rmes/model/operations/documentations/ExtensiveSims.java +++ b/src/main/java/fr/insee/rmes/model/operations/documentations/ExtensiveSims.java @@ -26,29 +26,6 @@ public class ExtensiveSims { /* un jour créer l'interface Documentable implémentée par Série / Opération / Indicateur ? */ // private Documentable target; - public ExtensiveSims(Documentation documentation) throws RmesException { - - super(); - this.documentation = documentation; - String id=documentation.getId(); - - String[] target = documentationsUtils.getDocumentationTargetTypeAndId(id); - String targetType = target[0]; - String idDatabase = target[1]; - - switch(targetType) { -// case "OPERATION" : this.operation = indicatorsUtils.getIndicatorById(idDatabase); break; -// case "SERIES" : this.series = indicatorsUtils.getIndicatorById(idDatabase); break; - case Constants.INDICATOR_UP : this.indicator = indicatorsUtils.getIndicatorById(idDatabase); break; - } - - documentationsUtils.getDocumentationTargetTypeAndId(id); - } - - - - - public Documentation getDocumentation() { return documentation; } diff --git a/src/main/java/fr/insee/rmes/utils/XMLUtils.java b/src/main/java/fr/insee/rmes/utils/XMLUtils.java index 388b8fbf3..56c93035d 100644 --- a/src/main/java/fr/insee/rmes/utils/XMLUtils.java +++ b/src/main/java/fr/insee/rmes/utils/XMLUtils.java @@ -160,4 +160,24 @@ public static String encodeXml(String response) { return new String(ret.getBytes(), StandardCharsets.UTF_8); } + public static String solveSpecialXmlcharacters(String rubric) { + String ret = StringEscapeUtils.unescapeXml(rubric); + ret = StringEscapeUtils.unescapeHtml4(ret); + //ret=rubric + + final String regex = "&"; + final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern.matcher(ret).replaceAll(Constants.XML_ESPERLUETTE_REPLACEMENT); + + final String regex2 = "<"; + final Pattern pattern2 = Pattern.compile(regex2, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern2.matcher(ret).replaceAll(Constants.XML_INF_REPLACEMENT); + + final String regex3 = ">"; + final Pattern pattern3 = Pattern.compile(regex3, Pattern.MULTILINE | Pattern.DOTALL | Pattern.CASE_INSENSITIVE); + ret = pattern3.matcher(ret).replaceAll(Constants.XML_SUP_REPLACEMENT); + + return new String(ret.getBytes(), StandardCharsets.UTF_8); + } + } From e5ce02c07e08324c6db66ace1303fc8d231c92f8 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 20 Apr 2021 16:02:29 +0200 Subject: [PATCH 238/243] Update IndicatorsUtils.java --- .../operations/indicators/IndicatorsUtils.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java index c289e8f0d..cc691ee38 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java @@ -63,6 +63,11 @@ public class IndicatorsUtils extends RdfService { @Autowired FamOpeSerIndUtils famOpeSerIndUtils; + + public Indicator getIndicatorById(String id) throws RmesException{ + return buildIndicatorFromJson(getIndicatorJsonById(id), false); + } + public Indicator getIndicatorById(String id, boolean forXML) throws RmesException{ return buildIndicatorFromJson(getIndicatorJsonById(id), forXML); } From e6b706830b58aa036616591f22704a6a84b77eb6 Mon Sep 17 00:00:00 2001 From: Olivier Pucher Date: Tue, 20 Apr 2021 16:10:09 +0200 Subject: [PATCH 239/243] Update IndicatorsUtils.java --- .../operations/indicators/IndicatorsUtils.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java index cc691ee38..2ec2942f0 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/indicators/IndicatorsUtils.java @@ -77,6 +77,10 @@ public Indicator getIndicatorById(String id, boolean forXML) throws RmesExceptio * @param indicatorJson * @return */ + public Indicator buildIndicatorFromJson(JSONObject indicatorJson) { + return buildIndicatorFromJson(indicatorJson,false); + } + public Indicator buildIndicatorFromJson(JSONObject indicatorJson, boolean forXML) { ObjectMapper mapper = new ObjectMapper(); String id= indicatorJson.getString(Constants.ID); From 9e0823df3fc696b47698509a96e4aeb238b91171 Mon Sep 17 00:00:00 2001 From: BulotF Date: Tue, 20 Apr 2021 16:16:53 +0200 Subject: [PATCH 240/243] add italic to language and date --- .../xslTransformerFiles/sims2fodt.xsl | 32 ++++++++++--------- 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/src/main/resources/xslTransformerFiles/sims2fodt.xsl b/src/main/resources/xslTransformerFiles/sims2fodt.xsl index 5424852b2..535955821 100644 --- a/src/main/resources/xslTransformerFiles/sims2fodt.xsl +++ b/src/main/resources/xslTransformerFiles/sims2fodt.xsl @@ -533,21 +533,23 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + From 0a114c8b5e6ebef08e52f72a07ec5e9a9e2e1000 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 22 Apr 2021 09:30:26 +0200 Subject: [PATCH 241/243] Try to understand missing / in https:/blabla --- .../documentations/documents/DocumentsPublication.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java index 16038c39b..c455658d8 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java @@ -102,7 +102,9 @@ private Model getModelToPublish(String documentId, String filename) throws RmesE Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); IRI predicate = RdfUtils .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); - Value object = RdfUtils.toURI(Paths.get(Config.DOCUMENTS_BASEURL,filename).toString()); + String newUrl = Paths.get(Config.DOCUMENTS_BASEURL,filename).toString(); + logger.debug("Publishing new URL for document : {}",newUrl); + Value object = RdfUtils.toURI(newUrl); model.add(subject, predicate, object, st.getContext()); } else { Resource subject = PublicationUtils.tranformBaseURIToPublish(st.getSubject()); From ed214e1a615ec842b36665de91563ec44d57e5ff Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 22 Apr 2021 10:12:06 +0200 Subject: [PATCH 242/243] Update DocumentsPublication.java --- .../documentations/documents/DocumentsPublication.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java index c455658d8..a318bbbd9 100644 --- a/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java +++ b/src/main/java/fr/insee/rmes/bauhaus_services/operations/documentations/documents/DocumentsPublication.java @@ -103,7 +103,7 @@ private Model getModelToPublish(String documentId, String filename) throws RmesE IRI predicate = RdfUtils .createIRI(PublicationUtils.tranformBaseURIToPublish(st.getPredicate()).stringValue()); String newUrl = Paths.get(Config.DOCUMENTS_BASEURL,filename).toString(); - logger.debug("Publishing new URL for document : {}",newUrl); + logger.info("Publishing document : {}",newUrl); Value object = RdfUtils.toURI(newUrl); model.add(subject, predicate, object, st.getContext()); } else { From 6350f0f940b02184ea47d54044d8f1b97e9e2a16 Mon Sep 17 00:00:00 2001 From: Alice Lambois Date: Thu, 22 Apr 2021 11:14:25 +0200 Subject: [PATCH 243/243] Change version --- bauhaus-back-changeLog.txt | 1 + pom.xml | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/bauhaus-back-changeLog.txt b/bauhaus-back-changeLog.txt index 8ecf5cae3..58a60dfe9 100644 --- a/bauhaus-back-changeLog.txt +++ b/bauhaus-back-changeLog.txt @@ -1,3 +1,4 @@ +3.0.0 : Module Opérations 2.1.2 : - Correction du bug à la publication des concepts (la modification supprimait les anciennes versions de notes) - Correction des getters de concepts pour ignorer le typage des identifiants des concepts (notation) 2.1.1 : Version non utilisée en production mais audité pour la sécurité diff --git a/pom.xml b/pom.xml index 7d1dfcb2b..aa3f2099f 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ fr.insee.rmes Bauhaus-BO war - 2.1.2 + 3.0.0 Bauhaus-Back-Office Back-office services for Bauhaus https://github.com/InseeFr/Bauhaus-Back-Office