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 */
023package com.jcoverage.coverage.reporting.collation;
024
025import java.util.Iterator;
026
027import com.jcoverage.reporting.AbstractLine;
028import com.jcoverage.reporting.Column;
029import com.jcoverage.reporting.Line;
030import com.jcoverage.reporting.Page;
031import org.apache.log4j.Logger;
032
033/**
034 *
035 */
036public 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}