X-Git-Url: http://jaekl.net/gitweb/?p=cfb.git;a=blobdiff_plain;f=prod%2Fnet%2Fjaekl%2Fcfb%2FCFB.java;h=c02aa546aa0f7efe1bd29b36f81703127e3e6497;hp=924d33182d28c4824207b6fde0712d4362d6d6b7;hb=2769cf82ccae57ee3716aecc9bd694be1f115d92;hpb=58107a0cbb49652e7772ce80fb73d2c027590eb1 diff --git a/prod/net/jaekl/cfb/CFB.java b/prod/net/jaekl/cfb/CFB.java index 924d331..c02aa54 100644 --- a/prod/net/jaekl/cfb/CFB.java +++ b/prod/net/jaekl/cfb/CFB.java @@ -9,7 +9,9 @@ package net.jaekl.cfb; import java.io.File; import java.io.IOException; +import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.nio.charset.Charset; import java.sql.Connection; import java.sql.SQLException; import java.text.MessageFormat; @@ -18,8 +20,12 @@ import java.util.Locale.Category; import net.jaekl.cfb.analyze.Analysis; import net.jaekl.cfb.analyze.Analyzer; +import net.jaekl.cfb.analyze.Delta; +import net.jaekl.cfb.analyze.HtmlReport; import net.jaekl.cfb.analyze.MessageMap; +import net.jaekl.cfb.analyze.Notifier; import net.jaekl.cfb.db.CfbSchema; +import net.jaekl.cfb.db.TypeMismatchException; import net.jaekl.cfb.db.driver.DbDriver; import net.jaekl.cfb.db.driver.PostgresqlDriver; import net.jaekl.cfb.store.DbStore; @@ -38,7 +44,10 @@ public class CFB { CfbBundle m_bundle; Locale m_locale; + Config m_config; + // Command-line parameters + File m_configFile; String m_dbName; // db name File m_fbp; // FindBugsProject file File m_fbDir; // Directory where FindBugs is installed @@ -46,15 +55,19 @@ public class CFB { int m_port; // db port String m_user; // db user String m_pass; // db password + String m_projName; // project (module) name String m_buildNum; // build number (version) boolean m_removeSchema; // purge DB schema + File m_output; // File to which we should write our output (report) CFB(Locale locale) { m_driver = new PostgresqlDriver(); m_schema = new CfbSchema(m_driver); m_locale = locale; m_bundle = CfbBundle.getInst(m_locale); + m_config = new Config(); + m_configFile = new File("config.properties"); m_dbName = "CFB"; m_fbp = null; m_fbDir = null; @@ -62,21 +75,26 @@ public class CFB { m_port = 5432; m_pass = ""; m_user = "user"; + m_projName = null; m_buildNum = null; m_removeSchema = false; + m_output = null; } Options createOptions() { Options opt = new Options(); - opt.addOption("d", "dbname", true, "DB name"); - opt.addOption("f", "fbp", true, "FindBugsProject file"); - opt.addOption("h", "host", true, "DB hostname"); - opt.addOption("n", "number", true, "Build number (version)"); - opt.addOption("p", "pass", true, "DB password"); - opt.addOption("r", "remove", false, "Remove database schema (drop all data)"); - opt.addOption("t", "port", true, "DB port"); - opt.addOption("u", "user", true, "DB username"); + opt.addOption("c", "config", true, "Properties configuration file"); + opt.addOption("d", "dbname", true, "DB name"); + opt.addOption(null, "drop-tables", false, "Remove database schema (drop all data)"); + opt.addOption("f", "fbp", true, "FindBugsProject file"); + opt.addOption("h", "host", true, "DB hostname"); + opt.addOption("j", "project", true, "proJect name"); + opt.addOption("n", "number", true, "Build number (version)"); + opt.addOption("o", "outfile", true, "Output report filename"); + opt.addOption("p", "pass", true, "DB password"); + opt.addOption("t", "port", true, "DB port"); + opt.addOption("u", "user", true, "DB username"); return opt; } @@ -86,6 +104,9 @@ public class CFB { try { CommandLine line = new GnuParser().parse(opt, args); + if (line.hasOption("c")) { + m_configFile = new File(line.getOptionValue("c")); + } if (line.hasOption("d")) { m_dbName = line.getOptionValue("d"); } @@ -95,13 +116,19 @@ public class CFB { if (line.hasOption("h")) { m_host = line.getOptionValue("h"); } + if (line.hasOption("j")) { + m_projName = line.getOptionValue("j"); + } if (line.hasOption("n")) { m_buildNum = line.getOptionValue("n"); } + if (line.hasOption("o")) { + m_output = new File(line.getOptionValue("o")); + } if (line.hasOption("p")) { m_pass = line.getOptionValue("p"); } - m_removeSchema = line.hasOption("r"); + m_removeSchema = line.hasOption("drop-tables"); if (line.hasOption("t")) { m_port = Integer.parseInt(line.getOptionValue("t")); } @@ -149,13 +176,20 @@ public class CFB { if (null != findBugsDir) { m_fbDir = new File(findBugsDir); } - } + } + + void readConfig() throws IOException { + if (null != m_configFile) { + m_config.readFile(m_configFile); + } + } - void doMain(PrintWriter pw, String[] args) throws SQLException, IOException, XmlParseException, SAXException { + void doMain(PrintWriter pw, String[] args) throws SQLException, IOException, XmlParseException, SAXException, TypeMismatchException { initArgs(); // read environment and system properties if ( ! parseArgs(pw, args) ) { return; } + readConfig(); File findBugsDir = getFindBugsDir(); File workDir = new File("."); @@ -169,7 +203,8 @@ public class CFB { m_schema.purge(con); return; } - m_schema.ensureDbInitialized(con); + m_schema.ensureDbInitialized(con); + messageMap.loadIds(con, m_driver); } catch (SQLException exc) { reportUnableToConnect(pw, exc); @@ -177,16 +212,26 @@ public class CFB { } Analyzer analyzer = new Analyzer(messageMap); - Analysis analysis = analyzer.analyze(pw, workDir, m_fbp, m_buildNum); + Analysis analysis = analyzer.analyze(pw, workDir, m_fbp, m_projName, m_buildNum); if (null == analysis) { pw.println(trans(CfbBundle.ANALYSIS_FAILED)); return; } try (Connection con = m_driver.connect(m_host, m_port, m_dbName, m_user, m_pass)) { - DbStore store = new DbStore(con); + DbStore store = new DbStore(con, m_driver, messageMap.getColl()); store.put(analysis); + Analysis prior = store.getPrior(analysis); + Delta delta = new Delta(prior, analysis); + + HtmlReport report = new HtmlReport(m_bundle, messageMap.getColl(), delta); + if (null != m_output) { + report.write(m_output); + } + + Notifier notifier = new Notifier(m_bundle, m_config); + notifier.sendEmailIfNeeded(pw, report); } catch (SQLException exc) { reportUnableToConnect(pw, exc); @@ -198,16 +243,21 @@ public class CFB { String cannotConnectFormat = trans(CfbBundle.CANNOT_CONNECT); String cannotConnect = MessageFormat.format(cannotConnectFormat, m_host, ""+m_port, m_dbName, m_user); exc.printStackTrace(pw); + SQLException next = exc.getNextException(); + while (null != next) { + next.printStackTrace(pw); + next = next.getNextException(); + } pw.println(cannotConnect); } public static void main(String[] args) { CFB cfb = new CFB(Locale.getDefault()); - try (PrintWriter pw = new PrintWriter(System.out)){ + try (PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out, Charset.defaultCharset()))) { cfb.doMain(pw, args); pw.flush(); - } catch (SQLException | IOException | XmlParseException | SAXException exc) { + } catch (SQLException | IOException | XmlParseException | SAXException | TypeMismatchException exc) { exc.printStackTrace(); } }