From 78e20b1ef167cca871497314ec344963c3afcb84 Mon Sep 17 00:00:00 2001 From: Jon Bratseth Date: Thu, 15 Jun 2017 13:12:24 +0200 Subject: Provide xml form --- .../application/api/ValidationOverrides.java | 44 +++++++++++++++++++--- .../application/api/ValidationOverrideTest.java | 32 +++++++++------- 2 files changed, 57 insertions(+), 19 deletions(-) (limited to 'config-model-api') 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 9fd2b7f2bf8..edcc4abb700 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 @@ -2,9 +2,11 @@ package com.yahoo.config.application.api; import com.google.common.collect.ImmutableList; +import com.yahoo.io.IOUtils; import com.yahoo.text.XML; import org.w3c.dom.Element; +import java.io.IOException; import java.io.Reader; import java.time.Duration; import java.time.Instant; @@ -29,6 +31,8 @@ public class ValidationOverrides { /** Instant to use as "now". This is a field to allow unit testing. */ private final Instant now; + + private final String xmlForm; /** Creates validation overrides for the current instant */ public ValidationOverrides(List overrides) { @@ -36,8 +40,13 @@ public class ValidationOverrides { } public ValidationOverrides(List overrides, Instant now) { + this(overrides, now, null); + } + + private ValidationOverrides(List overrides, Instant now, String xmlForm) { this.overrides = ImmutableList.copyOf(overrides); this.now = now; + this.xmlForm = xmlForm; for (Allow override : overrides) if (now.plus(Duration.ofDays(30)).isBefore(override.until)) throw new IllegalArgumentException(override + " is too far in the future: Max 30 days is allowed"); @@ -63,7 +72,12 @@ public class ValidationOverrides { return false; } - public static ValidationOverrides empty() { return new ValidationOverrides(ImmutableList.of()); } + /** Returns the XML form of this, or null if it was not created by fromXml, nor is empty */ + public String xmlForm() { return xmlForm; } + + public static ValidationOverrides empty() { + return new ValidationOverrides(ImmutableList.of(), Instant.now(), ""); + } /** * Returns a ValidationOverrides instance with the content of the given Reader. @@ -74,22 +88,40 @@ public class ValidationOverrides { * @return a ValidationOverrides from the argument * @throws IllegalArgumentException if the validation-allows.xml file exists but is invalid */ - public static ValidationOverrides read(Optional reader, Instant now) { - if ( ! reader.isPresent()) return ValidationOverrides.empty(); + public static ValidationOverrides fromXml(Optional reader, Instant now) { + try { + if ( ! reader.isPresent()) return ValidationOverrides.empty(); + return fromXml(IOUtils.readAll(reader.get()), now); + } catch (IOException e) { + throw new IllegalArgumentException("Could not read deployment spec", e); + } + } + + /** + * Returns a ValidationOverrides instance with the content of the given XML string. + * An empty ValidationOverrides is returned if the argument is empty. + * + * @param xmlForm the string which optionally contains a validation-overrides XML structure + * @param now the instant to use as "now", settable for unit testing + * @return a ValidationOverrides from the argument + * @throws IllegalArgumentException if the validation-allows.xml file exists but is invalid + */ + public static ValidationOverrides fromXml(String xmlForm, Instant now) { + if ( xmlForm.isEmpty()) return ValidationOverrides.empty(); try { // Assume valid structure is ensured by schema validation - Element root = XML.getDocument(reader.get()).getDocumentElement(); + Element root = XML.getDocument(xmlForm).getDocumentElement(); List overrides = new ArrayList<>(); for (Element allow : XML.getChildren(root, "allow")) { Instant until = LocalDate.parse(allow.getAttribute("until"), DateTimeFormatter.ISO_DATE) .atStartOfDay().atZone(ZoneOffset.UTC).toInstant() .plus(Duration.ofDays(1)); // Make the override valid *on* the "until" date Optional validationId = ValidationId.from(XML.getValue(allow)); - if (validationId.isPresent()) // skip unknonw ids as they may be valid for other model versions + if (validationId.isPresent()) // skip unknown ids as they may be valid for other model versions overrides.add(new ValidationOverrides.Allow(validationId.get(), until)); } - return new ValidationOverrides(overrides, now); + return new ValidationOverrides(overrides, now, xmlForm); } catch (IllegalArgumentException e) { throw new IllegalArgumentException("validation-overrides is invalid", e); 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 2528fe8883e..919d52ac811 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 @@ -1,8 +1,6 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.config.application.api; -import com.yahoo.config.application.api.ValidationId; -import com.yahoo.config.application.api.ValidationOverrides; import com.yahoo.test.ManualClock; import org.junit.Assert; import org.junit.Test; @@ -10,9 +8,9 @@ import org.xml.sax.SAXException; import java.io.IOException; import java.io.StringReader; +import java.time.Clock; import java.util.Optional; -import static org.junit.Assert.fail; import static org.junit.Assert.assertEquals; /** @@ -27,27 +25,28 @@ public class ValidationOverrideTest { " indexing-change" + " indexing-mode-change" + ""; - { - ValidationOverrides overrides = ValidationOverrides.read(Optional.of(new StringReader(validationOverrides)), - ManualClock.at("2000-01-01T23:59:00")); + ValidationOverrides overrides = ValidationOverrides.fromXml(Optional.of(new StringReader(validationOverrides)), + ManualClock.at("2000-01-01T23:59:00")); assertOverridden("indexing-change", overrides); assertOverridden("indexing-mode-change", overrides); assertNotOverridden("field-type-change", overrides); + + assertEquals(validationOverrides, overrides.xmlForm()); } { - ValidationOverrides overrides = ValidationOverrides.read(Optional.of(new StringReader(validationOverrides)), - ManualClock.at("2000-01-02T00:00:00")); + ValidationOverrides overrides = ValidationOverrides.fromXml(Optional.of(new StringReader(validationOverrides)), + ManualClock.at("2000-01-02T00:00:00")); assertNotOverridden("indexing-change", overrides); assertOverridden("indexing-mode-change", overrides); assertNotOverridden("field-type-change", overrides); } { - ValidationOverrides overrides = ValidationOverrides.read(Optional.of(new StringReader(validationOverrides)), - ManualClock.at("2000-01-04T00:00:00")); + ValidationOverrides overrides = ValidationOverrides.fromXml(Optional.of(new StringReader(validationOverrides)), + ManualClock.at("2000-01-04T00:00:00")); assertNotOverridden("indexing-change", overrides); assertNotOverridden("indexing-mode-change", overrides); assertNotOverridden("field-type-change", overrides); @@ -63,8 +62,8 @@ public class ValidationOverrideTest { ""; try { - ValidationOverrides.read(Optional.of(new StringReader(validationOverrides)), - ManualClock.at("2000-01-01T23:59:00")); + ValidationOverrides.fromXml(Optional.of(new StringReader(validationOverrides)), + ManualClock.at("2000-01-01T23:59:00")); Assert.fail("Expected validation interval override validation validation failure"); } catch (IllegalArgumentException e) { @@ -73,6 +72,13 @@ public class ValidationOverrideTest { e.getCause().getMessage()); } } + + @Test + public void testEmpty() { + ValidationOverrides empty = ValidationOverrides.empty(); + ValidationOverrides emptyReserialized = ValidationOverrides.fromXml(empty.xmlForm(), Clock.systemUTC().instant()); + assertEquals(empty.xmlForm(), emptyReserialized.xmlForm()); + } private void assertOverridden(String validationId, ValidationOverrides overrides) { overrides.invalid(ValidationId.from(validationId).get(), "message"); // should not throw exception @@ -86,5 +92,5 @@ public class ValidationOverrideTest { catch (ValidationOverrides.ValidationException expected) { } } - + } -- cgit v1.2.3