BundleCoverageImpl.java revision 283abfa148b749678924b5e75eabd35a2d58f9f8
1/*******************************************************************************
2 * Copyright (c) 2009, 2014 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.internal.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
22import org.jacoco.core.analysis.CoverageNodeImpl;
23import org.jacoco.core.analysis.IBundleCoverage;
24import org.jacoco.core.analysis.IClassCoverage;
25import org.jacoco.core.analysis.IPackageCoverage;
26import org.jacoco.core.analysis.ISourceFileCoverage;
27
28/**
29 * Implementation of {@link IBundleCoverage}.
30 */
31public class BundleCoverageImpl extends CoverageNodeImpl implements
32		IBundleCoverage {
33
34	private final Collection<IPackageCoverage> packages;
35
36	/**
37	 * Creates a new instance of a bundle with the given name.
38	 *
39	 * @param name
40	 *            name of this bundle
41	 * @param packages
42	 *            collection of all packages contained in this bundle
43	 */
44	public BundleCoverageImpl(final String name,
45			final Collection<IPackageCoverage> packages) {
46		super(ElementType.BUNDLE, name);
47		this.packages = packages;
48		increment(packages);
49	}
50
51	/**
52	 * Creates a new instance of a bundle with the given name. The packages are
53	 * calculated from the given classes and source files.
54	 *
55	 * @param name
56	 *            name of this bundle
57	 * @param classes
58	 *            all classes in this bundle
59	 * @param sourcefiles
60	 *            all source files in this bundle
61	 */
62	public BundleCoverageImpl(final String name,
63			final Collection<IClassCoverage> classes,
64			final Collection<ISourceFileCoverage> sourcefiles) {
65		this(name, groupByPackage(classes, sourcefiles));
66	}
67
68	private static Collection<IPackageCoverage> groupByPackage(
69			final Collection<IClassCoverage> classes,
70			final Collection<ISourceFileCoverage> sourcefiles) {
71		final Map<String, Collection<IClassCoverage>> classesByPackage = new HashMap<String, Collection<IClassCoverage>>();
72		for (final IClassCoverage c : classes) {
73			addByName(classesByPackage, c.getPackageName(), c);
74		}
75
76		final Map<String, Collection<ISourceFileCoverage>> sourceFilesByPackage = new HashMap<String, Collection<ISourceFileCoverage>>();
77		for (final ISourceFileCoverage s : sourcefiles) {
78			addByName(sourceFilesByPackage, s.getPackageName(), s);
79		}
80
81		final Set<String> packageNames = new HashSet<String>();
82		packageNames.addAll(classesByPackage.keySet());
83		packageNames.addAll(sourceFilesByPackage.keySet());
84
85		final Collection<IPackageCoverage> result = new ArrayList<IPackageCoverage>();
86		for (final String name : packageNames) {
87			Collection<IClassCoverage> c = classesByPackage.get(name);
88			if (c == null) {
89				c = Collections.emptyList();
90			}
91			Collection<ISourceFileCoverage> s = sourceFilesByPackage.get(name);
92			if (s == null) {
93				s = Collections.emptyList();
94			}
95			result.add(new PackageCoverageImpl(name, c, s));
96		}
97		return result;
98	}
99
100	private static <T> void addByName(final Map<String, Collection<T>> map,
101			final String name, final T value) {
102		Collection<T> list = map.get(name);
103		if (list == null) {
104			list = new ArrayList<T>();
105			map.put(name, list);
106		}
107		list.add(value);
108	}
109
110	// === IBundleCoverage implementation ===
111
112	public Collection<IPackageCoverage> getPackages() {
113		return packages;
114	}
115
116}
117