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}