IssuesReportGenerator.java

package org.apache.maven.plugins.issues;

/*
 * 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.text.DateFormat;
import java.util.List;
import java.util.Locale;
import java.util.ResourceBundle;

import org.apache.maven.doxia.sink.Sink;

/**
 * Generates a report on issues.
 *
 * @author Noriko Kinugasa
 * @author Dennis Lundberg
 * @version $Id$
 * @since 2.4
 */
public class IssuesReportGenerator
    extends AbstractIssuesReportGenerator
{
    /**
     * Fallback value that is used if date field are not available.
     */
    private static final String NOT_AVAILABLE = "n/a";

    /**
     * Holds the id:s for the columns to include in the report, in the order that they should appear in the report.
     */
    private int[] columns;

    /**
     * @param includedColumns The id:s of the columns to include in the report
     */
    public IssuesReportGenerator( int[] includedColumns )
    {
        this.columns = includedColumns;
    }

    public void doGenerateEmptyReport( ResourceBundle bundle, Sink sink )
    {
        sinkBeginReport( sink, bundle );

        sink.paragraph();

        sink.text( bundle.getString( "report.issues.error" ) );

        sink.paragraph_();

        sinkEndReport( sink );
    }

    public void doGenerateReport( ResourceBundle bundle, Sink sink, List<Issue> issueList )
    {
        sinkBeginReport( sink, bundle );

        constructHeaderRow( sink, issueList, bundle );

        // Always use the international date format as recommended by the W3C:
        // http://www.w3.org/QA/Tips/iso-date
        // This date format is used in the Swedish locale.
        constructDetailRows( sink, issueList, bundle, new Locale( "sv" ) );

        sinkEndReport( sink );
    }

    private void constructHeaderRow( Sink sink, List<Issue> issueList, ResourceBundle bundle )
    {
        if ( issueList == null )
        {
            return;
        }

        sink.table();

        sink.tableRow();

        for ( int column : columns )
        {
            switch ( column )
            {
                case IssuesReportHelper.COLUMN_ASSIGNEE:
                    sinkHeader( sink, bundle.getString( "report.issues.label.assignee" ) );
                    break;

                case IssuesReportHelper.COLUMN_COMPONENT:
                    sinkHeader( sink, bundle.getString( "report.issues.label.component" ) );
                    break;

                case IssuesReportHelper.COLUMN_CREATED:
                    sinkHeader( sink, bundle.getString( "report.issues.label.created" ) );
                    break;

                case IssuesReportHelper.COLUMN_FIX_VERSION:
                    sinkHeader( sink, bundle.getString( "report.issues.label.fixVersion" ) );
                    break;

                case IssuesReportHelper.COLUMN_ID:
                    sinkHeader( sink, bundle.getString( "report.issues.label.id" ) );
                    break;

                case IssuesReportHelper.COLUMN_KEY:
                    sinkHeader( sink, bundle.getString( "report.issues.label.key" ) );
                    break;

                case IssuesReportHelper.COLUMN_PRIORITY:
                    sinkHeader( sink, bundle.getString( "report.issues.label.priority" ) );
                    break;

                case IssuesReportHelper.COLUMN_REPORTER:
                    sinkHeader( sink, bundle.getString( "report.issues.label.reporter" ) );
                    break;

                case IssuesReportHelper.COLUMN_RESOLUTION:
                    sinkHeader( sink, bundle.getString( "report.issues.label.resolution" ) );
                    break;

                case IssuesReportHelper.COLUMN_STATUS:
                    sinkHeader( sink, bundle.getString( "report.issues.label.status" ) );
                    break;

                case IssuesReportHelper.COLUMN_SUMMARY:
                    sinkHeader( sink, bundle.getString( "report.issues.label.summary" ) );
                    break;

                case IssuesReportHelper.COLUMN_TYPE:
                    sinkHeader( sink, bundle.getString( "report.issues.label.type" ) );
                    break;

                case IssuesReportHelper.COLUMN_UPDATED:
                    sinkHeader( sink, bundle.getString( "report.issues.label.updated" ) );
                    break;

                case IssuesReportHelper.COLUMN_VERSION:
                    sinkHeader( sink, bundle.getString( "report.issues.label.version" ) );
                    break;

                default:
                    // Do not add a header for this column
                    break;
            }
        }

        sink.tableRow_();
    }

    private void constructDetailRows( Sink sink, List<Issue> issueList, ResourceBundle bundle, Locale locale )
    {
        if ( issueList == null )
        {
            return;
        }

        for ( Issue issue : issueList )
        {
            // Use a DateFormat based on the Locale
            DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT, locale );

            sink.tableRow();

            for ( int column : columns )
            {
                switch ( column )
                {
                    case IssuesReportHelper.COLUMN_ASSIGNEE:
                        sinkCell( sink, issue.getAssignee() );
                        break;

                    case IssuesReportHelper.COLUMN_COMPONENT:
                        sinkCell( sink, IssuesReportHelper.printValues( issue.getComponents() ) );
                        break;

                    case IssuesReportHelper.COLUMN_CREATED:
                        String created = NOT_AVAILABLE;
                        if ( issue.getCreated() != null )
                        {
                            created = df.format( issue.getCreated() );
                        }
                        sinkCell( sink, created );
                        break;

                    case IssuesReportHelper.COLUMN_FIX_VERSION:
                        sinkCell( sink, IssuesReportHelper.printValues( issue.getFixVersions() ) );
                        break;

                    case IssuesReportHelper.COLUMN_ID:
                        sink.tableCell();
                        sink.link( issue.getLink() );
                        sink.text( issue.getId() );
                        sink.link_();
                        sink.tableCell_();
                        break;

                    case IssuesReportHelper.COLUMN_KEY:
                        sink.tableCell();
                        sink.link( issue.getLink() );
                        sink.text( issue.getKey() );
                        sink.link_();
                        sink.tableCell_();
                        break;

                    case IssuesReportHelper.COLUMN_PRIORITY:
                        sinkCell( sink, issue.getPriority() );
                        break;

                    case IssuesReportHelper.COLUMN_REPORTER:
                        sinkCell( sink, issue.getReporter() );
                        break;

                    case IssuesReportHelper.COLUMN_RESOLUTION:
                        sinkCell( sink, issue.getResolution() );
                        break;

                    case IssuesReportHelper.COLUMN_STATUS:
                        sinkCell( sink, issue.getStatus() );
                        break;

                    case IssuesReportHelper.COLUMN_SUMMARY:
                        sinkCell( sink, issue.getSummary() );
                        break;

                    case IssuesReportHelper.COLUMN_TYPE:
                        sinkCell( sink, issue.getType() );
                        break;

                    case IssuesReportHelper.COLUMN_UPDATED:
                        String updated = NOT_AVAILABLE;
                        if ( issue.getUpdated() != null )
                        {
                            updated = df.format( issue.getUpdated() );
                        }
                        sinkCell( sink, updated );
                        break;

                    case IssuesReportHelper.COLUMN_VERSION:
                        sinkCell( sink, issue.getVersion() );
                        break;

                    default:
                        // Do not add this column
                        break;
                }
            }

            sink.tableRow_();
        }

        sink.table_();
    }
}