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

description = "Apache Beam :: Runners :: Reference :: Java"
ext.summary = """A Java implementation of the Beam Model which utilizes the portability
framework to execute user-definied functions."""


configurations {
  validatesRunner
}

dependencies {
  shadow library.java.vendored_guava_20_0
  compile library.java.hamcrest_library
  shadow project(path: ":beam-model-pipeline", configuration: "shadow")
  shadow project(path: ":beam-runners-core-construction-java", configuration: "shadow")
  shadow project(path: ":beam-runners-java-fn-execution", configuration: "shadow")
  shadow project(path: ":beam-sdks-java-fn-execution", configuration: "shadow")
  shadow project(path: ":beam-sdks-java-harness", configuration: "shadow")
  shadow library.java.vendored_grpc_1_13_1
  shadow library.java.slf4j_api
  shadowTest project(path: ":beam-runners-core-construction-java", configuration: "shadowTest")
  shadowTest library.java.guava
  shadowTest library.java.hamcrest_core
  shadowTest library.java.junit
  shadowTest library.java.mockito_core
  shadowTest library.java.slf4j_jdk14
}
