/*
 * 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'
}

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

apply from: "$rootDir/version.gradle"

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'

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

        configurations {
            testArtifacts.extendsFrom testRuntime
        }

        artifacts {
            testArtifacts testJar
        }

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

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

                    from components.java
                    artifact testJar
                }
            }
        }
        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)
                    }
                }
                sign publishing.publications.maven
            }
        }
    }

    repositories {
        mavenCentral()
    }

}

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