Skip to content

Commit 8de0089

Browse files
committed
refactor: put contextual variable logic into services
1 parent 34fe2f3 commit 8de0089

File tree

8 files changed

+171
-145
lines changed

8 files changed

+171
-145
lines changed

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

Lines changed: 3 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,8 @@
1919
import org.springframework.web.bind.annotation.RequestMapping;
2020
import org.springframework.web.bind.annotation.RequestParam;
2121

22-
import java.io.FileInputStream;
23-
import java.io.FileNotFoundException;
2422
import java.io.IOException;
25-
import java.io.InputStream;
26-
import java.nio.file.Files;
27-
import java.nio.file.NoSuchFileException;
2823
import java.nio.file.Path;
29-
import java.util.Iterator;
30-
import java.util.stream.Stream;
3124

3225
@RequestMapping(path = "/contextual-variable")
3326
@Controller
@@ -60,43 +53,13 @@ public ResponseEntity<Object> saveContextualVariables(
6053
){
6154
try {
6255
FileUtils fileUtils = new FileUtils(config);
63-
int fileCount = 0;
64-
65-
for (Mode mode : Mode.values()) {
66-
try (Stream<Path> filePaths = Files.list(Path.of(fileUtils.getDataFolder(questionnaireId,
67-
mode.getFolder()
68-
, null)))) {
69-
Iterator<Path> it = filePaths
70-
.filter(path -> path.toString().endsWith(".json"))
71-
.iterator();
72-
while (it.hasNext()) {
73-
Path jsonFilePath = it.next();
74-
if (processContextualFile(questionnaireId, jsonFilePath)) {
75-
//If the file is indeed a contextual variables file and had been processed
76-
moveFile(questionnaireId, mode, fileUtils, jsonFilePath.toString());
77-
fileCount++;
78-
}
79-
}
80-
} catch (NoSuchFileException nsfe) {
81-
log.debug(nsfe.toString());
82-
} catch (IOException ioe) {
83-
log.warn(ioe.toString());
84-
}
85-
}
56+
int fileCount = contextualVariableApiPort.saveContextualVariableFiles(questionnaireId, fileUtils);
8657
return ResponseEntity.ok("%d file(s) processed for questionnaire %s !".formatted(fileCount, questionnaireId));
8758
}catch (GenesisException ge){
8859
return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage());
8960
}
9061
}
9162

92-
/**
93-
* @return true if any contextual variable part found in file, false otherwise
94-
*/
95-
private boolean processContextualFile(String questionnaireId, Path jsonFilePath) throws GenesisException {
96-
return readContextualPreviousFile(questionnaireId.toUpperCase(), null, jsonFilePath.toString())
97-
|| readContextualExternalFile(questionnaireId.toUpperCase(), jsonFilePath.toString());
98-
}
99-
10063
@Operation(summary = "Add contextual previous json file")
10164
@PostMapping(path = "previous/json")
10265
@PreAuthorize("hasAnyRole('USER_PLATINE','SCHEDULER','USER_BACK_OFFICE')")
@@ -116,7 +79,7 @@ public ResponseEntity<Object> readContextualPreviousJson(
11679
if (!jsonFileName.toLowerCase().endsWith(".json")) {
11780
throw new GenesisException(400, "File must be a JSON file !");
11881
}
119-
readContextualPreviousFile(questionnaireId.toUpperCase(), sourceState, filePath);
82+
contextualPreviousVariableApiPort.readContextualPreviousFile(questionnaireId.toUpperCase(), sourceState, filePath);
12083
moveFile(questionnaireId, mode, fileUtils, filePath);
12184
return ResponseEntity.ok("Contextual previous variable file %s saved !".formatted(filePath));
12285
}catch (GenesisException ge){
@@ -142,34 +105,14 @@ public ResponseEntity<Object> readContextualExternalJson(
142105
if (!jsonFileName.toLowerCase().endsWith(".json")) {
143106
throw new GenesisException(400, "File must be a JSON file !");
144107
}
145-
readContextualExternalFile(questionnaireId.toUpperCase(), filePath);
108+
contextualExternalVariableApiPort.readContextualExternalFile(questionnaireId, filePath);
146109
moveFile(questionnaireId, mode, fileUtils, filePath);
147110
return ResponseEntity.ok("Contextual external variable file %s saved !".formatted(filePath));
148111
}catch (GenesisException ge){
149112
return ResponseEntity.status(HttpStatusCode.valueOf(ge.getStatus())).body(ge.getMessage());
150113
}
151114
}
152115

153-
private boolean readContextualPreviousFile(String questionnaireId, String sourceState, String filePath) throws GenesisException {
154-
try (InputStream inputStream = new FileInputStream(filePath)) {
155-
return contextualPreviousVariableApiPort.readContextualPreviousFile(inputStream, questionnaireId, sourceState);
156-
} catch (FileNotFoundException e) {
157-
throw new GenesisException(404, "File %s not found".formatted(filePath));
158-
} catch (IOException e) {
159-
throw new GenesisException(500, e.toString());
160-
}
161-
}
162-
163-
private boolean readContextualExternalFile(String questionnaireId, String filePath) throws GenesisException {
164-
try (InputStream inputStream = new FileInputStream(filePath)) {
165-
return contextualExternalVariableApiPort.readContextualExternalFile(inputStream, questionnaireId);
166-
} catch (FileNotFoundException e) {
167-
throw new GenesisException(404, "File %s not found".formatted(filePath));
168-
} catch (IOException e) {
169-
throw new GenesisException(500, e.toString());
170-
}
171-
}
172-
173116
private static void moveFile(String questionnaireId, Mode mode, FileUtils fileUtils, String filePath) throws GenesisException {
174117
try {
175118
fileUtils.moveFiles(Path.of(filePath), fileUtils.getDoneFolder(questionnaireId, mode.getFolder()));
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package fr.insee.genesis.domain.ports.api;
22

3+
import fr.insee.genesis.domain.model.contextualvariable.ContextualExternalVariableModel;
34
import fr.insee.genesis.exceptions.GenesisException;
45

5-
import java.io.InputStream;
6-
76
public interface ContextualExternalVariableApiPort {
8-
boolean readContextualExternalFile(InputStream inputStream, String questionnaireId) throws GenesisException;
9-
}
7+
boolean readContextualExternalFile(String questionnaireId, String filePath) throws GenesisException;
8+
9+
ContextualExternalVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId);
10+
}
Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
package fr.insee.genesis.domain.ports.api;
22

3+
import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel;
34
import fr.insee.genesis.exceptions.GenesisException;
45

56
import java.io.InputStream;
67

78
public interface ContextualPreviousVariableApiPort {
8-
boolean readContextualPreviousFile(InputStream inputStream, String questionnaireId, String sourceState) throws GenesisException;
9-
}
9+
boolean readContextualPreviousFile(String questionnaireId, String sourceState, String filePath) throws GenesisException;
10+
11+
ContextualPreviousVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId);
12+
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package fr.insee.genesis.domain.ports.api;
22

33
import fr.insee.genesis.domain.model.contextualvariable.ContextualVariableModel;
4+
import fr.insee.genesis.exceptions.GenesisException;
5+
import fr.insee.genesis.infrastructure.utils.FileUtils;
46

57
public interface ContextualVariableApiPort {
68
ContextualVariableModel getContextualVariable(String questionnaireId, String interrogationId);
9+
int saveContextualVariableFiles(String questionnaireId, FileUtils fileUtils) throws GenesisException;
710
}

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

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -6,26 +6,37 @@
66
import fr.insee.genesis.domain.model.contextualvariable.ContextualPreviousVariableModel;
77
import fr.insee.genesis.domain.model.contextualvariable.ContextualVariableModel;
88
import fr.insee.genesis.domain.model.surveyunit.DataState;
9+
import fr.insee.genesis.domain.model.surveyunit.Mode;
10+
import fr.insee.genesis.domain.ports.api.ContextualExternalVariableApiPort;
11+
import fr.insee.genesis.domain.ports.api.ContextualPreviousVariableApiPort;
912
import fr.insee.genesis.domain.ports.api.ContextualVariableApiPort;
10-
import fr.insee.genesis.domain.ports.spi.ContextualExternalVariablePersistancePort;
11-
import fr.insee.genesis.domain.ports.spi.ContextualPreviousVariablePersistancePort;
13+
import fr.insee.genesis.exceptions.GenesisException;
14+
import fr.insee.genesis.infrastructure.utils.FileUtils;
15+
import lombok.extern.slf4j.Slf4j;
1216
import org.springframework.beans.factory.annotation.Autowired;
1317
import org.springframework.stereotype.Service;
1418

19+
import java.io.IOException;
20+
import java.nio.file.Files;
21+
import java.nio.file.NoSuchFileException;
22+
import java.nio.file.Path;
1523
import java.time.LocalDateTime;
1624
import java.util.ArrayList;
25+
import java.util.Iterator;
1726
import java.util.List;
1827
import java.util.Map;
28+
import java.util.stream.Stream;
1929

2030
@Service
31+
@Slf4j
2132
public class ContextualVariableJsonService implements ContextualVariableApiPort {
22-
private final ContextualPreviousVariablePersistancePort contextualPreviousVariablePersistancePort;
23-
private final ContextualExternalVariablePersistancePort contextualExternalVariablePersistancePort;
33+
private final ContextualPreviousVariableApiPort contextualPreviousVariableApiPort;
34+
private final ContextualExternalVariableApiPort contextualExternalVariableApiPort;
2435

2536
@Autowired
26-
public ContextualVariableJsonService(ContextualPreviousVariablePersistancePort contextualPreviousVariablePersistancePort, ContextualExternalVariablePersistancePort contextualExternalVariablePersistancePort) {
27-
this.contextualPreviousVariablePersistancePort = contextualPreviousVariablePersistancePort;
28-
this.contextualExternalVariablePersistancePort = contextualExternalVariablePersistancePort;
37+
public ContextualVariableJsonService(ContextualPreviousVariableApiPort contextualPreviousVariableApiPort, ContextualExternalVariableApiPort contextualExternalVariableApiPort) {
38+
this.contextualPreviousVariableApiPort = contextualPreviousVariableApiPort;
39+
this.contextualExternalVariableApiPort = contextualExternalVariableApiPort;
2940
}
3041

3142
@Override
@@ -37,7 +48,7 @@ public ContextualVariableModel getContextualVariable(String questionnaireId, Str
3748
.build();
3849

3950
ContextualPreviousVariableModel contextualPreviousVariableModel =
40-
contextualPreviousVariablePersistancePort.findByQuestionnaireIdAndInterrogationId(
51+
contextualPreviousVariableApiPort.findByQuestionnaireIdAndInterrogationId(
4152
questionnaireId,
4253
interrogationId
4354
);
@@ -49,7 +60,7 @@ public ContextualVariableModel getContextualVariable(String questionnaireId, Str
4960
}
5061

5162
ContextualExternalVariableModel contextualExternalVariableModel =
52-
contextualExternalVariablePersistancePort.findByQuestionnaireIdAndInterrogationId(
63+
contextualExternalVariableApiPort.findByQuestionnaireIdAndInterrogationId(
5364
questionnaireId,
5465
interrogationId
5566
);
@@ -63,6 +74,42 @@ public ContextualVariableModel getContextualVariable(String questionnaireId, Str
6374
return contextualVariableModel;
6475
}
6576

77+
@Override
78+
public int saveContextualVariableFiles(String questionnaireId, FileUtils fileUtils) throws GenesisException {
79+
int fileCount = 0;
80+
81+
for (Mode mode : Mode.values()) {
82+
try (Stream<Path> filePaths = Files.list(Path.of(fileUtils.getDataFolder(questionnaireId,
83+
mode.getFolder()
84+
, null)))) {
85+
Iterator<Path> it = filePaths
86+
.filter(path -> path.toString().endsWith(".json"))
87+
.iterator();
88+
while (it.hasNext()) {
89+
Path jsonFilePath = it.next();
90+
if (processContextualVariableFile(questionnaireId, jsonFilePath)) {
91+
//If the file is indeed a contextual variables file and had been processed
92+
moveFile(questionnaireId, mode, fileUtils, jsonFilePath.toString());
93+
fileCount++;
94+
}
95+
}
96+
} catch (NoSuchFileException nsfe) {
97+
log.debug(nsfe.toString());
98+
} catch (IOException ioe) {
99+
log.warn(ioe.toString());
100+
}
101+
}
102+
return fileCount;
103+
}
104+
105+
private static void moveFile(String questionnaireId, Mode mode, FileUtils fileUtils, String filePath) throws GenesisException {
106+
try {
107+
fileUtils.moveFiles(Path.of(filePath), fileUtils.getDoneFolder(questionnaireId, mode.getFolder()));
108+
} catch (IOException e) {
109+
throw new GenesisException(500, "Error while moving file to done : %s".formatted(e.toString()));
110+
}
111+
}
112+
66113
@SuppressWarnings("unchecked")
67114
private List<VariableQualityToolDto> extractVariables(Object variable, String variableName) {
68115
List<VariableQualityToolDto> variableQualityToolDtos = new ArrayList<>();
@@ -97,4 +144,17 @@ private VariableQualityToolDto extractValue(Object variable, String variableName
97144
return variableQualityToolDto;
98145
}
99146

147+
/**
148+
* @return true if any contextual variable part found in file, false otherwise
149+
*/
150+
private boolean processContextualVariableFile(String questionnaireId, Path jsonFilePath) throws GenesisException {
151+
return contextualPreviousVariableApiPort.readContextualPreviousFile(
152+
questionnaireId.toUpperCase(),
153+
null,
154+
jsonFilePath.toString()
155+
) || contextualExternalVariableApiPort.readContextualExternalFile(
156+
questionnaireId.toUpperCase(),
157+
jsonFilePath.toString()
158+
);
159+
}
100160
}

src/main/java/fr/insee/genesis/domain/service/contextualvariable/external/ContextualExternalVariableJsonService.java

Lines changed: 37 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
import org.springframework.beans.factory.annotation.Autowired;
1414
import org.springframework.stereotype.Service;
1515

16+
import java.io.FileInputStream;
1617
import java.io.IOException;
17-
import java.io.InputStream;
1818
import java.util.ArrayList;
1919
import java.util.HashMap;
2020
import java.util.HashSet;
@@ -34,41 +34,42 @@ public ContextualExternalVariableJsonService(ContextualExternalVariablePersistan
3434
}
3535

3636
@Override
37-
public boolean readContextualExternalFile(InputStream inputStream,
38-
String questionnaireId) throws GenesisException {
39-
JsonFactory jsonFactory = new JsonFactory();
40-
moveCollectionToBackup(questionnaireId);
41-
try(JsonParser jsonParser = jsonFactory.createParser(inputStream)){
42-
List<ContextualExternalVariableModel> toSave = new ArrayList<>();
43-
goToContextualExternalToken(jsonParser);
44-
long savedCount = 0;
45-
Set<String> savedInterrogationIds = new HashSet<>();
46-
if(jsonParser.nextToken() == null){ //skip field name, stop if end of file
47-
log.warn("Reached end of file, found no contextualExternal part.");
48-
return false;
49-
}
50-
jsonParser.nextToken(); //skip [
51-
while (jsonParser.currentToken() != JsonToken.END_ARRAY) {
52-
ContextualExternalVariableModel contextualExternalVariableModel = readNextContextualExternal(
53-
jsonParser,
54-
questionnaireId
55-
);
37+
public boolean readContextualExternalFile(String questionnaireId, String filePath) throws GenesisException {
38+
try(FileInputStream inputStream = new FileInputStream(filePath)){
39+
JsonFactory jsonFactory = new JsonFactory();
40+
moveCollectionToBackup(questionnaireId);
41+
try(JsonParser jsonParser = jsonFactory.createParser(inputStream)){
42+
List<ContextualExternalVariableModel> toSave = new ArrayList<>();
43+
goToContextualExternalToken(jsonParser);
44+
long savedCount = 0;
45+
Set<String> savedInterrogationIds = new HashSet<>();
46+
if(jsonParser.nextToken() == null){ //skip field name, stop if end of file
47+
log.warn("Reached end of file, found no contextualExternal part.");
48+
return false;
49+
}
50+
jsonParser.nextToken(); //skip [
51+
while (jsonParser.currentToken() != JsonToken.END_ARRAY) {
52+
ContextualExternalVariableModel contextualExternalVariableModel = readNextContextualExternal(
53+
jsonParser,
54+
questionnaireId
55+
);
5656

57-
checkModel(contextualExternalVariableModel, jsonParser, savedInterrogationIds);
57+
checkModel(contextualExternalVariableModel, jsonParser, savedInterrogationIds);
5858

59-
toSave.add(contextualExternalVariableModel);
60-
savedInterrogationIds.add(contextualExternalVariableModel.getInterrogationId());
59+
toSave.add(contextualExternalVariableModel);
60+
savedInterrogationIds.add(contextualExternalVariableModel.getInterrogationId());
6161

62-
if(toSave.size() >= BLOCK_SIZE){
63-
savedCount = saveBlock(toSave, savedCount);
62+
if(toSave.size() >= BLOCK_SIZE){
63+
savedCount = saveBlock(toSave, savedCount);
64+
}
65+
jsonParser.nextToken();
6466
}
65-
jsonParser.nextToken();
67+
contextualExternalVariablePersistancePort.saveAll(toSave);
68+
savedCount += toSave.size();
69+
log.info("Reached end of contextual external file, saved %d interrogations".formatted(savedCount));
70+
contextualExternalVariablePersistancePort.deleteBackup(questionnaireId);
71+
return true;
6672
}
67-
contextualExternalVariablePersistancePort.saveAll(toSave);
68-
savedCount += toSave.size();
69-
log.info("Reached end of contextual external file, saved %d interrogations".formatted(savedCount));
70-
contextualExternalVariablePersistancePort.deleteBackup(questionnaireId);
71-
return true;
7273
}catch (JsonParseException jpe){
7374
contextualExternalVariablePersistancePort.restoreBackup(questionnaireId);
7475
throw new GenesisException(400, "JSON Parsing exception : %s".formatted(jpe.toString()));
@@ -78,6 +79,11 @@ public boolean readContextualExternalFile(InputStream inputStream,
7879
}
7980
}
8081

82+
@Override
83+
public ContextualExternalVariableModel findByQuestionnaireIdAndInterrogationId(String questionnaireId, String interrogationId) {
84+
return contextualExternalVariablePersistancePort.findByQuestionnaireIdAndInterrogationId(questionnaireId, interrogationId);
85+
}
86+
8187
private static void goToContextualExternalToken(JsonParser jsonParser) throws IOException{
8288
boolean isTokenFound = false;
8389
while (!isTokenFound){

0 commit comments

Comments
 (0)