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 3.0.2 from libraries instead of 1.3.9
        exclude group: 'com.google.code.findbugs', module: 'jsr305'
        // prefer 20.0 from libraries instead of 19.0
        exclude group: 'com.google.guava', module: 'guava'
    }
    compileOnly libraries.javax_annotation
    runtime project(':grpc-grpclb')
    testCompile libraries.guava,
            libraries.guava_testlib,
            libraries.junit,
            libraries.mockito,
            libraries.truth
    testRuntime libraries.netty_tcnative,
            libraries.conscrypt
    signature 'org.codehaus.mojo.signature:java17:1.0@signature'
}

configureProtoCompilation()

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

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

artifacts {
    archives shadowJar
}

jar {
    // Must use a different classifier to avoid conflicting with shadowJar
    classifier = 'original'
}
configurations.archives.artifacts.removeAll { it.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'
}

[
    install.repositories.mavenInstaller,
    uploadArchives.repositories.mavenDeployer,
]*.pom*.whenConfigured { pom ->
    def netty = pom.dependencies.find {dep -> dep.artifactId == 'grpc-netty'}
    // Swap our dependency to grpc-netty-shaded. Projects depending on this via
    // project(':grpc-alts') will still be using the non-shaded form.
    netty.artifactId = "grpc-netty-shaded"
    // Depend on specific version of grpc-netty-shaded because it is unstable API
    netty.version = "[" + netty.version + "]"
}
