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;
import java.util.Properties;

/**
 * Data object to store all configuration options needed to execute CPD
 * 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 CpdRequest implements Serializable
{
    private static final long serialVersionUID = -7585852992660240668L;

    private String javaExecutable;

    private int minimumTokens;
    private String language;
    private Properties languageProperties;
    private String sourceEncoding;
    private List<File> files = new ArrayList<>();

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

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

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

    public void setMinimumTokens( int minimumTokens )
    {
        this.minimumTokens = minimumTokens;
    }

    public void setLanguage( String language )
    {
        this.language = language;
    }

    public void setLanguageProperties( Properties languageProperties )
    {
        this.languageProperties = languageProperties;
    }

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

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

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

    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 setIncludeXmlInSite( boolean includeXmlInSite )
    {
        this.includeXmlInSite = includeXmlInSite;
    }

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

    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 String getJavaExecutable()
    {
        return javaExecutable;
    }

    public int getMinimumTokens()
    {
        return minimumTokens;
    }

    public String getLanguage()
    {
        return language;
    }

    public Properties getLanguageProperties()
    {
        return languageProperties;
    }

    public String getSourceEncoding()
    {
        return sourceEncoding;
    }

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

    public String getExcludeFromFailureFile()
    {
        return excludeFromFailureFile;
    }

    public String getTargetDirectory()
    {
        return targetDirectory;
    }

    public String getOutputEncoding()
    {
        return outputEncoding;
    }

    public String getFormat()
    {
        return format;
    }

    public boolean isIncludeXmlInSite()
    {
        return includeXmlInSite;
    }

    public String getReportOutputDirectory()
    {
        return reportOutputDirectory;
    }

    public boolean isShowPmdLog()
    {
        return showPmdLog;
    }

    public boolean isColorizedLog()
    {
        return colorizedLog;
    }

    public String getLogLevel()
    {
        return logLevel;
    }
}
