/*
 * 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.
 */
package org.apache.maven.plugins.pmd.exec;

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