diff options
author | Harald Musum <musum@yahooinc.com> | 2023-09-07 12:25:37 +0200 |
---|---|---|
committer | Harald Musum <musum@yahooinc.com> | 2023-09-07 12:25:37 +0200 |
commit | cac205f35b56d0bd584013b79b88a6635dee5ab4 (patch) | |
tree | bcf8461b3091c44ae78e5d9355a2109ba7d6a77a /config | |
parent | daba552c567f1fcb9e300ae65825c1d97cedbb5e (diff) |
Support optional 'path' config type
Initial work needed for this to work (config definition and config library)
Diffstat (limited to 'config')
7 files changed, 34 insertions, 4 deletions
diff --git a/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java b/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java index e86b13b2c98..0dbc40a246c 100644 --- a/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java +++ b/config/src/main/java/com/yahoo/vespa/config/ConfigPayloadApplier.java @@ -21,6 +21,7 @@ import java.util.Deque; import java.util.HashMap; import java.util.HashSet; import java.util.Map; +import java.util.Optional; import java.util.Set; import java.util.logging.Logger; @@ -213,7 +214,10 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> { Inspector value = (Inspector)rawValue; if (isPathField(builder, methodName)) return resolvePath(value.asString()); - else if (isUrlField(builder, methodName)) + if (isOptionalPathField(builder, methodName)) { + String v = value.asString(); + return resolvePath(v.isEmpty() ? Optional.empty() : Optional.of(v)); + } else if (isUrlField(builder, methodName)) return value.asString().isEmpty() ? "" : resolveUrl(value.asString()); else if (isModelField(builder, methodName)) return value.asString().isEmpty() ? "" : resolveModel(value.asString()); @@ -234,6 +238,10 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> { return new FileReference(path.toString()); } + private Optional<FileReference> resolvePath(Optional<String> value) { + return value.isEmpty() ? Optional.empty() : Optional.of(resolvePath(value.get())); + } + private UrlReference resolveUrl(String url) { if ( ! isClientside()) return new UrlReference(url); File file = urlDownloader.waitFor(new UrlReference(url), 60 * 60); @@ -319,6 +327,16 @@ public class ConfigPayloadApplier<T extends ConfigInstance.Builder> { return isFieldType(pathFieldSet, builder, methodName, FileReference.class); } + /** + * Checks if this field is of type 'path', in which + * case some special handling might be needed. Caches the result. + */ + private final Set<String> optionalPathFieldSet = new HashSet<>(); + private boolean isOptionalPathField(Object builder, String methodName) { + // Paths are stored as Optional<FileReference> in Builder. + return isFieldType(optionalPathFieldSet, builder, methodName, Optional.class); + } + private final Set<String> urlFieldSet = new HashSet<>(); private boolean isUrlField(Object builder, String methodName) { // Urls are stored as UrlReference in Builder. diff --git a/config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java b/config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java index a6273ad5ccb..0e50be83e7a 100644 --- a/config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java +++ b/config/src/test/java/com/yahoo/config/subscription/CfgConfigPayloadBuilderTest.java @@ -34,6 +34,7 @@ public class CfgConfigPayloadBuilderTest { " 'parent:'", " ],", " 'pathVal': 'src/test/resources/configs/def-files/function-test.def',", + " 'optionalPathVal': 'src/test/resources/configs/def-files/function-test.def',", " 'string_val': 'foo',", " 'myStructMap': {", " 'one': {", diff --git a/config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java b/config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java index c656bfe1a60..f09462eb634 100644 --- a/config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java +++ b/config/src/test/java/com/yahoo/config/subscription/ConfigInstancePayloadTest.java @@ -13,6 +13,7 @@ import org.junit.Test; import java.io.File; import java.util.Arrays; import java.util.List; +import java.util.Optional; import static com.yahoo.foo.FunctionTestConfig.*; import static org.junit.Assert.assertNotNull; @@ -46,6 +47,7 @@ public class ConfigInstancePayloadTest { refwithdef(":parent:"). fileVal("etc"). pathVal(FileReference.mockFileReferenceForUnitTesting(new File("src/test/resources/configs/def-files/function-test.def"))). + optionalPathVal(Optional.of(FileReference.mockFileReferenceForUnitTesting(new File("src/test/resources/configs/def-files/function-test.def")))). boolarr(false). longarr(9223372036854775807L). longarr(-9223372036854775808L). diff --git a/config/src/test/java/com/yahoo/config/subscription/FunctionTest.java b/config/src/test/java/com/yahoo/config/subscription/FunctionTest.java index 8656c0e945f..7a3b0e437f2 100644 --- a/config/src/test/java/com/yahoo/config/subscription/FunctionTest.java +++ b/config/src/test/java/com/yahoo/config/subscription/FunctionTest.java @@ -30,7 +30,7 @@ public class FunctionTest { public static final String PATH = "src/test/resources/configs/function-test/"; private FunctionTestConfig config; - private ConfigSourceSet sourceSet = new ConfigSourceSet("function-test"); + private final ConfigSourceSet sourceSet = new ConfigSourceSet("function-test"); public void configure(FunctionTestConfig config, ConfigSourceSet sourceSet) { this.config = config; @@ -222,6 +222,8 @@ public class FunctionTest { assertEquals(":parent", config.refarr(1)); assertEquals("parent:", config.refarr(2)); assertEquals("bin", config.fileArr(0).value()); + assertEquals("function-test.def", config.pathVal().toFile().getName()); + assertEquals("function-test.def", config.optionalPathVal().get().toFile().getName()); // TODO assertEquals("pom.xml", config.pathArr(0).toString()); assertEquals("pom.xml", config.pathMap("one").toString()); diff --git a/config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java b/config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java index a9f09951d7e..fa1ec815047 100644 --- a/config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java +++ b/config/src/test/java/com/yahoo/vespa/config/ConfigDefinitionBuilderTest.java @@ -77,10 +77,14 @@ public class ConfigDefinitionBuilderTest { assertThat(def.getFileDefs().size(), is(1)); assertNotNull(def.getFileDefs().get("fileVal")); - assertThat(def.getArrayDefs().size(), is(9)); + // An array does not have to have any elements set + assertThat(def.getArrayDefs().size(), is(10)); assertNotNull(def.getArrayDefs().get("boolarr")); assertThat(def.getArrayDefs().get("boolarr").getTypeSpec().getType(), is("bool")); + assertNotNull(def.getArrayDefs().get("boolarrEmpty")); + assertThat(def.getArrayDefs().get("boolarrEmpty").getTypeSpec().getType(), is("bool")); + assertNotNull(def.getArrayDefs().get("enumarr")); assertThat(def.getArrayDefs().get("enumarr").getTypeSpec().getType(), is("enum")); assertThat(def.getArrayDefs().get("enumarr").getTypeSpec().getEnumVals().toString(), is("[ARRAY, VALUES]")); diff --git a/config/src/test/resources/configs/def-files/function-test.def b/config/src/test/resources/configs/def-files/function-test.def index 4c4cb6bf08b..b97713b18f3 100644 --- a/config/src/test/resources/configs/def-files/function-test.def +++ b/config/src/test/resources/configs/def-files/function-test.def @@ -42,8 +42,10 @@ refval reference refwithdef reference default=":parent:" fileVal file pathVal path +optionalPathVal path optional boolarr[] bool +boolarrEmpty[] bool intarr[] int longarr[] long doublearr[] double diff --git a/config/src/test/resources/configs/function-test/variableaccess.txt b/config/src/test/resources/configs/function-test/variableaccess.txt index 997de21750d..8c2cadcdbbc 100644 --- a/config/src/test/resources/configs/function-test/variableaccess.txt +++ b/config/src/test/resources/configs/function-test/variableaccess.txt @@ -14,7 +14,8 @@ enumwithdef BAR2 refval :parent: refwithdef ":parent:" fileVal "etc" -pathVal "pom.xml" +pathVal "function-test.def" +optionalPathVal "function-test.def" boolarr[1] boolarr[0] false intarr[0] |