All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.smartics.maven.plugin.buildmetadata.AbstractReportMojo Maven / Gradle / Ivy

/*
 * Copyright 2006-2019 smartics, Kronseder & Reiner GmbH
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */
package de.smartics.maven.plugin.buildmetadata;

import de.smartics.maven.plugin.buildmetadata.util.ReportUtils;

import org.apache.commons.lang.LocaleUtils;
import org.apache.maven.artifact.factory.ArtifactFactory;
import org.apache.maven.artifact.repository.ArtifactRepository;
import org.apache.maven.artifact.resolver.ArtifactResolver;
import org.apache.maven.doxia.module.xhtml.decoration.render.RenderingContext;
import org.apache.maven.doxia.site.decoration.Body;
import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.siterenderer.Renderer;
import org.apache.maven.doxia.siterenderer.RendererException;
import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
import org.apache.maven.doxia.siterenderer.sink.SiteRendererSink;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.logging.Log;
import org.apache.maven.project.MavenProject;
import org.apache.maven.reporting.AbstractMavenReport;
import org.apache.maven.reporting.MavenReportException;
import org.codehaus.plexus.util.StringUtils;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.util.HashMap;
import java.util.Locale;
import java.util.Map;
import java.util.ResourceBundle;

/**
 * The abstract base implementation for reports.
 */
public abstract class AbstractReportMojo extends AbstractMavenReport {
  // ********************************* Fields *********************************

  // --- constants ------------------------------------------------------------

  // --- members --------------------------------------------------------------

  // ... plugin infrastructure ................................................

  /**
   * The Maven project.
   *
   * @parameter expression="${project}"
   * @required
   * @readonly
   * @since 1.0
   */
  protected MavenProject project;

  /**
   * The Doxia site renderer.
   *
   * @component
   * @required
   * @readonly
   * @since 1.0
   */
  protected Renderer siteRenderer;

  /**
   * Local Repository.
   *
   * @parameter expression="${localRepository}"
   * @required
   * @readonly
   * @since 1.0
   */
  protected ArtifactRepository localRepository;

  /**
   * The resolver for resolving artifacts.
   *
   * @component
   * @required
   * @readonly
   * @since 1.0
   */
  protected ArtifactResolver resolver;

  /**
   * The factory to create dependent artifacts.
   *
   * @component
   * @required
   * @readonly
   * @since 1.0
   */
  protected ArtifactFactory factory;

  // ... report configuration parameters ......................................

  /**
   * Specifies the directory where the report will written to. This information
   * is only used if the report is not part of the site generation process.
   *
   * @parameter expression="${project.reporting.outputDirectory}"
   * @readonly
   * @since 1.0
   */
  protected File outputDirectory;

  /**
   * Specifies the log level buildmetadata.logLevel used for this
   * plugin.
   * 

* Allowed values are SEVERE, WARNING, * INFO and FINEST. *

* * @parameter expression="${buildmetadata.logLevel}" * @since 1.0 */ protected String logLevel; /** * The locale to use regardless of the report. This should be set to the * locale the Javadoc comment is written in. If not set, the Maven provided * locale is used. * * @parameter expression="${buildmetadata.locale}" * @since 1.0 */ protected String locale; /** * A simple flag to skip the generation of the reports. If set on the command * line use -Dbuildmetadata.skip. * * @parameter expression="${buildmetadata.skip}" default-value="false" * @since 1.0 */ protected boolean skip; /** * Flag to indicate that the buildmetadata must only be added for the root * project. Modules will be skipped. * * @parameter default-value= "false" * @since 1.5.0 */ protected boolean skipModules; // ****************************** Initializer ******************************* // ****************************** Constructors ****************************** // ****************************** Inner Classes ***************************** // ********************************* Methods ******************************** // --- init ----------------------------------------------------------------- // --- get&set -------------------------------------------------------------- // ... plugin infrastructure ................................................ /** * {@inheritDoc} * * @see org.apache.maven.reporting.AbstractMavenReport#getProject() */ @Override protected final MavenProject getProject() { return project; } /** * {@inheritDoc} * * @see org.apache.maven.reporting.AbstractMavenReport#getSiteRenderer() */ @Override protected final Renderer getSiteRenderer() { return siteRenderer; } // ... report configuration parameters ...................................... // ... basics /** * {@inheritDoc} * * @see org.apache.maven.reporting.AbstractMavenReport#getOutputDirectory() */ @Override protected final String getOutputDirectory() { return outputDirectory.getAbsolutePath(); } // --- business ------------------------------------------------------------- /** * Runs the report generation. * * @throws MojoExecutionException on any problem encountered. */ public void execute() throws MojoExecutionException { final Log log = getLog(); if (!canGenerateReport()) { if (log.isInfoEnabled()) { log.info("Report '" + getName(Locale.getDefault()) + "' skipped due to offline mode."); } return; } provideSink(); } @Override public boolean canGenerateReport() { return super.canGenerateReport() && !skip && !(skipModules && !project.isExecutionRoot()); } /** * Ensures that a writeable sink is provided. *

* Stolen from the changes plugin. *

* * @throws MojoExecutionException if the sink cannot be created. */ protected final void provideSink() throws MojoExecutionException { final Locale reportLocale = determineLocale(); try { final DecorationModel model = new DecorationModel(); model.setBody(new Body()); final Map attributes = new HashMap(); attributes.put("outputEncoding", "UTF-8"); // TODO correct??? final SiteRenderingContext siteContext = siteRenderer.createContextForSkin( ReportUtils.getSkinArtifactFile(project, localRepository, resolver, factory), attributes, model, getName(reportLocale), reportLocale); final RenderingContext context = new RenderingContext(outputDirectory, getOutputName() + ".html"); final SiteRendererSink sink = new SiteRendererSink(context); generate(sink, reportLocale); provideDir(); // The writer will be closed by the renderer // http://maven.apache.org/doxia/doxia-sitetools/doxia-site-renderer/xref/index.html final Writer writer = new FileWriter(new File(outputDirectory, getOutputName() + ".html")); siteRenderer.generateDocument(writer, sink, siteContext); siteRenderer.copyResources(siteContext, new File(project.getBasedir(), "src/site/resources"), outputDirectory); } catch (final RendererException e) { throw new MojoExecutionException(createErrorMessage(reportLocale), e); } catch (final IOException e) { throw new MojoExecutionException(createErrorMessage(reportLocale), e); } catch (final MavenReportException e) { throw new MojoExecutionException(createErrorMessage(reportLocale), e); } } private void provideDir() throws IOException { if (!outputDirectory.exists()) { if (!outputDirectory.mkdirs()) { throw new IOException( "Cannot generate directories '" + outputDirectory.getPath() + "'"); } } } /** * Creates an error message signaling a problem with the report generation. * * @param reportLocale the locale to select the report name. * @return the error message for failed report generation. */ private String createErrorMessage(final Locale reportLocale) { return "An error has occurred in " + getName(reportLocale) + " report generation."; } /** * Determines the locale to use. The plugin allows the user to override the * locale provided by Maven. * * @return the locale to use for this report. */ private Locale determineLocale() { return StringUtils.isNotBlank(this.locale) ? LocaleUtils.toLocale(this.locale) : Locale.getDefault(); } /** * Returns the resource bundle for the given locale. * * @param locale the locale for which the resource bundle is requested. * @return the bundle for the given locale. */ protected final ResourceBundle getBundle(final Locale locale) { return ResourceBundle .getBundle("de.smartics.maven.buildmetadata.BuildReport", locale); } // --- object basics -------------------------------------------------------- }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy