/*
 * 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.
 */
rootProject.name = 'geode-examples'

include 'replicated'
include 'partitioned'
include 'queries'
include 'lucene'
include 'loader'
include 'putall'
include 'durableMessaging'
include 'cq'
include 'clientSecurity'
include 'functions'
include 'persistence'
include 'writer'
include 'listener'
include 'async'
include 'luceneSpatial'
include 'eviction'
include 'serialization'
include 'expiration'
include 'indexes'
include 'transaction'
include 'wan'
include 'jdbc'
include 'sessionState'
include 'colocation'
include 'micrometerMetrics'
include 'compression'
include 'rest'

// Logic for defining a custom Geode clone for integration with this project
// Define `-PgeodeCompositeDirectory` to your geode root, default `../geode`
// Define `-Dcomposite` to enable Gradle includeBuild feature
def geodeCompositePropertyName = 'geodeCompositeDirectory'
def geodePath = hasProperty(geodeCompositePropertyName) ? geodeCompositeDirectory : '../geode'
def geodeDirectory = file(geodePath).absolutePath
def geodeDirectoryExists = file(geodeDirectory).exists()
def compositeBuildEnabled = System.getProperty("composite") != null
gradle.ext.usingGeodeCompositeBuild = compositeBuildEnabled && geodeDirectoryExists

if (gradle.ext.usingGeodeCompositeBuild) {
  includeBuild(geodeDirectory) {
    it.dependencySubstitution {
      // Any submodule used by examples must should be listed here
      it.substitute it.module("org.apache.geode:geode-all-bom") with it.project(':boms:geode-all-bom')
      it.substitute it.module("org.apache.geode:geode-cq") with it.project(':geode-cq')
      it.substitute it.module("org.apache.geode:geode-core") with it.project(':geode-core')
      it.substitute it.module("org.apache.geode:geode-logging") with it.project(':geode-logging')
      it.substitute it.module("org.apache.geode:geode-lucene") with it.project(':geode-lucene')
      it.substitute it.module("org.apache.geode:apache-geode") with it.project(':geode-assembly')
    }
  }
}
