diff --git a/CHANGELOG.md b/CHANGELOG.md index 3da536c66..8d858e89b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,9 @@ # Changelog +## 2.5.2 [TODO] +### Fixed +- Prevent missing contextual external or previous files from clearing existing contextual data. + ## 2.5.0 [2026-04-16] ### Added - New schedule endpoints. 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..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 @@ -37,16 +37,19 @@ 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)){ - List toSave = new ArrayList<>(); - goToContextualExternalToken(jsonParser); - long savedCount = 0; - Set savedInterrogationIds = new HashSet<>(); + if (!goToContextualExternalToken(jsonParser)) { + log.warn("No contextualExternal part found in file {}", filePath); + return false; + } 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( @@ -84,19 +87,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..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 @@ -39,18 +39,22 @@ 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)) { - List toSave = new ArrayList<>(); - goToEditedPreviousToken(jsonParser); - long savedCount = 0; - Set savedInterrogationIds = new HashSet<>(); + if (!goToEditedPreviousToken(jsonParser)) { + log.warn("No EditedPrevious part found in file {}", filePath); + return false; + } 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( @@ -109,19 +113,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,