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

org.apache.maven.plugins.pdf.DocumentModelBuilder Maven / Gradle / Ivy

The 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.pdf;

import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.apache.commons.io.input.XmlStreamReader;
import org.apache.maven.doxia.document.DocumentAuthor;
import org.apache.maven.doxia.document.DocumentCover;
import org.apache.maven.doxia.document.DocumentMeta;
import org.apache.maven.doxia.document.DocumentModel;
import org.apache.maven.doxia.document.DocumentTOC;
import org.apache.maven.doxia.document.DocumentTOCItem;
import org.apache.maven.doxia.site.decoration.DecorationModel;
import org.apache.maven.doxia.site.decoration.Menu;
import org.apache.maven.doxia.site.decoration.MenuItem;
import org.apache.maven.model.Developer;
import org.apache.maven.project.MavenProject;
import org.codehaus.plexus.util.StringUtils;

/**
 * Construct a DocumentModel from a MavenProject and related information.
 *
 * @author ltheussl
 */
public class DocumentModelBuilder {
    /** A MavenProject to extract the information. */
    private final MavenProject project;

    /** A DecorationModel to extract additional information. */
    private final DecorationModel decorationModel;

    /**
     * Constructor. Initialize a MavenProject to extract information from.
     *
     * @param project a MavenProject. May be null.
     */
    public DocumentModelBuilder(MavenProject project) {
        this(project, null);
    }

    /**
     * Constructor. Initialize a MavenProject and a DecorationModel to extract information from.
     *
     * @param project a MavenProject. May be null.
     * @param decorationModel a DecorationModel. May be null.
     */
    public DocumentModelBuilder(MavenProject project, DecorationModel decorationModel) {
        this.project = project;
        this.decorationModel = decorationModel;
    }

    /**
     * Get a DocumentModel.
     *
     * @return a DocumentModel. Always non-null.
     */
    public DocumentModel getDocumentModel() {
        return getDocumentModel(project, decorationModel, null);
    }

    /**
     * Get a DocumentModel.
     *
     * @param date overrides the default date in meta- and cover information.
     * @return a DocumentModel. Always non-null.
     */
    public DocumentModel getDocumentModel(Date date) {
        return getDocumentModel(project, decorationModel, date);
    }

    /**
     * Extract a DocumentModel from a MavenProject.
     *
     * @param project a MavenProject. May be null.
     * @param decorationModel a DecorationModel. May be null.
     * @param date the date of the TOC. May be null in which case the build date will be used.
     *
     * @return a DocumentModel. Always non-null.
     */
    private static DocumentModel getDocumentModel(MavenProject project, DecorationModel decorationModel, Date date) {
        final Date now = date == null ? new Date() : date;

        final DocumentModel docModel = new DocumentModel();

        docModel.setModelEncoding(getProjectModelEncoding(project));
        docModel.setOutputName(
                project == null || project.getArtifactId() == null ? "unnamed" : project.getArtifactId());
        docModel.setMeta(getDocumentMeta(project, now));
        docModel.setCover(getDocumentCover(project, now));
        docModel.setToc(getDocumentTOC(decorationModel));

        return docModel;
    }

    /**
     * Extract a DocumentTOC from a DecorationModel.
     *
     * @param decorationModel a DecorationModel. May be null.
     * @return a DocumentTOC, always non-null.
     */
    private static DocumentTOC getDocumentTOC(DecorationModel decorationModel) {
        final DocumentTOC toc = new DocumentTOC();

        if (decorationModel != null && decorationModel.getMenus() != null) {
            for (final Menu menu : decorationModel.getMenus()) {
                for (final MenuItem item : menu.getItems()) {
                    final DocumentTOCItem documentTOCItem = new DocumentTOCItem();
                    documentTOCItem.setName(item.getName());
                    documentTOCItem.setRef(item.getHref());
                    toc.addItem(documentTOCItem);
                }
            }
        }

        return toc;
    }

    /**
     * Extract meta information from a MavenProject.
     *
     * @param project a MavenProject. May be null.
     * @param date the date to use in meta. May be null.
     *
     * @return a DocumentMeta object. Always non-null.
     */
    private static DocumentMeta getDocumentMeta(MavenProject project, Date date) {
        final DocumentMeta meta = new DocumentMeta();

        meta.setAuthors(getAuthors(project));
        meta.setCreationDate(date);
        meta.setCreator(System.getProperty("user.name"));
        meta.setDate(date);
        meta.setDescription(project == null ? null : project.getDescription());
        // meta.setGenerator( generator );
        meta.setInitialCreator(System.getProperty("user.name"));
        // meta.setLanguage( locale == null ? null : locale.getLanguage() );
        // meta.setPageSize( pageSize );
        meta.setSubject(getProjectName(project));
        meta.setTitle(getProjectName(project));

        return meta;
    }

    /**
     * Extract information for a DocumentCover from a MavenProject.
     *
     * @param project a MavenProject. May be null.
     * @param date the cover date. May be null.
     *
     * @return a DocumentCover object. Always non-null.
     */
    private static DocumentCover getDocumentCover(MavenProject project, Date date) {
        final DocumentCover cover = new DocumentCover();

        cover.setAuthors(getAuthors(project));
        // cover.setCompanyLogo( companyLogo );
        cover.setCompanyName(getProjectOrganizationName(project));
        cover.setCoverDate(date);
        cover.setCoverSubTitle(project == null ? null : "v. " + project.getVersion());
        cover.setCoverTitle(getProjectName(project));
        // cover.setCoverType( type );
        cover.setCoverVersion(project == null ? null : project.getVersion());
        // cover.setProjectLogo( projectLogo );
        cover.setProjectName(getProjectName(project));

        return cover;
    }

    /**
     * Wrap the list of project {@link Developer} to a list of {@link DocumentAuthor}.
     *
     * @param project the MavenProject to extract the authors from.
     * @return a list of DocumentAuthors from the project developers.
     * Returns null if project is null or contains no developers.
     */
    private static List getAuthors(MavenProject project) {
        if (project == null || project.getDevelopers() == null) {
            return null;
        }

        final List ret = new ArrayList<>(4);

        for (Developer developer : project.getDevelopers()) {
            final DocumentAuthor author = new DocumentAuthor();
            author.setName(developer.getName());
            author.setEmail(developer.getEmail());
            author.setCompanyName(developer.getOrganization());
            StringBuilder roles = null;

            for (final String role : developer.getRoles()) {
                if (roles == null) {
                    roles = new StringBuilder(32);
                } else {
                    roles.append(',').append(' ');
                }
                roles.append(role);
            }
            if (roles != null) {
                author.setPosition(roles.toString());
            }

            ret.add(author);
        }

        return ret;
    }

    /**
     * @param project the MavenProject to extract the project organization name from.
     * @return the project organization name if not empty, or the current System user name otherwise.
     */
    private static String getProjectOrganizationName(MavenProject project) {
        if (project != null
                && project.getOrganization() != null
                && StringUtils.isNotEmpty(project.getOrganization().getName())) {
            return project.getOrganization().getName();
        }

        return System.getProperty("user.name");
    }

    /**
     * Extract the name of the project.
     *
     * @param project the MavenProject to extract the project name from.
     * @return the project name, or the project groupId and artifactId if
     * the project name is empty, or null if project is null.
     */
    private static String getProjectName(MavenProject project) {
        if (project == null) {
            return null;
        }

        if (StringUtils.isEmpty(project.getName())) {
            return project.getGroupId() + ":" + project.getArtifactId();
        }

        return project.getName();
    }

    /**
     * Extract the encoding.
     *
     * @param project the MavenProject to extract the encoding name from.
     * @return the project encoding if defined, or UTF-8 otherwise, or null if project is null.
     */
    private static String getProjectModelEncoding(MavenProject project) {
        if (project == null) {
            return null;
        }

        String encoding = project.getModel().getModelEncoding();

        // Workaround for MNG-4289
        try (XmlStreamReader reader = new XmlStreamReader(project.getFile())) {
            encoding = reader.getEncoding();
        } catch (IOException e) {
            // nop
        }

        if (encoding == null || encoding.isEmpty()) {
            return "UTF-8";
        }

        return encoding;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy