/*
 * 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.10.0')
    compile('org.apache.geode:geode-cq:1.10.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.mockito:mockito-core:3.2.4')
    testCompile('pl.pragmatists:JUnitParams:1.1.1')

    testImplementation 'org.awaitility:awaitility:4.0.2'
}

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:.*:.*')
    }
}

