/*
 * 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(
  enableChecker: false,
  ignoreRawtypeErrors: true,
  automaticModuleName: 'org.apache.beam.fn.harness',
  validateShadowJar: false,
  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)
  }
  compile library.java.jackson_databind
  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_26_0
  provided library.java.error_prone_annotations
  testCompile library.java.hamcrest_core
  testCompile library.java.hamcrest_library
  testCompile library.java.junit
  testCompile library.java.mockito_core
  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
  testCompile project(":runners:core-construction-java")
  shadowTestRuntimeClasspath library.java.slf4j_jdk14
}
