aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgjoranv <gv@oath.com>2017-08-31 15:35:01 +0200
committergjoranv <gv@oath.com>2017-08-31 16:42:00 +0200
commitf6ec274aab8d1b4d2ac25c104bc5a603dc4156ff (patch)
tree1bb34e8b61d43516100949def824a28ec3523219
parentb3a4db45c7fae896a2d5e9ae3fbf2b7fd072f7c9 (diff)
Rewrite ConfigGenerator.createClassName to Java.
- In new class ConfiggenUtil. - This allows using the function without loading classes from scala-xml.
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/InstanceResolver.java12
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java8
-rw-r--r--config/src/test/java/com/yahoo/vespa/config/buildergen/ConfigBuilderGeneratorTest.java4
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/ConfiggenUtil.java43
-rw-r--r--configgen/src/main/scala/com/yahoo/config/codegen/ConfigGenerator.scala19
-rw-r--r--configgen/src/main/scala/com/yahoo/config/codegen/JavaClassBuilder.scala3
-rw-r--r--configgen/src/test/scala/com/yahoo/config/codegen/JavaClassBuilderTest.scala2
7 files changed, 58 insertions, 33 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 c61435ca831..139fec80983 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;
/**
@@ -362,7 +362,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..b4a19ea431d 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,11 @@
package com.yahoo.config.codegen
+import com.yahoo.config.codegen.BuilderGenerator.getBuilder
+import com.yahoo.config.codegen.ConfiggenUtil.createClassName
+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
/**
* @author gjoranv
@@ -449,17 +449,4 @@ object ConfigGenerator {
}
}
- /**
- * Create class name from def name
- * @param defName The file name without the '.def' suffix
- */
- def createClassName(defName: String): String = {
- val className = defName.split("-").map (_.capitalize).mkString + "Config"
- val parser = new JavaTokenParsers {}
- parser.parseAll(parser.ident, className) match {
- case parser.NoSuccess(msg, _) =>
- throw new CodegenRuntimeException("Illegal config definition file name '" + defName + "': " + msg)
- case success => success.get
- }
- }
}
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}