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

org.apache.maven.plugins.site.render.SiteMojo Maven / Gradle / Ivy

Go to download

The Maven Site Plugin is a plugin that generates a site for the current project.

There is a newer version: 4.0.0-M16
Show newest version
/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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 org.apache.maven.plugins.site.render;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.TreeMap;

import org.apache.maven.doxia.siterenderer.DocumentRenderer;
import org.apache.maven.doxia.siterenderer.DoxiaDocumentRenderer;
import org.apache.maven.doxia.siterenderer.RendererException;
import org.apache.maven.doxia.siterenderer.SiteRenderingContext;
import org.apache.maven.doxia.tools.SiteTool;
import org.apache.maven.execution.MavenSession;
import org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.MojoFailureException;
import org.apache.maven.plugins.annotations.Mojo;
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.plugins.annotations.ResolutionScope;
import org.apache.maven.project.MavenProject;
import org.apache.maven.reporting.MavenReportException;
import org.apache.maven.reporting.exec.MavenReportExecution;
import org.apache.maven.shared.utils.logging.MessageBuilder;

import static org.apache.maven.shared.utils.logging.MessageUtils.buffer;

/**
 * Generates the site for a single project.
 * 

* Note that links between module sites in a multi module build will not work, since local build directory * structure doesn't match deployed site. *

* * @author Emmanuel Venisse * @author Vincent Siveton * */ @Mojo(name = "site", requiresDependencyResolution = ResolutionScope.TEST, requiresReports = true, threadSafe = true) public class SiteMojo extends AbstractSiteRenderingMojo { /** * Directory where the project sites and report distributions will be generated (as html/css/...). */ @Parameter(property = "siteOutputDirectory", defaultValue = "${project.reporting.outputDirectory}") protected File outputDirectory; /** * Convenience parameter that allows you to disable report generation. */ @Parameter(property = "generateReports", defaultValue = "true") private boolean generateReports; /** * Whether to validate xml input documents. If set to true, all input documents in xml format (in * particular xdoc and fml) will be validated and any error will lead to a build failure. * * @since 2.1.1 */ @Parameter(property = "validate", defaultValue = "false") private boolean validate; /** * {@inheritDoc} */ @Override public void execute() throws MojoExecutionException, MojoFailureException { if (skip) { getLog().info("maven.site.skip = true: Skipping site generation"); return; } if (getLog().isDebugEnabled()) { getLog().debug("executing Site Mojo"); } checkInputEncoding(); try { List localesList = getLocales(); for (Locale locale : localesList) { getLog().info("Rendering site for " + buffer().strong( (!locale.equals(SiteTool.DEFAULT_LOCALE) ? "locale '" + locale + "'" : "default locale")) .build()); File outputDirectory = getOutputDirectory(locale); List reports = generateReports ? getReports(outputDirectory) : Collections.emptyList(); renderLocale(locale, reports, localesList, outputDirectory); } } catch (RendererException e) { if (e.getCause() instanceof MavenReportException) { // issue caused by report, not really by Doxia Site Renderer throw new MojoExecutionException(e.getMessage(), e.getCause()); } throw new MojoExecutionException("Failed to render site", e); } catch (IOException e) { throw new MojoExecutionException("Error during site generation", e); } } private void renderLocale( Locale locale, List reports, List supportedLocales, File outputDirectory) throws IOException, RendererException, MojoFailureException, MojoExecutionException { SiteRenderingContext context = createSiteRenderingContext(locale); context.addSiteLocales(supportedLocales); context.setInputEncoding(getInputEncoding()); context.setOutputEncoding(getOutputEncoding()); context.setValidate(validate); if (validate) { getLog().info("Validation is switched on, xml input documents will be validated!"); } // locate all Doxia documents first Map documents = locateDocuments(context, reports, locale); // copy resources siteRenderer.copyResources(context, outputDirectory); // and finally render Doxia documents List nonDoxiaDocuments = renderDoxiaDocuments(documents.values(), context, outputDirectory); // then non-Doxia documents (e.g. reports) renderNonDoxiaDocuments(nonDoxiaDocuments, context, outputDirectory); } /** * Render Doxia documents from the list given, but not reports. * * @param documents a collection of documents containing both Doxia source files and reports * @return the sublist of documents that are not Doxia source files */ private List renderDoxiaDocuments( Collection documents, SiteRenderingContext context, File outputDirectory) throws RendererException, IOException { List doxiaDocuments = new ArrayList<>(); List generatedDoxiaDocuments = new ArrayList<>(); List nonDoxiaDocuments = new ArrayList<>(); Map counts = new TreeMap<>(); Map generatedCounts = new TreeMap<>(); for (DocumentRenderer doc : documents) { if (doc instanceof DoxiaDocumentRenderer) { DoxiaDocumentRenderer doxia = (DoxiaDocumentRenderer) doc; boolean editable = doxia.getRenderingContext().isEditable(); if (editable) { doxiaDocuments.add(doc); } else { generatedDoxiaDocuments.add(doc); } // count documents per parserId String parserId = doxia.getRenderingContext().getParserId(); Map actualCounts; if (editable) { actualCounts = counts; } else { actualCounts = generatedCounts; } Integer count = actualCounts.get(parserId); if (count == null) { count = 1; } else { count++; } actualCounts.put(parserId, count); } else { nonDoxiaDocuments.add(doc); } } if (doxiaDocuments.size() > 0) { MessageBuilder mb = buffer(); mb.a("Rendering "); mb.strong(doxiaDocuments.size() + " Doxia document" + (doxiaDocuments.size() > 1 ? "s" : "")); mb.a(": "); boolean first = true; for (Map.Entry entry : counts.entrySet()) { if (first) { first = false; } else { mb.a(", "); } mb.strong(entry.getValue() + " " + entry.getKey()); } getLog().info(mb.build()); siteRenderer.render(doxiaDocuments, context, outputDirectory); } if (generatedDoxiaDocuments.size() > 0) { MessageBuilder mb = buffer(); mb.a("Rendering "); mb.strong(generatedDoxiaDocuments.size() + " generated Doxia document" + (generatedDoxiaDocuments.size() > 1 ? "s" : "")); mb.a(": "); boolean first = true; for (Map.Entry entry : generatedCounts.entrySet()) { if (first) { first = false; } else { mb.a(", "); } mb.strong(entry.getValue() + " " + entry.getKey()); } getLog().info(mb.build()); siteRenderer.render(generatedDoxiaDocuments, context, outputDirectory); } return nonDoxiaDocuments; } /** * Render non-Doxia documents (e.g., reports) from the list given * * @param documents a collection of documents containing non-Doxia source files */ private void renderNonDoxiaDocuments( Collection documents, SiteRenderingContext context, File outputDirectory) throws RendererException, IOException { Map counts = new TreeMap<>(); for (DocumentRenderer doc : documents) { String type; if (doc instanceof ReportDocumentRenderer || doc instanceof SitePluginReportDocumentRenderer) { type = "report"; } else { type = "other"; } Integer count = counts.get(type); if (count == null) { count = 1; } else { count++; } counts.put(type, count); } if (documents.size() > 0) { for (Map.Entry entry : counts.entrySet()) { String type = entry.getKey(); Integer count = entry.getValue(); MessageBuilder mb = buffer(); mb.a("Rendering "); mb.strong(count + " " + type + " document" + (count > 1 ? "s" : "")); getLog().info(mb.build()); } siteRenderer.render(documents, context, outputDirectory); } } private File getOutputDirectory(Locale locale) { File file; if (!locale.equals(SiteTool.DEFAULT_LOCALE)) { file = new File(outputDirectory, locale.toString()); } else { file = outputDirectory; } // Safety if (!file.exists()) { file.mkdirs(); } return file; } public MavenProject getProject() { return project; } public MavenSession getSession() { return mavenSession; } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy