buildscript {
    repositories {
        mavenCentral()
        mavenLocal()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'ru.vyarus:gradle-animalsniffer-plugin:1.4.6'
        classpath 'net.ltgt.gradle:gradle-errorprone-plugin:0.0.16'
        classpath "net.ltgt.gradle:gradle-apt-plugin:0.18"
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.20.0'
        classpath "gradle.plugin.com.github.sherter.google-java-format:google-java-format-gradle-plugin:0.7.1"
        classpath "me.champeau.gradle:jmh-gradle-plugin:0.4.7"
        classpath "gradle.plugin.io.morethan.jmhreport:gradle-jmh-report:0.7.0"
    }
}

// Display the version report using: ./gradlew dependencyUpdates
// Also see https://github.com/ben-manes/gradle-versions-plugin.
apply plugin: 'com.github.ben-manes.versions'

// Don't use the Checker Framework by default, since it interferes with Error Prone.
def useCheckerFramework = rootProject.hasProperty('checkerFramework')
def useErrorProne = !useCheckerFramework

subprojects {
    apply plugin: "checkstyle"
    apply plugin: 'maven'
    apply plugin: 'idea'
    apply plugin: 'eclipse'
    apply plugin: 'java'
    apply plugin: "signing"
    apply plugin: "jacoco"
    // The plugin only has an effect if a signature is specified
    apply plugin: 'ru.vyarus.animalsniffer'
    apply plugin: 'findbugs'
    apply plugin: 'net.ltgt.apt'
    apply plugin: "me.champeau.gradle.jmh"
    apply plugin: "io.morethan.jmhreport"
    // Plugins that require java8
    if (JavaVersion.current().isJava8Compatible()) {
        if (useErrorProne) {
            apply plugin: "net.ltgt.errorprone"
        }
        apply plugin: 'com.github.sherter.google-java-format'
    }

    group = "io.opencensus"
    version = "0.17.0-SNAPSHOT" // CURRENT_OPENCENSUS_VERSION

    sourceCompatibility = 1.6
    targetCompatibility = 1.6

    repositories {
        mavenCentral()
        mavenLocal()
    }

    if (useCheckerFramework) {
        configurations {
            checkerFrameworkJavac {
                description = 'a customization of the Open JDK javac compiler with additional support for type annotations'
            }
            checkerFrameworkAnnotatedJDK {
                description = 'a copy of JDK classes with Checker Framework type qualifiers inserted'
            }
        }
    }

    [compileJava, compileTestJava, compileJmhJava].each() {
        // We suppress the "try" warning because it disallows managing an auto-closeable with
        // try-with-resources without referencing the auto-closeable within the try block.
        // We suppress the "processing" warning as suggested in
        // https://groups.google.com/forum/#!topic/bazel-discuss/_R3A9TJSoPM
        it.options.compilerArgs += ["-Xlint:all", "-Xlint:-try", "-Xlint:-processing"]
        if (useErrorProne) {
            if (JavaVersion.current().isJava8Compatible()) {
                it.options.compilerArgs += ["-XepAllDisabledChecksAsWarnings", "-XepDisableWarningsInGeneratedCode"]

                // MutableMethodReturnType can suggest returning Guava types from
                // API methods (https://github.com/google/error-prone/issues/982).
                it.options.compilerArgs += ["-Xep:MutableMethodReturnType:OFF"]

                // ReturnMissingNullable conflicts with Checker Framework null analysis.
                it.options.compilerArgs += ["-Xep:ReturnMissingNullable:OFF"]

                // OpenCensus doesn't currently use Var annotations.
                it.options.compilerArgs += ["-Xep:Var:OFF"]
            }
        }
        if (useCheckerFramework) {
            it.options.compilerArgs += [
                '-processor',
		'com.google.auto.value.processor.AutoValueProcessor,org.checkerframework.checker.nullness.NullnessChecker',
		"-Astubs=$rootDir/checker-framework/stubs"
            ]
        }
        it.options.encoding = "UTF-8"
        // Protobuf-generated code produces some warnings.
        // https://github.com/google/protobuf/issues/2718
        it.options.compilerArgs += ["-Xlint:-cast"]
        if (!JavaVersion.current().isJava9()) {
            // TODO(sebright): Enable -Werror for Java 9 once we upgrade AutoValue (issue #1017).
            it.options.compilerArgs += ["-Werror"]
        }
        if (JavaVersion.current().isJava7()) {
            // Suppress all deprecation warnings with Java 7, since there are some bugs in its handling of
            // @SuppressWarnings. See
            // https://stackoverflow.com/questions/26921774/how-to-avoid-deprecation-warnings-when-suppresswarningsdeprecation-doesnt
            it.options.compilerArgs += ["-Xlint:-deprecation"]

            // TODO(bdrutu): Enable for Java 7 when fix the issue with configuring bootstrap class.
            // [options] bootstrap class path not set in conjunction with -source 1.6
            it.options.compilerArgs += ["-Xlint:-options"]
        }
        if (JavaVersion.current().isJava9()) {
            // TODO(sebright): Currently, building with Java 9 produces the following "options" warnings:
            //
            // :opencensus-api:compileJavawarning: [options] bootstrap class path not set in conjunction with -source 1.6
            // warning: [options] source value 1.6 is obsolete and will be removed in a future release
            // warning: [options] target value 1.6 is obsolete and will be removed in a future release
            it.options.compilerArgs += ["-Xlint:-options"]
        }
    }

    compileTestJava {
        // serialVersionUID is basically guaranteed to be useless in tests
        options.compilerArgs += ["-Xlint:-serial"]
        // It undeprecates DoubleSubject.isEqualTo(Double).
        options.compilerArgs += ["-Xlint:-deprecation"]
    }

    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'
        links 'https://docs.oracle.com/javase/8/docs/api/'
    }

    ext {
        appengineVersion = '1.9.64'
        aspectjVersion = '1.8.11'
        autoValueVersion = '1.4'
        findBugsAnnotationsVersion = '3.0.1'
        findBugsJsr305Version = '3.0.2'
        errorProneVersion = '2.3.1'
        grpcVersion = '1.14.0'
        guavaVersion = '20.0'
        googleAuthVersion = '0.11.0'
        googleCloudBetaVersion = '0.64.0-beta'
        googleCloudGaVersion = '1.46.0'
        signalfxVersion = '0.0.39'
        springBootVersion = '1.5.15.RELEASE'
        springCloudVersion = '1.3.4.RELEASE'
        springVersion = '4.3.12.RELEASE'
        prometheusVersion = '0.4.0'
        protobufVersion = '3.5.1'
        zipkinReporterVersion = '2.3.2'
        jaegerReporterVersion = '0.27.0'
        opencensusProtoVersion = '0.0.2'
        dropwizardVersion = '3.1.2'

        libraries = [
                appengine_api: "com.google.appengine:appengine-api-1.0-sdk:${appengineVersion}",
                aspectj: "org.aspectj:aspectjrt:${aspectjVersion}",
                auto_value: "com.google.auto.value:auto-value:${autoValueVersion}",
                auto_service: 'com.google.auto.service:auto-service:1.0-rc3',
                byte_buddy: 'net.bytebuddy:byte-buddy:1.7.11',
                config: 'com.typesafe:config:1.2.1',
                disruptor: 'com.lmax:disruptor:3.4.1',
                errorprone: "com.google.errorprone:error_prone_annotations:${errorProneVersion}",
                findbugs_annotations: "com.google.code.findbugs:annotations:${findBugsAnnotationsVersion}",
                google_auth: "com.google.auth:google-auth-library-credentials:${googleAuthVersion}",
                google_cloud_logging: "com.google.cloud:google-cloud-logging:${googleCloudGaVersion}",
                google_cloud_trace: "com.google.cloud:google-cloud-trace:${googleCloudBetaVersion}",
                zipkin_reporter: "io.zipkin.reporter2:zipkin-reporter:${zipkinReporterVersion}",
                zipkin_urlconnection: "io.zipkin.reporter2:zipkin-sender-urlconnection:${zipkinReporterVersion}",
                jaeger_reporter: "com.uber.jaeger:jaeger-core:${jaegerReporterVersion}",
                google_cloud_monitoring: "com.google.cloud:google-cloud-monitoring:${googleCloudGaVersion}",
                grpc_context: "io.grpc:grpc-context:${grpcVersion}",
                grpc_core: "io.grpc:grpc-core:${grpcVersion}",
                grpc_netty: "io.grpc:grpc-netty:${grpcVersion}",
                grpc_stub: "io.grpc:grpc-stub:${grpcVersion}",
                guava: "com.google.guava:guava:${guavaVersion}",
                jsr305: "com.google.code.findbugs:jsr305:${findBugsJsr305Version}",
                signalfx_java: "com.signalfx.public:signalfx-java:${signalfxVersion}",
                spring_aspects: "org.springframework:spring-aspects:${springVersion}",
                spring_boot_starter_web: "org.springframework.boot:spring-boot-starter-web:${springBootVersion}",
                spring_cloud_build: "org.springframework.cloud:spring-cloud-build:${springCloudVersion}",
                spring_cloud_starter_sleuth: "org.springframework.cloud:spring-cloud-starter-sleuth:${springCloudVersion}",
                spring_context: "org.springframework:spring-context:${springVersion}",
                spring_context_support: "org.springframework:spring-context-support:${springVersion}",
                prometheus_simpleclient: "io.prometheus:simpleclient:${prometheusVersion}",
                protobuf: "com.google.protobuf:protobuf-java:${protobufVersion}",
                opencensus_proto: "io.opencensus:opencensus-proto:${opencensusProtoVersion}",

                // Test dependencies.
                guava_testlib: "com.google.guava:guava-testlib:${guavaVersion}",
                junit: 'junit:junit:4.12',
                mockito: 'org.mockito:mockito-core:1.9.5',
                spring_test: "org.springframework:spring-test:${springVersion}",
                truth: 'com.google.truth:truth:0.30',
                dropwizard: "io.dropwizard.metrics:metrics-core:${dropwizardVersion}",
        ]
    }

    configurations {
        compile {
            // Detect Maven Enforcer's dependencyConvergence failures. We only
            // care for artifacts used as libraries by others.
            if (!(project.name in ['benchmarks', 'opencensus-all',
                                   'opencensus-exporter-stats-stackdriver',
                                   'opencensus-exporter-trace-stackdriver',
                                   'opencensus-exporter-trace-jaeger'])) {
                resolutionStrategy.failOnVersionConflict()
            }
        }
    }

    dependencies {
        if (useCheckerFramework) {
            ext.checkerFrameworkVersion = '2.5.5'

            // 2.4.0 is the last version of the Checker Framework compiler that supports annotations
            // in comments, though it should continue to work with newer versions of the Checker Framework.
            // See
            // https://github.com/census-instrumentation/opencensus-java/pull/1112#issuecomment-381366366.
            ext.checkerFrameworkCompilerVersion = '2.4.0'

            ext.jdkVersion = 'jdk8'
            checkerFrameworkAnnotatedJDK "org.checkerframework:${jdkVersion}:${checkerFrameworkVersion}"
            checkerFrameworkJavac "org.checkerframework:compiler:${checkerFrameworkCompilerVersion}"
            compileOnly "org.checkerframework:checker:${checkerFrameworkVersion}"
            compile "org.checkerframework:checker-qual:${checkerFrameworkVersion}"
            compileOnly libraries.auto_value
        }

        compileOnly libraries.errorprone,
                    libraries.jsr305

        testCompile libraries.guava_testlib,
                libraries.junit,
                libraries.mockito,
                libraries.truth

    if (useErrorProne && JavaVersion.current().isJava8Compatible()) {
            // 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:${errorProneVersion}"
        }
    }

    findbugs {
        toolVersion = findBugsAnnotationsVersion
        ignoreFailures = false   // bug free or it doesn't ship!
        effort = 'max'
        reportLevel = 'low'      // low = sensitive to even minor mistakes
        omitVisitors = []        // bugs that we want to ignore
        excludeFilter = file("$rootDir/findbugs-exclude.xml")
    }
    // Generate html report for findbugs.
    findbugsMain {
        reports {
            xml.enabled = false
            html.enabled = true
        }
    }
    findbugsTest {
        reports {
            xml.enabled = false
            html.enabled = true
        }
    }
    findbugsJmh {
        reports {
            xml.enabled = false
            html.enabled = true
        }
    }

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

    // Disable checkstyle if no java8.
    checkstyleMain.enabled = JavaVersion.current().isJava8Compatible()
    checkstyleTest.enabled = JavaVersion.current().isJava8Compatible()
    checkstyleJmh.enabled = JavaVersion.current().isJava8Compatible()

    // Google formatter works only on java8.
    if (JavaVersion.current().isJava8Compatible()) {
        googleJavaFormat {
            toolVersion '1.6'
        }

        afterEvaluate {  // Allow subproject to add more source sets.
            tasks.googleJavaFormat {
                source = sourceSets*.allJava
                include '**/*.java'
            }

            tasks.verifyGoogleJavaFormat {
                source = sourceSets*.allJava
                include '**/*.java'
            }
        }
    }

    signing {
        required false
        sign configurations.archives
    }

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

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

    artifacts {
        archives javadocJar, sourcesJar
    }

    jmh {
        jmhVersion = '1.20'
        warmupIterations = 10
        iterations = 10
        fork = 1
        failOnError = true
        resultFormat = 'JSON'
        // Allow to run single benchmark class like:
        // ./gradlew -PjmhIncludeSingleClass=StatsTraceContextBenchmark clean :grpc-core:jmh
        if (project.hasProperty('jmhIncludeSingleClass')) {
            include = [
                    project.property('jmhIncludeSingleClass')
            ]
        }
    }

    jmhReport {
        jmhResultPath = project.file("${project.buildDir}/reports/jmh/results.json")
        jmhReportOutput = project.file("${project.buildDir}/reports/jmh")
    }

    tasks.jmh.finalizedBy tasks.jmhReport

    uploadArchives {
        repositories {
            mavenDeployer {
                beforeDeployment { MavenDeployment deployment -> signing.signPom(deployment) }

                def configureAuth = {
                    if (rootProject.hasProperty('ossrhUsername') && rootProject.hasProperty('ossrhPassword')) {
                        authentication(userName:rootProject.ossrhUsername, password: rootProject.ossrhPassword)
                    }
                }

                repository(url: "https://oss.sonatype.org/service/local/staging/deploy/maven2/", configureAuth)

                snapshotRepository(url: "https://oss.sonatype.org/content/repositories/snapshots/", configureAuth)

                pom.project {
                    name "OpenCensus"
                    packaging 'jar'
                    description project.description
                    url 'https://github.com/census-instrumentation/opencensus-java'

                    scm {
                        connection 'scm:svn:https://github.com/census-instrumentation/opencensus-java'
                        developerConnection 'scm:git:git@github.com/census-instrumentation/opencensus-java'
                        url 'https://github.com/census-instrumentation/opencensus-java'
                    }

                    licenses {
                        license {
                            name 'The Apache License, Version 2.0'
                            url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        }
                    }

                    developers {
                        developer {
                            id 'io.opencensus'
                            name 'OpenCensus Contributors'
                            email 'census-developers@googlegroups.com'
                            url 'opencensus.io'
                            // https://issues.gradle.org/browse/GRADLE-2719
                            organization = 'OpenCensus Authors'
                            organizationUrl 'https://www.opencensus.io'
                        }
                    }
                }
            }
        }
    }

    // Upload the following artifacts only:
    uploadArchives.onlyIf {
        name in ['opencensus-api',
                 'opencensus-contrib-agent',
                 'opencensus-contrib-appengine-standard-util',
                 'opencensus-contrib-dropwizard',
                 'opencensus-contrib-exemplar-util',
                 'opencensus-contrib-grpc-metrics',
                 'opencensus-contrib-grpc-util',
                 'opencensus-contrib-http-util',
                 'opencensus-contrib-log-correlation-stackdriver',
                 'opencensus-contrib-monitored-resource-util',
                 'opencensus-contrib-spring',
                 'opencensus-contrib-spring-sleuth-v1x',
                 'opencensus-contrib-zpages',
                 'opencensus-exporter-stats-prometheus',
                 'opencensus-exporter-stats-signalfx',
                 'opencensus-exporter-stats-stackdriver',
                 'opencensus-exporter-trace-instana',
                 'opencensus-exporter-trace-logging',
                 'opencensus-exporter-trace-ocagent',
                 'opencensus-exporter-trace-stackdriver',
                 'opencensus-exporter-trace-zipkin',
                 'opencensus-exporter-trace-jaeger',
                 'opencensus-impl-core',
                 'opencensus-impl-lite',
                 'opencensus-impl',
                 'opencensus-testing']
    }

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

    if (useCheckerFramework) {
        allprojects {
            tasks.withType(JavaCompile).all { JavaCompile compile ->
                compile.doFirst {
                    compile.options.compilerArgs += [
                        '-Xmaxerrs', '10000',
                        "-Xbootclasspath/p:${configurations.checkerFrameworkAnnotatedJDK.asPath}",
                        "-AskipDefs=\\.AutoValue_|^io.opencensus.contrib.appengine.standard.util.TraceIdProto\$|^io.opencensus.contrib.appengine.standard.util.TraceProto\$",
                        "-AinvariantArrays"
                    ]
                    options.fork = true
                    options.forkOptions.jvmArgs += ["-Xbootclasspath/p:${configurations.checkerFrameworkJavac.asPath}"]
                }
            }
        }
    }

    // For projects that depend on gRPC during test execution, make sure to
    // also configure ALPN if running on a platform (e.g. FreeBSD) that is not
    // supported by io.netty:netty-tcnative-boringssl-static:jar. Also see:
    // https://github.com/grpc/grpc-java/blob/master/SECURITY.md#tls-with-jdk-jetty-alpnnpn
    if (project.name in ['opencensus-exporter-stats-stackdriver',
                         'opencensus-exporter-trace-stackdriver']) {
        def os = org.gradle.internal.os.OperatingSystem.current()
        if (!os.isLinux() && !os.isWindows() && !os.isMacOsX()) {
            configurations {
                alpn
            }
            dependencies {
                alpn 'org.mortbay.jetty.alpn:jetty-alpn-agent:2.0.7'
            }
            test {
                jvmArgs "-javaagent:${configurations.alpn.asPath}"
            }
        }
    }
}
