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

// 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')
    }
  }
}
