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 com.jcoverage.reporting.AbstractLine;
028    import com.jcoverage.reporting.Column;
029    import com.jcoverage.reporting.Line;
030    import com.jcoverage.reporting.Page;
031    import org.apache.log4j.Logger;
032    
033    /**
034     *
035     */
036    public class ReportSummaryPackageLine extends AbstractLine implements Line {
037      
038      static Logger logger=Logger.getLogger(ReportSummaryPackageLine.class);
039      
040      public static Column COLUMN_PACKAGE_NAME=new Column("packagename",String.class);
041      public static Column COLUMN_TOTAL_LINES=new Column("lines",Integer.class);
042      public static Column COLUMN_AVERAGE_COVERAGE=new Column("",Double.class);
043      public static Column COLUMN_AVERAGE_COVERAGE_PERCENT=new Column("%line",Integer.class);
044      public static Column COLUMN_BRANCH_AVERAGE_COVERAGE=new Column("",Double.class);
045      public static Column COLUMN_BRANCH_AVERAGE_COVERAGE_PERCENT=new Column("%branch",Integer.class);
046      public static Column COLUMN_TOTAL_JAVAFILES=new Column("files",Integer.class);
047    
048      public Page instantiateDetailPage() {
049        return new PackageSummaryPage();
050      }
051    
052      public Object getField(Column column) {
053    
054        Object o=super.getField(column);
055    
056        if (column.equals(COLUMN_TOTAL_LINES)) {
057          getDetailPage().getLines(PackageSummaryPage.CATEGORY_JAVAFILES);
058          return new Integer(getSourceLinesCount());
059          
060        } else if (column.equals(COLUMN_AVERAGE_COVERAGE)) {
061          return new Double(getAverageLineCoverageRate());
062    
063        } else if (column.equals(COLUMN_AVERAGE_COVERAGE_PERCENT)) {
064          return new Integer(FieldHelper.toPercent(getAverageLineCoverageRate()));
065          
066        } else if (column.equals(COLUMN_BRANCH_AVERAGE_COVERAGE)) {
067          return new Double(getAverageBranchCoverageRate());
068    
069        } else if (column.equals(COLUMN_BRANCH_AVERAGE_COVERAGE_PERCENT)) {
070          return new Integer(FieldHelper.toPercent(getAverageBranchCoverageRate()));
071    
072        } else if (column.equals(COLUMN_TOTAL_JAVAFILES)) {
073          return new Integer(getDetailPage().getLines(PackageSummaryPage.CATEGORY_JAVAFILES).size());
074    
075        } else {
076          return o;
077    
078        }
079      }
080    
081      public int getSourceLinesCount() {
082        int totalLines=0;
083        for (Iterator it=getDetailPage().getLines(PackageSummaryPage.CATEGORY_JAVAFILES).iterator();it.hasNext();) {
084          totalLines+=((Integer)((Line)it.next()).getField(JavaFileLine.COLUMN_SOURCE_LINES)).intValue();
085        }
086        return totalLines;
087      }
088    
089      public double getAverageLineCoverageRate() {
090        int totalLines=0;
091        int coveredLines=0;
092        for (Iterator it=getDetailPage().getLines(PackageSummaryPage.CATEGORY_JAVAFILES).iterator();it.hasNext();) {
093          Line line=(Line)it.next();
094          int sourceLineCount=((Integer)line.getField(JavaFileLine.COLUMN_SOURCE_LINES)).intValue();
095          totalLines+=sourceLineCount;
096          double rate=((JavaFilePage)line.getDetailPage()).getLineCoverageRate();
097          coveredLines+=(int)(sourceLineCount*rate);
098        }
099    
100        if (totalLines==0) {
101          return 1d;
102        } else {
103          return (double)coveredLines/totalLines;
104        }
105      }
106    
107      public double getAverageBranchCoverageRate() {
108        if(getDetailPage().getLines(PackageSummaryPage.CATEGORY_JAVAFILES).isEmpty()) {
109          return 1d;
110        }
111    
112        double total=0d;
113    
114        for (Iterator it=getDetailPage().getLines(PackageSummaryPage.CATEGORY_JAVAFILES).iterator();it.hasNext();) {
115          Line line=(Line)it.next();
116          total+=((Double)line.getField(JavaFileLine.COLUMN_BRANCH_COVERAGE)).doubleValue();
117        }
118    
119        return total/getDetailPage().getLines(PackageSummaryPage.CATEGORY_JAVAFILES).size();
120      }
121    }