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

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

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

dependencies {
  implementation platform(library.java.azure_sdk_bom)
  implementation library.java.commons_io
  permitUnusedDeclared library.java.commons_io // BEAM-11761
  implementation library.java.jackson_annotations
  implementation library.java.jackson_core
  implementation library.java.jackson_databind
  implementation library.java.slf4j_api
  implementation library.java.vendored_guava_32_1_2_jre
  implementation "com.azure:azure-core", excludeNetty
  implementation "com.azure:azure-identity", excludeNetty
  implementation "com.azure:azure-storage-blob", excludeNetty
  implementation "com.azure:azure-storage-common", excludeNetty
  implementation "com.microsoft.azure:azure-storage:8.6.5"
  implementation project(path: ":sdks:java:core", configuration: "shadow")
  runtimeOnly library.java.netty_all // force version of netty used by Beam

  testImplementation project(path: ":sdks:java:core", configuration: "shadowTest")
  testImplementation library.java.mockito_core
  testImplementation library.java.junit
  testRuntimeOnly library.java.slf4j_jdk14
}
