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

/*
 * 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.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * Data object to store all configuration options needed to execute PMD
 * as a separate process.
 * 
 * <p>This class is intended to be serialized and read back.
 * 
 * <p>Some properties might be optional and can be <code>null</code>.
 */
public class PmdRequest implements Serializable
{
    private static final long serialVersionUID = -6324416880563476455L;

    private String javaExecutable;

    private String language;
    private String languageVersion;
    private int minimumPriority;
    private String auxClasspath;
    private String suppressMarker;
    private String analysisCacheLocation;
    private List<String> rulesets;
    private String sourceEncoding;
    private List<File> files = new ArrayList<>();

    private boolean showPmdLog;
    private boolean colorizedLog;
    private String logLevel;
    private boolean skipPmdError;

    private String excludeFromFailureFile;
    private String targetDirectory;
    private String outputEncoding;
    private String format;
    private String benchmarkOutputLocation;
    private boolean includeXmlInSite;
    private String reportOutputDirectory;

    /**
     * Configure language and language version.
     *
     * @param language the language
     * @param targetJdk the language version, optional, can be <code>null</code>
     */
    public void setLanguageAndVersion( String language, String targetJdk )
    {
        if ( "java".equals( language ) || null == language )
        {
            this.language = "java";
            this.languageVersion = targetJdk;
        }
        else if ( "javascript".equals( language ) || "ecmascript".equals( language ) )
        {
            this.language = "ecmascript";
        }
        else if ( "jsp".equals( language ) )
        {
            this.language = "jsp";
        }
        else
        {
            this.language = language;
        }
    }

    public void setJavaExecutable( String javaExecutable )
    {
        this.javaExecutable = javaExecutable;
    }

    public void setMinimumPriority( int minimumPriority )
    {
        this.minimumPriority = minimumPriority;
    }

    public void setAuxClasspath( String auxClasspath )
    {
        this.auxClasspath = auxClasspath;
    }

    public void setSuppressMarker( String suppressMarker )
    {
        this.suppressMarker = suppressMarker;
    }

    public void setAnalysisCacheLocation( String analysisCacheLocation )
    {
        this.analysisCacheLocation = analysisCacheLocation;
    }

    public void setRulesets( List<String> rulesets )
    {
        this.rulesets = rulesets;
    }

    public void setSourceEncoding( String sourceEncoding )
    {
        this.sourceEncoding = sourceEncoding;
    }

    public void addFiles( Collection<File> files )
    {
        this.files.addAll( files );
    }

    public void setBenchmarkOutputLocation( String benchmarkOutputLocation )
    {
        this.benchmarkOutputLocation = benchmarkOutputLocation;
    }

    public void setTargetDirectory( String targetDirectory )
    {
        this.targetDirectory = targetDirectory;
    }

    public void setOutputEncoding( String outputEncoding )
    {
        this.outputEncoding = outputEncoding;
    }

    public void setFormat( String format )
    {
        this.format = format;
    }

    public void setShowPmdLog( boolean showPmdLog )
    {
        this.showPmdLog = showPmdLog;
    }

    public void setColorizedLog( boolean colorizedLog )
    {
        this.colorizedLog = colorizedLog;
    }

    public void setLogLevel( String logLevel )
    {
        this.logLevel = logLevel;
    }

    public void setSkipPmdError( boolean skipPmdError )
    {
        this.skipPmdError = skipPmdError;
    }

    public void setIncludeXmlInSite( boolean includeXmlInSite )
    {
        this.includeXmlInSite = includeXmlInSite;
    }

    public void setReportOutputDirectory( String reportOutputDirectory )
    {
        this.reportOutputDirectory = reportOutputDirectory;
    }

    public void setExcludeFromFailureFile( String excludeFromFailureFile )
    {
        this.excludeFromFailureFile = excludeFromFailureFile;
    }





    public String getJavaExecutable()
    {
        return javaExecutable;
    }

    public String getLanguage()
    {
        return language;
    }

    public String getLanguageVersion()
    {
        return languageVersion;
    }

    public int getMinimumPriority()
    {
        return minimumPriority;
    }

    public String getAuxClasspath()
    {
        return auxClasspath;
    }

    public String getSuppressMarker()
    {
        return suppressMarker;
    }

    public String getAnalysisCacheLocation()
    {
        return analysisCacheLocation;
    }

    public List<String> getRulesets()
    {
        return rulesets;
    }

    public String getSourceEncoding()
    {
        return sourceEncoding;
    }

    public List<File> getFiles()
    {
        return files;
    }

    public String getBenchmarkOutputLocation()
    {
        return benchmarkOutputLocation;
    }

    public String getTargetDirectory()
    {
        return targetDirectory;
    }

    public String getOutputEncoding()
    {
        return outputEncoding;
    }

    public String getFormat()
    {
        return format;
    }

    public boolean isShowPmdLog()
    {
        return showPmdLog;
    }

    public boolean isColorizedLog()
    {
        return colorizedLog;
    }

    public String getLogLevel()
    {
        return logLevel;
    }

    public boolean isDebugEnabled()
    {
        return "debug".equals( logLevel );
    }

    public boolean isSkipPmdError()
    {
        return skipPmdError;
    }

    public boolean isIncludeXmlInSite()
    {
        return includeXmlInSite;
    }

    public String getReportOutputDirectory()
    {
        return reportOutputDirectory;
    }

    public String getExcludeFromFailureFile()
    {
        return excludeFromFailureFile;
    }
}
