package org.apache.maven.plugins.pmd.stubs;

/*
 * 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.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import org.apache.maven.artifact.Artifact;
import org.apache.maven.model.Build;
import org.apache.maven.model.Model;
import org.apache.maven.model.ReportPlugin;
import org.apache.maven.model.Scm;
import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
import org.apache.maven.plugin.testing.stubs.MavenProjectStub;

/**
 * @author <a href="mailto:oching@apache.org">Maria Odea Ching</a>
 * @version $Id$
 */
public class CustomConfigurationMavenProjectStub
    extends MavenProjectStub
{
    private Build build;

    private List<ReportPlugin> reportPlugins = new ArrayList<>();

    public CustomConfigurationMavenProjectStub()
    {
        MavenXpp3Reader pomReader = new MavenXpp3Reader();
        Model model = null;

        try
        {
            model =
                pomReader.read( new FileReader( new File( getBasedir()
                    + "/src/test/resources/unit/custom-configuration/custom-configuration-plugin-config.xml" ) ) );
            setModel( model );
        }
        catch ( Exception e )
        {

        }

        setGroupId( model.getGroupId() );
        setArtifactId( model.getArtifactId() );
        setVersion( model.getVersion() );
        setName( model.getName() );
        setUrl( model.getUrl() );
        setPackaging( model.getPackaging() );

        Scm scm = new Scm();
        scm.setConnection( "scm:svn:http://svn.apache.org/maven/sample/trunk" );
        setScm( scm );

        Build build = new Build();
        build.setFinalName( model.getBuild().getFinalName() );
        build.setDirectory( getBasedir() + "/target/test/unit/custom-configuration/target" );
        build.setSourceDirectory( getBasedir() + "/src/test/resources/unit/custom-configuration" );
        setBuild( build );

        setReportPlugins( model.getReporting().getPlugins() );

        String basedir = getBasedir().getAbsolutePath();
        List<String> compileSourceRoots = new ArrayList<>();
        compileSourceRoots.add( basedir + "/src/test/resources/unit/custom-configuration/custom/configuration" );
        setCompileSourceRoots( compileSourceRoots );

        Artifact artifact = new PmdPluginArtifactStub( getGroupId(), getArtifactId(), getVersion(), getPackaging() );
        artifact.setArtifactHandler( new DefaultArtifactHandlerStub() );
        setArtifact( artifact );

        setFile( new File( getBasedir().getAbsolutePath() + "/pom.xml" ) );
    }

    /** {@inheritDoc} */
    @Override
    public void setBuild( Build build )
    {
        this.build = build;
    }

    /** {@inheritDoc} */
    @Override
    public Build getBuild()
    {
        return build;
    }

    public void setReportPlugins( List<ReportPlugin> plugins )
    {
        this.reportPlugins = plugins;
    }

    /** {@inheritDoc} */
    @Override
    public List<ReportPlugin> getReportPlugins()
    {
        return reportPlugins;
    }

}
