/*
 * 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' }

configurations {
  provided
}

dependencies {
  // provided dependencies are declared early so they can be resolved in shadowClosure
  provided enforcedPlatform(library.java.google_cloud_platform_libraries_bom)

  // :sdks:java:core and transitive dependencies
  provided project(path: ":model:pipeline", configuration: "shadow")
  provided project(path: ":sdks:java:core", configuration: "shadow")
  provided project(path: ":sdks:java:transform-service:launcher")
  provided library.java.avro
  provided library.java.jackson_databind
  provided library.java.joda_time
  provided library.java.slf4j_api
  provided library.java.hamcrest
  provided library.java.vendored_grpc_1_69_0
  provided library.java.vendored_guava_32_1_2_jre

  provided library.java.jamm
}

applyJavaNature(
  classesTriggerCheckerBugs: [
    'AssignWindowsRunner': 'https://github.com/typetools/checker-framework/issues/3794',
    'WindowMergingFnRunner': 'https://github.com/typetools/checker-framework/issues/3794',
    'FnApiDoFnRunner': 'https://github.com/typetools/checker-framework/issues/5436',
  ],
  automaticModuleName: 'org.apache.beam.fn.harness',
  testShadowJar: true,
  shadowJarValidationExcludes: [
    "org/apache/beam/fn/harness/**",
    "org/apache/beam/runners/core/**",
    "org/apache/beam/sdk/fn/**",
  ],
  shadowClosure:
  {
    dependencies {
      // Exclude provided and transient dependencies
      project.configurations.provided.getResolvedConfiguration()
          .getLenientConfiguration().getAllModuleDependencies().each {
        exclude(dependency(it.getModuleGroup() + ":" + it.getModuleName() + ":.*"))
      }
    }
  },
)

description = "Apache Beam :: SDKs :: Java :: Harness"
ext.summary = "This contains the SDK Fn Harness for Beam Java"

dependencies {
  implementation enforcedPlatform(library.java.google_cloud_platform_libraries_bom)
  implementation project(path: ":model:fn-execution", configuration: "shadow")
  implementation project(path: ":sdks:java:core", configuration: "shadow")
  implementation project(":runners:core-java")
  permitUnusedDeclared project(path: ":sdks:java:transform-service:launcher")
  testImplementation library.java.junit
  testImplementation library.java.mockito_core
  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
  shadowTestRuntimeClasspath library.java.slf4j_jdk14
  permitUnusedDeclared library.java.avro
  permitUnusedDeclared library.java.hamcrest
}
