/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.zookeeper.version.util;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class VerGen {
private static final String PACKAGE_NAME = "org.apache.zookeeper.version";
private static final String TYPE_NAME = "Info";
static void printUsage() {
System.out.print("Usage:\tjava -cp <classpath> org.apache.zookeeper."
+ "version.util.VerGen maj.min.micro[-qualifier] rev buildDate");
System.exit(1);
}
public static void generateFile(File outputDir, Version version, int rev, String buildDate)
{
String path = PACKAGE_NAME.replaceAll("\\.", "/");
File pkgdir = new File(outputDir, path);
if (!pkgdir.exists()) {
// create the pkg directory
boolean ret = pkgdir.mkdirs();
if (!ret) {
System.out.println("Cannnot create directory: " + path);
System.exit(1);
}
} else if (!pkgdir.isDirectory()) {
// not a directory
System.out.println(path + " is not a directory.");
System.exit(1);
}
File file = new File(pkgdir, TYPE_NAME + ".java");
FileWriter w = null;
try {
w = new FileWriter(file);
w.write("// Do not edit!\n// File generated by org.apache.zookeeper"
+ ".version.util.VerGen.\n");
w.write("/**\n");
w.write("* Licensed to the Apache Software Foundation (ASF) under one\n");
w.write("* or more contributor license agreements. See the NOTICE file\n");
w.write("* distributed with this work for additional information\n");
w.write("* regarding copyright ownership. The ASF licenses this file\n");
w.write("* to you under the Apache License, Version 2.0 (the\n");
w.write("* \"License\"); you may not use this file except in compliance\n");
w.write("* with the License. You may obtain a copy of the License at\n");
w.write("*\n");
w.write("* http://www.apache.org/licenses/LICENSE-2.0\n");
w.write("*\n");
w.write("* Unless required by applicable law or agreed to in writing, software\n");
w.write("* distributed under the License is distributed on an \"AS IS\" BASIS,\n");
w.write("* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n");
w.write("* See the License for the specific language governing permissions and\n");
w.write("* limitations under the License.\n");
w.write("*/\n");
w.write("\n");
w.write("package " + PACKAGE_NAME + ";\n\n");
w.write("public interface " + TYPE_NAME + " {\n");
w.write(" public static final int MAJOR=" + version.maj + ";\n");
w.write(" public static final int MINOR=" + version.min + ";\n");
w.write(" public static final int MICRO=" + version.micro + ";\n");
w.write(" public static final String QUALIFIER="
+ (version.qualifier == null ? null :
"\"" + version.qualifier + "\"")
+ ";\n");
if (rev < 0) {
System.out.println("Unknown REVISION number, using " + rev);
}
w.write(" public static final int REVISION=" + rev + ";\n");
w.write(" public static final String BUILD_DATE=\"" + buildDate
+ "\";\n");
w.write("}\n");
} catch (IOException e) {
System.out.println("Unable to generate version.Info file: "
+ e.getMessage());
System.exit(1);
} finally {
if (w != null) {
try {
w.close();
} catch (IOException e) {
System.out.println("Unable to close file writer"
+ e.getMessage());
}
}
}
}
public static class Version {
public int maj;
public int min;
public int micro;
public String qualifier;
}
public static Version parseVersionString(String input) {
Version result = new Version();
Pattern p = Pattern.compile("^(\\d+).(\\d+).(\\d+)(-(.+))?$");
Matcher m = p.matcher(input);
if (!m.matches()) {
return null;
}
result.maj = Integer.parseInt(m.group(1));
result.min = Integer.parseInt(m.group(2));
result.micro = Integer.parseInt(m.group(3));
if (m.groupCount() == 5) {
result.qualifier = m.group(5);
} else {
result.qualifier = null;
}
return result;
}
/**
* Emits a org.apache.zookeeper.version.Info interface file with version and
* revision information constants set to the values passed in as command
* line parameters. The file is created in the current directory. <br>
* Usage: java org.apache.zookeeper.version.util.VerGen maj.min.micro[-qualifier]
* rev buildDate
*
* @param args
* <ul>
* <li>maj - major version number
* <li>min - minor version number
* <li>micro - minor minor version number
* <li>qualifier - optional qualifier (dash followed by qualifier text)
* <li>rev - current SVN revision number
* <li>buildDate - date the build
* </ul>
*/
public static void main(String[] args) {
if (args.length != 3)
printUsage();
try {
Version version = parseVersionString(args[0]);
if (version == null) {
System.err.println(
"Invalid version number format, must be \"x.y.z(-.*)?\"");
System.exit(1);
}
int rev;
try {
rev = Integer.parseInt(args[1]);
} catch (NumberFormatException e) {
rev = -1;
}
generateFile(new File("."), version, rev, args[2]);
} catch (NumberFormatException e) {
System.err.println(
"All version-related parameters must be valid integers!");
throw e;
}
}
}