/*
 * 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 {
        jcenter()
    }

    dependencies {
        classpath ("io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE")
        classpath ("org.ajoberstar:grgit:2.0.0")
    }
}

plugins {
    id 'com.github.hierynomus.license' version '0.13.1'
    id("org.nosphere.apache.rat") version "0.3.1"
    id "com.jfrog.artifactory" version "4.9.5"
}

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'io.spring.dependency-management'
apply plugin: 'maven-publish'
apply plugin: 'license'
apply plugin: "org.ajoberstar.grgit"

ext {
    versions = [
            springcontext        : '4.3.3.RELEASE',
            springboot           : '1.4.1.RELEASE',
            findbugs             : '3.0.1'
    ]
    changesetId = grgit.head().id
}

group 'org.apache.fineract.cn'
version '0.1.0-BUILD-SNAPSHOT'

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

dependencies {
    compile(
            [group: 'com.google.code.findbugs', name: 'jsr305', version: versions.findbugs],
            [group: 'org.springframework.boot', name: 'spring-boot-starter-web', version: versions.springboot],
            [group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
    )

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

jar {
    from sourceSets.main.allSource
}

publishing {
    publications {
        langPublication(MavenPublication) {
            from components.java
            groupId project.group
            artifactId project.name
            version project.findProperty('externalVersion') ?: project.version
        }
    }
}

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

        defaults {
            publications ('langPublication')
        }
    }
}
artifactoryPublish.dependsOn('clean','publishToMavenLocal')

license {
    header rootProject.file('HEADER')
    strictCheck true
    mapping {
        java = 'SLASHSTAR_STYLE'
    }
}

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