diff --git a/eno-core/src/main/java/fr/insee/eno/core/exceptions/business/IllegalPoguesElementException.java b/eno-core/src/main/java/fr/insee/eno/core/exceptions/business/IllegalPoguesElementException.java new file mode 100644 index 000000000..4efc2bdd8 --- /dev/null +++ b/eno-core/src/main/java/fr/insee/eno/core/exceptions/business/IllegalPoguesElementException.java @@ -0,0 +1,9 @@ +package fr.insee.eno.core.exceptions.business; + +public class IllegalPoguesElementException extends RuntimeException { + + public IllegalPoguesElementException(String message) { + super(message); + } + +} diff --git a/eno-core/src/main/java/fr/insee/eno/core/model/EnoQuestionnaire.java b/eno-core/src/main/java/fr/insee/eno/core/model/EnoQuestionnaire.java index 4c82c5766..923a1cbfd 100644 --- a/eno-core/src/main/java/fr/insee/eno/core/model/EnoQuestionnaire.java +++ b/eno-core/src/main/java/fr/insee/eno/core/model/EnoQuestionnaire.java @@ -3,6 +3,7 @@ import fr.insee.ddi.lifecycle33.instance.DDIInstanceType; import fr.insee.eno.core.annotations.DDI; import fr.insee.eno.core.annotations.Lunatic; +import fr.insee.eno.core.annotations.Pogues; import fr.insee.eno.core.model.code.CodeList; import fr.insee.eno.core.model.declaration.Declaration; import fr.insee.eno.core.model.label.QuestionnaireLabel; @@ -36,16 +37,32 @@ public class EnoQuestionnaire extends EnoIdentifiableObject { /** Name of the questionnaire model. */ + @Pogues("getName()") @DDI("getResourcePackageArray(0).getCodeListSchemeArray(0)" + ".getCodeListSchemeNameArray(0).getStringArray(0).getStringValue()") //TODO: see if it's that one @Lunatic("setModele(#param)") private String questionnaireModel; + /** Agency producing the questionnaire. */ + @Pogues("getAgency()") + private String agency; + /** Short description of the questionnaire. */ + @Pogues("!getLabel().isEmpty() ? #this : null") @DDI("getCitation()?.getTitle()") @Lunatic("setLabel(#param)") private QuestionnaireLabel label; + /** Metadata that is specific to Pogues and indicates how filters are described in the questionnaire. + * Mapped to be used as a safety net (only 'FILTER' mode is allowed) in a processing step. */ + @Pogues("getFlowLogic()?.value()") + private String filterMode; + + /** Metadata that is specific to Pogues and indicates which language is used for expressions. + * Mapped to be used as a safety net (only 'VTL' is allowed) in a processing step. */ + @Pogues("getFormulasLanguage()?.value()") + private String expressionLanguage; + /** Questionnaire variables. Note: variables can have different "scope" (questionnaire-level, loop or dynamic * table level), yet all variables are defined in this list. */ @DDI("getResourcePackageArray(0).getVariableSchemeArray(0).getVariableList()") diff --git a/eno-core/src/main/java/fr/insee/eno/core/model/label/QuestionnaireLabel.java b/eno-core/src/main/java/fr/insee/eno/core/model/label/QuestionnaireLabel.java index f07188a85..ef7785f54 100644 --- a/eno-core/src/main/java/fr/insee/eno/core/model/label/QuestionnaireLabel.java +++ b/eno-core/src/main/java/fr/insee/eno/core/model/label/QuestionnaireLabel.java @@ -3,10 +3,12 @@ import fr.insee.ddi.lifecycle33.reusable.InternationalStringType; import fr.insee.eno.core.annotations.DDI; import fr.insee.eno.core.annotations.Lunatic; +import fr.insee.eno.core.annotations.Pogues; import fr.insee.eno.core.model.EnoObject; import fr.insee.eno.core.parameter.Format; import fr.insee.lunatic.model.flat.LabelType; import fr.insee.lunatic.model.flat.LabelTypeEnum; +import fr.insee.pogues.model.Questionnaire; import lombok.Getter; import lombok.Setter; @@ -17,6 +19,7 @@ * @see Label */ @Getter @Setter +@Context(format = Format.POGUES, type = Questionnaire.class) @Context(format = Format.DDI, type = InternationalStringType.class) @Context(format = Format.LUNATIC, type = LabelType.class) public class QuestionnaireLabel extends EnoObject implements EnoLabel { @@ -24,6 +27,7 @@ public class QuestionnaireLabel extends EnoObject implements EnoLabel { /** Label content. * @see Label for details. */ + @Pogues("getLabel().getFirst()") @DDI("getStringArray(0).getStringValue()") @Lunatic("setValue(#param)") String value; diff --git a/eno-core/src/main/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckExpressionLanguage.java b/eno-core/src/main/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckExpressionLanguage.java new file mode 100644 index 000000000..d5357c937 --- /dev/null +++ b/eno-core/src/main/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckExpressionLanguage.java @@ -0,0 +1,16 @@ +package fr.insee.eno.core.processing.in.steps.pogues; + +import fr.insee.eno.core.exceptions.business.IllegalPoguesElementException; +import fr.insee.eno.core.model.EnoQuestionnaire; +import fr.insee.eno.core.processing.ProcessingStep; + +public class PoguesCheckExpressionLanguage implements ProcessingStep { + @Override + public void apply(EnoQuestionnaire enoQuestionnaire) { + String expressionLanguage = enoQuestionnaire.getExpressionLanguage(); + if (expressionLanguage == null) // if this property is missing it's alright, might be removed later on anyway + return; + if (!"VTL".equals(expressionLanguage)) + throw new IllegalPoguesElementException("'" + expressionLanguage + "' expression language is not allowed."); + } +} diff --git a/eno-core/src/main/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckFilterMode.java b/eno-core/src/main/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckFilterMode.java new file mode 100644 index 000000000..f6b97985e --- /dev/null +++ b/eno-core/src/main/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckFilterMode.java @@ -0,0 +1,16 @@ +package fr.insee.eno.core.processing.in.steps.pogues; + +import fr.insee.eno.core.exceptions.business.IllegalPoguesElementException; +import fr.insee.eno.core.model.EnoQuestionnaire; +import fr.insee.eno.core.processing.ProcessingStep; + +public class PoguesCheckFilterMode implements ProcessingStep { + @Override + public void apply(EnoQuestionnaire enoQuestionnaire) { + String filterMode = enoQuestionnaire.getFilterMode(); + if (filterMode == null) // if this property is missing it's alright, might be removed later on anyway + return; + if (!"FILTER".equals(filterMode)) + throw new IllegalPoguesElementException("'" + filterMode + "' filter mode is not allowed."); + } +} diff --git a/eno-core/src/test/java/fr/insee/eno/core/mapping/in/pogues/EnoQuestionnaireTest.java b/eno-core/src/test/java/fr/insee/eno/core/mapping/in/pogues/EnoQuestionnaireTest.java index 1de98765f..1d215733d 100644 --- a/eno-core/src/test/java/fr/insee/eno/core/mapping/in/pogues/EnoQuestionnaireTest.java +++ b/eno-core/src/test/java/fr/insee/eno/core/mapping/in/pogues/EnoQuestionnaireTest.java @@ -1,7 +1,9 @@ package fr.insee.eno.core.mapping.in.pogues; +import fr.insee.eno.core.exceptions.business.PoguesDeserializationException; import fr.insee.eno.core.mappers.PoguesMapper; import fr.insee.eno.core.model.EnoQuestionnaire; +import fr.insee.eno.core.serialize.PoguesDeserializer; import fr.insee.pogues.model.Questionnaire; import org.junit.jupiter.api.Test; @@ -22,4 +24,58 @@ void mapIdFromPogues() { assertEquals("foo-questionnaire-id", enoQuestionnaire.getId()); } + @Test + void mapQuestionnaireLabelFromPogues() { + // + Questionnaire poguesQuestionnaire = new Questionnaire(); + poguesQuestionnaire.getLabel().add("Questionnaire label"); + EnoQuestionnaire enoQuestionnaire = new EnoQuestionnaire(); + // + PoguesMapper poguesMapper = new PoguesMapper(); + poguesMapper.mapPoguesQuestionnaire(poguesQuestionnaire, enoQuestionnaire); + // + assertEquals("Questionnaire label", enoQuestionnaire.getLabel().getValue()); + } + + @Test + void mapAgencyFromPogues() { + // + Questionnaire poguesQuestionnaire = new Questionnaire(); + poguesQuestionnaire.setAgency("fr.insee"); + EnoQuestionnaire enoQuestionnaire = new EnoQuestionnaire(); + // + PoguesMapper poguesMapper = new PoguesMapper(); + poguesMapper.mapPoguesQuestionnaire(poguesQuestionnaire, enoQuestionnaire); + // + assertEquals("fr.insee", enoQuestionnaire.getAgency()); + } + + @Test + void mapQuestionnaireModelFromPogues() { + // + Questionnaire poguesQuestionnaire = new Questionnaire(); + poguesQuestionnaire.setName("QUESTIONNAIRE_MODEL"); + EnoQuestionnaire enoQuestionnaire = new EnoQuestionnaire(); + // + PoguesMapper poguesMapper = new PoguesMapper(); + poguesMapper.mapPoguesQuestionnaire(poguesQuestionnaire, enoQuestionnaire); + // + assertEquals("QUESTIONNAIRE_MODEL", enoQuestionnaire.getQuestionnaireModel()); + } + + @Test + void integrationTest() throws PoguesDeserializationException { + // + EnoQuestionnaire enoQuestionnaire = new EnoQuestionnaire(); + new PoguesMapper().mapPoguesQuestionnaire( + PoguesDeserializer.deserialize(this.getClass().getClassLoader().getResourceAsStream( + "integration/pogues/pogues-simple.json")), + enoQuestionnaire); + // + assertEquals("lmyoceix", enoQuestionnaire.getId()); + assertEquals("fr.insee", enoQuestionnaire.getAgency()); + assertEquals("ENO_SIMPLE", enoQuestionnaire.getQuestionnaireModel()); + assertEquals("Eno - Simple questionnaire", enoQuestionnaire.getLabel().getValue()); + } + } diff --git a/eno-core/src/test/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckExpressionLanguageTest.java b/eno-core/src/test/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckExpressionLanguageTest.java new file mode 100644 index 000000000..c531a56e4 --- /dev/null +++ b/eno-core/src/test/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckExpressionLanguageTest.java @@ -0,0 +1,41 @@ +package fr.insee.eno.core.processing.in.steps.pogues; + +import fr.insee.eno.core.exceptions.business.IllegalPoguesElementException; +import fr.insee.eno.core.mappers.PoguesMapper; +import fr.insee.eno.core.model.EnoQuestionnaire; +import fr.insee.pogues.model.FormulasLanguageEnum; +import fr.insee.pogues.model.Questionnaire; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PoguesCheckExpressionLanguageTest { + + @Test + void validValue() { + // + Questionnaire poguesQuestionnaire = new Questionnaire(); + poguesQuestionnaire.setFormulasLanguage(FormulasLanguageEnum.VTL); + EnoQuestionnaire enoQuestionnaire = new EnoQuestionnaire(); + // + new PoguesMapper().mapPoguesQuestionnaire(poguesQuestionnaire, enoQuestionnaire); + // + PoguesCheckExpressionLanguage processing = new PoguesCheckExpressionLanguage(); + assertDoesNotThrow(() -> processing.apply(enoQuestionnaire)); + } + + @Test + void invalidValue_shouldThrow() { + // + Questionnaire poguesQuestionnaire = new Questionnaire(); + poguesQuestionnaire.setFormulasLanguage(FormulasLanguageEnum.XPATH); + EnoQuestionnaire enoQuestionnaire = new EnoQuestionnaire(); + // + new PoguesMapper().mapPoguesQuestionnaire(poguesQuestionnaire, enoQuestionnaire); + // + PoguesCheckExpressionLanguage processing = new PoguesCheckExpressionLanguage(); + assertThrows(IllegalPoguesElementException.class, () -> processing.apply(enoQuestionnaire)); + } + +} diff --git a/eno-core/src/test/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckFilterModeTest.java b/eno-core/src/test/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckFilterModeTest.java new file mode 100644 index 000000000..4372ea5b5 --- /dev/null +++ b/eno-core/src/test/java/fr/insee/eno/core/processing/in/steps/pogues/PoguesCheckFilterModeTest.java @@ -0,0 +1,41 @@ +package fr.insee.eno.core.processing.in.steps.pogues; + +import fr.insee.eno.core.exceptions.business.IllegalPoguesElementException; +import fr.insee.eno.core.mappers.PoguesMapper; +import fr.insee.eno.core.model.EnoQuestionnaire; +import fr.insee.pogues.model.FlowLogicEnum; +import fr.insee.pogues.model.Questionnaire; +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; +import static org.junit.jupiter.api.Assertions.assertThrows; + +class PoguesCheckFilterModeTest { + + @Test + void validValue() { + // + Questionnaire poguesQuestionnaire = new Questionnaire(); + poguesQuestionnaire.setFlowLogic(FlowLogicEnum.FILTER); + EnoQuestionnaire enoQuestionnaire = new EnoQuestionnaire(); + // + new PoguesMapper().mapPoguesQuestionnaire(poguesQuestionnaire, enoQuestionnaire); + // + PoguesCheckFilterMode processing = new PoguesCheckFilterMode(); + assertDoesNotThrow(() -> processing.apply(enoQuestionnaire)); + } + + @Test + void invalidValue_shouldThrow() { + // + Questionnaire poguesQuestionnaire = new Questionnaire(); + poguesQuestionnaire.setFlowLogic(FlowLogicEnum.REDIRECTION); + EnoQuestionnaire enoQuestionnaire = new EnoQuestionnaire(); + // + new PoguesMapper().mapPoguesQuestionnaire(poguesQuestionnaire, enoQuestionnaire); + // + PoguesCheckFilterMode processing = new PoguesCheckFilterMode(); + assertThrows(IllegalPoguesElementException.class, () -> processing.apply(enoQuestionnaire)); + } + +} diff --git a/eno-core/src/test/resources/integration/ddi/ddi-simple.xml b/eno-core/src/test/resources/integration/ddi/ddi-simple.xml index 36ebee40f..9e49871c0 100644 --- a/eno-core/src/test/resources/integration/ddi/ddi-simple.xml +++ b/eno-core/src/test/resources/integration/ddi/ddi-simple.xml @@ -152,10 +152,10 @@ fr.insee - ENOSIMPLE-CLS + ENO_SIMPLE-CLS 1 - ENOSIMPLE + ENO_SIMPLE fr.insee @@ -229,7 +229,7 @@ Questionnaire - ENOSIMPLE + ENO_SIMPLE fr.insee @@ -300,7 +300,7 @@ Instrument-lmyoceix 1 - ENOSIMPLE + ENO_SIMPLE Eno - Simple questionnaire questionnaire diff --git a/eno-core/src/test/resources/integration/pogues/pogues-simple.json b/eno-core/src/test/resources/integration/pogues/pogues-simple.json index 335dd968f..9ed2977de 100644 --- a/eno-core/src/test/resources/integration/pogues/pogues-simple.json +++ b/eno-core/src/test/resources/integration/pogues/pogues-simple.json @@ -21,7 +21,7 @@ "Eno - Simple questionnaire" ], "childQuestionnaireRef": [], - "Name": "ENOSIMPLE", + "Name": "ENO_SIMPLE", "Variables": { "Variable": [ {