44import fr .insee .bpm .metadata .model .MetadataModel ;
55import fr .insee .bpm .metadata .model .Variable ;
66import fr .insee .bpm .metadata .model .VariableType ;
7+ import fr .insee .bpm .metadata .model .VariablesMap ;
78import fr .insee .bpm .metadata .reader .ddi .DDIReader ;
89import fr .insee .bpm .metadata .reader .lunatic .LunaticReader ;
910import fr .insee .genesis .Constants ;
2021
2122import java .io .FileInputStream ;
2223import java .io .IOException ;
24+ import java .io .InputStream ;
2325import java .nio .file .Path ;
2426import java .util .List ;
2527
28+ import static fr .insee .bpm .metadata .reader .lunatic .LunaticUtils .addLunaticVariable ;
29+
2630@ Service
2731@ AllArgsConstructor
2832@ Slf4j
@@ -43,19 +47,58 @@ public MetadataModel find(String questionnaireId, Mode mode) throws GenesisExcep
4347 return questionnaireMetadataModels .getFirst ().metadataModel ();
4448 }
4549
46- @ Override
4750 public MetadataModel loadAndSaveIfNotExists (String campaignName , String questionnaireId , Mode mode , FileUtils fileUtils ,
4851 List <GenesisError > errors ) throws GenesisException {
52+
4953 List <QuestionnaireMetadataModel > questionnaireMetadataModels =
5054 questionnaireMetadataPersistancePort .find (questionnaireId .toUpperCase (), mode );
51- if (questionnaireMetadataModels .isEmpty () || questionnaireMetadataModels .getFirst ().metadataModel () == null ){
52- MetadataModel metadataModel = readMetadatas (campaignName , mode .getModeName (), fileUtils , errors );
53- saveMetadata (questionnaireId .toUpperCase (), mode , metadataModel );
54- return metadataModel ;
55+
56+ MetadataModel metadataModel ;
57+
58+ if (questionnaireMetadataModels .isEmpty () || questionnaireMetadataModels .getFirst ().metadataModel () == null ) {
59+ metadataModel = readMetadatas (campaignName , mode .getModeName (), fileUtils , errors );
60+ } else {
61+ metadataModel = questionnaireMetadataModels .getFirst ().metadataModel ();
5562 }
56- return questionnaireMetadataModels .getFirst ().metadataModel ();
63+ String metadataFilePath = fileUtils .getSpecFolder (questionnaireId );
64+ addMissingAndFilterVariables (metadataModel , metadataFilePath );
65+
66+ saveMetadata (questionnaireId .toUpperCase (), mode , metadataModel );
67+
68+ return metadataModel ;
5769 }
5870
71+ private void addMissingAndFilterVariables (MetadataModel metadataModel , String metadataFilePath ) {
72+ VariablesMap variablesMap = metadataModel .getVariables ();
73+
74+ try (InputStream lunaticStream = new FileInputStream (metadataFilePath );
75+ InputStream lunaticStream2 = new FileInputStream (metadataFilePath )) {
76+
77+ List <String > missingVars = LunaticReader .getMissingVariablesFromLunatic (lunaticStream );
78+ List <String > filterVars = LunaticReader .getFilterResultFromLunatic (lunaticStream2 );
79+
80+ for (String var : missingVars ) {
81+ String missingVarName = var + Constants .MISSING_SUFFIX ;
82+ if (!variablesMap .hasVariable (missingVarName )) {
83+ addLunaticVariable (metadataModel , var , Constants .MISSING_SUFFIX , VariableType .STRING );
84+ }
85+ }
86+
87+ for (String var : filterVars ) {
88+ String filterVarName = Constants .FILTER_RESULT_PREFIX + var ;
89+ if (!variablesMap .hasVariable (filterVarName )) {
90+ addLunaticVariable (metadataModel , var , Constants .FILTER_RESULT_PREFIX , VariableType .BOOLEAN );
91+ }
92+ }
93+
94+ } catch (IOException e ) {
95+ log .error ("Erreur lecture fichier Lunatic : {}" , metadataFilePath , e );
96+ }
97+ }
98+
99+
100+
101+
59102 private void saveMetadata (String questionnaireId , Mode mode , MetadataModel metadataModel ) {
60103 questionnaireMetadataPersistancePort .save (
61104 new QuestionnaireMetadataModel (
0 commit comments