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 * $Id: $
12 *******************************************************************************/
13package org.jacoco.core.analysis;
14
15import java.util.ArrayList;
16import java.util.Collection;
17import java.util.Collections;
18import java.util.HashMap;
19import java.util.HashSet;
20import java.util.Map;
21import java.util.Set;
22
23/**
24 * Coverage data of a bundle. A bundle groups a collection of packages.
25 *
26 * @author Marc R. Hoffmann
27 * @version $Revision: $
28 */
29public class BundleCoverage extends CoverageNodeImpl {
30
31 private final Collection<PackageCoverage> packages;
32
33 /**
34 * Creates a new instance of a bundle with the given name.
35 *
36 * @param name
37 * name of this bundle
38 * @param packages
39 * collection of all packages contained in this bundle
40 */
41 public BundleCoverage(final String name,
42 final Collection<PackageCoverage> packages) {
43 super(ElementType.BUNDLE, name, false);
44 this.packages = packages;
45 increment(packages);
46 }
47
48 /**
49 * Creates a new instance of a bundle with the given name. The packages are
50 * calculated from the given classes and source files.
51 *
52 * @param name
53 * name of this bundle
54 * @param classes
55 * all classes in this bundle
56 * @param sourcefiles
57 * all source files in this bundle
58 */
59 public BundleCoverage(final String name,
60 final Collection<ClassCoverage> classes,
61 final Collection<SourceFileCoverage> sourcefiles) {
62 this(name, groupByPackage(classes, sourcefiles));
63 }
64
65 /**
66 * Returns all packages contained in this bundle.
67 *
68 * @return all packages
69 */
70 public Collection<PackageCoverage> getPackages() {
71 return packages;
72 }
73
74 private static Collection<PackageCoverage> groupByPackage(
75 final Collection<ClassCoverage> classes,
76 final Collection<SourceFileCoverage> sourcefiles) {
77 final Map<String, Collection<ClassCoverage>> classesByPackage = new HashMap<String, Collection<ClassCoverage>>();
78 for (final ClassCoverage c : classes) {
79 addByName(classesByPackage, c.getPackageName(), c);
80 }
81
82 final Map<String, Collection<SourceFileCoverage>> sourceFilesByPackage = new HashMap<String, Collection<SourceFileCoverage>>();
83 for (final SourceFileCoverage s : sourcefiles) {
84 addByName(sourceFilesByPackage, s.getPackageName(), s);
85 }
86
87 final Set<String> packageNames = new HashSet<String>();
88 packageNames.addAll(classesByPackage.keySet());
89 packageNames.addAll(sourceFilesByPackage.keySet());
90
91 final Collection<PackageCoverage> result = new ArrayList<PackageCoverage>();
92 for (final String name : packageNames) {
93 Collection<ClassCoverage> c = classesByPackage.get(name);
94 if (c == null) {
95 c = Collections.emptyList();
96 }
97 Collection<SourceFileCoverage> s = sourceFilesByPackage.get(name);
98 if (s == null) {
99 s = Collections.emptyList();
100 }
101 result.add(new PackageCoverage(name, c, s));
102 }
103 return result;
104 }
105
106 private static <T> void addByName(final Map<String, Collection<T>> map,
107 final String name, final T value) {
108 Collection<T> list = map.get(name);
109 if (list == null) {
110 list = new ArrayList<T>();
111 map.put(name, list);
112 }
113 list.add(value);
114 }
115
116}