/*
* 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.doc;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.OutputStream;
import java.io.StringReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.zip.CRC32;
import java.util.zip.Deflater;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.h2.dev.ftp.FtpClient;
import org.h2.engine.Constants;
import org.h2.store.fs.FileUtils;
import org.h2.test.utils.OutputCatcher;
import org.h2.util.IOUtils;
import org.h2.util.ScriptReader;
import org.h2.util.StringUtils;
/**
* Upload the code coverage result to the H2 web site.
*/
public class UploadBuild {
/**
* This method is called when executing this application from the command
* line.
*
* @param args the command line parameters
*/
public static void main(String... args) throws Exception {
System.setProperty("h2.socketConnectTimeout", "30000");
String password = System.getProperty("h2.ftpPassword");
if (password == null) {
return;
}
FtpClient ftp = FtpClient.open("h2database.com");
ftp.login("h2database", password);
ftp.changeWorkingDirectory("/httpdocs");
boolean coverage = new File("coverage/index.html").exists();
boolean coverageFailed;
if (coverage) {
byte[] data = IOUtils.readBytesAndClose(new FileInputStream("coverage/index.html"), -1);
String index = new String(data, "ISO-8859-1");
coverageFailed = index.indexOf("CLASS=\"h\"") >= 0;
while (true) {
int idx = index.indexOf("<A HREF=\"");
if (idx < 0) {
break;
}
int end = index.indexOf('>', idx) + 1;
index = index.substring(0, idx) + index.substring(end);
idx = index.indexOf("</A>");
index = index.substring(0, idx) + index.substring(idx + "</A>".length());
}
index = StringUtils.replaceAll(index, "[all", "");
index = StringUtils.replaceAll(index, "classes]", "");
FileOutputStream out = new FileOutputStream("coverage/overview.html");
out.write(index.getBytes("ISO-8859-1"));
out.close();
new File("details").mkdir();
zip("details/coverage_files.zip", "coverage", true);
zip("coverage.zip", "details", false);
FileUtils.delete("coverage.txt");
FileUtils.delete("details/coverage_files.zip");
FileUtils.delete("details");
if (ftp.exists("/httpdocs", "coverage")) {
ftp.removeDirectoryRecursive("/httpdocs/coverage");
}
ftp.makeDirectory("/httpdocs/coverage");
} else {
coverageFailed = true;
}
String testOutput;
boolean error;
if (new File("docs/html/testOutput.html").exists()) {
testOutput = IOUtils.readStringAndClose(new FileReader("docs/html/testOutput.html"), -1);
error = testOutput.indexOf(OutputCatcher.START_ERROR) >= 0;
} else if (new File("log.txt").exists()) {
testOutput = IOUtils.readStringAndClose(new FileReader("log.txt"), -1);
error = true;
} else {
testOutput = "No log.txt";
error = true;
}
if (!ftp.exists("/httpdocs", "automated")) {
ftp.makeDirectory("/httpdocs/automated");
}
String buildSql;
if (ftp.exists("/httpdocs/automated", "history.sql")) {
buildSql = new String(ftp.retrieve("/httpdocs/automated/history.sql"));
} else {
buildSql = "create table item(id identity, title varchar, issued timestamp, desc varchar);\n";
}
String ts = new java.sql.Timestamp(System.currentTimeMillis()).toString();
String now = ts.substring(0, 16);
int idx = testOutput.indexOf("Statements per second: ");
if (idx >= 0) {
int end = testOutput.indexOf("<br />", idx);
if (end >= 0) {
String result = testOutput.substring(idx + "Statements per second: ".length(), end);
now += " (" + result + " op/s)";
}
}
String sql = "insert into item(title, issued, desc) values('Build " + now +
(error ? " [FAILED]" : "") +
(coverageFailed ? " [COVERAGE]" : "") +
"', '" + ts + "', '<a href=\"http://www.h2database.com/html/testOutput.html\">Output</a>" +
" - <a href=\"http://www.h2database.com/coverage/overview.html\">Coverage</a>" +
" - <a href=\"http://www.h2database.com/automated/h2-latest.jar\">Jar</a>');\n";
buildSql += sql;
Connection conn;
try {
Class.forName("org.h2.Driver");
conn = DriverManager.getConnection("jdbc:h2:mem:");
} catch (Exception e) {
Class.forName("org.h2.upgrade.v1_1.Driver");
conn = DriverManager.getConnection("jdbc:h2v1_1:mem:");
}
conn.createStatement().execute(buildSql);
String newsfeed = IOUtils.readStringAndClose(new FileReader("src/tools/org/h2/build/doc/buildNewsfeed.sql"), -1);
ScriptReader r = new ScriptReader(new StringReader(newsfeed));
Statement stat = conn.createStatement();
ResultSet rs = null;
while (true) {
String s = r.readStatement();
if (s == null) {
break;
}
if (stat.execute(s)) {
rs = stat.getResultSet();
}
}
rs.next();
String content = rs.getString("content");
conn.close();
ftp.store("/httpdocs/automated/history.sql", new ByteArrayInputStream(buildSql.getBytes()));
ftp.store("/httpdocs/automated/news.xml", new ByteArrayInputStream(content.getBytes()));
ftp.store("/httpdocs/html/testOutput.html", new ByteArrayInputStream(testOutput.getBytes()));
String jarFileName = "bin/h2-" + Constants.getVersion() + ".jar";
if (FileUtils.exists(jarFileName)) {
ftp.store("/httpdocs/automated/h2-latest.jar", new FileInputStream(jarFileName));
}
if (coverage) {
ftp.store("/httpdocs/coverage/overview.html", new FileInputStream("coverage/overview.html"));
ftp.store("/httpdocs/coverage/coverage.zip", new FileInputStream("coverage.zip"));
FileUtils.delete("coverage.zip");
}
ftp.close();
}
private static void zip(String destFile, String directory, boolean storeOnly) throws IOException {
OutputStream out = new FileOutputStream(destFile);
ZipOutputStream zipOut = new ZipOutputStream(out);
if (storeOnly) {
zipOut.setMethod(ZipOutputStream.STORED);
}
zipOut.setLevel(Deflater.BEST_COMPRESSION);
addFiles(new File(directory), new File(directory), zipOut);
zipOut.finish();
zipOut.close();
}
private static void addFiles(File base, File file, ZipOutputStream out) throws IOException {
if (file.isDirectory()) {
for (File f : file.listFiles()) {
addFiles(base, f, out);
}
} else {
String path = file.getAbsolutePath().substring(base.getAbsolutePath().length());
path = path.replace('\\', '/');
if (path.startsWith("/")) {
path = path.substring(1);
}
byte[] data = IOUtils.readBytesAndClose(new FileInputStream(file), -1);
ZipEntry entry = new ZipEntry(path);
CRC32 crc = new CRC32();
crc.update(data);
entry.setSize(file.length());
entry.setCrc(crc.getValue());
out.putNextEntry(entry);
out.write(data);
out.closeEntry();
}
}
}