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'
        log4j2Version = '2.11.1'
        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}",
                log4j2: "org.apache.logging.log4j:log4j-core:${log4j2Version}",
                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-log4j2',
                 '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}"
            }
        }
    }
}
