/*
 * 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"
}

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

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

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'maven'
apply plugin: 'maven-publish'
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.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
            [group: 'com.jolbox', name: 'bonecp', version: '0.8.0.RELEASE'],
            [group: 'org.flywaydb', name: 'flyway-core', version: '4.0.1'],
            [group: 'org.eclipse.persistence', name: 'org.eclipse.persistence.jpa', version: versions.eclipselink]
    )

    //Workaround for bug described here: https://discuss.gradle.org/t/build-failure-when-4-1-0-of-net-java-dev-jna-jna-is-selected-in-place-of-3-3-0-due-to-change-in-artifacts-with-classifiers/9377/3
    //These two compiled of jna and the exclude under mariadb-java-client may be removable once
    //the bug is fixed in gradle.
    compile('org.mariadb.jdbc:mariadb-java-client:1.4.3') {
        exclude group: 'net.java.dev.jna'
    }
    compile(group: 'org.springframework.boot', name: 'spring-boot-starter-data-jpa', version: versions.springboot)
            {
                exclude group: 'org.hibernate', module: 'hibernate-entitymanager'
                exclude group: 'org.hibernate', module: 'hibernate-core'
            }

    compile 'net.java.dev.jna:jna:4.1.0'
    compile 'net.java.dev.jna:jna-platform:4.1.0'

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

jar {
    from sourceSets.main.allSource
}

publishing {
    publications {
        mariadbPublication(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 ('mariadbPublication')
        }
    }
}
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
}
