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

ext.versions = [
        frameworkapi : '0.1.0-BUILD-SNAPSHOT',
        frameworklang : '0.1.0-BUILD-SNAPSHOT',
        frameworkasync : '0.1.0-BUILD-SNAPSHOT',
        frameworkcassandra : '0.1.0-BUILD-SNAPSHOT',
        frameworkmariadb : '0.1.0-BUILD-SNAPSHOT',
        frameworkcommand : '0.1.0-BUILD-SNAPSHOT',
        frameworktest: '0.1.0-BUILD-SNAPSHOT',
        frameworkanubis: '0.1.0-BUILD-SNAPSHOT',
        frameworkpermittedfeignclient: '0.1.0-BUILD-SNAPSHOT',
        identity:  '0.1.0-BUILD-SNAPSHOT',
        validator : '5.3.0.Final'
]

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

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

repositories {
    jcenter()
    mavenLocal()
}

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']
    )
}

jar {
    from sourceSets.main.allSource
}

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

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