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

buildscript {
  repositories {
    maven { url "https://plugins.gradle.org/m2/" }
  }

  dependencies {
    classpath "gradle.plugin.org.nosphere.apache:creadur-rat-gradle:0.2.0"
    classpath 'com.bmuschko:gradle-nexus-plugin:2.3.1'
    classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.0.1'
  }
}

apply plugin: 'wrapper'

wrapper {
  gradleVersion = minimumGradleVersion
}

// Load all properties in dependency-version.properties as project properties, so all projects can read them
Properties dependencyVersions = new Properties()
dependencyVersions.load(new FileInputStream("${project.projectDir}/gradle/dependency-versions.properties"))
dependencyVersions.keys().each{ k -> project.ext[k] = dependencyVersions[k]}

allprojects {
  version = versionNumber + releaseQualifier + releaseType
  ext.isReleaseVersion = !version.endsWith("SNAPSHOT")

  // We want to see all test results.  This is equivalatent to setting --continue
  // on the command line.
  gradle.startParameter.continueOnFailure = true
  
  repositories {
    mavenCentral()
    maven { url "http://repo.spring.io/release" }
  }

  group = "org.apache.geode"

  buildRoot = buildRoot.trim()
  if (!buildRoot.isEmpty()) {
    buildDir = buildRoot + project.path.replace(":", "/") + "/build"
  }
}

task cleanAll(type: Delete) {
  delete rootProject.buildDir
  if (!buildRoot.isEmpty()) {
    delete buildRoot
  }  
}

// allow external projects to override include location
if (name == 'geode') {
  ext.scriptDir = 'gradle'
}

apply from: "${scriptDir}/utilities.gradle"
apply from: "${scriptDir}/java.gradle"
apply from: "${scriptDir}/dependency-resolution.gradle"
apply from: "${scriptDir}/test.gradle"
apply from: "${scriptDir}/publish.gradle"
apply from: "${scriptDir}/code-analysis.gradle"
apply from: "${scriptDir}/sonar.gradle"
apply from: "${scriptDir}/ide.gradle"
apply from: "${scriptDir}/rat.gradle"

subprojects {
  // Make sure clean task for rootProject runs last
  clean.finalizedBy rootProject.cleanAll
}

task cleanExamples(type: GradleBuild) {
  buildFile = "${rootProject.projectDir}/geode-examples/build.gradle"
  tasks = ['clean']
}

clean.dependsOn cleanExamples

task buildExamples(type: GradleBuild, dependsOn: ':geode-assembly:installDist') {
  buildFile = "${rootProject.projectDir}/geode-examples/build.gradle"
  tasks = ['build']
}
