diff options
author | gjoranv <gv@oath.com> | 2017-08-16 17:38:03 +0200 |
---|---|---|
committer | gjoranv <gv@oath.com> | 2017-08-17 12:00:02 +0200 |
commit | 2b2d0ea6280b54ad37f85b091e6a46b1566d430b (patch) | |
tree | 743f3d1d8f2970a93ff94036088f81d9d0619450 /configgen/src/main/java/com/yahoo | |
parent | 380098c56a4d6be4762cd060734896fbe450cca7 (diff) |
Allow 'package' in def files to specify java package.
* For generating cpp, namespace is still required and
package is ignored.
* Generating java requires one of them, but both are allowed.
Diffstat (limited to 'configgen/src/main/java/com/yahoo')
3 files changed, 52 insertions, 13 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 |