/*
 * 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/" }
        maven { url "https://dl.bintray.com/palantir/releases" }
        jcenter()
    }
    dependencies {
        classpath 'com.diffplug.spotless:spotless-plugin-gradle:3.21.1'
        classpath 'com.github.ben-manes:gradle-versions-plugin:0.21.0'
        classpath 'com.netflix.nebula:gradle-lint-plugin:11.4.4'
        classpath 'com.netflix.nebula:nebula-project-plugin:6.0.2'
        classpath 'gradle.plugin.com.palantir.gradle.docker:gradle-docker:0.22.1'
        classpath 'io.spring.gradle:dependency-management-plugin:1.0.7.RELEASE'
        classpath 'org.ajoberstar.grgit:grgit-gradle:3.1.1'
        classpath 'org.nosphere.apache:creadur-rat-gradle:0.4.0'
        classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.7'
    }
}
plugins {
    id 'java'
    id 'com.github.johnrengelman.shadow' version '2.0.4'
}

apply plugin: 'wrapper'
apply plugin: 'nebula.facet'
apply plugin: 'java-library'
apply plugin: 'idea'
apply plugin: 'eclipse'

tasks.register('devBuild') {
    description "A convenience target for a typical developer workflow: apply spotless and assemble all classes."
    dependsOn tasks.named('assemble')
    // Each subproject injects its SpotlessApply as a dependency to this task in the standard config
}


apply from: "${rootDir}/${scriptDir}/spotless.gradle"
apply from: "${scriptDir}/rat.gradle"


sourceCompatibility = 1.8

repositories {
    mavenCentral()
}

dependencies {
    compile('org.apache.geode:geode-core:1.9.0')
    compile('org.apache.geode:geode-cq:1.9.0')
    compile(group: 'org.apache.kafka', name: 'connect-api', version: '2.3.1')
    compile(group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.13.0')
    compile(group: 'org.apache.logging.log4j', name: 'log4j-core', version: '2.13.0')

    testCompile(group: 'org.apache.kafka', name: 'kafka_2.12', version: '2.3.1')
    testCompile(group: 'org.apache.kafka', name: 'kafka-streams-test-utils', version: '1.1.0')
    testCompile(group: 'org.apache.curator', name: 'curator-framework', version: '4.2.0')
    testCompile(group: 'org.apache.kafka', name: 'connect-runtime', version: '2.3.1')

    testCompile(group: 'junit', name: 'junit', version: '4.12')
//    testCompile("org.junit.jupiter:junit-jupiter-params:5.4.2")
    testCompile('org.mockito:mockito-core:3.2.4')
    testCompile('pl.pragmatists:JUnitParams:1.1.1')
    testCompile(group: 'org.apache.geode', name: 'geode-dunit', version: '1.9.0')
    testImplementation 'org.awaitility:awaitility:3.1.6'
}

shadowJar {
    dependencies {
        // exclude dependencies provided in the kafka connect classpath
        exclude dependency("org.apache.kafka:connect-api:.*")
        exclude dependency("org.apache.kafka:kafka-clients:.*")
        exclude dependency('net.jpountz.lz4:.*:.*')
        exclude dependency('org.xerial.snappy:.*:.*')
        exclude dependency('org.slf4j:.*:.*')
    }
}

