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}