/*
 * 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(":sdks:java:extensions:sql:jdbc")
  permitUnusedDeclared project(":sdks:java:extensions:sql:jdbc")

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

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
}
