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

org.apache.maven.plugin.changes.FeedGenerator Maven / Gradle / Ivy

Go to download

Creates a release history for inclusion into the site and assists in generating an announcement mail.

There is a newer version: 2.12.1
Show newest version
package org.apache.maven.plugin.changes;

/*
 * 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 com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndContentImpl;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndEntryImpl;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.feed.synd.SyndFeedImpl;
import com.sun.syndication.io.FeedException;
import com.sun.syndication.io.SyndFeedOutput;

import java.io.IOException;
import java.io.Writer;

import java.text.DateFormat;
import java.text.ParseException;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.maven.doxia.util.HtmlTools;

import org.apache.maven.plugins.changes.model.Release;


/**
 *
 * @author ltheussl
 */
public class FeedGenerator
{
    private final ResourceBundle rbundle;
    private final SyndFeed feed;

    private String link;
    private String title;
    private String author;
    private DateFormat dateFormat;

    /**
     * Initialize feedGenerator for a given locale.
     *
     * @param locale a locale for i18n.
     */
    public FeedGenerator( final Locale locale )
    {
        this.feed = new SyndFeedImpl();
        this.rbundle = ResourceBundle.getBundle( "changes-report", locale, this.getClass().getClassLoader() );
    }

    /**
     * The author of the feed.
     *
     * @return the author.
     */
    public String getAuthor()
    {
        return author;
    }

    /**
     * Set the author of the feed.
     *
     * @param author not null.
     */
    public void setAuthor( final String author )
    {
        this.author = author.trim(); // this also assures that author is not null.
    }

    /**
     * The title of the feed.
     *
     * @return the title.
     */
    public String getTitle()
    {
        return title;
    }

    /**
     * Set the title of the feed.
     *
     * @param title not null.
     */
    public void setTitle( final String title )
    {
        this.title = title.trim(); // this also assures that title is not null.
    }

    /**
     * The DateFormat.
     *
     * @return may be null.
     */
    public DateFormat getDateFormat()
    {
        return dateFormat;
    }

    /**
     * Set the date format.
     * This should match the date format used for the release dates in changes.xml.
     *
     * @param dateFormat may be null.
     */
    public void setDateFormat( final DateFormat dateFormat )
    {
        this.dateFormat = dateFormat;
    }

    /**
     * The main link of the feed.
     *
     * @return the link.
     */
    public String getLink()
    {
        return link;
    }

    /**
     * Set the main link of the feed.
     *
     * @param link not null.
     */
    public void setLink( final String link )
    {
        this.link = link.trim(); // this also assures that link is not null.
    }

    /**
     * Determine if a given feed type is supported. The currently supported values are:
     * "rss_0.9", "rss_0.91N" (RSS 0.91 Netscape), "rss_0.91U" (RSS 0.91 Userland),
     * "rss_0.92", "rss_0.93", "rss_0.94", "rss_1.0", "rss_2.0", "atom_0.3", "atom_1.0".
     *
     * @param type the feed type to check. May be null.
     *
     * @return true if if the given type is supported by the rome library, false otherwise.
     */
    public boolean isSupportedFeedType( final String type )
    {
        return getSupportedFeedTypes().contains( type );
    }

    /**
     * A List of supported feed types.
     *
     * @return a List of supported feed types.
     *
     * @see #isSupportedFeedType(java.lang.String)
     */
    @SuppressWarnings( "unchecked" )
    public List getSupportedFeedTypes()
    {
        return feed.getSupportedFeedTypes();
    }

    /**
     * Extract a feed and export it to a Writer.
     *
     * @param releases the List of Releases. Only the last release is used in the feed.
     * @param feedType The type of the feed to generate.
     *      See {@link #isSupportedFeedType(java.lang.String)} for supported values.
     *
     * @param writer a Writer. Note that this is not flushed nor closed upon exit.
     *
     * @throws IOException if an error occurs during export.
     */
    public void export( final List releases, final String feedType, final Writer writer )
        throws IOException
    {
        feed.setFeedType( feedType );
        feed.setTitle( title );
        feed.setAuthor( author );
        feed.setPublishedDate( new Date() );
        feed.setLink( link );
        feed.setDescription( rbundle.getString( "report.changes.text.rssfeed.description" ) );
        feed.setLanguage( rbundle.getLocale().getLanguage() );
        //feed.setCopyright(  );
        //feed.setEncoding();
        feed.setEntries( getEntries( releases ) );

        try
        {
            new SyndFeedOutput().output( feed, writer );
        }
        catch ( FeedException ex )
        {
            IOException ioex = new IOException( ex.getMessage() );
            ioex.initCause( ex );
            throw ioex;
        }
    }

    private List getEntries( final List releases )
    {
        final List entries = new ArrayList( 1 );

        if ( releases.size() > 0 )
        {
            final Release release = releases.get( 0 ); // TODO: is this guaranteed to be the latest?

            final SyndEntry entry = new SyndEntryImpl();
            entry.setTitle( release.getVersion() );
            entry.setLink( link + "#" + HtmlTools.encodeId( release.getVersion() ) );
            entry.setDescription( getSyndContent( release ) );
            entry.setPublishedDate( getDate( release.getDateRelease(), dateFormat ) );

            entries.add( entry );
        }

        return entries;
    }

    private static SyndContent getSyndContent( final Release release )
    {
        final SyndContent syndContent = new SyndContentImpl();
        syndContent.setType( "text/html" );

        final StringBuilder sb = new StringBuilder( 512 );

        final String description = release.getDescription();

        if ( description != null && description.trim().length() > 0 )
        {
            sb.append( "

" ).append( description ).append( "

" ); } // TODO: localize? sb.append( "

Version " ) .append( release.getVersion() ).append( " is available with " ) .append( release.getActions().size() ).append( " fixed issues.

" ); syndContent.setValue( sb.toString() ); return syndContent; } private static Date getDate( final String dateRelease, final DateFormat dateFormat ) { if ( dateFormat == null ) { return new Date(); } try { return dateFormat.parse( dateRelease ); } catch ( ParseException ex ) { return new Date(); } } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy