| /** |
| * 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. |
| */ |
| description = 'Fineract Provider' |
| |
| apply plugin: 'rebel' |
| apply plugin: 'war' |
| apply plugin: 'org.springframework.boot' |
| apply plugin: 'com.bmuschko.cargo' |
| apply plugin: 'openjpa' |
| apply plugin: "com.gorylenko.gradle-git-properties" |
| apply plugin: "io.swagger.core.v3.swagger-gradle-plugin" |
| apply plugin: 'distribution' |
| apply plugin: 'signing' |
| |
| // Configuration for the OpenJPA enhance task |
| // https://github.com/radcortez/openjpa-gradle-plugin |
| System.setProperty("openjpa.Log", "commons") |
| |
| openjpa { |
| includes = [ |
| '**/AbstractPersistableCustom.class', |
| '**/domain/*.class' |
| ] |
| enhance { |
| enforcePropertyRestrictions true |
| } |
| } |
| |
| // Configuration for Swagger documentation generation task |
| // https://github.com/swagger-api/swagger-core/tree/master/modules/swagger-gradle-plugin |
| import org.apache.tools.ant.filters.ReplaceTokens |
| |
| task prepareInputYaml(dependsOn: 'generateGitProperties') { |
| doLast { |
| def versionForSwagger |
| |
| if(project.ext.properties.containsKey("gitProps")) |
| versionForSwagger = project.ext.gitProps['git.commit.id.describe'] |
| else |
| versionForSwagger = "unknown" |
| |
| copy { |
| from file('config/swagger/fineract-input.yaml.template') |
| into file('config/swagger') |
| rename { String filename -> return 'fineract-input.yaml' } |
| filter(ReplaceTokens, tokens: [VERSION: versionForSwagger]) |
| } |
| } |
| } |
| |
| |
| resolve { |
| logging.captureStandardOutput LogLevel.INFO |
| outputFileName = 'fineract' |
| outputFormat = 'YAML' |
| prettyPrint = 'TRUE' |
| classpath = sourceSets.main.runtimeClasspath |
| outputDir = file("${buildDir}/classes/java/main/static/swagger-ui") |
| openApiFile = file("config/swagger/fineract-input.yaml") |
| } |
| |
| resolve.dependsOn prepareInputYaml |
| |
| configurations { |
| providedRuntime // needed for Spring Boot executable WAR |
| providedCompile |
| compile() { |
| exclude module: 'hibernate-entitymanager' |
| exclude module: 'hibernate-validator' |
| exclude module: 'activation' |
| exclude module: 'bcmail-jdk14' |
| exclude module: 'bcprov-jdk14' |
| exclude module: 'bctsp-jdk14' |
| exclude module: 'c3p0' |
| exclude module: 'stax-api' |
| exclude module: 'jaxb-api' |
| exclude module: 'jaxb-impl' |
| exclude module: 'jboss-logging' |
| exclude module: 'itext-rtf' |
| exclude module: 'classworlds' |
| } |
| runtime |
| } |
| |
| apply from: 'dependencies.gradle' |
| /* TODO https://issues.apache.org/jira/browse/FINERACT-939 (dev-dependencies.gradle has been removed, as totally broken) |
| // Pick up dependencies based on the environment, defaults to production |
| if (project.hasProperty('env') && project.getProperty('env') == 'dev') { |
| apply from: 'dev-dependencies.gradle' |
| } else { |
| apply from: 'dependencies.gradle' |
| } |
| */ |
| |
| /* Enable Oauth2 authentication based on environment, default to HTTP basic auth */ |
| if (project.hasProperty('security') && project.getProperty('security') == 'oauth') { |
| if(project.hasProperty('twofactor') && project.getProperty('twofactor') == 'enabled') { |
| copy { |
| from './properties/oauth/twofactor/' |
| into 'src/main/resources/' |
| include '*.properties' |
| } |
| } else { |
| copy { |
| from './properties/oauth/' |
| into 'src/main/resources/' |
| include '*.properties' |
| } |
| } |
| } else { |
| if(project.hasProperty('twofactor') && project.getProperty('twofactor') == 'enabled') { |
| copy { |
| from './properties/basicauth/twofactor/' |
| into 'src/main/resources/' |
| include '*.properties' |
| } |
| } else { |
| copy { |
| from './properties/basicauth/' |
| into 'src/main/resources/' |
| include '*.properties' |
| } |
| } |
| } |
| |
| // Configuration for the modernizer plugin |
| // https://github.com/andygoossens/gradle-modernizer-plugin |
| modernizer { |
| ignoreClassNamePatterns = [ |
| '.*AbstractPersistableCustom', |
| '.*EntityTables' |
| ] |
| } |
| |
| compileJava { |
| dependsOn rat |
| finalizedBy resolve |
| } |
| |
| war { |
| from("$rootDir/licenses/binary/") { |
| // notice the parens |
| into "WEB-INF/licenses/binary/" // no leading slash |
| } |
| from("$rootDir/LICENSE_RELEASE") { |
| // notice the parens |
| into "WEB-INF/" // no leading slash |
| } |
| from("$rootDir/NOTICE_RELEASE") { |
| // notice the parens |
| into "WEB-INF/" // no leading slash |
| } |
| rename ('LICENSE_RELEASE', 'LICENSE') |
| rename ('NOTICE_RELEASE', 'NOTICE') |
| |
| from("$rootDir/DISCLAIMER") { |
| // notice the parens |
| into "WEB-INF/" // no leading slash |
| } |
| enabled = true |
| } |
| |
| // Configuration for the Gradle Cargo plugin |
| // https://github.com/bmuschko/gradle-cargo-plugin |
| configurations |
| { |
| tomcat |
| } |
| |
| dependencies { |
| tomcat "org.apache.tomcat:tomcat:9.0.39@zip" |
| } |
| |
| cargo { |
| containerId "tomcat9x" |
| |
| // looks like Cargo doesn't detect the WAR file automatically in the multi-module setup |
| deployable { |
| file = file("${buildDir}/libs/fineract-provider.war") |
| context = 'fineract-provider' |
| } |
| |
| local { |
| installer { |
| installConfiguration = configurations.tomcat |
| downloadDir = file("$buildDir/download") |
| extractDir = file("$buildDir/tomcat") |
| } |
| startStopTimeout = 240000 |
| containerProperties { |
| property 'cargo.tomcat.connector.keystoreFile', file('src/main/resources/keystore.jks') |
| property 'cargo.tomcat.connector.keystorePass', 'openmf' |
| property 'cargo.tomcat.httpSecure', true |
| property 'cargo.tomcat.connector.sslProtocol', 'TLS' |
| property 'cargo.tomcat.connector.clientAuth', false |
| property 'cargo.protocol', 'https' |
| property 'cargo.servlet.port', 8443 |
| } |
| } |
| } |
| |
| cargoRunLocal.dependsOn war |
| cargoStartLocal.dependsOn war |
| cargoStartLocal.mustRunAfter "integrationTestClasses" |
| cargoStartLocal.mustRunAfter "enhance" |
| cargoStartLocal.mustRunAfter "resolve" |
| |
| /* 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 |
| |
| /* Exclude maria db related files for non dev builds */ |
| if (!(project.hasProperty('env') && project.getProperty('env') == 'dev')) { |
| sourceSets { |
| main { |
| java { |
| exclude '**/ServerWithMariaDB*' |
| exclude '**/MariaDB4j*' |
| } |
| } |
| test { |
| java { |
| exclude '**/core/boot/tests/**' |
| } |
| } |
| } |
| } |
| |
| task integrationTest(type:Test) { |
| description = "Run integration tests (located in src/integrationTest/java). Starts Tomcat in daemon mode before executing the tests (and stops it after)." |
| dependsOn cargoStartLocal |
| finalizedBy cargoStopLocal |
| |
| testClassesDirs = project.sourceSets.integrationTest.output.classesDirs |
| classpath = project.sourceSets.integrationTest.runtimeClasspath |
| } |
| |
| integrationTest { |
| useJUnitPlatform() |
| testLogging { |
| // FINERACT-927 |
| events "skipped", "failed" |
| showStandardStreams = false |
| exceptionFormat "full" |
| } |
| } |
| test { |
| useJUnitPlatform() |
| testLogging { |
| // FINERACT-927 |
| events "skipped", "failed" |
| showStandardStreams = false |
| exceptionFormat "full" |
| } |
| } |
| |
| // Configuration for SQL tasks |
| // https://docs.groovy-lang.org/latest/html/api/groovy/sql/Sql.html |
| import groovy.sql.Sql |
| |
| project.ext.mysqlUser='root' |
| project.ext.mysqlPassword='mysql' |
| |
| configurations { |
| driver |
| } |
| dependencies { |
| driver 'org.drizzle.jdbc:drizzle-jdbc:1.4' |
| } |
| |
| URLClassLoader loader = GroovyObject.class.classLoader |
| configurations.driver.each {File file -> |
| loader.addURL(file.toURL()) |
| } |
| |
| task createDB { |
| description= "Creates the Database. Needs database name to be passed (like: -PdbName=someDBname)" |
| doLast { |
| def sql = Sql.newInstance( 'jdbc:mysql:thin://localhost:3306/', mysqlUser, mysqlPassword, 'org.drizzle.jdbc.DrizzleDriver' ) |
| sql.execute( 'create database '+"`$dbName`" ) |
| } |
| } |
| |
| task dropDB { |
| description= "Drops the specified database. The database name has to be passed (like: -PdbName=someDBname)" |
| doLast { |
| def sql = Sql.newInstance( 'jdbc:mysql:thin://localhost:3306/', mysqlUser, mysqlPassword, 'org.drizzle.jdbc.DrizzleDriver' ) |
| sql.execute( 'DROP DATABASE '+"`$dbName`") |
| } |
| } |
| task setBlankPassword { |
| doLast { |
| def sql = Sql.newInstance( 'jdbc:mysql:thin://localhost:3306/', mysqlUser, mysqlPassword, 'org.drizzle.jdbc.DrizzleDriver' ) |
| sql.execute('USE `fineract_tenants`') |
| sql.execute('UPDATE fineract_tenants.tenants SET schema_server = \'localhost\', schema_server_port = \'3306\', schema_username = \'mifos\', schema_password = \'mysql\' WHERE id=1;') |
| } |
| } |
| |
| bootRun { |
| jvmArgs = [ |
| "-Dspring.output.ansi.enabled=ALWAYS" |
| ] |
| } |
| |
| springBoot { |
| mainClassName = 'org.apache.fineract.ServerApplication' |
| } |
| |
| bootJar { |
| duplicatesStrategy = DuplicatesStrategy.EXCLUDE |
| } |
| |
| bootWar { |
| enabled = false |
| } |
| |
| tasks.withType(Tar) { |
| compression Compression.GZIP |
| extension 'tar.gz' |
| } |
| |
| distributions { |
| binary { |
| baseName "apache-fineract-$releaseVersion-binary" |
| contents { |
| from bootJar |
| from war |
| // TODO: @vidakovic add client library |
| from("$rootDir/licenses/binary/") { |
| into "licenses/binary/" |
| } |
| from "$rootDir/LICENSE_RELEASE" |
| from "$rootDir/NOTICE_RELEASE" |
| rename ('LICENSE_RELEASE', 'LICENSE') |
| rename ('NOTICE_RELEASE', 'NOTICE') |
| |
| from "$rootDir/DISCLAIMER" |
| from "$rootDir/README.md" |
| } |
| } |
| src { |
| baseName "apache-fineract-$releaseVersion-src" |
| contents { |
| from "$rootDir/" |
| exclude '**/build' , '.git', '.gradle', '.github', '.settings', '.project', '.classpath', '.idea', 'out', '._.DS_Store', '.DS_Store', 'WebContent', '.externalToolbuilders', '.theia', '.gitpod.yml', '.travis.yml', 'LICENSE_RELEASE', 'NOTICE_RELEASE', '**/licenses/binary' |
| rename ('LICENSE_SOURCE', 'LICENSE') |
| rename ('NOTICE_SOURCE', 'NOTICE') |
| } |
| } |
| } |
| |
| tasks.binaryDistZip.enabled false |
| tasks.srcDistZip.enabled false |
| |
| // create signatures and checksums only if project parameter "fineract.release" is provided on the command line |
| if( project.hasProperty("fineract.release") ) { |
| signing { |
| useGpgCmd() |
| sign (binaryDistTar, srcDistTar) |
| } |
| tasks.withType(Tar) { task -> |
| task.doLast { |
| ant.checksum file: task.archivePath, algorithm: 'SHA-512', fileext: '.sha512' |
| } |
| } |
| tasks.withType(Sign) { task -> |
| task.doLast { |
| task.getFilesToSign().each { f -> |
| new ByteArrayOutputStream().withStream { os -> |
| def result = exec { |
| workingDir "$buildDir/distributions" |
| executable 'sh' |
| args '-c', "gpg --verify ${f}.asc" |
| standardOutput = os |
| } |
| if(result.exitValue==0) { |
| println '+++ GPG signature correct!' |
| } else { |
| println '--- GPG signature incorrect!' |
| throw new RuntimeException('--- GPG signature incorrect!') |
| } |
| } |
| } |
| } |
| } |
| } |
| |
| // Configuration for git properties gradle plugin |
| // https://github.com/n0mer/gradle-git-properties |
| gitProperties { |
| gitPropertiesResourceDir = "$buildDir/classes/java/main/resources" |
| dateFormat = "yyyy-MM-dd'T'HH:mmZ" |
| dateFormatTimeZone = "GMT" |
| failOnNoGitDirectory = false |
| extProperty = 'gitProps' |
| } |
| |
| // make sure the generateGitProperties task always executes (even when git.properties is not changed) |
| generateGitProperties.outputs.upToDateWhen { false } |