summaryrefslogtreecommitdiffstats
path: root/configgen/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'configgen/src/main')
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/CNode.java24
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/DefParser.java21
-rw-r--r--configgen/src/main/java/com/yahoo/config/codegen/MakeConfig.java20
-rw-r--r--configgen/src/main/scala/com/yahoo/config/codegen/JavaClassBuilder.scala10
4 files changed, 57 insertions, 18 deletions
diff --git a/configgen/src/main/java/com/yahoo/config/codegen/CNode.java b/configgen/src/main/java/com/yahoo/config/codegen/CNode.java
index 260d70ad0e6..9dc7923b71b 100644
--- a/configgen/src/main/java/com/yahoo/config/codegen/CNode.java
+++ b/configgen/src/main/java/com/yahoo/config/codegen/CNode.java
@@ -3,10 +3,12 @@ package com.yahoo.config.codegen;
import java.util.StringTokenizer;
+import static com.yahoo.config.codegen.DefParser.DEFAULT_PACKAGE_PREFIX;
+
/**
* Abstract superclass for all nodes representing a definition file.
*
- * @author <a href="gv@yahoo-inc.com">G. Voldengen</a>
+ * @author gjoranv
*/
public abstract class CNode {
@@ -20,8 +22,10 @@ public abstract class CNode {
// TODO: remove! Only set for the root node, and root.getName() returns the same thing!
String defName = null;
+
String defVersion = "";
String defNamespace = null;
+ String defPackage = null;
String defMd5 = "MISSING MD5";
String comment = "";
@@ -78,13 +82,21 @@ public abstract class CNode {
}
public String getNamespace() {
- return defNamespace;
+ if (defNamespace != null) return defNamespace;
+ if (defPackage != null) return defPackage;
+ return null;
}
void setNamespace(String namespace) {
defNamespace = namespace;
}
+ public String getPackage() {
+ return defPackage;
+ }
+
+ void setPackage(String defPackage) { this.defPackage = defPackage; }
+
public String getComment() {
return comment;
}
@@ -155,7 +167,11 @@ public abstract class CNode {
@Override
public String toString() {
- return getNamespace()+"."+getName()+","+getVersion();
+ return "CNode{" +
+ "namespace='" + defNamespace + '\'' +
+ ", package='" + defPackage + '\'' +
+ ", name='" + name + '\'' +
+ ", version='" + defVersion + '\'' +
+ '}';
}
-
}
diff --git a/configgen/src/main/java/com/yahoo/config/codegen/DefParser.java b/configgen/src/main/java/com/yahoo/config/codegen/DefParser.java
index 3fecc7e108e..09a751bdde7 100644
--- a/configgen/src/main/java/com/yahoo/config/codegen/DefParser.java
+++ b/configgen/src/main/java/com/yahoo/config/codegen/DefParser.java
@@ -18,8 +18,13 @@ public class DefParser {
static final Pattern commentPattern = Pattern.compile("^\\s*#+\\s*(.*?)\\s*$");
public static final Pattern versionPattern = Pattern.compile("^(version\\s*=\\s*)([0-9][0-9-]*)$");
- // Namespace must start with a letter, since Java (Java language Spec, section 3.8) and C++ identifiers cannot start with a digit
- public static final Pattern namespacePattern = Pattern.compile("^(namespace\\s*=\\s*)(([a-z][a-z0-9_]*)+([.][a-z][a-z0-9_]*)*)$");
+ // Namespace/package must start with a letter, since Java (Java language Spec, section 3.8) and C++ identifiers cannot start with a digit
+ public static final Pattern namespacePattern = getNamespacePattern("namespace");
+ public static final Pattern packagePattern = getNamespacePattern("package");
+
+ private static Pattern getNamespacePattern(String directive) {
+ return Pattern.compile("^(" + directive + "\\s*=\\s*)(([a-z][a-z0-9_]*)+([.][a-z][a-z0-9_]*)*)$");
+ }
private final BufferedReader reader;
private final String name;
@@ -129,6 +134,12 @@ public class DefParser {
nd.addNormalizedLine(line);
return;
}
+ Matcher packageMatcher = packagePattern.matcher(line);
+ if (packageMatcher.matches()) {
+ parsePackageLine(packageMatcher.group(2));
+ nd.addNormalizedLine(line);
+ return;
+ }
// Only add lines that are not version, namespace or comment lines
nd.addNormalizedLine(line);
DefLine defLine = new DefLine(line);
@@ -157,6 +168,12 @@ public class DefParser {
comment = "";
}
+ private void parsePackageLine(String defPackage) {
+ root.setPackage(defPackage);
+ root.setComment(comment);
+ comment = "";
+ }
+
void parseLines(CNode root, List<String> defLines, NormalizedDefinition nd) throws DefParserException {
DefParserException failure = null;
int lineNumber = 1;
diff --git a/configgen/src/main/java/com/yahoo/config/codegen/MakeConfig.java b/configgen/src/main/java/com/yahoo/config/codegen/MakeConfig.java
index 91d401c91b7..ef9af1c2b11 100644
--- a/configgen/src/main/java/com/yahoo/config/codegen/MakeConfig.java
+++ b/configgen/src/main/java/com/yahoo/config/codegen/MakeConfig.java
@@ -18,11 +18,11 @@ public class MakeConfig {
classBuilder = createClassBuilder(root, nd, properties);
}
- public static ClassBuilder createClassBuilder(InnerCNode root, NormalizedDefinition nd, MakeConfigProperties prop) {
- if (prop.language.equals("cppng") || prop.language.equals("cpp"))
- return new CppClassBuilder(root, nd, prop.destDir, prop.dirInRoot);
+ public static ClassBuilder createClassBuilder(InnerCNode root, NormalizedDefinition nd, MakeConfigProperties properties) {
+ if (isCpp(properties))
+ return new CppClassBuilder(root, nd, properties.destDir, properties.dirInRoot);
else
- return new JavaClassBuilder(root, nd, prop.destDir, prop.javaPackagePrefix);
+ return new JavaClassBuilder(root, nd, properties.destDir, properties.javaPackagePrefix);
}
public static boolean makeConfig(MakeConfigProperties properties) throws FileNotFoundException {
@@ -31,7 +31,7 @@ public class MakeConfig {
if (name.endsWith(".def")) name = name.substring(0, name.length() - 4);
DefParser parser = new DefParser(name, new FileReader(specFile));
InnerCNode configRoot = parser.getTree();
- checkNamespace(name, configRoot);
+ checkNamespaceAndPacakge(name, configRoot, isCpp(properties));
if (configRoot != null) {
MakeConfig mc = new MakeConfig(configRoot, parser.getNormalizedDefinition(), properties);
mc.buildClasses();
@@ -73,9 +73,15 @@ public class MakeConfig {
}
}
- private static void checkNamespace(String name, InnerCNode configRoot) {
- if (configRoot.defNamespace == null)
+ private static void checkNamespaceAndPacakge(String name, InnerCNode configRoot, boolean isCpp) {
+ if (isCpp && configRoot.defNamespace == null)
throw new IllegalArgumentException("In config definition '" + name + "': A namespace is required");
+ if (configRoot.defNamespace == null && configRoot.defPackage == null)
+ throw new IllegalArgumentException("In config definition '" + name + "': A package (or namespace) is required");
+ }
+
+ private static boolean isCpp(MakeConfigProperties properties) {
+ return (properties.language.equals("cppng") || properties.language.equals("cpp"));
}
// The Exceptions class below is copied from vespajlib/com.yahoo.protect.Exceptions
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 51065eba03e..518815d5a10 100644
--- a/configgen/src/main/scala/com/yahoo/config/codegen/JavaClassBuilder.scala
+++ b/configgen/src/main/scala/com/yahoo/config/codegen/JavaClassBuilder.scala
@@ -24,12 +24,12 @@ class JavaClassBuilder(
import JavaClassBuilder._
val packagePrefix = if (rawPackagePrefix != null) rawPackagePrefix else DEFAULT_PACKAGE_PREFIX
- val javaPackage = packagePrefix + root.getNamespace
+ val javaPackage = if (root.getPackage != null) root.getPackage else packagePrefix + root.getNamespace
val className = createClassName(root.getName)
override def createConfigClasses() {
try {
- val outFile = new File(getDestPath(destDir, root.getNamespace), className + ".java")
+ val outFile = new File(getDestPath(destDir, javaPackage), className + ".java")
var out: PrintStream = null
try {
out = new PrintStream(new FileOutputStream(outFile))
@@ -127,12 +127,12 @@ class JavaClassBuilder(
/**
* @param rootDir The root directory for the destination path.
- * @param namespace The namespace from the def file
+ * @param javaPackage The java package
* @return the destination path for the generated config file, including the given rootDir.
*/
- private def getDestPath(rootDir: File, namespace: String): File = {
+ private def getDestPath(rootDir: File, javaPackage: String): File = {
var dir: File = rootDir
- val subDirs: Array[String] = (packagePrefix + namespace).split("""\.""")
+ val subDirs: Array[String] = javaPackage.split("""\.""")
for (subDir <- subDirs) {
dir = new File(dir, subDir)
this.synchronized {