/*
 * 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")
}

applyJavaNature(automaticModuleName: "org.apache.beam.sdk.io.azure.cosmos")

description = "Apache Beam :: SDKs :: Java :: IO :: Azure Cosmos DB"
ext.summary = "IO library to read and write Azure Cosmos DB"

def excludeNetty = {
  exclude group: "io.netty", module: "*" // exclude more recent Netty version
}

dependencies {
  implementation platform(library.java.azure_sdk_bom)
  implementation "com.azure:azure-cosmos", excludeNetty
  implementation "com.azure:azure-core", excludeNetty
  permitUnusedDeclared library.java.commons_io // BEAM-11761
  implementation library.java.jackson_annotations
  implementation library.java.jackson_databind
  implementation library.java.vendored_guava_32_1_2_jre
  implementation "io.projectreactor:reactor-core:3.4.29"
  implementation project(path: ":sdks:java:core", configuration: "shadow")
  implementation project(path: ":sdks:java:io:azure")
  runtimeOnly library.java.netty_all // force version of netty used by Beam

  testImplementation library.java.junit
  testImplementation library.java.testcontainers_azure
  testImplementation project(path: ":sdks:java:core", configuration: "shadowTest")
  testRuntimeOnly library.java.slf4j_jdk14
  testRuntimeOnly project(path: ":runners:direct-java", configuration: "shadow")
}
