buildscript {
  repositories {
    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.13'
    classpath 'net.ltgt.gradle:gradle-apt-plugin:0.13'
    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"
      apply plugin: "net.ltgt.apt"

      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.2.0'
        apt 'com.google.guava:guava-beta-checker:1.0'
      }
    } 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.13.0-SNAPSHOT" // CURRENT_GRPC_VERSION

    sourceCompatibility = 1.6
    targetCompatibility = 1.6

    repositories {
        maven {
            // The google mirror is less flaky than mavenCentral()
            url "https://maven-central.storage-download.googleapis.com/repos/central/data/"
        }
        mavenLocal()
    }

    [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
      // LinkedList doesn't hurt much in tests and has lots of usages
      options.compilerArgs += ["-Xlint:-serial", "-Xep:JdkObsolete:OFF"]
    }

    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.24.Final'
        guavaVersion = '20.0'
        protobufVersion = '3.5.1'
        protocVersion = '3.5.1-1'
        protobufNanoVersion = '3.0.0-alpha-5'
        opencensusVersion = '0.11.0'

        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",
                "-XepExcludedPaths:.*/src/generated/[^/]+/java/.*",
            ]
          }
        }

        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.1.2",
                gson: "com.google.code.gson:gson:2.7",
                guava: "com.google.guava:guava:${guavaVersion}",
                hpack: 'com.twitter:hpack:0.10.1',
                javax_annotation: 'javax.annotation:javax.annotation-api:1.2',
                jsr305: 'com.google.code.findbugs:jsr305:3.0.0',
                oauth_client: 'com.google.auth:google-auth-library-oauth2-http:0.9.0',
                google_api_protos: 'com.google.api.grpc:proto-google-common-protos:1.0.0',
                google_auth_credentials: 'com.google.auth:google-auth-library-credentials:0.9.0',
                okhttp: 'com.squareup.okhttp:okhttp:2.5.0',
                okio: 'com.squareup.okio:okio:1.13.0',
                opencensus_api: "io.opencensus:opencensus-api:${opencensusVersion}",
                opencensus_contrib_grpc_metrics: "io.opencensus:opencensus-contrib-grpc-metrics:${opencensusVersion}",
                opencensus_impl: "io.opencensus:opencensus-impl:${opencensusVersion}",
                opencensus_impl_lite: "io.opencensus:opencensus-impl-lite:${opencensusVersion}",
                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.5',
                protobuf_util: "com.google.protobuf:protobuf-java-util:${protobufVersion}",
                lang: "org.apache.commons:commons-lang3:3.5",

                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.8.Final',

                conscrypt: 'org.conscrypt:conscrypt-openjdk-uber:1.0.1',

                // Test dependencies.
                junit: 'junit:junit:4.12',
                mockito: 'org.mockito:mockito-core:1.9.5',
                truth: 'com.google.truth:truth:0.36',
                guava_testlib: 'com.google.guava:guava-testlib:20.0',

                // 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.7'
        ]
    }

    // 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")
    }

    // invoke jmh on a single benchmark class like so:
    //   ./gradlew -PjmhIncludeSingleClass=StatsTraceContextBenchmark clean :grpc-core:jmh
    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
        if (project.hasProperty('jmhIncludeSingleClass')) {
          include = [project.property('jmhIncludeSingleClass')]
        }
    }

    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) }
        if (rootProject.hasProperty('repositoryDir')) {
          repository(url: new File(rootProject.repositoryDir).toURI())
        } else {
          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 = [
        // TODO: uncomment after grpc-alts artifact is published.
        // ':grpc-alts',
        ':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']
        }
    }
}
