buildscript {
  repositories {
    mavenCentral()
    mavenLocal()
    maven {
      url "https://plugins.gradle.org/m2/"
    }
  }
  dependencies {
    classpath 'com.google.gradle:osdetector-gradle-plugin:1.4.0'
    classpath 'ru.vyarus:gradle-animalsniffer-plugin:1.4.0'
    classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.11'
    classpath "me.champeau.gradle:jmh-gradle-plugin:0.4.4"
    classpath 'me.champeau.gradle:japicmp-gradle-plugin:0.2.5'
  }
}

subprojects {
    apply plugin: "checkstyle"
    apply plugin: "java"
    apply plugin: "maven"
    apply plugin: "idea"
    apply plugin: "signing"
    apply plugin: "jacoco"

    apply plugin: "me.champeau.gradle.jmh"
    apply plugin: "com.google.osdetector"
    // The plugin only has an effect if a signature is specified
    apply plugin: "ru.vyarus.animalsniffer"
    if (!rootProject.hasProperty('errorProne') || rootProject.errorProne.toBoolean()) {
      apply plugin: "net.ltgt.errorprone"

      dependencies {
        // The ErrorProne plugin defaults to the latest, which would break our
        // build if error prone releases a new version with a new check
        errorprone 'com.google.errorprone:error_prone_core:2.0.21'
      }
    } else {
      // Remove per-project error-prone checker config
      allprojects {
        afterEvaluate { project ->
          project.tasks.withType(JavaCompile) {
            options.compilerArgs.removeAll { it.startsWith("-Xep:") }
          }
        }
      }
    }
    // TODO(zpencer): remove when intellij 2017.2 is released
    // https://github.com/gradle/gradle/issues/2315
    idea.module.inheritOutputDirs = true

    group = "io.grpc"
    version = "1.8.0-SNAPSHOT" // CURRENT_GRPC_VERSION

    sourceCompatibility = 1.6
    targetCompatibility = 1.6

    repositories {
        mavenCentral()
        mavenLocal()
        maven {
          url "https://oss.sonatype.org/content/repositories/snapshots/"
        }
    }

    [compileJava, compileTestJava, compileJmhJava].each() {
        it.options.compilerArgs += ["-Xlint:all", "-Xlint:-options", "-Xlint:-path"]
        it.options.encoding = "UTF-8"
        if (rootProject.hasProperty('failOnWarnings') && rootProject.failOnWarnings.toBoolean()) {
            it.options.compilerArgs += ["-Werror"]
        }
    }

    compileTestJava {
      // serialVersionUID is basically guaranteed to be useless in our tests
      options.compilerArgs += ["-Xlint:-serial"]
    }

    jar.manifest {
        attributes('Implementation-Title': name,
                'Implementation-Version': version,
                'Built-By': System.getProperty('user.name'),
                'Built-JDK': System.getProperty('java.version'),
                'Source-Compatibility': sourceCompatibility,
                'Target-Compatibility': targetCompatibility)
    }

    javadoc.options {
        encoding = 'UTF-8'
        use = true
        links 'https://docs.oracle.com/javase/8/docs/api/'
    }

    ext {
        def exeSuffix = osdetector.os == 'windows' ? ".exe" : ""
        protocPluginBaseName = 'protoc-gen-grpc-java'
        javaPluginPath = "$rootDir/compiler/build/exe/java_plugin/$protocPluginBaseName$exeSuffix"

        nettyVersion = '4.1.16.Final'
        guavaVersion = '19.0'
        protobufVersion = '3.4.0'
        protocVersion = protobufVersion
        protobufNanoVersion = '3.0.0-alpha-5'

        configureProtoCompilation = {
          String generatedSourcePath = "${projectDir}/src/generated"
          if (rootProject.childProjects.containsKey('grpc-compiler')) {
            // Only when the codegen is built along with the project, will we be able to recompile
            // the proto files.
            project.apply plugin: 'com.google.protobuf'
            project.protobuf {
              protoc {
                if (project.hasProperty('protoc')) {
                  path = project.protoc
                } else {
                  artifact = "com.google.protobuf:protoc:${protocVersion}"
                }
              }
              plugins {
                grpc {
                  path = javaPluginPath
                }
              }
              generateProtoTasks {
                all().each { task ->
                  task.dependsOn ':grpc-compiler:java_pluginExecutable'
                  // Delete the generated sources first, so that we can be alerted if they are not re-compiled.
                  task.dependsOn 'deleteGeneratedSource' + task.sourceSet.name
                  // Recompile protos when the codegen has been changed
                  task.inputs.file javaPluginPath
                  // Recompile protos when build.gradle has been changed, because
                  // it's possible the version of protoc has been changed.
                  task.inputs.file "${rootProject.projectDir}/build.gradle"
                  task.plugins {
                    grpc {
                      option 'noversion'
                    }
                  }
                }
              }
              generatedFilesBaseDir = generatedSourcePath
            }

            sourceSets.each { sourceSet ->
              task "deleteGeneratedSource${sourceSet.name}" {
                doLast {
                  project.delete project.fileTree(dir: generatedSourcePath + '/' + sourceSet.name)
                }
              }
            }
          } else {
            // Otherwise, we just use the checked-in generated code.
            project.sourceSets {
              main {
                java {
                  srcDir "${generatedSourcePath}/main/java"
                  srcDir "${generatedSourcePath}/main/javanano"
                  srcDir "${generatedSourcePath}/main/grpc"
                }
              }
              test {
                java {
                  srcDir "${generatedSourcePath}/test/java"
                  srcDir "${generatedSourcePath}/test/javanano"
                  srcDir "${generatedSourcePath}/test/grpc"
                }
              }
            }
          }

          [compileJava, compileTestJava, compileJmhJava].each() {
            // Protobuf-generated code produces some warnings.
            // https://github.com/google/protobuf/issues/2718
            it.options.compilerArgs += ["-Xlint:-cast", "-Xep:MissingOverride:OFF",
                "-Xep:ReferenceEquality:OFF", "-Xep:FunctionalInterfaceClash:OFF"]
          }
        }

        def epoll_suffix = "";
        if (osdetector.classifier in ["linux-x86_64"]) {
            // The native code is only pre-compiled on certain platforms.
            epoll_suffix = ":" + osdetector.classifier
        }
        libraries = [
                errorprone: "com.google.errorprone:error_prone_annotations:2.0.19",
                guava: "com.google.guava:guava:${guavaVersion}",
                hpack: 'com.twitter:hpack:0.10.1',
                jsr305: 'com.google.code.findbugs:jsr305:3.0.0',
                oauth_client: 'com.google.auth:google-auth-library-oauth2-http:0.7.0',
                google_api_protos: 'com.google.api.grpc:proto-google-common-protos:0.1.9',
                google_auth_credentials: 'com.google.auth:google-auth-library-credentials:0.4.0',
                okhttp: 'com.squareup.okhttp:okhttp:2.5.0',
                okio: 'com.squareup.okio:okio:1.6.0',
                opencensus_api: 'io.opencensus:opencensus-api:0.7.0',
                opencensus_impl: 'io.opencensus:opencensus-impl:0.7.0',
                instrumentation_api: 'com.google.instrumentation:instrumentation-api:0.4.3',
                protobuf: "com.google.protobuf:protobuf-java:${protobufVersion}",
                protobuf_lite: "com.google.protobuf:protobuf-lite:3.0.1",
                protoc_lite: "com.google.protobuf:protoc-gen-javalite:3.0.0",
                protobuf_nano: "com.google.protobuf.nano:protobuf-javanano:${protobufNanoVersion}",
                protobuf_plugin: 'com.google.protobuf:protobuf-gradle-plugin:0.8.1',
                protobuf_util: "com.google.protobuf:protobuf-java-util:${protobufVersion}",

                netty: "io.netty:netty-codec-http2:[${nettyVersion}]",
                netty_epoll: "io.netty:netty-transport-native-epoll:${nettyVersion}" + epoll_suffix,
                netty_proxy_handler: "io.netty:netty-handler-proxy:${nettyVersion}",
                netty_tcnative: 'io.netty:netty-tcnative-boringssl-static:2.0.6.Final',

                // Test dependencies.
                junit: 'junit:junit:4.12',
                mockito: 'org.mockito:mockito-core:1.9.5',
                truth: 'com.google.truth:truth:0.28',

                // Benchmark dependencies
                hdrhistogram: 'org.hdrhistogram:HdrHistogram:2.1.10',
                math: 'org.apache.commons:commons-math3:3.6',

                // Jetty ALPN dependencies
                jetty_alpn_agent: 'org.mortbay.jetty.alpn:jetty-alpn-agent:2.0.6'
        ]
    }

    // Define a separate configuration for managing the dependency on Jetty ALPN agent.
    configurations {
        alpnagent

        compile {
            // Detect Maven Enforcer's dependencyConvergence failures. We only
            // care for artifacts used as libraries by others.
            if (!(project.name in ['grpc-benchmarks', 'grpc-interop-testing'])) {
                resolutionStrategy.failOnVersionConflict()
            }
        }
    }

    dependencies {
        testCompile libraries.junit,
                    libraries.mockito,
                    libraries.truth

        // Configuration for modules that use Jetty ALPN agent
        alpnagent libraries.jetty_alpn_agent

        jmh 'org.openjdk.jmh:jmh-core:1.19',
            'org.openjdk.jmh:jmh-generator-bytecode:1.19'
    }

    signing {
        required false
        sign configurations.archives
    }

    // Disable JavaDoc doclint on Java 8. It's annoying.
    if (JavaVersion.current().isJava8Compatible()) {
      allprojects {
        tasks.withType(Javadoc) {
          options.addStringOption('Xdoclint:none', '-quiet')
        }
      }
    }

    checkstyle {
        configFile = file("$rootDir/buildscripts/checkstyle.xml")
        toolVersion = "6.17"
        ignoreFailures = false
        if (rootProject.hasProperty("checkstyle.ignoreFailures")) {
            ignoreFailures = rootProject.properties["checkstyle.ignoreFailures"].toBoolean()
        }
        configProperties["rootDir"] = rootDir
    }

    checkstyleMain {
        source = fileTree(dir: "src/main", include: "**/*.java")
    }

    checkstyleTest {
        source = fileTree(dir: "src/test", include: "**/*.java")
    }

    jmh {
        warmupIterations = 10
        iterations = 10
        fork = 1
        // None of our benchmarks need the tests, and we have pseudo-circular
        // dependencies that break when including them. (context's testCompile
        // depends on core; core's testCompile depends on testing)
        includeTests = false
    }

    task javadocJar(type: Jar) {
        classifier = 'javadoc'
        from javadoc
    }

    task sourcesJar(type: Jar) {
        classifier = 'sources'
        from sourceSets.main.allSource
    }

    artifacts {
        archives javadocJar, sourcesJar
    }

    uploadArchives.repositories.mavenDeployer {
        beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }
        String stagingUrl
        if (rootProject.hasProperty('repositoryId')) {
          stagingUrl = 'https://oss.sonatype.org/service/local/staging/deployByRepositoryId/' +
              rootProject.repositoryId
        } else {
          stagingUrl = 'https://oss.sonatype.org/service/local/staging/deploy/maven2/'
        }
        def configureAuth = {
          if (rootProject.hasProperty('ossrhUsername') && rootProject.hasProperty('ossrhPassword')) {
            authentication(userName: rootProject.ossrhUsername, password: rootProject.ossrhPassword)
          }
        }
        repository(url: stagingUrl, configureAuth)
        snapshotRepository(url: 'https://oss.sonatype.org/content/repositories/snapshots/', configureAuth)
    }
    uploadArchives.onlyIf { !name.contains("grpc-gae-interop-testing") }

    [
      install.repositories.mavenInstaller,
      uploadArchives.repositories.mavenDeployer,
    ]*.pom*.whenConfigured { pom ->
        pom.project {
            name "$project.group:$project.name"
            description project.description
            url 'https://github.com/grpc/grpc-java'

            scm {
                connection 'scm:git:https://github.com/grpc/grpc-java.git'
                developerConnection 'scm:git:git@github.com:grpc/grpc-java.git'
                url 'https://github.com/grpc/grpc-java'
            }

            licenses {
                license {
                    name 'Apache 2.0'
                    url 'https://opensource.org/licenses/Apache-2.0'
                }
            }

            developers {
                developer {
                    id "grpc.io"
                    name "gRPC Contributors"
                    email "grpc-io@googlegroups.com"
                    url "https://grpc.io/"
                    // https://issues.gradle.org/browse/GRADLE-2719
                    organization = "gRPC Authors"
                    organizationUrl "https://www.google.com"
                }
            }
        }
        if (!(project.name in
            ["grpc-stub", "grpc-protobuf", "grpc-protobuf-lite", "grpc-protobuf-nano"])) {
          def core = pom.dependencies.find {dep -> dep.artifactId == 'grpc-core'}
          if (core != null) {
            // Depend on specific version of grpc-core because internal package is unstable
            core.version = "[" + core.version + "]"
          }
        }
    }
    // At a test failure, log the stack trace to the console so that we don't
    // have to open the HTML in a browser.
    test {
        testLogging {
            exceptionFormat = 'full'
            showExceptions true
            showCauses true
            showStackTraces true
        }
        maxHeapSize = '1500m'
    }
}

// Run with: ./gradlew japicmp --continue
def baselineGrpcVersion = '1.6.1'
def publicApiSubprojects = [
        ':grpc-auth',
        ':grpc-context',
        ':grpc-core',
        ':grpc-grpclb',
        ':grpc-netty',
        ':grpc-okhttp',
        ':grpc-protobuf',
        ':grpc-protobuf-lite',
        ':grpc-protobuf-nano',
        ':grpc-stub',
        ':grpc-testing',
]

publicApiSubprojects.each { name ->
    project(":$name") {
        apply plugin: 'me.champeau.gradle.japicmp'

        // Get the baseline version's jar for this subproject
        File baselineArtifact = null
        // Use a detached configuration, otherwise the current version's jar will take precedence
        // over the baseline jar.
        // A necessary hack, the intuitive thing does NOT work:
        // https://discuss.gradle.org/t/is-the-default-configuration-leaking-into-independent-configurations/2088/6
        def oldGroup = project.group
        try {
            project.group = 'virtual_group_for_japicmp'
            String depModule = "io.grpc:${project.name}:${baselineGrpcVersion}@jar"
            String depJar = "${project.name}-${baselineGrpcVersion}.jar"
            Configuration configuration = configurations.detachedConfiguration(
                    dependencies.create(depModule)
            )
            baselineArtifact = files(configuration.files).filter {
                it.name.equals(depJar)
            }.singleFile
        } finally {
            project.group = oldGroup
        }

        // Add a japicmp task that compares the current .jar with baseline .jar
        task japicmp(type: me.champeau.gradle.japicmp.JapicmpTask, dependsOn: jar) {
            oldClasspath = files(baselineArtifact)
            newClasspath = files(jar.archivePath)
            onlyBinaryIncompatibleModified = false
            // Be quiet about things that did not change
            onlyModified = true
            // This task should fail if there are incompatible changes
            failOnModification = true
            ignoreMissingClasses = true
            htmlOutputFile = file("$buildDir/reports/japi.html")

            packageExcludes = ['io.grpc.internal']

            // Also break on source incompatible changes, not just binary.
            // Eg adding abstract method to public class.
            // TODO(zpencer): enable after japicmp-gradle-plugin/pull/14
            // breakOnSourceIncompatibility = true

            // Ignore any classes or methods marked @ExperimentalApi
            // TODO(zpencer): enable after japicmp-gradle-plugin/pull/15
            // annotationExcludes = ['@io.grpc.ExperimentalApi']
        }
    }
}
