/*
 * 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(shadowClosure: DEFAULT_SHADOW_CLOSURE << {
  dependencies {
    include(dependency(library.java.protobuf_java))
    include(dependency(library.java.byte_buddy))
    include(dependency("org.apache.commons:.*"))
    include(dependency(library.java.antlr_runtime))
  }
  relocate "com.google.thirdparty", getJavaRelocatedPath("com.google.thirdparty")
  relocate "com.google.protobuf", getJavaRelocatedPath("com.google.protobuf")
  relocate "net.bytebuddy", getJavaRelocatedPath("net.bytebuddy")
  relocate "org.apache.commons", getJavaRelocatedPath("org.apache.commons")
  relocate "org.antlr.v4", getJavaRelocatedPath("org.antlr.v4")
})
applyAvroNature()
applyAntlrNature()

generateGrammarSource {
  arguments += ["-visitor"]
}

description = "Apache Beam :: SDKs :: Java :: Core"
ext.summary = """Beam SDK Java All provides a simple, Java-based
interface for processing virtually any size data. This
artifact includes entire Apache Beam Java SDK."""

processResources {
  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
    'pom.version': version,
    'timestamp': new Date().format("yyyy-MM-dd HH:mm")
  ]
}

// Exclude tests that need a runner
test {
  systemProperty "beamUseDummyRunner", "true"
  useJUnit {
    excludeCategories "org.apache.beam.sdk.testing.NeedsRunner"
  }
}

dependencies {
  antlr library.java.antlr
  // Required to load constants from the model, e.g. max timestamp for global window
  shadow project(path: ":model:pipeline", configuration: "shadow")
  shadow project(path: ":model:job-management", configuration: "shadow")
  shadow library.java.vendored_guava_20_0
  compile library.java.antlr_runtime
  compile library.java.protobuf_java
  compile library.java.byte_buddy
  compile library.java.commons_compress
  compile library.java.commons_lang3
  compile library.java.guava_testlib
  shadow library.java.jackson_core
  shadow library.java.jackson_annotations
  shadow library.java.jackson_databind
  shadow library.java.slf4j_api
  shadow library.java.avro
  shadow library.java.snappy_java
  shadow library.java.joda_time
  shadow "org.tukaani:xz:1.8"
  provided library.java.junit
  provided library.java.hamcrest_core
  provided library.java.hamcrest_library
  shadowTest library.java.jackson_dataformat_yaml
  shadowTest library.java.guava_testlib
  shadowTest library.java.mockito_core
  shadowTest library.java.hamcrest_core
  shadowTest library.java.hamcrest_library
  shadowTest "com.esotericsoftware.kryo:kryo:2.21"
  shadowTest library.java.quickcheck_core
  shadowTest library.java.avro_tests
  shadowTest library.java.zstd_jni
  testRuntimeOnly library.java.slf4j_jdk14
}
