/*
* Copyright 2004-2011 H2 Group. Multiple-Licensed under the H2 License,
* Version 1.0, and under the Eclipse Public License, Version 1.0
* (http://h2database.com/html/license.html).
* Initial Developer: H2 Group
*/
package org.h2.build;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.HashMap;
import java.util.TreeMap;
import java.util.Map.Entry;
import org.h2.build.code.SwitchSource;
import org.h2.build.doc.XMLParser;
/**
* The build definition.
*/
public class Build extends BuildBase {
private boolean filesMissing;
/**
* Run the build.
*
* @param args the command line arguments
*/
public static void main(String... args) {
new Build().run(args);
}
/**
* Run the benchmarks.
*/
public void benchmark() {
downloadUsingMaven("ext/hsqldb-2.0.0.jar", "hsqldb", "hsqldb", "2.0.0",
"c9d525ce1a464185e6b01c7de872127a06092673");
downloadUsingMaven("ext/derby-10.6.1.0.jar", "org/apache/derby", "derby", "10.6.1.0",
"01137cd636b0e3c22f0d273478adb58aa30e984a");
downloadUsingMaven("ext/derbyclient-10.6.1.0.jar", "org/apache/derby", "derbyclient", "10.6.1.0",
"e7c6fbaca2ef4dbcad27fa7d8a9cd1ac0d1e4b00");
downloadUsingMaven("ext/derbynet-10.6.1.0.jar", "org/apache/derby", "derbynet", "10.6.1.0",
"d5d9d7b783eeaef016be85c34d5c65d1e7cec764");
downloadUsingMaven("ext/postgresql-8.3-603.jdbc3.jar", "postgresql", "postgresql", "8.3-603.jdbc3",
"33d531c3c53055ddcbea3d88bfa093466ffef924");
downloadUsingMaven("ext/mysql-connector-java-5.1.6.jar", "mysql", "mysql-connector-java", "5.1.6",
"380ef5226de2c85ff3b38cbfefeea881c5fce09d");
compile();
String cp = "temp" + File.pathSeparator + "bin/h2" + getJarSuffix() + File.pathSeparator +
"ext/hsqldb.jar" + File.pathSeparator +
"ext/hsqldb-2.0.0.jar" + File.pathSeparator +
"ext/derby-10.6.1.0.jar" + File.pathSeparator +
"ext/derbyclient-10.6.1.0.jar" + File.pathSeparator +
"ext/derbynet-10.6.1.0.jar" + File.pathSeparator +
"ext/postgresql-8.3-603.jdbc3.jar" + File.pathSeparator +
"ext/mysql-connector-java-5.1.6.jar";
StringList args = args("-Xmx128m", "-cp", cp, "org.h2.test.bench.TestPerformance");
exec("java", args.plus("-init", "-db", "1"));
exec("java", args.plus("-db", "2"));
exec("java", args.plus("-db", "3", "-out", "pe.html"));
exec("java", args.plus("-init", "-db", "4"));
exec("java", args.plus("-db", "5", "-exit"));
exec("java", args.plus("-db", "6"));
exec("java", args.plus("-db", "7"));
exec("java", args.plus("-db", "8", "-out", "ps.html"));
}
/**
* Clean all jar files, classes, and generated documentation.
*/
public void clean() {
delete("temp");
delete("docs");
mkdir("docs");
mkdir("bin");
delete(files(".").keep("*/Thumbs.db"));
}
/**
* Compile all classes
*/
public void compile() {
compile(true, false, false);
}
private void compileTools() {
FileList files = files("src/tools").keep("src/tools/org/h2/build/*");
StringList args = args("-d", "temp", "-sourcepath", "src/tools" +
File.pathSeparator + "src/test" + File.pathSeparator + "src/main");
mkdir("temp");
javac(args, files);
}
/**
* Run the Emma code coverage.
*/
public void coverage() {
downloadTest();
downloadUsingMaven("ext/emma-2.0.5312.jar",
"emma", "emma", "2.0.5312",
"30a40933caf67d88d9e75957950ccf353b181ab7");
String cp = "temp" + File.pathSeparator + "bin" +
File.pathSeparator + "ext/emma-2.0.5312.jar" +
File.pathSeparator + "ext/postgresql-8.3-603.jdbc3.jar" +
File.pathSeparator + "ext/servlet-api-2.4.jar" +
File.pathSeparator + "ext/" + getLuceneJar() +
File.pathSeparator + "ext/h2mig_pagestore_addon.jar" +
File.pathSeparator + "ext/org.osgi.core-1.2.0.jar" +
File.pathSeparator + "ext/slf4j-api-1.6.0.jar" +
File.pathSeparator + "ext/slf4j-nop-1.6.0.jar" +
File.pathSeparator + System.getProperty("java.home") + "/../lib/tools.jar";
exec("java", args("-Xmx128m", "-cp", cp, "emma", "run",
"-cp", "temp",
"-sp", "src/main",
"-r", "html,txt",
"-ix", "-org.h2.test.*,-org.h2.dev.*,-org.h2.jaqu.*,-org.h2.mode.*",
"org.h2.test.TestAll"));
}
/**
* Switch the source code to the current JDK.
*/
public void switchSource() {
switchSource(true);
}
private static void switchSource(boolean enableCheck) {
try {
String version = System.getProperty("version");
String check = enableCheck ? "+CHECK" : "-CHECK";
if (version == null) {
SwitchSource.main("-dir", "src", "-auto", check);
} else {
SwitchSource.main("-dir", "src", "-version", version, check);
}
SwitchSource.main("-dir", "src", "-LUCENE2", "-LUCENE3", "+LUCENE" + getLuceneVersion());
} catch (IOException e) {
throw new RuntimeException(e);
}
}
private void compile(boolean debugInfo, boolean clientOnly, boolean basicResourcesOnly) {
switchSource(debugInfo);
clean();
mkdir("temp");
download();
String classpath = "temp" +
File.pathSeparator + "ext/servlet-api-2.4.jar" +
File.pathSeparator + "ext/" + getLuceneJar() +
File.pathSeparator + "ext/slf4j-api-1.6.0.jar" +
File.pathSeparator + "ext/org.osgi.core-1.2.0.jar" +
File.pathSeparator + "ext/commons-logging-1.1.1.jar" +
File.pathSeparator + "ext/druid-0.2.11.jar" +
File.pathSeparator + System.getProperty("java.home") + "/../lib/tools.jar";
FileList files;
if (clientOnly) {
files = files("src/main/org/h2/Driver.java");
files.addAll(files("src/main/org/h2/jdbc"));
files.addAll(files("src/main/org/h2/jdbcx"));
} else {
files = files("src/main");
}
StringList args = args();
if (System.getProperty("version") != null) {
String bcp = System.getProperty("bcp");
// /System/Library/Frameworks/JavaVM.framework/Versions/1.4/Classes/classes.jar
args = args.plus("-source", "1.5", "-target", "jsr14", "-bootclasspath", bcp);
}
if (debugInfo) {
args = args.plus("-Xlint:unchecked", "-d", "temp", "-sourcepath", "src/main", "-classpath", classpath);
} else {
args = args.plus("-Xlint:unchecked", "-g:none", "-d", "temp", "-sourcepath", "src/main", "-classpath", classpath);
}
args = args.plus("-XDignore.symbol.file=true");
javac(args, files);
files = files("src/main/META-INF/services");
copy("temp", files, "src/main");
if (!clientOnly) {
files = files("src/test");
files.addAll(files("src/tools"));
args = args("-Xlint:unchecked", "-d", "temp", "-sourcepath", "src/test" + File.pathSeparator + "src/tools",
"-classpath", classpath);
javac(args, files);
files = files("src/test").
exclude("*.java").
exclude("*/package.html");
copy("temp", files, "src/test");
}
resources(clientOnly, basicResourcesOnly);
}
private static void filter(String source, String target, String old, String replacement) {
String text = new String(readFile(new File(source)));
text = replaceAll(text, old, replacement);
writeFile(new File(target), text.getBytes());
}
/**
* Create the documentation from the documentation sources. API Javadocs are
* created as well.
*/
public void docs() {
javadoc();
copy("docs", files("src/docsrc/index.html"), "src/docsrc");
java("org.h2.build.doc.XMLChecker", null);
java("org.h2.build.code.CheckJavadoc", null);
java("org.h2.build.code.CheckTextFiles", null);
java("org.h2.build.doc.GenerateDoc", null);
java("org.h2.build.doc.GenerateHelp", null);
java("org.h2.build.i18n.PrepareTranslation", null);
java("org.h2.build.indexer.Indexer", null);
java("org.h2.build.doc.MergeDocs", null);
java("org.h2.build.doc.WebSite", null);
java("org.h2.build.doc.LinkChecker", null);
java("org.h2.build.doc.XMLChecker", null);
java("org.h2.build.doc.SpellChecker", null);
java("org.h2.build.code.CheckTextFiles", null);
beep();
}
/**
* Download all required jar files. Actually those are only compile time
* dependencies. The database can be used without any dependencies.
*/
public void download() {
downloadOrVerify(false);
}
private void downloadOrVerify(boolean offline) {
downloadOrVerify("ext/servlet-api-2.4.jar", "javax/servlet", "servlet-api", "2.4",
"3fc542fe8bb8164e8d3e840fe7403bc0518053c0", offline);
if (getLuceneVersion() == 3) {
downloadOrVerify("ext/lucene-core-3.0.2.jar", "org/apache/lucene", "lucene-core", "3.0.2",
"c2b48995ab855c1b9ea13867a0f976c994e0105d", offline);
} else {
downloadOrVerify("ext/lucene-core-2.2.0.jar", "org/apache/lucene", "lucene-core", "2.2.0",
"47b6eee2e17bd68911e7045896a1c09de0b2dda8", offline);
}
downloadOrVerify("ext/slf4j-api-1.6.0.jar", "org/slf4j", "slf4j-api", "1.6.0",
"b353147a7d51fcfcd818d8aa6784839783db0915", offline);
downloadOrVerify("ext/org.osgi.core-1.2.0.jar", "org/apache/felix", "org.osgi.core", "1.2.0",
"3006beb1ca6a83449def6127dad3c060148a0209", offline);
downloadOrVerify("ext/commons-logging-1.1.1.jar", "commons-logging", "commons-logging", "1.1.1",
"5043bfebc3db072ed80fbd362e7caf00e885d8ae", offline);
downloadOrVerify("ext/druid-0.2.11.jar", "com/alibaba", "druid", "0.2.11",
"70c22231d152a5e312076cdbd01d4d55464b5b68", offline);
}
private void downloadOrVerify(String target, String group, String artifact,
String version, String sha1Checksum, boolean offline) {
if (offline) {
File targetFile = new File(target);
if (targetFile.exists()) {
return;
}
println("Missing file: " + target);
filesMissing = true;
} else {
downloadUsingMaven(target, group, artifact, version, sha1Checksum);
}
}
private void downloadTest() {
// for TestUpgrade
download("ext/h2mig_pagestore_addon.jar",
"http://h2database.com/h2mig_pagestore_addon.jar",
"6dfafe1b86959c3ba4f7cf03e99535e8b9719965");
// for TestOldVersion
downloadUsingMaven("ext/h2-1.2.127.jar", "com/h2database", "h2", "1.2.127",
"056e784c7cf009483366ab9cd8d21d02fe47031a");
// for TestPgServer
downloadUsingMaven("ext/postgresql-8.3-603.jdbc3.jar", "postgresql", "postgresql", "8.3-603.jdbc3",
"33d531c3c53055ddcbea3d88bfa093466ffef924");
// for TestTraceSystem
downloadUsingMaven("ext/slf4j-nop-1.6.0.jar", "org/slf4j", "slf4j-nop", "1.6.0",
"4da67bb4a6eea5dc273f99c50ad2333eadb46f86");
}
private static String getVersion() {
return getStaticValue("org.h2.engine.Constants", "getVersion");
}
private static String getLuceneJar() {
return "lucene-core-" + (getLuceneVersion() == 2 ? "2.2.0" : "3.0.2") + ".jar";
}
private static int getLuceneVersion() {
// use Lucene 2 for H2 1.2.x, and Lucene 3 for H2 1.3.x.
String s = new String(readFile(new File("src/main/org/h2/engine/Constants.java")));
int idx = s.indexOf("VERSION_MINOR") + "VERSION_MINOR".length() + 3;
int version = Integer.parseInt(s.substring(idx, idx + 1));
return Integer.parseInt(System.getProperty("lucene", "" + version));
}
private static String getJarSuffix() {
return "-" + getVersion() + ".jar";
}
/**
* Create the h2.zip file and the Windows installer.
*/
public void installer() {
delete(files("bin").keep("*.jar"));
jar();
docs();
exec("soffice", args("-invisible", "macro:///Standard.Module1.H2Pdf"));
copy("docs", files("../h2web/h2.pdf"), "../h2web");
delete("docs/html/onePage.html");
FileList files = files("../h2").keep("../h2/build.*");
files.addAll(files("../h2/bin").keep("../h2/bin/h2*"));
files.addAll(files("../h2/docs").exclude("*.jar"));
files.addAll(files("../h2/service"));
files.addAll(files("../h2/src"));
zip("../h2web/h2.zip", files, "../", false, false);
boolean installer = false;
try {
exec("makensis", args("/v2", "src/installer/h2.nsi"));
installer = true;
} catch (Exception e) {
print("NSIS is not available: " + e);
}
String buildDate = getStaticField("org.h2.engine.Constants", "BUILD_DATE");
byte[] data = readFile(new File("../h2web/h2.zip"));
String sha1Zip = getSHA1(data), sha1Exe = null;
writeFile(new File("../h2web/h2-" + buildDate + ".zip"), data);
if (installer) {
data = readFile(new File("../h2web/h2-setup.exe"));
sha1Exe = getSHA1(data);
writeFile(new File("../h2web/h2-setup-" + buildDate + ".exe"), data);
}
updateChecksum("../h2web/html/download.html", sha1Zip, sha1Exe);
}
private static void updateChecksum(String fileName, String sha1Zip, String sha1Exe) {
String checksums = new String(readFile(new File(fileName)));
checksums = replaceAll(checksums, "<!-- sha1Zip -->",
"(SHA1 checksum: " + sha1Zip + ")");
if (sha1Exe != null) {
checksums = replaceAll(checksums, "<!-- sha1Exe -->",
"(SHA1 checksum: " + sha1Exe + ")");
}
writeFile(new File(fileName), checksums.getBytes());
}
/**
* Create the regular h2.jar file.
*/
public void jar() {
compile();
manifest("H2 Database Engine", "org.h2.tools.Console");
FileList files = files("temp").
exclude("temp/android/*").
exclude("temp/org/h2/android/*").
exclude("temp/org/h2/build/*").
exclude("temp/org/h2/dev/*").
exclude("temp/org/h2/jcr/*").
exclude("temp/org/h2/jaqu/*").
exclude("temp/org/h2/java/*").
exclude("temp/org/h2/jcr/*").
exclude("temp/org/h2/mode/*").
exclude("temp/org/h2/samples/*").
exclude("temp/org/h2/server/ftp/*").
exclude("temp/org/h2/test/*").
exclude("*.bat").
exclude("*.sh").
exclude("*.txt");
jar("bin/h2" + getJarSuffix(), files, "temp");
filter("src/installer/h2.sh", "bin/h2.sh", "h2.jar", "h2" + getJarSuffix());
filter("src/installer/h2.bat", "bin/h2.bat", "h2.jar", "h2" + getJarSuffix());
filter("src/installer/h2w.bat", "bin/h2w.bat", "h2.jar", "h2" + getJarSuffix());
}
/**
* Create the file h2android.jar. This only contains the embedded database,
* plus the H2 Android API. Debug information is disabled.
*/
public void jarAndroid() {
compile(false, false, true);
FileList files = files("temp").
exclude("temp/org/h2/bnf/*").
exclude("temp/org/h2/build/*").
exclude("temp/org/h2/dev/*").
exclude("temp/org/h2/fulltext/*").
exclude("temp/org/h2/jaqu/*").
exclude("temp/org/h2/java/*").
exclude("temp/org/h2/jdbcx/*").
exclude("temp/org/h2/jcr/*").
exclude("temp/org/h2/jmx/*").
exclude("temp/org/h2/mode/*").
exclude("temp/org/h2/samples/*").
exclude("temp/org/h2/server/*").
exclude("temp/org/h2/test/*").
exclude("temp/org/h2/tools/*").
exclude("*.bat").
exclude("*.sh").
exclude("*.txt");
files.add(new File("temp/org/h2/tools/DeleteDbFiles.class"));
files.add(new File("temp/org/h2/tools/CompressTool.class"));
jar("bin/h2android" + getJarSuffix(), files, "temp");
}
/**
* Create the h2client.jar. This only contains the remote JDBC
* implementation.
*/
public void jarClient() {
compile(true, true, false);
FileList files = files("temp").
exclude("temp/org/h2/build/*").
exclude("temp/org/h2/dev/*").
exclude("temp/org/h2/jaqu/*").
exclude("temp/org/h2/java/*").
exclude("temp/org/h2/jcr/*").
exclude("temp/org/h2/mode/*").
exclude("temp/org/h2/samples/*").
exclude("temp/org/h2/test/*").
exclude("*.bat").
exclude("*.sh").
exclude("*.txt");
long kb = jar("bin/h2client" + getJarSuffix(), files, "temp");
if (kb < 350 || kb > 450) {
throw new RuntimeException("Expected file size 350 - 450 KB, got: " + kb);
}
}
/**
* Create the file h2small.jar. This only contains the embedded database.
* Debug information is disabled.
*/
public void jarSmall() {
compile(false, false, true);
FileList files = files("temp").
exclude("temp/android/*").
exclude("temp/org/h2/android/*").
exclude("temp/org/h2/build/*").
exclude("temp/org/h2/dev/*").
exclude("temp/org/h2/jcr/*").
exclude("temp/org/h2/jaqu/*").
exclude("temp/org/h2/java/*").
exclude("temp/org/h2/jcr/*").
exclude("temp/org/h2/mode/*").
exclude("temp/org/h2/samples/*").
exclude("temp/org/h2/server/ftp/*").
exclude("temp/org/h2/test/*").
exclude("temp/org/h2/bnf/*").
exclude("temp/org/h2/fulltext/*").
exclude("temp/org/h2/jdbcx/*").
exclude("temp/org/h2/jmx/*").
exclude("temp/org/h2/server/*").
exclude("temp/org/h2/tools/*").
exclude("*.bat").
exclude("*.sh").
exclude("*.txt");
files.add(new File("temp/org/h2/tools/DeleteDbFiles.class"));
files.add(new File("temp/org/h2/tools/CompressTool.class"));
jar("bin/h2small" + getJarSuffix(), files, "temp");
}
/**
* Create the file h2jaqu.jar. This only contains the JaQu (Java Query)
* implementation. All other jar files do not include JaQu.
*/
public void jarJaqu() {
compile(true, false, true);
manifest("H2 JaQu", "");
FileList files = files("temp/org/h2/jaqu");
files.addAll(files("temp/META-INF/MANIFEST.MF"));
jar("bin/h2jaqu" + getJarSuffix(), files, "temp");
}
/**
* Create the Javadocs of the API (including the JDBC API) and tools.
*/
public void javadoc() {
compileTools();
delete("docs");
mkdir("docs/javadoc");
javadoc("-sourcepath", "src/main", "org.h2.jdbc", "org.h2.jdbcx",
"org.h2.tools", "org.h2.api", "org.h2.constant", "org.h2.fulltext",
"-classpath", "ext/" + getLuceneJar(),
"-docletpath", "bin" + File.pathSeparator + "temp",
"-doclet", "org.h2.build.doclet.Doclet");
copy("docs/javadoc", files("src/docsrc/javadoc"), "src/docsrc/javadoc");
}
/**
* Create the Javadocs of the implementation.
*/
public void javadocImpl() {
compileTools();
mkdir("docs/javadocImpl2");
javadoc("-sourcepath", "src/main" + File.pathSeparator +
"src/test" + File.pathSeparator + "src/tools" ,
"-noindex",
"-tag", "h2.resource",
"-d", "docs/javadocImpl2",
"-classpath", System.getProperty("java.home") +
"/../lib/tools.jar" +
File.pathSeparator + "ext/slf4j-api-1.6.0.jar" +
File.pathSeparator + "ext/servlet-api-2.4.jar" +
File.pathSeparator + "ext/" + getLuceneJar() +
File.pathSeparator + "ext/org.osgi.core-1.2.0.jar",
"-subpackages", "org.h2",
"-exclude", "org.h2.test.jaqu:org.h2.jaqu");
System.setProperty("h2.interfacesOnly", "false");
System.setProperty("h2.javadocDestDir", "docs/javadocImpl");
javadoc("-sourcepath", "src/main" + File.pathSeparator + "src/test" + File.pathSeparator + "src/tools",
"-classpath", System.getProperty("java.home") + "/../lib/tools.jar" +
File.pathSeparator + "ext/slf4j-api-1.6.0.jar" +
File.pathSeparator + "ext/servlet-api-2.4.jar" +
File.pathSeparator + "ext/" + getLuceneJar() +
File.pathSeparator + "ext/org.osgi.core-1.2.0.jar",
"-subpackages", "org.h2",
"-exclude", "org.h2.test.jaqu:org.h2.jaqu",
"-package",
"-docletpath", "bin" + File.pathSeparator + "temp",
"-doclet", "org.h2.build.doclet.Doclet");
copy("docs/javadocImpl", files("src/docsrc/javadoc"), "src/docsrc/javadoc");
}
private static void manifest(String title, String mainClassName) {
String manifest = new String(readFile(new File("src/main/META-INF/MANIFEST.MF")));
manifest = replaceAll(manifest, "${title}", title);
manifest = replaceAll(manifest, "${version}", getVersion());
manifest = replaceAll(manifest, "${buildJdk}", getJavaSpecVersion());
String createdBy = System.getProperty("java.runtime.version") +
" (" + System.getProperty("java.vm.vendor") + ")";
manifest = replaceAll(manifest, "${createdBy}", createdBy);
String mainClassTag = manifest == null ? "" : "Main-Class: " + mainClassName;
manifest = replaceAll(manifest, "${mainClassTag}", mainClassTag);
writeFile(new File("temp/META-INF/MANIFEST.MF"), manifest.getBytes());
}
/**
* This will build a release of the H2 .jar file and upload it to
* file:///data/h2database/m2-repo. This is only required when
* a new H2 version is made.
*/
public void mavenDeployCentral() {
// generate and deploy h2*-sources.jar file
FileList files = files("src/main");
copy("docs", files, "src/main");
files = files("docs").keep("docs/org/*").keep("*.java");
files.addAll(files("docs").keep("docs/META-INF/*"));
String manifest = new String(readFile(new File("src/installer/source-manifest.mf")));
manifest = replaceAll(manifest, "${version}", getVersion());
writeFile(new File("docs/META-INF/MANIFEST.MF"), manifest.getBytes());
jar("docs/h2-" + getVersion() + "-sources.jar", files, "docs");
delete("docs/org");
delete("docs/META-INF");
// the option -DgeneratePom=false doesn't work with some versions of
// Maven because of bug http://jira.codehaus.org/browse/MDEPLOY-84
// as a workaround we generate the pom, but overwrite it later on
// (that's why the regular jar is created at the very end)
execScript("mvn", args(
"deploy:deploy-file",
"-Dfile=docs/h2-" + getVersion() + "-sources.jar",
"-Durl=file:///data/h2database/m2-repo",
"-Dpackaging=jar",
"-Dclassifier=sources",
"-Dversion=" + getVersion(),
"-DartifactId=h2",
"-DgroupId=com.h2database"
// ,"-DgeneratePom=false"
));
// generate and deploy the h2*-javadoc.jar file
javadocImpl();
files = files("docs/javadocImpl2");
jar("docs/h2-" + getVersion() + "-javadoc.jar", files, "docs/javadocImpl2");
execScript("mvn", args(
"deploy:deploy-file",
"-Dfile=docs/h2-" + getVersion() + "-javadoc.jar",
"-Durl=file:///data/h2database/m2-repo",
"-Dpackaging=jar",
"-Dclassifier=javadoc",
"-Dversion=" + getVersion(),
"-DartifactId=h2",
"-DgroupId=com.h2database"
// ,"-DgeneratePom=false"
));
// generate and deploy the h2*.jar file
jar();
String pom = new String(readFile(new File("src/installer/pom-template.xml")));
pom = replaceAll(pom, "@version@", getVersion());
writeFile(new File("bin/pom.xml"), pom.getBytes());
execScript("mvn", args(
"deploy:deploy-file",
"-Dfile=bin/h2" + getJarSuffix(),
"-Durl=file:///data/h2database/m2-repo",
"-Dpackaging=jar",
"-Dversion=" + getVersion(),
"-DpomFile=bin/pom.xml",
"-DartifactId=h2",
"-DgroupId=com.h2database"));
}
/**
* This will build a 'snapshot' H2 .jar file and upload it the to the local
* Maven 2 repository.
*/
public void mavenInstallLocal() {
jar();
String pom = new String(readFile(new File("src/installer/pom-template.xml")));
pom = replaceAll(pom, "@version@", "1.0-SNAPSHOT");
writeFile(new File("bin/pom.xml"), pom.getBytes());
execScript("mvn", args(
"install:install-file",
"-Dversion=1.0-SNAPSHOT",
"-Dfile=bin/h2" + getJarSuffix(),
"-Dpackaging=jar",
"-DpomFile=bin/pom.xml",
"-DartifactId=h2",
"-DgroupId=com.h2database"));
}
/**
* Build the jar file without downloading any files over the network. If the
* required files are missing, they are are listed, and the jar file is not
* built.
*/
public void offline() {
downloadOrVerify(true);
if (filesMissing) {
println("Required files are missing");
println("Both Lucene 2 and 3 are supported using -Dlucene=x (x=2 or 3)");
} else {
jar();
}
}
private void resources(boolean clientOnly, boolean basicOnly) {
if (!clientOnly) {
java("org.h2.build.doc.GenerateHelp", null);
javadoc("-sourcepath", "src/main", "org.h2.tools", "org.h2.jmx",
"-docletpath", "bin" + File.pathSeparator + "temp",
"-doclet", "org.h2.build.doclet.ResourceDoclet");
}
FileList files = files("src/main").
exclude("*.MF").
exclude("*.java").
exclude("*/package.html").
exclude("*/java.sql.Driver");
if (basicOnly) {
files = files.keep("src/main/org/h2/res/_messages_en.*");
}
if (clientOnly) {
files = files.exclude("src/main/org/h2/res/javadoc.properties");
files = files.exclude("src/main/org/h2/server/*");
}
zip("temp/org/h2/util/data.zip", files, "src/main", true, false);
}
/**
* Just run the spellchecker.
*/
public void spellcheck() {
java("org.h2.build.doc.SpellChecker", null);
}
/**
* Compile and run all tests. This does not include the compile step.
*/
public void test() {
downloadTest();
// String cp = "temp" + File.pathSeparator + "bin/h2" + getJarSuffix() + File.pathSeparator +
// "ext/hsqldb.jar" + File.pathSeparator +
// "ext/hsqldb-2.0.0.jar" + File.pathSeparator +
// "ext/derby-10.6.1.0.jar" + File.pathSeparator +
// "ext/derbyclient-10.6.1.0.jar" + File.pathSeparator +
// "ext/derbynet-10.6.1.0.jar" + File.pathSeparator +
// "ext/postgresql-8.3-603.jdbc3.jar" + File.pathSeparator +
// "ext/mysql-connector-java-5.1.6.jar";
String cp = "temp" +
File.pathSeparator + "ext/servlet-api-2.4.jar" +
File.pathSeparator + "ext/" + getLuceneJar() +
File.pathSeparator + "ext/slf4j-api-1.6.0.jar" +
File.pathSeparator + "ext/org.osgi.core-1.2.0.jar" +
File.pathSeparator + "ext/commons-logging-1.1.1.jar" +
File.pathSeparator + "ext/druid-0.2.11.jar";
String testClass = System.getProperty("test", "org.h2.test.TestAll");
StringList args = args("-Xmx128m", "-cp", cp, testClass);
exec("java", args);
}
/**
* Print the system properties
*/
public void testSysProperties() {
System.out.println("environment settings:");
for (Entry<Object, Object> e : new TreeMap<Object, Object>(System.getProperties()).entrySet()) {
System.out.println(e);
}
}
/**
* Test the local network of this machine.
*/
public void testNetwork() {
try {
long start = System.currentTimeMillis();
System.out.println("localhost:");
System.out.println(" " + InetAddress.getByName("localhost"));
for (InetAddress address : InetAddress.getAllByName("localhost")) {
System.out.println(" " + address);
}
InetAddress localhost = InetAddress.getLocalHost();
System.out.println("getLocalHost:" + localhost);
for (InetAddress address : InetAddress.getAllByName(localhost.getHostAddress())) {
System.out.println(" " + address);
}
InetAddress address = InetAddress.getByName(localhost.getHostAddress());
System.out.println("byName:" + address);
ServerSocket serverSocket;
try {
serverSocket = new ServerSocket(0);
} catch (Exception e) {
e.printStackTrace();
serverSocket = new ServerSocket(0);
}
System.out.println(serverSocket);
int port = serverSocket.getLocalPort();
final ServerSocket accept = serverSocket;
start = System.currentTimeMillis();
Thread thread = new Thread() {
public void run() {
try {
System.out.println("server accepting");
Socket s = accept.accept();
Thread.sleep(100);
System.out.println("server accepted:" + s);
System.out.println("server read:" + s.getInputStream().read());
Thread.sleep(200);
s.getOutputStream().write(234);
Thread.sleep(100);
System.out.println("server closing");
s.close();
System.out.println("server done");
} catch (Throwable t) {
t.printStackTrace();
}
}
};
thread.start();
System.out.println("time: " + (System.currentTimeMillis() - start));
Thread.sleep(1000);
start = System.currentTimeMillis();
final Socket socket = new Socket();
socket.setSoTimeout(2000);
final InetSocketAddress socketAddress = new InetSocketAddress(address, port);
System.out.println("client:" + socketAddress);
try {
Thread t = new Thread() {
public void run() {
try {
socket.connect(socketAddress, 2000);
} catch (IOException e) {
e.printStackTrace();
}
}
};
t.start();
t.join(5000);
if (!socket.isConnected()) {
final InetSocketAddress localhostAddress = new InetSocketAddress("localhost", port);
System.out.println("not connected, trying localhost:" + socketAddress);
socket.connect(localhostAddress, 2000);
}
System.out.println("time: " + (System.currentTimeMillis() - start));
Thread.sleep(200);
start = System.currentTimeMillis();
System.out.println("client:" + socket.toString());
socket.getOutputStream().write(123);
System.out.println("time: " + (System.currentTimeMillis() - start));
Thread.sleep(100);
start = System.currentTimeMillis();
System.out.println("client read:" + socket.getInputStream().read());
socket.close();
} catch (Throwable t) {
t.printStackTrace();
}
thread.join(5000);
System.out.println("time: " + (System.currentTimeMillis() - start));
if (thread.isAlive()) {
System.out.println("thread is still alive, interrupting");
thread.interrupt();
}
Thread.sleep(100);
System.out.println("done");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* This build target is used for the automated build. It copies the result
* of the automated build (including test results, newsfeed, code coverage)
* to the public web site.
*/
public void uploadBuild() {
String password = System.getProperty("h2.ftpPassword");
if (password == null) {
throw new RuntimeException("h2.ftpPassword not set");
}
downloadTest();
FileList files = files("src/tools").keep("*/UploadBuild.java");
StringList args = args("-d", "temp", "-sourcepath", "src/tools" +
File.pathSeparator + "src/test" + File.pathSeparator + "src/main");
mkdir("temp");
javac(args, files);
String cp = "bin" + File.pathSeparator + "temp" +
File.pathSeparator + "ext/h2mig_pagestore_addon.jar";
exec("java", args("-Xmx128m", "-cp", cp,
"-Dh2.ftpPassword=" + password,
"org.h2.build.doc.UploadBuild"));
}
/**
* Build the h2console.war file.
*/
public void warConsole() {
jar();
copy("temp/WEB-INF", files("src/tools/WEB-INF/web.xml"), "src/tools/WEB-INF");
copy("temp", files("src/tools/WEB-INF/console.html"), "src/tools/WEB-INF");
copy("temp/WEB-INF/lib", files("bin/h2" + getJarSuffix()), "bin");
FileList files = files("temp").exclude("temp/org*").exclude("temp/META-INF*");
jar("bin/h2console.war", files, "temp");
}
protected String getLocalMavenDir() {
String userHome = System.getProperty("user.home", "");
File file = new File(userHome, ".m2/settings.xml");
if (!file.exists()) {
return super.getLocalMavenDir();
}
XMLParser p = new XMLParser(new String(BuildBase.readFile(file)));
HashMap<String, String> prop = new HashMap<String, String>();
for (String name = ""; p.hasNext();) {
int event = p.next();
if (event == XMLParser.START_ELEMENT) {
name += "/" + p.getName();
} else if (event == XMLParser.END_ELEMENT) {
name = name.substring(0, name.lastIndexOf('/'));
} else if (event == XMLParser.CHARACTERS) {
String text = p.getText().trim();
if (text.length() > 0) {
prop.put(name, text);
}
}
}
String local = prop.get("/settings/localRepository");
if (local == null) {
local = "${user.home}/.m2/repository";
}
local = replaceAll(local, "${user.home}", userHome);
return local;
}
}