diff --git a/src/main/java/fr/insee/genesis/controller/rest/HealthCheckController.java b/src/main/java/fr/insee/genesis/controller/rest/HealthCheckController.java index 98903910..8723e819 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/HealthCheckController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/HealthCheckController.java @@ -2,7 +2,6 @@ import fr.insee.genesis.domain.ports.api.ScheduleApiPort; import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.ResponseEntity; import org.springframework.security.core.context.SecurityContextHolder; @@ -18,7 +17,7 @@ public class HealthCheckController { @Value("${fr.insee.genesis.version}") private String projectVersion; - @Autowired + public HealthCheckController(SurveyUnitApiPort surveyUnitApiPort, ScheduleApiPort scheduleApiPort) { this.surveyUnitApiPort = surveyUnitApiPort; this.scheduleApiPort = scheduleApiPort; diff --git a/src/main/java/fr/insee/genesis/controller/rest/ScheduleController.java b/src/main/java/fr/insee/genesis/controller/rest/ScheduleController.java index d36effc2..a8d596f7 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/ScheduleController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/ScheduleController.java @@ -14,7 +14,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.Parameter; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.DeleteMapping; @@ -42,7 +41,6 @@ public class ScheduleController { private final ScheduleApiPort scheduleApiPort; private final FileUtils fileUtils; - @Autowired public ScheduleController(ScheduleApiPort scheduleApiPort, FileUtils fileUtils) { this.scheduleApiPort = scheduleApiPort; this.fileUtils = fileUtils; diff --git a/src/main/java/fr/insee/genesis/controller/rest/UtilsController.java b/src/main/java/fr/insee/genesis/controller/rest/UtilsController.java index c7d8683f..e238ba4e 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/UtilsController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/UtilsController.java @@ -6,7 +6,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PutMapping; @@ -25,7 +24,7 @@ public class UtilsController { private final SurveyUnitApiPort surveyUnitService; - @Autowired + public UtilsController(SurveyUnitApiPort surveyUnitService,VolumetryLogService volumetryLogService) { this.surveyUnitService = surveyUnitService; this.volumetryLogService = volumetryLogService; diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/CampaignController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/CampaignController.java index 08998118..1e3135c4 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/CampaignController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/CampaignController.java @@ -4,7 +4,6 @@ import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +19,7 @@ public class CampaignController { private final SurveyUnitApiPort surveyUnitService; - @Autowired + public CampaignController(SurveyUnitApiPort surveyUnitService) { this.surveyUnitService = surveyUnitService; } diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/IdUEController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/IdUEController.java index fb8be06a..b47df612 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/IdUEController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/IdUEController.java @@ -4,7 +4,6 @@ import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +19,7 @@ public class IdUEController { private final SurveyUnitApiPort surveyUnitService; - @Autowired + public IdUEController(SurveyUnitApiPort surveyUnitService) { this.surveyUnitService = surveyUnitService; } diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/ModeController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/ModeController.java index ca183e0f..320af308 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/ModeController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/ModeController.java @@ -4,7 +4,6 @@ import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -20,7 +19,7 @@ public class ModeController { private final SurveyUnitApiPort surveyUnitService; - @Autowired + public ModeController(SurveyUnitApiPort surveyUnitService) { this.surveyUnitService = surveyUnitService; diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java index d7a60619..ad8303c4 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/QuestionnaireController.java @@ -4,7 +4,6 @@ import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; import io.swagger.v3.oas.annotations.Operation; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; @@ -21,7 +20,7 @@ public class QuestionnaireController { private final SurveyUnitApiPort surveyUnitService; - @Autowired + public QuestionnaireController(SurveyUnitApiPort surveyUnitService) { this.surveyUnitService = surveyUnitService; } diff --git a/src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java b/src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java index 98f8ba93..baac0b59 100644 --- a/src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java +++ b/src/main/java/fr/insee/genesis/controller/rest/responses/ResponseController.java @@ -1,5 +1,6 @@ package fr.insee.genesis.controller.rest.responses; +import com.fasterxml.jackson.core.JsonProcessingException; import fr.insee.bpm.exceptions.MetadataParserException; import fr.insee.bpm.metadata.model.VariablesMap; import fr.insee.bpm.metadata.reader.ddi.DDIReader; @@ -18,6 +19,8 @@ import fr.insee.genesis.domain.model.surveyunit.Mode; import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel; import fr.insee.genesis.domain.model.surveyunit.Variable; +import fr.insee.genesis.domain.ports.api.LunaticJsonRawDataApiPort; +import fr.insee.genesis.domain.ports.api.LunaticXmlRawDataApiPort; import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; import fr.insee.genesis.domain.service.surveyunit.SurveyUnitQualityService; import fr.insee.genesis.exceptions.GenesisError; @@ -27,7 +30,6 @@ import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; @@ -62,15 +64,27 @@ public class ResponseController { private static final String DDI_REGEX = "ddi[\\w,\\s-]+\\.xml"; public static final String S_S = "%s/%s"; + private static final String CAMPAIGN_ERROR = "Error for campaign {}: {}"; + private static final String SUCCESS_MESSAGE = "Data saved"; + private static final String SUCCESS_NO_DATA_MESSAGE = "No data has been saved"; private final SurveyUnitApiPort surveyUnitService; private final SurveyUnitQualityService surveyUnitQualityService; + private final LunaticXmlRawDataApiPort lunaticXmlRawDataApiPort; + private final LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort; private final FileUtils fileUtils; private final ControllerUtils controllerUtils; - @Autowired - public ResponseController(SurveyUnitApiPort surveyUnitService, SurveyUnitQualityService surveyUnitQualityService, FileUtils fileUtils, ControllerUtils controllerUtils) { + + public ResponseController(SurveyUnitApiPort surveyUnitService, + SurveyUnitQualityService surveyUnitQualityService, + LunaticXmlRawDataApiPort lunaticXmlRawDataApiPort, + LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort, + FileUtils fileUtils, + ControllerUtils controllerUtils) { this.surveyUnitService = surveyUnitService; this.surveyUnitQualityService = surveyUnitQualityService; + this.lunaticXmlRawDataApiPort = lunaticXmlRawDataApiPort; + this.lunaticJsonRawDataApiPort = lunaticJsonRawDataApiPort; this.fileUtils = fileUtils; this.controllerUtils = controllerUtils; } @@ -105,10 +119,9 @@ public ResponseEntity saveResponsesFromXmlFile(@RequestParam("pathLunati Path filepath = Paths.get(xmlFile); if (filepath.toFile().length() / 1024 / 1024 <= Constants.MAX_FILE_SIZE_UNTIL_SEQUENTIAL) { - return treatXmlFileWithMemory(filepath, modeSpecified, variablesMap); - } else { - return treatXmlFileSequentially(filepath, modeSpecified, variablesMap); + return processXmlFileWithMemory(filepath, modeSpecified, variablesMap); } + return processXmlFileSequentially(filepath, modeSpecified, variablesMap); } @Operation(summary = "Save multiple files to Genesis Database from the campaign root folder") @@ -120,29 +133,85 @@ public ResponseEntity saveResponsesFromXmlCampaignFolder(@RequestParam(" List errors = new ArrayList<>(); boolean isAnyDataSaved = false; - log.info("Try to import XML data for campaign : {}", campaignName); + log.info("Try to import XML data for campaign: {}", campaignName); List modesList = controllerUtils.getModesList(campaignName, modeSpecified); for (Mode currentMode : modesList) { try { - treatCampaignWithMode(campaignName, currentMode, errors, null, withDDI); + processCampaignWithMode(campaignName, currentMode, errors, null, withDDI); isAnyDataSaved = true; }catch (NoDataException nde){ //Don't stop if NoDataError thrown log.warn(nde.getMessage()); }catch (Exception e){ - log.error("Error for campaign {} : {}", campaignName, e.toString()); + log.error(CAMPAIGN_ERROR, campaignName, e.toString()); return ResponseEntity.status(500).body(e.getMessage()); } } if (errors.isEmpty()){ - return ResponseEntity.ok(isAnyDataSaved ? "Data saved" : "No data has been saved"); - }else{ - return ResponseEntity.internalServerError().body(errors.getFirst().getMessage()); + return ResponseEntity.ok(getSuccessMessage(isAnyDataSaved)); + } + return ResponseEntity.internalServerError().body(errors.getFirst().getMessage()); + } + + @Operation(summary = "Save one file of raw responses to Genesis Database, passing its path as a parameter") + @PutMapping(path = "/lunatic-xml/raw/save-one") + public ResponseEntity saveRawResponsesFromXmlFile(@RequestParam("pathLunaticXml") String xmlFile, + @RequestParam(value = "mode") Mode modeSpecified + )throws Exception { + log.info(String.format("Try to read Xml file : %s", xmlFile)); + Path filepath = Paths.get(xmlFile); + + return processRawXmlFile(filepath, modeSpecified); + } + + @Operation(summary = "Save multiple raw files to Genesis Database from the campaign root folder") + @PutMapping(path = "/lunatic-xml/raw/save-folder") + public ResponseEntity saveRawResponsesFromXmlCampaignFolder(@RequestParam("campaignName") String campaignName, + @RequestParam(value = "mode", required = false) Mode modeSpecified + )throws Exception { + boolean isAnyDataSaved = false; + + log.info("Try to import raw lunatic XML data for campaign: {}", campaignName); + + List modesList = controllerUtils.getModesList(campaignName, modeSpecified); + for (Mode currentMode : modesList) { + try { + processRawCampaignWithMode(campaignName, currentMode, null); + isAnyDataSaved = true; + }catch (NoDataException nde){ + //Don't stop if NoDataError thrown + log.warn(nde.getMessage()); + }catch (Exception e){ + log.error(CAMPAIGN_ERROR, campaignName, e.toString()); + return ResponseEntity.status(500).body(e.getMessage()); + } } + + return ResponseEntity.ok(getSuccessMessage(isAnyDataSaved)); } + //JSON + @Operation(summary = "Save lunatic json data to Genesis Database from the campaign root folder") + @PutMapping(path = "/lunatic-json/raw/save") + public ResponseEntity saveRawResponsesFromJsonBody( + @RequestParam("campaignName") String campaignName, + @RequestParam(value = "mode", required = false) Mode modeSpecified, + @RequestBody String dataJson + ) { + log.info("Try to import raw lunatic JSON data for campaign: {}", campaignName); + try { + lunaticJsonRawDataApiPort.saveData(campaignName, dataJson, modeSpecified); + }catch (JsonProcessingException jpe){ + log.error(jpe.toString()); + return ResponseEntity.badRequest().body("Invalid JSON synthax"); + } + log.info("Data saved for {}", campaignName); + return ResponseEntity.ok(SUCCESS_MESSAGE); + } + + //SAVE ALL @Operation(summary = "Save all files to Genesis Database (differential data folder only), regardless of the campaign") @PutMapping(path = "/lunatic-xml/save-all-campaigns") @@ -156,26 +225,25 @@ public ResponseEntity saveResponsesFromAllCampaignFolders(){ for (File campaignFolder: campaignFolders) { String campaignName = campaignFolder.getName(); - log.info("Try to import data for campaign : {}", campaignName); + log.info("Try to import data for campaign: {}", campaignName); try { List modesList = controllerUtils.getModesList(campaignName, null); //modeSpecified null = all modes for (Mode currentMode : modesList) { - treatCampaignWithMode(campaignName, currentMode, errors, Constants.DIFFRENTIAL_DATA_FOLDER_NAME); + processCampaignWithMode(campaignName, currentMode, errors, Constants.DIFFRENTIAL_DATA_FOLDER_NAME); } }catch (NoDataException nde){ log.warn(nde.getMessage()); } catch (Exception e) { - log.warn("Error for campaign {} : {}", campaignName, e.toString()); + log.warn(CAMPAIGN_ERROR, campaignName, e.toString()); errors.add(new GenesisError(e.getMessage())); } } if (errors.isEmpty()) { - return ResponseEntity.ok("Data saved"); - } else { - return ResponseEntity.status(209).body("Data saved with " + errors.size() + " errors"); + return ResponseEntity.ok(SUCCESS_MESSAGE); } + return ResponseEntity.status(209).body("Data saved with " + errors.size() + " errors"); } @@ -226,7 +294,7 @@ public ResponseEntity findAllResponsesByQuestionnaire(@RequestParam("idQue log.error("Error while writing file", e); return ResponseEntity.internalServerError().body(filepath); } - log.info("End of extraction, responses extracted : {}", idUEsResponses.size()); + log.info("End of extraction, responses extracted: {}", idUEsResponses.size()); return ResponseEntity.ok(filepath); } @@ -295,23 +363,23 @@ public ResponseEntity> getLatestForUEList(@RequestPar //Utilities /** - * Checks if DDI is present for a campaign and mode or not and treats it accordingly + * Checks if DDI is present for a campaign and mode or not and processes it accordingly * @param campaignName name of campaign * @param currentMode mode of collected data * @param errors error list to fill */ - private void treatCampaignWithMode(String campaignName, Mode currentMode, List errors, String rootDataFolder) throws GenesisException, + private void processCampaignWithMode(String campaignName, Mode currentMode, List errors, String rootDataFolder) throws GenesisException, SAXException, XMLStreamException, NoDataException { try { fileUtils.findFile(String.format(S_S, fileUtils.getSpecFolder(campaignName),currentMode), DDI_REGEX); //DDI if DDI file found - treatCampaignWithMode(campaignName, currentMode, errors, rootDataFolder, true); + processCampaignWithMode(campaignName, currentMode, errors, rootDataFolder, true); }catch (RuntimeException re){ //Lunatic if no DDI log.info("No DDI File found for {}, {} mode. Will try to use Lunatic...", campaignName, currentMode.getModeName()); try{ - treatCampaignWithMode(campaignName, currentMode, errors, rootDataFolder, false); + processCampaignWithMode(campaignName, currentMode, errors, rootDataFolder, false); } catch (IOException | ParserConfigurationException e) { throw new GenesisException(500, e.toString()); } @@ -323,17 +391,17 @@ private void treatCampaignWithMode(String campaignName, Mode currentMode, List errors, String rootDataFolder, boolean withDDI) + private void processCampaignWithMode(String campaignName, Mode mode, List errors, String rootDataFolder, boolean withDDI) throws IOException, ParserConfigurationException, SAXException, XMLStreamException, NoDataException { log.info("Try to import data for mode : {}", mode.getModeName()); String dataFolder = rootDataFolder == null ? - fileUtils.getDataFolder(campaignName, mode.getFolder()) + fileUtils.getDataFolder(campaignName, mode.getFolder(), null) : fileUtils.getDataFolder(campaignName, mode.getFolder(), rootDataFolder); List dataFiles = fileUtils.listFiles(dataFolder); log.info("Numbers of files to load in folder {} : {}", dataFolder, dataFiles.size()); @@ -354,22 +422,59 @@ private void treatCampaignWithMode(String campaignName, Mode mode, List response; - if (filepath.toFile().length() / 1024 / 1024 <= Constants.MAX_FILE_SIZE_UNTIL_SEQUENTIAL) { - response = treatXmlFileWithMemory(filepath, mode, variablesMap); - } else { - response = treatXmlFileSequentially(filepath, mode, variablesMap); - } - log.debug("File {} saved", fileName); - if(response.getStatusCode() == HttpStatus.OK){ - fileUtils.moveDataFile(campaignName, mode.getFolder(), filepath); - }else{ - log.error("Error on file {}", fileName); - } + return; + } + //Read file + log.info("Try to read Xml file : {}", fileName); + ResponseEntity response; + if (filepath.toFile().length() / 1024 / 1024 <= Constants.MAX_FILE_SIZE_UNTIL_SEQUENTIAL) { + response = processXmlFileWithMemory(filepath, mode, variablesMap); + } else { + response = processXmlFileSequentially(filepath, mode, variablesMap); + } + log.debug("File {} saved", fileName); + if(response.getStatusCode() == HttpStatus.OK){ + fileUtils.moveDataFile(campaignName, mode.getFolder(), filepath); + return; } + log.error("Error on file {}", fileName); + } + } + + private void processRawCampaignWithMode(String campaignName, + Mode mode, + String rootDataFolder + ) throws IOException, ParserConfigurationException, SAXException, NoDataException { + log.info("Try to import data for mode : {}", mode.getModeName()); + String dataFolder = rootDataFolder == null ? + fileUtils.getDataFolder(campaignName, mode.getFolder(), null) + : fileUtils.getDataFolder(campaignName, mode.getFolder(), rootDataFolder); + List dataFiles = fileUtils.listFiles(dataFolder); + log.info("Numbers of files to load in folder {} : {}", dataFolder, dataFiles.size()); + if (dataFiles.isEmpty()) { + throw new NoDataException("No data file found in folder %s".formatted(dataFolder)); + } + + //For each XML data file + for (String fileName : dataFiles.stream().filter(s -> s.endsWith(".xml")).toList()) { + String filepathString = String.format(S_S, dataFolder, fileName); + Path filepath = Paths.get(filepathString); + //Check if file not in done folder, delete if true + if(isDataFileInDoneFolder(filepath, campaignName, mode.getFolder())){ + log.warn("File {} already exists in DONE folder ! Deleting...", fileName); + Files.deleteIfExists(filepath); + return; + } + //Read file + log.info("Try to read Xml file : {}", fileName); + ResponseEntity response = processRawXmlFile(filepath, mode); + + log.debug("File {} saved", fileName); + if(response.getStatusCode() == HttpStatus.OK){ + fileUtils.moveDataFile(campaignName, mode.getFolder(), filepath); + return; + } + log.error("Error on file {}", fileName); } } @@ -387,17 +492,17 @@ private VariablesMap readMetadatas(String campaignName, Mode mode, List treatXmlFileWithMemory(Path filepath, Mode modeSpecified, VariablesMap variablesMap) throws IOException, ParserConfigurationException, SAXException { + private ResponseEntity processXmlFileWithMemory(Path filepath, Mode modeSpecified, VariablesMap variablesMap) throws IOException, ParserConfigurationException, SAXException { LunaticXmlCampaign campaign; // DOM method LunaticXmlDataParser parser = new LunaticXmlDataParser(); @@ -427,11 +532,31 @@ private ResponseEntity treatXmlFileWithMemory(Path filepath, Mode modeSp surveyUnitService.saveSurveyUnits(suDtos); log.debug("Survey units updates saved"); - log.info("File {} treated with {} survey units", filepath.getFileName(), suDtos.size()); + log.info("File {} processed with {} survey units", filepath.getFileName(), suDtos.size()); + return ResponseEntity.ok().build(); + } + + private ResponseEntity processRawXmlFile(Path filepath, Mode modeSpecified) throws IOException, + ParserConfigurationException, SAXException { + LunaticXmlCampaign campaign; + // DOM method + LunaticXmlDataParser parser = new LunaticXmlDataParser(); + try { + campaign = parser.parseDataFile(filepath); + } catch (GenesisException e) { + log.error(e.toString()); + return ResponseEntity.status(e.getStatus()).body(e.getMessage()); + } + + log.debug("Begin saving raw xml data file {}", filepath); + lunaticXmlRawDataApiPort.saveData(campaign, modeSpecified); + log.debug(SUCCESS_MESSAGE); + + log.info("File {} processed" , filepath.getFileName()); return ResponseEntity.ok().build(); } - private ResponseEntity treatXmlFileSequentially(Path filepath, Mode modeSpecified, VariablesMap variablesMap) throws IOException, XMLStreamException { + private ResponseEntity processXmlFileSequentially(Path filepath, Mode modeSpecified, VariablesMap variablesMap) throws IOException, XMLStreamException { LunaticXmlCampaign campaign; //Sequential method log.warn("File size > " + Constants.MAX_FILE_SIZE_UNTIL_SEQUENTIAL + "MB! Parsing XML file using sequential method..."); @@ -455,7 +580,11 @@ private ResponseEntity treatXmlFileSequentially(Path filepath, Mode mode log.info("Saved {} survey units updates", suCount); } - log.info("File {} treated", filepath.getFileName()); + log.info("File {} processed", filepath.getFileName()); return ResponseEntity.ok().build(); } + + private static String getSuccessMessage(boolean isAnyDataSaved) { + return isAnyDataSaved ? SUCCESS_MESSAGE : SUCCESS_NO_DATA_MESSAGE; + } } diff --git a/src/main/java/fr/insee/genesis/controller/sources/json/LunaticJsonDataResponse.java b/src/main/java/fr/insee/genesis/controller/sources/json/LunaticJsonDataResponse.java index d45568ad..bf066240 100644 --- a/src/main/java/fr/insee/genesis/controller/sources/json/LunaticJsonDataResponse.java +++ b/src/main/java/fr/insee/genesis/controller/sources/json/LunaticJsonDataResponse.java @@ -9,7 +9,7 @@ public class LunaticJsonDataResponse { @JsonProperty("EXTERNAL") - private LunaticJSonExternalVariables externalVariables; + private LunaticJsonExternalVariables externalVariables; @JsonProperty("COLLECTED") private LunaticJsonCollectedVariables collectedVariables; diff --git a/src/main/java/fr/insee/genesis/controller/sources/json/LunaticJSonExternalVariables.java b/src/main/java/fr/insee/genesis/controller/sources/json/LunaticJsonExternalVariables.java similarity index 89% rename from src/main/java/fr/insee/genesis/controller/sources/json/LunaticJSonExternalVariables.java rename to src/main/java/fr/insee/genesis/controller/sources/json/LunaticJsonExternalVariables.java index b803ba1f..26c2123d 100644 --- a/src/main/java/fr/insee/genesis/controller/sources/json/LunaticJSonExternalVariables.java +++ b/src/main/java/fr/insee/genesis/controller/sources/json/LunaticJsonExternalVariables.java @@ -7,7 +7,7 @@ import java.util.Map; @Data -public class LunaticJSonExternalVariables { +public class LunaticJsonExternalVariables { private Map externalMap = new HashMap<>(); @JsonAnySetter diff --git a/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/LunaticJsonDataModel.java b/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/LunaticJsonDataModel.java new file mode 100644 index 00000000..d7faa038 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/LunaticJsonDataModel.java @@ -0,0 +1,18 @@ +package fr.insee.genesis.domain.model.surveyunit.rawdata; + +import fr.insee.genesis.domain.model.surveyunit.Mode; +import lombok.Builder; +import org.bson.types.ObjectId; + +import java.time.LocalDateTime; + + +@Builder +public record LunaticJsonDataModel( + ObjectId id, + String campaignId, + Mode mode, + String dataJson, + LocalDateTime recordDate, + LocalDateTime processDate +){} diff --git a/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/LunaticXmlDataModel.java b/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/LunaticXmlDataModel.java new file mode 100644 index 00000000..12819049 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/model/surveyunit/rawdata/LunaticXmlDataModel.java @@ -0,0 +1,17 @@ +package fr.insee.genesis.domain.model.surveyunit.rawdata; + +import fr.insee.genesis.controller.sources.xml.LunaticXmlCampaign; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import lombok.Builder; +import org.bson.types.ObjectId; + +import java.time.LocalDateTime; + +@Builder +public record LunaticXmlDataModel( + ObjectId id, + Mode mode, + LunaticXmlCampaign data, + LocalDateTime recordDate, + LocalDateTime processDate +){} diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java new file mode 100644 index 00000000..1180e34f --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/api/LunaticJsonRawDataApiPort.java @@ -0,0 +1,8 @@ +package fr.insee.genesis.domain.ports.api; + +import com.fasterxml.jackson.core.JsonProcessingException; +import fr.insee.genesis.domain.model.surveyunit.Mode; + +public interface LunaticJsonRawDataApiPort { + void saveData(String campaignName, String dataJson, Mode mode) throws JsonProcessingException; +} diff --git a/src/main/java/fr/insee/genesis/domain/ports/api/LunaticXmlRawDataApiPort.java b/src/main/java/fr/insee/genesis/domain/ports/api/LunaticXmlRawDataApiPort.java new file mode 100644 index 00000000..95677a6f --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/api/LunaticXmlRawDataApiPort.java @@ -0,0 +1,8 @@ +package fr.insee.genesis.domain.ports.api; + +import fr.insee.genesis.controller.sources.xml.LunaticXmlCampaign; +import fr.insee.genesis.domain.model.surveyunit.Mode; + +public interface LunaticXmlRawDataApiPort { + void saveData(LunaticXmlCampaign data, Mode mode); +} diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonPersistancePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonPersistancePort.java new file mode 100644 index 00000000..5885ff34 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticJsonPersistancePort.java @@ -0,0 +1,7 @@ +package fr.insee.genesis.domain.ports.spi; + +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonDataModel; + +public interface LunaticJsonPersistancePort { + void save(LunaticJsonDataModel lunaticJsonDataModel); +} diff --git a/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticXmlPersistancePort.java b/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticXmlPersistancePort.java new file mode 100644 index 00000000..1fc6a11c --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/ports/spi/LunaticXmlPersistancePort.java @@ -0,0 +1,9 @@ +package fr.insee.genesis.domain.ports.spi; + +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticXmlDataModel; + +import java.util.List; + +public interface LunaticXmlPersistancePort { + void save(LunaticXmlDataModel lunaticXmlDataModels); +} diff --git a/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java b/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java new file mode 100644 index 00000000..febdf9ce --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataService.java @@ -0,0 +1,53 @@ +package fr.insee.genesis.domain.service.rawdata; + +import com.fasterxml.jackson.core.JacksonException; +import com.fasterxml.jackson.core.JsonParseException; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonDataModel; +import fr.insee.genesis.domain.ports.api.LunaticJsonRawDataApiPort; +import fr.insee.genesis.domain.ports.spi.LunaticJsonPersistancePort; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +@Service +public class LunaticJsonRawDataService implements LunaticJsonRawDataApiPort { + @Qualifier("lunaticJsonMongoAdapter") + private final LunaticJsonPersistancePort lunaticJsonPersistancePort; + + @Autowired + public LunaticJsonRawDataService(LunaticJsonPersistancePort lunaticJsonPersistancePort) { + this.lunaticJsonPersistancePort = lunaticJsonPersistancePort; + } + + @Override + public void saveData(String campaignName, String dataJson, Mode mode) throws JsonParseException { + if(!isJsonValid(dataJson)){ + throw new JsonParseException("Invalid JSON synthax"); + } + LunaticJsonDataModel lunaticJsonDataModel = LunaticJsonDataModel.builder() + .campaignId(campaignName) + .mode(mode) + .dataJson(dataJson) + .recordDate(LocalDateTime.now()) + .build(); + + lunaticJsonPersistancePort.save(lunaticJsonDataModel); + } + + + private boolean isJsonValid(String json) { + ObjectMapper mapper = new ObjectMapper() + .enable(DeserializationFeature.FAIL_ON_TRAILING_TOKENS); + try { + mapper.readTree(json); + } catch (JacksonException e) { + return false; + } + return true; + } +} diff --git a/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticXmlRawDataService.java b/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticXmlRawDataService.java new file mode 100644 index 00000000..a1696737 --- /dev/null +++ b/src/main/java/fr/insee/genesis/domain/service/rawdata/LunaticXmlRawDataService.java @@ -0,0 +1,34 @@ +package fr.insee.genesis.domain.service.rawdata; + +import fr.insee.genesis.controller.sources.xml.LunaticXmlCampaign; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticXmlDataModel; +import fr.insee.genesis.domain.ports.api.LunaticXmlRawDataApiPort; +import fr.insee.genesis.domain.ports.spi.LunaticXmlPersistancePort; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import java.time.LocalDateTime; + +@Service +public class LunaticXmlRawDataService implements LunaticXmlRawDataApiPort { + @Qualifier("lunaticXmlMongoAdapter") + private final LunaticXmlPersistancePort lunaticXmlPersistancePort; + + @Autowired + public LunaticXmlRawDataService(LunaticXmlPersistancePort lunaticXmlPersistancePort) { + this.lunaticXmlPersistancePort = lunaticXmlPersistancePort; + } + + @Override + public void saveData(LunaticXmlCampaign campaign, Mode mode) { + LunaticXmlDataModel lunaticXmlDataModel = LunaticXmlDataModel.builder() + .mode(mode) + .data(campaign) + .recordDate(LocalDateTime.now()) + .build(); + + lunaticXmlPersistancePort.save(lunaticXmlDataModel); + } +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonMongoAdapter.java new file mode 100644 index 00000000..29e1f893 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticJsonMongoAdapter.java @@ -0,0 +1,31 @@ +package fr.insee.genesis.infrastructure.adapter; + +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonDataModel; +import fr.insee.genesis.domain.ports.spi.LunaticJsonPersistancePort; +import fr.insee.genesis.infrastructure.document.rawdata.LunaticJsonDataDocument; +import fr.insee.genesis.infrastructure.mappers.LunaticJsonDocumentMapper; +import fr.insee.genesis.infrastructure.repository.LunaticJsonMongoDBRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@Qualifier("lunaticJsonMongoAdapter") +public class LunaticJsonMongoAdapter implements LunaticJsonPersistancePort { + + private final LunaticJsonMongoDBRepository lunaticJsonMongoDBRepository; + + @Autowired + public LunaticJsonMongoAdapter(LunaticJsonMongoDBRepository lunaticJsonMongoDBRepository) { + this.lunaticJsonMongoDBRepository = lunaticJsonMongoDBRepository; + } + + @Override + public void save(LunaticJsonDataModel lunaticJsonDataModel) { + LunaticJsonDataDocument document = LunaticJsonDocumentMapper.INSTANCE + .modelToDocument(lunaticJsonDataModel); + lunaticJsonMongoDBRepository.insert(document); + } +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticXmlMongoAdapter.java b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticXmlMongoAdapter.java new file mode 100644 index 00000000..14c02073 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/adapter/LunaticXmlMongoAdapter.java @@ -0,0 +1,32 @@ +package fr.insee.genesis.infrastructure.adapter; + +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticXmlDataModel; +import fr.insee.genesis.domain.ports.spi.LunaticXmlPersistancePort; +import fr.insee.genesis.infrastructure.document.rawdata.LunaticXmlDataDocument; +import fr.insee.genesis.infrastructure.mappers.LunaticXmlDocumentMapper; +import fr.insee.genesis.infrastructure.repository.LunaticXmlMongoDBRepository; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.data.mongodb.core.MongoTemplate; +import org.springframework.stereotype.Service; + +@Slf4j +@Service +@Qualifier("lunaticXmlMongoAdapter") +public class LunaticXmlMongoAdapter implements LunaticXmlPersistancePort { + + private final LunaticXmlMongoDBRepository mongoRepository; + + @Autowired + public LunaticXmlMongoAdapter(LunaticXmlMongoDBRepository mongoRepository) { + this.mongoRepository = mongoRepository; + } + + @Override + public void save(LunaticXmlDataModel lunaticXmlDataModel) { + LunaticXmlDataDocument document = LunaticXmlDocumentMapper.INSTANCE + .modelToDocument(lunaticXmlDataModel); + mongoRepository.insert(document); + } +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/LunaticJsonDataDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/LunaticJsonDataDocument.java new file mode 100644 index 00000000..e063fbb4 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/LunaticJsonDataDocument.java @@ -0,0 +1,26 @@ +package fr.insee.genesis.infrastructure.document.rawdata; + +import fr.insee.genesis.domain.model.surveyunit.Mode; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.bson.types.ObjectId; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.time.LocalDateTime; +import java.util.Map; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Document(collection = "lunaticjsondata") +public class LunaticJsonDataDocument { + @Id + private ObjectId id; + private String campaignId; + private Mode mode; + private Map data; + private LocalDateTime recordDate; + private LocalDateTime processDate; +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/LunaticXmlDataDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/LunaticXmlDataDocument.java new file mode 100644 index 00000000..7ea6b29c --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/document/rawdata/LunaticXmlDataDocument.java @@ -0,0 +1,25 @@ +package fr.insee.genesis.infrastructure.document.rawdata; + +import fr.insee.genesis.controller.sources.xml.LunaticXmlCampaign; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.bson.types.ObjectId; +import org.springframework.data.annotation.Id; +import org.springframework.data.mongodb.core.mapping.Document; + +import java.time.LocalDateTime; + +@Data +@NoArgsConstructor +@AllArgsConstructor +@Document(collection = "lunaticxmldata") +public class LunaticXmlDataDocument { + @Id + private ObjectId id; + private LunaticXmlCampaign lunaticXmlData; + private Mode mode; + private LocalDateTime recordDate; + private LocalDateTime processDate; +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/schedule/ScheduleDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/schedule/ScheduleDocument.java index e93a7d6e..4843f679 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/document/schedule/ScheduleDocument.java +++ b/src/main/java/fr/insee/genesis/infrastructure/document/schedule/ScheduleDocument.java @@ -1,5 +1,6 @@ package fr.insee.genesis.infrastructure.document.schedule; +import fr.insee.genesis.Constants; import fr.insee.genesis.domain.model.schedule.KraftwerkExecutionSchedule; import lombok.AllArgsConstructor; import lombok.Data; @@ -14,7 +15,7 @@ @Data @NoArgsConstructor @AllArgsConstructor -@Document(collection = "schedules") +@Document(collection = Constants.MONGODB_SCHEDULE_COLLECTION_NAME) public class ScheduleDocument { public ScheduleDocument(String surveyName, List kraftwerkExecutionScheduleList) { diff --git a/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java b/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java index 49e8a7f1..1589c5cf 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java +++ b/src/main/java/fr/insee/genesis/infrastructure/document/surveyunit/SurveyUnitDocument.java @@ -1,5 +1,6 @@ package fr.insee.genesis.infrastructure.document.surveyunit; +import fr.insee.genesis.Constants; import lombok.Data; import org.springframework.data.mongodb.core.mapping.Document; @@ -7,7 +8,7 @@ import java.util.List; @Data -@Document(collection = "responses") +@Document(collection = Constants.MONGODB_RESPONSE_COLLECTION_NAME) public class SurveyUnitDocument { private String idCampaign; private String idUE; diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticJsonDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticJsonDocumentMapper.java new file mode 100644 index 00000000..1600c013 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticJsonDocumentMapper.java @@ -0,0 +1,42 @@ +package fr.insee.genesis.infrastructure.mappers; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonDataModel; +import fr.insee.genesis.infrastructure.document.rawdata.LunaticJsonDataDocument; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.Named; +import org.mapstruct.factory.Mappers; + +import java.util.List; +import java.util.Map; + +@Mapper(componentModel = "spring") +public interface LunaticJsonDocumentMapper { + LunaticJsonDocumentMapper INSTANCE = Mappers.getMapper(LunaticJsonDocumentMapper.class); + + @Mapping(source = "data", target = "dataJson", qualifiedByName = "fromMapToJson") + LunaticJsonDataModel documentToModel(LunaticJsonDataDocument lunaticJsonDataDocument); + + @Mapping(source = "dataJson", target = "data", qualifiedByName = "fromJsonToMap") + LunaticJsonDataDocument modelToDocument(LunaticJsonDataModel lunaticJsonDataModel); + + List listDocumentToListModel(List lunaticJsonDataDocuments); + + List listModelToListDocument(List lunaticJsonDataModels); + + + @Named(value = "fromJsonToMap") + default Map fromJsonToMap(String dataJson) throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.readValue(dataJson, new TypeReference<>(){}); + } + + @Named(value = "fromMapToJson") + default String fromMapToJson(Map dataMap) throws JsonProcessingException { + ObjectMapper objectMapper = new ObjectMapper(); + return objectMapper.writeValueAsString(dataMap); + } +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticXmlDocumentMapper.java b/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticXmlDocumentMapper.java new file mode 100644 index 00000000..77972382 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/mappers/LunaticXmlDocumentMapper.java @@ -0,0 +1,25 @@ +package fr.insee.genesis.infrastructure.mappers; + +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticXmlDataModel; +import fr.insee.genesis.infrastructure.document.rawdata.LunaticXmlDataDocument; +import org.mapstruct.Mapper; +import org.mapstruct.Mapping; +import org.mapstruct.factory.Mappers; + +import java.util.List; + +@Mapper +public interface LunaticXmlDocumentMapper { + LunaticXmlDocumentMapper INSTANCE = Mappers.getMapper(LunaticXmlDocumentMapper.class); + + @Mapping(source = "lunaticXmlData", target = "data") + LunaticXmlDataModel documentToModel(LunaticXmlDataDocument lunaticXmlDataDocument); + + @Mapping(source = "data", target = "lunaticXmlData") + LunaticXmlDataDocument modelToDocument(LunaticXmlDataModel lunaticXmlDataModel); + + List listDocumentToListModel(List lunaticXmlDataDocuments); + + List listModelToListDocument(List lunaticXmlDataModels); + +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java new file mode 100644 index 00000000..a668ad0c --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticJsonMongoDBRepository.java @@ -0,0 +1,9 @@ +package fr.insee.genesis.infrastructure.repository; + +import fr.insee.genesis.infrastructure.document.rawdata.LunaticJsonDataDocument; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface LunaticJsonMongoDBRepository extends MongoRepository { +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticXmlMongoDBRepository.java b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticXmlMongoDBRepository.java new file mode 100644 index 00000000..ecdcc4c5 --- /dev/null +++ b/src/main/java/fr/insee/genesis/infrastructure/repository/LunaticXmlMongoDBRepository.java @@ -0,0 +1,9 @@ +package fr.insee.genesis.infrastructure.repository; + +import fr.insee.genesis.infrastructure.document.rawdata.LunaticXmlDataDocument; +import org.springframework.data.mongodb.repository.MongoRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface LunaticXmlMongoDBRepository extends MongoRepository { +} diff --git a/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java b/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java index 155acc35..010181f4 100644 --- a/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java +++ b/src/main/java/fr/insee/genesis/infrastructure/utils/FileUtils.java @@ -133,16 +133,6 @@ public Path findFile(String directory, String regex) throws IOException { } } - /** - * Get the path of the folder where the data files are stored - * @param campaign name of campaign - * @param dataSource folder of the mode (ENQ, WEB...) - * @return Path of the data folder - */ - public String getDataFolder(String campaign, String dataSource) { - return String.format("%s/%s/%s/%s", dataFolderSource, "IN", dataSource, campaign); - } - /** * Get the path of the folder where the data files are stored * @param campaign name of campaign @@ -151,7 +141,9 @@ public String getDataFolder(String campaign, String dataSource) { * @return Path of the data folder */ public String getDataFolder(String campaign, String dataSource, String rootDataFolder) { - return String.format("%s/%s/%s/%s/%s", dataFolderSource, "IN", dataSource, campaign, rootDataFolder); + return rootDataFolder == null ? + String.format("%s/%s/%s/%s", dataFolderSource, "IN", dataSource, campaign) + : String.format("%s/%s/%s/%s/%s", dataFolderSource, "IN", dataSource, campaign, rootDataFolder); } diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java b/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java index 1da8d11a..77dbdeac 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/ResponseControllerTest.java @@ -9,11 +9,17 @@ import fr.insee.genesis.domain.model.surveyunit.DataState; import fr.insee.genesis.domain.model.surveyunit.Mode; import fr.insee.genesis.domain.model.surveyunit.SurveyUnitModel; +import fr.insee.genesis.domain.ports.api.LunaticJsonRawDataApiPort; +import fr.insee.genesis.domain.ports.api.LunaticXmlRawDataApiPort; import fr.insee.genesis.domain.ports.api.SurveyUnitApiPort; +import fr.insee.genesis.domain.service.rawdata.LunaticJsonRawDataService; +import fr.insee.genesis.domain.service.rawdata.LunaticXmlRawDataService; import fr.insee.genesis.domain.service.surveyunit.SurveyUnitQualityService; import fr.insee.genesis.domain.service.surveyunit.SurveyUnitService; import fr.insee.genesis.infrastructure.utils.FileUtils; import fr.insee.genesis.stubs.ConfigStub; +import fr.insee.genesis.stubs.LunaticJsonPersistanceStub; +import fr.insee.genesis.stubs.LunaticXmlPersistanceStub; import fr.insee.genesis.stubs.SurveyUnitPersistencePortStub; import org.assertj.core.api.Assertions; import org.junit.jupiter.api.BeforeAll; @@ -35,27 +41,37 @@ class ResponseControllerTest { //Given static ResponseController responseControllerStatic; static SurveyUnitPersistencePortStub surveyUnitPersistencePortStub; + static LunaticXmlPersistanceStub lunaticXmlPersistanceStub; + static LunaticJsonPersistanceStub lunaticJsonPersistanceStub; static List surveyUnitIdList; //Constants - static final String defaultIdUE = "TESTIDUE"; - static final String defaultIdQuest = "TESTIDQUESTIONNAIRE"; + static final String DEFAULT_ID_UE = "TESTIDUE"; + static final String DEFAULT_ID_QUEST = "TESTIDQUESTIONNAIRE"; @BeforeAll static void init() { surveyUnitPersistencePortStub = new SurveyUnitPersistencePortStub(); SurveyUnitApiPort surveyUnitApiPort = new SurveyUnitService(surveyUnitPersistencePortStub); + lunaticXmlPersistanceStub = new LunaticXmlPersistanceStub(); + LunaticXmlRawDataApiPort lunaticXmlRawDataApiPort = new LunaticXmlRawDataService(lunaticXmlPersistanceStub); + + lunaticJsonPersistanceStub = new LunaticJsonPersistanceStub(); + LunaticJsonRawDataApiPort lunaticJsonRawDataApiPort = new LunaticJsonRawDataService(lunaticJsonPersistanceStub); + FileUtils fileUtils = new FileUtils(new ConfigStub()); responseControllerStatic = new ResponseController( surveyUnitApiPort , new SurveyUnitQualityService() + , lunaticXmlRawDataApiPort + , lunaticJsonRawDataApiPort , fileUtils , new ControllerUtils(fileUtils) ); surveyUnitIdList = new ArrayList<>(); - surveyUnitIdList.add(new SurveyUnitId(defaultIdUE)); + surveyUnitIdList.add(new SurveyUnitId(DEFAULT_ID_UE)); } @BeforeEach @@ -65,6 +81,8 @@ void reset() throws IOException { //When + Then + + //Survey units @Test void saveResponseFromXMLFileTest() throws Exception { responseControllerStatic.saveResponsesFromXmlFile( @@ -112,6 +130,62 @@ void saveResponsesFromXmlCampaignFolderTest_noData() throws Exception { Assertions.assertThat(surveyUnitPersistencePortStub.getMongoStub()).isEmpty(); } + //Raw data + //xml + @Test + void saveXmlRawDataFromFileTest() throws Exception { + lunaticXmlPersistanceStub.getMongoStub().clear(); + + responseControllerStatic.saveRawResponsesFromXmlFile( + Path.of(TestConstants.TEST_RESOURCES_DIRECTORY, "IN/WEB/SAMPLETEST-PARADATA-v1/reponse-platine/data.complete.validated.STPDv1.20231122164209.xml").toString() + , Mode.WEB + ); + + Assertions.assertThat(lunaticXmlPersistanceStub.getMongoStub()).isNotEmpty(); + Assertions.assertThat(lunaticXmlPersistanceStub.getMongoStub().getFirst().getRecordDate()).isNotNull(); + Assertions.assertThat(lunaticXmlPersistanceStub.getMongoStub().getFirst().getProcessDate()).isNull(); + Assertions.assertThat(lunaticXmlPersistanceStub.getMongoStub().getFirst().getLunaticXmlData()).isNotNull(); + Assertions.assertThat(lunaticXmlPersistanceStub.getMongoStub().getFirst().getLunaticXmlData().getSurveyUnits()).isNotNull().isNotEmpty(); + + + } + + @Test + void saveXmlRawDataFromFolderTest() throws Exception { + lunaticXmlPersistanceStub.getMongoStub().clear(); + + responseControllerStatic.saveRawResponsesFromXmlCampaignFolder( + "SAMPLETEST-PARADATA-v1" + , Mode.WEB + ); + + Assertions.assertThat(lunaticXmlPersistanceStub.getMongoStub()).isNotEmpty(); + } + + //json + @Test + void saveJsonRawDataFromStringTest(){ + lunaticJsonPersistanceStub.getMongoStub().clear(); + String campaignId = "SAMPLETEST-PARADATA-v1"; + + responseControllerStatic.saveRawResponsesFromJsonBody( + campaignId + , Mode.WEB + , "{\"testdata\": \"test\"}" + ); + + Assertions.assertThat(lunaticJsonPersistanceStub.getMongoStub()).isNotEmpty(); + Assertions.assertThat(lunaticJsonPersistanceStub.getMongoStub().getFirst().getCampaignId()).isNotNull().isEqualTo(campaignId); + Assertions.assertThat(lunaticJsonPersistanceStub.getMongoStub().getFirst().getMode()).isEqualTo(Mode.WEB); + Assertions.assertThat(lunaticJsonPersistanceStub.getMongoStub().getFirst().getData().get("testdata")).isNotNull(); + Assertions.assertThat(lunaticJsonPersistanceStub.getMongoStub().getFirst().getData().get("testdata")).isNotNull().isEqualTo("test"); + + Assertions.assertThat(lunaticJsonPersistanceStub.getMongoStub().getFirst().getRecordDate()).isNotNull(); + Assertions.assertThat(lunaticJsonPersistanceStub.getMongoStub().getFirst().getProcessDate()).isNull(); + + } + + //All data @Test void saveResponsesFromAllCampaignFoldersTests(){ surveyUnitPersistencePortStub.getMongoStub().clear(); @@ -120,30 +194,32 @@ void saveResponsesFromAllCampaignFoldersTests(){ Assertions.assertThat(surveyUnitPersistencePortStub.getMongoStub()).isNotEmpty(); } + + //Gets @Test void findResponsesByUEAndQuestionnaireTest() { - ResponseEntity> response = responseControllerStatic.findResponsesByUEAndQuestionnaire(defaultIdUE, defaultIdQuest); + ResponseEntity> response = responseControllerStatic.findResponsesByUEAndQuestionnaire(DEFAULT_ID_UE, DEFAULT_ID_QUEST); Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); Assertions.assertThat(response.getBody()).isNotNull().isNotEmpty(); - Assertions.assertThat(response.getBody().getFirst().getIdUE()).isEqualTo(defaultIdUE); - Assertions.assertThat(response.getBody().getFirst().getIdQuest()).isEqualTo(defaultIdQuest); + Assertions.assertThat(response.getBody().getFirst().getIdUE()).isEqualTo(DEFAULT_ID_UE); + Assertions.assertThat(response.getBody().getFirst().getIdQuest()).isEqualTo(DEFAULT_ID_QUEST); } @Test void findAllResponsesByQuestionnaireTest() { - Path path = Path.of(TestConstants.TEST_RESOURCES_DIRECTORY, "OUT", defaultIdQuest); + Path path = Path.of(TestConstants.TEST_RESOURCES_DIRECTORY, "OUT", DEFAULT_ID_QUEST); File dir = new File(String.valueOf(path)); FileSystemUtils.deleteRecursively(dir); - ResponseEntity response = responseControllerStatic.findAllResponsesByQuestionnaire(defaultIdQuest); + ResponseEntity response = responseControllerStatic.findAllResponsesByQuestionnaire(DEFAULT_ID_QUEST); Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); Assertions.assertThat(response.getBody()).isNotNull(); Assertions.assertThat(Files.exists(path)).isTrue(); - File[] dir_contents = dir.listFiles(); - Assertions.assertThat(dir_contents).hasSize(1); - Assertions.assertThat(dir_contents[0].length()).isPositive().isNotNull(); + File[] dircontents = dir.listFiles(); + Assertions.assertThat(dircontents).hasSize(1); + Assertions.assertThat(dircontents[0].length()).isPositive().isNotNull(); FileSystemUtils.deleteRecursively(dir); dir.deleteOnExit(); } @@ -154,14 +230,14 @@ void getAllResponsesByQuestionnaireTestSequential() throws IOException { surveyUnitPersistencePortStub.getMongoStub().clear(); for (int i = 0; i < Constants.BATCH_SIZE + 2; i++) { - Utils.addAdditionalDtoToMongoStub("TESTIDCAMPAIGN", defaultIdUE + i, + Utils.addAdditionalDtoToMongoStub("TESTIDCAMPAIGN", DEFAULT_ID_UE + i, LocalDateTime.of(2023, 1, 1, 0, 0, 0), LocalDateTime.of(2024, 1, 1, 0, 0, 0), surveyUnitPersistencePortStub); } //When - ResponseEntity response = responseControllerStatic.findAllResponsesByQuestionnaire(defaultIdQuest); + ResponseEntity response = responseControllerStatic.findAllResponsesByQuestionnaire(DEFAULT_ID_QUEST); //Then Assertions.assertThat(response).isNotNull(); @@ -178,32 +254,32 @@ void getAllResponsesByQuestionnaireTestSequential() throws IOException { void getLatestByUETest() { Utils.addAdditionalDtoToMongoStub(surveyUnitPersistencePortStub); - ResponseEntity> response = responseControllerStatic.getLatestByUE(defaultIdUE, defaultIdQuest); + ResponseEntity> response = responseControllerStatic.getLatestByUE(DEFAULT_ID_UE, DEFAULT_ID_QUEST); Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); Assertions.assertThat(response.getBody()).isNotNull().isNotEmpty(); - Assertions.assertThat(response.getBody().getFirst().getIdUE()).isEqualTo(defaultIdUE); - Assertions.assertThat(response.getBody().getFirst().getIdQuest()).isEqualTo(defaultIdQuest); + Assertions.assertThat(response.getBody().getFirst().getIdUE()).isEqualTo(DEFAULT_ID_UE); + Assertions.assertThat(response.getBody().getFirst().getIdQuest()).isEqualTo(DEFAULT_ID_QUEST); Assertions.assertThat(response.getBody().getFirst().getFileDate()).hasMonth(Month.FEBRUARY); } @Test void getLatestByUEOneObjectTest() { - ResponseEntity response = responseControllerStatic.getLatestByUEOneObject(defaultIdUE, defaultIdQuest, Mode.WEB); + ResponseEntity response = responseControllerStatic.getLatestByUEOneObject(DEFAULT_ID_UE, DEFAULT_ID_QUEST, Mode.WEB); Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); Assertions.assertThat(response.getBody()).isNotNull(); - Assertions.assertThat(response.getBody().getIdUE()).isEqualTo(defaultIdUE); - Assertions.assertThat(response.getBody().getIdQuest()).isEqualTo(defaultIdQuest); + Assertions.assertThat(response.getBody().getIdUE()).isEqualTo(DEFAULT_ID_UE); + Assertions.assertThat(response.getBody().getIdQuest()).isEqualTo(DEFAULT_ID_QUEST); } @Test void getLatestForUEListTest() { - ResponseEntity> response = responseControllerStatic.getLatestForUEList(defaultIdQuest, surveyUnitIdList); + ResponseEntity> response = responseControllerStatic.getLatestForUEList(DEFAULT_ID_QUEST, surveyUnitIdList); Assertions.assertThat(response.getStatusCode().is2xxSuccessful()).isTrue(); Assertions.assertThat(response.getBody()).isNotNull().isNotEmpty(); - Assertions.assertThat(response.getBody().getFirst().getIdUE()).isEqualTo(defaultIdUE); + Assertions.assertThat(response.getBody().getFirst().getIdUE()).isEqualTo(DEFAULT_ID_UE); } // Perret tests @@ -241,8 +317,8 @@ void getLatestByStatesSurveyDataTest(){ //WHEN ResponseEntity response = responseControllerStatic.findResponsesByUEAndQuestionnaireLatestStates( - defaultIdUE, - defaultIdQuest + DEFAULT_ID_UE, + DEFAULT_ID_QUEST ); @@ -250,7 +326,7 @@ void getLatestByStatesSurveyDataTest(){ SurveyUnitDto surveyUnitDto = response.getBody(); Assertions.assertThat(surveyUnitDto).isNotNull(); - Assertions.assertThat(surveyUnitDto.getSurveyUnitId()).isEqualTo(defaultIdUE); + Assertions.assertThat(surveyUnitDto.getSurveyUnitId()).isEqualTo(DEFAULT_ID_UE); Assertions.assertThat(surveyUnitDto.getCollectedVariables().getFirst().getVariableName()) .isEqualTo("TESTIDVAR"); diff --git a/src/test/java/fr/insee/genesis/controller/rest/responses/Utils.java b/src/test/java/fr/insee/genesis/controller/rest/responses/Utils.java index 4ea51bd1..424bb4b0 100644 --- a/src/test/java/fr/insee/genesis/controller/rest/responses/Utils.java +++ b/src/test/java/fr/insee/genesis/controller/rest/responses/Utils.java @@ -46,140 +46,123 @@ static void reset(SurveyUnitPersistencePortStub surveyUnitPersistencePortStub) t //Recreate data files //SAMPLETEST-PARADATA-v1 //Root - if (!testResourcesPath + //Partial + Path source = testResourcesPath .resolve("IN") .resolve("WEB") .resolve("SAMPLETEST-PARADATA-v1") - .resolve("data.complete.validated.STPDv1.20231122164209.xml") - .toFile().exists() - ){ - Files.copy( - testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v1") - .resolve("reponse-platine") - .resolve("data.complete.partial.STPDv1.20231122164209.xml") - , testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v1") - .resolve("data.complete.partial.STPDv1.20231122164209.xml") - ); - Files.copy( - testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v1") - .resolve("reponse-platine") - .resolve("data.complete.validated.STPDv1.20231122164209.xml") - , testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v1") - .resolve("data.complete.validated.STPDv1.20231122164209.xml") - ); + .resolve("reponse-platine") + .resolve("data.complete.partial.STPDv1.20231122164209.xml"); + Path dest = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v1") + .resolve("data.complete.partial.STPDv1.20231122164209.xml"); + if (!dest.toFile().exists()) { + Files.copy(source, dest); + } + + //Validated + source = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v1") + .resolve("reponse-platine") + .resolve("data.complete.validated.STPDv1.20231122164209.xml"); + dest = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v1") + .resolve("data.complete.validated.STPDv1.20231122164209.xml"); + if (!dest.toFile().exists()) { + Files.copy(source, dest); } + //Differential data - if (!testResourcesPath + //Partial + source = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v1") + .resolve("reponse-platine") + .resolve("data.complete.partial.STPDv1.20231122164209.xml"); + dest = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v1") + .resolve("differential") + .resolve("data") + .resolve("data.complete.partial.STPDv1.20231122164209.xml"); + if (!dest.toFile().exists()) { + Files.copy(source, dest); + } + + source = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v1") + .resolve("reponse-platine") + .resolve("data.complete.validated.STPDv1.20231122164209.xml"); + dest = testResourcesPath .resolve("IN") .resolve("WEB") .resolve("SAMPLETEST-PARADATA-v1") .resolve("differential") .resolve("data") - .resolve("data.complete.validated.STPDv1.20231122164209.xml") - .toFile().exists() - ) { - Files.copy( - testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v1") - .resolve("reponse-platine") - .resolve("data.complete.partial.STPDv1.20231122164209.xml") - , testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v1") - .resolve("differential") - .resolve("data") - .resolve("data.complete.partial.STPDv1.20231122164209.xml") - ); - Files.copy( - testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v1") - .resolve("reponse-platine") - .resolve("data.complete.validated.STPDv1.20231122164209.xml") - , testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v1") - .resolve("differential") - .resolve("data") - .resolve("data.complete.validated.STPDv1.20231122164209.xml") - ); + .resolve("data.complete.validated.STPDv1.20231122164209.xml"); + if (!dest.toFile().exists()) { + Files.copy(source, dest); } + //SAMPLETEST-PARADATA-v2 - if (!testResourcesPath + //Partial + source = testResourcesPath .resolve("IN") .resolve("WEB") .resolve("SAMPLETEST-PARADATA-v2") - .resolve("data.complete.validated.STPDv2.20231122164209.xml") - .toFile().exists() - ){ - Files.copy( - testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v2") - .resolve("reponse-platine") - .resolve("data.complete.partial.STPDv2.20231122164209.xml") - , testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v2") - .resolve("data.complete.partial.STPDv2.20231122164209.xml") - ); - Files.copy( - testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v2") - .resolve("reponse-platine") - .resolve("data.complete.validated.STPDv2.20231122164209.xml") - , testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-PARADATA-v2") - .resolve("data.complete.validated.STPDv2.20231122164209.xml") - ); + .resolve("reponse-platine") + .resolve("data.complete.partial.STPDv2.20231122164209.xml"); + dest = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v2") + .resolve("data.complete.partial.STPDv2.20231122164209.xml"); + if (!dest.toFile().exists()) { + Files.copy(source, dest); } + + //Validated + source = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v2") + .resolve("reponse-platine") + .resolve("data.complete.validated.STPDv2.20231122164209.xml"); + dest = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-PARADATA-v2") + .resolve("data.complete.validated.STPDv2.20231122164209.xml"); + if (!dest.toFile().exists()) { + Files.copy(source, dest); + } + //SAMPLETEST-NO-COLLECTED - if (!testResourcesPath + source = testResourcesPath + .resolve("IN") + .resolve("WEB") + .resolve("SAMPLETEST-NO-COLLECTED") + .resolve("data_diff_no_collected.xml"); + + dest = testResourcesPath .resolve("IN") .resolve("WEB") .resolve("SAMPLETEST-NO-COLLECTED") .resolve("differential") .resolve("data") - .resolve("data_diff_no_collected.xml") - .toFile().exists() - ){ - Files.copy( - testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-NO-COLLECTED") - .resolve("data_diff_no_collected.xml") - , testResourcesPath - .resolve("IN") - .resolve("WEB") - .resolve("SAMPLETEST-NO-COLLECTED") - .resolve("differential") - .resolve("data") - .resolve("data_diff_no_collected.xml") - ); + .resolve("data_diff_no_collected.xml"); + if (!dest.toFile().exists()) { + Files.copy(source, dest); } } diff --git a/src/test/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataServiceTest.java b/src/test/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataServiceTest.java new file mode 100644 index 00000000..742f4515 --- /dev/null +++ b/src/test/java/fr/insee/genesis/domain/service/rawdata/LunaticJsonRawDataServiceTest.java @@ -0,0 +1,26 @@ +package fr.insee.genesis.domain.service.rawdata; + +import com.fasterxml.jackson.core.JsonParseException; +import fr.insee.genesis.domain.model.surveyunit.Mode; +import fr.insee.genesis.stubs.LunaticJsonPersistanceStub; +import org.assertj.core.api.Assertions; +import org.junit.jupiter.api.Test; + +class LunaticJsonRawDataServiceTest { + LunaticJsonPersistanceStub lunaticJsonPersistanceStub = new LunaticJsonPersistanceStub(); + LunaticJsonRawDataService lunaticJsonRawDataService = new LunaticJsonRawDataService(lunaticJsonPersistanceStub); + + @Test + void saveDataTest_Invalid(){ + lunaticJsonPersistanceStub.getMongoStub().clear(); + String campaignId = "SAMPLETEST-PARADATA-v1"; + + Assertions.assertThatThrownBy(() -> { + lunaticJsonRawDataService.saveData( + campaignId + ,"{\"testdata\": \"ERROR" + , Mode.WEB + ); + }).isInstanceOf(JsonParseException.class); + } +} \ No newline at end of file diff --git a/src/test/java/fr/insee/genesis/infrastructure/utils/FileUtilsTest.java b/src/test/java/fr/insee/genesis/infrastructure/utils/FileUtilsTest.java index ae43e05d..e8392bf2 100644 --- a/src/test/java/fr/insee/genesis/infrastructure/utils/FileUtilsTest.java +++ b/src/test/java/fr/insee/genesis/infrastructure/utils/FileUtilsTest.java @@ -22,7 +22,7 @@ class FileUtilsTest { @Test void getDataFolderTest() { assertEquals(TestConstants.TEST_RESOURCES_DIRECTORY + "/IN/WEB/TEST", - fileUtils.getDataFolder("TEST", "WEB")); + fileUtils.getDataFolder("TEST", "WEB", null)); } @Test diff --git a/src/test/java/fr/insee/genesis/stubs/LunaticJsonPersistanceStub.java b/src/test/java/fr/insee/genesis/stubs/LunaticJsonPersistanceStub.java new file mode 100644 index 00000000..56c32eed --- /dev/null +++ b/src/test/java/fr/insee/genesis/stubs/LunaticJsonPersistanceStub.java @@ -0,0 +1,20 @@ +package fr.insee.genesis.stubs; + +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticJsonDataModel; +import fr.insee.genesis.domain.ports.spi.LunaticJsonPersistancePort; +import fr.insee.genesis.infrastructure.document.rawdata.LunaticJsonDataDocument; +import fr.insee.genesis.infrastructure.mappers.LunaticJsonDocumentMapper; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class LunaticJsonPersistanceStub implements LunaticJsonPersistancePort { + List mongoStub = new ArrayList<>(); + + @Override + public void save(LunaticJsonDataModel lunaticJsonDataModel) { + mongoStub.add(LunaticJsonDocumentMapper.INSTANCE.modelToDocument(lunaticJsonDataModel)); + } +} diff --git a/src/test/java/fr/insee/genesis/stubs/LunaticXmlPersistanceStub.java b/src/test/java/fr/insee/genesis/stubs/LunaticXmlPersistanceStub.java new file mode 100644 index 00000000..15b1296d --- /dev/null +++ b/src/test/java/fr/insee/genesis/stubs/LunaticXmlPersistanceStub.java @@ -0,0 +1,20 @@ +package fr.insee.genesis.stubs; + +import fr.insee.genesis.domain.model.surveyunit.rawdata.LunaticXmlDataModel; +import fr.insee.genesis.domain.ports.spi.LunaticXmlPersistancePort; +import fr.insee.genesis.infrastructure.document.rawdata.LunaticXmlDataDocument; +import fr.insee.genesis.infrastructure.mappers.LunaticXmlDocumentMapper; +import lombok.Getter; + +import java.util.ArrayList; +import java.util.List; + +@Getter +public class LunaticXmlPersistanceStub implements LunaticXmlPersistancePort { + List mongoStub = new ArrayList<>(); + + @Override + public void save(LunaticXmlDataModel lunaticXmlDataModel) { + mongoStub.add(LunaticXmlDocumentMapper.INSTANCE.modelToDocument(lunaticXmlDataModel)); + } +}