/*
 * 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'
  id 'application'
}
// we need to set mainClassName before applying shadow plugin
mainClassName = "org.apache.beam.runners.direct.portable.job.ReferenceRunnerJobServer"

applyJavaNature(
  exportJavadoc: false,
  validateShadowJar: false,
  shadowClosure: {
  }
)

description = "Apache Beam :: Runners :: Reference :: Job Server"

dependencies {
  compile project(path: ":runners:direct-java", configuration: "shadow")
  compile project(path: ":runners:java-fn-execution", configuration: "shadow")
  compile library.java.slf4j_simple
}

run {
  args = []
  if (project.hasProperty('port'))
    args += ["--port=${project.property('port')}"]

  // Enable remote debugging.
  jvmArgs = ["-Xdebug", "-Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=5005"]
  if (project.hasProperty("logLevel"))
    jvmArgs += ["-Dorg.slf4j.simpleLogger.defaultLogLevel=${project.property('logLevel')}"]
  if (project.hasProperty("vendorLogLevel")) {
    jvmArgs += ["-Dorg.slf4j.simpleLogger.log.org.apache.beam.vendor=${project.property('vendorLogLevel')}"]
  } else {
    jvmArgs += ["-Dorg.slf4j.simpleLogger.log.org.apache.beam.vendor=info"]
  }
}
