buildscript {
    repositories { jcenter() }
    dependencies { classpath 'com.github.jengelman.gradle.plugins:shadow:2.0.4' }
}

apply plugin: 'com.github.johnrengelman.shadow'

description = "gRPC: ALTS"

sourceCompatibility = 1.7
targetCompatibility = 1.7

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

dependencies {
    compile project(':grpc-auth'),
            project(':grpc-core'),
            project(':grpc-netty'),
            project(':grpc-protobuf'),
            project(':grpc-stub'),
            libraries.lang,
            libraries.protobuf
    compile (libraries.google_auth_oauth2_http) {
        // prefer 26.0-android from libraries instead of 25.1-android
        exclude group: 'com.google.guava', module: 'guava'
        // prefer 0.19.2 from libraries instead of 0.18.0
        exclude group: 'io.opencensus', module: 'opencensus-api'
    }
    compileOnly libraries.javax_annotation
    runtime project(':grpc-grpclb')
    testCompile project(':grpc-testing'),
            project(':grpc-testing-proto'),
            libraries.guava,
            libraries.guava_testlib,
            libraries.junit,
            libraries.mockito,
            libraries.truth
    testRuntime libraries.netty_tcnative,
            libraries.netty_epoll,
            libraries.conscrypt
    signature 'org.codehaus.mojo.signature:java17:1.0@signature'
}

configureProtoCompilation()

import net.ltgt.gradle.errorprone.CheckSeverity

[compileJava, compileTestJava].each() {
    // protobuf calls valueof. Will be fixed in next release (google/protobuf#4046)
    it.options.compilerArgs += [
        "-Xlint:-deprecation"
    ]
    // ALTS returns a lot of futures that we mostly don't care about.
    it.options.errorprone.check("FutureReturnValueIgnored", CheckSeverity.OFF)
}

javadoc { exclude 'io/grpc/alts/internal/**' }

jar {
    // Must use a different classifier to avoid conflicting with shadowJar
    classifier = 'original'
}

// We want to use grpc-netty-shaded instead of grpc-netty. But we also want our
// source to work with Bazel, so we rewrite the code as part of the build.
shadowJar {
    classifier = null
    dependencies {
        exclude(dependency {true})
    }
    relocate 'io.grpc.netty', 'io.grpc.netty.shaded.io.grpc.netty'
    relocate 'io.netty', 'io.grpc.netty.shaded.io.netty'
}

publishing {
    publications {
        maven(MavenPublication) {
            // use shadowJar and remove the original Jar
            artifact shadowJar
            def originalJar = artifacts.find { dep -> dep.classifier == 'original'}
            artifacts.remove(originalJar)

            pom.withXml {
                // Swap our dependency to grpc-netty-shaded. Projects depending on this via
                // project(':grpc-alts') will still be using the non-shaded form.
                asNode().dependencies.'*'.findAll() { dep ->
                    dep.artifactId.text() == 'grpc-netty'
                }.each() { netty ->
                    netty.artifactId*.value = 'grpc-netty-shaded'
                    netty.version*.value = "[" + netty.version.text() + "]"
                }
            }
        }
    }
}
