001 /*
002 * Cobertura - http://cobertura.sourceforge.net/
003 *
004 * Copyright (C) 2005 Mark Doliner <thekingant@users.sourceforge.net>
005 *
006 * Cobertura is free software; you can redistribute it and/or modify
007 * it under the terms of the GNU General Public License as published
008 * by the Free Software Foundation; either version 2 of the License,
009 * or (at your option) any later version.
010 *
011 * Cobertura is distributed in the hope that it will be useful, but
012 * WITHOUT ANY WARRANTY; without even the implied warranty of
013 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 * General Public License for more details.
015 *
016 * You should have received a copy of the GNU General Public License
017 * along with Cobertura; if not, write to the Free Software
018 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
019 * USA
020 */
021
022 package net.sourceforge.cobertura.reporting;
023
024 import java.util.Iterator;
025 import java.util.Map;
026 import java.util.Set;
027 import java.util.TreeMap;
028 import java.util.TreeSet;
029
030 import net.sourceforge.cobertura.coverage.CoverageData;
031
032 public class CoverageReport
033 {
034
035 private Map packages;
036
037 public CoverageReport(Map coverageData) {
038 packages = new TreeMap();
039
040 Iterator iter = coverageData.entrySet().iterator();
041 while (iter.hasNext())
042 {
043 Map.Entry entry = (Map.Entry)iter.next();
044 String classname = (String)entry.getKey();
045 CoverageData instrumentation = (CoverageData)entry.getValue();
046 addClass(new Clazz(classname, instrumentation));
047 }
048 }
049
050 public void addClass(Clazz clazz)
051 {
052 String packageName = clazz.getPackageName();
053 Package pkg = (Package)packages.get(packageName);
054 if (pkg == null)
055 {
056 pkg = new Package(packageName);
057 packages.put(packageName, pkg);
058 }
059 pkg.addClass(clazz);
060 }
061
062 public double getBranchCoverageRate()
063 {
064 long numberOfBranches = getNumberOfBranches();
065 if (numberOfBranches == 0)
066 {
067 if (getNumberOfCoveredLines() == 0)
068 return 0;
069 return 1;
070 }
071 return (double)getNumberOfCoveredBranches()
072 / (double)numberOfBranches;
073 }
074
075 public Set getClasses()
076 {
077 Set ret = new TreeSet();
078
079 Iterator iter = packages.values().iterator();
080 while (iter.hasNext())
081 {
082 Package pkg = (Package)iter.next();
083 ret.addAll(pkg.getClasses());
084 }
085
086 return ret;
087 }
088
089 public double getLineCoverageRate()
090 {
091 long numberOfLines = getNumberOfLines();
092 if (numberOfLines == 0)
093 {
094 return 1;
095 }
096 return (double)getNumberOfCoveredLines() / (double)numberOfLines;
097 }
098
099 public long getNumberOfBranches()
100 {
101 long numberOfBranches = 0;
102
103 Iterator iter = packages.values().iterator();
104 while (iter.hasNext())
105 {
106 Package pkg = (Package)iter.next();
107 numberOfBranches += pkg.getNumberOfBranches();
108 }
109
110 return numberOfBranches;
111 }
112
113 public int getNumberOfClasses()
114 {
115 int numberOfClasses = 0;
116
117 Iterator iter = packages.values().iterator();
118 while (iter.hasNext())
119 {
120 Package pkg = (Package)iter.next();
121 numberOfClasses += pkg.getClasses().size();
122 }
123
124 return numberOfClasses;
125 }
126
127 public long getNumberOfCoveredBranches()
128 {
129 long numberOfCoveredBranches = 0;
130
131 Iterator iter = packages.values().iterator();
132 while (iter.hasNext())
133 {
134 Package pkg = (Package)iter.next();
135 numberOfCoveredBranches += pkg.getNumberOfCoveredBranches();
136 }
137
138 return numberOfCoveredBranches;
139 }
140
141 public long getNumberOfCoveredLines()
142 {
143 long numberOfCoveredLines = 0;
144
145 Iterator iter = packages.values().iterator();
146 while (iter.hasNext())
147 {
148 Package pkg = (Package)iter.next();
149 numberOfCoveredLines += pkg.getNumberOfCoveredLines();
150 }
151
152 return numberOfCoveredLines;
153 }
154
155 public long getNumberOfLines()
156 {
157 long numberOfLines = 0;
158
159 Iterator iter = packages.values().iterator();
160 while (iter.hasNext())
161 {
162 Package pkg = (Package)iter.next();
163 numberOfLines += pkg.getNumberOfLines();
164 }
165
166 return numberOfLines;
167 }
168
169 public Set getPackages()
170 {
171 return new TreeSet(packages.values());
172 }
173
174 public Set getSubPackages(Package pkg)
175 {
176 Set ret = new TreeSet();
177
178 Iterator iter = packages.values().iterator();
179 while (iter.hasNext())
180 {
181 Package nextPkg = (Package)iter.next();
182 if (nextPkg.getName().startsWith(pkg.getName())
183 && !nextPkg.getName().equals(pkg.getName()))
184 {
185 ret.add(nextPkg);
186 }
187 }
188
189 return ret;
190 }
191
192 public void removeClass(Clazz clazz)
193 {
194 String packageName = clazz.getPackageName();
195 Package pkg = (Package)packages.get(packageName);
196 pkg.removeClass(clazz);
197 if (pkg.getClasses().size() == 0)
198 {
199 packages.remove(packageName);
200 }
201 }
202
203 }