Add some unit testing of the CfbSchema.
[cfb.git] / prod / net / jaekl / cfb / analyze / MessageMap.java
index 97180030af8a9b80e109278532fe81f4afc29436..ae389ad845496a9fd79c9623bc34e1777d6cf4f7 100644 (file)
@@ -4,8 +4,20 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
 import java.io.IOException;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.List;
 import java.util.Locale;
 
+import net.jaekl.cfb.db.CfbSchema;
+import net.jaekl.cfb.db.Column;
+import net.jaekl.cfb.db.Condition;
+import net.jaekl.cfb.db.Row;
+import net.jaekl.cfb.db.Table;
+import net.jaekl.cfb.db.TypeMismatchException;
+import net.jaekl.cfb.db.driver.DbDriver;
+import net.jaekl.cfb.xml.messages.BugCategory;
+import net.jaekl.cfb.xml.messages.BugPattern;
 import net.jaekl.cfb.xml.messages.MessageCollection;
 import net.jaekl.qd.xml.ParseErrorHandler;
 import net.jaekl.qd.xml.ParseHandler;
@@ -30,6 +42,58 @@ public class MessageMap {
        public MessageCollection getColl() { return m_msgColl; }
        public File getFindBugsDir() { return m_findBugsDir; }
 
+       // Load the list of primary keys (sequence numbers) from the database
+       public void loadIds(Connection con, DbDriver driver) throws SQLException, TypeMismatchException
+       {
+               loadCategoryIds(con, driver);
+               loadBugPatternIds(con, driver);
+               
+       }
+       
+       void loadCategoryIds(Connection con, DbDriver driver) throws SQLException, TypeMismatchException
+       {
+               Column[] columns = { CfbSchema.CATEGORYID,
+                                            CfbSchema.CATEGORY   };
+               Table[] tables = { CfbSchema.CATEGORIES };
+               Condition[] conditions = { };
+               List<Row> rows = driver.select(con, columns, tables, conditions);
+               
+               for (Row row : rows) {
+                       long catId = row.getLong(0);
+                       String catName = row.getString(1);
+                       
+                       BugCategory cat = getColl().getCategory(catName);
+                       if (null == cat) {
+                               throw new SQLException("Database result (" + catId + ", \"" + catName + "\") not found in messages.xml.  "
+                                                              + "Perhaps your database and findbugs versions are out of sync?");
+                       }
+                       
+                       cat.setId(catId);
+               }
+       }
+       
+       void loadBugPatternIds(Connection con, DbDriver driver) throws SQLException, TypeMismatchException
+       {
+               Column[] columns = { CfbSchema.BUGID, CfbSchema.TYPE }; 
+               Table[] tables = { CfbSchema.BUGS };
+               Condition[] conditions = { };
+               List<Row> rows = driver.select(con, columns, tables, conditions);
+               
+               for (Row row: rows) {
+                       long bugId = row.getLong(0);
+                       String type = row.getString(1);
+                       
+                       BugPattern bug = getColl().getPattern(type);
+                       if (null == bug) {
+                               throw new SQLException("Database result (" + bugId + ", \"" + type + "\") not found in messages.xml.  "
+                                      + "Perhaps your database and findbugs versions are out of sync?");
+                       }
+                       
+                       bug.setId(bugId);
+               }
+       }
+
+       // Load the list of bug patterns and categories from the FindBugs messages.xml file.
        public void load(File findBugsDir, Locale locale) throws FileNotFoundException, IOException, SAXException
        {
                m_findBugsDir = findBugsDir;
@@ -51,7 +115,8 @@ public class MessageMap {
                
        }
        
-       void parse(InputSource xml) throws FileNotFoundException, IOException, SAXException 
+       // Parse the FindBugs messages.xml file
+       public void parse(InputSource xml) throws FileNotFoundException, IOException, SAXException 
        {
                m_msgColl = new MessageCollection();