Add unit tests. Make DbStore handle cases where the bug type or category
[cfb.git] / prod / net / jaekl / cfb / store / DbStore.java
index 69ea8bbafaeb405ce06ce3387e2f9caa3f490678..ed22291387c14c8047593d7b1a11932633df6361 100644 (file)
@@ -3,7 +3,9 @@ package net.jaekl.cfb.store;
 import java.sql.Connection;
 import java.sql.SQLException;
 import java.util.List;
+import java.util.Locale;
 
+import net.jaekl.cfb.CfbBundle;
 import net.jaekl.cfb.analyze.Analysis;
 import net.jaekl.cfb.db.CfbSchema;
 import net.jaekl.cfb.db.Column;
@@ -17,6 +19,8 @@ import net.jaekl.cfb.db.driver.DbDriver;
 import net.jaekl.cfb.xml.BugCollection;
 import net.jaekl.cfb.xml.BugInstance;
 import net.jaekl.cfb.xml.LocalVariable;
+import net.jaekl.cfb.xml.messages.BugCategory;
+import net.jaekl.cfb.xml.messages.BugPattern;
 import net.jaekl.cfb.xml.messages.MessageCollection;
 
 public class DbStore {
@@ -42,7 +46,9 @@ public class DbStore {
                return getAnalysis(priorId);
        }
        
-       public boolean put(Analysis analysis) throws SQLException, TypeMismatchException {
+       public boolean put(Analysis analysis) throws SQLException, TypeMismatchException, StoreException {
+               CfbBundle bundle = CfbBundle.getInst(Locale.getDefault());
+               
                if (null == analysis) {
                        return false;
                }
@@ -54,6 +60,7 @@ public class DbStore {
                Object[][] values = { 
                                                                {
                                                                        Long.valueOf(runId),
+                                                                       analysis.getProjectName(),
                                                                        analysis.getBuildNumber(),
                                                                        analysis.getStart(),
                                                                        analysis.getEnd() 
@@ -81,6 +88,13 @@ public class DbStore {
                        Location secondLoc = (locs.size() > 1) ? locs.get(1) : null;
                        Location thirdLoc  = (locs.size() > 2) ? locs.get(2) : null;
                        
+                       if (BugPattern.UNKNOWN.getId() == bugId) {
+                               throw new StoreException(bundle.get(CfbBundle.BUG_TYPE_UNKNOWN, ""+bug.getType()));
+                       }
+                       if (BugCategory.UNKNOWN.getId() == categoryId) {
+                               throw new StoreException(bundle.get(CfbBundle.BUG_CATEGORY_UNKNOWN, ""+bug.getCategory()));
+                       }
+                       
                        values[row][0] = foundId;
                        values[row][1] = runId;
                        values[row][2] = bugId;
@@ -119,6 +133,10 @@ public class DbStore {
        
        Location getLoc(Long locId) throws SQLException, TypeMismatchException
        {
+               if (null == locId) {
+                       return null;
+               }
+               
                Column[] columns = { CfbSchema.CLASSNAME, CfbSchema.METHODNAME, CfbSchema.METHODROLE, CfbSchema.STARTLINE, CfbSchema.ENDLINE };
                Table[] tables = { CfbSchema.LOCATIONS };
                Condition[] conditions = { new Condition(CfbSchema.LOCID, locId, Operation.EQUAL) };
@@ -128,8 +146,8 @@ public class DbStore {
                String className = row.getString(0);
                String methodName = row.getString(1);
                String methodRole = row.getString(2);
-               long startLine = row.getLong(3);
-               long endLine = row.getLong(4);
+               Integer startLine = row.getInt(3);
+               Integer endLine = row.getInt(4);
                
                Location loc = new Location(locId, className, methodName, methodRole, startLine, endLine);
                return loc;
@@ -206,6 +224,10 @@ public class DbStore {
        
        LocalVariable getVar(Long varId) throws SQLException, TypeMismatchException
        {
+               if (null == varId) {
+                       return null;
+               }
+               
                Column[] columns = { CfbSchema.NAME, CfbSchema.VARROLE };
                Table[] tables = { CfbSchema.VARIABLES };
                Condition[] conditions = { new Condition(CfbSchema.VARID_PK, varId, Operation.EQUAL) };
@@ -279,7 +301,10 @@ public class DbStore {
        {
                Column[] columns = { CfbSchema.RUNID };
                Table[] tables = { CfbSchema.RUNS };
-               Condition[] conditions = { new Condition( CfbSchema.STARTTIME, analysis.getStart(), Operation.LESS_THAN ) };
+               Condition[] conditions = {
+                       new Condition( CfbSchema.PROJNAME, analysis.getProjectName(), Operation.EQUAL ),
+                       new Condition( CfbSchema.STARTTIME, analysis.getStart(), Operation.LESS_THAN ) 
+               };
                Sort[] sorts = { new Sort( CfbSchema.STARTTIME, Sort.Direction.DESCENDING ) };
                int limit = 1;
                
@@ -290,11 +315,11 @@ public class DbStore {
                return rows.get(0).getLong(0);
        }
        
-       Analysis getAnalysis(Long priorId) throws SQLException, TypeMismatchException
+       Analysis getAnalysis(Long analysisId) throws SQLException, TypeMismatchException
        {
-               Column[] columns = { CfbSchema.VERSION, CfbSchema.STARTTIME, CfbSchema.ENDTIME };
+               Column[] columns = { CfbSchema.PROJNAME, CfbSchema.VERSION, CfbSchema.STARTTIME, CfbSchema.ENDTIME };
                Table[] tables = { CfbSchema.RUNS };
-               Condition[] conditions = { new Condition( CfbSchema.RUNID, priorId, Operation.EQUAL ) };
+               Condition[] conditions = { new Condition( CfbSchema.RUNID, analysisId, Operation.EQUAL ) };
                
                List<Row> rows = m_driver.select(m_con, columns, tables, conditions);
                if (rows.size() < 1) {
@@ -303,16 +328,17 @@ public class DbStore {
                
                Row row = rows.get(0);
                
-               String version = row.getString(0);
-               java.util.Date start= row.getDate(1);
-               java.util.Date end = row.getDate(2);
+               String projName = row.getString(0);
+               String version = row.getString(1);
+               java.util.Date start= row.getDate(2);
+               java.util.Date end = row.getDate(3);
                
-               Analysis prior = new Analysis(version);
-               prior.setId(priorId.longValue());
+               Analysis prior = new Analysis(projName, version);
+               prior.setId(analysisId.longValue());
                prior.setStart(start);
                prior.setEnd(end);
                
-               prior.setBugCollection(getBugCollection(priorId));
+               prior.setBugCollection(getBugCollection(analysisId));
                
                return prior;
        }
@@ -341,21 +367,21 @@ public class DbStore {
                
                for (Row row : rows) {
                        // long foundId = row.getLong(0);
-                       long bugId = row.getLong(1);
-                       long categoryId = row.getLong(2);
-                       long firstLocId = row.getLong(3);
-                       long secondLocId = row.getLong(4);
-                       long thirdLocId = row.getLong(5);
-                       long varId = row.getLong(6);
+                       Long bugId = row.getLong(1);
+                       Long categoryId = row.getLong(2);
+                       Long firstLocId = row.getLong(3);
+                       Long secondLocId = row.getLong(4);
+                       Long thirdLocId = row.getLong(5);
+                       Long varId = row.getLong(6);
                        
                        String bugType = getBugType(bugId);
                        String category = getCategoryName(categoryId);
                        Location[] locations = { getLoc(firstLocId), getLoc(secondLocId), getLoc(thirdLocId) };
-                       LocalVariable[] vars = { getVar(Long.valueOf(varId)) };
+                       LocalVariable[] vars = { getVar(varId) };
 
                        
                        BugInstance bug = new BugInstance(bugId, category, bugType, locations, vars);
-                       coll.getBugs().add(bug);
+                       coll.add(bug);
                }
                
                return coll;