/*
 * 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 dependOnProjects = [":model:pipeline", ":model:fn-execution", ":sdks:java:core",
                        ":sdks:java:fn-execution",
                        ":sdks:java:extensions:google-cloud-platform-core",
                        ":runners:core-java", ":runners:core-construction-java"]

applyJavaNature(
  validateShadowJar: false,
  testShadowJar: true,
  shadowClosure: DEFAULT_SHADOW_CLOSURE <<
  // 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 {
  dependOnProjects.each {
    compile project(path: it, configuration: "shadow")
  }
  compile library.java.jackson_databind
  shadow library.java.vendored_guava_20_0
  shadowTest library.java.powermock
  compile library.java.joda_time
  compile library.java.slf4j_api
  compile library.java.vendored_grpc_1_13_1
  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
}
