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

group 'org.apache.fineract.cn.anubis'
version 'spring_boot_2-SNAPSHOT'

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'maven-publish'
apply plugin: 'io.spring.dependency-management'


ext.versions = [
        frameworktest       : 'spring_boot_2-SNAPSHOT',
        frameworkapi        : 'spring_boot_2-SNAPSHOT',
        frameworkcassandra  : 'spring_boot_2-SNAPSHOT',
        frameworklang       : 'spring_boot_2-SNAPSHOT',
        jjwt                : '0.9.1',
        hibernatevalidator  : '6.1.6.Final'
]

tasks.withType(JavaCompile) {
    sourceCompatibility = JavaVersion.VERSION_1_8
    targetCompatibility = JavaVersion.VERSION_1_8
}

repositories {
    jcenter()
    mavenLocal()
    maven { url 'https://mifos.jfrog.io/mifos/libs-snapshot/' }
}

dependencyManagement {
    imports {
        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR9'
    }
    dependencies {
        dependency group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.13'
        dependency group: 'org.springframework.boot', name: 'spring-boot-starter-actuator', version: '2.4.1'
        dependency group: 'com.google.code.gson', name: 'gson', version: '2.8.6'
    }
}

// override certain dependency provided by Spring platform using newer releases
ext['cassandra.version'] = '3.11.9'
ext['cassandra-driver.version'] = '4.9.0'
ext['cassandra-driver.version'] = '4.9.0'
ext['activemq.version'] = '5.13.2'
ext['spring-data-releasetrain.version'] = 'Gosling-SR2A'

dependencies {
    compile(
            [
                    group: 'com.github.spotbugs', name: 'spotbugs', version: '4.2.0'
            ]
    )

    testCompile(
            [group: 'org.springframework.boot', name: 'spring-boot-starter-test'],
            [group: 'org.apache.fineract.cn', name: 'test', version: versions.frameworktest],
    )

}

jar {
    from sourceSets.main.java
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

artifactory {
    contextUrl = System.getenv("ARTIFACTORY_URL")
    publish {
        repository {
            repoKey = project.findProperty('artifactoryRepoKey')
            username = System.getenv("ARTIFACTORY_USER")
            password = System.getenv("ARTIFACTORY_PASSWORD")
        }

        defaults {
            publications ('apiPublication', 'libraryPublication', 'testPublication')
        }
    }
}
artifactoryPublish.dependsOn('publishToMavenLocal')

license {
    header rootProject.file('../HEADER')
    strictCheck true
    mapping {
        java = 'SLASHSTAR_STYLE'
        xml = 'XML_STYLE'
        yml = 'SCRIPT_STYLE'
        yaml = 'SCRIPT_STYLE'
    }
}

task ci(dependsOn: ['clean', 'test', 'publish'])

rat {
    // List of exclude directives, defaults to ['**/.gradle/**']
    excludes = [
        "**/*.log",
        "**/.gradle/**",
        "**/.idea/**",
        "**/banner.txt",
        "**/build/**",
        "**/gradle/**",
        "gradlew",
        "gradlew.bat",
        "README.md"
    ]
}
