From 2c25883a70834c5eb61e6364a93af50cc30adf0e Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Thu, 23 Apr 2026 17:14:34 +0200 Subject: [PATCH 1/4] fix: prevent clearing contextual data when file is missing --- ...ContextualExternalVariableJsonService.java | 23 ++++++++----------- ...ContextualPreviousVariableJsonService.java | 23 ++++++++----------- 2 files changed, 20 insertions(+), 26 deletions(-) diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java index f2c835a02..4bb0bda04 100644 --- a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java @@ -37,10 +37,12 @@ public ContextualExternalVariableJsonService(ContextualExternalVariablePersistan public boolean readContextualExternalFile(String collectionInstrumentId, String filePath) throws GenesisException { try(FileInputStream inputStream = new FileInputStream(filePath)){ JsonFactory jsonFactory = new JsonFactory(); - moveCollectionToBackup(collectionInstrumentId); try(JsonParser jsonParser = jsonFactory.createParser(inputStream)){ + if (!goToContextualExternalToken(jsonParser)) { + log.warn("No contextualExternal part found in file {}", filePath); return false; + } + moveCollectionToBackup(collectionInstrumentId); List toSave = new ArrayList<>(); - goToContextualExternalToken(jsonParser); long savedCount = 0; Set savedInterrogationIds = new HashSet<>(); if(jsonParser.nextToken() == null){ //skip field name, stop if end of file @@ -84,19 +86,14 @@ public ContextualExternalVariableModel findByCollectionInstrumentIdAndInterrogat return contextualExternalVariablePersistancePort.findByCollectionInstrumentIdAndInterrogationId(collectionInstrumentId, interrogationId); } - private static void goToContextualExternalToken(JsonParser jsonParser) throws IOException{ - boolean isTokenFound = false; - while (!isTokenFound){ - jsonParser.nextToken(); - if(jsonParser.currentToken() == null){ - return; - } - if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) - && jsonParser.currentName() != null - && jsonParser.currentName().equals("editedExternal")) { - isTokenFound = true; + private static boolean goToContextualExternalToken(JsonParser jsonParser) throws IOException { + while (jsonParser.nextToken() != null) { + if (jsonParser.currentToken() == JsonToken.FIELD_NAME + && "editedExternal".equals(jsonParser.currentName())) { + return true; } } + return false; } private void moveCollectionToBackup(String collectionInstrumentId) { diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java index e8b9b98d8..1abb7e960 100644 --- a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java @@ -39,12 +39,14 @@ public boolean readContextualPreviousFile(String collectionInstrumentId, String filePath) throws GenesisException { try(FileInputStream inputStream = new FileInputStream(filePath)){ checkSourceStateLength(sourceState); - moveCollectionToBackup(collectionInstrumentId); JsonFactory jsonFactory = new JsonFactory(); try (JsonParser jsonParser = jsonFactory.createParser(inputStream)) { + if (!goToEditedPreviousToken(jsonParser)) { + log.warn("No EditedPrevious part found in file {}", filePath); return false; + } + moveCollectionToBackup(collectionInstrumentId); List toSave = new ArrayList<>(); - goToEditedPreviousToken(jsonParser); long savedCount = 0; Set savedInterrogationIds = new HashSet<>(); if (jsonParser.nextToken() == null) { //skip field name, stop if end of file @@ -109,19 +111,14 @@ private static void checkSourceStateLength(String sourceState) throws GenesisExc } } - private static void goToEditedPreviousToken(JsonParser jsonParser) throws IOException{ - boolean isTokenFound = false; - while (!isTokenFound){ - jsonParser.nextToken(); - if(jsonParser.currentToken() == null){ - return; - } - if(jsonParser.currentToken().equals(JsonToken.FIELD_NAME) - && jsonParser.currentName() != null - && jsonParser.currentName().equals("editedPrevious")) { - isTokenFound = true; + private boolean goToEditedPreviousToken(JsonParser jsonParser) throws IOException { + while (jsonParser.nextToken() != null) { + if (jsonParser.currentToken() == JsonToken.FIELD_NAME + && "EditedPrevious".equals(jsonParser.getCurrentName())) { + return true; } } + return false; } private ContextualPreviousVariableModel readNextContextualPrevious(JsonParser jsonParser, From 5d689e18c36603898e0f0bf028c76633f693adc6 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Fri, 24 Apr 2026 11:06:05 +0200 Subject: [PATCH 2/4] fix tests --- .../ContextualExternalVariableJsonService.java | 11 ++++++----- .../ContextualPreviousVariableJsonService.java | 14 ++++++++------ 2 files changed, 14 insertions(+), 11 deletions(-) diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java index 4bb0bda04..425f1e9cf 100644 --- a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java @@ -39,16 +39,17 @@ public boolean readContextualExternalFile(String collectionInstrumentId, String JsonFactory jsonFactory = new JsonFactory(); try(JsonParser jsonParser = jsonFactory.createParser(inputStream)){ if (!goToContextualExternalToken(jsonParser)) { - log.warn("No contextualExternal part found in file {}", filePath); return false; + log.warn("No contextualExternal part found in file {}", filePath); + return false; } - moveCollectionToBackup(collectionInstrumentId); - List toSave = new ArrayList<>(); - long savedCount = 0; - Set savedInterrogationIds = new HashSet<>(); if(jsonParser.nextToken() == null){ //skip field name, stop if end of file log.warn("Reached end of file, found no contextualExternal part."); return false; } + moveCollectionToBackup(collectionInstrumentId); + List toSave = new ArrayList<>(); + long savedCount = 0; + Set savedInterrogationIds = new HashSet<>(); jsonParser.nextToken(); //skip [ while (jsonParser.currentToken() != JsonToken.END_ARRAY) { ContextualExternalVariableModel contextualExternalVariableModel = readNextContextualExternal( diff --git a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java index 1abb7e960..722e968b6 100644 --- a/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java +++ b/src/main/java/fr/insee/genesis/domain/service/contextualvariable/previous/ContextualPreviousVariableJsonService.java @@ -43,16 +43,18 @@ public boolean readContextualPreviousFile(String collectionInstrumentId, JsonFactory jsonFactory = new JsonFactory(); try (JsonParser jsonParser = jsonFactory.createParser(inputStream)) { if (!goToEditedPreviousToken(jsonParser)) { - log.warn("No EditedPrevious part found in file {}", filePath); return false; + log.warn("No EditedPrevious part found in file {}", filePath); + return false; } - moveCollectionToBackup(collectionInstrumentId); - List toSave = new ArrayList<>(); - long savedCount = 0; - Set savedInterrogationIds = new HashSet<>(); if (jsonParser.nextToken() == null) { //skip field name, stop if end of file log.warn("Reached end of file, found no EditedPrevious part."); return false; } + moveCollectionToBackup(collectionInstrumentId); + List toSave = new ArrayList<>(); + long savedCount = 0; + Set savedInterrogationIds = new HashSet<>(); + jsonParser.nextToken(); //skip [ while (jsonParser.currentToken() != JsonToken.END_ARRAY) { ContextualPreviousVariableModel contextualPreviousVariableModel = readNextContextualPrevious( @@ -114,7 +116,7 @@ private static void checkSourceStateLength(String sourceState) throws GenesisExc private boolean goToEditedPreviousToken(JsonParser jsonParser) throws IOException { while (jsonParser.nextToken() != null) { if (jsonParser.currentToken() == JsonToken.FIELD_NAME - && "EditedPrevious".equals(jsonParser.getCurrentName())) { + && "editedPrevious".equals(jsonParser.getCurrentName())) { return true; } } From 848479d3e1d1169941fc279135d133768e85d141 Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Fri, 24 Apr 2026 11:13:35 +0200 Subject: [PATCH 3/4] update changelog file --- CHANGELOG.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3da536c66..657d806d1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 2.5.2 +### Fixed +- Prevent missing contextual external or previous files from clearing existing contextual data. + ## 2.5.0 [2026-04-16] ### Added - New schedule endpoints. From 9815b9e0d02afe73d6b9cdfb3cc94e1bc391edda Mon Sep 17 00:00:00 2001 From: Hajarel-moukh Date: Fri, 24 Apr 2026 11:33:24 +0200 Subject: [PATCH 4/4] update changelog file --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 657d806d1..8d858e89b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,6 +1,6 @@ # Changelog -## 2.5.2 +## 2.5.2 [TODO] ### Fixed - Prevent missing contextual external or previous files from clearing existing contextual data.