/*
 * 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()
provideIntegrationTestingDependencies()
enableJavaPerformanceTesting()


description = "Apache Beam :: SDKs :: Java :: IO :: HBase"
ext.summary = "Library to read and write from/to HBase"

test {
  systemProperty "log4j.configuration", "log4j-test.properties"
  jvmArgs "-XX:-UseGCOverheadLimit"
  if (System.getProperty("beamSurefireArgline")) {
    jvmArgs System.getProperty("beamSurefireArgline")
  }
  jvmArgs "-Dtest.build.data.basedirectory=build/test-data"
}

def hbase_version = "1.2.6"

dependencies {
  shadow library.java.vendored_guava_20_0
  shadow project(path: ":sdks:java:core", configuration: "shadow")
  shadow project(path: ":sdks:java:io:hadoop-common", configuration: "shadow")
  shadow library.java.slf4j_api
  shadow "org.apache.hbase:hbase-shaded-client:$hbase_version"
  testCompile project(path: ":sdks:java:io:common", configuration: "shadowTest")
  testCompile project(path: ":sdks:java:core", configuration: "shadowTest")
  testCompile library.java.commons_lang3
  testCompile library.java.junit
  testCompile library.java.hamcrest_core
  testCompile library.java.hamcrest_library
  testCompile library.java.hadoop_minicluster
  testCompile library.java.hadoop_hdfs
  testCompile library.java.hadoop_common
  testCompile "org.apache.hbase:hbase-shaded-server:$hbase_version"
  testCompile("org.apache.hbase:hbase-server:$hbase_version:tests") {
    // We prevent bringing in unshaded dependencies to not conflict
    // with hbase-shaded-server and hbase-shaded-client
    transitive = false
  }
  testCompile("org.apache.hbase:hbase-common:$hbase_version:tests") {
    // We prevent bringing in unshaded dependencies to not conflict
    // with hbase-shaded-server and hbase-shaded-client
    transitive = false
  }
  testCompile "org.apache.hbase:hbase-hadoop-compat:$hbase_version:tests"
  testCompile "org.apache.hbase:hbase-hadoop2-compat:$hbase_version:tests"
  testRuntimeOnly project(path: ":runners:direct-java")
}

