/*
 * 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 'nl.javadude.gradle.plugins:license-gradle-plugin:0.11.0'
        classpath ("org.ajoberstar:grgit:2.0.0")
    }
}

plugins {
    id 'com.github.hierynomus.license' version '0.15.0'
    id("org.nosphere.apache.rat") version "0.6.0"
    id "com.jfrog.artifactory" version "4.15.1"
    id "io.spring.dependency-management" version "1.0.9.RELEASE"
    id 'maven-publish'
    id 'java'
    id 'idea'
}

apply plugin: "org.ajoberstar.grgit"

ext {
    versions = [
            springcontext        : '5.2.5.RELEASE',
            springboot           : '2.2.6.RELEASE',
            findbugs             : '3.0.2'
    ]
    changesetId = grgit.head().id
}

group 'org.apache.fineract.cn'
version 'spring_boot_2-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:Cairo-SR8'
        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Hoxton.SR2'
    }
}

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],
            [group: 'junit', name: 'junit']
    )
}

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", ".settings/**", ".project" ]
    //plainOutput = true
}
