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    }