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

// Do not relocate guava to avoid issues with Cassandra's version.
applyJavaNature(
    shadowClosure: {
      dependencies {
        // is default, but when omitted the default action is to include all runtime deps
        include(dependency(project.library.java.guava))

        // hack: now exclude the only thing that was included
        exclude(dependency(project.library.java.guava))

      }
    },
    shadowJarValidationExcludes: [
        "org/apache/beam/**",
        "com/google/common/**",
        "com/google/thirdparty/**"
    ]
)
provideIntegrationTestingDependencies()
enableJavaPerformanceTesting()

description = "Apache Beam :: SDKs :: Java :: IO :: Cassandra"
ext.summary = "IO to read and write with Apache Cassandra database"

// compatible with all Cassandra versions up to 3.11.3
def achilles_version = "6.0.2"

dependencies {
  shadow library.java.vendored_guava_20_0
  shadow project(path: ":sdks:java:core", configuration: "shadow")
  shadow library.java.slf4j_api
  shadow library.java.cassandra_driver_core
  shadow library.java.cassandra_driver_mapping
  testCompile project(path: ":sdks:java:io:common", configuration: "shadowTest")
  testCompile library.java.junit
  testCompile library.java.hamcrest_core
  testCompile library.java.hamcrest_library
  testCompile library.java.mockito_core

  // for embedded cassandra
  testCompile group: 'info.archinnov', name: 'achilles-junit', version: "$achilles_version"
  testCompile library.java.jackson_jaxb_annotations
  testRuntimeOnly library.java.slf4j_jdk14
  testRuntimeOnly project(path: ":runners:direct-java")
}
