| /******************************************************************************* |
| * Copyright (c) 2009, 2019 Mountainminds GmbH & Co. KG and Contributors |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Marc R. Hoffmann - initial API and implementation |
| * |
| *******************************************************************************/ |
| package org.jacoco.report.internal.html.page; |
| |
| import java.io.IOException; |
| import java.text.DateFormat; |
| import java.util.ArrayList; |
| import java.util.Collection; |
| import java.util.Collections; |
| import java.util.Comparator; |
| import java.util.Date; |
| import java.util.List; |
| |
| import org.jacoco.core.data.ExecutionData; |
| import org.jacoco.core.data.SessionInfo; |
| import org.jacoco.report.ILanguageNames; |
| import org.jacoco.report.internal.ReportOutputFolder; |
| import org.jacoco.report.internal.html.HTMLElement; |
| import org.jacoco.report.internal.html.IHTMLReportContext; |
| import org.jacoco.report.internal.html.index.ElementIndex; |
| import org.jacoco.report.internal.html.resources.Styles; |
| |
| /** |
| * Page to display information about sessions covered by this report. |
| */ |
| public class SessionsPage extends ReportPage { |
| |
| private static final String MSG_SESSIONS = "This coverage report is based " |
| + "on execution data from the following sessions:"; |
| |
| private static final String MSG_NO_SESSIONS = "No session information available."; |
| |
| private static final String MSG_EXECDATA = "Execution data for the " |
| + "following classes is considered in this report:"; |
| |
| private static final String MSG_NO_EXECDATA = "No execution data available."; |
| |
| private final List<SessionInfo> sessionInfos; |
| |
| private final DateFormat dateFormat; |
| |
| private final List<ExecutionData> executionData; |
| |
| private final ElementIndex index; |
| |
| /** |
| * Creates a new page page to display session information. |
| * |
| * @param sessionInfos |
| * session info objects |
| * @param executionData |
| * execution data objects |
| * @param index |
| * index for cross-linking |
| * @param parent |
| * optional hierarchical parent |
| * @param folder |
| * base folder to create this page in |
| * @param context |
| * settings context |
| */ |
| public SessionsPage(final List<SessionInfo> sessionInfos, |
| final Collection<ExecutionData> executionData, |
| final ElementIndex index, final ReportPage parent, |
| final ReportOutputFolder folder, final IHTMLReportContext context) { |
| super(parent, folder, context); |
| this.sessionInfos = sessionInfos; |
| this.executionData = new ArrayList<ExecutionData>(executionData); |
| this.index = index; |
| this.dateFormat = DateFormat.getDateTimeInstance(DateFormat.DEFAULT, |
| DateFormat.DEFAULT, context.getLocale()); |
| final ILanguageNames names = context.getLanguageNames(); |
| Collections.sort(this.executionData, new Comparator<ExecutionData>() { |
| public int compare(final ExecutionData e1, final ExecutionData e2) { |
| return names.getQualifiedClassName(e1.getName()).compareTo( |
| names.getQualifiedClassName(e2.getName())); |
| } |
| }); |
| } |
| |
| @Override |
| protected void content(final HTMLElement body) throws IOException { |
| if (sessionInfos.isEmpty()) { |
| body.p().text(MSG_NO_SESSIONS); |
| } else { |
| body.p().text(MSG_SESSIONS); |
| sessionTable(body); |
| } |
| if (executionData.isEmpty()) { |
| body.p().text(MSG_NO_EXECDATA); |
| } else { |
| body.p().text(MSG_EXECDATA); |
| executionDataTable(body); |
| } |
| } |
| |
| private void sessionTable(final HTMLElement body) throws IOException { |
| final HTMLElement table = body.table(Styles.COVERAGETABLE); |
| { |
| final HTMLElement tr = table.thead().tr(); |
| tr.td().text("Session"); |
| tr.td().text("Start Time"); |
| tr.td().text("Dump Time"); |
| } |
| final HTMLElement tbody = table.tbody(); |
| for (final SessionInfo i : sessionInfos) { |
| final HTMLElement tr = tbody.tr(); |
| tr.td().span(Styles.EL_SESSION).text(i.getId()); |
| tr.td().text(dateFormat.format(new Date(i.getStartTimeStamp()))); |
| tr.td().text(dateFormat.format(new Date(i.getDumpTimeStamp()))); |
| } |
| } |
| |
| private void executionDataTable(final HTMLElement body) throws IOException { |
| final HTMLElement table = body.table(Styles.COVERAGETABLE); |
| { |
| final HTMLElement tr = table.thead().tr(); |
| tr.td().text("Class"); |
| tr.td().text("Id"); |
| } |
| final HTMLElement tbody = table.tbody(); |
| final ILanguageNames names = context.getLanguageNames(); |
| for (final ExecutionData e : executionData) { |
| final HTMLElement tr = tbody.tr(); |
| final String link = index.getLinkToClass(e.getId()); |
| final String qualifiedName = names.getQualifiedClassName(e |
| .getName()); |
| if (link == null) { |
| tr.td().span(Styles.EL_CLASS).text(qualifiedName); |
| } else { |
| tr.td().a(link, Styles.EL_CLASS).text(qualifiedName); |
| } |
| final String id = String.format("%016x", Long.valueOf(e.getId())); |
| tr.td().code().text(id); |
| } |
| } |
| |
| @Override |
| protected String getFileName() { |
| return "jacoco-sessions.html"; |
| } |
| |
| public String getLinkStyle() { |
| return Styles.EL_SESSION; |
| } |
| |
| public String getLinkLabel() { |
| return "Sessions"; |
| } |
| |
| } |