Skip to content

Commit 2bdbaef

Browse files
Merge pull request #358 from InseeFr/addContextualFolder
Add contextual folder
2 parents 979b5bf + 77479dd commit 2bdbaef

File tree

6 files changed

+104
-47
lines changed

6 files changed

+104
-47
lines changed

src/main/java/fr/insee/genesis/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ public class Constants {
6060
// Data extraction parameters
6161
public static final int BATCH_SIZE = 100; //Adapt to avoid OutOfMemoryException
6262
public static final String DIFFERENTIAL_DATA_FOLDER_NAME = "differential/data";
63+
public static final String CONTEXTUAL_FOLDER = "/contextual";
6364

6465
// Kraftwerk service path parameters
6566
public static final String KRAFTWERK_MAIN_ENDPOINT = "";

src/main/java/fr/insee/genesis/controller/rest/responses/ContextualVariableController.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package fr.insee.genesis.controller.rest.responses;
22

3+
import fr.insee.genesis.Constants;
34
import fr.insee.genesis.configuration.Config;
45
import fr.insee.genesis.domain.model.surveyunit.Mode;
56
import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort;
@@ -10,6 +11,7 @@
1011
import io.swagger.v3.oas.annotations.Operation;
1112
import lombok.AllArgsConstructor;
1213
import lombok.extern.slf4j.Slf4j;
14+
import org.springframework.http.HttpStatus;
1315
import org.springframework.http.HttpStatusCode;
1416
import org.springframework.http.ResponseEntity;
1517
import org.springframework.security.access.prepost.PreAuthorize;
@@ -50,12 +52,16 @@ public ResponseEntity<Object> getContextualVariables(
5052
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER')")
5153
public ResponseEntity<Object> saveContextualVariables(
5254
@RequestParam("questionnaireId") String questionnaireId
53-
){
55+
) {
5456
try {
5557
FileUtils fileUtils = new FileUtils(config);
56-
int fileCount = contextualVariableApiPort.saveContextualVariableFiles(questionnaireId, fileUtils);
58+
59+
String contextualFolderPath = fileUtils.getDataFolder(questionnaireId, "WEB", null) + Constants.CONTEXTUAL_FOLDER;
60+
61+
int fileCount = contextualVariableApiPort.saveContextualVariableFiles(questionnaireId, fileUtils,contextualFolderPath);
62+
5763
return ResponseEntity.ok("%d file(s) processed for questionnaire %s !".formatted(fileCount, questionnaireId));
58-
}catch (GenesisException ge){
64+
} catch (GenesisException ge) {
5965
return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage());
6066
}
6167
}
@@ -72,8 +78,11 @@ public ResponseEntity<Object> readContextualPreviousJson(
7278
try {
7379
FileUtils fileUtils = new FileUtils(config);
7480

75-
String filePath = "%s/%s".formatted(
81+
fileUtils.ensureContextualFolderExists(questionnaireId, mode);
82+
83+
String filePath = "%s%s/%s".formatted(
7684
fileUtils.getDataFolder(questionnaireId, mode.getFolder(), null),
85+
Constants.CONTEXTUAL_FOLDER,
7786
jsonFileName
7887
);
7988
if (!jsonFileName.toLowerCase().endsWith(".json")) {
@@ -84,7 +93,8 @@ public ResponseEntity<Object> readContextualPreviousJson(
8493
return ResponseEntity.ok("Contextual previous variable file %s saved !".formatted(filePath));
8594
}catch (GenesisException ge){
8695
return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage());
87-
}
96+
} catch (IOException ioe) {
97+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Erreur IO : " + ioe.getMessage()); }
8898
}
8999

90100
@Operation(summary = "Add contextual external json file")
@@ -98,8 +108,11 @@ public ResponseEntity<Object> readContextualExternalJson(
98108
try {
99109
FileUtils fileUtils = new FileUtils(config);
100110

101-
String filePath = "%s/%s".formatted(
111+
fileUtils.ensureContextualFolderExists(questionnaireId, mode);
112+
113+
String filePath = "%s%s/%s".formatted(
102114
fileUtils.getDataFolder(questionnaireId, mode.getFolder(), null),
115+
Constants.CONTEXTUAL_FOLDER,
103116
jsonFileName
104117
);
105118
if (!jsonFileName.toLowerCase().endsWith(".json")) {
@@ -110,6 +123,8 @@ public ResponseEntity<Object> readContextualExternalJson(
110123
return ResponseEntity.ok("Contextual external variable file %s saved !".formatted(filePath));
111124
}catch (GenesisException ge){
112125
return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage());
126+
} catch (IOException ioe) {
127+
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Erreur IO : " + ioe.getMessage());
113128
}
114129
}
115130

src/main/java/fr/insee/genesis/domain/ports/api/ContextualVariableApiPort.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@
66

77
public interface ContextualVariableApiPort {
88
ContextualVariableModel getContextualVariable(String questionnaireId, String interrogationId);
9-
int saveContextualVariableFiles(String questionnaireId, FileUtils fileUtils) throws GenesisException;
9+
int saveContextualVariableFiles(String questionnaireId, FileUtils fileUtils,String contextualFolderPath) throws GenesisException;
1010
}

src/main/java/fr/insee/genesis/domain/service/contextualvariable/ContextualVariableJsonService.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,13 +75,11 @@ public ContextualVariableModel getContextualVariable(String questionnaireId, Str
7575
}
7676

7777
@Override
78-
public int saveContextualVariableFiles(String questionnaireId, FileUtils fileUtils) throws GenesisException {
78+
public int saveContextualVariableFiles(String questionnaireId, FileUtils fileUtils,String contextualFolderPath) throws GenesisException {
7979
int fileCount = 0;
8080

8181
for (Mode mode : Mode.values()) {
82-
try (Stream<Path> filePaths = Files.list(Path.of(fileUtils.getDataFolder(questionnaireId,
83-
mode.getFolder()
84-
, null)))) {
82+
try (Stream<Path> filePaths = Files.list(Path.of(contextualFolderPath))) {
8583
Iterator<Path> it = filePaths
8684
.filter(path -> path.toString().endsWith(".json"))
8785
.iterator();

src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package fr.insee.genesis.infrastructure.utils;
22

33
import com.fasterxml.jackson.databind.ObjectMapper;
4+
import fr.insee.genesis.Constants;
45
import fr.insee.genesis.configuration.Config;
6+
import fr.insee.genesis.domain.model.surveyunit.Mode;
57
import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel;
68
import lombok.Getter;
79
import lombok.extern.slf4j.Slf4j;
@@ -252,4 +254,15 @@ public List<File> listAllSpecsFolders() {
252254
.filter(File::isDirectory)
253255
.toList();
254256
}
257+
public void ensureContextualFolderExists(String questionnaireId, Mode mode) throws IOException {
258+
String contextualFolderPath = getDataFolder(questionnaireId, mode.getFolder(), null) + Constants.CONTEXTUAL_FOLDER;
259+
if (!isFolderPresent(contextualFolderPath)) {
260+
Files.createDirectories(Path.of(contextualFolderPath));
261+
log.debug("contextual folder created : {}", contextualFolderPath);
262+
} else {
263+
log.debug("contextual folder already exists : {}", contextualFolderPath);
264+
}
265+
}
266+
267+
255268
}

src/test/java/fr/insee/genesis/controller/rest/responses/ContextualVariableControllerTest.java

Lines changed: 66 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -186,12 +186,13 @@ void saveContextualVariables_previous_test(
186186
Consumer<ContextualPreviousVariableDocument> assertionsForDoc
187187
) {
188188
//GIVEN
189-
Files.createDirectories(SOURCE_PATH_PREVIOUS);
189+
Path contextualPath = SOURCE_PATH_PREVIOUS.resolve("contextual");
190+
Files.createDirectories(contextualPath);
190191
Files.copy(
191192
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
192193
.resolve("contextual_previous")
193194
.resolve("ok.json"),
194-
SOURCE_PATH_PREVIOUS.resolve("ok.json"),
195+
contextualPath.resolve("ok.json"),
195196
StandardCopyOption.REPLACE_EXISTING
196197
);
197198

@@ -283,12 +284,13 @@ void saveContextualVariables_external_test( String interrogationId,
283284
int expectedVarCount,
284285
Consumer<ContextualExternalVariableDocument> assertionsForDoc) {
285286
//GIVEN
286-
Files.createDirectories(SOURCE_PATH_EXTERNAL);
287+
Path contextualPath = SOURCE_PATH_EXTERNAL.resolve("contextual");
288+
Files.createDirectories(contextualPath);
287289
Files.copy(
288290
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
289291
.resolve("contextual_external")
290292
.resolve("ok.json"),
291-
SOURCE_PATH_EXTERNAL.resolve("ok.json"),
293+
contextualPath.resolve("ok.json"),
292294
StandardCopyOption.REPLACE_EXISTING
293295
);
294296

@@ -400,10 +402,13 @@ void readPreviousJson_sourceState(String sourceState){
400402

401403
private void testOKCase(String sourceState) throws IOException {
402404
//GIVEN
403-
Files.createDirectories(SOURCE_PATH_PREVIOUS);
405+
Path contextualPath = SOURCE_PATH_PREVIOUS.resolve("contextual");
406+
Files.createDirectories(contextualPath);
404407
Files.copy(
405-
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve("ok.json"),
406-
SOURCE_PATH_PREVIOUS.resolve("ok.json"),
408+
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
409+
.resolve("contextual_previous")
410+
.resolve("ok.json"),
411+
contextualPath.resolve("ok.json"),
407412
StandardCopyOption.REPLACE_EXISTING
408413
);
409414

@@ -484,19 +489,22 @@ void readPreviousJson_override_interrogation_id( String interrogationId,
484489
int expectedVarCount,
485490
Consumer<ContextualPreviousVariableDocument> assertionsForDoc){
486491
//GIVEN
487-
Files.createDirectories(SOURCE_PATH_PREVIOUS);
492+
Path contextualPath = SOURCE_PATH_PREVIOUS.resolve("contextual");
493+
Files.createDirectories(contextualPath);
488494
Path path = Path.of(TestConstants.TEST_RESOURCES_DIRECTORY);
489495
Files.copy(
490-
491-
path.resolve("contextual_previous").resolve("ok.json"),
492-
SOURCE_PATH_PREVIOUS.resolve("ok.json"),
496+
path.resolve("contextual_previous")
497+
.resolve("ok.json"),
498+
contextualPath.resolve("ok.json"),
493499
StandardCopyOption.REPLACE_EXISTING
494500
);
495501
contextualVariableController.readContextualPreviousJson(QUESTIONNAIRE_ID_PREVIOUS, Mode.WEB, null, "ok.json");
496502
Files.createDirectories(SOURCE_PATH_PREVIOUS);
503+
497504
Files.copy(
498-
path.resolve("contextual_previous").resolve("ok2.json"),
499-
SOURCE_PATH_PREVIOUS.resolve("ok2.json"),
505+
path.resolve("contextual_previous")
506+
.resolve("ok2.json"),
507+
contextualPath.resolve("ok2.json"),
500508
StandardCopyOption.REPLACE_EXISTING
501509
);
502510

@@ -587,10 +595,13 @@ static Stream<Arguments> overridePreviousCases() {
587595
void readPreviousJson_sourceState_too_long(String sourceState){
588596
//GIVEN
589597
String fileName = "ok.json";
590-
Files.createDirectories(SOURCE_PATH_PREVIOUS);
598+
Path contextualPath = SOURCE_PATH_PREVIOUS.resolve("contextual");
599+
Files.createDirectories(contextualPath);
591600
Files.copy(
592-
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve(fileName),
593-
SOURCE_PATH_PREVIOUS.resolve(fileName),
601+
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
602+
.resolve("contextual_previous")
603+
.resolve(fileName),
604+
contextualPath.resolve(fileName),
594605
StandardCopyOption.REPLACE_EXISTING
595606
);
596607

@@ -605,10 +616,13 @@ void readPreviousJson_sourceState_too_long(String sourceState){
605616
void readPreviousJson_invalid_syntax(){
606617
String syntaxErrorFileName = "invalid_syntax.json";
607618
//GIVEN
608-
Files.createDirectories(SOURCE_PATH_PREVIOUS);
619+
Path contextualPath = SOURCE_PATH_PREVIOUS.resolve("contextual");
620+
Files.createDirectories(contextualPath);
609621
Files.copy(
610-
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve(syntaxErrorFileName),
611-
SOURCE_PATH_PREVIOUS.resolve(syntaxErrorFileName),
622+
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
623+
.resolve("contextual_previous")
624+
.resolve(syntaxErrorFileName),
625+
contextualPath.resolve(syntaxErrorFileName),
612626
StandardCopyOption.REPLACE_EXISTING
613627
);
614628

@@ -622,10 +636,13 @@ void readPreviousJson_invalid_syntax(){
622636
void readPreviousJson_not_a_json(){
623637
String syntaxErrorFileName = "not_a_json.xml";
624638
//GIVEN
625-
Files.createDirectories(SOURCE_PATH_PREVIOUS);
639+
Path contextualPath = SOURCE_PATH_PREVIOUS.resolve("contextual");
640+
Files.createDirectories(contextualPath);
626641
Files.copy(
627-
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve(syntaxErrorFileName),
628-
SOURCE_PATH_PREVIOUS.resolve(syntaxErrorFileName),
642+
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
643+
.resolve("contextual_previous")
644+
.resolve(syntaxErrorFileName),
645+
contextualPath.resolve(syntaxErrorFileName),
629646
StandardCopyOption.REPLACE_EXISTING
630647
);
631648

@@ -642,10 +659,13 @@ void readPreviousJson_not_a_json(){
642659
@DisplayName("Previous json return 400 if no interrogationId, only one interrogationId, or double interrogationId")
643660
void readPreviousJson_no_interrogation_id(String fileName){
644661
//GIVEN
645-
Files.createDirectories(SOURCE_PATH_PREVIOUS);
662+
Path contextualPath = SOURCE_PATH_PREVIOUS.resolve("contextual");
663+
Files.createDirectories(contextualPath);
646664
Files.copy(
647-
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_previous").resolve(fileName),
648-
SOURCE_PATH_PREVIOUS.resolve(fileName),
665+
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
666+
.resolve("contextual_previous")
667+
.resolve(fileName),
668+
contextualPath.resolve(fileName),
649669
StandardCopyOption.REPLACE_EXISTING
650670
);
651671

@@ -662,10 +682,13 @@ void readExternalJson_test( String interrogationId,
662682
int expectedVarCount,
663683
Consumer<ContextualExternalVariableDocument> assertionsForDoc){
664684
//GIVEN
665-
Files.createDirectories(SOURCE_PATH_EXTERNAL);
685+
Path contextualPath = SOURCE_PATH_EXTERNAL.resolve("contextual");
686+
Files.createDirectories(contextualPath);
666687
Files.copy(
667-
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_external").resolve("ok.json"),
668-
SOURCE_PATH_EXTERNAL.resolve("ok.json"),
688+
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
689+
.resolve("contextual_external")
690+
.resolve("ok.json"),
691+
contextualPath.resolve("ok.json"),
669692
StandardCopyOption.REPLACE_EXISTING
670693
);
671694

@@ -742,18 +765,21 @@ void readExternalJson_override_interrogation_id( String interrogationId,
742765
Consumer<ContextualExternalVariableDocument> assertionsForDoc
743766
){
744767
//GIVEN
745-
Files.createDirectories(SOURCE_PATH_EXTERNAL);
768+
Path contextualPath = SOURCE_PATH_EXTERNAL.resolve("contextual");
746769
Path path = Path.of(TestConstants.TEST_RESOURCES_DIRECTORY);
770+
Files.createDirectories(contextualPath);
747771
Files.copy(
748-
path.resolve("contextual_external").resolve("ok.json"),
749-
SOURCE_PATH_EXTERNAL.resolve("ok.json"),
772+
path.resolve("contextual_external")
773+
.resolve("ok.json"),
774+
contextualPath.resolve("ok.json"),
750775
StandardCopyOption.REPLACE_EXISTING
751776
);
752777
contextualVariableController.readContextualExternalJson(QUESTIONNAIRE_ID_EXTERNAL, Mode.WEB, "ok.json");
753778
Files.createDirectories(SOURCE_PATH_EXTERNAL);
754779
Files.copy(
755-
path.resolve("contextual_external").resolve("ok2.json"),
756-
SOURCE_PATH_EXTERNAL.resolve("ok2.json"),
780+
path.resolve("contextual_external")
781+
.resolve("ok2.json"),
782+
contextualPath.resolve("ok2.json"),
757783
StandardCopyOption.REPLACE_EXISTING
758784
);
759785

@@ -839,10 +865,14 @@ static Stream<Arguments> overrideExternalCases() {
839865
@SneakyThrows
840866
void readExternalJson_error_400(String fileName){
841867
//GIVEN
842-
Files.createDirectories(SOURCE_PATH_EXTERNAL);
868+
Path contextualPath = SOURCE_PATH_EXTERNAL.resolve("contextual");
869+
Files.createDirectories(contextualPath);
870+
843871
Files.copy(
844-
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY).resolve("contextual_external").resolve(fileName),
845-
SOURCE_PATH_EXTERNAL.resolve(fileName),
872+
Path.of(TestConstants.TEST_RESOURCES_DIRECTORY)
873+
.resolve("contextual_external")
874+
.resolve(fileName),
875+
contextualPath.resolve(fileName),
846876
StandardCopyOption.REPLACE_EXISTING
847877
);
848878

0 commit comments

Comments
 (0)