From d02469096d4bf5b0bc742e5ec978f9f8cc873eda Mon Sep 17 00:00:00 2001 From: Jon Marius Venstad Date: Fri, 5 Jan 2024 08:05:47 +0100 Subject: Revert "Revert "Jonmv/refactor validation" MERGEOK" --- config-model-api/abi-spec.json | 2 ++ .../application/api/ValidationOverrides.java | 32 +++++++++++++++++----- .../application/api/ValidationOverrideTest.java | 4 +-- 3 files changed, 29 insertions(+), 9 deletions(-) (limited to 'config-model-api') diff --git a/config-model-api/abi-spec.json b/config-model-api/abi-spec.json index e1081ebec99..79283641074 100644 --- a/config-model-api/abi-spec.json +++ b/config-model-api/abi-spec.json @@ -786,8 +786,10 @@ "public void (java.util.List)", "public void invalid(java.util.Map, java.time.Instant)", "public void invalid(com.yahoo.config.application.api.ValidationId, java.lang.String, java.time.Instant)", + "public java.util.Optional invalidException(java.util.Map, java.time.Instant)", "public boolean allows(java.lang.String, java.time.Instant)", "public boolean allows(com.yahoo.config.application.api.ValidationId, java.time.Instant)", + "public void validate(java.time.Instant, java.util.function.Consumer)", "public boolean validate(java.time.Instant)", "public java.lang.String xmlForm()", "public static java.lang.String toAllowMessage(com.yahoo.config.application.api.ValidationId)", diff --git a/config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java b/config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java index 7b52d825473..ab722dfb919 100644 --- a/config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java +++ b/config-model-api/src/main/java/com/yahoo/config/application/api/ValidationOverrides.java @@ -19,6 +19,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.function.Consumer; import java.util.stream.Collectors; /** @@ -49,10 +50,7 @@ public class ValidationOverrides { /** Throws a ValidationException unless all given validation is overridden at this time */ public void invalid(Map> messagesByValidationId, Instant now) { - Map> disallowed = new HashMap<>(messagesByValidationId); - disallowed.keySet().removeIf(id -> allows(id, now)); - if ( ! disallowed.isEmpty()) - throw new ValidationException(disallowed); + invalidException(messagesByValidationId, now).ifPresent(e -> { throw e; }); } /** Throws a ValidationException unless this validation is overridden at this time */ @@ -61,6 +59,21 @@ public class ValidationOverrides { throw new ValidationException(validationId, message); } + public Optional invalidException(Map> messagesByValidationId, Instant now) { + Map> disallowed = new HashMap<>(messagesByValidationId); + disallowed.keySet().removeIf(id -> allows(id, now)); + + if (disallowed.size() == 1 && disallowed.values().iterator().next().size() == 1) // Single-message form if possible. + return Optional.of(new ValidationException(disallowed.keySet().iterator().next(), + disallowed.values().iterator().next().iterator().next())); + + if ( ! disallowed.isEmpty()) + return Optional.of(new ValidationException(disallowed)); + + return Optional.empty(); + } + + // TODO: remove after 8.284 is gone public boolean allows(String validationIdString, Instant now) { Optional validationId = ValidationId.from(validationIdString); if (validationId.isEmpty()) return false; // unknown id -> not allowed @@ -77,12 +90,17 @@ public class ValidationOverrides { } /** Validates overrides (checks 'until' date') */ - public boolean validate(Instant now) { + public void validate(Instant now, Consumer reporter) { for (Allow override : overrides) { if (now.plus(Duration.ofDays(30)).isBefore(override.until)) - throw new IllegalArgumentException("validation-overrides is invalid: " + override + - " is too far in the future: Max 30 days is allowed"); + reporter.accept("validation-overrides is invalid: " + override + + " is too far in the future: Max 30 days is allowed"); } + } + + /** Validates overrides (checks 'until' date') */ + public boolean validate(Instant now) { + validate(now, message -> { throw new IllegalArgumentException(message); }); return false; } diff --git a/config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java b/config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java index b1b7928c67a..417d7b2ff36 100644 --- a/config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java +++ b/config-model-api/src/test/java/com/yahoo/config/application/api/ValidationOverrideTest.java @@ -60,7 +60,7 @@ public class ValidationOverrideTest { try { ValidationOverrides overrides = ValidationOverrides.fromXml(new StringReader(validationOverrides)); Instant now = ManualClock.at("2000-01-01T23:59:00"); - overrides.allows("indexing-change", now); + overrides.allows(ValidationId.indexingChange, now); overrides.validate(now); Assert.fail("Expected validation interval override validation validation failure"); } @@ -80,7 +80,7 @@ public class ValidationOverrideTest { try { ValidationOverrides overrides = ValidationOverrides.fromXml(new StringReader(validationOverrides)); Instant now = ManualClock.at("2000-01-01T23:59:00"); - overrides.allows("indexing-change", now); + overrides.allows(ValidationId.indexingChange, now); overrides.validate(now); Assert.fail("Expected validation interval override validation validation failure"); } -- cgit v1.2.3