/*
 * 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.0-BUILD-SNAPSHOT'

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

apply plugin: 'license'

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.boot', name: 'spring-boot-starter', version: versions.springboot],
            [group: 'org.springframework.boot', name: 'spring-boot-starter-test', version: versions.springboot],
            [group: 'com.google.code.gson', name: 'gson', version: versions.gson],
            [group: 'org.apache.fineract.cn', name: 'cassandra', version: versions.frameworkcassandra],
            [group: 'org.apache.fineract.cn', name: 'postgresql', version: '0.1.0-BUILD-SNAPSHOT'],
            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
            [group: 'io.jsonwebtoken', name: 'jjwt', version: '0.6.0'],
            [group: 'org.cassandraunit', name: 'cassandra-unit', version: '3.0.0.1'],
            [group: 'com.opentable.components', name: 'otj-pg-embedded', version: '0.7.1']
    )
}

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


jar {
    from sourceSets.main.allSource
    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}

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"
    ]
}
