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

def modules = ['gobblin-admin',
               'gobblin-all',
               'gobblin-api',
               'gobblin-compaction',
               'gobblin-completeness',
               'gobblin-config-management',
               'gobblin-core',
               'gobblin-core-base',
               'gobblin-distribution',
               'gobblin-example',
               'gobblin-hive-registration',
               'gobblin-iceberg',
               'gobblin-metrics-libs',
               'gobblin-metastore',
               'gobblin-modules',
               'gobblin-rest-service',
               'gobblin-runtime',
               'gobblin-runtime-hadoop',
               'gobblin-utility',
               'gobblin-salesforce',
               'gobblin-test-harness',
               'gobblin-tunnel',
               'gobblin-data-management',
               'gobblin-config-management',
               'gobblin-audit',
               'gobblin-yarn',
               'gobblin-cluster',
               'gobblin-aws',
               'gobblin-service',
               'gobblin-test-utils',
               'gobblin-binary-management']

// Disable jacoco for now as Kafka 0.8 is the default version and jacoco does not like the same classes
// being declared in different modules
def jacocoBlacklist =  new HashSet([
    "gobblin-modules:gobblin-kafka-09"
])

modules.each { module ->
  include "${module}"
  file(module).eachDir { submodule ->
    if (!submodule.name.startsWith('.') && !submodule.name.equals('src') && !submodule.name.equals('bin')
          && !submodule.name.equals('test-output') && !submodule.name.equals('jobconf')) {
        def submoduleId = "${module}:${submodule.name}"
        if (System.getProperty('jacocoBuild') == null || !jacocoBlacklist.contains(submoduleId.toString())) {
            include submoduleId
        }
        else {
            println "Ignoring blacklisted module ${submoduleId}"
        }
    }
  }
}

if (file('gobblin-restli').exists()) {
  def restliSubModules = ['api', 'server', 'client']
  include 'gobblin-restli:gobblin-restli-utils'
  include 'gobblin-restli'

  file('gobblin-restli').eachDir { submodule ->
    if (!submodule.name.startsWith('.') && !submodule.name.equals('src')) {
      def submoduleId = "gobblin-restli:${submodule.name}"
      include submoduleId
      restliSubModules.each { restliSubModule ->
        def subSubModuleName = submodule.name + '-' + restliSubModule
        if (new File(submodule, subSubModuleName).exists()) {
          include "gobblin-restli:${submodule.name}:${subSubModuleName}"
        }
      }
    }
  }
}
