/*
 * 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,
  classesTriggerCheckerBugs: [
    'BatchGroupAlsoByWindowAndCombineFn': 'TODO: file a bug report',
    'AssignWindowsParDoFnFactory': 'TODO: file a bug report',
  ],
  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 enforcedPlatform(library.java.google_cloud_platform_libraries_bom)
  permitUnusedDeclared enforcedPlatform(library.java.google_cloud_platform_libraries_bom)
  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_26_0
  compile google_api_services_dataflow
  compile library.java.avro
  compile library.java.google_api_client
  permitUnusedDeclared library.java.google_api_client // BEAM-11761
  compile library.java.google_auth_library_credentials
  compile library.java.google_http_client
  compile library.java.google_http_client_jackson2
  compile library.java.guava
  compile library.java.jackson_annotations
  compile library.java.jackson_core
  compile library.java.jackson_databind
  compile library.java.joda_time
  compile library.java.proto_google_common_protos
  shadow library.java.vendored_guava_26_0_jre
  compile library.java.slf4j_api
  compile "io.opencensus:opencensus-api:0.28.0"
  compile "javax.servlet:javax.servlet-api:3.1.0"

  // Conscrypt shouldn't be included here because Conscrypt won't work when being shaded.
  // (Context: https://github.com/apache/beam/pull/13846)
  // Conscrypt will be added to runtime dependencies by GrpcVendoring so compileOnly works for now.
  compileOnly "org.conscrypt:conscrypt-openjdk-uber:2.5.1"

  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
  permitUnusedDeclared library.java.error_prone_annotations // BEAM-11761
  compile library.java.slf4j_jdk14
  permitUnusedDeclared library.java.slf4j_jdk14 // BEAM-11761

  // 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.jsonassert
  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
