/*
 * 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.
 */

include \
  'samza-api',
  'samza-sql',
  'samza-shell'

def scalaModules = [
        'samza-aws',
        'samza-azure',
        'samza-core',
        'samza-elasticsearch',
        'samza-hdfs',
        'samza-kafka',
        'samza-kv',
        'samza-kv-inmemory',
        'samza-kv-rocksdb',
        'samza-kv-couchbase',
        'samza-log4j',
        'samza-log4j2',
        'samza-rest',
        'samza-sql',
        'samza-sql-shell',
        'samza-tools',
        'samza-yarn',
        'samza-test',
] as HashSet

scalaModules.each {
  include it
}

rootProject.children.each {
  if (scalaModules.contains(it.name)) {
    it.name = it.name + "_" + scalaSuffix
  }
}

/**
 * To skip integration tests in samza-test: './gradlew clean build -PskipIntegrationTests'
 */
gradle.taskGraph.whenReady { taskGraph ->
  taskGraph.getAllTasks().each { task ->
    def project = task.getProject()
    task.onlyIf {
      /**
       * Behaves as pass through filter for all tasks when `skipIntegrationTests` property is turned off.
       * Filters 'test' task of 'samza-test' project otherwise.
       */
      !project.hasProperty("skipIntegrationTests") || !(project.getName().contains("samza-test") && task.getName() == "test")
    }
  }
}
