diff options
Diffstat (limited to 'configgen/src/main/java')
4 files changed, 74 insertions, 8 deletions
diff --git a/configgen/src/main/java/com/yahoo/config/codegen/BuilderGenerator.java b/configgen/src/main/java/com/yahoo/config/codegen/BuilderGenerator.java index 6cd344466e4..12469d7a3ef 100644 --- a/configgen/src/main/java/com/yahoo/config/codegen/BuilderGenerator.java +++ b/configgen/src/main/java/com/yahoo/config/codegen/BuilderGenerator.java @@ -4,10 +4,12 @@ package com.yahoo.config.codegen; import com.yahoo.config.codegen.LeafCNode.FileLeaf; import com.yahoo.config.codegen.LeafCNode.ModelLeaf; import com.yahoo.config.codegen.LeafCNode.PathLeaf; +import com.yahoo.config.codegen.LeafCNode.OptionalPathLeaf; import com.yahoo.config.codegen.LeafCNode.UrlLeaf; import java.util.ArrayList; import java.util.List; +import java.util.Set; import java.util.stream.Collectors; import static com.yahoo.config.codegen.ConfigGenerator.boxedDataType; @@ -89,7 +91,9 @@ public class BuilderGenerator { private static String getUninitializedScalars(InnerCNode node) { List<String> scalarsWithoutDefault = new ArrayList<>(); for (CNode child : node.getChildren()) { - if (child instanceof LeafCNode && (!child.isArray && !child.isMap && ((LeafCNode) child).getDefaultValue() == null)) { + if (child instanceof LeafCNode + && (!child.isArray && !child.isMap && ((LeafCNode) child).getDefaultValue() == null) + && (! (child instanceof OptionalPathLeaf))) { scalarsWithoutDefault.add("\"" + child.getName() + "\""); } } @@ -109,7 +113,11 @@ public class BuilderGenerator { } else if (node instanceof InnerCNode) { return String.format("public %s %s = new %s();", builderType(node), node.getName(), builderType(node)); } else if (node instanceof LeafCNode) { - return String.format("private %s %s = null;", boxedBuilderType((LeafCNode) node), node.getName()); + String boxedBuilderType = boxedBuilderType((LeafCNode) node); + if (boxedBuilderType.startsWith("Optional<")) + return String.format("private %s %s = Optional.empty();", boxedBuilderType, node.getName()); + else + return String.format("private %s %s = null;", boxedBuilderType, node.getName()); } else { throw new IllegalStateException("Cannot produce builder field definition for node"); // Should not happen } @@ -207,6 +215,11 @@ public class BuilderGenerator { private static String privateLeafNodeSetter(LeafCNode n) { if ("String".equals(builderType(n)) || "FileReference".equals(builderType(n))) { return ""; + } else if ("Optional<FileReference>".equals(builderType(n))) { + return "\n\n" + // + "private Builder " + n.getName() + "(String " + INTERNAL_PREFIX + "value) {\n" + // + " return " + n.getName() + "(" + builderType(n) + ".of(" + INTERNAL_PREFIX + "value));\n" + // + "}"; } else { return "\n\n" + // "private Builder " + n.getName() + "(String " + INTERNAL_PREFIX + "value) {\n" + // @@ -270,14 +283,24 @@ public class BuilderGenerator { : ""; String bType = builderType(n); - String stringSetter = ""; - if ( ! "String".equals(bType) && ! "FileReference".equals(bType) && ! "ModelReference".equals(bType)) { + String privateSetter = ""; + if ( ! Set.of("String", "FileReference", "ModelReference", "Optional<FileReference>").contains(bType)) { String type = boxedDataType(n); if ("UrlReference".equals(bType)) type = bType; - stringSetter = String.format("\nprivate Builder %s(String %svalue) {\n" + - " return %s(%s.valueOf(%svalue));\n" + // - "}", name, INTERNAL_PREFIX, name, type, INTERNAL_PREFIX); + // + privateSetter = String.format(""" + + private Builder %s(String %svalue) { + return %s(%s.valueOf(%svalue)); + }""", name, INTERNAL_PREFIX, name, type, INTERNAL_PREFIX); + } else if ("Optional<FileReference>".equals(bType)) { + // + privateSetter = String.format(""" + + private Builder %s(FileReference %svalue) { + return %s(Optional.of(%svalue)); + }""", name, INTERNAL_PREFIX, name, INTERNAL_PREFIX); } String getNullGuard = bType.equals(boxedBuilderType(n)) ? String.format( @@ -286,7 +309,7 @@ public class BuilderGenerator { return String.format("public Builder %s(%s %svalue) {%s\n" + " %s = %svalue;\n" + // "%s", name, bType, INTERNAL_PREFIX, getNullGuard, name, INTERNAL_PREFIX, signalInitialized) + - " return this;" + "\n}\n" + stringSetter; + " return this;" + "\n}\n" + privateSetter; } } @@ -307,6 +330,8 @@ public class BuilderGenerator { return name + "(" + nodeClass(child) + ".toFileReferenceMap(config." + name + "));"; } else if (child instanceof PathLeaf) { return name + "(config." + name + ".getFileReference());"; + } else if (child instanceof OptionalPathLeaf) { + return name + "(config." + name + ".getFileReference());"; } else if (child instanceof UrlLeaf && isArray) { return name + "(" + nodeClass(child) + ".toUrlReferences(config." + name + "));"; } else if (child instanceof UrlLeaf && isMap) { @@ -408,6 +433,8 @@ public class BuilderGenerator { return "String"; } else if (node instanceof PathLeaf) { return "FileReference"; + } else if (node instanceof OptionalPathLeaf) { + return "Optional<FileReference>"; } else if (node instanceof UrlLeaf) { return "UrlReference"; } else if (node instanceof ModelLeaf) { @@ -424,6 +451,8 @@ public class BuilderGenerator { return "String"; } else if (node instanceof PathLeaf) { return "FileReference"; + } else if (node instanceof OptionalPathLeaf) { + return "Optional<FileReference>"; } else if (node instanceof UrlLeaf) { return "UrlReference"; } else if (node instanceof ModelLeaf) { diff --git a/configgen/src/main/java/com/yahoo/config/codegen/ConfigGenerator.java b/configgen/src/main/java/com/yahoo/config/codegen/ConfigGenerator.java index cb10ffdc2be..903d8dc0865 100644 --- a/configgen/src/main/java/com/yahoo/config/codegen/ConfigGenerator.java +++ b/configgen/src/main/java/com/yahoo/config/codegen/ConfigGenerator.java @@ -7,6 +7,7 @@ import com.yahoo.config.codegen.LeafCNode.EnumLeaf; import com.yahoo.config.codegen.LeafCNode.FileLeaf; import com.yahoo.config.codegen.LeafCNode.IntegerLeaf; import com.yahoo.config.codegen.LeafCNode.LongLeaf; +import com.yahoo.config.codegen.LeafCNode.OptionalPathLeaf; import com.yahoo.config.codegen.LeafCNode.PathLeaf; import com.yahoo.config.codegen.LeafCNode.ReferenceLeaf; import com.yahoo.config.codegen.LeafCNode.StringLeaf; @@ -165,6 +166,8 @@ public class ConfigGenerator { return name + " = LeafNodeVector.createFileNodeVector(builder." + name + ");"; } else if (child instanceof PathLeaf && isArray) { return name + " = LeafNodeVector.createPathNodeVector(builder." + name + ");"; + } else if (child instanceof OptionalPathLeaf && isArray) { + return name + " = LeafNodeVector.createOptionalPathNodeVector(builder." + name + ");"; } else if (child instanceof UrlLeaf && isArray) { return name + " = LeafNodeVector.createUrlNodeVector(builder." + name + ");"; } else if (child instanceof ModelLeaf && isArray) { @@ -175,6 +178,8 @@ public class ConfigGenerator { return name + " = LeafNodeMaps.asFileNodeMap(builder." + name + ");"; } else if (child instanceof PathLeaf && isMap) { return name + " = LeafNodeMaps.asPathNodeMap(builder." + name + ");"; + } else if (child instanceof OptionalPathLeaf && isMap) { + return name + " = LeafNodeMaps.asOptionalPathNodeMap(builder." + name + ");"; } else if (child instanceof UrlLeaf && isMap) { return name + " = LeafNodeMaps.asUrlNodeMap(builder." + name + ");"; } else if (child instanceof ModelLeaf && isMap) { @@ -401,6 +406,8 @@ public class ConfigGenerator { return "FileNode"; } else if (node instanceof PathLeaf) { return "PathNode"; + } else if (node instanceof OptionalPathLeaf) { + return "OptionalPathNode"; } else if (node instanceof UrlLeaf) { return "UrlNode"; } else if (node instanceof ModelLeaf) { @@ -431,6 +438,8 @@ public class ConfigGenerator { return "FileReference"; } else if (node instanceof PathLeaf) { return "Path"; + } else if (node instanceof OptionalPathLeaf) { + return "Optional<Path>"; } else if (node instanceof UrlLeaf) { return "File"; } else if (node instanceof ModelLeaf) { @@ -456,6 +465,8 @@ public class ConfigGenerator { return "Integer"; } else if (rawType.toLowerCase().equals(rawType)) { return ConfiggenUtil.capitalize(rawType); + } else if (rawType.startsWith("Optional<")) { + return "Optional"; } else { return rawType; } diff --git a/configgen/src/main/java/com/yahoo/config/codegen/DefLine.java b/configgen/src/main/java/com/yahoo/config/codegen/DefLine.java index 385c7f1979e..d6bffe349a8 100644 --- a/configgen/src/main/java/com/yahoo/config/codegen/DefLine.java +++ b/configgen/src/main/java/com/yahoo/config/codegen/DefLine.java @@ -7,6 +7,7 @@ import java.util.regex.Pattern; public class DefLine { private final static Pattern defaultPattern = Pattern.compile("^\\s*default\\s*=\\s*(\\S+)"); + private final static Pattern optionalPattern = Pattern.compile("^\\s*optional\\s*"); private final static Pattern rangePattern = Pattern.compile("^\\s*range\\s*=\\s*([\\(\\[].*?[\\)\\]])"); private final static Pattern restartPattern = Pattern.compile("^\\s*restart\\s*"); private final static Pattern wordPattern = Pattern.compile("\\S+"); @@ -21,6 +22,7 @@ public class DefLine { private final Type type = new Type(); private DefaultValue defaultValue = null; + private boolean optional = false; private String range = null; private boolean restart = false; @@ -74,6 +76,9 @@ public class DefLine { } public Type getType() { + if (optional && type.name.equals("path")) + type.name = "optionalPath"; + return type; } @@ -89,6 +94,8 @@ public class DefLine { return enumArray; } + public boolean isOptional() { return optional; } + /** * Special function that searches through s and returns the index * of the first occurrence of " that is not escaped. @@ -114,6 +121,7 @@ public class DefLine { private int parseOptions(CharSequence string) { Matcher defaultNullMatcher = defaultNullPattern.matcher(string); Matcher defaultMatcher = defaultPattern.matcher(string); + Matcher optionalMatcher = optionalPattern.matcher(string); Matcher rangeMatcher = rangePattern.matcher(string); Matcher restartMatcher = restartPattern.matcher(string); @@ -133,6 +141,12 @@ public class DefLine { defaultValue = new DefaultValue(deflt, type); } return defaultMatcher.end(); + } else if (optionalMatcher.find()) { + if ( ! type.name.equals("path")) + throw new IllegalArgumentException("optional can only be used for 'path'"); + optional = true; + type.name = "optionalPath"; + return optionalMatcher.end(); } else if (rangeMatcher.find()) { range = rangeMatcher.group(1); return rangeMatcher.end(); diff --git a/configgen/src/main/java/com/yahoo/config/codegen/LeafCNode.java b/configgen/src/main/java/com/yahoo/config/codegen/LeafCNode.java index afd6acfbabf..c2470b0c703 100644 --- a/configgen/src/main/java/com/yahoo/config/codegen/LeafCNode.java +++ b/configgen/src/main/java/com/yahoo/config/codegen/LeafCNode.java @@ -26,6 +26,7 @@ public abstract class LeafCNode extends CNode { case "reference" -> new ReferenceLeaf(parent, name); case "file" -> new FileLeaf(parent, name); case "path" -> new PathLeaf(parent, name); + case "optionalPath" -> new OptionalPathLeaf(parent, name); case "enum" -> new EnumLeaf(parent, name, type.enumArray); case "url" -> new UrlLeaf(parent, name); case "model" -> new ModelLeaf(parent, name); @@ -217,6 +218,17 @@ public abstract class LeafCNode extends CNode { } } + public static class OptionalPathLeaf extends NoClassLeafCNode { + OptionalPathLeaf(InnerCNode parent, String name) { + super(parent, name); + } + + @Override + public String getType() { + return "optionalPath"; + } + } + public static class UrlLeaf extends NoClassLeafCNode { UrlLeaf(InnerCNode parent, String name) { super(parent, name); |