package org.apache.maven.plugin.jira;

/*
 * 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 org.apache.maven.plugin.MojoExecutionException;
import org.apache.maven.plugin.issues.Issue;

import java.util.List;

/**
 * Jira downloader that uses REST or RSS, depending.
 * This code is not very attractive. However, JIRA has
 * supported REST for a very long time, and so the
 * fallback is only relevant for people with very old
 * copies of JIRA.
 */
public class AdaptiveJiraDownloader extends AbstractJiraDownloader
{
    private AbstractJiraDownloader effectiveDownloader;
    private boolean forceClassic;


    public void doExecute()
        throws Exception
    {
        effectiveDownloader = new RestJiraDownloader();
        copySettings( effectiveDownloader );
        try
        {
            effectiveDownloader.doExecute();
        }
        catch ( RestJiraDownloader.NoRest nre )
        {
            getLog().info( "Falling back to RSS for issue download: " + nre.getMessage() );
            effectiveDownloader = new ClassicJiraDownloader();
            copySettings( effectiveDownloader );
            effectiveDownloader.doExecute();
        }
    }
    
    private void copySettings( AbstractJiraDownloader target )
    {
        target.setLog( getLog() );
        target.setMavenProject( project );
        target.setOutput( output );
        target.setNbEntries( nbEntriesMax );
        target.setComponent( component );
        target.setFixVersionIds( fixVersionIds );
        target.setStatusIds( statusIds );
        target.setResolutionIds( resolutionIds );
        target.setPriorityIds( priorityIds );
        target.setSortColumnNames( sortColumnNames );
        target.setFilter( filter );
        target.setJiraDatePattern( jiraDatePattern );
        target.setJiraUser( jiraUser );
        target.setJiraPassword( jiraPassword );
        target.setTypeIds( typeIds );
        target.setWebUser( webUser );
        target.setWebPassword( webPassword );
        target.setSettings( settings );
        target.setUseJql( useJql );
        target.setOnlyCurrentVersion( onlyCurrentVersion );
        target.setVersionPrefix( versionPrefix );
        target.setConnectionTimeout( connectionTimeout );
        target.setReceiveTimout( receiveTimout );
    }


    public List<Issue> getIssueList()
        throws MojoExecutionException
    {
        return effectiveDownloader.getIssueList();
    }

    public boolean isForceClassic()
    {
        return forceClassic;
    }

    public void setForceClassic( boolean forceClassic )
    {
        this.forceClassic = forceClassic;
    }
}
