From cac205f35b56d0bd584013b79b88a6635dee5ab4 Mon Sep 17 00:00:00 2001 From: Harald Musum Date: Thu, 7 Sep 2023 12:25:37 +0200 Subject: Support optional 'path' config type Initial work needed for this to work (config definition and config library) --- .../main/java/com/yahoo/config/LeafNodeMaps.java | 9 +++ .../main/java/com/yahoo/config/LeafNodeVector.java | 8 +++ .../java/com/yahoo/config/OptionalPathNode.java | 84 ++++++++++++++++++++++ 3 files changed, 101 insertions(+) create mode 100644 config-lib/src/main/java/com/yahoo/config/OptionalPathNode.java (limited to 'config-lib/src/main/java') 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 asOptionalPathNodeMap(Map> fileReferenceMap) { + Map pathNodeMap = new LinkedHashMap<>(); + for (Map.Entry> e : fileReferenceMap.entrySet()) { + pathNodeMap.put(e.getKey(), new OptionalPathNode(e.getValue())); + } + return Collections.unmodifiableMap(pathNodeMap); + } + public static Map asUrlNodeMap(Map 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> extends NodeVecto return new LeafNodeVector<>(paths, new PathNode()); } + public static LeafNodeVector, OptionalPathNode> createOptionalPathNodeVector(Collection> values) { + List> paths = new ArrayList<>(); + for (Optional fileReference : values) + paths.add(fileReference.map(reference -> Paths.get(reference.value()))); + return new LeafNodeVector<>(paths, new OptionalPathNode()); + } + public static LeafNodeVector createUrlNodeVector(Collection values) { List 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> { + + private final Optional 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) { + super(true); + this.value = fileReference.map(reference -> Path.of(reference.value())); + this.fileReference = fileReference; + } + + public Optional 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 getFileReference() { + return fileReference; + } + + public static List> toFileReferences(List pathNodes) { + List> fileReferences = new ArrayList<>(); + for (OptionalPathNode pathNode : pathNodes) + fileReferences.add(pathNode.getFileReference()); + return fileReferences; + } + + public static Map> toFileReferenceMap(Map map) { + Map> ret = new LinkedHashMap<>(); + for (Map.Entry e : map.entrySet()) { + ret.put(e.getKey(), e.getValue().getFileReference()); + } + return ret; + } + +} -- cgit v1.2.3