/*
 * 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.
 */

import groovy.json.JsonOutput

plugins {
  id 'java'
  id 'org.apache.beam.module'
  id 'com.gradleup.shadow'
}

applyJavaNature(
  exportJavadoc: false,
  automaticModuleName: 'org.apache.beam.examples',
)
provideIntegrationTestingDependencies()
enableJavaPerformanceTesting()

description = "Apache Beam :: Examples :: Java"
ext.summary = """Apache Beam SDK provides a simple, Java-based
interface for processing virtually any size data. This
artifact includes all Apache Beam Java SDK examples."""

apply from: "$projectDir/common.gradle"

dependencies {
  implementation enforcedPlatform(library.java.google_cloud_platform_libraries_bom)
  implementation library.java.vendored_guava_32_1_2_jre
  if (project.findProperty('testJavaVersion') == '21' || JavaVersion.current().compareTo(JavaVersion.VERSION_21) >= 0) {
    // this dependency is a provided dependency for kafka-avro-serializer. It is not needed to compile with Java<=17
    // but needed for compile only under Java21, specifically, required for extending from AbstractKafkaAvroDeserializer
    compileOnly library.java.kafka
    permitUnusedDeclared library.java.kafka
  }
  implementation library.java.kafka_clients
  implementation project(path: ":sdks:java:core", configuration: "shadow")
  implementation project(":sdks:java:extensions:avro")
  implementation project(":sdks:java:extensions:google-cloud-platform-core")
  implementation project(":sdks:java:extensions:python")
  implementation project(":sdks:java:io:components")
  implementation project(":sdks:java:io:google-cloud-platform")
  implementation project(":sdks:java:io:kafka")
  implementation project(":sdks:java:extensions:ml")
  implementation library.java.avro
  implementation library.java.bigdataoss_util
  implementation library.java.google_api_client
  implementation library.java.google_api_services_bigquery
  implementation library.java.google_api_services_pubsub
  implementation library.java.google_auth_library_credentials
  implementation library.java.google_auth_library_oauth2_http
  implementation library.java.google_cloud_datastore_v1_proto_client
  implementation library.java.google_code_gson
  implementation library.java.google_http_client
  implementation library.java.google_oauth_client
  implementation library.java.jackson_databind
  implementation library.java.joda_time
  implementation library.java.protobuf_java
  implementation library.java.proto_google_cloud_bigtable_v2
  implementation library.java.proto_google_cloud_datastore_v1
  implementation library.java.slf4j_api
  implementation library.java.commons_io
  implementation library.java.commons_csv
  runtimeOnly project(path: ":runners:direct-java", configuration: "shadow")
  implementation library.java.vendored_grpc_1_69_0
  implementation library.java.vendored_guava_32_1_2_jre
  implementation "com.google.api.grpc:proto-google-cloud-language-v1:1.81.4"
  implementation ("io.confluent:kafka-avro-serializer:5.3.2") {
    // It depends on "spotbugs-annotations:3.1.9" which clashes with current
    // "spotbugs-annotations:3.1.12" used in Beam. Not required.
    exclude group: "org.apache.zookeeper", module: "zookeeper"
  }
  implementation "org.apache.commons:commons-lang3:3.9"
  implementation "org.apache.httpcomponents:httpclient:4.5.13"
  implementation "org.apache.httpcomponents:httpcore:4.4.13"
  implementation "com.fasterxml.jackson.core:jackson-annotations:2.14.1"
  implementation "com.fasterxml.jackson.core:jackson-core:2.14.1"
  runtimeOnly library.java.hadoop_client
  runtimeOnly library.java.bigdataoss_gcs_connector
  testImplementation project(path: ":runners:direct-java", configuration: "shadow")
  testImplementation project(":sdks:java:io:google-cloud-platform")
  testImplementation project(":sdks:java:extensions:ml")
  testImplementation library.java.google_cloud_bigquery
  testImplementation library.java.hamcrest
  testImplementation library.java.junit
  testImplementation library.java.mockito_core
  testImplementation library.java.testcontainers_kafka
  testImplementation library.java.testcontainers_gcloud

  // Add dependencies for the PreCommit configurations
  // For each runner a project level dependency on the examples project.
  for (String runner : preCommitRunners) {
    delegate.add(runner + "PreCommit", project(path: ":examples:java", configuration: "testRuntimeMigration"))
  }

  // Add dependency if requested on command line for runner
  if (project.hasProperty("runnerDependency")) {
    runtimeOnly project(path: project.getProperty("runnerDependency"))
  }
}

/*
 * Create a ${runner}PreCommit task for each runner which runs a set
 * of integration tests for WordCount and WindowedWordCount.
 */
def preCommitRunnerClass = [
  directRunner: "org.apache.beam.runners.direct.DirectRunner",
  flinkRunner: "org.apache.beam.runners.flink.TestFlinkRunner",
  sparkRunner: "org.apache.beam.runners.spark.TestSparkRunner",
]
def gcpProject = project.findProperty('gcpProject') ?: 'apache-beam-testing'
def gcsTempRoot = project.findProperty('gcsTempRoot') ?: 'gs://temp-storage-for-end-to-end-tests/'

for (String runner : preCommitRunners) {
  tasks.create(name: runner + "PreCommit", type: Test) {
    def preCommitBeamTestPipelineOptions = [
       "--project=${gcpProject}",
       "--tempRoot=${gcsTempRoot}",
       "--runner=" + preCommitRunnerClass[runner],
    ]
    classpath = configurations."${runner}PreCommit"
    include "**/WordCountIT.class"
    if (!"sparkRunner".equals(runner)) {
      include "**/WindowedWordCountIT.class"
    }
    forkEvery 1
    maxParallelForks 4
    systemProperty "beamTestPipelineOptions", JsonOutput.toJson(preCommitBeamTestPipelineOptions)
  }
}

/* Define a common precommit task which depends on all the individual precommits. */
task preCommit() {
  for (String runner : preCommitRunners) {
    dependsOn runner + "PreCommit"
  }
}

// Run this task to validate the Java environment setup for contributors
task wordCount(type:JavaExec) {
  description "Run the Java word count example"
  mainClass = "org.apache.beam.examples.WordCount"
  classpath = sourceSets.main.runtimeClasspath
  systemProperties = System.getProperties()
  args = ["--output=/tmp/output.txt"]
}
