PercentageColumn.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.report.html.table;
13
14import java.io.IOException;
15import java.text.DecimalFormat;
16import java.text.NumberFormat;
17import java.util.Comparator;
18import java.util.List;
19import java.util.Locale;
20
21import org.jacoco.core.analysis.CounterComparator;
22import org.jacoco.core.analysis.ICounter;
23import org.jacoco.core.analysis.ICoverageNode;
24import org.jacoco.core.analysis.ICoverageNode.CounterEntity;
25import org.jacoco.report.ReportOutputFolder;
26import org.jacoco.report.html.HTMLElement;
27import org.jacoco.report.html.resources.Resources;
28
29/**
30 * Column that prints the coverage percentage for each item and the total
31 * percentage in the footer. The implementation is stateless, instances might be
32 * used in parallel.
33 *
34 * @author Marc R. Hoffmann
35 * @version 0.4.1.20101007204400
36 */
37public class PercentageColumn implements IColumnRenderer {
38
39 private final CounterEntity entity;
40
41 private final NumberFormat percentageFormat;
42
43 private final Comparator<ITableItem> comparator;
44
45 /**
46 * Creates a new column that is based on the {@link ICounter} for the given
47 * entity.
48 *
49 * @param entity
50 * counter entity for this column
51 * @param locale
52 * locale for rendering numbers
53 */
54 public PercentageColumn(final CounterEntity entity, final Locale locale) {
55 this.entity = entity;
56 this.percentageFormat = DecimalFormat.getPercentInstance(locale);
57 comparator = new TableItemComparator(
58 CounterComparator.MISSEDRATIO.on(entity));
59 }
60
61 public boolean init(final List<? extends ITableItem> items,
62 final ICoverageNode total) {
63 return true;
64 }
65
66 public void footer(final HTMLElement td, final ICoverageNode total,
67 final Resources resources, final ReportOutputFolder base)
68 throws IOException {
69 cell(td, total);
70 }
71
72 public void item(final HTMLElement td, final ITableItem item,
73 final Resources resources, final ReportOutputFolder base)
74 throws IOException {
75 cell(td, item.getNode());
76 }
77
78 private void cell(final HTMLElement td, final ICoverageNode node)
79 throws IOException {
80 final ICounter counter = node.getCounter(entity);
81 final int total = counter.getTotalCount();
82 if (total == 0) {
83 td.text("n/a");
84 } else {
85 td.text(percentageFormat.format(counter.getCoveredRatio()));
86 }
87 }
88
89 public Comparator<ITableItem> getComparator() {
90 return comparator;
91 }
92
93}