/******************************************************************************* * Copyright (c) 2009, 2017 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: * Evgeny Mandrikov - initial API and implementation * *******************************************************************************/ package org.jacoco.maven; import java.io.IOException; import java.util.List; import java.util.Locale; import org.apache.maven.doxia.siterenderer.Renderer; import org.apache.maven.plugin.MojoExecutionException; import org.apache.maven.plugins.annotations.Component; import org.apache.maven.plugins.annotations.Parameter; import org.apache.maven.project.MavenProject; import org.apache.maven.reporting.AbstractMavenReport; import org.apache.maven.reporting.MavenReportException; import org.jacoco.report.IReportGroupVisitor; import org.jacoco.report.IReportVisitor; /** * Base class for creating a code coverage report for tests of a single project * in multiple formats (HTML, XML, and CSV). */ public abstract class AbstractReportMojo extends AbstractMavenReport { /** * Encoding of the generated reports. */ @Parameter(property = "project.reporting.outputEncoding", defaultValue = "UTF-8") String outputEncoding; /** * Name of the root node HTML report pages. * * @since 0.7.7 */ @Parameter(defaultValue = "${project.name}") String title; /** * Footer text used in HTML report pages. * * @since 0.7.7 */ @Parameter String footer; /** * Encoding of the source files. */ @Parameter(property = "project.build.sourceEncoding", defaultValue = "UTF-8") String sourceEncoding; /** * A list of class files to include in the report. May use wildcard * characters (* and ?). When not specified everything will be included. */ @Parameter List<String> includes; /** * A list of class files to exclude from the report. May use wildcard * characters (* and ?). When not specified nothing will be excluded. */ @Parameter List<String> excludes; /** * Flag used to suppress execution. */ @Parameter(property = "jacoco.skip", defaultValue = "false") boolean skip; /** * Maven project. */ @Parameter(property = "project", readonly = true) MavenProject project; /** * Doxia Site Renderer. */ @Component Renderer siteRenderer; public String getDescription(final Locale locale) { return getName(locale) + " Coverage Report."; } @Override public boolean isExternalReport() { return true; } @Override protected MavenProject getProject() { return project; } @Override protected Renderer getSiteRenderer() { return siteRenderer; } /** * Returns the list of class files to include in the report. * * @return class files to include, may contain wildcard characters */ List<String> getIncludes() { return includes; } /** * Returns the list of class files to exclude from the report. * * @return class files to exclude, may contain wildcard characters */ List<String> getExcludes() { return excludes; } @Override public boolean canGenerateReport() { if (skip) { getLog().info( "Skipping JaCoCo execution because property jacoco.skip is set."); return false; } if (!canGenerateReportRegardingDataFiles()) { getLog().info( "Skipping JaCoCo execution due to missing execution data file."); return false; } if (!canGenerateReportRegardingClassesDirectory()) { getLog().info( "Skipping JaCoCo execution due to missing classes directory."); return false; } return true; } abstract boolean canGenerateReportRegardingDataFiles(); abstract boolean canGenerateReportRegardingClassesDirectory(); /** * This method is called when the report generation is invoked directly as a * standalone Mojo. */ @Override public void execute() throws MojoExecutionException { if (!canGenerateReport()) { return; } try { executeReport(Locale.getDefault()); } catch (final MavenReportException e) { throw new MojoExecutionException("An error has occurred in " + getName(Locale.ENGLISH) + " report generation.", e); } } @Override protected void executeReport(final Locale locale) throws MavenReportException { try { final ReportSupport support = new ReportSupport(getLog()); loadExecutionData(support); addFormatters(support, locale); final IReportVisitor visitor = support.initRootVisitor(); createReport(visitor, support); visitor.visitEnd(); } catch (final IOException e) { throw new MavenReportException("Error while creating report: " + e.getMessage(), e); } } abstract void loadExecutionData(final ReportSupport support) throws IOException; abstract void addFormatters(final ReportSupport support, final Locale locale) throws IOException; abstract void createReport(final IReportGroupVisitor visitor, final ReportSupport support) throws IOException; }