CoverageTable.java

    1/*******************************************************************************
    2 * Copyright (c) 2009 Mountainminds GmbH & Co. KG and others
    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.report.html;
   14
   15import java.io.IOException;
   16import java.util.ArrayList;
   17import java.util.Collection;
   18import java.util.Collections;
   19import java.util.Comparator;
   20import java.util.List;
   21
   22import org.jacoco.core.analysis.ICoverageNode;
   23import org.jacoco.report.ReportOutputFolder;
   24import org.jacoco.report.html.resources.Resources;
   25import org.jacoco.report.html.resources.Styles;
   26
   27/**
   28 * Renderer for a table of {@link ICoverageTableItem}s.
   29 * 
   30 * @author Marc R. Hoffmann
   31 * @version $Revision: $
   32 */
   33public class CoverageTable {
   34
   35    private final List<? extends ICoverageTableColumn> columns;
   36    private final Comparator<ICoverageTableItem> comparator;
   37
   38    /**
   39     * Create a new table with the given columns.
   40     * 
   41     * @param columns
   42     *            columns for this table
   43     * @param comparator
   44     *            comparator for sorting the table items
   45     */
   46    public CoverageTable(final List<? extends ICoverageTableColumn> columns,
   47            final Comparator<ICoverageNode> comparator) {
   48        this.columns = columns;
   49        this.comparator = new Comparator<ICoverageTableItem>() {
   50            public int compare(final ICoverageTableItem i1,
   51                    final ICoverageTableItem i2) {
   52                return comparator.compare(i1.getNode(), i2.getNode());
   53            }
   54        };
   55    }
   56
   57    /**
   58     * Renders a table for the given icon
   59     * 
   60     * @param parent
   61     *            parent element in which the table is created
   62     * @param items
   63     *            items that will make the table rows
   64     * @param total
   65     *            the summary of all coverage data items in the table static
   66     *            resources that might be referenced
   67     * @param resources
   68     *            static resources that might be referenced
   69     * @param base
   70     *            base folder of the table
   71     * @throws IOException
   72     *             in case of IO problems with the element output
   73     */
   74    public void render(final HTMLElement parent,
   75            final Collection<? extends ICoverageTableItem> items,
   76            final ICoverageNode total, final Resources resources,
   77            final ReportOutputFolder base) throws IOException {
   78        final List<ICoverageTableItem> sortedItems = sort(items);
   79        final HTMLElement table = parent.table(Styles.COVERAGETABLE);
   80        header(table, sortedItems, total, resources, base);
   81        footer(table, total, resources, base);
   82        body(table, sortedItems, resources, base);
   83    }
   84
   85    private void header(final HTMLElement table,
   86            final List<ICoverageTableItem> items, final ICoverageNode total,
   87            final Resources resources, final ReportOutputFolder base)
   88            throws IOException {
   89        final HTMLElement tr = table.thead().tr();
   90        for (final ICoverageTableColumn c : columns) {
   91            c.init(items, total);
   92            c.header(tr, resources, base);
   93        }
   94    }
   95
   96    private void footer(final HTMLElement table, final ICoverageNode total,
   97            final Resources resources, final ReportOutputFolder base)
   98            throws IOException {
   99        final HTMLElement tr = table.tfoot().tr();
  100        for (final ICoverageTableColumn c : columns) {
  101            c.footer(tr, total, resources, base);
  102        }
  103    }
  104
  105    private void body(final HTMLElement table,
  106            final List<ICoverageTableItem> items, final Resources resources,
  107            final ReportOutputFolder base) throws IOException {
  108        final HTMLElement tbody = table.tbody();
  109        for (final ICoverageTableItem item : items) {
  110            final HTMLElement tr = tbody.tr();
  111            for (final ICoverageTableColumn c : columns) {
  112                c.item(tr, item, resources, base);
  113            }
  114        }
  115    }
  116
  117    private List<ICoverageTableItem> sort(
  118            final Collection<? extends ICoverageTableItem> items) {
  119        final ArrayList<ICoverageTableItem> result = new ArrayList<ICoverageTableItem>(
  120                items);
  121        Collections.sort(result, comparator);
  122        return result;
  123    }
  124
  125}