From 7caa60913e4db267f7d7bdfe0e1de90ec12db13f Mon Sep 17 00:00:00 2001 From: Lester Solbakken Date: Tue, 18 Dec 2018 10:37:27 +0100 Subject: Add url config type --- .../com/yahoo/config/codegen/BuilderGenerator.java | 17 +++- .../com/yahoo/config/codegen/ConfigGenerator.java | 11 ++- .../com/yahoo/config/codegen/JavaClassBuilder.java | 1 + .../java/com/yahoo/config/codegen/LeafCNode.java | 12 +++ .../yahoo/config/codegen/DefLineParsingTest.java | 20 +++++ .../com/yahoo/config/codegen/DefParserTest.java | 4 +- .../yahoo/config/codegen/JavaClassBuilderTest.java | 4 +- .../config/codegen/NormalizedDefinitionTest.java | 2 +- configgen/src/test/resources/allfeatures.def | 3 + configgen/src/test/resources/allfeatures.reference | 92 +++++++++++++++++++++- 10 files changed, 156 insertions(+), 10 deletions(-) (limited to 'configgen/src') 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 7789a2b2cfb..b3c4d0c5ff8 100644 --- a/configgen/src/main/java/com/yahoo/config/codegen/BuilderGenerator.java +++ b/configgen/src/main/java/com/yahoo/config/codegen/BuilderGenerator.java @@ -3,6 +3,7 @@ package com.yahoo.config.codegen; import com.yahoo.config.codegen.LeafCNode.FileLeaf; import com.yahoo.config.codegen.LeafCNode.PathLeaf; +import com.yahoo.config.codegen.LeafCNode.UrlLeaf; import java.util.ArrayList; import java.util.List; @@ -169,7 +170,7 @@ public class BuilderGenerator { } private static String privateLeafNodeSetter(LeafCNode n) { - if ("String".equals(builderType(n)) || "FileReference".equals(builderType(n))) { + if ("String".equals(builderType(n)) || "FileReference".equals(builderType(n)) || "UrlReference".equals(builderType(n))) { return ""; } else { return "\n\n" + // @@ -197,7 +198,7 @@ public class BuilderGenerator { } private static String privateLeafMapSetter(CNode n) { - if ("String".equals(builderType(n)) || "FileReference".equals(builderType(n))) { + if ("String".equals(builderType(n)) || "FileReference".equals(builderType(n)) || "UrlReference".equals(builderType(n))) { return ""; } else { return "\n\n" + // @@ -219,7 +220,7 @@ public class BuilderGenerator { : ""; String bType = builderType(n); - String stringSetter = "String".equals(bType) || "FileReference".equals(bType) ? "" + String stringSetter = "String".equals(bType) || "FileReference".equals(bType) || "UrlReference".equals(bType) ? "" : String.format("\nprivate Builder %s(String %svalue) {\n" + // " return %s(%s.valueOf(%svalue));\n" + // "}", name, INTERNAL_PREFIX, name, boxedDataType(n), INTERNAL_PREFIX); @@ -251,6 +252,12 @@ public class BuilderGenerator { return name + "(" + nodeClass(child) + ".toFileReferenceMap(config." + name + "));"; } else if (child instanceof PathLeaf) { return name + "(config." + name + ".getFileReference());"; + } else if (child instanceof UrlLeaf && isArray) { + return name + "(" + nodeClass(child) + ".toUrlReferences(config." + name + "));"; + } else if (child instanceof UrlLeaf && isMap) { + return name + "(" + nodeClass(child) + ".toUrlReferenceMap(config." + name + "));"; + } else if (child instanceof UrlLeaf) { + return name + "(config." + name + ".getUrlReference());"; } else if (child instanceof LeafCNode) { return name + "(config." + name + "());"; } else if (child instanceof InnerCNode && isArray) { @@ -340,6 +347,8 @@ public class BuilderGenerator { return "String"; } else if (node instanceof PathLeaf) { return "FileReference"; + } else if (node instanceof UrlLeaf) { + return "UrlReference"; } else if (node instanceof LeafCNode && (node.isArray || node.isMap)) { return boxedDataType(node); } else { @@ -352,6 +361,8 @@ public class BuilderGenerator { return "String"; } else if (node instanceof PathLeaf) { return "FileReference"; + } else if (node instanceof UrlLeaf) { + return "UrlReference"; } else { return boxedDataType(node); } 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 f7c6267a6bb..4da546a7179 100644 --- a/configgen/src/main/java/com/yahoo/config/codegen/ConfigGenerator.java +++ b/configgen/src/main/java/com/yahoo/config/codegen/ConfigGenerator.java @@ -10,6 +10,7 @@ import com.yahoo.config.codegen.LeafCNode.LongLeaf; import com.yahoo.config.codegen.LeafCNode.PathLeaf; import com.yahoo.config.codegen.LeafCNode.ReferenceLeaf; import com.yahoo.config.codegen.LeafCNode.StringLeaf; +import com.yahoo.config.codegen.LeafCNode.UrlLeaf; import java.util.LinkedList; import java.util.List; @@ -163,12 +164,16 @@ 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 UrlLeaf && isArray) { + return name + " = LeafNodeVector.createUrlNodeVector(builder." + name + ");"; } else if (child instanceof LeafCNode && isArray) { return name + " = new LeafNodeVector<>(builder." + name + ", new " + className + "());"; } else if (child instanceof FileLeaf && isMap) { return name + " = LeafNodeMaps.asFileNodeMap(builder." + name + ");"; } else if (child instanceof PathLeaf && isMap) { return name + " = LeafNodeMaps.asPathNodeMap(builder." + name + ");"; + } else if (child instanceof UrlLeaf && isMap) { + return name + " = LeafNodeMaps.asUrlNodeMap(builder." + name + ");"; } else if (child instanceof LeafCNode && isMap) { return name + " = LeafNodeMaps.asNodeMap(builder." + name + ", new " + className + "());"; } else if (child instanceof InnerCNode && isArray) { @@ -178,7 +183,7 @@ public class ConfigGenerator { } else if (child instanceof InnerCNode) { return name + " = new " + className + "(builder." + name + ", throwIfUninitialized);"; } else if (child instanceof LeafCNode) { - return name + " = (builder." + name + " == null) ?\n" +// + return name + " = (builder." + name + " == null) ?\n" + " new " + className + "(" + scalarDefault((LeafCNode) child) + ") : new " + className + "(builder." + name + ");"; } else { throw new IllegalStateException("Cannot create assignment for node"); // should not happen @@ -391,6 +396,8 @@ public class ConfigGenerator { return "FileNode"; } else if (node instanceof PathLeaf) { return "PathNode"; + } else if (node instanceof UrlLeaf) { + return "UrlNode"; } else if (node instanceof IntegerLeaf) { return "IntegerNode"; } else if (node instanceof LongLeaf) { @@ -417,6 +424,8 @@ public class ConfigGenerator { return "FileReference"; } else if (node instanceof PathLeaf) { return "Path"; + } else if (node instanceof UrlLeaf) { + return "File"; } else if (node instanceof IntegerLeaf) { return "int"; } else if (node instanceof LongLeaf) { diff --git a/configgen/src/main/java/com/yahoo/config/codegen/JavaClassBuilder.java b/configgen/src/main/java/com/yahoo/config/codegen/JavaClassBuilder.java index e30b59b642a..5c447191614 100644 --- a/configgen/src/main/java/com/yahoo/config/codegen/JavaClassBuilder.java +++ b/configgen/src/main/java/com/yahoo/config/codegen/JavaClassBuilder.java @@ -71,6 +71,7 @@ public class JavaClassBuilder implements ClassBuilder { "package " + javaPackage + ";\n" + // "\n" + // "import java.util.*;\n" + // + "import java.io.File;\n" + // "import java.nio.file.Path;\n" + // "import edu.umd.cs.findbugs.annotations.NonNull;\n" + // getImportFrameworkClasses(root.getNamespace()); 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 7623987656a..e8dd4221f0e 100644 --- a/configgen/src/main/java/com/yahoo/config/codegen/LeafCNode.java +++ b/configgen/src/main/java/com/yahoo/config/codegen/LeafCNode.java @@ -27,6 +27,7 @@ public abstract class LeafCNode extends CNode { case "file": return new FileLeaf(parent, name); case "path": return new PathLeaf(parent, name); case "enum": return new EnumLeaf(parent, name, type.enumArray); + case "url" : return new UrlLeaf(parent, name); default: return null; } } catch (NumberFormatException e) { @@ -217,6 +218,17 @@ public abstract class LeafCNode extends CNode { } } + public static class UrlLeaf extends NoClassNoDefaultLeafCNode { + UrlLeaf(InnerCNode parent, String name) { + super(parent, name); + } + + @Override + public String getType() { + return "url"; + } + } + public static class EnumLeaf extends LeafCNode { private final String[] legalValues; diff --git a/configgen/src/test/java/com/yahoo/config/codegen/DefLineParsingTest.java b/configgen/src/test/java/com/yahoo/config/codegen/DefLineParsingTest.java index 99699d888dc..a267c2bc535 100644 --- a/configgen/src/test/java/com/yahoo/config/codegen/DefLineParsingTest.java +++ b/configgen/src/test/java/com/yahoo/config/codegen/DefLineParsingTest.java @@ -101,6 +101,26 @@ public class DefLineParsingTest { assertEquals("file", l.getType().getName()); } + @Test + public void testParseUrls() { + DefLine l = new DefLine("urlVal url"); + + assertEquals("urlVal", l.getName()); + assertNull(l.getDefault()); + assertEquals("url", l.getType().getName()); + } + + @Test + public void testParseDefaultUrls() { + DefLine l = new DefLine("urlVal url default=\"http://docs.vespa.ai\""); + + assertEquals("urlVal", l.getName()); + assertEquals("http://docs.vespa.ai", l.getDefault().getValue()); + assertEquals("\"http://docs.vespa.ai\"", l.getDefault().getStringRepresentation()); + assertEquals("url", l.getType().getName()); + } + + @Test public void testParseDefaultInt() { DefLine l = new DefLine("foo int default=1000"); diff --git a/configgen/src/test/java/com/yahoo/config/codegen/DefParserTest.java b/configgen/src/test/java/com/yahoo/config/codegen/DefParserTest.java index e36641bb626..98c30aa09cf 100644 --- a/configgen/src/test/java/com/yahoo/config/codegen/DefParserTest.java +++ b/configgen/src/test/java/com/yahoo/config/codegen/DefParserTest.java @@ -28,7 +28,7 @@ public class DefParserTest { CNode root = new DefParser("test", new FileReader(defFile)).getTree(); assertNotNull(root); CNode[] children = root.getChildren(); - assertThat(children.length, is(31)); + assertThat(children.length, is(34)); int numGrandChildren = 0; int numGreatGrandChildren = 0; @@ -70,7 +70,7 @@ public class DefParserTest { public void testMd5Sum() throws IOException { File defFile = new File(DEF_NAME); CNode root = new DefParser("test", new FileReader(defFile)).getTree(); - assertThat(root.defMd5, is("eb2d24dbbcf054b21be729e2cfaafd93")); + assertThat(root.defMd5, is("f901bdc5c96e7005130399c63f247823")); } @Test diff --git a/configgen/src/test/java/com/yahoo/config/codegen/JavaClassBuilderTest.java b/configgen/src/test/java/com/yahoo/config/codegen/JavaClassBuilderTest.java index 381d587e3c3..11da88a12fa 100644 --- a/configgen/src/test/java/com/yahoo/config/codegen/JavaClassBuilderTest.java +++ b/configgen/src/test/java/com/yahoo/config/codegen/JavaClassBuilderTest.java @@ -35,6 +35,8 @@ public class JavaClassBuilderTest { "namespace=test\n" + // "p path\n" + // "pathArr[] path\n" + // + "u url\n" + // + "urlArr[] url\n" + // "f file\n" + // "fileArr[] file\n" + // "i int default=0\n" + // @@ -116,7 +118,7 @@ public class JavaClassBuilderTest { for (int i = 0; i < referenceClassLines.size(); i++) { if (configClassLines.length <= i) - fail("Missing lines i generated comnfig class. First missing line:\n" + referenceClassLines.get(i)); + fail("Missing lines i generated config class. First missing line:\n" + referenceClassLines.get(i)); assertEquals("Line " + i, referenceClassLines.get(i), configClassLines[i]); } } diff --git a/configgen/src/test/java/com/yahoo/config/codegen/NormalizedDefinitionTest.java b/configgen/src/test/java/com/yahoo/config/codegen/NormalizedDefinitionTest.java index cbb0d9c4082..9cda4cfbb1c 100644 --- a/configgen/src/test/java/com/yahoo/config/codegen/NormalizedDefinitionTest.java +++ b/configgen/src/test/java/com/yahoo/config/codegen/NormalizedDefinitionTest.java @@ -68,7 +68,7 @@ public class NormalizedDefinitionTest { } assertNotNull(out); - assertThat(out.size(), is(69)); + assertThat(out.size(), is(72)); assertNotNull(fileReader); fileReader.close(); diff --git a/configgen/src/test/resources/allfeatures.def b/configgen/src/test/resources/allfeatures.def index e13e14c9e36..fb627f614d6 100644 --- a/configgen/src/test/resources/allfeatures.def +++ b/configgen/src/test/resources/allfeatures.def @@ -39,6 +39,7 @@ refVal reference refwithdef reference default=":parent:" fileVal file pathVal path +urlVal url boolarr[] bool intarr[] int @@ -49,9 +50,11 @@ enumarr[] enum { ARRAY, VALUES } refarr[] reference filearr[] file pathArr[] path +urlArr[] url intMap{} int pathMap{} file +urlMap{} url # A basic struct basic_struct.foo string default="foo" diff --git a/configgen/src/test/resources/allfeatures.reference b/configgen/src/test/resources/allfeatures.reference index 1916e37c1cc..f075daecd04 100644 --- a/configgen/src/test/resources/allfeatures.reference +++ b/configgen/src/test/resources/allfeatures.reference @@ -6,6 +6,7 @@ package com.yahoo.configgen; import java.util.*; +import java.io.File; import java.nio.file.Path; import edu.umd.cs.findbugs.annotations.NonNull; import com.yahoo.config.*; @@ -35,7 +36,7 @@ import com.yahoo.config.*; */ public final class AllfeaturesConfig extends ConfigInstance { - public final static String CONFIG_DEF_MD5 = "eb2d24dbbcf054b21be729e2cfaafd93"; + public final static String CONFIG_DEF_MD5 = "f901bdc5c96e7005130399c63f247823"; public final static String CONFIG_DEF_NAME = "allfeatures"; public final static String CONFIG_DEF_NAMESPACE = "configgen"; public final static String CONFIG_DEF_VERSION = ""; @@ -57,6 +58,7 @@ public final class AllfeaturesConfig extends ConfigInstance { "refwithdef reference default=\":parent:\"", "fileVal file", "pathVal path", + "urlVal url", "boolarr[] bool", "intarr[] int", "longarr[] long", @@ -66,8 +68,10 @@ public final class AllfeaturesConfig extends ConfigInstance { "refarr[] reference", "filearr[] file", "pathArr[] path", + "urlArr[] url", "intMap{} int", "pathMap{} file", + "urlMap{} url", "basic_struct.foo string default=\"foo\"", "basic_struct.bar int default=0", "struct_of_struct.inner0.name string default=\"inner0\"", @@ -105,7 +109,8 @@ public final class AllfeaturesConfig extends ConfigInstance { "enumVal", "refVal", "fileVal", - "pathVal" + "pathVal", + "urlVal" )); private Boolean boolVal = null; @@ -124,6 +129,7 @@ public final class AllfeaturesConfig extends ConfigInstance { private String refwithdef = null; private String fileVal = null; private FileReference pathVal = null; + private UrlReference urlVal = null; public List boolarr = new ArrayList<>(); public List intarr = new ArrayList<>(); public List longarr = new ArrayList<>(); @@ -133,8 +139,10 @@ public final class AllfeaturesConfig extends ConfigInstance { public List refarr = new ArrayList<>(); public List filearr = new ArrayList<>(); public List pathArr = new ArrayList<>(); + public List urlArr = new ArrayList<>(); public Map intMap = new LinkedHashMap<>(); public Map pathMap = new LinkedHashMap<>(); + public Map urlMap = new LinkedHashMap<>(); public Basic_struct.Builder basic_struct = new Basic_struct.Builder(); public Struct_of_struct.Builder struct_of_struct = new Struct_of_struct.Builder(); public List myArray = new ArrayList<>(); @@ -159,6 +167,7 @@ public final class AllfeaturesConfig extends ConfigInstance { refwithdef(config.refwithdef()); fileVal(config.fileVal().value()); pathVal(config.pathVal.getFileReference()); + urlVal(config.urlVal.getUrlReference()); boolarr(config.boolarr()); intarr(config.intarr()); longarr(config.longarr()); @@ -168,8 +177,10 @@ public final class AllfeaturesConfig extends ConfigInstance { refarr(config.refarr()); filearr(FileReference.toValues(config.filearr())); pathArr(PathNode.toFileReferences(config.pathArr)); + urlArr(UrlNode.toUrlReferences(config.urlArr)); intMap(config.intMap()); pathMap(FileReference.toValueMap(config.pathMap())); + urlMap(UrlNode.toUrlReferenceMap(config.urlMap)); basic_struct(new Basic_struct.Builder(config.basic_struct())); struct_of_struct(new Struct_of_struct.Builder(config.struct_of_struct())); for (MyArray m : config.myArray()) { @@ -213,6 +224,8 @@ public final class AllfeaturesConfig extends ConfigInstance { fileVal(__superior.fileVal); if (__superior.pathVal != null) pathVal(__superior.pathVal); + if (__superior.urlVal != null) + urlVal(__superior.urlVal); if (!__superior.boolarr.isEmpty()) boolarr.addAll(__superior.boolarr); if (!__superior.intarr.isEmpty()) @@ -231,8 +244,11 @@ public final class AllfeaturesConfig extends ConfigInstance { filearr.addAll(__superior.filearr); if (!__superior.pathArr.isEmpty()) pathArr.addAll(__superior.pathArr); + if (!__superior.urlArr.isEmpty()) + urlArr.addAll(__superior.urlArr); intMap(__superior.intMap); pathMap(__superior.pathMap); + urlMap(__superior.urlMap); basic_struct(basic_struct.override(__superior.basic_struct)); struct_of_struct(struct_of_struct.override(__superior.struct_of_struct)); if (!__superior.myArray.isEmpty()) @@ -384,6 +400,14 @@ public final class AllfeaturesConfig extends ConfigInstance { } + public Builder urlVal(UrlReference __value) { + if (__value == null) throw new IllegalArgumentException("Null value is not allowed."); + urlVal = __value; + __uninitialized.remove("urlVal"); + return this; + } + + public Builder boolarr(Boolean __value) { boolarr.add(__value); return this; @@ -494,6 +518,16 @@ public final class AllfeaturesConfig extends ConfigInstance { return this; } + public Builder urlArr(UrlReference __value) { + urlArr.add(__value); + return this; + } + + public Builder urlArr(Collection __values) { + urlArr.addAll(__values); + return this; + } + public Builder intMap(String __key, Integer __value) { intMap.put(__key, __value); return this; @@ -518,6 +552,16 @@ public final class AllfeaturesConfig extends ConfigInstance { return this; } + public Builder urlMap(String __key, UrlReference __value) { + urlMap.put(__key, __value); + return this; + } + + public Builder urlMap(Map __values) { + urlMap.putAll(__values); + return this; + } + public Builder basic_struct(Basic_struct.Builder __builder) { basic_struct = __builder; return this; @@ -600,6 +644,7 @@ public final class AllfeaturesConfig extends ConfigInstance { private final ReferenceNode refwithdef; private final FileNode fileVal; private final PathNode pathVal; + private final UrlNode urlVal; private final LeafNodeVector boolarr; private final LeafNodeVector intarr; private final LeafNodeVector longarr; @@ -609,8 +654,10 @@ public final class AllfeaturesConfig extends ConfigInstance { private final LeafNodeVector refarr; private final LeafNodeVector filearr; private final LeafNodeVector pathArr; + private final LeafNodeVector urlArr; private final Map intMap; private final Map pathMap; + private final Map urlMap; private final Basic_struct basic_struct; private final Struct_of_struct struct_of_struct; private final InnerNodeVector myArray; @@ -657,6 +704,8 @@ public final class AllfeaturesConfig extends ConfigInstance { new FileNode() : new FileNode(builder.fileVal); pathVal = (builder.pathVal == null) ? new PathNode() : new PathNode(builder.pathVal); + urlVal = (builder.urlVal == null) ? + new UrlNode() : new UrlNode(builder.urlVal); boolarr = new LeafNodeVector<>(builder.boolarr, new BooleanNode()); intarr = new LeafNodeVector<>(builder.intarr, new IntegerNode()); longarr = new LeafNodeVector<>(builder.longarr, new LongNode()); @@ -666,8 +715,10 @@ public final class AllfeaturesConfig extends ConfigInstance { refarr = new LeafNodeVector<>(builder.refarr, new ReferenceNode()); filearr = LeafNodeVector.createFileNodeVector(builder.filearr); pathArr = LeafNodeVector.createPathNodeVector(builder.pathArr); + urlArr = LeafNodeVector.createUrlNodeVector(builder.urlArr); intMap = LeafNodeMaps.asNodeMap(builder.intMap, new IntegerNode()); pathMap = LeafNodeMaps.asFileNodeMap(builder.pathMap); + urlMap = LeafNodeMaps.asUrlNodeMap(builder.urlMap); basic_struct = new Basic_struct(builder.basic_struct, throwIfUninitialized); struct_of_struct = new Struct_of_struct(builder.struct_of_struct, throwIfUninitialized); myArray = MyArray.createVector(builder.myArray); @@ -786,6 +837,13 @@ public final class AllfeaturesConfig extends ConfigInstance { return pathVal.value(); } + /** + * @return allfeatures.urlVal + */ + public File urlVal() { + return urlVal.value(); + } + /** * @return allfeatures.boolarr[] */ @@ -921,6 +979,21 @@ public final class AllfeaturesConfig extends ConfigInstance { return pathArr.get(i).value(); } + /** + * @return allfeatures.urlArr[] + */ + public List urlArr() { + return urlArr.asList(); + } + + /** + * @param i the index of the value to return + * @return allfeatures.urlArr[] + */ + public File urlArr(int i) { + return urlArr.get(i).value(); + } + /** * @return allfeatures.intMap{} */ @@ -951,6 +1024,21 @@ public final class AllfeaturesConfig extends ConfigInstance { return pathMap.get(key).value(); } + /** + * @return allfeatures.urlMap{} + */ + public Map urlMap() { + return LeafNodeMaps.asValueMap(urlMap); + } + + /** + * @param key the key of the value to return + * @return allfeatures.urlMap{} + */ + public File urlMap(String key) { + return urlMap.get(key).value(); + } + /** * @return allfeatures.basic_struct */ -- cgit v1.2.3