/*
 * 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.
 */
pluginManagement {
    plugins {
        id "com.google.protobuf" version "${protobufPluginVersion}"
        id "org.nosphere.apache.rat" version "${apcheRatPluginVersion}"
        id "com.github.johnrengelman.shadow" version "${shadowPluginVersion}"
        id "com.github.hierynomus.license" version "${licenseGradlePluginVersion}"
    }
}

rootProject.name = 'bookkeeper'

include(':bookkeeper-benchmark',
        ':bookkeeper-tools',
        ':bookkeeper-tools-framework',
        ':bookkeeper-tools-ledger',
        ':bookkeeper-tools-perf',
        ':bookkeeper-tools-stream',
        'bookkeeper-common',
        'bookkeeper-common-allocator',
        'bookkeeper-dist-all',
        'bookkeeper-dist-bkctl',
        'bookkeeper-dist-server',
        'bookkeeper-dist-src',
        'bookkeeper-dist:storage-bench',
        'bookkeeper-http:http-server',
        'bookkeeper-http:vertx-http-server',
        'bookkeeper-proto',
        'bookkeeper-server',
        'shaded:bookkeeper-server-shaded',
        'shaded:bookkeeper-server-tests-shaded',
        'bookkeeper-stats',
        'bookkeeper-stats-providers:prometheus-metrics-provider',
        'bookkeeper-stats-providers:codahale-metrics-provider',
        'buildtools',
        'circe-checksum',
        'circe-checksum:src:main:circe',
        'cpu-affinity',
        'cpu-affinity:src:main:affinity',
        'dev:release',
        'microbenchmarks',
        'shaded:distributedlog-core-shaded',
        'stats:utils',
        'stream:api',
        'stream:clients:java:all',
        'stream:clients:java:base',
        'stream:clients:java:kv',
        'stream:common',
        'stream:distributedlog:common',
        'stream:distributedlog:core',
        'stream:distributedlog:protocol',
        'stream:proto',
        'stream:server',
        'stream:statelib',
        'stream:storage:api',
        'stream:storage:impl',
        'stream:tests-common',
        'tests:integration-tests-base',
        'tests:integration-tests-topologies',
        'tests:integration-tests-utils',
        'tests:integration:cluster',
        'tests:integration:smoke',
        'tests:integration:standalone',
        'tools:framework')

project(':bookkeeper-tools').projectDir = file('tools/all')
project(':bookkeeper-tools-framework').projectDir = file('tools/framework')
project(':bookkeeper-tools-ledger').projectDir = file('tools/ledger')
project(':bookkeeper-tools-stream').projectDir = file('tools/stream')
project(':bookkeeper-tools-perf').projectDir = file('tools/perf')
project(':bookkeeper-dist-all').projectDir = file('bookkeeper-dist/all')
project(':bookkeeper-dist-bkctl').projectDir = file('bookkeeper-dist/bkctl')
project(':bookkeeper-dist-server').projectDir = file('bookkeeper-dist/server')
project(':bookkeeper-dist-src').projectDir = file('bookkeeper-dist')
include 'stream:perf'
findProject(':stream:perf')?.name = 'perf'
