CoverageTable.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.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}