summaryrefslogtreecommitdiffstats
path: root/configgen/src/main/java
diff options
context:
space:
mode:
Diffstat (limited to 'configgen/src/main/java')
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/BuilderGenerator.java45
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/ConfigGenerator.java11
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/DefLine.java14
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/LeafCNode.java12
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);