blob: 0ca816c01549000750be1e758e600e7e5caaf72f [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2017 Mountainminds GmbH & Co. KG and Contributors
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Marc R. Hoffmann - initial API and implementation
*
*******************************************************************************/
package org.jacoco.core.internal.analysis;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.jacoco.core.analysis.CoverageNodeImpl;
import org.jacoco.core.analysis.IBundleCoverage;
import org.jacoco.core.analysis.IClassCoverage;
import org.jacoco.core.analysis.IPackageCoverage;
import org.jacoco.core.analysis.ISourceFileCoverage;
/**
* Implementation of {@link IBundleCoverage}.
*/
public class BundleCoverageImpl extends CoverageNodeImpl implements
IBundleCoverage {
private final Collection<IPackageCoverage> packages;
/**
* Creates a new instance of a bundle with the given name.
*
* @param name
* name of this bundle
* @param packages
* collection of all packages contained in this bundle
*/
public BundleCoverageImpl(final String name,
final Collection<IPackageCoverage> packages) {
super(ElementType.BUNDLE, name);
this.packages = packages;
increment(packages);
}
/**
* Creates a new instance of a bundle with the given name. The packages are
* calculated from the given classes and source files.
*
* @param name
* name of this bundle
* @param classes
* all classes in this bundle
* @param sourcefiles
* all source files in this bundle
*/
public BundleCoverageImpl(final String name,
final Collection<IClassCoverage> classes,
final Collection<ISourceFileCoverage> sourcefiles) {
this(name, groupByPackage(classes, sourcefiles));
}
private static Collection<IPackageCoverage> groupByPackage(
final Collection<IClassCoverage> classes,
final Collection<ISourceFileCoverage> sourcefiles) {
final Map<String, Collection<IClassCoverage>> classesByPackage = new HashMap<String, Collection<IClassCoverage>>();
for (final IClassCoverage c : classes) {
addByName(classesByPackage, c.getPackageName(), c);
}
final Map<String, Collection<ISourceFileCoverage>> sourceFilesByPackage = new HashMap<String, Collection<ISourceFileCoverage>>();
for (final ISourceFileCoverage s : sourcefiles) {
addByName(sourceFilesByPackage, s.getPackageName(), s);
}
final Set<String> packageNames = new HashSet<String>();
packageNames.addAll(classesByPackage.keySet());
packageNames.addAll(sourceFilesByPackage.keySet());
final Collection<IPackageCoverage> result = new ArrayList<IPackageCoverage>();
for (final String name : packageNames) {
Collection<IClassCoverage> c = classesByPackage.get(name);
if (c == null) {
c = Collections.emptyList();
}
Collection<ISourceFileCoverage> s = sourceFilesByPackage.get(name);
if (s == null) {
s = Collections.emptyList();
}
result.add(new PackageCoverageImpl(name, c, s));
}
return result;
}
private static <T> void addByName(final Map<String, Collection<T>> map,
final String name, final T value) {
Collection<T> list = map.get(name);
if (list == null) {
list = new ArrayList<T>();
map.put(name, list);
}
list.add(value);
}
// === IBundleCoverage implementation ===
public Collection<IPackageCoverage> getPackages() {
return packages;
}
}