/*
 * 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(
  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_21_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")
  shadowTestRuntimeClasspath library.java.slf4j_jdk14
}
