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-lib | |
parent | daba552c567f1fcb9e300ae65825c1d97cedbb5e (diff) |
Support optional 'path' config type
Initial work needed for this to work (config definition and config library)
Diffstat (limited to 'config-lib')
4 files changed, 124 insertions, 0 deletions
diff --git a/config-lib/abi-spec.json b/config-lib/abi-spec.json index caae2ebf1cf..07e61c63237 100644 --- a/config-lib/abi-spec.json +++ b/config-lib/abi-spec.json @@ -273,6 +273,7 @@ "public static java.util.Map asNodeMap(java.util.Map, com.yahoo.config.LeafNode)", "public static java.util.Map asFileNodeMap(java.util.Map)", "public static java.util.Map asPathNodeMap(java.util.Map)", + "public static java.util.Map asOptionalPathNodeMap(java.util.Map)", "public static java.util.Map asUrlNodeMap(java.util.Map)", "public static java.util.Map asModelNodeMap(java.util.Map)" ], @@ -289,6 +290,7 @@ "public java.util.List asList()", "public static com.yahoo.config.LeafNodeVector createFileNodeVector(java.util.Collection)", "public static com.yahoo.config.LeafNodeVector createPathNodeVector(java.util.Collection)", + "public static com.yahoo.config.LeafNodeVector createOptionalPathNodeVector(java.util.Collection)", "public static com.yahoo.config.LeafNodeVector createUrlNodeVector(java.util.Collection)", "public static com.yahoo.config.LeafNodeVector createModelNodeVector(java.util.Collection)" ], @@ -420,6 +422,27 @@ "protected final java.util.ArrayList vector" ] }, + "com.yahoo.config.OptionalPathNode" : { + "superClass" : "com.yahoo.config.LeafNode", + "interfaces" : [ ], + "attributes" : [ + "public" + ], + "methods" : [ + "public void <init>()", + "public void <init>(com.yahoo.config.FileReference)", + "public void <init>(java.util.Optional)", + "public java.util.Optional value()", + "public java.lang.String getValue()", + "public java.lang.String toString()", + "protected boolean doSetValue(java.lang.String)", + "public java.util.Optional getFileReference()", + "public static java.util.List toFileReferences(java.util.List)", + "public static java.util.Map toFileReferenceMap(java.util.Map)", + "public bridge synthetic java.lang.Object value()" + ], + "fields" : [ ] + }, "com.yahoo.config.PathNode" : { "superClass" : "com.yahoo.config.LeafNode", "interfaces" : [ ], diff --git a/config-lib/src/main/java/com/yahoo/config/LeafNodeMaps.java b/config-lib/src/main/java/com/yahoo/config/LeafNodeMaps.java index 82663fa8bfd..214d8c52caa 100644 --- a/config-lib/src/main/java/com/yahoo/config/LeafNodeMaps.java +++ b/config-lib/src/main/java/com/yahoo/config/LeafNodeMaps.java @@ -4,6 +4,7 @@ package com.yahoo.config; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; +import java.util.Optional; import java.util.stream.Collectors; /** @@ -60,6 +61,14 @@ public class LeafNodeMaps { return Collections.unmodifiableMap(pathNodeMap); } + public static Map<String, OptionalPathNode> asOptionalPathNodeMap(Map<String, Optional<FileReference>> fileReferenceMap) { + Map<String, OptionalPathNode> pathNodeMap = new LinkedHashMap<>(); + for (Map.Entry<String, Optional<FileReference>> e : fileReferenceMap.entrySet()) { + pathNodeMap.put(e.getKey(), new OptionalPathNode(e.getValue())); + } + return Collections.unmodifiableMap(pathNodeMap); + } + public static Map<String, UrlNode> asUrlNodeMap(Map<String, UrlReference> urlReferenceMap) { return Collections.unmodifiableMap( urlReferenceMap.entrySet().stream().collect( diff --git a/config-lib/src/main/java/com/yahoo/config/LeafNodeVector.java b/config-lib/src/main/java/com/yahoo/config/LeafNodeVector.java index a4fea95088d..cfb8cd4eebd 100644 --- a/config-lib/src/main/java/com/yahoo/config/LeafNodeVector.java +++ b/config-lib/src/main/java/com/yahoo/config/LeafNodeVector.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.List; +import java.util.Optional; /** * A vector of leaf nodes. @@ -71,6 +72,13 @@ public class LeafNodeVector<REAL, NODE extends LeafNode<REAL>> extends NodeVecto return new LeafNodeVector<>(paths, new PathNode()); } + public static LeafNodeVector<Optional<Path>, OptionalPathNode> createOptionalPathNodeVector(Collection<Optional<FileReference>> values) { + List<Optional<Path>> paths = new ArrayList<>(); + for (Optional<FileReference> fileReference : values) + paths.add(fileReference.map(reference -> Paths.get(reference.value()))); + return new LeafNodeVector<>(paths, new OptionalPathNode()); + } + public static LeafNodeVector<File, UrlNode> createUrlNodeVector(Collection<UrlReference> values) { List<File> files = new ArrayList<>(); for (UrlReference urlReference : values) diff --git a/config-lib/src/main/java/com/yahoo/config/OptionalPathNode.java b/config-lib/src/main/java/com/yahoo/config/OptionalPathNode.java new file mode 100644 index 00000000000..8a6414d798f --- /dev/null +++ b/config-lib/src/main/java/com/yahoo/config/OptionalPathNode.java @@ -0,0 +1,84 @@ +// Copyright Yahoo. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.config; + +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; + +/** + * Represents a 'path' in a {@link ConfigInstance}, usually a filename, can be optional + * + * @author hmusum + */ +public class OptionalPathNode extends LeafNode<Optional<Path>> { + + private final Optional<FileReference> fileReference; + + public OptionalPathNode() { + fileReference = Optional.empty(); + } + + public OptionalPathNode(FileReference fileReference) { + super(true); + this.value = Optional.of(Path.of(fileReference.value())); + this.fileReference = Optional.of(fileReference); + } + + public OptionalPathNode(Optional<FileReference> fileReference) { + super(true); + this.value = fileReference.map(reference -> Path.of(reference.value())); + this.fileReference = fileReference; + } + + public Optional<Path> value() { + return value; + } + + @Override + public String getValue() { + return value.toString(); + } + + @Override + public String toString() { + return (value.isEmpty()) ? "(empty)" : '"' + value.get().toString() + '"'; + } + + @Override + protected boolean doSetValue(String stringVal) { + throw new UnsupportedOperationException("doSetValue should not be necessary anymore!"); + } + + @Override + void serialize(String name, Serializer serializer) { + value.ifPresent(path -> serializer.serialize(name, path.toString())); + } + + @Override + void serialize(Serializer serializer) { + value.ifPresent(path -> serializer.serialize(path.toString())); + } + + public Optional<FileReference> getFileReference() { + return fileReference; + } + + public static List<Optional<FileReference>> toFileReferences(List<OptionalPathNode> pathNodes) { + List<Optional<FileReference>> fileReferences = new ArrayList<>(); + for (OptionalPathNode pathNode : pathNodes) + fileReferences.add(pathNode.getFileReference()); + return fileReferences; + } + + public static Map<String, Optional<FileReference>> toFileReferenceMap(Map<String, OptionalPathNode> map) { + Map<String, Optional<FileReference>> ret = new LinkedHashMap<>(); + for (Map.Entry<String, OptionalPathNode> e : map.entrySet()) { + ret.put(e.getKey(), e.getValue().getFileReference()); + } + return ret; + } + +} |