plugins {
    // Provide convenience executables for trying out the examples.
    id 'application'
    // ASSUMES GRADLE 5.6 OR HIGHER. Use plugin version 0.8.10 with earlier gradle versions
    id 'com.google.protobuf' version '0.8.13'
    // Generate IntelliJ IDEA's .idea & .iml project files
    id 'idea'
}

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

sourceCompatibility = 1.7
targetCompatibility = 1.7

// IMPORTANT: You probably want the non-SNAPSHOT version of gRPC. Make sure you
// are looking at a tagged version of the example and not "master"!

// Feel free to delete the comment at the next line. It is just for safely
// updating the version in our release process.
def grpcVersion = '1.34.0-SNAPSHOT' // CURRENT_GRPC_VERSION
def protobufVersion = '3.12.0'
def protocVersion = protobufVersion

dependencies {
    implementation "io.grpc:grpc-protobuf:${grpcVersion}"
    implementation "io.grpc:grpc-stub:${grpcVersion}"
    compileOnly "org.apache.tomcat:annotations-api:6.0.53"

    // examples/advanced need this for JsonFormat
    implementation "com.google.protobuf:protobuf-java-util:${protobufVersion}"

    runtimeOnly "io.grpc:grpc-netty-shaded:${grpcVersion}"

    testImplementation "io.grpc:grpc-testing:${grpcVersion}"
    testImplementation "junit:junit:4.12"
    testImplementation "org.mockito:mockito-core:2.28.2"
}

protobuf {
    protoc { artifact = "com.google.protobuf:protoc:${protocVersion}" }
    plugins {
        grpc { artifact = "io.grpc:protoc-gen-grpc-java:${grpcVersion}" }
    }
    generateProtoTasks {
        all()*.plugins { grpc {} }
    }
}

// Inform IDEs like IntelliJ IDEA, Eclipse or NetBeans about the generated code.
sourceSets {
    main {
        java {
            srcDirs 'build/generated/source/proto/main/grpc'
            srcDirs 'build/generated/source/proto/main/java'
        }
    }
}

startScripts.enabled = false

task routeGuideServer(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.routeguide.RouteGuideServer'
    applicationName = 'route-guide-server'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

task routeGuideClient(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.routeguide.RouteGuideClient'
    applicationName = 'route-guide-client'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

task helloWorldServer(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.helloworld.HelloWorldServer'
    applicationName = 'hello-world-server'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

task helloWorldClient(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.helloworld.HelloWorldClient'
    applicationName = 'hello-world-client'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

task retryingHelloWorldServer(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.retrying.RetryingHelloWorldServer'
    applicationName = 'retrying-hello-world-server'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

task retryingHelloWorldClient(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.retrying.RetryingHelloWorldClient'
    applicationName = 'retrying-hello-world-client'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

task hedgingHelloWorldServer(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.hedging.HedgingHelloWorldServer'
    applicationName = 'hedging-hello-world-server'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

task hedgingHelloWorldClient(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.hedging.HedgingHelloWorldClient'
    applicationName = 'hedging-hello-world-client'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

task compressingHelloWorldClient(type: CreateStartScripts) {
    mainClassName = 'io.grpc.examples.experimental.CompressingHelloWorldClient'
    applicationName = 'compressing-hello-world-client'
    outputDir = new File(project.buildDir, 'tmp')
    classpath = startScripts.classpath
}

applicationDistribution.into('bin') {
    from(routeGuideServer)
    from(routeGuideClient)
    from(helloWorldServer)
    from(helloWorldClient)
    from(hedgingHelloWorldClient)
    from(hedgingHelloWorldServer)
    from(retryingHelloWorldClient)
    from(retryingHelloWorldServer)
    from(compressingHelloWorldClient)
    fileMode = 0755
}
