From 13e397ba1c67faf9aa94083edcc616ee29aa039d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9o=20Manelphe?= Date: Tue, 7 Nov 2023 14:49:02 +0100 Subject: [PATCH] wip: fileIdCard refactor controle --- .../service/p3normage/bo/TypeNormage.java | 65 ++++++++--------- .../p4controle/bo/ControleTypeCode.java | 58 +++++++++------ .../service/p4controle/bo/RegleControle.java | 16 ++++- .../p4controle/dao/ControleRegleDao.java | 64 ++++++++--------- .../operation/ControleRulesOperation.java | 1 + .../operation/ServiceJeuDeRegleOperation.java | 72 ++++++++----------- .../thread/ThreadControleService.java | 21 +++--- .../p4controle/bo/ControleTypeCodeTest.java | 23 ++++++ .../operation/ControleRulesOperationTest.java | 1 + .../ExecuteEngineControleOperation.java | 13 ++-- 10 files changed, 182 insertions(+), 152 deletions(-) create mode 100644 arc-core/src/test/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCodeTest.java diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java index 9cfb27a88..4b57060a5 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p3normage/bo/TypeNormage.java @@ -8,43 +8,34 @@ import fr.insee.arc.utils.exception.ArcExceptionMessage; public enum TypeNormage { - RELATION("relation"), - CARTESIAN("cartesian"), - UNICITE("unicité"), - PARTITION("partition"), - INDEPENDANCE("independance"), - BLOC_INDEPENDANCE("bloc_independance"), - DELETION("deletion"), - DUPLICATION("duplication") - ; - + RELATION("relation"), CARTESIAN("cartesian"), UNICITE("unicité"), PARTITION("partition"), + INDEPENDANCE("independance"), BLOC_INDEPENDANCE("bloc_independance"), DELETION("deletion"), + DUPLICATION("duplication"); + private String nom; - private TypeNormage(String nom) { - this.nom = nom; - } - - public String getNom() { - return nom; - } - - public void setNom(String nom) { - this.nom = nom; - } - - - public static TypeNormage getEnum(String code) throws ArcException { - - List filtered = Arrays.asList(TypeNormage.values()).stream().filter(t -> t.getNom().equals(code)).collect(Collectors.toList()); - - if (filtered.isEmpty()) - { - throw new ArcException(ArcExceptionMessage.NORMAGE_TYPE_NOT_FOUND, code); - } - - return filtered.get(0); - } - - - + private TypeNormage(String nom) { + this.nom = nom; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public static TypeNormage getEnum(String code) throws ArcException { + + List filtered = Arrays.asList(TypeNormage.values()).stream().filter(t -> t.getNom().equals(code)) + .collect(Collectors.toList()); + + if (filtered.isEmpty()) { + throw new ArcException(ArcExceptionMessage.NORMAGE_TYPE_NOT_FOUND, code); + } + + return filtered.get(0); + } + } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java index 4f48f44e0..cd5189b15 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCode.java @@ -1,34 +1,46 @@ package fr.insee.arc.core.service.p4controle.bo; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + +import fr.insee.arc.utils.exception.ArcException; +import fr.insee.arc.utils.exception.ArcExceptionMessage; + /** - * code des types de controle proposés par ARC + * code des types de controle proposés par ARC + * * @author FY2QEQ * */ public enum ControleTypeCode { - NUM, DATE, ALPHANUM, CARDINALITE, CONDITION, REGEXP, ENUM_BRUTE, ENUM_TABLE; - - public static ControleTypeCode getEnum(String code) { - switch (code) { - case "NUM": - return NUM; - case "DATE": - return DATE; - case "ALPHANUM": - return ALPHANUM; - case "CARDINALITE": - return CARDINALITE; - case "CONDITION": - return CONDITION; - case "REGEXP": - return REGEXP; - case "ENUM_BRUTE": - return ENUM_BRUTE; - case "ENUM_TABLE": - return ENUM_TABLE; - default: - return null; + NUM("NUM"), DATE("DATE"), ALPHANUM("ALPHANUM"), CARDINALITE("CARDINALITE"), CONDITION("CONDITION"), + REGEXP("REGEXP"), ENUM_BRUTE("ENUM_BRUTE"), ENUM_TABLE("ENUM_TABLE"); + + private String nom; + + private ControleTypeCode(String nom) { + this.nom = nom; + } + + public String getNom() { + return nom; + } + + public void setNom(String nom) { + this.nom = nom; + } + + public static ControleTypeCode getEnum(String code) throws ArcException { + + List filtered = Arrays.asList(ControleTypeCode.values()).stream() + .filter(t -> t.getNom().equals(code)).collect(Collectors.toList()); + + if (filtered.isEmpty()) { + throw new ArcException(ArcExceptionMessage.CONTROLE_TYPE_NOT_FOUND, code); } + + return filtered.get(0); } } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java index eb030904b..87a5d5e80 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/bo/RegleControle.java @@ -11,6 +11,7 @@ public class RegleControle { private String condition; private String preAction; // aka prétraitement SQL + private int idRegle; private int xsdOrdre; private String xsdLabelFils; @@ -20,7 +21,7 @@ public class RegleControle { private String traitementLignesErreur; // aka error_row_processing public RegleControle(ControleTypeCode typeControle, String rubriquePere, String rubriqueFils, String borneInf, - String borneSup, String condition, String preAction, int xsdOrdre, String xsdLabelFils, String xsdRole, + String borneSup, String condition, String preAction, int idRegle, int xsdOrdre, String xsdLabelFils, String xsdRole, String seuilBloquant, String traitementLignesErreur) { super(); this.typeControle = typeControle; @@ -30,6 +31,7 @@ public RegleControle(ControleTypeCode typeControle, String rubriquePere, String this.borneSup = borneSup; this.condition = condition; this.preAction = preAction; + this.idRegle = idRegle; this.xsdOrdre = xsdOrdre; this.xsdLabelFils = xsdLabelFils; this.xsdRole = xsdRole; @@ -37,6 +39,10 @@ public RegleControle(ControleTypeCode typeControle, String rubriquePere, String this.traitementLignesErreur = traitementLignesErreur; } + public RegleControle() { + super(); + } + public ControleTypeCode getTypeControle() { return typeControle; } @@ -93,6 +99,14 @@ public void setPreAction(String preAction) { this.preAction = preAction; } + public int getIdRegle() { + return idRegle; + } + + public void setIdRegle(int idRegle) { + this.idRegle = idRegle; + } + public int getXsdOrdre() { return xsdOrdre; } diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java index 2a7ddd407..ce2ffa358 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/dao/ControleRegleDao.java @@ -12,9 +12,9 @@ import org.apache.logging.log4j.Logger; import org.springframework.stereotype.Component; -import fr.insee.arc.core.service.global.bo.RegleControleEntity; import fr.insee.arc.core.service.p4controle.bo.ControleMarkCode; import fr.insee.arc.core.service.p4controle.bo.ControleXsdCode; +import fr.insee.arc.core.service.p4controle.bo.RegleControle; import fr.insee.arc.core.service.p4controle.bo.XsdDate; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.utils.FormatSQL; @@ -168,12 +168,12 @@ private String insertBloc(String blockingThreshold, String errorRowProcessing, S * @param reg * @return */ - public String ctlIsNumeric(RegleControleEntity reg) { + public String ctlIsNumeric(RegleControle reg) { String cond = conditionLongueur(reg); String requete = "WITH ctl AS ( SELECT id FROM " + this.tableTempData + " " + " WHERE ({2} ~ '^-?\\d*(\\.\\d+)?$') IS FALSE " + cond + ") " - + insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle()); - requete = getRequete(requete, TABLE_TEMP_MARK, reg.getIdRegle(), reg.getRubriquePere()); + + insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle())); + requete = getRequete(requete, TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle()), reg.getRubriquePere()); return requete; } @@ -185,7 +185,7 @@ public String ctlIsNumeric(RegleControleEntity reg) { * * @param reg la règle à appliquer */ - public String ctlIsDate(RegleControleEntity reg) { + public String ctlIsDate(RegleControle reg) { StringBuilder reqBuilder = new StringBuilder("WITH ctl AS (SELECT id FROM " + this.tableTempData + " "); String requete = ""; if (reg.getCondition().equalsIgnoreCase(ControleXsdCode.XSD_DATE_NAME) @@ -202,28 +202,28 @@ public String ctlIsDate(RegleControleEntity reg) { reqBuilder.append(") THEN false "); reqBuilder.append("\n WHEN {2} is null THEN false "); reqBuilder.append("\n ELSE true END) "); - reqBuilder.append(insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle())); - requete = getRequete(reqBuilder.toString(), TABLE_TEMP_MARK, reg.getIdRegle(), reg.getRubriquePere()); + reqBuilder.append(insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle()))); + requete = getRequete(reqBuilder.toString(), TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle()), reg.getRubriquePere()); } else { reqBuilder.append("\n WHERE CASE WHEN arc.isdate({2},'{3}') THEN false"); reqBuilder.append("\n WHEN {2} is null THEN false "); reqBuilder.append("\n ELSE true END) "); - reqBuilder.append(insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle())); - requete = getRequete(reqBuilder.toString(), TABLE_TEMP_MARK, reg.getIdRegle(), reg.getRubriquePere(), + reqBuilder.append(insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle()))); + requete = getRequete(reqBuilder.toString(), TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle()), reg.getRubriquePere(), reg.getCondition()); } return requete; } - public String ctlIsAlphanum(RegleControleEntity reg) { + public String ctlIsAlphanum(RegleControle reg) { String cond = conditionLongueur(reg); String requete = "WITH ctl AS (SELECT id FROM " + this.tableTempData + " WHERE false " + cond + ")" - + insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle()); - requete = getRequete(requete, TABLE_TEMP_MARK, reg.getIdRegle()); + + insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle())); + requete = getRequete(requete, TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle())); return requete; } - public String ctlCardinalite(RegleControleEntity reg, List listRubriqueExpr, + public String ctlCardinalite(RegleControle reg, List listRubriqueExpr, List ListRubriqueTable) { // on retire le pere et le fils de la liste d'expr @@ -306,9 +306,9 @@ public String ctlCardinalite(RegleControleEntity reg, List listRubriqueE requete.append(" SELECT a.id FROM " + this.tableTempData + " a "); requete.append(" INNER JOIN trav ON row(a.{2})::text collate \"C\"=row(trav.{2})::text collate \"C\" "); requete.append(" ) "); - requete.append(insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle())); + requete.append(insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle()))); - return getRequete(requete.toString(), TABLE_TEMP_MARK, reg.getIdRegle(), reg.getRubriquePere(), + return getRequete(requete.toString(), TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle()), reg.getRubriquePere(), reg.getRubriqueFils()); } @@ -320,14 +320,14 @@ public String ctlCardinalite(RegleControleEntity reg, List listRubriqueE * @param mapRubrique * @return */ - public String ctlCondition(RegleControleEntity reg, Map mapRubrique) { + public String ctlCondition(RegleControle reg, Map mapRubrique) { String filtre = writeFiltre(mapRubrique); String cond = rewriteCondition(mapRubrique, reg.getCondition()); String requete = "WITH ctl AS ( select id from (SELECT id, " + " CASE WHEN " + filtre + " THEN CASE WHEN " + cond + " THEN FALSE ELSE TRUE END ELSE FALSE END as condition_a_tester " + " FROM " + this.tableTempData + " " + ") ww where condition_a_tester ) " - + insertBloc(reg.getBlockingThreshold(), reg.getErrorRowProcessing(), reg.getIdRegle()); - requete = getRequete(requete, TABLE_TEMP_MARK, reg.getIdRegle()); + + insertBloc(reg.getSeuilBloquant(), reg.getTraitementLignesErreur(), Integer.toString(reg.getIdRegle())); + requete = getRequete(requete, TABLE_TEMP_MARK, Integer.toString(reg.getIdRegle())); return requete; } @@ -338,10 +338,10 @@ public String ctlCondition(RegleControleEntity reg, Map mapRubrique, String condition0) { + private String rewriteCondition(Map mapRubrique, String condition0) { StaticLoggerDispatcher.debug(logger, "Je rentre dans la méthode rewriteCondition"); // Passage en MAJUSCULE car la map contient des elements en majuscule // bétonnage du code pour que le .uppercase ne lève pas de null pointerException @@ -419,9 +419,9 @@ private String rewriteCondition(Map mapRubrique, St String type = ""; String rubrique = ""; String format = ""; - for (Entry entry : mapRubrique.entrySet()) { + for (Entry entry : mapRubrique.entrySet()) { StaticLoggerDispatcher.debug(logger, "A l'intérieur de la boucle FOR"); - type = entry.getValue().getIdClasse().trim(); + type = entry.getValue().getTypeControle().getNom().trim(); rubrique = entry.getKey().trim(); StaticLoggerDispatcher.debug(logger, "Mon type : " + type + ", ma rubrique : " + rubrique); switch (type) { @@ -454,7 +454,7 @@ private String rewriteCondition(Map mapRubrique, St * @param mapRubrique * @return */ - private String writeFiltre(Map mapRubrique) { + private String writeFiltre(Map mapRubrique) { String filtre = ""; String type = ""; String rubrique = ""; @@ -462,8 +462,8 @@ private String writeFiltre(Map mapRubrique) { int i = 0; - for (Entry entry : mapRubrique.entrySet()) { - type = entry.getValue().getIdClasse().trim(); + for (Entry entry : mapRubrique.entrySet()) { + type = entry.getValue().getTypeControle().getNom().trim(); rubrique = entry.getKey().trim(); format = entry.getValue().getCondition(); @@ -554,7 +554,7 @@ private String getRequete(String req, String... args) { * @param borneSup * @return */ - private String conditionLongueur(RegleControleEntity reg) { + private String conditionLongueur(RegleControle reg) { String cond = ""; String rubrique = reg.getRubriquePere(); String borneInf = reg.getBorneInf(); diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java index 02d26af0f..34938ab72 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperation.java @@ -44,6 +44,7 @@ public static void fillControleRules(Connection connection, String envExecution, regle.get(ColumnEnum.BORNE_SUP.getColumnName()).get(0), regle.get(ColumnEnum.CONDITION.getColumnName()).get(0), regle.get(ColumnEnum.PRE_ACTION.getColumnName()).get(0), + Integer.parseInt(regle.get(ColumnEnum.ID_REGLE.getColumnName()).get(0)), Integer.parseInt(regle.get(ColumnEnum.XSD_ORDRE.getColumnName()).get(0)), regle.get(ColumnEnum.XSD_LABEL_FILS.getColumnName()).get(0), regle.get(ColumnEnum.XSD_ROLE.getColumnName()).get(0), diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java index b9d9b3508..85a4f0d05 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/operation/ServiceJeuDeRegleOperation.java @@ -12,10 +12,9 @@ import org.springframework.stereotype.Component; import fr.insee.arc.core.model.XMLConstant; -import fr.insee.arc.core.service.global.bo.JeuDeRegle; -import fr.insee.arc.core.service.global.bo.RegleControleEntity; -import fr.insee.arc.core.service.global.bo.RegleDao; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.p4controle.bo.ControleTypeCode; +import fr.insee.arc.core.service.p4controle.bo.RegleControle; import fr.insee.arc.core.service.p4controle.dao.ControleRegleDao; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.dao.UtilitaireDao; @@ -39,21 +38,6 @@ public ServiceJeuDeRegleOperation() { this.dao = new ControleRegleDao(); } - /** - * pour remplir un jeu de règle avec les règles y afférant - * - * @param jdr , le jeu de règle à "complèter" - * @param tableRegle , la table des règles de controle - * @param tableIn , la table à controler - * @throws ArcException - */ - public void fillRegleControle(Connection connexion, JeuDeRegle jdr, String tableRegle, String tableIn) - throws ArcException { - StaticLoggerDispatcher.info(LOGGER, "recherche de regle dans la table : " + tableRegle); - List listRegleC = RegleDao.getRegle(connexion, tableRegle, tableIn); - jdr.setListRegleControle(listRegleC); - } - /** * Executer les règles liées à un jeu de règle sur une table donnée * @@ -63,7 +47,7 @@ public void fillRegleControle(Connection connexion, JeuDeRegle jdr, String table * @param table la table de travail dont les enregistrement seront "marqués" * @throws ArcException */ - public void executeJeuDeRegle(Connection connexion, JeuDeRegle jdr, String table) throws ArcException { + public void executeJeuDeRegle(Connection connexion, FileIdCard fileIdCard, String table) throws ArcException { StaticLoggerDispatcher.debug(LOGGER, "executeJeuDeRegle"); java.util.Date date = new java.util.Date(); @@ -72,10 +56,10 @@ public void executeJeuDeRegle(Connection connexion, JeuDeRegle jdr, String table registerRubriquesFromSourceTable(connexion, table); // execute the correction rules (aka "preAction") before the control step - preAction(connexion, jdr, table); + preAction(connexion, fileIdCard, table); // execute the control rules - executeQueryControl(connexion, jdr, table); + executeQueryControl(connexion, fileIdCard, table); StaticLoggerDispatcher.info(LOGGER, "Temps de controle : " + (new java.util.Date().getTime() - date.getTime())); @@ -103,7 +87,7 @@ private void registerRubriquesFromSourceTable(Connection connexion, String table * @param structure * @throws ArcException */ - private void preAction(Connection connexion, JeuDeRegle jdr, String table) throws ArcException { + private void preAction(Connection connexion, FileIdCard fileIdCard, String table) throws ArcException { // exécuter les préactions StaticLoggerDispatcher.info(LOGGER, "Debut Pré-actions"); @@ -115,7 +99,7 @@ private void preAction(Connection connexion, JeuDeRegle jdr, String table) throw * Attention, on suppose que la preaction ne contient qu'une seule rubrique et * en plus celle de la règle */ - for (RegleControleEntity reg : jdr.getListRegleControle()) { + for (RegleControle reg : fileIdCard.getIdCardControle().getReglesControle()) { if (reg.getPreAction() != null && !StringUtils.isEmpty(reg.getPreAction())) { /** * si la rubrique de la preaction n'est pas dans la table, il ne faut rien @@ -145,21 +129,21 @@ private void preAction(Connection connexion, JeuDeRegle jdr, String table) throw * @param structure * @throws ArcException */ - private void executeQueryControl(Connection connexion, JeuDeRegle jdr, String table) throws ArcException { + private void executeQueryControl(Connection connexion, FileIdCard fileIdCard, String table) throws ArcException { StringBuilder blocRequete = new StringBuilder(); blocRequete.append(this.dao.initTemporaryTable(table)); int nbRegles = 0; - int nbTotalRegles = jdr.getListRegleControle().size(); + int nbTotalRegles = fileIdCard.getIdCardControle().getReglesControle().size(); - for (RegleControleEntity reg : jdr.getListRegleControle()) { + for (RegleControle reg : fileIdCard.getIdCardControle().getReglesControle()) { nbRegles++; - reg.setTable(table); + //reg.setTable(table); //inutile? - StaticLoggerDispatcher.info(LOGGER, "n° " + reg.getIdRegle() + " / classe : " + reg.getIdClasse() - + " / commentaire : " + reg.getCommentaire()); - switch (ControleTypeCode.valueOf(reg.getIdClasse())) { + StaticLoggerDispatcher.info(LOGGER, "n° " + reg.getIdRegle() + " / classe : " + reg.getTypeControle() + /*+ " / commentaire : " + reg.getCommentaire()*/); + switch (reg.getTypeControle()) { case NUM: if (regleEstAAppliquer(this.listRubTable, reg)) { blocRequete.append(this.dao.ctlIsNumeric(reg)); @@ -190,7 +174,7 @@ private void executeQueryControl(Connection connexion, JeuDeRegle jdr, String ta } break; case CONDITION: - blocRequete.append(executeRegleCondition(jdr, reg)); + blocRequete.append(executeRegleCondition(fileIdCard, reg)); blocRequete.append(System.lineSeparator()); break; case REGEXP: @@ -231,7 +215,7 @@ private void executeQueryControl(Connection connexion, JeuDeRegle jdr, String ta } /** Vérifie si la règle est à appliquer pour ces rubriques. */ - private boolean regleEstAAppliquer(List listRubriques, RegleControleEntity reg) { + private boolean regleEstAAppliquer(List listRubriques, RegleControle reg) { if (!listRubriques.contains(reg.getRubriquePere())) { StaticLoggerDispatcher.info(LOGGER, "la rubrique : " + reg.getRubriquePere() + " n'existe pas dans ce fichier"); @@ -250,7 +234,7 @@ private boolean regleEstAAppliquer(List listRubriques, RegleControleEnti * @param table * @throws ArcException */ - private String executeRegleCondition(JeuDeRegle jdr, RegleControleEntity reg) { + private String executeRegleCondition(FileIdCard fileIdCard, RegleControle reg) { StaticLoggerDispatcher.info(LOGGER, "Je lance executeRegleCondition()"); String requete = ""; @@ -258,10 +242,10 @@ private String executeRegleCondition(JeuDeRegle jdr, RegleControleEntity reg) { listRubrique.replaceAll(String::toUpperCase); if (this.listRubTable.containsAll(listRubrique)) { - Map mapRubrique = new HashMap<>(); + Map mapRubrique = new HashMap<>(); for (String rub : listRubrique) { StaticLoggerDispatcher.debug(LOGGER, "Je parcours la liste listRubrique sur l'élément : " + rub); - RegleControleEntity regle = findType(jdr, rub); + RegleControle regle = findType(fileIdCard, rub); mapRubrique.put(rub, regle); } StaticLoggerDispatcher.debug(LOGGER, "MapRubrique contient : " + mapRubrique.toString()); @@ -282,7 +266,7 @@ private String executeRegleCondition(JeuDeRegle jdr, RegleControleEntity reg) { * @param table * @throws ArcException */ - private String executeRegleCardinalite(RegleControleEntity reg) { + private String executeRegleCardinalite(RegleControle reg) { StaticLoggerDispatcher.info(LOGGER, "Je lance executeRegleCardinalite()"); String requete = ""; @@ -301,22 +285,22 @@ private String executeRegleCardinalite(RegleControleEntity reg) { * @param rub * @return */ - private RegleControleEntity findType(JeuDeRegle jdr, String rub) { - RegleControleEntity reg = new RegleControleEntity(); + private RegleControle findType(FileIdCard fileIdCard, String rub) { + RegleControle reg = new RegleControle(); boolean isFind = false; StaticLoggerDispatcher.debug(LOGGER, "La rubrique dont on cherche le type : " + rub); String rubriquePere = ""; - String idClasse = ""; - for (RegleControleEntity regC : jdr.getListRegleControle()) { + ControleTypeCode idClasse; + for (RegleControle regC : fileIdCard.getIdCardControle().getReglesControle()) { rubriquePere = regC.getRubriquePere(); - idClasse = regC.getIdClasse(); + idClasse = regC.getTypeControle(); StaticLoggerDispatcher.debug(LOGGER, "La rubrique de la regle testée : " + rubriquePere + " et le type : " + idClasse); if (rub.equals(rubriquePere) - && (idClasse.equals("NUM") || idClasse.equals("DATE") || idClasse.equals("ALPHANUM"))) { + && (idClasse.equals(ControleTypeCode.NUM) || idClasse.equals(ControleTypeCode.DATE) || idClasse.equals(ControleTypeCode.ALPHANUM))) { StaticLoggerDispatcher.debug(LOGGER, "J'ai trouvé une règle de typage"); reg.setIdRegle(regC.getIdRegle()); - reg.setIdClasse(regC.getIdClasse()); + reg.setTypeControle(regC.getTypeControle()); reg.setRubriquePere(rub); reg.setCondition(regC.getCondition()); isFind = true; @@ -324,7 +308,7 @@ private RegleControleEntity findType(JeuDeRegle jdr, String rub) { } } if (!isFind) {// par défaut le type sera considéré comme numérique - reg.setIdClasse("ALPHANUM"); + reg.setTypeControle(ControleTypeCode.ALPHANUM); reg.setRubriquePere(rub); } return reg; diff --git a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java index 20743c85d..d3a052c55 100644 --- a/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java +++ b/arc-core/src/main/java/fr/insee/arc/core/service/p4controle/thread/ThreadControleService.java @@ -5,9 +5,8 @@ import fr.insee.arc.core.dataobjects.ArcPreparedStatementBuilder; import fr.insee.arc.core.dataobjects.ColumnEnum; -import fr.insee.arc.core.dataobjects.ViewEnum; import fr.insee.arc.core.model.TraitementEtat; -import fr.insee.arc.core.service.global.bo.JeuDeRegle; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.global.dao.DatabaseConnexionConfiguration; import fr.insee.arc.core.service.global.dao.GenericQueryDao; import fr.insee.arc.core.service.global.dao.HashFileNameConversion; @@ -22,6 +21,7 @@ import fr.insee.arc.core.service.p4controle.bo.ControleMarkCode; import fr.insee.arc.core.service.p4controle.dao.ControleRegleDao; import fr.insee.arc.core.service.p4controle.dao.ThreadControleQueryBuilder; +import fr.insee.arc.core.service.p4controle.operation.ControleRulesOperation; import fr.insee.arc.core.service.p4controle.operation.ServiceJeuDeRegleOperation; import fr.insee.arc.core.util.StaticLoggerDispatcher; import fr.insee.arc.utils.exception.ArcException; @@ -49,8 +49,8 @@ public class ThreadControleService extends ApiControleService implements Runnabl private String tableOutKo; private ServiceJeuDeRegleOperation sjdr; - - private JeuDeRegle jdr; + + private FileIdCard fileIdCard; private ThreadOperations arcThreadGenericDao; private GenericQueryDao genericExecutorDao; @@ -70,7 +70,6 @@ public void configThread(ScalableConnection connexion, int currentIndice, ApiCon this.paramBatch=theApi.getParamBatch(); this.sjdr = new ServiceJeuDeRegleOperation(); - this.jdr = new JeuDeRegle(); // Nom des tables temporaires this.tableControleDataTemp = FormatSQL.temporaryTableName("controle_data_temp"); @@ -160,12 +159,14 @@ private void preparation() throws ArcException { */ private void execute() throws ArcException { StaticLoggerDispatcher.info(LOGGER, "** execute CONTROLE sur la table : " + this.tableControleDataTemp + " **"); - - // Récupération des Jeux de règles associés - this.sjdr.fillRegleControle(this.connexion.getExecutorConnection(), jdr, ViewEnum.CONTROLE_REGLE.getFullName(envExecution), - this.tableControleDataTemp); - this.sjdr.executeJeuDeRegle(this.connexion.getExecutorConnection(), jdr, this.tableControleDataTemp); + this.fileIdCard = RulesOperations.fileIdCardFromPilotage(this.connexion.getExecutorConnection(), + tableControleDataTemp, this.idSource); + + // Récupération des Jeux de règles associés + ControleRulesOperation.fillControleRules(this.connexion.getExecutorConnection(), tableControleDataTemp, fileIdCard); + + this.sjdr.executeJeuDeRegle(this.connexion.getExecutorConnection(), fileIdCard, this.tableControleDataTemp); } diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCodeTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCodeTest.java new file mode 100644 index 000000000..a47300f81 --- /dev/null +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/bo/ControleTypeCodeTest.java @@ -0,0 +1,23 @@ +package fr.insee.arc.core.service.p4controle.bo; + +import static org.junit.Assert.assertEquals; + +import org.junit.Test; + +import fr.insee.arc.utils.exception.ArcException; + +public class ControleTypeCodeTest { + + + @Test + public void getEnum_test_ok() throws ArcException { + + assertEquals(ControleTypeCode.NUM, ControleTypeCode.getEnum("NUM")); + } + + @Test(expected = ArcException.class) + public void getEnum_test_ko() throws ArcException { + ControleTypeCode.getEnum("type de chargement inexistant"); + } + +} diff --git a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java index c5d32a610..f173b60d9 100644 --- a/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java +++ b/arc-core/src/test/java/fr/insee/arc/core/service/p4controle/operation/ControleRulesOperationTest.java @@ -76,6 +76,7 @@ public void fillControleRulesTest() throws ArcException { assertEquals("3", regleControle.getBorneSup()); assertEquals("requete", regleControle.getCondition()); assertEquals("pretraitement", regleControle.getPreAction()); + assertEquals(1, regleControle.getIdRegle()); assertEquals(1, regleControle.getXsdOrdre()); assertEquals("xsd1", regleControle.getXsdLabelFils()); assertEquals("xsd2", regleControle.getXsdRole()); diff --git a/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineControleOperation.java b/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineControleOperation.java index ce9db9df1..25f7ec2ae 100644 --- a/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineControleOperation.java +++ b/arc-ws/src/main/java/fr/insee/arc/ws/services/restServices/execute/operation/ExecuteEngineControleOperation.java @@ -2,9 +2,10 @@ import java.io.IOException; -import fr.insee.arc.core.dataobjects.ViewEnum; -import fr.insee.arc.core.service.global.bo.JeuDeRegle; +import fr.insee.arc.core.service.global.bo.FileIdCard; import fr.insee.arc.core.service.global.bo.Sandbox; +import fr.insee.arc.core.service.global.dao.RulesOperations; +import fr.insee.arc.core.service.p4controle.operation.ControleRulesOperation; import fr.insee.arc.core.service.p4controle.operation.ServiceJeuDeRegleOperation; import fr.insee.arc.utils.exception.ArcException; import fr.insee.arc.utils.utils.FormatSQL; @@ -40,10 +41,12 @@ public PhaseInterface execute() throws IOException, ArcException ServiceJeuDeRegleOperation sjdr = new ServiceJeuDeRegleOperation(); // Récupération des règles de controles associées aux jeux de règle - JeuDeRegle jdr = new JeuDeRegle(); + FileIdCard fileIdCard = RulesOperations.fileIdCardFromPilotage(this.sandbox.getConnection(), + phaseInterface.getOutputTable(), this.bodyPojo.getFileName()); + + ControleRulesOperation.fillControleRules(this.sandbox.getConnection(), phaseInterface.getOutputTable(), fileIdCard); - sjdr.fillRegleControle(this.sandbox.getConnection(), jdr, ViewEnum.CONTROLE_REGLE.getFullName(this.sandbox.getSchema()), phaseInterface.getOutputTable()); - sjdr.executeJeuDeRegle(this.sandbox.getConnection(), jdr, phaseInterface.getOutputTable()); + sjdr.executeJeuDeRegle(this.sandbox.getConnection(), fileIdCard, phaseInterface.getOutputTable()); PhaseInterface returnInterface = new PhaseInterface();