| /******************************************************************************* |
| * 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; |
| } |
| |
| } |