/*
 * Copyright (c) 2020, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
 *
 * Licensed 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.
 *
 */

apply plugin: 'java-library'
apply plugin: "com.github.spotbugs"
apply plugin: "checkstyle"
apply plugin: "jacoco"

configurations {
    jacocoRuntime
}

dependencies {
    jacocoRuntime "org.jacoco:org.jacoco.agent:${jacoco.toolVersion}:runtime"

    checkstyle project(":checkstyle")
    checkstyle "com.puppycrawl.tools:checkstyle:${puppycrawlCheckstyleVersion}"
}

tasks.withType(JavaCompile) {
    options.encoding = 'UTF-8'
}

sourceCompatibility = JavaVersion.VERSION_21

jacoco {
    toolVersion = "0.8.10"
}

test {
    testLogging {
        showStackTraces = true
        showStandardStreams = true
        events "failed"
        exceptionFormat "full"
    }
    jacoco {
        enabled = true
        destinationFile = file("$buildDir/coverage-reports/jacoco.exec")
        includeNoLocationClasses = true
        excludes = ['jdk.internal.*']
    }
}

spotbugsMain {
    ignoreFailures = true
    def classLoader = plugins["com.github.spotbugs"].class.classLoader
    def SpotBugsConfidence = classLoader.findLoadedClass("com.github.spotbugs.snom.Confidence")
    def SpotBugsEffort = classLoader.findLoadedClass("com.github.spotbugs.snom.Effort")
    effort = SpotBugsEffort.MAX
    reportLevel = SpotBugsConfidence.LOW
    reportsDir = file("$project.buildDir/reports/spotbugs")
    def excludeFile = file("spotbugs-exclude.xml")
    if (excludeFile.exists()) {
        it.excludeFilter = excludeFile
    }
    reports {
        text.enabled = true
    }
}

spotbugsTest {
    enabled = false
}

task validateSpotbugs() {
    doLast {
        if (spotbugsMain.reports.size() > 0 &&
            spotbugsMain.reports[0].destination.exists() &&
            spotbugsMain.reports[0].destination.text.readLines().size() > 0) {
            spotbugsMain.reports[0].destination?.eachLine {
                println 'Failure: ' + it
            }
            throw new GradleException("Spotbugs rule violations were found.");
        }
    }
}

checkstyle {
    toolVersion '10.12.0'
    configFile rootProject.file("build-config/checkstyle/build/checkstyle.xml")
    configProperties = ["suppressionFile" : rootProject.file("build-config/checkstyle/build/suppressions.xml")]
}

spotbugsMain.finalizedBy validateSpotbugs
checkstyleMain.dependsOn(":checkstyle:downloadMultipleFiles")
