/*
 * 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: ":model:pipeline", configuration: "shadow")
  shadow project(path: ":runners:core-construction-java", configuration: "shadow")
  shadow project(path: ":runners:java-fn-execution", configuration: "shadow")
  shadow project(path: ":sdks:java:fn-execution", configuration: "shadow")
  shadow project(path: ":sdks:java:harness", configuration: "shadow")
  shadow library.java.vendored_grpc_1_13_1
  shadow library.java.slf4j_api
  shadowTest project(path: ":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
}
