BundleCoverage.java
1/*******************************************************************************
2 * Copyright (c) 2009, 2010 Mountainminds GmbH & Co. KG and Contributors
3 * All rights reserved. This program and the accompanying materials
4 * are made available under the terms of the Eclipse Public License v1.0
5 * which accompanies this distribution, and is available at
6 * http://www.eclipse.org/legal/epl-v10.html
7 *
8 * Contributors:
9 * Marc R. Hoffmann - initial API and implementation
10 *
11 *******************************************************************************/
12package org.jacoco.core.analysis;
13
14import java.util.ArrayList;
15import java.util.Collection;
16import java.util.Collections;
17import java.util.HashMap;
18import java.util.HashSet;
19import java.util.Map;
20import java.util.Set;
21
22/**
23 * Coverage data of a bundle. A bundle groups a collection of packages.
24 *
25 * @author Marc R. Hoffmann
26 * @version 0.4.1.20101007204400
27 */
28public class BundleCoverage extends CoverageNodeImpl {
29
30 private final Collection<PackageCoverage> packages;
31
32 /**
33 * Creates a new instance of a bundle with the given name.
34 *
35 * @param name
36 * name of this bundle
37 * @param packages
38 * collection of all packages contained in this bundle
39 */
40 public BundleCoverage(final String name,
41 final Collection<PackageCoverage> packages) {
42 super(ElementType.BUNDLE, name, false);
43 this.packages = packages;
44 increment(packages);
45 }
46
47 /**
48 * Creates a new instance of a bundle with the given name. The packages are
49 * calculated from the given classes and source files.
50 *
51 * @param name
52 * name of this bundle
53 * @param classes
54 * all classes in this bundle
55 * @param sourcefiles
56 * all source files in this bundle
57 */
58 public BundleCoverage(final String name,
59 final Collection<ClassCoverage> classes,
60 final Collection<SourceFileCoverage> sourcefiles) {
61 this(name, groupByPackage(classes, sourcefiles, new StringPool()));
62 }
63
64 /**
65 * Creates a new instance of a bundle with the given name. The packages are
66 * calculated from the given classes and source files.
67 *
68 * @param name
69 * name of this bundle
70 * @param classes
71 * all classes in this bundle
72 * @param sourcefiles
73 * all source files in this bundle
74 * @param stringPool
75 * pool to optimize the number of {@link String} instances
76 */
77 public BundleCoverage(final String name,
78 final Collection<ClassCoverage> classes,
79 final Collection<SourceFileCoverage> sourcefiles,
80 final StringPool stringPool) {
81 this(name, groupByPackage(classes, sourcefiles, stringPool));
82 }
83
84 /**
85 * Returns all packages contained in this bundle.
86 *
87 * @return all packages
88 */
89 public Collection<PackageCoverage> getPackages() {
90 return packages;
91 }
92
93 private static Collection<PackageCoverage> groupByPackage(
94 final Collection<ClassCoverage> classes,
95 final Collection<SourceFileCoverage> sourcefiles,
96 final StringPool stringPool) {
97 final Map<String, Collection<ClassCoverage>> classesByPackage = new HashMap<String, Collection<ClassCoverage>>();
98 for (final ClassCoverage c : classes) {
99 addByName(classesByPackage, stringPool.get(c.getPackageName()), c);
100 }
101
102 final Map<String, Collection<SourceFileCoverage>> sourceFilesByPackage = new HashMap<String, Collection<SourceFileCoverage>>();
103 for (final SourceFileCoverage s : sourcefiles) {
104 addByName(sourceFilesByPackage, s.getPackageName(), s);
105 }
106
107 final Set<String> packageNames = new HashSet<String>();
108 packageNames.addAll(classesByPackage.keySet());
109 packageNames.addAll(sourceFilesByPackage.keySet());
110
111 final Collection<PackageCoverage> result = new ArrayList<PackageCoverage>();
112 for (final String name : packageNames) {
113 Collection<ClassCoverage> c = classesByPackage.get(name);
114 if (c == null) {
115 c = Collections.emptyList();
116 }
117 Collection<SourceFileCoverage> s = sourceFilesByPackage.get(name);
118 if (s == null) {
119 s = Collections.emptyList();
120 }
121 result.add(new PackageCoverage(name, c, s));
122 }
123 return result;
124 }
125
126 private static <T> void addByName(final Map<String, Collection<T>> map,
127 final String name, final T value) {
128 Collection<T> list = map.get(name);
129 if (list == null) {
130 list = new ArrayList<T>();
131 map.put(name, list);
132 }
133 list.add(value);
134 }
135
136}