/*
 * 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.
 */

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

ext.versions = [
        fineractcnidentity              : '0.1.0-BUILD-SNAPSHOT',
        fineractcnoffice                : '0.1.0-BUILD-SNAPSHOT',
        fineractcncustomer              : '0.1.0-BUILD-SNAPSHOT',
        fineractcnaccounting            : '0.1.0-BUILD-SNAPSHOT',
        fineractcnportfolio             : '0.1.0-BUILD-SNAPSHOT',
        fineractcnteller                : '0.1.0-BUILD-SNAPSHOT',
        fineractcnpayroll               : '0.1.0-BUILD-SNAPSHOT',
        fineractcngroup                 : '0.1.0-BUILD-SNAPSHOT',
        frameworkapi                    : '0.1.0-BUILD-SNAPSHOT',
        frameworklang                   : '0.1.0-BUILD-SNAPSHOT',
        frameworkasync                  : '0.1.0-BUILD-SNAPSHOT',
        frameworkcassandra              : '0.1.0-BUILD-SNAPSHOT',
        frameworkmariadb                : '0.1.0-BUILD-SNAPSHOT',
        frameworkcommand                : '0.1.0-BUILD-SNAPSHOT',
        frameworktest                   : '0.1.0-BUILD-SNAPSHOT',
        frameworkanubis                 : '0.1.0-BUILD-SNAPSHOT',
        frameworkpermittedfeignclient   : '0.1.0-BUILD-SNAPSHOT',
        validator                       : '5.3.0.Final',
        springjavamail                  : '1.4.1.RELEASE',
        twilioapi                       : '7.17.+',
        junit                           : '4.12',
        apachecsvreader                 : '1.4'
    
]

apply plugin: 'java'
apply plugin: 'idea'
apply plugin: 'maven-publish'
apply plugin: 'io.spring.dependency-management'

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

dependencyManagement {
    imports {
        mavenBom 'io.spring.platform:platform-bom:Athens-RELEASE'
        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR1'
    }
}

// override certain dependency provided by Spring platform using newer releases
ext['cassandra.version'] = '3.6'
ext['cassandra-driver.version'] = '3.1.2'
ext['activemq.version'] = '5.13.2'
ext['spring-data-releasetrain.version'] = 'Gosling-SR2A'

dependencies {
    compile(
            [group: 'com.google.code.findbugs', name: 'jsr305']
    )

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

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

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

        defaults {
            publications('api', 'componentTest', 'service', 'bootService')
        }
    }
}
artifactoryPublish.dependsOn('clean', 'publishToMavenLocal')

license {
    header rootProject.file('../HEADER')
    strictCheck true
    mapping {
        java = 'SLASHSTAR_STYLE'
        xml = 'XML_STYLE'
        yml = 'SCRIPT_STYLE'
        yaml = 'SCRIPT_STYLE'
    }
}

rat {
    // List of exclude directives, defaults to ['**/.gradle/**']
    excludes = [
            "**/.idea/**",
            "**/.gradle/**",
            "**/gradle/**",
            "**/build/**",
            "gradlew",
            "gradlew.bat",
            "README.md",
            ".dockerignore",
            "component-test/src/main/resources/importdata/*.csv",
            "service/src/main/resources/templatedetails/*.csv",
    ]
    plainOutput = true
}

