Add found bugs to database.
[cfb.git] / prod / net / jaekl / cfb / db / CfbSchema.java
index b298f5768c9f1f9cad6ac460c4bc69d9d1f78f21..6125393a3331eb8b6f04ec2366143fc3aa99cc2f 100644 (file)
 package net.jaekl.cfb.db;
 
+// Copyright (C) 2015 Christian Jaekl
+
 import static net.jaekl.cfb.db.Column.Null.*;
 import static net.jaekl.cfb.db.Column.Type.*;
+
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Collection;
+
+import net.jaekl.cfb.analyze.MessageMap;
 import net.jaekl.cfb.db.driver.DbDriver;
+import net.jaekl.cfb.xml.messages.BugCategory;
+import net.jaekl.cfb.xml.messages.BugPattern;
 
 
 public class CfbSchema extends Schema {
+       MessageMap m_msgMap;
+       
+       public static final Sequence BUG_SEQ      = new Sequence("BUG_SEQ");
+       public static final Sequence CATEGORY_SEQ = new Sequence("CATEGORY_SEQ");
+       public static final Sequence FOUND_SEQ    = new Sequence("FOUND_SEQ");
+       public static final Sequence LOC_SEQ      = new Sequence("LOC_SEQ");
+       public static final Sequence RUN_SEQ      = new Sequence("RUN_SEQ");
+       
+       public static final String BUGID = "BUGID";
+       public static final String CATEGORY = "CATEGORY";
+       public static final String CATEGORYID = "CATEGORYID";
+       public static final String CLASSNAME = "CLASSNAME";
+       public static final String ENDLINE = "ENDLINE";
+       public static final String FIRSTLOCID = "FIRSTLOCID";
+       public static final String FOUNDID = "FOUNDID";
+       public static final String LOCID = "LOCID";
+       public static final String METHODNAME = "METHODNAME";
+       public static final String RUNID = "RUNID";
+       public static final String SECONDLOCID = "SECONDLOCID";
+       public static final String STARTLINE = "STARTLINE";
+       public static final String THIRDLOCID = "THIRDLOCID";
+       public static final String TYPE = "TYPE";
+       
        // Define each table as follows:
        // {
        //   { table_name },
        //   { column_name, type, width (-1 for default), null/not_null }
        // }
-       private static final Object[][][] TABLES = {
-               {
-                       { "BUGS" },
-                       { "BUGID", INTEGER, -1, NOT_NULL },
-                       { "TYPE", VARCHAR, 80, NOT_NULL },
-                       { "SHORTDESCR", VARCHAR, 128, NOT_NULL },
-                       { "LONGDESCR", VARCHAR, 128, NOT_NULL },
-                       { "DETAILS", VARCHAR, 4096, NOT_NULL }
-               },
-               {
-                       { "CATEGORIES" },
-                       { "CATEGORYID", INTEGER, -1, NOT_NULL },
-                       { "DESCRIPTION", VARCHAR, 128, NOT_NULL },
-                       { "ABBREVIATION", CHAR, 1, NOT_NULL },
-                       { "DETAILS", VARCHAR, 4096, NOT_NULL }
-               },
-               { 
-                       { "FOUND" },
-                       { "FOUNDID", INTEGER, -1, NOT_NULL },
-                       { "BUGID", INTEGER, -1, NOT_NULL },
-                       { "CATEGORYID", INTEGER, -1, NOT_NULL },
-                       { "FIRSTLOCID", INTEGER, -1, NOT_NULL },
-                       { "SECONDLOCID", INTEGER, -1, NULL },
-                       { "THIRDLOCID", INTEGER, -1, NULL }
-               },
-               {
-                       { "LOCATION" },
-                       { "LOCID", INTEGER, -1, NOT_NULL },
-                       { "CLASSNAME", VARCHAR, 256, NOT_NULL },
-                       { "STARTLINE", INTEGER, -1, NULL },
-                       { "ENDLINE", INTEGER, -1, NULL }
-               },
-               {
-                       // Runs of FindBugs, normally one per build version
-                       { "RUNS " },
-                       { "RUNID", INTEGER, -1, NOT_NULL },
-                       { "VERSION", VARCHAR, 32, NULL },
-                       { "START", TIMESTAMPTZ, -1, NOT_NULL },
-                       { "END", TIMESTAMPTZ, -1, NOT_NULL }
-               }
-       };
+       private static final Object[][] BUGS_DEFN = 
+                               {
+                                       // Description of each possible bug
+                                       { "BUG" },
+                                       { BUGID, INTEGER, -1, NOT_NULL },
+                                       { TYPE, VARCHAR, 80, NOT_NULL }
+                               };
+       private static final Object[][] CATEGORIES_DEFN = 
+                               {
+                                       // Description of each possible bug category
+                                       { "CATEGORIES" },
+                                       { CATEGORYID, INTEGER, -1, NOT_NULL },
+                                       { CATEGORY, VARCHAR, 80, NOT_NULL }
+                               };
+       private static final Object[][] FOUND_DEFN = 
+                               { 
+                                       // One BugInstance, found during an analysis
+                                       { "FOUND" },
+                                       { FOUNDID, INTEGER, -1, NOT_NULL },
+                                       { BUGID, INTEGER, -1, NOT_NULL },
+                                       { CATEGORYID, INTEGER, -1, NOT_NULL },
+                                       { FIRSTLOCID, INTEGER, -1, NOT_NULL },
+                                       { SECONDLOCID, INTEGER, -1, NULL },
+                                       { THIRDLOCID, INTEGER, -1, NULL }
+                               };
+       private static final Object[][] LOCATIONS_DEFN = 
+                               {
+                                       // Location in the source code referenced by a BugInstance
+                                       { "LOCATION" },
+                                       { LOCID, INTEGER, -1, NOT_NULL },
+                                       { CLASSNAME, VARCHAR, 256, NOT_NULL },
+                                       { METHODNAME, VARCHAR, 256, NULL },
+                                       { STARTLINE, INTEGER, -1, NULL },
+                                       { ENDLINE, INTEGER, -1, NULL }
+                               };
+       private static final Object[][] RUNS_DEFN = 
+                               {
+                                       // Runs of FindBugs, normally one per build version
+                                       { "RUN" },
+                                       { RUNID, INTEGER, -1, NOT_NULL },
+                                       { "VERSION", VARCHAR, 32, NULL },
+                                       { "STARTTIME", TIMESTAMPTZ, -1, NOT_NULL },
+                                       { "ENDTIME", TIMESTAMPTZ, -1, NOT_NULL }
+                               };
+       
+       public static final Table BUGS       = Table.construct(BUGS_DEFN);
+       public static final Table CATEGORIES = Table.construct(CATEGORIES_DEFN);
+       public static final Table FOUND      = Table.construct(FOUND_DEFN);
+       public static final Table LOCATIONS  = Table.construct(LOCATIONS_DEFN);
+       public static final Table RUNS       = Table.construct(RUNS_DEFN);
+       
+       private static final Sequence[] SEQUENCES = {
+                                       BUG_SEQ,
+                                       CATEGORY_SEQ,
+                                       FOUND_SEQ,
+                                       LOC_SEQ,
+                                       RUN_SEQ
+                               };
+       
+       private static final Table[] TABLES = { 
+                                       BUGS,
+                                       CATEGORIES,
+                                       FOUND,
+                                       LOCATIONS,
+                                       RUNS
+                               };
        
        public CfbSchema(DbDriver driver) {
                super("CFB", driver);
+       
+               m_msgMap = null;
                
                addTables(TABLES);
-       }       
+               addSequences(SEQUENCES);
+       }
+       
+       public void setMessageMap(MessageMap msgMap) {
+               m_msgMap = msgMap;
+       }
+       
+       @Override
+       boolean postCreationInit(Connection con) throws SQLException {
+               assert(null != m_msgMap);
+               
+               if (! insertCategories(con)) {
+                       return false;
+               }
+               if (! insertPatterns(con)) {
+                       return false;
+               }
+               
+               return true;
+       }
+       
+       boolean insertCategories(Connection con) throws SQLException {
+               Collection<BugCategory> categories = m_msgMap.getColl().getCategories();
+
+               Object[][] values = new Object[categories.size()][CATEGORIES.getNumColumns()];
+               
+               int row = 0;
+               for (BugCategory cat : categories) {
+                       long categoryId = m_driver.nextVal(con, CATEGORY_SEQ);
+                       cat.setId(categoryId);
+                       
+                       values[row][0] = Long.valueOf(categoryId);
+                       values[row][1] = cat.getCategory();
+                       row++;
+               }
+               
+               int count = m_driver.insert(con, CATEGORIES, values);
+               
+               return (categories.size() == count);
+       }
+       
+       boolean insertPatterns(Connection con) throws SQLException {
+               Collection<BugPattern> patterns = m_msgMap.getColl().getPatterns();
+               
+               Object[][] values = new Object[patterns.size()][BUGS.getNumColumns()];
+               
+               int row = 0;
+               for (BugPattern bug : patterns) {
+                       long bugId = m_driver.nextVal(con, BUG_SEQ);
+                       bug.setId(bugId);
+                       
+                       values[row][0] = Long.valueOf(bugId);
+                       values[row][1] = bug.getType();
+                       row++;
+               }
+               
+               int count = m_driver.insert(con, BUGS, values);
+               
+               return (patterns.size() == count);
+       }
 }