001    /**
002     * www.jcoverage.com
003     * Copyright (C)2003 jcoverage ltd.
004     *
005     * This file is part of jcoverage.
006     *
007     * jcoverage is free software; you can redistribute it and/or modify
008     * it under the terms of the GNU General Public License as published
009     * by the Free Software Foundation; either version 2 of the License,
010     * or (at your option) any later version.
011     *
012     * jcoverage is distributed in the hope that it will be useful, but
013     * WITHOUT ANY WARRANTY; without even the implied warranty of
014     * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
015     * General Public License for more details.
016     *
017     * You should have received a copy of the GNU General Public License
018     * along with jcoverage; if not, write to the Free Software
019     * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
020     * USA
021     *
022     */
023    package com.jcoverage.coverage.reporting.collation;
024    
025    import java.util.Iterator;
026    
027    import org.apache.log4j.Logger;
028    
029    import com.jcoverage.reporting.AbstractLine;
030    import com.jcoverage.reporting.Column;
031    import com.jcoverage.reporting.Line;
032    import com.jcoverage.reporting.Page;
033    
034    /**
035     *
036     */
037    public class OverallSummaryLine extends AbstractLine implements Line {
038      
039      static Logger logger=Logger.getLogger(OverallSummaryLine.class);
040      
041      public static Column COLUMN_TOTAL_JAVAFILES=new Column("files",Integer.class);
042      public static Column COLUMN_TOTAL_LINES=new Column("lines",Integer.class);
043      public static Column COLUMN_AVERAGE_COVERAGE=new Column("",Double.class);
044      public static Column COLUMN_AVERAGE_COVERAGE_PERCENT=new Column("%line",Integer.class);
045      public static Column COLUMN_BRANCH_AVERAGE_COVERAGE=new Column("",Double.class);
046      public static Column COLUMN_BRANCH_AVERAGE_COVERAGE_PERCENT=new Column("%branch",Integer.class);
047      
048      public Page instantiateDetailPage() {
049        return new ReportSummaryPage();
050      }
051    
052      public Object getField(Column column) {
053    
054        Object o=super.getField(column);
055    
056        if (column.equals(COLUMN_TOTAL_LINES)) {
057          return new Integer(getTotalLines());
058          
059        } else if (column.equals(COLUMN_AVERAGE_COVERAGE)) {
060          return new Double(getAverageLineCoverageRate());
061    
062        } else if (column.equals(COLUMN_AVERAGE_COVERAGE_PERCENT)) {
063          return new Integer(FieldHelper.toPercent(getAverageLineCoverageRate()));
064    
065        } else if (column.equals(COLUMN_BRANCH_AVERAGE_COVERAGE)) {
066          return new Double(getAverageBranchCoverageRate());
067    
068        } else if (column.equals(COLUMN_BRANCH_AVERAGE_COVERAGE_PERCENT)) {
069          return new Integer(FieldHelper.toPercent(getAverageBranchCoverageRate()));
070    
071        } else if (column.equals(COLUMN_TOTAL_JAVAFILES)) {
072          return new Integer(getTotalJavaFiles());
073    
074        } else {
075          return o;
076    
077        }
078      }
079    
080      double getAverageLineCoverageRate() {
081        int totalLines=0;
082        int coveredLines=0;
083        for (Iterator it=getDetailPage().getLines(ReportSummaryPage.CATEGORY_PACKAGE_SUMMARY).iterator();it.hasNext();) {
084          Line line=(Line)it.next();
085          int sourceLineCount=((Integer)line.getField(ReportSummaryPackageLine.COLUMN_TOTAL_LINES)).intValue();
086          totalLines+=sourceLineCount;
087          double rate=((Double)line.getField(ReportSummaryPackageLine.COLUMN_AVERAGE_COVERAGE)).doubleValue();
088          coveredLines+=(int)(sourceLineCount*rate);
089        }
090    
091        if (totalLines==0) {
092          return 1d;
093        } else {
094          return (double)coveredLines/totalLines;
095        }
096      }
097      
098      double getAverageBranchCoverageRate() {
099        if(getDetailPage().getLines(ReportSummaryPage.CATEGORY_PACKAGE_SUMMARY).size()==0) {
100          return 0d;
101        }
102    
103        double total=0d;
104    
105        for (Iterator it=getDetailPage().getLines(ReportSummaryPage.CATEGORY_PACKAGE_SUMMARY).iterator();it.hasNext();) {
106          Line line=(Line)it.next();
107          total+=((Double)line.getField(ReportSummaryPackageLine.COLUMN_BRANCH_AVERAGE_COVERAGE)).doubleValue();
108        }
109    
110        return total/getDetailPage().getLines(ReportSummaryPage.CATEGORY_PACKAGE_SUMMARY).size();
111      }
112    
113      int getTotalLines() {
114        int totalLines=0;
115        for (Iterator it=getDetailPage().getLines(ReportSummaryPage.CATEGORY_PACKAGE_SUMMARY).iterator();it.hasNext();) {
116          Line line=(Line)it.next();
117          totalLines+=((Integer)line.getField(ReportSummaryPackageLine.COLUMN_TOTAL_LINES)).intValue();
118        }
119        return totalLines;
120      }
121    
122      int getTotalJavaFiles() {
123        int totalFiles=0;
124        for (Iterator it=getDetailPage().getLines(ReportSummaryPage.CATEGORY_PACKAGE_SUMMARY).iterator();it.hasNext();) {
125          Line line=(Line)it.next();
126          totalFiles+=((Integer)line.getField(ReportSummaryPackageLine.COLUMN_TOTAL_JAVAFILES)).intValue();
127        }
128        return totalFiles;
129      }
130    
131    }