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 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 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 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;
    }
}
