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 public class Package implements Comparable
031 {
032
033 private String name;
034 private Map classes;
035
036 public Package(String name)
037 {
038 if (name == null)
039 {
040 throw new IllegalArgumentException(
041 "Package name can not be null.");
042 }
043
044 this.name = name;
045 classes = new TreeMap();
046 }
047
048 public void addClass(Clazz clazz)
049 {
050 if (classes.containsKey(clazz.getName()))
051 {
052 throw new IllegalArgumentException(
053 "This package already contains the class "
054 + clazz.getName());
055 }
056 classes.put(clazz.getName(), clazz);
057 }
058
059 /**
060 * Required when implementing Comparable.
061 */
062 public int compareTo(Object o1)
063 {
064 String name1 = ((Package)o1).getName();
065 return name.compareToIgnoreCase(name1);
066 }
067
068 public double getBranchCoverageRate()
069 {
070 long numberOfBranches = getNumberOfBranches();
071 if (numberOfBranches == 0)
072 {
073 if (getNumberOfCoveredLines() == 0)
074 return 0;
075 return 1;
076 }
077 return (double)getNumberOfCoveredBranches()
078 / (double)numberOfBranches;
079 }
080
081 public Set getClasses()
082 {
083 return new TreeSet(classes.values());
084 }
085
086 public String getFileName()
087 {
088 return name.replace('.', '/');
089 }
090
091 public double getLineCoverageRate()
092 {
093 long numberOfLines = getNumberOfLines();
094 if (numberOfLines == 0)
095 {
096 return 1;
097 }
098 return (double)getNumberOfCoveredLines() / (double)numberOfLines;
099 }
100
101 public String getName()
102 {
103 return name;
104 }
105
106 public long getNumberOfBranches()
107 {
108 long numberOfBranches = 0;
109
110 Iterator iter = classes.values().iterator();
111 while (iter.hasNext())
112 {
113 Clazz clazz = (Clazz)iter.next();
114 numberOfBranches += clazz.getNumberOfBranches();
115 }
116
117 return numberOfBranches;
118 }
119
120 public long getNumberOfCoveredBranches()
121 {
122 long numberOfCoveredBranches = 0;
123
124 Iterator iter = classes.values().iterator();
125 while (iter.hasNext())
126 {
127 Clazz clazz = (Clazz)iter.next();
128 numberOfCoveredBranches += clazz.getNumberOfCoveredBranches();
129 }
130
131 return numberOfCoveredBranches;
132 }
133
134 public long getNumberOfCoveredLines()
135 {
136 long numberOfCoveredLines = 0;
137
138 Iterator iter = classes.values().iterator();
139 while (iter.hasNext())
140 {
141 Clazz clazz = (Clazz)iter.next();
142 numberOfCoveredLines += clazz.getNumberOfCoveredLines();
143 }
144
145 return numberOfCoveredLines;
146 }
147
148 public long getNumberOfLines()
149 {
150 long numberOfLines = 0;
151
152 Iterator iter = classes.values().iterator();
153 while (iter.hasNext())
154 {
155 Clazz clazz = (Clazz)iter.next();
156 numberOfLines += clazz.getNumberOfLines();
157 }
158
159 return numberOfLines;
160 }
161
162 public void removeClass(Clazz clazz)
163 {
164 classes.remove(clazz.getName());
165 }
166
167 }