/*
 * 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'
}

dependencies {
  compile project(path: ":sdks:java:extensions:sql:jdbc", configuration: "shadow")
  permitUnusedDeclared project(path: ":sdks:java:extensions:sql:jdbc", configuration: "shadow")

  if (project.hasProperty("beam.sql.shell.bundled")) {
    project.getProperty("beam.sql.shell.bundled").tokenize(",").each {
      subproject ->
          compile project(path: subproject, configuration: "shadow")
          permitUnusedDeclared project(path: subproject, configuration: "shadow")
    }
  }
}

processResources {
  filter org.apache.tools.ant.filters.ReplaceTokens, tokens: [
          'beam.version': version,
  ]
}

mainClassName = "org.apache.beam.sdk.extensions.sql.jdbc.BeamSqlLine"

/**
 * Gradle console will interfere with SQL shell, so to run this command
 * we need to configure it:
 *  - disable daemon with '--no-daemon';
 *  - decrease verbosity with '--console plain';
 *  - quiet it with '-q';
 *
 * So, correct gradle invocation to start the SQL shell
 * looks something like this:
 *
 *   ./gradlew :sdks:java:extensions:sql:shell:run --console plain -q --no-daemon
 */
run {
  standardInput System.in
}
