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

// Set a specific version of 'com.google.apis:google-api-services-dataflow'
// by adding -Pdataflow.version=<version> in Gradle command. Otherwise,
// 'google_clients_version' defined in BeamModulePlugin will be used as default.
def DATAFLOW_VERSION = "dataflow.version"

// Get full dependency of 'com.google.apis:google-api-services-dataflow'
def google_api_services_dataflow = project.hasProperty(DATAFLOW_VERSION) ? "com.google.apis:google-api-services-dataflow:" + getProperty(DATAFLOW_VERSION) : library.java.google_api_services_dataflow

applyJavaNature(
  archivesBaseName: 'beam-runners-google-cloud-dataflow-java-fn-api-worker',
  publish: false,
  exportJavadoc: false,
  enableSpotbugs: true,
  validateShadowJar: false,
  shadowClosure: {
    // In the case of the Fn API worker jar we are creating an application so we rely on
    // the shadow plugin to include all transitive dependencies to create an uber jar.

    // Include original source files extracted under
    // '$buildDir/original_sources_to_package' to jar
    from "$buildDir/original_sources_to_package"

    exclude "META-INF/LICENSE.txt"
    exclude "about.html"
  },
)

/******************************************************************************/
// Configure the worker root project

configurations {
  sourceFile

  // Ban these dependencies from all configurations
  all {
    // Ban the usage of AppleJavaExtensions in spotbugs.
    exclude group: "com.apple", module: "AppleJavaExtensions"
  }
}

dependencies {
  // Note that any dependency that is modified here should also be modified within
  // runners/google-cloud-dataflow-java/worker/legacy-worker/build.gradle using the rules provided
  // there.
  //
  // All main sourceset dependencies here should be listed as compile scope so that the dependencies
  // are all packaged into a single uber jar allowing the jar to serve as an application.
  compile project(":runners:google-cloud-dataflow-java")
  compile project(path: ":sdks:java:core", configuration: "shadow")
  compile project(":sdks:java:extensions:google-cloud-platform-core")
  compile project(":sdks:java:io:google-cloud-platform")
  compile project(path: ":model:fn-execution", configuration: "shadow")
  compile project(path: ":model:pipeline", configuration: "shadow")
  compile project(":runners:core-construction-java")
  compile project(":runners:core-java")
  compile project(":runners:java-fn-execution")
  compile project(":sdks:java:fn-execution")
  compile project(path: ":runners:google-cloud-dataflow-java:worker:windmill", configuration: "shadow")
  compile library.java.vendored_grpc_1_21_0
  compile google_api_services_dataflow
  compile library.java.avro
  compile library.java.google_api_client
  compile library.java.google_http_client
  compile library.java.google_http_client_jackson
  compile library.java.jackson_annotations
  compile library.java.jackson_core
  compile library.java.jackson_databind
  compile library.java.joda_time
  shadow library.java.vendored_guava_26_0_jre
  compile library.java.slf4j_api
  compile "javax.servlet:javax.servlet-api:3.1.0"
  compile "org.conscrypt:conscrypt-openjdk:1.1.3:linux-x86_64"
  compile "org.eclipse.jetty:jetty-server:9.2.10.v20150310"
  compile "org.eclipse.jetty:jetty-servlet:9.2.10.v20150310"
  compile library.java.error_prone_annotations
  compile library.java.slf4j_jdk14

  // All test sourceset dependencies can be marked as shadowTest since we create an uber jar without
  // relocating any code.
  shadowTest project(path: ":runners:core-java", configuration: "testRuntime")
  shadowTest project(path: ":sdks:java:harness", configuration: "shadowTest")
  shadowTest project(path: ":sdks:java:core", configuration: "shadowTest")
  shadowTest project(path: ":sdks:java:extensions:google-cloud-platform-core", configuration: "testRuntime")
  shadowTest project(path: ":runners:direct-java", configuration: "shadow")
  shadowTest library.java.hamcrest_core
  shadowTest library.java.hamcrest_library
  shadowTest library.java.junit
  shadowTest library.java.mockito_core
}

//TODO(BEAM-5657): checktyle task should be enabled in the future.
checkstyleMain.enabled = false
checkstyleTest.enabled = false
//TODO(BEAM-5659): javadoc task should be enabled in the future.
javadoc.enabled = false
