/*
 * 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'
    classpath "com.diffplug.gradle.spotless:spotless:2.2.0"
    classpath "me.champeau.gradle:jmh-gradle-plugin:0.3.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

  apply plugin: "com.diffplug.gradle.spotless"
  spotless {
    lineEndings = 'unix';
    java {
      target project.fileTree(project.projectDir) {
        include '**/*.java'
        exclude '**/generated-src/**'
      }
      // The formatter is relative to geode-core and not the root project as the root project would change
      // if Geode and submodules are included as part of a different gradle project.
      eclipseFormatFile "${project(':geode-core').projectDir}/../etc/eclipse-java-google-style.xml"
    }
  }
}

