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