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

// We specifically enumerate all the projects that we depend on since
// the list is used in both defining the included set for the uber jar
// and also the set of project level dependencies.
def dependOnShadedProjects = [":model:pipeline", ":model:fn-execution", ":sdks:java:core"]
def dependOnProjects = [":sdks:java:fn-execution",
                        ":sdks:java:extensions:google-cloud-platform-core",
                        ":runners:core-java", ":runners:core-construction-java"]

applyJavaNature(
  classesTriggerCheckerBugs: [
    'AssignWindowsRunner': 'https://github.com/typetools/checker-framework/issues/3794',
    'WindowMergingFnRunner': 'https://github.com/typetools/checker-framework/issues/3794',
  ],
  automaticModuleName: 'org.apache.beam.fn.harness',
  validateShadowJar: false,
  enableJmh: true,
  testShadowJar: true,
  shadowClosure:
  // Create an uber jar without repackaging for the SDK harness
  // TODO: We have been releasing this in the past, consider not
  // releasing it since its typically bad practice to release 'all'
  // jars.
  {
    dependencies {
      // Directly include all projects depended on
      dependOnProjects.each {
        include(project(path: it, configuration: "shadow"))
      }
      // Include all dependencies and transitive dependencies
      include(dependency(".*:.*"))
    }
  },
)

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

dependencies {
  dependOnShadedProjects.each {
    compile project(path: it, configuration: "shadow")
  }
  dependOnProjects.each {
    compile project(it)
  }
  shadow library.java.vendored_guava_26_0_jre
  shadowTest library.java.powermock
  shadowTest library.java.powermock_mockito
  compile library.java.joda_time
  compile library.java.slf4j_api
  compile library.java.vendored_grpc_1_36_0
  testCompile library.java.junit
  testCompile library.java.mockito_core
  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
  testCompile project(":runners:core-construction-java")
  testCompile project(path: ":sdks:java:fn-execution", configuration: "testRuntime")
  shadowTestRuntimeClasspath library.java.slf4j_jdk14
  jmhCompile project(path: ":sdks:java:harness", configuration: "shadowTest")
  jmhRuntime library.java.slf4j_jdk14
}
