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

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"
    id 'maven-publish'
    id 'idea'
    id 'java'
}

group 'org.apache.fineract.cn'
version '0.1.x-SNAPSHOT'

ext.versions = [
        springcontext             : '4.3.3.RELEASE',
        springboot                : '1.4.1.RELEASE',
        gson                      : '2.5',
        findbugs                  : '3.0.1',
        frameworklangversion      : '0.1.x-SNAPSHOT',
        frameworkasyncversion     : '0.1.x-SNAPSHOT',
        frameworkcassandraversion : '0.1.x-SNAPSHOT'
]

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


dependencies {
    compile(
            [group: 'org.springframework', name: 'spring-context', version: versions.springcontext],
            [group: 'com.google.code.findbugs', name: 'jsr305', version: versions.findbugs],
            [group: 'org.springframework', name: 'spring-jms', version: versions.springcontext],
            [group: 'org.apache.activemq', name: 'activemq-spring', version: '5.13.2'],
            [group: 'com.google.code.gson', name: 'gson', version: versions.gson],
            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklangversion],
            [group: 'org.apache.fineract.cn', name: 'async', version: versions.frameworkasyncversion],
            [group: 'org.apache.fineract.cn', name: 'cassandra', version: versions.frameworkcassandraversion]
    )

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

publishing {
    publications {
        commandPublication(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 ('commandPublication')
    }
}
}
artifactoryPublish.dependsOn('clean','publishToMavenLocal')

jar {
    from sourceSets.main.allSource
}

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
}
