diff options
author | gjoranv <gv@oath.com> | 2017-08-31 15:35:01 +0200 |
---|---|---|
committer | gjoranv <gv@oath.com> | 2017-09-05 12:07:06 +0200 |
commit | a81650ae405450db737d4dd1777e0cb047579302 (patch) | |
tree | fa3de3e00a7920d51b222cb6fe64406bbe9e4f2c | |
parent | dcd280c9de94e318df07f41b74fc24d6f21521d5 (diff) |
Rewrite ConfigGenerator.createClassName to Java.
- In new class ConfiggenUtil.
- This will allow using the function without loading classes
from scala-xml in the future.
- Do not remove the original scala method, as it could still be
used for a while by older config models.
(By classes InstanceResolver and VespaModel.)
7 files changed, 64 insertions, 24 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java b/config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java index f71e6d1e70f..108b016e067 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java @@ -5,26 +5,20 @@ import com.yahoo.config.ConfigBuilder; import com.yahoo.config.ConfigInstance; import com.yahoo.config.ConfigurationRuntimeException; import com.yahoo.config.codegen.CNode; -import com.yahoo.config.codegen.ConfigGenerator; import com.yahoo.config.codegen.InnerCNode; import com.yahoo.config.codegen.LeafCNode; -import com.yahoo.log.LogLevel; import com.yahoo.vespa.config.ConfigDefinitionKey; import com.yahoo.vespa.config.ConfigKey; -import com.yahoo.vespa.config.ConfigPayload; -import com.yahoo.vespa.config.ConfigPayloadBuilder; -import com.yahoo.vespa.config.ConfigTransformer; -import com.yahoo.vespa.config.GenericConfig; import com.yahoo.vespa.config.buildergen.ConfigDefinition; import com.yahoo.yolean.Exceptions; -import java.lang.reflect.Constructor; import java.lang.reflect.Field; -import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.List; import java.util.Map; +import static com.yahoo.config.codegen.ConfiggenUtil.createClassName; + /** * <p> * This class is capable of resolving config from a config model for a given request. It will handle @@ -159,7 +153,7 @@ class InstanceResolver { */ @SuppressWarnings("unchecked") private static Class<? extends ConfigInstance> getConfigClass(ConfigDefinitionKey cKey, ClassLoader instanceLoader) { - String className = ConfigGenerator.createClassName(cKey.getName()); + String className = createClassName(cKey.getName()); String fullClassName = packageName(cKey) + "." + className; Class<?> clazz; try { diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java index 53cc8be9e96..eda8b564ffd 100644 --- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java @@ -7,7 +7,8 @@ import com.yahoo.config.ConfigInstance.Builder; import com.yahoo.config.ConfigurationRuntimeException; import com.yahoo.config.application.api.ApplicationPackage; import com.yahoo.config.application.api.DeployLogger; -import com.yahoo.config.codegen.ConfigGenerator; +import com.yahoo.config.application.api.ValidationId; +import com.yahoo.config.application.api.ValidationOverrides; import com.yahoo.config.codegen.InnerCNode; import com.yahoo.config.model.ApplicationConfigProducerRoot; import com.yahoo.config.model.ConfigModelRegistry; @@ -29,8 +30,6 @@ import com.yahoo.vespa.config.ConfigPayloadBuilder; import com.yahoo.vespa.config.GenericConfig; import com.yahoo.vespa.config.buildergen.ConfigDefinition; import com.yahoo.vespa.model.admin.Admin; -import com.yahoo.config.application.api.ValidationId; -import com.yahoo.config.application.api.ValidationOverrides; import com.yahoo.vespa.model.builder.VespaModelBuilder; import com.yahoo.vespa.model.builder.xml.dom.VespaDomBuilder; import com.yahoo.vespa.model.clients.Clients; @@ -63,6 +62,7 @@ import java.util.Set; import java.util.logging.Logger; import java.util.stream.Collectors; +import static com.yahoo.config.codegen.ConfiggenUtil.createClassName; import static com.yahoo.text.StringUtilities.quote; /** @@ -358,7 +358,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri } public ConfigInstance.Builder createBuilder(ConfigDefinitionKey key, ConfigDefinition targetDef) { - String className = ConfigGenerator.createClassName(key.getName()); + String className = createClassName(key.getName()); Class<?> clazz; final String fullClassName = InstanceResolver.packageName(key) + "." + className; diff --git a/config/src/test/java/com/yahoo/vespa/config/buildergen/ConfigBuilderGeneratorTest.java b/config/src/test/java/com/yahoo/vespa/config/buildergen/ConfigBuilderGeneratorTest.java index 4d122744388..525921d3052 100644 --- a/config/src/test/java/com/yahoo/vespa/config/buildergen/ConfigBuilderGeneratorTest.java +++ b/config/src/test/java/com/yahoo/vespa/config/buildergen/ConfigBuilderGeneratorTest.java @@ -3,7 +3,6 @@ package com.yahoo.vespa.config.buildergen; import com.google.common.io.Files; import com.yahoo.config.ConfigInstance; -import com.yahoo.config.codegen.ConfigGenerator; import com.yahoo.slime.Cursor; import com.yahoo.slime.Slime; import com.yahoo.vespa.config.ConfigDefinitionKey; @@ -16,6 +15,7 @@ import java.io.IOException; import java.lang.reflect.InvocationTargetException; import java.net.URISyntaxException; +import static com.yahoo.config.codegen.ConfiggenUtil.createClassName; import static junit.framework.TestCase.assertNotNull; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertThat; @@ -43,7 +43,7 @@ public class ConfigBuilderGeneratorTest { root.setString("intval", "3"); root.setString("stringval", "Hello, world"); payloadApplier.applyPayload(new ConfigPayload(slime)); - String className = ConfigGenerator.createClassName(key.getName()); + String className = createClassName(key.getName()); ConfigInstance instance = (ConfigInstance) builder.getClass().getClassLoader().loadClass("com.yahoo." + key.getNamespace() + "." + className).getConstructor(new Class<?>[]{builder.getClass()}).newInstance(builder); assertNotNull(instance); assertThat(instance.toString(), is("intval 3\nstringval \"Hello, world\"")); diff --git a/configgen/src/main/java/com/yahoo/config/codegen/ConfiggenUtil.java b/configgen/src/main/java/com/yahoo/config/codegen/ConfiggenUtil.java new file mode 100644 index 00000000000..a7a3eb718a3 --- /dev/null +++ b/configgen/src/main/java/com/yahoo/config/codegen/ConfiggenUtil.java @@ -0,0 +1,43 @@ +package com.yahoo.config.codegen; + +import java.util.Arrays; +import java.util.stream.Collectors; + +/** + * @author gjoranv + */ +public class ConfiggenUtil { + + /** + * Create class name from def name + * @param defName The file name without the '.def' suffix + */ + public static String createClassName(String defName) { + String className = Arrays.stream(defName.split("-")) + .map(ConfiggenUtil::capitalize) + .collect(Collectors.joining()) + + "Config"; + + if (! isLegalJavaIdentifier(className)) + throw new CodegenRuntimeException("Illegal config definition file name '" + defName + + "'. Must be a legal Java identifier."); + + return className; + } + + private static String capitalize(String in) { + StringBuilder sb = new StringBuilder(in); + sb.setCharAt(0, Character.toTitleCase(in.charAt(0))); + return sb.toString(); + } + + private static boolean isLegalJavaIdentifier(String name) { + if (name.isEmpty()) return false; + if (! Character.isJavaIdentifierStart(name.charAt(0))) return false; + + for (char c : name.substring(1).toCharArray()) { + if (! Character.isJavaIdentifierPart(c)) return false; + } + return true; + } +} diff --git a/configgen/src/main/scala/com/yahoo/config/codegen/ConfigGenerator.scala b/configgen/src/main/scala/com/yahoo/config/codegen/ConfigGenerator.scala index 7ea07762c01..f6876affe5d 100644 --- a/configgen/src/main/scala/com/yahoo/config/codegen/ConfigGenerator.scala +++ b/configgen/src/main/scala/com/yahoo/config/codegen/ConfigGenerator.scala @@ -2,11 +2,12 @@ package com.yahoo.config.codegen +import com.yahoo.config.codegen.BuilderGenerator.getBuilder +import com.yahoo.config.codegen.JavaClassBuilder.Indentation import com.yahoo.config.codegen.LeafCNode._ import com.yahoo.config.codegen.ReservedWords.{INTERNAL_PREFIX => InternalPrefix} -import JavaClassBuilder.Indentation -import BuilderGenerator.getBuilder -import util.parsing.combinator.JavaTokenParsers + +import scala.util.parsing.combinator.JavaTokenParsers /** * @author gjoranv @@ -409,7 +410,7 @@ object ConfigGenerator { node match { case emptyName: CNode if node.getName.length == 0 => throw new CodegenRuntimeException("Node with empty name, under parent " + emptyName.getParent.getName) - case root: InnerCNode if root.getParent == null => createClassName(root.getName) + case root: InnerCNode if root.getParent == null => ConfiggenUtil.createClassName(root.getName) case b: BooleanLeaf => "BooleanNode" case d: DoubleLeaf => "DoubleNode" case f: FileLeaf => "FileNode" @@ -450,9 +451,10 @@ object ConfigGenerator { } /** - * Create class name from def name - * @param defName The file name without the '.def' suffix - */ + * Deprecated! + * TODO: Remove when no longer used in config-model + */ + @deprecated("Use ConfiggenUtil.createClassName() instead", "6.143") def createClassName(defName: String): String = { val className = defName.split("-").map (_.capitalize).mkString + "Config" val parser = new JavaTokenParsers {} diff --git a/configgen/src/main/scala/com/yahoo/config/codegen/JavaClassBuilder.scala b/configgen/src/main/scala/com/yahoo/config/codegen/JavaClassBuilder.scala index 518815d5a10..e03a6d3d04b 100644 --- a/configgen/src/main/scala/com/yahoo/config/codegen/JavaClassBuilder.scala +++ b/configgen/src/main/scala/com/yahoo/config/codegen/JavaClassBuilder.scala @@ -3,7 +3,8 @@ package com.yahoo.config.codegen import java.io.{File, FileNotFoundException, FileOutputStream, PrintStream} -import com.yahoo.config.codegen.ConfigGenerator.{createClassName, indentCode} +import com.yahoo.config.codegen.ConfigGenerator.indentCode +import com.yahoo.config.codegen.ConfiggenUtil.createClassName import com.yahoo.config.codegen.DefParser.DEFAULT_PACKAGE_PREFIX import scala.collection.JavaConverters._ diff --git a/configgen/src/test/scala/com/yahoo/config/codegen/JavaClassBuilderTest.scala b/configgen/src/test/scala/com/yahoo/config/codegen/JavaClassBuilderTest.scala index 4b35f3fb713..c1a5eb2dd6a 100644 --- a/configgen/src/test/scala/com/yahoo/config/codegen/JavaClassBuilderTest.scala +++ b/configgen/src/test/scala/com/yahoo/config/codegen/JavaClassBuilderTest.scala @@ -5,7 +5,7 @@ import org.junit.Assert.assertThat import org.junit.Assert.assertTrue import org.hamcrest.CoreMatchers.is import java.io.StringReader -import ConfigGenerator.createClassName +import ConfiggenUtil.createClassName import JavaClassBuilder.createUniqueSymbol import org.junit.{Ignore, Test} |