/** * 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 = '''\ Run as: gradle clean tomcatrunwar ''' project.ext.jerseyVersion = '1.17' buildscript { ext { openJPAVersion = '3.1.0' jacocoVersion = '0.8.5' } repositories { jcenter() mavenCentral() maven { url "https://plugins.gradle.org/m2/" } } dependencies { classpath 'io.spring.gradle:dependency-management-plugin:1.0.9.RELEASE' classpath 'com.bmuschko:gradle-tomcat-plugin:2.5', 'nl.javadude.gradle.plugins:license-gradle-plugin:0.11.0', 'org.zeroturnaround:gradle-jrebel-plugin:1.1.2', 'org.springframework.boot:spring-boot-gradle-plugin:2.2.4.RELEASE' // below classpath "org.apache.openjpa:openjpa:$openJPAVersion" classpath 'com.radcortez.gradle:openjpa-gradle-plugin:3.1.0' classpath 'gradle.plugin.org.nosphere.apache:creadur-rat-gradle:0.2.2' classpath "com.github.spotbugs:spotbugs-gradle-plugin:2.0.1" // Use Guava version 23+ as a workaround to spotbug intergration. // See: https://github.com/spotbugs/spotbugs-gradle-plugin/issues/128#issuecomment-535864882 classpath 'com.google.guava:guava:28.1-jre' classpath "gradle.plugin.com.github.andygoossens:gradle-modernizer-plugin:1.3.0" } } apply plugin: 'io.spring.dependency-management' apply plugin: "org.nosphere.apache.rat" apply plugin: 'rebel' apply plugin: 'license' apply plugin: 'war' apply plugin: 'org.springframework.boot' apply plugin: 'eclipse' apply plugin: 'idea' apply plugin: 'com.bmuschko.tomcat' apply plugin: 'project-report' apply plugin: 'java-library' apply plugin: 'openjpa' apply plugin: "com.github.spotbugs" apply plugin: 'checkstyle' apply plugin: 'com.github.andygoossens.gradle-modernizer-plugin' apply plugin: 'jacoco' // apply plugin: 'pmd' dependencyManagement { imports { mavenBom 'org.springframework:spring-framework-bom:5.2.3.RELEASE' } dependencies { dependency 'org.springframework.security.oauth:spring-security-oauth2:2.3.6.RELEASE' dependency 'org.apache.openjpa:openjpa:3.1.0' dependency 'com.squareup.retrofit:retrofit:1.6.1' dependency 'com.squareup.okhttp:okhttp:2.0.0' dependency 'com.squareup.okhttp:okhttp-urlconnection:2.0.0' dependency 'com.google.code.gson:gson:+' dependency 'com.google.guava:guava:28.1-jre' dependency 'joda-time:joda-time:+' dependency 'org.apache.commons:commons-email:1.3.3' dependency 'org.apache.commons:commons-lang3:+' dependency 'org.drizzle.jdbc:drizzle-jdbc:1.4' dependency 'com.lowagie:itext:2.1.7' dependency 'com.lowagie:itext-rtf:2.1.7' dependency 'org.mnode.ical4j:ical4j:1.0.4' dependency 'com.googlecode.flyway:flyway-core:2.1.1' dependency 'org.quartz-scheduler:quartz:+' dependency 'com.amazonaws:aws-java-sdk-s3:1.11.80' dependency 'net.sf.ehcache:ehcache:+' dependency 'com.github.spullara.mustache.java:compiler:0.8.12' dependency 'com.jayway.jsonpath:json-path:0.9.1' dependency 'org.apache.tika:tika-core:1.9' dependency 'org.apache.httpcomponents:httpclient:+' dependency 'io.swagger:swagger-jersey-jaxrs:1.5.15' dependency 'org.springframework:spring-jms:4.0.7.RELEASE' dependency 'org.apache.activemq:activemq-broker:+' dependency 'javax.validation:validation-api:+' dependency 'org.apache.bval:org.apache.bval.bundle:2.0.2' dependencySet(group: 'io.rest-assured', version: '3.3.0'){ entry 'rest-assured' } dependency 'junit:junit:+' //dependency 'junit:junit-dep:4.11' dependency 'org.mockito:mockito-core:+' dependency 'org.slf4j:slf4j-simple:1.7.30' dependency 'com.mockrunner:mockrunner-jms:2.0.1' dependency 'com.mockrunner:mockrunner-jdbc:2.0.1' 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: '3.9') { entry 'poi' entry 'poi-ooxml' entry 'poi-ooxml-schemas' } dependencySet(group: 'org.apache.tomcat.embed', version: '7.0.94') { entry 'tomcat-embed-core' entry 'tomcat-embed-jasper' entry 'tomcat-embed-logging-log4j' } } } /* define the valid syntax level for source files */ sourceCompatibility = JavaVersion.VERSION_1_8 /* define binary compatibility version */ targetCompatibility = JavaVersion.VERSION_1_8 project.ext.mysqlUser='root' project.ext.mysqlPassword='mysql' group = 'org.apache.fineract' buildDir = new File(rootProject.projectDir, "../build") repositories { jcenter() // mavenLocal() // useful for local dev using MariaDB4j SNAPSHOTs (not needed for real-world non-SNAPHOT builds) } openjpa { includes = ['**/AbstractPersistableCustom.class', '**/domain/*.class'] enhance { enforcePropertyRestrictions true } } jacoco { toolVersion = jacocoVersion reportsDir = file("$buildDir/reports/jacoco") } jacocoTestReport{ reports{ html.enabled=true xml.enabled=true html.destination file("${buildDir}/code-coverage") } } rat { xmlOutput = false htmlOutput = false plainOutput = true verbose = false // inputDir = './..' reportDir = new File(buildDir,'reports/rat') excludes = [ '**/licenses/**', '**/*.md', '**/*.github/**', '**/MANIFEST.MF', '**/*.json', '**/*.txt', '**/*.log', '**/fineractdev-eclipse-preferences.epf', '**/template-expected.html', '**/template.mustache', '**/.classpath', '**/.project', '**/.idea/**', '**/*.ipr', '**/*.iws', '**/.settings/**', '**/bin/**', '**/.git/**', '**/.gitignore', '**/.gitkeep', '**/*.iml', //Notice files '**/NOTICE_RELEASE', '**/NOTICE_SOURCE', // Swagger License '**/src/main/resources/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/**' ] } 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 all*.exclude group: 'commons-logging' all*.exclude module: 'jul-to-slf4j' // see FINERACT-700 re. ClassCircularityError: java/util/logging/LogRecord } /* Pick up dependencies based on the environemnt, 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' } } } modernizer { includeTestClasses = true failOnViolations = true violationLogLevel="error" javaVersion = project.targetCompatibility ignorePackages = [] ignoreClassNamePatterns = [ '.*AbstractPersistableCustom' ] ignoreGeneratedClasses = true exclusions = [] exclusionPatterns = [ // To be removed when https://issues.apache.org/jira/browse/FINERACT-826 is fixed 'org/joda/time/.*' ] } task dist(type:Zip){ baseName = 'fineractplatform' version = qualifyVersionIfNecessary(releaseVersion) includeEmptyDirs = true from('../') { fileMode = 0755 include '*.md' } from('src/main/dist') { fileMode = 0755 include '*' } from('../apps') { fileMode = 0755 include '**/*' into('apps') } from('../api-docs/') { fileMode = 0755 include '*' into('api-docs') } from('../fineract-db/') { fileMode = 0755 include '*.sql' into('database') } from('src/main/resources/sql/migrations') { fileMode = 0755 include '**/*' into('database/migrations') } from war.outputs.files into(baseName + '-' + version) } compileJava{ dependsOn rat } /* pmd { sourceSets = [sourceSets.main] } */ war { from('../licenses/binary/') { // notice the parens into "WEB-INF/licenses/binary/" // no leading slash } from('../LICENSE_RELEASE') { // notice the parens into "WEB-INF/" // no leading slash } from('../NOTICE_RELEASE') { // notice the parens into "WEB-INF/" // no leading slash } rename ('LICENSE_RELEASE', 'LICENSE') rename ('NOTICE_RELEASE', 'NOTICE') from('../DISCLAIMER') { // notice the parens into "WEB-INF/" // no leading slash } war.finalizedBy(bootWar) } license { header rootProject.file('../APACHE_LICENSETEXT.md') excludes(["**/*.html", "**/*.mustache", "**/package-info.java", "**/keystore.jks", "**/swagger-ui/**"]) strictCheck true } task licenseFormatBuildScripts (type:nl.javadude.gradle.plugins.license.License) { source = fileTree(dir: '../', includes: ['**/*.bat', '**/*.sh', '**/*.sql']) } licenseFormat.dependsOn licenseFormatBuildScripts tomcatRun { httpPort = 8080 httpsPort = 8443 stopPort = 8081 stopKey= 'stopKey' enableSSL = true } tomcatRunWar { httpPort = 8080 httpsPort = 8443 stopPort = 8081 stopKey= 'stopKey' enableSSL = true keystoreFile = file('src/main/resources/keystore.jks') keystorePass = 'openmf' } task tomcatRunWarAsDaemonForIntegrationTest(type: com.bmuschko.gradle.tomcat.tasks.TomcatRunWar) { httpPort = 8080 httpsPort = 8443 stopPort = 8081 stopKey= 'stopKey' enableSSL = true keystoreFile = file('src/main/resources/keystore.jks') keystorePass = 'openmf' daemon = true } task tomcatStopAfterIntegrationTest(type: com.bmuschko.gradle.tomcat.tasks.TomcatStop) { stopPort = 8081 stopKey = 'stopKey' } /* 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 and embedded tomcat related files for non dev builds */ if (!(project.hasProperty('env') && project.getProperty('env') == 'dev')) { sourceSets { main { java { exclude '**/Server*' exclude '**/MariaDB4j*' exclude '**/EmbeddedTomcatWithSSLConfiguration.java' } } test { java { exclude '**/core/boot/tests/**' } } } } sourceSets { integrationTest { compileClasspath += main.output + test.output runtimeClasspath += main.output + test.output } } configurations { integrationTestCompile.extendsFrom testCompile integrationTestRuntime.extendsFrom testRuntime } 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 war dependsOn tomcatRunWarAsDaemonForIntegrationTest tasks.findByName('tomcatRunWarAsDaemonForIntegrationTest').mustRunAfter 'war' finalizedBy tomcatStopAfterIntegrationTest testClassesDirs = project.sourceSets.integrationTest.output.classesDirs classpath = project.sourceSets.integrationTest.runtimeClasspath } import com.github.spotbugs.SpotBugsTask import groovy.sql.Sql repositories { mavenCentral() } configurations { driver } dependencies { driver 'org.drizzle.jdbc:drizzle-jdbc:1.4' checkstyle 'com.puppycrawl.tools:checkstyle:8.28' checkstyle 'com.github.sevntu-checkstyle:sevntu-checks:1.36.0' } 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;') } } /* * Support publication of artifacts versioned by topic branch. * CI builds supply `-P BRANCH_NAME=` to gradle at build time. * If starts with 'MIFOSX-', change version * from BUILD-SNAPSHOT => -SNAPSHOT * e.g. 1.1.0.BUILD-SNAPSHOT => 1.0.0.MIFOSX-1234-SNAPSHOT */ def qualifyVersionIfNecessary(version) { if (rootProject.hasProperty("BRANCH_NAME")) { def qualifier = rootProject.getProperty("BRANCH_NAME") if (qualifier.startsWith("MIFOSX-")) { return version.replace('BUILD', qualifier) } } return version } springBoot { mainClassName = 'org.apache.fineract.ServerWithMariaDB4jApplication' } bootWar { mainClassName = 'org.apache.fineract.ServerWithMariaDB4jApplication' } // To generate an HTML report instead of XML tasks.withType(SpotBugsTask) { reports.xml.enabled = false reports.html.enabled = true reportLevel = "high" }