/*
 * 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 '0.1.0-BUILD-SNAPSHOT'

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


ext.versions = [
        frameworktest       : '0.1.0-BUILD-SNAPSHOT',
        frameworkapi        : '0.1.0-BUILD-SNAPSHOT',
        frameworkcassandra  : '0.1.0-BUILD-SNAPSHOT',
        frameworklang       : '0.1.0-BUILD-SNAPSHOT',
        jjwt                : '0.6.0',
        hibernatevalidator  : '5.3.0.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 'io.spring.platform:platform-bom:Athens-RELEASE'
        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR1'
    }
}

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

dependencies {
    compile(
            [group: 'com.google.code.findbugs', name: 'jsr305']
    )

    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"
    ]
}
