blob: 025a5972e3f5e901198adae6daca5551c704da66 [file] [log] [blame]
package org.apache.maven.plugins.pdf;
/*
* 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.
*/
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
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;
import org.apache.commons.io.input.XmlStreamReader;
/**
* 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 );
}
// ----------------------------------------------------------------------
// Private methods
// ----------------------------------------------------------------------
/**
* 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<DocumentAuthor> getAuthors( MavenProject project )
{
if ( project == null || project.getDevelopers() == null )
{
return null;
}
final List<DocumentAuthor> ret = new ArrayList<>( 4 );
for ( Object o : project.getDevelopers() )
{
final Developer developer = (Developer) o;
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 ( StringUtils.isEmpty( encoding ) )
{
return "UTF-8";
}
return encoding;
}
}