package org.ensembl.healthcheck.testcase.eg_core;
import java.sql.Connection;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.commons.lang.StringUtils;
import org.ensembl.healthcheck.DatabaseRegistryEntry;
import org.ensembl.healthcheck.DatabaseServer;
import org.ensembl.healthcheck.ReportManager;
import org.ensembl.healthcheck.SystemCommand;
import org.ensembl.healthcheck.testcase.SingleDatabaseTestCase;
import org.ensembl.healthcheck.util.ActionAppendable;
public class SchemaPatchesApplied extends SingleDatabaseTestCase {
protected boolean passes;
public boolean isPasses() {
return passes;
}
public void setPasses(boolean passes) {
this.passes = passes;
}
public boolean run(DatabaseRegistryEntry dbr) {
setPasses(true);
final String schemaPatchScript = "./perlcode/ensembl/misc-scripts/schema_patcher.pl";
SystemCommand systemCommand = new SystemCommand();
// If the script can't be found, the test can terminate right away.
//
if (!systemCommand.checkCanExecute(schemaPatchScript)) {
ReportManager.problem(this, (Connection) null,
"Can't find "+ schemaPatchScript +"! "
+ this.getShortTestName() + " relies on this program to "
+ "find missing patches."
);
passes = false;
return passes;
}
String database = dbr.getName();
String type = dbr.getType().getName();
String release = dbr.getSchemaVersion();
DatabaseServer srv = dbr.getDatabaseServer();
logger.info("Running " + schemaPatchScript);
final Connection conn = dbr.getConnection();
final SchemaPatchesApplied thisTestRef = this;
String passwordOption = "";
if (!StringUtils.isEmpty(srv.getPass())) {
passwordOption = "--pass=" + srv.getPass();
}
String cmd =
schemaPatchScript
+ " --host=" + srv.getHost()
+ " --port=" + srv.getPort()
+ " --user=" + srv.getUser()
+ " " + passwordOption
+ " --database=" + database
+ " --type=" + type
+ " --from " + release
+ " --release " + release
+ " --verbose"
+ " --dryrun"
+ " --fix"
;
logger.info("Running " + cmd);
systemCommand.runCmd(
new String[] {
schemaPatchScript,
"--host=" + srv.getHost(),
"--port=" + srv.getPort(),
"--user=" + srv.getUser(),
"" + passwordOption,
"--database=" + database,
"--type=" + type,
"--from=" + release,
"--release=" + release,
"--verbose",
"--dryrun",
"--fix"
},
new ActionAppendable() {
@Override public void process(String message) {
if (message.startsWith("Would apply ")) {
//
// Line 600 in schema_patcher.pl
// printf( "Would apply patch '%s' (%s)\n",
//
//String pat = "Would apply (patch)";
String pat = "Would apply patch '(patch_.+sql)' \\((.+?)\\)";
Pattern pattern = Pattern.compile(pat);
Matcher matcher = pattern.matcher(message);
if (matcher.matches()) {
String patchName = matcher.group(1);
String type = matcher.group(2);
ReportManager.problem(thisTestRef, conn, "The patch file "+patchName+" has not been applied.");
thisTestRef.setPasses(false);
} else {
throw new RuntimeException(
"Can't parse message from script!\n"
+ "(" + message + ")\n"
+ "Maybe the script " + schemaPatchScript + " has been updated and the message it outputs no longer is matched by the regular expression."
);
}
}
}
},
new ActionAppendable() {
@Override public void process(String message) {
logger.warning(message);
}
}
);
return isPasses();
}
}