/*
 * 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.
 */
buildscript {
    repositories {
        mavenCentral()
    }
}

plugins {
    id 'com.google.protobuf'
    id 'java'
    id "com.github.vlsi.stage-vote-release" version "1.73"
    id 'checkstyle'
    id 'org.nosphere.apache.rat'
    id 'com.github.spotbugs'
}

subprojects {
    task allDeps(type: DependencyReportTask) {}
}

apply from: "$rootDir/version.gradle"
version = buildVersion

releaseArtifacts {
    fromProject("bookkeeper-dist")
    fromProject("bookkeeper-dist-all")
    fromProject("bookkeeper-dist-bkctl")
    fromProject("bookkeeper-dist-server")
}

releaseParams { // ReleaseExtension
    tlp.set("Bookkeeper")
    componentName.set("Apache Bookkeeper")
    releaseTag.set("release-$buildVersion")
    rcTag.set(rc.map { "release-$buildVersion-rc$it" })

    sitePreviewEnabled.set(false)

    nexus {
        packageGroup.set("org.apache.bookkeeper")
    }
}

allprojects {
    apply from: "$rootDir/dependencies.gradle"
    if (it.path != ':circe-checksum:src:main:circe'
        && it.path != ':cpu-affinity:src:main:affinity'
        && it.name != 'src'
        && it.name != 'main') {
        apply plugin: 'java'
        apply plugin: 'maven-publish'
        apply plugin: 'signing'
        apply plugin: 'org.nosphere.apache.rat'
        apply plugin: "checkstyle"
        apply plugin: 'com.github.spotbugs'
        checkstyle {
            toolVersion "${checkStyleVersion}"
            configFile file("$rootDir/buildtools/src/main/resources/bookkeeper/checkstyle.xml")
            checkstyleMain {
                source ='src/main/java'
            }

            checkstyleTest {
                source ='src/test/java'
            }
        }
 
        spotbugs {
            toolVersion = '3.1.8'
            excludeFilter = file("$rootDir/buildtools/src/main/resources/bookkeeper/findbugsExclude.xml")
            reportLevel = 'high'
        }

        task testJar(type: Jar, dependsOn: testClasses) {
            classifier = 'tests'
            from sourceSets.test.output
        }

        // TODO- Seperate rat plugins and other plugins configuration in seperate files
        rat {
            excludes = [
                    '**/.*/**',
                    '**/*.ipr',
                    '**/out/**',
                    '**/generated/**',
                    '**/build/**',
                    '**/.idea/**',
                    '.git/**/*',
                    '.github/**/*',
                    '**/.gitignore',
                    '**/.svn/**/*',
                    '**/target/**/*',
                    '**/README.md',
                    '**/README.rst',
                    '**/apidocs/*',
                    '**/src/main/resources/deps/**',
                    '**/META-INF/**',
                    '**/.classpath',
                    '**/.project',
                    '**/.checkstyle',
                    '**/.settings/*',
                    '**/*.iml',
                    '**/*.iws',
                    '**/*.ipr',
                    'site/**',
                    'site2/**',
                    '**/*.log',
                    'data/**',
                    'dev/.vagrant/**',
                    '**/proto/**.py',
                    '**/keyStoreClientPassword.txt',
                    '**/keyStoreServerPassword.txt',
                    '**/proc_cpuinfo.txt',
                    '**/__pycache__/**',
                    '**/bookkeeper.egg-info/**',
                    '**/apache_bookkeeper_client.egg-info/**',
                    '**/pip-selfcheck.json',
                    '**/test_conf_2.conf'
            ]
        }

        configurations {
            testArtifacts.extendsFrom testRuntime
        }

        artifacts {
            testArtifacts testJar
        }

        plugins.withType(DistributionPlugin) {
            distTar {
                compression = Compression.GZIP
                archiveExtension = 'tar.gz'
            }
        }

        javadoc {
            options.addBooleanOption('Xdoclint:none', true)
            includes = [
                    '**/org/apache/bookkeeper/client/api/**',
                    '**/org/apache/bookkeeper/common/annotation/**',
                    '**/org/apache/bookkeeper/conf/**',
                    '**/org/apache/bookkeeper/feature/**',
                    '**/org/apache/bookkeeper/stats/**',
            ]
        }

        def componentName = it.name
        publishing {
            publications {
                maven(MavenPublication) {
                    groupId = 'org.apache.bookkeeper'
                    artifactId = componentName
                    version = buildVersion

                    from components.java
                }
            }
        }
        signing {
            def skipSigning = project.hasProperty('skipSigning') && skipSigning.toBoolean()
            def shouldSign = !skipSigning

            if (shouldSign) {
                if (project.hasProperty("singingKey")) {
                    // The following allow the secretKey and password to be specified using env var
                    // This is mainly for the CI system.
                    //   * ORG_GRADLE_PROJECT_signingKey
                    //   * ORG_GRADLE_PROJECT_signingPassword
                    //   * ORG_GRADLE_PROJECT_signingKeyId
                    // See https://docs.gradle.org/current/userguide/signing_plugin.html#sec:in-memory-keys
                    // for details
                    def signingKey = findProperty("signingKey")
                    def signingKeyId = findProperty("signingKeyId")
                    def signingPassword = findProperty("signingPassword")
                    if (signingKeyId && signingKey && signingPassword) {
                        useInMemoryPgpKeys(signingKeyId, signingKey, signingPassword)
                    } else if (signingKey && signingPassword) {
                        useInMemoryPgpKeys(signingKey, signingPassword)
                    }
                }
                // Signing task is added by the release plugin
            }
        }
        test {
            String testGroup = System.properties['testGroup']
            if (testGroup == 'client') {
                include '**/client/*'
            } else if (testGroup == 'bookie') {
                include '**/bookie/*'
            } else if (testGroup == 'other') {
                exclude '**/client/*'
                exclude '**/bookie/*'
            }
            if (project.hasProperty('excludeTests')) {
                exclude project.property('excludeTests')
            }
        }
    }

    repositories {
        mavenCentral()
    }

}

pluginManager.withPlugin('java') {
    sourceCompatibility = targetCompatibility = 8
}
