From c8c47affc68a06895cb35d1e0792124dac1ff099 Mon Sep 17 00:00:00 2001
From: Brendan Le Ny <bleny@codelutin.com>
Date: Thu, 27 Jan 2022 17:54:36 +0100
Subject: [PATCH 1/5] =?UTF-8?q?Introduit=20un=20type=20param=C3=A8tre=20su?=
 =?UTF-8?q?r=20LineChecker=20pour=20typer=20la=20configuration=20(et=20d?=
 =?UTF-8?q?=C3=A9gager=20Map<String,=20String>)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../checker/CheckerOnOneVariableComponentLineChecker.java     | 2 +-
 src/main/java/fr/inra/oresing/checker/DateLineChecker.java    | 2 +-
 .../fr/inra/oresing/checker/DateLineCheckerConfiguration.java | 4 ++++
 src/main/java/fr/inra/oresing/checker/FloatChecker.java       | 2 +-
 .../fr/inra/oresing/checker/FloatCheckerConfiguration.java    | 4 ++++
 src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java  | 2 +-
 .../inra/oresing/checker/GroovyLineCheckerConfiguration.java  | 4 ++++
 src/main/java/fr/inra/oresing/checker/IntegerChecker.java     | 2 +-
 .../fr/inra/oresing/checker/IntegerCheckerConfiguration.java  | 4 ++++
 src/main/java/fr/inra/oresing/checker/LineChecker.java        | 2 +-
 .../fr/inra/oresing/checker/LineCheckerConfiguration.java     | 4 ++++
 .../java/fr/inra/oresing/checker/ReferenceLineChecker.java    | 2 +-
 .../oresing/checker/ReferenceLineCheckerConfiguration.java    | 4 ++++
 .../fr/inra/oresing/checker/RegularExpressionChecker.java     | 2 +-
 .../checker/RegularExpressionCheckerConfiguration.java        | 4 ++++
 15 files changed, 36 insertions(+), 8 deletions(-)
 create mode 100644 src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
 create mode 100644 src/main/java/fr/inra/oresing/checker/FloatCheckerConfiguration.java
 create mode 100644 src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
 create mode 100644 src/main/java/fr/inra/oresing/checker/IntegerCheckerConfiguration.java
 create mode 100644 src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
 create mode 100644 src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
 create mode 100644 src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java

diff --git a/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java b/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
index 329f4d3d7..f6d14acec 100644
--- a/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
@@ -8,7 +8,7 @@ import fr.inra.oresing.rest.ValidationCheckResult;
 
 import java.util.Map;
 
-public interface CheckerOnOneVariableComponentLineChecker extends LineChecker {
+public interface CheckerOnOneVariableComponentLineChecker<C extends LineCheckerConfiguration> extends LineChecker<C> {
 
     CheckerTarget getTarget();
 
diff --git a/src/main/java/fr/inra/oresing/checker/DateLineChecker.java b/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
index 8160a0a3c..020072c63 100644
--- a/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
@@ -8,7 +8,7 @@ import java.time.format.DateTimeParseException;
 import java.time.temporal.TemporalAccessor;
 import java.util.Map;
 
-public class DateLineChecker implements CheckerOnOneVariableComponentLineChecker {
+public class DateLineChecker implements CheckerOnOneVariableComponentLineChecker<DateLineCheckerConfiguration> {
 
     public static final String PARAM_PATTERN = "pattern";
     public static final String PARAM_DURATION = "duration";
diff --git a/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
new file mode 100644
index 000000000..3959a70c9
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
@@ -0,0 +1,4 @@
+package fr.inra.oresing.checker;
+
+public interface DateLineCheckerConfiguration extends LineCheckerConfiguration {
+}
diff --git a/src/main/java/fr/inra/oresing/checker/FloatChecker.java b/src/main/java/fr/inra/oresing/checker/FloatChecker.java
index 07d6ee26a..a873fa0d5 100644
--- a/src/main/java/fr/inra/oresing/checker/FloatChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/FloatChecker.java
@@ -6,7 +6,7 @@ import fr.inra.oresing.rest.ValidationCheckResult;
 
 import java.util.Map;
 
-public class FloatChecker implements CheckerOnOneVariableComponentLineChecker {
+public class FloatChecker implements CheckerOnOneVariableComponentLineChecker<FloatCheckerConfiguration> {
     private final CheckerTarget target;
     private final Map<String, String> params;
 
diff --git a/src/main/java/fr/inra/oresing/checker/FloatCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/FloatCheckerConfiguration.java
new file mode 100644
index 000000000..352156dd5
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/checker/FloatCheckerConfiguration.java
@@ -0,0 +1,4 @@
+package fr.inra.oresing.checker;
+
+public interface FloatCheckerConfiguration extends LineCheckerConfiguration {
+}
diff --git a/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java b/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
index 6b551b48b..c996591aa 100644
--- a/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
@@ -14,7 +14,7 @@ import fr.inra.oresing.rest.ValidationCheckResult;
 
 import java.util.*;
 
-public class GroovyLineChecker implements LineChecker {
+public class GroovyLineChecker implements LineChecker<GroovyLineCheckerConfiguration> {
 
     public static final String NAME = "GroovyExpression";
 
diff --git a/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
new file mode 100644
index 000000000..d0dacf462
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
@@ -0,0 +1,4 @@
+package fr.inra.oresing.checker;
+
+public interface GroovyLineCheckerConfiguration extends LineCheckerConfiguration {
+}
diff --git a/src/main/java/fr/inra/oresing/checker/IntegerChecker.java b/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
index 32b7ed533..007ca7149 100644
--- a/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
@@ -6,7 +6,7 @@ import fr.inra.oresing.rest.ValidationCheckResult;
 
 import java.util.Map;
 
-public class IntegerChecker implements CheckerOnOneVariableComponentLineChecker {
+public class IntegerChecker implements CheckerOnOneVariableComponentLineChecker<IntegerCheckerConfiguration> {
     private final CheckerTarget target;
     private final Map<String, String> params;
 
diff --git a/src/main/java/fr/inra/oresing/checker/IntegerCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/IntegerCheckerConfiguration.java
new file mode 100644
index 000000000..a70f0a547
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/checker/IntegerCheckerConfiguration.java
@@ -0,0 +1,4 @@
+package fr.inra.oresing.checker;
+
+public interface IntegerCheckerConfiguration extends LineCheckerConfiguration {
+}
diff --git a/src/main/java/fr/inra/oresing/checker/LineChecker.java b/src/main/java/fr/inra/oresing/checker/LineChecker.java
index 06cecbd4c..17e3cde23 100644
--- a/src/main/java/fr/inra/oresing/checker/LineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/LineChecker.java
@@ -5,7 +5,7 @@ import fr.inra.oresing.rest.ValidationCheckResult;
 
 import java.util.Map;
 
-public interface LineChecker {
+public interface LineChecker<C extends LineCheckerConfiguration> {
 
     ValidationCheckResult check(Map<VariableComponentKey, String> values);
     ValidationCheckResult checkReference(Map<String, String> values);
diff --git a/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
new file mode 100644
index 000000000..c25ce6fd4
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
@@ -0,0 +1,4 @@
+package fr.inra.oresing.checker;
+
+public interface LineCheckerConfiguration {
+}
diff --git a/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java b/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
index 617f70054..135e45058 100644
--- a/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
@@ -5,7 +5,7 @@ import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.UUID;
 
-public class ReferenceLineChecker implements CheckerOnOneVariableComponentLineChecker {
+public class ReferenceLineChecker implements CheckerOnOneVariableComponentLineChecker<ReferenceLineCheckerConfiguration> {
 
     public static final String PARAM_REFTYPE = "refType";
     private final String reference;
diff --git a/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
new file mode 100644
index 000000000..4514bc0a9
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
@@ -0,0 +1,4 @@
+package fr.inra.oresing.checker;
+
+public interface ReferenceLineCheckerConfiguration extends LineCheckerConfiguration {
+}
diff --git a/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java b/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
index 057f2e9c4..bd97e2262 100644
--- a/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
@@ -8,7 +8,7 @@ import java.util.Map;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
 
-public class RegularExpressionChecker implements CheckerOnOneVariableComponentLineChecker {
+public class RegularExpressionChecker implements CheckerOnOneVariableComponentLineChecker<RegularExpressionCheckerConfiguration> {
 
     public static final String PARAM_PATTERN = "pattern";
 
diff --git a/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java
new file mode 100644
index 000000000..60d3ec37d
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java
@@ -0,0 +1,4 @@
+package fr.inra.oresing.checker;
+
+public interface RegularExpressionCheckerConfiguration extends LineCheckerConfiguration {
+}
-- 
GitLab


From c8988f5d5b932878aa748f12a6ad997a40632213 Mon Sep 17 00:00:00 2001
From: Brendan Le Ny <bleny@codelutin.com>
Date: Fri, 28 Jan 2022 18:15:16 +0100
Subject: [PATCH 2/5] =?UTF-8?q?=C3=89vite=20de=20d=C3=A9clarer=20Map=20dan?=
 =?UTF-8?q?s=20la=20configuration=20et=20utilise=20bean=20=C3=A0=20la=20pl?=
 =?UTF-8?q?ace=20pour=20le=20typage?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../inra/oresing/checker/CheckerFactory.java  | 67 ++++++++-------
 ...ckerOnOneVariableComponentLineChecker.java |  8 +-
 .../inra/oresing/checker/DateLineChecker.java | 11 ++-
 .../checker/DateLineCheckerConfiguration.java |  4 +
 .../fr/inra/oresing/checker/FloatChecker.java | 13 ++-
 .../oresing/checker/GroovyLineChecker.java    | 86 +++++++++++++++----
 .../GroovyLineCheckerConfiguration.java       | 10 +++
 .../inra/oresing/checker/IntegerChecker.java  | 12 ++-
 .../fr/inra/oresing/checker/LineChecker.java  |  4 +-
 .../checker/LineCheckerConfiguration.java     |  4 +-
 .../oresing/checker/ReferenceLineChecker.java | 12 ++-
 .../ReferenceLineCheckerConfiguration.java    |  1 +
 .../checker/RegularExpressionChecker.java     | 13 ++-
 ...RegularExpressionCheckerConfiguration.java |  2 +
 .../checker/decorators/CheckerDecorator.java  |  4 +-
 .../checker/decorators/CodifyDecorator.java   | 18 ++--
 .../decorators/DecoratorConfiguration.java    |  8 ++
 .../checker/decorators/GroovyDecorator.java   | 22 +++--
 .../checker/decorators/ICheckerDecorator.java |  2 +-
 .../checker/decorators/RequiredDecorator.java |  9 +-
 .../fr/inra/oresing/model/Configuration.java  | 65 ++++++++++++--
 .../oresing/model/LocalDateTimeRange.java     | 16 ++--
 .../rest/ApplicationConfigurationService.java | 45 ++++++----
 .../fr/inra/oresing/rest/OreSiService.java    | 74 +++++++++++++---
 .../checker/GroovyLineCheckerTest.java        | 58 ++++++++++++-
 .../oresing/model/LocalDateTimeRangeTest.java | 42 ++++++++-
 26 files changed, 432 insertions(+), 178 deletions(-)
 create mode 100644 src/main/java/fr/inra/oresing/checker/decorators/DecoratorConfiguration.java

diff --git a/src/main/java/fr/inra/oresing/checker/CheckerFactory.java b/src/main/java/fr/inra/oresing/checker/CheckerFactory.java
index ca8617e0d..cce2221f5 100644
--- a/src/main/java/fr/inra/oresing/checker/CheckerFactory.java
+++ b/src/main/java/fr/inra/oresing/checker/CheckerFactory.java
@@ -24,9 +24,12 @@ import java.util.stream.Stream;
 @Slf4j
 public class CheckerFactory {
 
+    @Deprecated
     public static final String COLUMNS = "columns";
+
+    @Deprecated
     public static final String VARIABLE_COMPONENT_KEY = "variableComponentKey";
-    public static final String REQUIRED = "required";
+
     @Autowired
     private OreSiRepository repository;
 
@@ -85,18 +88,21 @@ public class CheckerFactory {
             CheckerTarget checkerTarget = CheckerTarget.getInstance(variableComponentKey, app, repository.getRepository(app));
             if ("Reference".equals(checkerDescription.getName())) {
                 variableComponentChecker = getCheckerOnReferenceChecker(app, dataType, locale, checkerDescription, checkerTarget);
-            } else if ("Date".equals(checkerDescription.getName())) {
-                String pattern = checkerDescription.getParams().get(DateLineChecker.PARAM_PATTERN);
-                variableComponentChecker = new DateLineChecker(checkerTarget, pattern, checkerDescription.getParams());
-            } else if ("Integer".equals(checkerDescription.getName())) {
-                variableComponentChecker = new IntegerChecker(checkerTarget, checkerDescription.getParams());
-            } else if ("Float".equals(checkerDescription.getName())) {
-                variableComponentChecker = new FloatChecker(checkerTarget, checkerDescription.getParams());
-            } else if ("RegularExpression".equals(checkerDescription.getName())) {
-                String pattern = checkerDescription.getParams().get(RegularExpressionChecker.PARAM_PATTERN);
-                variableComponentChecker = new RegularExpressionChecker(checkerTarget, pattern, checkerDescription.getParams());
             } else {
-                throw new IllegalArgumentException("checker inconnu " + checkerDescription.getName());
+                final Configuration.CheckerConfigurationDescription configuration = checkerDescription.getParams();
+                if ("Date".equals(checkerDescription.getName())) {
+                    String pattern = configuration.getPattern();
+                    variableComponentChecker = new DateLineChecker(checkerTarget, pattern, configuration);
+                } else if ("Integer".equals(checkerDescription.getName())) {
+                    variableComponentChecker = new IntegerChecker(checkerTarget, configuration);
+                } else if ("Float".equals(checkerDescription.getName())) {
+                    variableComponentChecker = new FloatChecker(checkerTarget, configuration);
+                } else if ("RegularExpression".equals(checkerDescription.getName())) {
+                    String pattern = configuration.getPattern();
+                    variableComponentChecker = new RegularExpressionChecker(checkerTarget, pattern, configuration);
+                } else {
+                    throw new IllegalArgumentException("checker inconnu " + checkerDescription.getName());
+                }
             }
             Preconditions.checkState(variableComponentChecker.getTarget().getTarget().equals(variableComponentKey));
             checkersBuilder.add(variableComponentChecker);
@@ -105,7 +111,7 @@ public class CheckerFactory {
 
     private CheckerOnOneVariableComponentLineChecker getCheckerOnReferenceChecker(Application app, String dataType, String locale, Configuration.CheckerDescription checkerDescription, CheckerTarget checkerTarget) {
         CheckerOnOneVariableComponentLineChecker variableComponentChecker;
-        String refType = checkerDescription.getParams().get(ReferenceLineChecker.PARAM_REFTYPE);
+        String refType = checkerDescription.getParams().getRefType();
         ReferenceValueRepository referenceValueRepository = repository.getRepository(app).referenceValue();
         ImmutableMap<String, UUID> referenceValues;
         ImmutableMap<String, String> display = null;
@@ -151,16 +157,15 @@ public class CheckerFactory {
             Configuration.LineValidationRuleDescription lineValidationRuleDescription = validationEntry.getValue();
             Configuration.CheckerDescription checkerDescription = lineValidationRuleDescription.getChecker();
             LineChecker lineChecker;
-            Map<String, String> params = checkerDescription.getParams();
-            String pattern;
+            Configuration.CheckerConfigurationDescription configurationDescription = checkerDescription.getParams();
             if (GroovyLineChecker.NAME.equals(checkerDescription.getName())) {
-                String expression = params.get(GroovyLineChecker.PARAM_EXPRESSION);
-                lineChecker = GroovyLineChecker.forExpression(expression, app, repository.getRepository(app), params);
+                String expression = configurationDescription.getExpression();
+                lineChecker = GroovyLineChecker.forExpression(expression, app, repository.getRepository(app), configurationDescription);
                 checkersBuilder.add(lineChecker);
             } else {
-                List<CheckerTarget> checkerTargets = buildCheckerTarget(params, app);
+                List<CheckerTarget> checkerTargets = buildCheckerTarget(configurationDescription, app);
                 if (checkerTargets != null) {
-                    checkerTargets.forEach(checkerTarget -> buildCheckers(app, checkerDescription, params, checkerTarget, checkersBuilder));
+                    checkerTargets.forEach(checkerTarget -> buildCheckers(app, checkerDescription, checkerTarget, checkersBuilder));
                 } else {
                     throw new IllegalArgumentException(String.format("Pour le checker de ligne %s, le paramètre %s doit être fourni.", checkerDescription.getName(), param));
                 }
@@ -169,37 +174,35 @@ public class CheckerFactory {
         }
     }
 
-    private void buildCheckers(Application app, Configuration.CheckerDescription checkerDescription, Map<String, String> params, CheckerTarget target, ImmutableSet.Builder<LineChecker> checkersBuilder) {
-        String pattern;
+    private void buildCheckers(Application app, Configuration.CheckerDescription checkerDescription, CheckerTarget target, ImmutableSet.Builder<LineChecker> checkersBuilder) {
+        Configuration.CheckerConfigurationDescription checkerConfigurationDescription = checkerDescription.getParams();
         switch (checkerDescription.getName()) {
             case "Date":
-                pattern = params.get(DateLineChecker.PARAM_PATTERN);
-                checkersBuilder.add(new DateLineChecker(target, pattern, params));
+                checkersBuilder.add(new DateLineChecker(target, checkerConfigurationDescription.getPattern(), checkerConfigurationDescription));
                 break;
             case "Integer":
-                checkersBuilder.add(new IntegerChecker(target, params));
+                checkersBuilder.add(new IntegerChecker(target, checkerConfigurationDescription));
                 break;
             case "Float":
-                checkersBuilder.add(new FloatChecker(target, params));
+                checkersBuilder.add(new FloatChecker(target, checkerConfigurationDescription));
                 break;
             case "RegularExpression":
-                pattern = params.get(RegularExpressionChecker.PARAM_PATTERN);
-                checkersBuilder.add(new RegularExpressionChecker(target, pattern, params));
+                checkersBuilder.add(new RegularExpressionChecker(target, checkerConfigurationDescription.getPattern(), checkerConfigurationDescription));
                 break;
             case "Reference":
-                String refType = checkerDescription.getParams().get(ReferenceLineChecker.PARAM_REFTYPE);
+                String refType = checkerConfigurationDescription.getRefType();
                 ReferenceValueRepository referenceValueRepository = repository.getRepository(app).referenceValue();
                 ImmutableMap<String, UUID> referenceValues = referenceValueRepository.getReferenceIdPerKeys(refType);
-                checkersBuilder.add(new ReferenceLineChecker(target, refType, referenceValues, null, params));
+                checkersBuilder.add(new ReferenceLineChecker(target, refType, referenceValues, null, checkerConfigurationDescription));
                 break;
             default:
                 throw new IllegalArgumentException("checker inconnu " + checkerDescription.getName());
         }
     }
 
-    private List<CheckerTarget> buildCheckerTarget(Map<String, String> params, Application application) {
-        String columnsString = params.getOrDefault(COLUMNS, null);
-        String variableComponentKeyParam = params.getOrDefault(VARIABLE_COMPONENT_KEY, null);
+    private List<CheckerTarget> buildCheckerTarget(Configuration.CheckerConfigurationDescription params, Application application) {
+        String columnsString = params.getColumns();
+        String variableComponentKeyParam = params.getVariableComponentKey();
         if (!Strings.isNullOrEmpty(columnsString)) {
             return Stream.of(columnsString.split(","))
                     .map(column -> CheckerTarget.getInstance(column, application, repository.getRepository(application)))
diff --git a/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java b/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
index f6d14acec..301bd624e 100644
--- a/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/CheckerOnOneVariableComponentLineChecker.java
@@ -16,7 +16,7 @@ public interface CheckerOnOneVariableComponentLineChecker<C extends LineCheckerC
         VariableComponentKey variableComponentKey = (VariableComponentKey) getTarget().getTarget();
         String value = values.get(variableComponentKey);
         try {
-            ValidationCheckResult check = CheckerDecorator.check(values, value, getParams(), getTarget());
+            ValidationCheckResult check = CheckerDecorator.check(values, value, getConfiguration(), getTarget());
             if(ValidationLevel.WARN.equals(check.getLevel())){
                 value = check.getMessage();
             }else{
@@ -32,7 +32,7 @@ public interface CheckerOnOneVariableComponentLineChecker<C extends LineCheckerC
     default ValidationCheckResult checkReference(Map<String, String> values) {
         String value = values.get(getTarget().getTarget());
         try {
-            ValidationCheckResult check = CheckerDecorator.check(values, value, getParams(), getTarget());
+            ValidationCheckResult check = CheckerDecorator.check(values, value, getConfiguration(), getTarget());
             if(ValidationLevel.WARN.equals(check.getLevel())){
                 value = check.getMessage();
             }else{
@@ -44,9 +44,5 @@ public interface CheckerOnOneVariableComponentLineChecker<C extends LineCheckerC
         return check(value);
     }
 
-    default Map<String, String> getParams(){
-        return Map.of();
-    }
-
     ValidationCheckResult check(String value);
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/DateLineChecker.java b/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
index 020072c63..191c59b1f 100644
--- a/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/DateLineChecker.java
@@ -11,12 +11,11 @@ import java.util.Map;
 public class DateLineChecker implements CheckerOnOneVariableComponentLineChecker<DateLineCheckerConfiguration> {
 
     public static final String PARAM_PATTERN = "pattern";
-    public static final String PARAM_DURATION = "duration";
     public static final String PARAM_DATE_TIME_FORMATTER = "dateTimeFormatter";
     public static final String PARAM_DATE = "date";
     public static final String PATTERN_DATE_REGEXP = "^date:.{19}:";
     private final CheckerTarget target;
-    private final Map<String, String> params;
+    private final DateLineCheckerConfiguration configuration;
 
     public CheckerTarget getTarget(){
         return this.target;
@@ -29,8 +28,8 @@ public class DateLineChecker implements CheckerOnOneVariableComponentLineChecker
         return formattedDate.replaceAll(PATTERN_DATE_REGEXP, "");
     }
 
-    public DateLineChecker(CheckerTarget target, String pattern, Map<String, String> params) {
-        this.params = params;
+    public DateLineChecker(CheckerTarget target, String pattern, DateLineCheckerConfiguration configuration) {
+        this.configuration = configuration;
         this.target = target;
         this.dateTimeFormatter = DateTimeFormatter.ofPattern(pattern);
         this.pattern = pattern;
@@ -64,7 +63,7 @@ public class DateLineChecker implements CheckerOnOneVariableComponentLineChecker
     }
 
     @Override
-    public Map<String, String> getParams() {
-        return params;
+    public DateLineCheckerConfiguration getConfiguration() {
+        return configuration;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
index 3959a70c9..16114fc9f 100644
--- a/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
@@ -1,4 +1,8 @@
 package fr.inra.oresing.checker;
 
 public interface DateLineCheckerConfiguration extends LineCheckerConfiguration {
+
+    String getPattern();
+
+    String getDuration();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/FloatChecker.java b/src/main/java/fr/inra/oresing/checker/FloatChecker.java
index a873fa0d5..1af380c99 100644
--- a/src/main/java/fr/inra/oresing/checker/FloatChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/FloatChecker.java
@@ -4,18 +4,17 @@ import com.google.common.collect.ImmutableMap;
 import fr.inra.oresing.rest.DefaultValidationCheckResult;
 import fr.inra.oresing.rest.ValidationCheckResult;
 
-import java.util.Map;
-
 public class FloatChecker implements CheckerOnOneVariableComponentLineChecker<FloatCheckerConfiguration> {
     private final CheckerTarget target;
-    private final Map<String, String> params;
+    private final FloatCheckerConfiguration configuration;
 
     public CheckerTarget getTarget(){
         return this.target;
     }
 
-    public FloatChecker(CheckerTarget target, Map<String, String> params) {
-        this.params = params;this.target = target;
+    public FloatChecker(CheckerTarget target, FloatCheckerConfiguration configuration) {
+        this.target = target;
+        this.configuration = configuration;
     }
 
     @Override
@@ -34,7 +33,7 @@ public class FloatChecker implements CheckerOnOneVariableComponentLineChecker<Fl
     }
 
     @Override
-    public Map<String, String> getParams() {
-        return params;
+    public FloatCheckerConfiguration getConfiguration() {
+        return configuration;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java b/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
index c996591aa..4f945499b 100644
--- a/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
@@ -1,9 +1,11 @@
 package fr.inra.oresing.checker;
 
 import com.google.common.collect.ImmutableMap;
+import fr.inra.oresing.checker.decorators.DecoratorConfiguration;
 import fr.inra.oresing.groovy.BooleanGroovyExpression;
 import fr.inra.oresing.groovy.GroovyExpression;
 import fr.inra.oresing.model.Application;
+import fr.inra.oresing.model.Configuration;
 import fr.inra.oresing.model.ReferenceValue;
 import fr.inra.oresing.model.VariableComponentKey;
 import fr.inra.oresing.persistence.DataRow;
@@ -18,40 +20,83 @@ public class GroovyLineChecker implements LineChecker<GroovyLineCheckerConfigura
 
     public static final String NAME = "GroovyExpression";
 
-    public static final String PARAM_EXPRESSION = "expression";
-
-    public static final String PARAM_REFERENCES = "references";
-
-    public static final String PARAM_DATATYPES = "datatypes";
-
     private final BooleanGroovyExpression expression;
     private final Application application;
     private final OreSiRepository.RepositoryForApplication repository;
-    private Map<String, String> params = new HashMap<>();
+    private final GroovyLineCheckerConfiguration configuration;
 
-    private GroovyLineChecker(BooleanGroovyExpression expression, Application app, OreSiRepository.RepositoryForApplication repository, Map<String, String> params) {
+    private GroovyLineChecker(BooleanGroovyExpression expression, Application app, OreSiRepository.RepositoryForApplication repository, GroovyLineCheckerConfiguration configuration) {
         this.expression = expression;
         this.application = app;
         this.repository = repository;
-        this.params = params;
+        this.configuration = configuration;
     }
 
-    public static GroovyLineChecker forExpression(String expression, Application app, OreSiRepository.RepositoryForApplication repository, Map<String, String> params) {
+    public static GroovyLineChecker forExpression(String expression, Application app, OreSiRepository.RepositoryForApplication repository, GroovyLineCheckerConfiguration configuration) {
         BooleanGroovyExpression groovyExpression = BooleanGroovyExpression.forExpression(expression);
-        return new GroovyLineChecker(groovyExpression, app, repository, params);
+        return new GroovyLineChecker(groovyExpression, app, repository, configuration);
     }
 
     public static Optional<GroovyExpression.CompilationError> validateExpression(String expression) {
         return GroovyExpression.validateExpression(expression);
     }
 
-    public static ImmutableMap<String, Object> buildContext(Object datum, Application application, Map<String, String> params, OreSiRepository.RepositoryForApplication repository) {
+    public static ImmutableMap<String, Object> buildContext(Object datum, Application application, DecoratorConfiguration params, OreSiRepository.RepositoryForApplication repository) {
+        Optional<String> configurationReferences = Optional.of(params)
+                .map(DecoratorConfiguration::getReferences);
+        Optional<String> configurationDataTypes = Optional.empty();
+        ImmutableMap<String, Object> context = buildContext(datum, application, repository, configurationReferences, configurationDataTypes);
+        ImmutableMap<String, Object> contextWithParams = ImmutableMap.<String, Object>builder()
+                .putAll(context)
+                .put("params", params)
+                .build();
+        return contextWithParams;
+    }
+
+    public static ImmutableMap<String, Object> buildContext(Object datum, Application application, Configuration.VariableComponentDescriptionConfiguration params, OreSiRepository.RepositoryForApplication repository) {
+        Optional<String> configurationReferences = Optional.of(params)
+                .map(Configuration.VariableComponentDescriptionConfiguration::getReferences);
+        Optional<String> configurationDataTypes = Optional.empty();
+        ImmutableMap<String, Object> context = buildContext(datum, application, repository, configurationReferences, configurationDataTypes);
+        ImmutableMap<String, Object> contextWithParams = ImmutableMap.<String, Object>builder()
+                .putAll(context)
+                .put("params", params)
+                .build();
+        return contextWithParams;
+    }
+
+    public static ImmutableMap<String, Object> buildContext(Object datum, Application application, GroovyLineCheckerConfiguration params, OreSiRepository.RepositoryForApplication repository) {
+        Optional<String> configurationReferences = Optional.of(params)
+                .map(GroovyLineCheckerConfiguration::getReferences);
+        Optional<String> configurationDataTypes = Optional.of(params)
+                .map(GroovyLineCheckerConfiguration::getDatatypes);
+        ImmutableMap<String, Object> context = buildContext(datum, application, repository, configurationReferences, configurationDataTypes);
+        Map<String, String> paramsTest = new LinkedHashMap<>();
+        if (params.getVariable() != null) {
+            paramsTest.put("variable", params.getVariable());
+        }
+        if (params.getCodeVariable() != null) {
+            paramsTest.put("codeVariable", params.getCodeVariable());
+        }
+        if (params.getComponent() != null) {
+            paramsTest.put("component", params.getComponent());
+        }
+        if (params.getDatatype() != null) {
+            paramsTest.put("datatype", params.getDatatype());
+        }
+        ImmutableMap<String, Object> contextWithParams = ImmutableMap.<String, Object>builder()
+                .putAll(context)
+                .put("params", paramsTest)
+                .build();
+        return contextWithParams;
+    }
+
+    private static ImmutableMap<String, Object> buildContext(Object datum, Application application, OreSiRepository.RepositoryForApplication repository, Optional<String> configurationReferences, Optional<String> configurationDataTypes) {
         Map<String, List<ReferenceValue>> references = new HashMap<>();
         Map<String, List<DataRow>> datatypes = new HashMap<>();
         Map<String, List<Map<String, String>>> referencesValues = new HashMap<>();
         Map<String, List<Map<String, Map<String, String>>>> datatypesValues = new HashMap<>();
-        Optional.ofNullable(params)
-                .map(p -> p.get(PARAM_REFERENCES))
+        configurationReferences
                 .ifPresent(refs -> {
                     Arrays.stream(refs.split(","))
                             .forEach(ref -> {
@@ -63,8 +108,7 @@ public class GroovyLineChecker implements LineChecker<GroovyLineCheckerConfigura
                             });
                 });
 
-        Optional.ofNullable(params)
-                .map(p -> p.get(PARAM_DATATYPES))
+        configurationDataTypes
                 .ifPresent(datas -> {
                     Arrays.stream(datas.split(","))
                             .forEach(dataType -> {
@@ -91,10 +135,14 @@ public class GroovyLineChecker implements LineChecker<GroovyLineCheckerConfigura
         builder.put("referencesValues", referencesValues);
         builder.put("datatypes", datatypes);
         builder.put("datatypesValues", datatypesValues);
-        builder.put("params", Optional.ofNullable(params).orElseGet(HashMap::new));
         return builder.build();
     }
 
+    @Override
+    public GroovyLineCheckerConfiguration getConfiguration() {
+        return configuration;
+    }
+
     public ValidationCheckResult check(Map<VariableComponentKey, String> datum) {
         Map<String, Map<String, String>> datumAsMap = new LinkedHashMap<>();
         for (Map.Entry<VariableComponentKey, String> entry2 : datum.entrySet()) {
@@ -103,13 +151,13 @@ public class GroovyLineChecker implements LineChecker<GroovyLineCheckerConfigura
             String value = entry2.getValue();
             datumAsMap.computeIfAbsent(variable, k -> new LinkedHashMap<>()).put(component, value);
         }
-        Map<String, Object> context = buildContext(datumAsMap, application, params, repository);
+        Map<String, Object> context = buildContext(datumAsMap, application, configuration, repository);
         return evaluate(context);
     }
 
     @Override
     public ValidationCheckResult checkReference(Map<String, String> datum) {
-        Map<String, Object> context = buildContext(datum, application, params, repository);
+        Map<String, Object> context = buildContext(datum, application, configuration, repository);
         return evaluate(context);
     }
 
diff --git a/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
index d0dacf462..927b2cdb2 100644
--- a/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
@@ -1,4 +1,14 @@
 package fr.inra.oresing.checker;
 
 public interface GroovyLineCheckerConfiguration extends LineCheckerConfiguration {
+    String getExpression();
+
+    String getReferences();
+
+    String getDatatypes();
+
+    String getVariable();
+    String getCodeVariable();
+    String getComponent();
+    String getDatatype();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/IntegerChecker.java b/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
index 007ca7149..c2f78f4bc 100644
--- a/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/IntegerChecker.java
@@ -4,18 +4,16 @@ import com.google.common.collect.ImmutableMap;
 import fr.inra.oresing.rest.DefaultValidationCheckResult;
 import fr.inra.oresing.rest.ValidationCheckResult;
 
-import java.util.Map;
-
 public class IntegerChecker implements CheckerOnOneVariableComponentLineChecker<IntegerCheckerConfiguration> {
     private final CheckerTarget target;
-    private final Map<String, String> params;
+    private final IntegerCheckerConfiguration configuration;
 
     public CheckerTarget getTarget(){
         return this.target;
     }
 
-    public IntegerChecker(CheckerTarget target, Map<String, String> params) {
-        this.params = params;
+    public IntegerChecker(CheckerTarget target, IntegerCheckerConfiguration configuration) {
+        this.configuration = configuration;
         this.target = target;
     }
 
@@ -34,7 +32,7 @@ public class IntegerChecker implements CheckerOnOneVariableComponentLineChecker<
     }
 
     @Override
-    public Map<String, String> getParams() {
-        return params;
+    public IntegerCheckerConfiguration getConfiguration() {
+        return configuration;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/LineChecker.java b/src/main/java/fr/inra/oresing/checker/LineChecker.java
index 17e3cde23..eb24f8bf5 100644
--- a/src/main/java/fr/inra/oresing/checker/LineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/LineChecker.java
@@ -9,7 +9,5 @@ public interface LineChecker<C extends LineCheckerConfiguration> {
 
     ValidationCheckResult check(Map<VariableComponentKey, String> values);
     ValidationCheckResult checkReference(Map<String, String> values);
-    default Map<String, String> getParams(){
-        return Map.of();
-    }
+    C getConfiguration();
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
index c25ce6fd4..a908fb5ec 100644
--- a/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
@@ -1,4 +1,6 @@
 package fr.inra.oresing.checker;
 
-public interface LineCheckerConfiguration {
+import fr.inra.oresing.checker.decorators.DecoratorConfiguration;
+
+public interface LineCheckerConfiguration extends DecoratorConfiguration {
 }
diff --git a/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java b/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
index 135e45058..ab77e3125 100644
--- a/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/ReferenceLineChecker.java
@@ -2,19 +2,17 @@ package fr.inra.oresing.checker;
 
 import com.google.common.collect.ImmutableMap;
 
-import java.util.Map;
 import java.util.UUID;
 
 public class ReferenceLineChecker implements CheckerOnOneVariableComponentLineChecker<ReferenceLineCheckerConfiguration> {
 
-    public static final String PARAM_REFTYPE = "refType";
     private final String reference;
     public ImmutableMap<String, UUID> referenceValues;
     public ImmutableMap<String, String> display;
-    private final Map<String, String> params;
+    private final ReferenceLineCheckerConfiguration configuration;
     private final CheckerTarget target;
-    public ReferenceLineChecker(CheckerTarget target, String reference, ImmutableMap<String, UUID> referenceValues, ImmutableMap<String, String> display, Map<String, String> params) {
-        this.params = params;
+    public ReferenceLineChecker(CheckerTarget target, String reference, ImmutableMap<String, UUID> referenceValues, ImmutableMap<String, String> display, ReferenceLineCheckerConfiguration configuration) {
+        this.configuration = configuration;
         this.target = target;
         this.reference = reference;
         this.referenceValues = referenceValues;
@@ -53,7 +51,7 @@ public class ReferenceLineChecker implements CheckerOnOneVariableComponentLineCh
     }
 
     @Override
-    public Map<String, String> getParams() {
-        return params;
+    public ReferenceLineCheckerConfiguration getConfiguration() {
+        return configuration;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
index 4514bc0a9..d7b109d73 100644
--- a/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
@@ -1,4 +1,5 @@
 package fr.inra.oresing.checker;
 
 public interface ReferenceLineCheckerConfiguration extends LineCheckerConfiguration {
+    String getRefType();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java b/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
index bd97e2262..ed7380b82 100644
--- a/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/RegularExpressionChecker.java
@@ -4,26 +4,23 @@ import com.google.common.collect.ImmutableMap;
 import fr.inra.oresing.rest.DefaultValidationCheckResult;
 import fr.inra.oresing.rest.ValidationCheckResult;
 
-import java.util.Map;
 import java.util.function.Predicate;
 import java.util.regex.Pattern;
 
 public class RegularExpressionChecker implements CheckerOnOneVariableComponentLineChecker<RegularExpressionCheckerConfiguration> {
 
-    public static final String PARAM_PATTERN = "pattern";
-
     private final String patternString;
 
     private final Predicate<String> predicate;
     private final CheckerTarget target;
-    private final Map<String, String> params;
+    private final RegularExpressionCheckerConfiguration configuration;
 
     public CheckerTarget getTarget(){
         return this.target;
     }
 
-    public RegularExpressionChecker(CheckerTarget target, String patternString, Map<String, String> params) {
-        this.params = params;
+    public RegularExpressionChecker(CheckerTarget target, String patternString, RegularExpressionCheckerConfiguration configuration) {
+        this.configuration = configuration;
         this.target = target;
         this.patternString = patternString;
         predicate = Pattern.compile(patternString).asMatchPredicate();
@@ -45,7 +42,7 @@ public class RegularExpressionChecker implements CheckerOnOneVariableComponentLi
     }
 
     @Override
-    public Map<String, String> getParams() {
-        return params;
+    public RegularExpressionCheckerConfiguration getConfiguration() {
+        return configuration;
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java
index 60d3ec37d..9d735ab74 100644
--- a/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java
@@ -1,4 +1,6 @@
 package fr.inra.oresing.checker;
 
 public interface RegularExpressionCheckerConfiguration extends LineCheckerConfiguration {
+
+    String getPattern();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/decorators/CheckerDecorator.java b/src/main/java/fr/inra/oresing/checker/decorators/CheckerDecorator.java
index c119739de..b288525b0 100644
--- a/src/main/java/fr/inra/oresing/checker/decorators/CheckerDecorator.java
+++ b/src/main/java/fr/inra/oresing/checker/decorators/CheckerDecorator.java
@@ -11,8 +11,8 @@ import java.util.Map;
 public class CheckerDecorator {
     public static List<ICheckerDecorator> checkerDecorators = List.of( new CodifyDecorator(),new GroovyDecorator(), new RequiredDecorator());
 
-    public static <T> ValidationCheckResult check(Map<T, String> values, String value, Map<String, String> params, CheckerTarget target) throws DecoratorException {
-        if(params == null || params.isEmpty()){
+    public static <T> ValidationCheckResult check(Map<T, String> values, String value, DecoratorConfiguration params, CheckerTarget target) throws DecoratorException {
+        if (params == null) {
             return DefaultValidationCheckResult.warn(value, null);
         }
         for (ICheckerDecorator checkerDecorator : checkerDecorators) {
diff --git a/src/main/java/fr/inra/oresing/checker/decorators/CodifyDecorator.java b/src/main/java/fr/inra/oresing/checker/decorators/CodifyDecorator.java
index 495746659..55427fe14 100644
--- a/src/main/java/fr/inra/oresing/checker/decorators/CodifyDecorator.java
+++ b/src/main/java/fr/inra/oresing/checker/decorators/CodifyDecorator.java
@@ -7,20 +7,16 @@ import fr.inra.oresing.rest.ValidationCheckResult;
 import org.assertj.core.util.Strings;
 
 import java.util.Map;
-import java.util.Optional;
 
 public class CodifyDecorator implements ICheckerDecorator {
-    public static final String PARAMS_CODIFY = "codify";
 
-    public ValidationCheckResult check(Map<? extends Object, String> values, String value, Map<String, String> params, CheckerTarget target) throws DecoratorException {
-
-        boolean codify = params.containsKey(PARAMS_CODIFY) &&
-                Optional.ofNullable(params.get(PARAMS_CODIFY))
-                        .map(req -> req == null || Boolean.parseBoolean(req))
-                        .orElse(false);
-        if (codify && !Strings.isNullOrEmpty(value)) {
-            value = OreSiService.escapeKeyComponent(value);
+    public ValidationCheckResult check(Map<? extends Object, String> values, String value, DecoratorConfiguration params, CheckerTarget target) throws DecoratorException {
+        String valueAfterCodification;
+        if (params.isCodify() && !Strings.isNullOrEmpty(value)) {
+            valueAfterCodification = OreSiService.escapeKeyComponent(value);
+        } else {
+            valueAfterCodification = value;
         }
-        return DefaultValidationCheckResult.warn(value, null);
+        return DefaultValidationCheckResult.warn(valueAfterCodification, null);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/decorators/DecoratorConfiguration.java b/src/main/java/fr/inra/oresing/checker/decorators/DecoratorConfiguration.java
new file mode 100644
index 000000000..7cbc7bfb9
--- /dev/null
+++ b/src/main/java/fr/inra/oresing/checker/decorators/DecoratorConfiguration.java
@@ -0,0 +1,8 @@
+package fr.inra.oresing.checker.decorators;
+
+public interface DecoratorConfiguration {
+    boolean isCodify();
+    boolean isRequired();
+    String getGroovy();
+    String getReferences();
+}
diff --git a/src/main/java/fr/inra/oresing/checker/decorators/GroovyDecorator.java b/src/main/java/fr/inra/oresing/checker/decorators/GroovyDecorator.java
index cdfdbd4f5..d32607aff 100644
--- a/src/main/java/fr/inra/oresing/checker/decorators/GroovyDecorator.java
+++ b/src/main/java/fr/inra/oresing/checker/decorators/GroovyDecorator.java
@@ -3,26 +3,24 @@ package fr.inra.oresing.checker.decorators;
 import com.google.common.collect.ImmutableMap;
 import fr.inra.oresing.checker.CheckerTarget;
 import fr.inra.oresing.checker.GroovyLineChecker;
-import fr.inra.oresing.groovy.GroovyExpression;
+import fr.inra.oresing.groovy.StringGroovyExpression;
 import fr.inra.oresing.rest.DefaultValidationCheckResult;
 import fr.inra.oresing.rest.ValidationCheckResult;
 
 import java.util.Map;
-import java.util.Optional;
 
 public class GroovyDecorator implements ICheckerDecorator {
-    public static final String PARAMS_GROOVY = "groovy";
 
-    public ValidationCheckResult check(Map<? extends Object, String> values, String value, Map<String, String> params, CheckerTarget target) throws DecoratorException {
-
-        GroovyExpression groovyExpression=Optional.ofNullable(params.get(PARAMS_GROOVY))
-                        .map(req -> GroovyExpression.forExpression(req))
-                        .orElse((GroovyExpression) null);
-        if (groovyExpression!=null) {
+    public ValidationCheckResult check(Map<? extends Object, String> values, String value, DecoratorConfiguration params, CheckerTarget target) throws DecoratorException {
+        String groovy = params.getGroovy();
+        String valueAfterDecoration;
+        if (groovy == null) {
+            valueAfterDecoration = value;
+        } else {
             ImmutableMap<String, Object> context = GroovyLineChecker.buildContext(values, target.getApplication(), params, target.getRepository());
-            value = groovyExpression.evaluate(context).toString();
-
+            StringGroovyExpression groovyExpression = StringGroovyExpression.forExpression(groovy);
+            valueAfterDecoration = groovyExpression.evaluate(context);
         }
-        return DefaultValidationCheckResult.warn(value, null);
+        return DefaultValidationCheckResult.warn(valueAfterDecoration, null);
     }
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/decorators/ICheckerDecorator.java b/src/main/java/fr/inra/oresing/checker/decorators/ICheckerDecorator.java
index 413b9357a..05871c801 100644
--- a/src/main/java/fr/inra/oresing/checker/decorators/ICheckerDecorator.java
+++ b/src/main/java/fr/inra/oresing/checker/decorators/ICheckerDecorator.java
@@ -6,5 +6,5 @@ import fr.inra.oresing.rest.ValidationCheckResult;
 import java.util.Map;
 
 public interface ICheckerDecorator {
-    ValidationCheckResult check(Map<? extends Object, String> values, String value, Map<String, String> params, CheckerTarget target) throws DecoratorException;
+    ValidationCheckResult check(Map<? extends Object, String> values, String value, DecoratorConfiguration params, CheckerTarget target) throws DecoratorException;
 }
\ No newline at end of file
diff --git a/src/main/java/fr/inra/oresing/checker/decorators/RequiredDecorator.java b/src/main/java/fr/inra/oresing/checker/decorators/RequiredDecorator.java
index 3f65ecb18..d518d6d3e 100644
--- a/src/main/java/fr/inra/oresing/checker/decorators/RequiredDecorator.java
+++ b/src/main/java/fr/inra/oresing/checker/decorators/RequiredDecorator.java
@@ -7,16 +7,11 @@ import fr.inra.oresing.rest.ValidationCheckResult;
 import org.assertj.core.util.Strings;
 
 import java.util.Map;
-import java.util.Optional;
 
 public class RequiredDecorator implements ICheckerDecorator {
-    public static final String PARAMS_REQUIRED = "required";
 
-    public ValidationCheckResult check(Map<? extends Object, String> values, String value, Map<String, String> params, CheckerTarget target) throws DecoratorException {
-        boolean required = params.containsKey(PARAMS_REQUIRED) &&
-                Optional.ofNullable(params.get(PARAMS_REQUIRED))
-                        .map(req->req==null || Boolean.parseBoolean(req))
-                        .orElse(false);
+    public ValidationCheckResult check(Map<? extends Object, String> values, String value, DecoratorConfiguration params, CheckerTarget target) throws DecoratorException {
+        boolean required = params.isRequired();
         if (required && Strings.isNullOrEmpty(value)) {
             throw new DecoratorException(DefaultValidationCheckResult.error(target.getInternationalizedKey("requiredValue"), ImmutableMap.of("target", target.getTarget())));
         }else if (!required && Strings.isNullOrEmpty(value)) {
diff --git a/src/main/java/fr/inra/oresing/model/Configuration.java b/src/main/java/fr/inra/oresing/model/Configuration.java
index d5208c786..8c1540fd3 100644
--- a/src/main/java/fr/inra/oresing/model/Configuration.java
+++ b/src/main/java/fr/inra/oresing/model/Configuration.java
@@ -1,7 +1,12 @@
 package fr.inra.oresing.model;
 
 import com.google.common.collect.MoreCollectors;
-import fr.inra.oresing.checker.ReferenceLineChecker;
+import fr.inra.oresing.checker.DateLineCheckerConfiguration;
+import fr.inra.oresing.checker.FloatCheckerConfiguration;
+import fr.inra.oresing.checker.GroovyLineCheckerConfiguration;
+import fr.inra.oresing.checker.IntegerCheckerConfiguration;
+import fr.inra.oresing.checker.ReferenceLineCheckerConfiguration;
+import fr.inra.oresing.checker.RegularExpressionCheckerConfiguration;
 import fr.inra.oresing.model.internationalization.Internationalization;
 import fr.inra.oresing.model.internationalization.InternationalizationMap;
 import lombok.Getter;
@@ -10,7 +15,16 @@ import lombok.ToString;
 import org.springframework.util.CollectionUtils;
 
 import javax.annotation.Nullable;
-import java.util.*;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.TreeMap;
 
 @Getter
 @Setter
@@ -52,9 +66,9 @@ public class Configuration {
             for (Map.Entry<String, LineValidationRuleDescription> validation : validations.entrySet()) {
                 CheckerDescription checker = validation.getValue().getChecker();
                 if (checker != null) {
-                    String refType = Optional.ofNullable(checker)
-                            .map(c -> c.getParams())
-                            .map(param -> param.get(ReferenceLineChecker.PARAM_REFTYPE))
+                    String refType = Optional.of(checker)
+                            .map(CheckerDescription::getParams)
+                            .map(CheckerConfigurationDescription::getRefType)
                             .orElse(null);
                     if ("Reference".equals(checker.getName()) && refType != null) {
                         DependencyNode node = nodes.computeIfAbsent(refType, k -> new DependencyNode(refType));
@@ -202,7 +216,15 @@ public class Configuration {
         CheckerDescription checker;
         @Nullable
         String defaultValue;
-        Map<String, String> params;
+        VariableComponentDescriptionConfiguration params;
+    }
+
+    @Getter
+    @Setter
+    @ToString
+    public static class VariableComponentDescriptionConfiguration {
+        String references; // à remplacer par une collection car split(',')
+        boolean replace;
     }
 
     @Getter
@@ -210,7 +232,36 @@ public class Configuration {
     @ToString
     public static class CheckerDescription {
         String name;
-        Map<String, String> params = new LinkedHashMap<>();
+        CheckerConfigurationDescription params;
+    }
+
+    @Getter
+    @Setter
+    @ToString
+    public static class CheckerConfigurationDescription implements
+            RegularExpressionCheckerConfiguration,
+            FloatCheckerConfiguration,
+            IntegerCheckerConfiguration,
+            DateLineCheckerConfiguration,
+            ReferenceLineCheckerConfiguration,
+            GroovyLineCheckerConfiguration {
+        String pattern;
+        String refType;
+        String expression;
+        String columns;
+        String variableComponentKey;
+        String references; // à remplacer par une collection car split(',')
+        String datatypes;
+        String duration;
+        String groovy;
+        boolean codify;
+        boolean required;
+
+
+        String datatype;
+        String variable;
+        String codeVariable;
+        String component;
     }
 
     @Getter
diff --git a/src/main/java/fr/inra/oresing/model/LocalDateTimeRange.java b/src/main/java/fr/inra/oresing/model/LocalDateTimeRange.java
index 21d607e7c..870a44317 100644
--- a/src/main/java/fr/inra/oresing/model/LocalDateTimeRange.java
+++ b/src/main/java/fr/inra/oresing/model/LocalDateTimeRange.java
@@ -31,8 +31,8 @@ public class LocalDateTimeRange {
                 public LocalDateTimeRange toLocalDateTimeRange(String str, DateTimeFormatter dateTimeFormatter, DateLineChecker dateLineChecker) {
                     String pattern = "01/" + str;
                     final LocalDate date = LocalDate.parse(pattern, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
-                    if (dateLineChecker.getParams() != null && dateLineChecker.getParams().containsKey(DateLineChecker.PARAM_DURATION)) {
-                        return new Duration(dateLineChecker.getParams().get(DateLineChecker.PARAM_DURATION)).getLocalDateTimeRange(date);
+                    if (dateLineChecker.getConfiguration() != null && dateLineChecker.getConfiguration().getDuration() != null) {
+                        return new Duration(dateLineChecker.getConfiguration().getDuration()).getLocalDateTimeRange(date);
                     }
                     return LocalDateTimeRange.between(LocalDate.from(date.atStartOfDay()), date.plus(1L, ChronoUnit.MONTHS));
                 }
@@ -45,10 +45,10 @@ public class LocalDateTimeRange {
 
                 @Override
                 public LocalDateTimeRange toLocalDateTimeRange(String str, DateTimeFormatter dateTimeFormatter, DateLineChecker dateLineChecker) {
-                    if (dateLineChecker.getParams() != null && dateLineChecker.getParams().containsKey(DateLineChecker.PARAM_DURATION)) {
+                    if (dateLineChecker.getConfiguration() != null && dateLineChecker.getConfiguration().getDuration() != null) {
                         String pattern = "01/01/" + str;
                         final LocalDate date = LocalDate.parse(pattern, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
-                        return new Duration(dateLineChecker.getParams().get(DateLineChecker.PARAM_DURATION)).getLocalDateTimeRange(date);
+                        return new Duration(dateLineChecker.getConfiguration().getDuration()).getLocalDateTimeRange(date);
                     }
                     return LocalDateTimeRange.forYear(Year.parse(str, dateTimeFormatter));
                 }
@@ -61,9 +61,9 @@ public class LocalDateTimeRange {
 
                 @Override
                 public LocalDateTimeRange toLocalDateTimeRange(String str, DateTimeFormatter dateTimeFormatter, DateLineChecker dateLineChecker) {
-                    if (dateLineChecker.getParams() != null && dateLineChecker.getParams().containsKey(DateLineChecker.PARAM_DURATION)) {
+                    if (dateLineChecker.getConfiguration() != null && dateLineChecker.getConfiguration().getDuration() != null) {
                         final LocalDate date = LocalDate.parse(str, DateTimeFormatter.ofPattern("dd/MM/yyyy"));
-                        return new Duration(dateLineChecker.getParams().get(DateLineChecker.PARAM_DURATION)).getLocalDateTimeRange(date);
+                        return new Duration(dateLineChecker.getConfiguration().getDuration()).getLocalDateTimeRange(date);
                     }
                     return LocalDateTimeRange.forDay(LocalDate.parse(str, dateTimeFormatter));
                 }
@@ -77,9 +77,9 @@ public class LocalDateTimeRange {
                 @Override
                 public LocalDateTimeRange toLocalDateTimeRange(String str, DateTimeFormatter dateTimeFormatter, DateLineChecker dateLineChecker) {
                     final LocalDate startDate = LocalDate.parse(str, dateTimeFormatter);
-                    if(dateLineChecker.getParams() != null && dateLineChecker.getParams().containsKey(DateLineChecker.PARAM_DURATION)){
+                    if(dateLineChecker.getConfiguration() != null && dateLineChecker.getConfiguration().getDuration() != null){
                         final LocalDateTime date = LocalDateTime.parse(str, DateTimeFormatter.ofPattern(getPattern()));
-                        return new Duration(dateLineChecker.getParams().get(DateLineChecker.PARAM_DURATION)).getLocalDateTimeRange(date);
+                        return new Duration(dateLineChecker.getConfiguration().getDuration()).getLocalDateTimeRange(date);
                     }
                     return LocalDateTimeRange.forDay(startDate);
                 }
diff --git a/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java b/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java
index 10f23f93a..6d54d0018 100644
--- a/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java
+++ b/src/main/java/fr/inra/oresing/rest/ApplicationConfigurationService.java
@@ -6,16 +6,13 @@ import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.exc.InvalidFormatException;
 import com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException;
 import com.fasterxml.jackson.dataformat.yaml.YAMLMapper;
+import com.google.common.base.MoreObjects;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Multiset;
 import com.google.common.collect.Sets;
 import com.google.common.collect.TreeMultiset;
 import fr.inra.oresing.OreSiTechnicalException;
-import fr.inra.oresing.checker.CheckerFactory;
-import fr.inra.oresing.checker.DateLineChecker;
 import fr.inra.oresing.checker.GroovyLineChecker;
-import fr.inra.oresing.checker.ReferenceLineChecker;
-import fr.inra.oresing.checker.decorators.GroovyDecorator;
 import fr.inra.oresing.groovy.GroovyExpression;
 import fr.inra.oresing.model.Configuration;
 import fr.inra.oresing.model.LocalDateTimeRange;
@@ -33,7 +30,17 @@ import org.springframework.stereotype.Component;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
-import java.util.*;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -330,11 +337,11 @@ public class ApplicationConfigurationService {
                                     builder.recordAuthorizationScopeVariableComponentWrongChecker(authorizationScopeVariableComponentKey, "Date");
                                 }
                                 String refType = null;
-                                Map<String, String> params = authorizationScopeVariableComponentChecker.getParams();
-                                if (params == null) {
+                                Configuration.CheckerConfigurationDescription checkerConfigurationDescription = authorizationScopeVariableComponentChecker.getParams();
+                                if (checkerConfigurationDescription == null) {
                                     builder.recordAuthorizationScopeVariableComponentReftypeNull(authorizationScopeVariableComponentKey, configuration.getReferences().keySet());
                                 } else {
-                                    refType = params.getOrDefault(ReferenceLineChecker.PARAM_REFTYPE, null);
+                                    refType = checkerConfigurationDescription.getRefType();
                                     if (refType == null || !configuration.getReferences().containsKey(refType)) {
                                         builder.recordAuthorizationScopeVariableComponentReftypeUnknown(authorizationScopeVariableComponentKey, refType, configuration.getReferences().keySet());
                                     } else {
@@ -379,7 +386,7 @@ public class ApplicationConfigurationService {
                             }
                             Optional.ofNullable(timeScopeVariableComponentChecker)
                                     .map(checkerDescription -> checkerDescription.getParams())
-                                    .map(params -> params.getOrDefault(DateLineChecker.PARAM_PATTERN, null))
+                                    .map(Configuration.CheckerConfigurationDescription::getPattern)
                                     .ifPresent(pattern -> {
                                         if (!LocalDateTimeRange.getKnownPatterns().contains(pattern)) {
                                             builder.recordTimeScopeVariableComponentPatternUnknown(timeScopeVariableComponentKey, pattern, LocalDateTimeRange.getKnownPatterns());
@@ -421,7 +428,7 @@ public class ApplicationConfigurationService {
             String lineValidationRuleKey = validationEntry.getKey();
             Configuration.CheckerDescription checker = lineValidationRuleDescription.getChecker();
             if (GroovyLineChecker.NAME.equals(checker.getName())) {
-                String expression = checker.getParams().get(GroovyLineChecker.PARAM_EXPRESSION);
+                String expression = checker.getParams().getExpression();
                 if (StringUtils.isBlank(expression)) {
                     builder.recordMissingRequiredExpression(lineValidationRuleKey);
                 } else {
@@ -444,8 +451,8 @@ public class ApplicationConfigurationService {
                 if (variableComponentDescription != null) {
                     Configuration.CheckerDescription checkerDescription = variableComponentDescription.getChecker();
                     if ("Reference".equals(checkerDescription.getName())) {
-                        if (checkerDescription.getParams() != null && checkerDescription.getParams().containsKey(ReferenceLineChecker.PARAM_REFTYPE)) {
-                            String refType = checkerDescription.getParams().get(ReferenceLineChecker.PARAM_REFTYPE);
+                        if (checkerDescription.getParams() != null && checkerDescription.getParams().getRefType() != null) {
+                            String refType = checkerDescription.getParams().getRefType();
                             if (!references.contains(refType)) {
                                 builder.unknownReferenceForChecker(dataType, datum, component, refType, references);
                             }
@@ -599,17 +606,19 @@ public class ApplicationConfigurationService {
                 continue;
             }
             ImmutableSet<String> variableComponentCheckers = ImmutableSet.of("Date", "Float", "Integer", "RegularExpression", "Reference");
-            String columns = checker.getParams().get(CheckerFactory.COLUMNS);
+            String columns = checker.getParams().getColumns();
             Set<String> groovyColumn = Optional.ofNullable(checker)
                     .map(check->check.getParams())
-                    .filter(params->params.containsKey(GroovyDecorator.PARAMS_GROOVY))
-                    .map(params-> params.getOrDefault(CheckerFactory.COLUMNS, ""))
+                    .filter(params->params.getGroovy() != null)
+                    .map(params-> MoreObjects.firstNonNull(params.getColumns(), ""))
+
+                    // autant mettre une collection dans le YAML directement
                     .map(values-> values.split(","))
                     .map(values-> Arrays.stream(values).collect(Collectors.toSet()))
                     .orElse(Set.of());
 
             if (GroovyLineChecker.NAME.equals(checker.getName())) {
-                String expression = checker.getParams().get(GroovyLineChecker.PARAM_EXPRESSION);
+                String expression = checker.getParams().getExpression();
                 if (StringUtils.isBlank(expression)) {
                     builder.recordMissingRequiredExpression(validationRuleDescriptionEntryKey);
                 } else {
@@ -636,8 +645,8 @@ public class ApplicationConfigurationService {
                     }
                 }
                 if ("Reference".equals(checker.getName())) {
-                    if (checker.getParams() != null && checker.getParams().containsKey(ReferenceLineChecker.PARAM_REFTYPE)) {
-                        String refType = checker.getParams().get(ReferenceLineChecker.PARAM_REFTYPE);
+                    if (checker.getParams() != null && checker.getParams().getRefType() != null) {
+                        String refType = checker.getParams().getRefType();
                         if (!references.contains(refType)) {
                             builder.unknownReferenceForCheckerInReference(validationRuleDescriptionEntryKey, reference, refType, references);
                         }
diff --git a/src/main/java/fr/inra/oresing/rest/OreSiService.java b/src/main/java/fr/inra/oresing/rest/OreSiService.java
index aa3c7c380..5b0e25b1d 100644
--- a/src/main/java/fr/inra/oresing/rest/OreSiService.java
+++ b/src/main/java/fr/inra/oresing/rest/OreSiService.java
@@ -4,19 +4,60 @@ import com.google.common.base.Charsets;
 import com.google.common.base.Preconditions;
 import com.google.common.base.Predicate;
 import com.google.common.base.Splitter;
-import com.google.common.collect.*;
+import com.google.common.collect.BiMap;
+import com.google.common.collect.HashBiMap;
+import com.google.common.collect.HashMultimap;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableMultiset;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.ImmutableSetMultimap;
+import com.google.common.collect.ImmutableSortedSet;
+import com.google.common.collect.Iterables;
+import com.google.common.collect.Iterators;
+import com.google.common.collect.Maps;
+import com.google.common.collect.MoreCollectors;
+import com.google.common.collect.Ordering;
+import com.google.common.collect.SetMultimap;
+import com.google.common.collect.Sets;
 import com.google.common.primitives.Ints;
 import fr.inra.oresing.OreSiTechnicalException;
-import fr.inra.oresing.checker.*;
-import fr.inra.oresing.checker.decorators.GroovyDecorator;
+import fr.inra.oresing.checker.CheckerFactory;
+import fr.inra.oresing.checker.DateLineChecker;
+import fr.inra.oresing.checker.DateValidationCheckResult;
+import fr.inra.oresing.checker.FloatChecker;
+import fr.inra.oresing.checker.GroovyLineChecker;
+import fr.inra.oresing.checker.IntegerChecker;
+import fr.inra.oresing.checker.InvalidDatasetContentException;
+import fr.inra.oresing.checker.LineChecker;
+import fr.inra.oresing.checker.ReferenceLineChecker;
+import fr.inra.oresing.checker.ReferenceLineCheckerConfiguration;
+import fr.inra.oresing.checker.ReferenceValidationCheckResult;
 import fr.inra.oresing.groovy.CommonExpression;
 import fr.inra.oresing.groovy.Expression;
 import fr.inra.oresing.groovy.StringGroovyExpression;
-import fr.inra.oresing.model.*;
+import fr.inra.oresing.model.Application;
+import fr.inra.oresing.model.Authorization;
+import fr.inra.oresing.model.BinaryFile;
+import fr.inra.oresing.model.BinaryFileDataset;
+import fr.inra.oresing.model.Configuration;
+import fr.inra.oresing.model.Data;
+import fr.inra.oresing.model.LocalDateTimeRange;
+import fr.inra.oresing.model.ReferenceValue;
+import fr.inra.oresing.model.VariableComponentKey;
 import fr.inra.oresing.model.internationalization.Internationalization;
 import fr.inra.oresing.model.internationalization.InternationalizationDisplay;
 import fr.inra.oresing.model.internationalization.InternationalizationReferenceMap;
-import fr.inra.oresing.persistence.*;
+import fr.inra.oresing.persistence.AuthenticationService;
+import fr.inra.oresing.persistence.BinaryFileInfos;
+import fr.inra.oresing.persistence.DataRepository;
+import fr.inra.oresing.persistence.DataRow;
+import fr.inra.oresing.persistence.OreSiRepository;
+import fr.inra.oresing.persistence.ReferenceValueRepository;
+import fr.inra.oresing.persistence.SqlPolicy;
+import fr.inra.oresing.persistence.SqlSchema;
+import fr.inra.oresing.persistence.SqlSchemaForApplication;
+import fr.inra.oresing.persistence.SqlService;
 import fr.inra.oresing.persistence.roles.OreSiRightOnApplicationRole;
 import fr.inra.oresing.persistence.roles.OreSiUserRole;
 import lombok.Value;
@@ -50,7 +91,19 @@ import java.time.LocalDateTime;
 import java.time.ZoneOffset;
 import java.time.format.DateTimeFormatter;
 import java.time.temporal.ChronoUnit;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.LinkedHashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.UUID;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -778,7 +831,8 @@ public class OreSiService {
                         dateValidationCheckResultImmutableMap.put(variableComponentKey, (DateValidationCheckResult) validationCheckResult);
                     }
                     if (validationCheckResult instanceof ReferenceValidationCheckResult) {
-                        if (!lineChecker.getParams().isEmpty() && lineChecker.getParams().containsKey(GroovyDecorator.PARAMS_GROOVY)) {
+                        ReferenceLineCheckerConfiguration configuration = (ReferenceLineCheckerConfiguration) lineChecker.getConfiguration();
+                        if (configuration.getGroovy() != null) {
                             values.put((VariableComponentKey) ((ReferenceValidationCheckResult) validationCheckResult).getTarget().getTarget(), ((ReferenceValidationCheckResult) validationCheckResult).getValue().toString());
                         }
                         ReferenceValidationCheckResult referenceValidationCheckResult = (ReferenceValidationCheckResult) validationCheckResult;
@@ -919,16 +973,16 @@ public class OreSiService {
             Map<VariableComponentKey, String> rowWithValues = new LinkedHashMap(rowWithData.datum);
             defaultValueExpressions.entrySet().stream()
                     .forEach(variableComponentKeyExpressionEntry -> {
-                        Map<String, String> params = Optional.ofNullable(data)
+                        Configuration.VariableComponentDescriptionConfiguration params = Optional.ofNullable(data)
                                 .map(columnDescriptionLinkedHashMap -> columnDescriptionLinkedHashMap.get(variableComponentKeyExpressionEntry.getKey().getVariable()))
                                 .map(columnDescription -> columnDescription.getComponents())
                                 .map(variableComponentDescriptionLinkedHashMap -> variableComponentDescriptionLinkedHashMap.get(variableComponentKeyExpressionEntry.getKey().getComponent()))
                                 .map(variableComponentDescription -> variableComponentDescription.getParams())
-                                .orElseGet(HashMap::new);
+                                .orElseGet(Configuration.VariableComponentDescriptionConfiguration::new);
                         ImmutableMap<String, Object> evaluationContext = GroovyLineChecker.buildContext(rowWithData.getDatum(), application, params, repository);
                         String evaluate = variableComponentKeyExpressionEntry.getValue().evaluate(evaluationContext);
                         if (StringUtils.isNotBlank(evaluate)) {
-                            if (params != null && Boolean.parseBoolean(params.get("replace"))) {
+                            if (params.isReplace()) {
                                 rowWithValues.put(variableComponentKeyExpressionEntry.getKey(), evaluate);
                             } else {
                                 rowWithDefaults.put(variableComponentKeyExpressionEntry.getKey(), evaluate);
diff --git a/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java b/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
index b72dfefb0..caec53616 100644
--- a/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
+++ b/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
@@ -40,7 +40,7 @@ public class GroovyLineCheckerTest {
 
         Application application = Mockito.mock(Application.class);
         OreSiRepository.RepositoryForApplication repository = Mockito.mock(OreSiRepository.RepositoryForApplication.class);
-        GroovyLineChecker groovyLineChecker = GroovyLineChecker.forExpression(expression, application,repository,null);
+        GroovyLineChecker groovyLineChecker = GroovyLineChecker.forExpression(expression, application,repository, getConfiguration(expression));
         ImmutableMap<VariableComponentKey, String> validDatum =
                 ImmutableMap.of(
                         new VariableComponentKey("temperature", "valeur"), "-12",
@@ -85,7 +85,7 @@ public class GroovyLineCheckerTest {
         Application application = Mockito.mock(Application.class);
         OreSiRepository.RepositoryForApplication repository = Mockito.mock(OreSiRepository.RepositoryForApplication.class);
 
-        GroovyLineChecker groovyLineChecker = GroovyLineChecker.forExpression(expression, application,repository,null);
+        GroovyLineChecker groovyLineChecker = GroovyLineChecker.forExpression(expression, application, repository, getConfiguration(expression));
         ImmutableMap<VariableComponentKey, String> validDatum =
                 ImmutableMap.of(
                         new VariableComponentKey("temperature", "valeur"), "-12",
@@ -98,4 +98,58 @@ public class GroovyLineCheckerTest {
             Assert.assertTrue(e.getMessage().contains("L'évaluation de l’expression n'a pas retourné une valeur booléenne mais 261.15."));
         }
     }
+
+    private GroovyLineCheckerConfiguration getConfiguration(String expression) {
+        return new GroovyLineCheckerConfiguration() {
+            @Override
+            public String getExpression() {
+                return expression;
+            }
+
+            @Override
+            public String getReferences() {
+                return null;
+            }
+
+            @Override
+            public String getDatatypes() {
+                return null;
+            }
+
+            @Override
+            public String getDatatype() {
+                return null;
+            }
+
+            @Override
+            public String getVariable() {
+                return null;
+            }
+
+            @Override
+            public String getCodeVariable() {
+                return null;
+            }
+
+            @Override
+            public String getComponent() {
+                return null;
+            }
+
+            @Override
+            public boolean isCodify() {
+                throw new UnsupportedOperationException("doublure de test");
+            }
+
+            @Override
+            public boolean isRequired() {
+                throw new UnsupportedOperationException("doublure de test");
+            }
+
+            @Override
+            public String getGroovy() {
+                throw new UnsupportedOperationException("doublure de test");
+            }
+        };
+    }
 }
\ No newline at end of file
diff --git a/src/test/java/fr/inra/oresing/model/LocalDateTimeRangeTest.java b/src/test/java/fr/inra/oresing/model/LocalDateTimeRangeTest.java
index 24424576c..59dcc4f80 100644
--- a/src/test/java/fr/inra/oresing/model/LocalDateTimeRangeTest.java
+++ b/src/test/java/fr/inra/oresing/model/LocalDateTimeRangeTest.java
@@ -1,11 +1,11 @@
 package fr.inra.oresing.model;
 
 import fr.inra.oresing.checker.DateLineChecker;
+import fr.inra.oresing.checker.DateLineCheckerConfiguration;
 import org.junit.Assert;
 import org.junit.Test;
 
 import java.time.Year;
-import java.util.Map;
 
 public class LocalDateTimeRangeTest {
 
@@ -28,23 +28,57 @@ public class LocalDateTimeRangeTest {
     }
     @Test
     public void testDayPattern() {
-        LocalDateTimeRange range = LocalDateTimeRange.parse("01/01/2020", new DateLineChecker(null, "dd/MM/yyyy", Map.of(DateLineChecker.PARAM_DURATION, "2 MONTHS")));
+        LocalDateTimeRange range = LocalDateTimeRange.parse("01/01/2020", new DateLineChecker(null, "dd/MM/yyyy", getDateCheckerConfiguration("2 MONTHS")));
         Assert.assertEquals("[\"2020-01-01 00:00:00\",\"2020-03-01 00:00:00\")", range.toSqlExpression());
          range = LocalDateTimeRange.parse("01/01/2020", new DateLineChecker(null, "dd/MM/yyyy", null));
         Assert.assertEquals("[\"2020-01-01 00:00:00\",\"2020-01-02 00:00:00\")", range.toSqlExpression());
     }
     @Test
     public void testSemiHourlyPattern() {
-        LocalDateTimeRange range = LocalDateTimeRange.parse("01/01/2020 01:30:00", new DateLineChecker(null, "dd/MM/yyyy HH:mm:ss", Map.of(DateLineChecker.PARAM_DURATION, "30 MINUTES")));
+        LocalDateTimeRange range = LocalDateTimeRange.parse("01/01/2020 01:30:00", new DateLineChecker(null, "dd/MM/yyyy HH:mm:ss", getDateCheckerConfiguration("30 MINUTES")));
         Assert.assertEquals("[\"2020-01-01 01:30:00\",\"2020-01-01 02:00:00\")", range.toSqlExpression());
          range = LocalDateTimeRange.parse("01/01/2020 01:30:00", new DateLineChecker(null, "dd/MM/yyyy HH:mm:ss", null));
         Assert.assertEquals("[\"2020-01-01 00:00:00\",\"2020-01-02 00:00:00\")", range.toSqlExpression());
     }
     @Test
     public void testMounthPattern() {
-        LocalDateTimeRange range = LocalDateTimeRange.parse("01/2020", new DateLineChecker(null, "MM/yyyy", Map.of(DateLineChecker.PARAM_DURATION, "2 MONTHS")));
+        LocalDateTimeRange range = LocalDateTimeRange.parse("01/2020", new DateLineChecker(null, "MM/yyyy", getDateCheckerConfiguration("2 MONTHS")));
         Assert.assertEquals("[\"2020-01-01 00:00:00\",\"2020-03-01 00:00:00\")", range.toSqlExpression());
          range = LocalDateTimeRange.parse("01/2020", new DateLineChecker(null, "MM/yyyy", null));
         Assert.assertEquals("[\"2020-01-01 00:00:00\",\"2020-02-01 00:00:00\")", range.toSqlExpression());
     }
+
+    private DateLineCheckerConfiguration getDateCheckerConfiguration(String duration) {
+        return new DateLineCheckerConfiguration() {
+            @Override
+            public String getPattern() {
+                throw new UnsupportedOperationException("doublure de test");
+            }
+
+            @Override
+            public String getDuration() {
+                return duration;
+            }
+
+            @Override
+            public boolean isCodify() {
+                throw new UnsupportedOperationException("doublure de test");
+            }
+
+            @Override
+            public boolean isRequired() {
+                throw new UnsupportedOperationException("doublure de test");
+            }
+
+            @Override
+            public String getGroovy() {
+                throw new UnsupportedOperationException("doublure de test");
+            }
+
+            @Override
+            public String getReferences() {
+                throw new UnsupportedOperationException("doublure de test");
+            }
+        };
+    }
 }
\ No newline at end of file
-- 
GitLab


From 8d4a89bf5be17376ea25e94e79d6fd83430f118a Mon Sep 17 00:00:00 2001
From: Brendan Le Ny <bleny@codelutin.com>
Date: Mon, 31 Jan 2022 11:56:11 +0100
Subject: [PATCH 3/5] =?UTF-8?q?Supprime=20"params"=20car=20il=20est=20inut?=
 =?UTF-8?q?ile=20d'exprimer=20du=20contexte=20groovy=20hors=20de=20groovy?=
 =?UTF-8?q?=20lui-m=C3=AAme?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../oresing/checker/GroovyLineChecker.java    | 31 ++-----------------
 .../GroovyLineCheckerConfiguration.java       |  5 ---
 .../fr/inra/oresing/model/Configuration.java  |  6 ----
 .../checker/GroovyLineCheckerTest.java        | 20 ------------
 .../data/monsore/monsore-with-repository.yaml | 28 ++++++++---------
 src/test/resources/data/monsore/monsore.yaml  | 28 ++++++++---------
 6 files changed, 31 insertions(+), 87 deletions(-)

diff --git a/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java b/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
index 4f945499b..8bdb02b76 100644
--- a/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
+++ b/src/main/java/fr/inra/oresing/checker/GroovyLineChecker.java
@@ -46,11 +46,7 @@ public class GroovyLineChecker implements LineChecker<GroovyLineCheckerConfigura
                 .map(DecoratorConfiguration::getReferences);
         Optional<String> configurationDataTypes = Optional.empty();
         ImmutableMap<String, Object> context = buildContext(datum, application, repository, configurationReferences, configurationDataTypes);
-        ImmutableMap<String, Object> contextWithParams = ImmutableMap.<String, Object>builder()
-                .putAll(context)
-                .put("params", params)
-                .build();
-        return contextWithParams;
+        return context;
     }
 
     public static ImmutableMap<String, Object> buildContext(Object datum, Application application, Configuration.VariableComponentDescriptionConfiguration params, OreSiRepository.RepositoryForApplication repository) {
@@ -58,11 +54,7 @@ public class GroovyLineChecker implements LineChecker<GroovyLineCheckerConfigura
                 .map(Configuration.VariableComponentDescriptionConfiguration::getReferences);
         Optional<String> configurationDataTypes = Optional.empty();
         ImmutableMap<String, Object> context = buildContext(datum, application, repository, configurationReferences, configurationDataTypes);
-        ImmutableMap<String, Object> contextWithParams = ImmutableMap.<String, Object>builder()
-                .putAll(context)
-                .put("params", params)
-                .build();
-        return contextWithParams;
+        return context;
     }
 
     public static ImmutableMap<String, Object> buildContext(Object datum, Application application, GroovyLineCheckerConfiguration params, OreSiRepository.RepositoryForApplication repository) {
@@ -71,24 +63,7 @@ public class GroovyLineChecker implements LineChecker<GroovyLineCheckerConfigura
         Optional<String> configurationDataTypes = Optional.of(params)
                 .map(GroovyLineCheckerConfiguration::getDatatypes);
         ImmutableMap<String, Object> context = buildContext(datum, application, repository, configurationReferences, configurationDataTypes);
-        Map<String, String> paramsTest = new LinkedHashMap<>();
-        if (params.getVariable() != null) {
-            paramsTest.put("variable", params.getVariable());
-        }
-        if (params.getCodeVariable() != null) {
-            paramsTest.put("codeVariable", params.getCodeVariable());
-        }
-        if (params.getComponent() != null) {
-            paramsTest.put("component", params.getComponent());
-        }
-        if (params.getDatatype() != null) {
-            paramsTest.put("datatype", params.getDatatype());
-        }
-        ImmutableMap<String, Object> contextWithParams = ImmutableMap.<String, Object>builder()
-                .putAll(context)
-                .put("params", paramsTest)
-                .build();
-        return contextWithParams;
+        return context;
     }
 
     private static ImmutableMap<String, Object> buildContext(Object datum, Application application, OreSiRepository.RepositoryForApplication repository, Optional<String> configurationReferences, Optional<String> configurationDataTypes) {
diff --git a/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
index 927b2cdb2..ccd2447c5 100644
--- a/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
@@ -6,9 +6,4 @@ public interface GroovyLineCheckerConfiguration extends LineCheckerConfiguration
     String getReferences();
 
     String getDatatypes();
-
-    String getVariable();
-    String getCodeVariable();
-    String getComponent();
-    String getDatatype();
 }
diff --git a/src/main/java/fr/inra/oresing/model/Configuration.java b/src/main/java/fr/inra/oresing/model/Configuration.java
index 8c1540fd3..e10a26621 100644
--- a/src/main/java/fr/inra/oresing/model/Configuration.java
+++ b/src/main/java/fr/inra/oresing/model/Configuration.java
@@ -256,12 +256,6 @@ public class Configuration {
         String groovy;
         boolean codify;
         boolean required;
-
-
-        String datatype;
-        String variable;
-        String codeVariable;
-        String component;
     }
 
     @Getter
diff --git a/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java b/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
index caec53616..3d0939d7f 100644
--- a/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
+++ b/src/test/java/fr/inra/oresing/checker/GroovyLineCheckerTest.java
@@ -116,26 +116,6 @@ public class GroovyLineCheckerTest {
                 return null;
             }
 
-            @Override
-            public String getDatatype() {
-                return null;
-            }
-
-            @Override
-            public String getVariable() {
-                return null;
-            }
-
-            @Override
-            public String getCodeVariable() {
-                return null;
-            }
-
-            @Override
-            public String getComponent() {
-                return null;
-            }
-
             @Override
             public boolean isCodify() {
                 throw new UnsupportedOperationException("doublure de test");
diff --git a/src/test/resources/data/monsore/monsore-with-repository.yaml b/src/test/resources/data/monsore/monsore-with-repository.yaml
index d6d755471..892ffbb53 100644
--- a/src/test/resources/data/monsore/monsore-with-repository.yaml
+++ b/src/test/resources/data/monsore/monsore-with-repository.yaml
@@ -421,30 +421,30 @@ dataTypes:
           name: GroovyExpression
           params:
             expression: >
+              String datatype = "piegeage_en_montee";
+              String variable = "Couleur des individus";
+              String codeVariable = "couleur_des_individus";
+              String component = "unit";
               return referencesValues.get("variables_et_unites_par_types_de_donnees")
-              .findAll{it.get("nom du type de données").equals(params.get("datatype"))}
-              .find{it.get("nom de la variable").equals(params.get("codeVariable"))}
-              .get("nom de l'unité").equals(datum.get(params.get("variable")).get(params.get("component")));
+              .findAll{it.get("nom du type de données").equals(datatype)}
+              .find{it.get("nom de la variable").equals(codeVariable)}
+              .get("nom de l'unité").equals(datum.get(variable).get(component));
             references: variables_et_unites_par_types_de_donnees
-            datatype: "piegeage_en_montee"
-            variable: "Couleur des individus"
-            codeVariable: couleur_des_individus
-            component: unit
       unitOfIndividus:
         description: "vérifie l'unité du nombre d'individus"
         checker:
           name: GroovyExpression
           params:
             expression: >
+              String datatype = "piegeage_en_montee";
+              String variable = "Nombre d'individus";
+              String codeVariable = "nombre_d_individus";
+              String component = "unit";
               return referencesValues.get("variables_et_unites_par_types_de_donnees")
-              .findAll{it.get("nom du type de données").equals(params.get("datatype"))}
-              .find{it.get("nom de la variable").equals(params.get("codeVariable"))}
-              .get("nom de l'unité").equals(datum.get(params.get("variable")).get(params.get("component")));
+              .findAll{it.get("nom du type de données").equals(datatype)}
+              .find{it.get("nom de la variable").equals(codeVariable)}
+              .get("nom de l'unité").equals(datum.get(variable).get(component));
             references: variables_et_unites_par_types_de_donnees
-            datatype: "piegeage_en_montee"
-            variable: "Nombre d'individus"
-            codeVariable: nombre_d_individus
-            component: unit
     format:
       headerLine: 4
       firstRowLine: 5
diff --git a/src/test/resources/data/monsore/monsore.yaml b/src/test/resources/data/monsore/monsore.yaml
index f11cc867b..bba2c8793 100644
--- a/src/test/resources/data/monsore/monsore.yaml
+++ b/src/test/resources/data/monsore/monsore.yaml
@@ -419,30 +419,30 @@ dataTypes:
           name: GroovyExpression
           params:
             expression: >
+              String datatype = "piegeage_en_montee";
+              String variable = "Couleur des individus";
+              String codeVariable = "couleur_des_individus";
+              String component = "unit";
               return referencesValues.get("variables_et_unites_par_types_de_donnees")
-              .findAll{it.get("nom du type de données").equals(params.get("datatype"))}
-              .find{it.get("nom de la variable").equals(params.get("codeVariable"))}
-              .get("nom de l'unité").equals(datum.get(params.get("variable")).get(params.get("component")));
+              .findAll{it.get("nom du type de données").equals(datatype)}
+              .find{it.get("nom de la variable").equals(codeVariable)}
+              .get("nom de l'unité").equals(datum.get(variable).get(component));
             references: variables_et_unites_par_types_de_donnees
-            datatype: "piegeage_en_montee"
-            variable: "Couleur des individus"
-            codeVariable: couleur_des_individus
-            component: unit
       unitOfIndividus:
         description: "vérifie l'unité du nombre d'individus"
         checker:
           name: GroovyExpression
           params:
             expression: >
+              String datatype = "piegeage_en_montee";
+              String variable = "Nombre d'individus";
+              String codeVariable = "nombre_d_individus";
+              String component = "unit";
               return referencesValues.get("variables_et_unites_par_types_de_donnees")
-              .findAll{it.get("nom du type de données").equals(params.get("datatype"))}
-              .find{it.get("nom de la variable").equals(params.get("codeVariable"))}
-              .get("nom de l'unité").equals(datum.get(params.get("variable")).get(params.get("component")));
+              .findAll{it.get("nom du type de données").equals(datatype)}
+              .find{it.get("nom de la variable").equals(codeVariable)}
+              .get("nom de l'unité").equals(datum.get(variable).get(component));
             references: variables_et_unites_par_types_de_donnees
-            datatype: "piegeage_en_montee"
-            variable: "Nombre d'individus"
-            codeVariable: nombre_d_individus
-            component: unit
     format:
       headerLine: 4
       firstRowLine: 5
-- 
GitLab


From 015a89870032dea46a59bbeb391db3cfda9d1f9c Mon Sep 17 00:00:00 2001
From: Brendan Le Ny <bleny@codelutin.com>
Date: Thu, 3 Feb 2022 16:49:17 +0100
Subject: [PATCH 4/5] Documentation des configurations de checkers

---
 .../checker/DateLineCheckerConfiguration.java |  9 +++++++++
 .../checker/FloatCheckerConfiguration.java    |  3 +++
 .../GroovyLineCheckerConfiguration.java       | 15 ++++++++++++++
 .../checker/IntegerCheckerConfiguration.java  |  3 +++
 .../checker/LineCheckerConfiguration.java     |  3 +++
 .../ReferenceLineCheckerConfiguration.java    |  8 ++++++++
 ...RegularExpressionCheckerConfiguration.java |  6 ++++++
 .../decorators/DecoratorConfiguration.java    | 20 +++++++++++++++++++
 8 files changed, 67 insertions(+)

diff --git a/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
index 16114fc9f..32d38cfe9 100644
--- a/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/DateLineCheckerConfiguration.java
@@ -1,8 +1,17 @@
 package fr.inra.oresing.checker;
 
+/**
+ * Configuration pour un checker de type "Date"
+ */
 public interface DateLineCheckerConfiguration extends LineCheckerConfiguration {
 
+    /**
+     * Le format dans lequel doit être la la date qui sera validée (par exemple, "dd/MM/yyyy")
+     */
     String getPattern();
 
+    /**
+     * La {@link fr.inra.oresing.model.Duration} pour cette donnée.
+     */
     String getDuration();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/FloatCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/FloatCheckerConfiguration.java
index 352156dd5..34bfa14f7 100644
--- a/src/main/java/fr/inra/oresing/checker/FloatCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/FloatCheckerConfiguration.java
@@ -1,4 +1,7 @@
 package fr.inra.oresing.checker;
 
+/**
+ * Configuration pour un checker de type nombre à virgule
+ */
 public interface FloatCheckerConfiguration extends LineCheckerConfiguration {
 }
diff --git a/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
index ccd2447c5..6e6449feb 100644
--- a/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/GroovyLineCheckerConfiguration.java
@@ -1,9 +1,24 @@
 package fr.inra.oresing.checker;
 
+/**
+ * Configuration pour un checker de type "Expression Groovy"
+ */
 public interface GroovyLineCheckerConfiguration extends LineCheckerConfiguration {
+
+    /**
+     * L'expression groovy elle-même. Elle doit retourner un booléen.
+     */
     String getExpression();
 
+    /**
+     * Les référentiels qui devront être chargés puis injectés dans le contexte au moment de
+     * l'évaluation de l'expression {@link #getExpression()}
+     */
     String getReferences();
 
+    /**
+     * Les types de données qui devront être chargées puis injectés dans le contexte au moment de
+     * l'évaluation de l'expression {@link #getExpression()}
+     */
     String getDatatypes();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/IntegerCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/IntegerCheckerConfiguration.java
index a70f0a547..38664cb81 100644
--- a/src/main/java/fr/inra/oresing/checker/IntegerCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/IntegerCheckerConfiguration.java
@@ -1,4 +1,7 @@
 package fr.inra.oresing.checker;
 
+/**
+ * Configuration pour un checker de type nombre entier
+ */
 public interface IntegerCheckerConfiguration extends LineCheckerConfiguration {
 }
diff --git a/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
index a908fb5ec..fd33c6364 100644
--- a/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/LineCheckerConfiguration.java
@@ -2,5 +2,8 @@ package fr.inra.oresing.checker;
 
 import fr.inra.oresing.checker.decorators.DecoratorConfiguration;
 
+/**
+ * Indique qu'un objet a vocation à contenir des paramètres de configuration pour configurer un {@link LineChecker}
+ */
 public interface LineCheckerConfiguration extends DecoratorConfiguration {
 }
diff --git a/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
index d7b109d73..eaa05911d 100644
--- a/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/ReferenceLineCheckerConfiguration.java
@@ -1,5 +1,13 @@
 package fr.inra.oresing.checker;
 
+/**
+ * Configuration pour un checker de type "Reference" qui permet de s'assurer qu'une donnée
+ * est bien une valeur parmi celle du référentiel.
+ */
 public interface ReferenceLineCheckerConfiguration extends LineCheckerConfiguration {
+
+    /**
+     * Le référentiel dans lequel la valeur vérifiée devra être contenu
+     */
     String getRefType();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java b/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java
index 9d735ab74..064c5e2de 100644
--- a/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/RegularExpressionCheckerConfiguration.java
@@ -1,6 +1,12 @@
 package fr.inra.oresing.checker;
 
+/**
+ * Configuration pour un checker de type expression régulière
+ */
 public interface RegularExpressionCheckerConfiguration extends LineCheckerConfiguration {
 
+    /**
+     * L'expression régulière à laquelle doit être conforme la valeur qui sera vérifiée.
+     */
     String getPattern();
 }
diff --git a/src/main/java/fr/inra/oresing/checker/decorators/DecoratorConfiguration.java b/src/main/java/fr/inra/oresing/checker/decorators/DecoratorConfiguration.java
index 7cbc7bfb9..f725b6ecb 100644
--- a/src/main/java/fr/inra/oresing/checker/decorators/DecoratorConfiguration.java
+++ b/src/main/java/fr/inra/oresing/checker/decorators/DecoratorConfiguration.java
@@ -1,8 +1,28 @@
 package fr.inra.oresing.checker.decorators;
 
+/**
+ * Configuration de la décoration d'une donnée.
+ */
 public interface DecoratorConfiguration {
+
+    /**
+     * Indique que la donnée doit être transformée pour subir un échappement afin d'être utilisable comme clé
+     */
     boolean isCodify();
+
+    /**
+     * Indique que la validation doit remonter une erreur si donnée est absente
+     */
     boolean isRequired();
+
+    /**
+     * Avant d'être vérifiée, la donnée doit être transformée en appliquant cette expression.
+     */
     String getGroovy();
+
+    /**
+     * Les référentiels qui devront être chargés puis injectés dans le contexte au moment de
+     * l'évaluation de l'expression {@link #getGroovy()}
+     */
     String getReferences();
 }
-- 
GitLab


From 7409e7de95efe40eb5a1a3c017ac13d50c80a5d9 Mon Sep 17 00:00:00 2001
From: Brendan Le Ny <bleny@codelutin.com>
Date: Fri, 4 Feb 2022 12:28:10 +0100
Subject: [PATCH 5/5] Corrige la documentation, injecter des 'params' inconnus
 dans le contexte Groovy n'est plus permis

---
 Documentation_fichier_Yaml.md | 7 -------
 1 file changed, 7 deletions(-)

diff --git a/Documentation_fichier_Yaml.md b/Documentation_fichier_Yaml.md
index 733ed2fe4..d5fd3b58b 100644
--- a/Documentation_fichier_Yaml.md
+++ b/Documentation_fichier_Yaml.md
@@ -339,7 +339,6 @@ Pour les checkers GroovyExpression, on récupère dans le script des information
       -> datatypes.get("nom du datatype").getValues().get("nom de la variable").get("nom du composant")
     datatypesValues : idem que datatypes
       -> datatypesValues.get("nom du datatype").get("nom de la variable").get("nom du composant")
-    params : la section params dans laquelle on peut rajouter des information que l'on souhaite utiliser dans le script..
 
 
 ``` yaml
@@ -354,12 +353,6 @@ Pour les checkers GroovyExpression, on récupère dans le script des information
               .find{it.get("nom de la variable").equals(params.get("codeVariable"))}
               .get("nom de l'unité").equals(datum.get(params.get("variable")).get(params.get("component")));
             references: variables_et_unites_par_types_de_donnees
-            datatype: "piegeage_en_montee"
-            variable: "Nombre d'individus"
-            codeVariable: nombre_d_individus
-            component: unit
-
-
 ``` 
 Cette formulation vérifie que la valeur du component qualité de la variable SWC est vide ou égale à 0,1 ou 2
 L'expression doit renvoyer true
-- 
GitLab