buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
    }
}

plugins {
    id 'com.github.hierynomus.license' version '0.13.1'
}

group 'io.mifos.core'
version '0.1.0-BUILD-SNAPSHOT'

ext.versions = [
        frameworklang        : '0.1.0-BUILD-SNAPSHOT',
        springcontext        : '4.3.3.RELEASE',
        springsecurity       : '4.2.2.RELEASE',
        springboot           : '1.4.1.RELEASE',
        findbugs             : '3.0.1',
]

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

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

repositories {
    jcenter()
    mavenLocal()
}

dependencies {
    compile(
            [group: 'io.mifos.core', name: 'lang', version: versions.frameworklang],
            [group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
            [group: 'org.springframework.security', name: 'spring-security-web', version: versions.springsecurity],
            [group: 'com.google.code.findbugs', name: 'jsr305', version: versions.findbugs]
    )

    testCompile(
            [group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: versions.springboot]
    )
}

publishing {
    publications {
        asyncPublication(MavenPublication) {
            from components.java
            groupId project.group
            artifactId project.name
            version project.version
        }
    }
}

license {
    header rootProject.file('HEADER')
    strictCheck true
    mapping {
        java = 'SLASHSTAR_STYLE'
    }
    ext.year = Calendar.getInstance().get(Calendar.YEAR)
    ext.name = 'The Mifos Initiative'
}