/**
 * 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.
 */
// TODO: this is work in progress, please follow FINERACT-1171
buildscript {
    ext {
        jacocoVersion = '0.8.5'
        retrofitVersion = '2.9.0'
        okhttpVersion = '4.7.2'
        oltuVersion = '1.0.1'
        fineractJavaProjects = subprojects.findAll{
            [
                'fineract-api',
                'fineract-provider',
                'fineract-client'
            ].contains(it.name)
        }
        fineractPublishProjects = subprojects.findAll{
            [
                'fineract-client'
            ].contains(it.name)
        }
    }
    repositories {
        jcenter()
        maven { url "https://plugins.gradle.org/m2/" }
    }

    dependencies {
        classpath 'com.bmuschko:gradle-cargo-plugin:2.7.1'
        classpath 'org.apache.openjpa:openjpa:3.1.2' // when upgrading, also change OpenJPA version repeated in fineract-provider/build.gradle!
        classpath 'com.radcortez.gradle:openjpa-gradle-plugin:3.1.0'
        classpath "gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.5.1"
        classpath "gradle.plugin.com.github.andygoossens:gradle-modernizer-plugin:1.3.0"
    }
}

plugins {
    id 'io.spring.dependency-management' version '1.0.10.RELEASE'
    id 'com.diffplug.spotless' version '5.6.1' apply false
    id 'org.nosphere.apache.rat' version '0.7.0' apply false
    id 'com.github.hierynomus.license' version '0.15.0' apply false
    id 'org.openapi.generator' version '4.3.1' apply false
    id 'org.zeroturnaround.gradle.jrebel' version '1.1.10' apply false
    id 'org.springframework.boot' version '2.3.4.RELEASE' apply false
    id 'net.ltgt.errorprone' version '1.3.0' apply false
    id 'io.swagger.core.v3.swagger-gradle-plugin' version '2.1.5' apply false
    id 'com.gorylenko.gradle-git-properties' version '2.2.4' apply false
}

description = '''\
Run as:
gradle clean bootRun'''

project.ext.jerseyVersion = '1.19.4'
ext['groovy.version'] = '3.0.6'

allprojects  {
    group = 'org.apache.fineract'

    repositories {
        jcenter()
    }

    apply plugin: 'io.spring.dependency-management'
    apply plugin: 'com.diffplug.spotless'
    apply plugin: 'com.github.hierynomus.license'
    apply plugin: 'org.nosphere.apache.rat'
    apply plugin: 'project-report'

    // Configuration for the dependency management plugin
    // https://github.com/spring-gradle-plugins/dependency-management-plugin
    dependencyManagement {
        imports {
            mavenBom 'org.springframework:spring-framework-bom:5.2.9.RELEASE'
        }

        dependencies {
            // We use fixed versions, instead of inheriting them from the Spring BOM, to be able to be on more recent ones.
            // We do not use :+ to get the latest available version available on Maven Central, as that could suddenly break things.
            // We use the Renovate Bot to automatically propose Pull Requests (PRs) when upgrades for all of these versions are available.

            dependency 'org.springframework.security.oauth:spring-security-oauth2:2.5.0.RELEASE'
            dependency 'org.apache.openjpa:openjpa:3.1.2' // when upgrading, also change OpenJPA version repeated above in buildscript!
            dependency 'com.squareup.retrofit:retrofit:1.9.0'
            dependency 'com.squareup.okhttp:okhttp:2.7.5'
            dependency 'com.squareup.okhttp:okhttp-urlconnection:2.7.5'
            dependency 'com.google.guava:guava:30.0-jre'
            dependency 'com.google.code.gson:gson:2.8.6'
            dependency 'org.apache.commons:commons-email:1.5'
            dependency 'commons-io:commons-io:2.8.0'
            dependency 'org.drizzle.jdbc:drizzle-jdbc:1.4'
            dependency 'com.github.librepdf:openpdf:1.3.22'
            dependency 'org.mnode.ical4j:ical4j:3.0.20'
            dependency 'org.quartz-scheduler:quartz:2.3.2'
            dependency 'com.amazonaws:aws-java-sdk-s3:1.11.874'
            dependency 'org.ehcache:ehcache:3.9.0'
            dependency 'com.github.spullara.mustache.java:compiler:0.9.7'
            dependency 'com.jayway.jsonpath:json-path:2.4.0'
            dependency 'org.apache.tika:tika-core:1.24.1'
            dependency 'org.apache.httpcomponents:httpclient:4.5.13'
            dependency 'io.swagger.core.v3:swagger-annotations:2.1.5'
            dependency 'jakarta.management.j2ee:jakarta.management.j2ee-api:1.1.4'
            dependency 'jakarta.jms:jakarta.jms-api:2.0.3'
            dependency 'jakarta.xml.bind:jakarta.xml.bind-api:2.3.3'
            dependency 'jakarta.validation:jakarta.validation-api:3.0.0'
            dependency 'org.apache.activemq:activemq-broker:5.16.0'
            dependency 'org.apache.bval:org.apache.bval.bundle:2.0.4'
            dependency 'org.mockito:mockito-core:3.5.15'
            dependency 'org.mockito:mockito-junit-jupiter:3.5.15'
            dependency 'io.github.classgraph:classgraph:4.8.90'
            dependency 'org.awaitility:awaitility:4.0.3'
            dependency 'com.github.spotbugs:spotbugs-annotations:4.1.4'
            dependency 'javax.cache:cache-api:1.1.1'
            dependency 'org.mock-server:mockserver-junit-jupiter:5.11.1'
            dependency 'org.webjars.npm:swagger-ui-dist:3.35.2'
            dependency 'org.webjars:webjars-locator-core:0.46'

            // fineract client dependencies
            dependency "com.squareup.retrofit2:retrofit:$retrofitVersion"
            dependency "com.squareup.retrofit2:retrofit-mock:$retrofitVersion"
            dependency "com.squareup.retrofit2:adapter-java8:$retrofitVersion"
            dependency "com.squareup.retrofit2:adapter-rxjava2:$retrofitVersion"
            dependency "com.squareup.retrofit2:adapter-rxjava3:$retrofitVersion"
            dependency "com.squareup.retrofit2:adapter-guava:$retrofitVersion"
            dependency "com.squareup.retrofit2:converter-wire:$retrofitVersion"
            dependency "com.squareup.retrofit2:converter-jackson:$retrofitVersion"
            dependency "com.squareup.retrofit2:converter-simplexml:$retrofitVersion"
            dependency "com.squareup.retrofit2:converter-jaxb:$retrofitVersion"
            dependency "com.squareup.retrofit2:converter-java8:$retrofitVersion"
            dependency "com.squareup.retrofit2:converter-scalars:$retrofitVersion"
            dependency "com.squareup.retrofit2:converter-gson:$retrofitVersion"
            dependency "com.squareup.retrofit2:converter-protobuf:$retrofitVersion"
            dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.common:$oltuVersion"
            dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.client:$oltuVersion"
            dependency "org.apache.oltu.oauth2:org.apache.oltu.oauth2.httpclient4:$oltuVersion"
            dependency "com.squareup.okhttp3:okhttp:$okhttpVersion"
            dependency "com.squareup.okhttp3:okcurl:$okhttpVersion"
            dependency "com.squareup.okhttp3:logging-interceptor:$okhttpVersion"
            dependency "com.squareup.okhttp3:okhttp-apache:$okhttpVersion"
            dependency "com.squareup.okhttp3:okhttp-android-support:$okhttpVersion"
            dependency "com.squareup.okhttp3:okhttp-urlconnection:$okhttpVersion"
            dependency "com.squareup.okhttp3:okhttp-sse:$okhttpVersion"
            dependency "io.gsonfire:gson-fire:1.8.4"
            dependency "io.swagger:swagger-core:1.6.2"
            dependency "io.swagger:swagger-annotations:1.6.2"
            dependency "javax.annotation:javax.annotation-api:1.3.2"
            dependency "com.google.code.findbugs:jsr305:3.0.2"
            dependency "commons-codec:commons-codec:1.15"

            dependency ('org.flywaydb:flyway-core:7.0.0') {
                // https://issues.apache.org/jira/browse/FINERACT-1172
                // https://github.com/apache/fineract/pull/1355
                // https://github.com/flyway/flyway/issues/2957
                // exclude conflicting non-<optional> dependencies from https://github.com/flyway/flyway/blob/master/flyway-core/pom.xml
                exclude 'software.amazon.awssdk:s3'
            }

            dependency ('org.dom4j:dom4j:2.1.3') {
                exclude 'relaxngDatatype:relaxngDatatype' // already in com.sun.xml.bind:jaxb-osgi:2.3.0.1
                // FINERACT-940 && FINERACT-966 https://github.com/spotbugs/spotbugs/issues/1128
                exclude 'xpp3:xpp3'
                exclude 'pull-parser:pull-parser'
            }

            dependencySet(group: 'com.sun.jersey', version: jerseyVersion) {
                entry 'jersey-core'
                entry 'jersey-servlet'
                entry 'jersey-server'
                entry 'jersey-json'
            }
            dependencySet(group: 'com.sun.jersey.contribs', version: jerseyVersion) {
                entry 'jersey-spring'
                entry 'jersey-multipart'
            }
            dependencySet(group: 'org.apache.poi', version: '4.1.2') {
                entry 'poi'
                entry 'poi-ooxml'
                entry 'poi-ooxml-schemas'
            }
            dependencySet(group: 'io.rest-assured', version: '4.3.0')
            {
                entry 'rest-assured'
                entry 'json-path'
                entry 'xml-path'
            }
        }
    }

    // Configuration for the spotless plugin
    // https://github.com/diffplug/spotless/tree/main/plugin-gradle
    spotless {
        format 'misc', {
            target '**/*.md', '**/*.properties', '**/.gitignore', '**/.openapi-generator-ignore', '**/*.yml', '**/*.xml', '**/**.json', '**/*.sql'
            targetExclude '**/build/**', '**/bin/**', '**/.settings/**', '**/.idea/**', '**/.gradle/**', '**/gradlew.bat'
            indentWithSpaces(4)
            endWithNewline()
            trimTrailingWhitespace()
        }

        groovyGradle {
            target '*.gradle', '**/*.gradle'
            targetExclude '**/build/**'
            greclipse()
            indentWithSpaces(4)
            endWithNewline()
            trimTrailingWhitespace()
        }

        lineEndings 'UNIX'
    }

    // Configuration for Gradle license plug-in
    // https://github.com/hierynomus/license-gradle-plugin
    license {
        header rootProject.file("$rootDir/APACHE_LICENSETEXT.md")
        excludes([
            "**/gradlew*",
            "**/git.properties",
            "**/*.html",
            "**/*.mustache",
            "**/package-info.java",
            "**/keystore.jks",
            "**/static/swagger-ui/**",
            "**/api-docs/**",
        ])
        strictCheck true
    }

    task licenseFormatBuildScripts (type:nl.javadude.gradle.plugins.license.License) {
        source = fileTree(dir: "$rootDir/", includes: [
            '**/*.bat',
            '**/*.sh',
            '**/*.sql'
        ], excludes: [
            '**/gradlew*'
        ])
    }
    licenseFormat.dependsOn licenseFormatBuildScripts

    // Configuration for Apache Release Audit Tool task
    // https://github.com/eskatos/creadur-rat-gradle
    rat {
        verbose = false
        reportDir = file("$buildDir/reports/rat")
        excludes = [
            '**/src/main/templates/**/*.mustache',
            '**/.dockerignore',
            '**/*.launch',
            '**/licenses/**',
            '**/*.md',
            '**/*.github/**',
            '**/MANIFEST.MF',
            '**/*.json',
            '**/*.json.template',
            '**/*.txt',
            '**/*.log',
            '**/fineractdev-eclipse-preferences.epf',
            '**/template-expected.html',
            '**/template.mustache',
            '**/.classpath',
            '**/.project',
            '**/.idea/**',
            '**/*.ipr',
            '**/*.iws',
            '**/.settings/**',
            '**/bin/**',
            '**/.git/**',
            '**/.gitignore',
            '**/.openapi-generator-ignore',
            '**/.gitkeep',
            '**/*.iml',
            '**/config/swagger/templates/**',
            // Notice files
            '**/NOTICE_RELEASE',
            '**/NOTICE_SOURCE',
            // Swagger License
            '**/src/main/resources/static/swagger-ui/**',
            // gradle
            '**/.gradle/**',
            '**/gradlew',
            '**/gradlew.bat',
            '**/gradle/wrapper/gradle-wrapper.properties',
            '**/caches/**',
            '**/daemon/**',
            '**/native/**',
            '**/wrapper/**',
            '**/build/**',
            // Api Docs
            '**/api-docs/*.*',
            '**/docs/system-architecture/.htaccess',
            '**/docs/system-architecture/404.html',
            '**/docs/system-architecture/index.html',
            '**/docs/system-architecture/**/*.xml',
            '**/bootstrap-3.0.0/assets/application.js',
            '**/system-architecture/js/plugins.js',
            // Apache License
            '**/bootstrap-3.0.0/assets/less.js',
            '**/css/bootstrap-3.0.0/**/*.*',
            // Public Domain See http://www.JSON.org/js.html
            '**/bootstrap-3.0.0/assets/json2.js.htm',
            // MIT License
            '**/modernizr-2.6.2.min.js',
            '**/css/normalize.css',
            '**/assets/filesaver.js',
            '**/css/fonts/glyphicons-halflings-regular.svg',
            '**/assets/jszip.js',
            '**/assets/jquery.js',
            '**/api-docs/jquery-1.7.min.js',
            '**/css/toc-0.1.2/**/*.*',
            '**/docs/system-architecture/css/main.css',
            '**/system-architecture/js/vendor/jquery-1.9.1.min.js',
            '**/system-architecture/js/vendor/toc-0.1.2/jquery.toc.min.js',
            '**/assets/respond.min.js',
            '**/assets/html5shiv.js',
            // BSD License
            '**/assets/uglify.js',
            // Ignore out folder
            '**/out/**',
            // Git build info
            "**/git.properties",
            ".mailmap",
        ]
    }
}

configure(project.fineractJavaProjects) {
    // NOTE: order matters!

    apply plugin: 'java-library'
    apply plugin: 'idea'
    apply plugin: 'checkstyle'
    apply plugin: 'jacoco'
    apply plugin: "net.ltgt.errorprone"
    apply plugin: "com.github.spotbugs"
    apply plugin: 'com.github.andygoossens.gradle-modernizer-plugin'

    /* define the valid syntax level for source files */
    sourceCompatibility = JavaVersion.VERSION_11
    /* define binary compatibility version */
    targetCompatibility = JavaVersion.VERSION_11

    /* http://stackoverflow.com/questions/19653311/jpa-repository-works-in-idea-and-production-but-not-in-gradle */
    sourceSets.main.output.resourcesDir = sourceSets.main.java.outputDir
    sourceSets.test.output.resourcesDir = sourceSets.test.java.outputDir

    sourceSets {
        integrationTest {
            compileClasspath += main.output + test.output
            runtimeClasspath += main.output + test.output
        }
    }

    configurations {
        implementation.setCanBeResolved(true)
        api.setCanBeResolved(true)

        integrationTestCompile.extendsFrom testImplementation
        integrationTestRuntime.extendsFrom testRuntime
    }

    tasks.withType(JavaCompile) {
        options.compilerArgs += [
            "-Xlint:unchecked",
            "-Xlint:cast",
            "-Xlint:auxiliaryclass",
            "-Xlint:deprecation",
            "-Xlint:dep-ann",
            "-Xlint:divzero",
            "-Xlint:empty",
            "-Xlint:exports",
            "-Xlint:fallthrough",
            "-Xlint:finally",
            "-Xlint:module",
            "-Xlint:opens",
            "-Xlint:options",
            "-Xlint:overloads",
            "-Xlint:overrides",
            "-Xlint:path",
            "-Xlint:processing",
            "-Xlint:removal",
            "-Xlint:requires-automatic",
            "-Xlint:requires-transitive-automatic",
            "-Xlint:try",
            "-Xlint:varargs",
            "-Xlint:preview",
            "-Xlint:static",
            "-Werror"
        ]
        // TODO FINERACT-959 (gradually) enable -Xlint:all (see "javac -help -X")

        options.deprecation = true

        options.compilerArgs +=[
            "-Xmaxwarns",
            1500,
            "-Xmaxerrs",
            1500
        ]
    }

    // Configuration for the spotless plugin
    // https://github.com/diffplug/spotless/tree/main/plugin-gradle
    spotless {
        java {
            targetExclude '**/build/**', '**/bin/**', '**/out/**'
            importOrder() //sort imports alphabetically
            removeUnusedImports()
            eclipse().configFile "$rootDir/config/fineractdev-formatter.xml"
            endWithNewline()
            trimTrailingWhitespace()

            // Enforce style modifier order
            custom 'Modifier ordering', {
                def modifierRanking = [
                    public      : 1,
                    protected   : 2,
                    private     : 3,
                    abstract    : 4,
                    default     : 5,
                    static      : 6,
                    final       : 7,
                    transient   : 8,
                    volatile    : 9,
                    synchronized: 10,
                    native      : 11,
                    strictfp    : 12]
                // Find any instance of multiple modifiers. Lead with a non-word character to avoid
                // accidental matching against for instance, "an alternative default value"
                it.replaceAll(/\W(?:public |protected |private |abstract |default |static |final |transient |volatile |synchronized |native |strictfp ){2,}/, {
                    // Do not replace the leading non-word character.  Identify the modifiers
                    it.replaceAll(/(?:public |protected |private |abstract |default |static |final |transient |volatile |synchronized |native |strictfp ){2,}/, {
                        // Sort the modifiers according to the ranking above
                        it.split().sort({ modifierRanking[it] }).join(' ') + ' '
                    }
                    )
                }
                )
            }
        }

        lineEndings 'UNIX'
    }

    compileJava {
        if (project.hasProperty('automatedBuild')) {
            dependsOn(spotlessCheck)
        } else {
            dependsOn(spotlessApply)
        }
    }

    // If we are running Gradle within Eclipse to enhance classes with OpenJPA,
    // set the classes directory to point to Eclipse's default build directory
    if (project.hasProperty('env') && project.getProperty('env') == 'eclipse') {
        sourceSets.main.java.outputDir = file("$projectDir/bin/main")
    }

    // Configuration for the Checkstyle plugin
    // https://docs.gradle.org/current/userguide/checkstyle_plugin.html
    dependencies {
        checkstyle 'com.puppycrawl.tools:checkstyle:8.36.2'
        checkstyle 'com.github.sevntu-checkstyle:sevntu-checks:1.37.1'
    }

    // Configuration for JaCoCo code coverage task
    // https://www.eclemma.org/jacoco/
    jacoco {
        toolVersion = jacocoVersion
        reportsDir = file("$buildDir/reports/jacoco")
    }

    jacocoTestReport {
        reports {
            html.enabled=true
            xml.enabled=true
            html.destination file("${buildDir}/code-coverage")
        }
    }

    // Configuration for the errorprone plugin
    // https://github.com/tbroyer/gradle-errorprone-plugin
    dependencies {
        errorprone "com.google.errorprone:error_prone_core:2.4.0"
    }

    tasks.withType(JavaCompile) {
        options.errorprone {
            disableWarningsInGeneratedCode = true
            excludedPaths = ".*/build/.*"
            //Todo Remove necessary checks from this list
            disable(
                    "UnusedVariable",
                    "TypeParameterUnusedInFormals",
                    "JdkObsolete",
                    "EmptyBlockTag",
                    "MissingSummary",
                    "InvalidParam",
                    "ReturnFromVoid",
                    "AlmostJavadoc",
                    "InvalidBlockTag",
                    )
            //TODO gradually enable these checks
            error(
                    "DefaultCharset",
                    "RemoveUnusedImports",
                    "WaitNotInLoop",
                    "ThreeLetterTimeZoneID",
                    "VariableNameSameAsType",
                    "UnnecessaryParentheses",
                    "MultipleTopLevelClasses",
                    "MixedMutabilityReturnType",
                    "MultiVariableDeclaration",
                    "AssertEqualsArgumentOrderChecker",
                    "EmptySetMultibindingContributions",
                    "BigDecimalEquals",
                    "MixedArrayDimensions",
                    "PackageLocation",
                    "UseBinds",
                    "BadImport",
                    "IntLongMath",
                    "FloatCast",
                    "ReachabilityFenceUsage",
                    "StreamResourceLeak",
                    "TruthIncompatibleType",
                    "ByteBufferBackingArray",
                    "SameNameButDifferent",
                    "OrphanedFormatString",
                    "CatchAndPrintStackTrace",
                    "ObjectToString",
                    "StringSplitter",
                    "AssertThrowsMultipleStatements",
                    "BoxedPrimitiveConstructor",
                    "EmptyCatch",
                    "BoxedPrimitiveEquality",
                    "SynchronizeOnNonFinalField",
                    "WildcardImport",
                    "FutureReturnValueIgnored",
                    "PrivateConstructorForNoninstantiableModule",
                    "ClassCanBeStatic",
                    "ClassNewInstance",
                    "UnnecessaryStaticImport",
                    "UnsafeFinalization",
                    "JodaPlusMinusLong",
                    "MutableMethodReturnType",
                    "SwitchDefault",
                    "VarTypeName",
                    "ArgumentSelectionDefectChecker",
                    "CompareToZero",
                    "InjectOnConstructorOfAbstractClass",
                    "ImmutableEnumChecker",
                    "NarrowingCompoundAssignment",
                    "MissingCasesInEnumSwitch",
                    "ReferenceEquality",
                    "UndefinedEquals",
                    "PublicConstructorForAbstractClass",
                    "UnescapedEntity",
                    "ModifyCollectionInEnhancedForLoop",
                    "NonCanonicalType",
                    "InvalidInlineTag",
                    "MutablePublicArray",
                    "StaticAssignmentInConstructor",
                    "ProtectedMembersInFinalClass",
                    "OperatorPrecedence",
                    "EqualsGetClass",
                    "EqualsUnsafeCast",
                    "DoubleBraceInitialization",
                    "UnnecessaryDefaultInEnumSwitch",
                    "UnusedNestedClass",
                    "UnusedMethod",
                    "ModifiedButNotUsed",
                    "InconsistentCapitalization",
                    "MissingOverride",
                    // "InvalidBlockTag",
                    // "InconsistentOverloads",
                    // "MethodCanBeStatic",
                    // "Var",
                    // "ConstantField",
                    // "UnnecessaryDefaultInEnumSwitch",
                    // "FieldCanBeFinal"
                    )
        }
    }

    // Configuration for spotbugs plugin
    // https://github.com/spotbugs/spotbugs-gradle-plugin

    // To generate an HTML report instead of XML
    spotbugs {
        reportLevel = 'high'
        showProgress = true
    }
    // https://github.com/spotbugs/spotbugs-gradle-plugin/issues/242
    spotbugsMain {
        reports {
            html {
                enabled = true
                stylesheet = 'fancy-hist.xsl'
            }
        }
    }
    spotbugsTest {
        reports {
            html {
                enabled = true
                stylesheet = 'fancy-hist.xsl'
            }
        }
    }
    spotbugsIntegrationTest {
        reports {
            html {
                enabled = true
                stylesheet = 'fancy-hist.xsl'
            }
        }
    }

    // Configuration for the modernizer plugin
    // https://github.com/andygoossens/gradle-modernizer-plugin
    modernizer {
        includeTestClasses = true
        failOnViolations = true

        violationLogLevel="error"

        javaVersion = project.targetCompatibility

        ignorePackages = []
        ignoreGeneratedClasses = true

        exclusions = []
        exclusionPatterns = [
            // To be removed when https://issues.apache.org/jira/browse/FINERACT-826 is fixed
            'org/joda/time/.*'
        ]
    }
}

configure(project.fineractPublishProjects) {
    apply plugin: 'maven'
    apply plugin: 'maven-publish'

    publishing {
        publications {
            mavenJava(MavenPublication) {
                from components.java

                versionMapping {
                    usage('java-api') {
                        fromResolutionOf('runtimeClasspath')
                    }
                    usage('java-runtime') {
                        fromResolutionResult()
                    }
                }

                pom {
                    name = 'Fineract'
                    description = 'A secure, multi-tenanted microfinance platform'
                    url = 'https://fineract.apache.org'
                    licenses {
                        license {
                            name = 'The Apache License, Version 2.0'
                            url = 'http://www.apache.org/licenses/LICENSE-2.0.html'
                        }
                    }
                    scm {
                        connection = 'scm:git:https://github.com/apache/fineract.git'
                        developerConnection = 'scm:git:git://github.com:apache/fineract.git'
                        url = 'https://fineract.apache.org/'
                    }
                }
            }
        }

        // TODO FINERACT-1102: Actually use this to deploy to ASF (Apache Software Foundation) Nexus Maven Repository
    }
}
