/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * License); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an AS IS BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

plugins { id 'org.apache.beam.module' }
applyJavaNature(
    publish: false,
    archivesBaseName: 'beam-sdks-java-watermark-latency',
    exportJavadoc: false
)

description = "Apache Beam :: SDKs :: Java :: Watermark Latency Benchmark"


def mainClassProperty = "loadTest.mainClass"
def mainClass = project.findProperty(mainClassProperty)

// When running via Gradle, this property can be used to pass commandline arguments
// to the load-tests launch
def loadTestArgsProperty = "loadTest.args"

// When running via Gradle, this property sets the runner dependency
def runnerProperty = "runner"
def runnerDependency = (project.hasProperty(runnerProperty)
        ? project.getProperty(runnerProperty)
        : ":runners:direct-java")
def isSparkRunner = runnerDependency.startsWith(":runners:spark:")
def gtFlink20 = runnerDependency.startsWith(":runners:flink:") && {
  def version = runnerDependency.substring(":runners:flink:".length())
  try {
    def parts = version.split('\\.')
    def major = parts[0].toInteger()
    def minor = parts.length > 1 ? parts[1].toInteger() : 0
    return (major == 2 && minor > 0)
  } catch (Exception e) {
    return false
  }
}()
def isDataflowRunner = ":runners:google-cloud-dataflow-java".equals(runnerDependency)
def runnerConfiguration = ":runners:direct-java".equals(runnerDependency) ? "shadow" : null

if (isDataflowRunner) {
  /*
   * We need to rely on manually specifying these evaluationDependsOn to ensure that
   * the following projects are evaluated before we evaluate this project. This is because
   * we are attempting to reference a property from the project directly.
   */
  evaluationDependsOn(":runners:google-cloud-dataflow-java:worker")
}

configurations {
  // A configuration for running the Load testlauncher directly from Gradle, which
  // uses Gradle to put the appropriate dependencies on the Classpath rather than
  // bundling them into a fat jar
  gradleRun
}

dependencies {
  implementation library.java.joda_time
  runtimeOnly library.java.kafka_clients
  implementation library.java.slf4j_api

  implementation project(path: ":sdks:java:core", configuration: "shadow")
  runtimeOnly project(path: ":runners:direct-java", configuration: "shadow")
  runtimeOnly project(":sdks:java:io:synthetic")
  runtimeOnly project(":sdks:java:testing:test-utils")
  runtimeOnly project(":sdks:java:io:google-cloud-platform")
  runtimeOnly project(":sdks:java:io:kafka")

  gradleRun project(project.path)
  gradleRun project(path: runnerDependency, configuration: runnerConfiguration)
}

if (!gtFlink20) {
  resolveCapabilitiesConflict(configurations.gradleRun, 'org.lz4:lz4-java', 'at.yawk.lz4')
}

if (isSparkRunner) {
  configurations.gradleRun {
    // Using Spark runner causes a StackOverflowError if slf4j-jdk14 is on the classpath
    exclude group: "org.slf4j", module: "slf4j-jdk14"
  }
  resolveCapabilitiesConflict(configurations.gradleRun, 'org.lz4:lz4-java', 'at.yawk.lz4')
}

task run(type: JavaExec) {
  def loadTestArgs = project.findProperty(loadTestArgsProperty) ?: ""

  if (isDataflowRunner) {
    dependsOn ":runners:google-cloud-dataflow-java:worker:shadowJar"

    def dataflowWorkerJar = project.findProperty('dataflowWorkerJar') ?: project(":runners:google-cloud-dataflow-java:worker").shadowJar.archivePath
    // Provide job with a customizable worker jar.
    // With legacy worker jar, containerImage is set to empty (i.e. to use the internal build).
    // More context and discussions can be found in PR#6694.
    loadTestArgs = loadTestArgs +
            " --dataflowWorkerJar=${dataflowWorkerJar} " +
            " --workerHarnessContainerImage="
  }

  mainClass = mainClass
  classpath = configurations.gradleRun
  args loadTestArgs.split()
}

