/*
 * 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.jms',
)
provideIntegrationTestingDependencies()
enableJavaPerformanceTesting()

description = "Apache Beam :: SDKs :: Java :: IO :: JMS"
ext.summary = """IO to read and write to JMS (Java Messaging Service)
destinations (queues and topics)."""

dependencies {
  implementation library.java.vendored_guava_32_1_2_jre
  implementation project(path: ":sdks:java:core", configuration: "shadow")
  implementation library.java.slf4j_api
  implementation library.java.joda_time
  implementation "org.apache.geronimo.specs:geronimo-jms_2.0_spec:1.0-alpha-2"
  // Don't put proprietary licensed ibm mq client into runtimeClasspath
  // (affects expansion service shadow jar)
  compileOnly("com.ibm.mq:com.ibm.mq.allclient:9.3.0.25") {
    // duplicating geronimo-jms_2.0_spec
    exclude group: "javax.jms", module: "javax.jms-api"
  }
  testImplementation library.java.activemq_amqp
  testImplementation library.java.activemq_broker
  testImplementation library.java.activemq_jaas
  testImplementation library.java.activemq_kahadb_store
  testImplementation library.java.activemq_client
  testImplementation library.java.hamcrest
  testImplementation library.java.junit
  testImplementation library.java.mockito_core
  testImplementation library.java.mockito_inline
  testImplementation library.java.qpid_jms_client
  testImplementation project(path: ":sdks:java:io:common")
  testImplementation project(path: ":sdks:java:testing:test-utils")
  testRuntimeOnly library.java.slf4j_jdk14
  testRuntimeOnly project(path: ":runners:direct-java", configuration: "shadow")
}
