No functional changes, set the svn;properties of build.gradle. I'll also do for other *.gradle files soon

git-svn-id: https://svn.apache.org/repos/asf/ofbiz/trunk@1754230 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/build.gradle b/build.gradle
index 5360c12..1413d86 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,871 +1,871 @@
-/*

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

- */

-import org.apache.tools.ant.filters.ReplaceTokens

-

-/* ========================================================

- * Project setup

- * ======================================================== */

-

-apply plugin: 'java'

-apply plugin: 'eclipse'

-

-apply from: 'common.gradle'

-

-// java settings

-def jvmArguments = ['-Xms128M', '-Xmx512M']

-ext.ofbizMainClass = 'org.apache.ofbiz.base.start.Start'

-javadoc.failOnError = false

-sourceCompatibility = '1.8'

-targetCompatibility = '1.8'

-

-// root and subproject settings

-defaultTasks 'build'

-

-allprojects {

-    repositories{

-        jcenter()

-    }

-}

-

-subprojects {

-    configurations {

-        // compile-time plugin libraries

-        pluginLibsCompile

-        // runtime plugin libraries

-        pluginLibsRuntime

-    }

-}

-

-configurations {

-    junitLibs

-}

-

-dependencies {

-    // general framework compile libs

-    compile 'apache-xerces:resolver:2.9.1'

-    compile 'apache-xerces:xercesImpl:2.9.1'

-    compile 'avalon-framework:avalon-framework-impl:4.2.0'

-    compile 'bouncycastle:bouncycastle-jce-jdk13:112'

-    compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.0'

-    compile 'com.fasterxml.jackson.core:jackson-core:2.4.2'

-    compile 'com.google.guava:guava:19.0'

-    compile 'com.google.zxing:core:3.2.1'

-    compile 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.0'

-    compile 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20160628.1'

-    compile 'com.ibm.icu:icu4j:57.1'

-    compile 'com.lowagie:itext:2.1.7'

-    compile 'com.sun.mail:javax.mail:1.5.1'

-    compile 'com.sun.syndication:com.springsource.com.sun.syndication:0.9.0'

-    compile 'com.thoughtworks.xstream:xstream:1.4.9'

-    compile 'commons-beanutils:commons-beanutils-core:1.8.3'

-    compile 'commons-cli:commons-cli:1.3.1'

-    compile 'commons-codec:commons-codec:1.10'

-    compile 'commons-el:commons-el:1.0'

-    compile 'commons-fileupload:commons-fileupload:1.3.1'

-    compile 'commons-io:commons-io:2.4'

-    compile 'commons-logging:commons-logging:1.2'

-    compile 'commons-net:commons-net:3.3'

-    compile 'commons-validator:commons-validator:1.5.1'

-    compile 'de.odysseus.juel:juel-impl:2.2.7'

-    compile 'de.odysseus.juel:juel-spi:2.2.7'

-    compile 'httpunit:httpunit:1.7'

-    compile 'javax.el:javax.el-api:3.0.1-b04'

-    compile 'javax.servlet:javax.servlet-api:3.1.0'

-    compile 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.0'

-    compile 'javolution:javolution:5.4.3'

-    compile 'junit:junit-dep:4.10'

-    compile 'jython:jython:2.1'

-    compile 'net.fortuna.ical4j:ical4j:1.0-rc3-atlassian-11'

-    compile 'net.sf.barcode4j:barcode4j-fop-ext-complete:2.0'

-    compile 'net.sf.dozer:dozer:4.2.1'

-    compile 'net.sf.ezmorph:ezmorph:0.9.1'

-    compile 'net.sourceforge.nekohtml:nekohtml:1.9.16'

-    compile 'org.apache.ant:ant-apache-bsf:1.9.0'

-    compile 'org.apache.ant:ant-junit:1.9.0'

-    compile 'org.apache.ant:ant-launcher:1.9.0'

-    compile 'org.apache.axis2:axis2-adb:1.7.1'

-    compile 'org.apache.axis2:axis2-kernel:1.7.1'

-    compile 'org.apache.axis2:axis2-transport-http:1.7.1'

-    compile 'org.apache.axis2:axis2-transport-local:1.7.1'

-    compile 'org.apache.bsf:com.springsource.org.apache.bsf:2.4.0'

-    compile 'org.apache.commons:commons-collections4:4.1'

-    compile 'org.apache.commons:commons-compress:1.11'

-    compile 'org.apache.commons:commons-csv:1.1'

-    compile 'org.apache.commons:commons-dbcp2:2.1'

-    compile 'org.apache.commons:commons-pool2:2.3'

-    compile 'org.apache.derby:derby:10.11.1.1'

-    compile 'org.apache.geronimo.components:geronimo-transaction:3.1.1'

-    compile 'org.apache.geronimo.specs:geronimo-activation_1.0.2_spec:1.0'

-    compile 'org.apache.geronimo.specs:geronimo-j2ee-connector_1.5_spec:2.0.0'

-    compile 'org.apache.geronimo.specs:geronimo-jaxr_1.0_spec:1.0'

-    compile 'org.apache.geronimo.specs:geronimo-jaxrpc_1.1_spec:1.1'

-    compile 'org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1'

-    compile 'org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1'

-    compile 'org.apache.geronimo.specs:geronimo-saaj_1.3_spec:1.1'

-    compile 'org.apache.httpcomponents:httpclient-cache:4.4.1'

-    compile 'org.apache.httpcomponents:httpcore:4.4.1'

-    compile 'org.apache.logging.log4j:log4j-1.2-api:2.3'

-    compile 'org.apache.logging.log4j:log4j-api:2.3'

-    compile 'org.apache.logging.log4j:log4j-core:2.3'

-    compile 'org.apache.logging.log4j:log4j-nosql:2.3'

-    compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.3'

-    compile 'org.apache.neethi:neethi:3.0.3'

-    compile 'org.apache.pdfbox:fontbox:1.8.11'

-    compile 'org.apache.pdfbox:jempbox:1.8.11'

-    compile 'org.apache.pdfbox:pdfbox:1.8.12'

-    compile 'org.apache.poi:poi:3.14'

-    compile 'org.apache.servicemix.bundles:org.apache.servicemix.bundles.xpp3:1.1.4c_7'

-    compile 'org.apache.shiro:shiro-core:1.2.5'

-    compile 'org.apache.tika:tika-core:1.12'

-    compile 'org.apache.tika:tika-parsers:1.12'

-    compile 'org.apache.tomcat:tomcat-annotations-api:7.0.54'

-    compile 'org.apache.tomcat:tomcat-api:8.0.33'

-    compile 'org.apache.tomcat:tomcat-catalina-ha:8.0.33'

-    compile 'org.apache.tomcat:tomcat-catalina:8.0.33'

-    compile 'org.apache.tomcat:tomcat-coyote:8.0.33'

-    compile 'org.apache.tomcat:tomcat-jasper:8.0.33'

-    compile 'org.apache.tomcat:tomcat-jni:8.0.33'

-    compile 'org.apache.tomcat:tomcat-tribes:8.0.33'

-    compile 'org.apache.tomcat:tomcat-util-scan:8.0.33'

-    compile 'org.apache.tomcat:tomcat-util:8.0.33'

-    compile 'org.apache.tomcat.embed:tomcat-embed-websocket:8.0.33'

-    compile 'org.apache.tomcat.extras:tomcat-extras-juli-adapters:8.0.33'

-    compile 'org.apache.tomcat.extras:tomcat-extras-juli:8.0.33'

-    compile 'org.apache.woden:woden-core:1.0M10'

-    compile 'org.apache.ws.commons.axiom:axiom-api:1.2.17'

-    compile 'org.apache.ws.commons.axiom:axiom-impl:1.2.17'

-    compile 'org.apache.ws.commons.util:ws-commons-util:1.0.2'

-    compile 'org.apache.ws.xmlschema:xmlschema-core:2.2.1'

-    compile 'org.apache.xalan:com.springsource.org.apache.xml.serializer:2.7.1'

-    compile 'org.apache.xmlgraphics:fop:2.1'

-    compile 'org.apache.xmlgraphics:xmlgraphics-commons:2.1'

-    compile 'org.apache.xmlrpc:xmlrpc-client:3.1.2'

-    compile 'org.apache.xmlrpc:xmlrpc-common:3.1.2'

-    compile 'org.apache.xmlrpc:xmlrpc-server:3.1.2'

-    compile 'org.codeartisans.thirdparties.swing:batik-all:1.8pre-r1084380'

-    compile 'org.codehaus.groovy:groovy-all:2.4.5'

-    compile 'org.dom4j:com.springsource.org.dom4j:1.6.1'

-    compile 'org.eclipse.jdt.core.compiler:ecj:4.5'

-    compile 'org.freemarker:freemarker:2.3.24-incubating'

-    compile 'org.hamcrest:hamcrest-all:1.3'

-    compile 'org.jdom:jdom:1.1'

-    compile 'org.lucee:commons-lang:2.6.0'

-    compile 'org.owasp.esapi:esapi:2.1.0'

-    compile 'org.slf4j:slf4j-api:1.6.4'

-    compile 'org.springframework:spring-core:4.2.3.RELEASE'

-    compile 'org.springframework:spring-test:4.2.3.RELEASE'

-    compile 'org.zapodot:jackson-databind-java-optional:2.4.2'

-    compile 'oro:oro:2.0.8'

-    compile 'ws-commons-java5:ws-commons-java5:1.0.1'

-    compile 'wsdl4j:wsdl4j:1.6.2'

-    compile 'xalan:xalan:2.7.2'

-    compile 'xml-apis:xml-apis-ext:1.3.04'

-    compile 'xml-apis:xml-apis:1.4.01'

-

-    // general framework runtime libs

-    runtime 'mysql:mysql-connector-java:5.1.36'

-    runtime 'postgresql:postgresql:9.0-801.jdbc4'

-

-    // plugin libs

-    subprojects.each { subProject ->

-        compile project(path: subProject.path, configuration: 'pluginLibsCompile')

-        runtime project(path: subProject.path, configuration: 'pluginLibsRuntime')

-    }

-

-    // libs needed for junitreport

-    junitLibs 'junit:junit:4.12'

-    junitLibs 'org.apache.ant:ant-junit:1.9.7'

-    junitLibs 'org.apache.ant:ant-junit4:1.9.7'

-

-    // local libs

-    getDirectoryInActiveComponentsIfExists('lib').each { libDir ->

-        compile fileTree(dir: libDir, include: '**/*.jar')

-    }

-    runtime files("${rootDir}/build/libs/ofbiz-base-test.jar")

-}

-

-def excludedJavaSources = []

-excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/cybersource/IcsPaymentServices.java'

-excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/ideal/IdealEvents.java'

-excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/ideal/IdealPaymentServiceTest.java'

-excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/orbital/OrbitalPaymentServices.java'

-excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/paypal/PayPalServices.java'

-excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/securepay/SecurePayPaymentServices.java'

-excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/securepay/SecurePayServiceTest.java'

-excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/verisign/PayflowPro.java'

-excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeByteArrayInputStream.java'

-excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeByteArrayOutputStream.java'

-excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeServices.java'

-excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeWorker.java'

-excludedJavaSources.add 'org/apache/ofbiz/content/report/JREntityListIteratorDataSource.java'

-excludedJavaSources.add 'org/apache/ofbiz/content/report/JRMapCollectionDataSource.java'

-excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareException.java'

-excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareServices.java'

-excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareUTL.java'

-excludedJavaSources.add 'ShipmentScaleApplet.java'

-excludedJavaSources.add 'org/apache/ofbiz/securityext/thirdparty/truition/TruitionCoReg.java'

-excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsJXlsViewHandler.java'

-excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsPdfViewHandler.java'

-excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsPoiXlsViewHandler.java'

-excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsXmlViewHandler.java'

-

-sourceSets {

-    main {

-        java {

-            srcDirs = getDirectoryInActiveComponentsIfExists('src/main/java')

-            exclude excludedJavaSources

-        }

-        resources {

-            srcDirs = getDirectoryInActiveComponentsIfExists('src/main/java')

-            srcDirs += getDirectoryInActiveComponentsIfExists('config')

-            exclude excludedJavaSources

-        }

-    }

-

-    test {

-        java {

-            srcDirs = getDirectoryInActiveComponentsIfExists('src/test/java')

-        }

-        resources {

-            srcDirs = getDirectoryInActiveComponentsIfExists('src/test/java')

-        }

-    }

-}

-

-jar {

-    manifest {

-        attributes(

-            "Implementation-Title": project.name,

-            "Main-Class": ofbizMainClass,

-            "Class-Path": getJarManifestClasspathForCurrentOs()

-        )

-    }

-}

-

-// Eclipse plugin settings

-eclipse.classpath.file.whenMerged { classpath ->

-    /* The code inside this block removes unnecessary entries

-     * in the .classpath file which are generated automatically

-     * due to the settings in the sourceSets block

-     */

-    def osName = System.getProperty('os.name').toLowerCase()

-    def osDirSeparator = osName.contains('windows') ? '\\' : '/'

-

-    iterateOverActiveComponents { component ->

-        def componentName = component.toString() - rootDir.toString()

-        classpath.entries.removeAll { entry ->

-            // remove any "src" entries in .classpath of the form /componentName

-            entry.kind == 'src' &&

-            entry.path ==~ '.*/+(' + componentName.tokenize(osDirSeparator).last() + ')$'

-        }

-    }

-    classpath.entries.removeAll { entry ->

-        /* remove "src" entries in .classpath named:

-         *   /framework, /applications, /specialpurpose and /hot-deploy

-         */

-        entry.kind == 'src' &&

-            entry.path ==~ /(\/+framework)$/ ||

-            entry.path ==~ /(\/+applications)$/ ||

-            entry.path ==~ /(\/+specialpurpose)$/ ||

-            entry.path ==~ /(\/+hot-deploy)$/

-    }

-    getDirectoryInActiveComponentsIfExists('config').each { configDir ->

-        /* remove any "src" entries in .classpath of the form componentName/config

-         *

-         * windows format: \framework\base\config

-         * Unix format: /framework/base/config

-         * .classpath format: framework/base/config

-         *

-         * Must convert both windows and unix to .classpath format to

-         * be able to remove it from the file

-         */

-        def relativeDir = configDir.toString() - rootDir.toString() - osDirSeparator

-        def eclipseConfigSrc = osName.contains('windows') ? relativeDir.replaceAll("\\\\", "/") : relativeDir

-        classpath.entries.removeAll { entry ->

-            entry.kind == 'src' &&

-            entry.path == eclipseConfigSrc

-        }

-    }

-}

-tasks.eclipse.dependsOn(cleanEclipse)

-

-/* ========================================================

- * Tasks

- * ======================================================== */

-

-// ========== Task group labels ==========

-def cleanupGroup = 'Cleaning'

-def ofbizServer = 'OFBiz Server'

-def sysadminGroup = 'System Administration'

-def committerGroup = 'OFBiz committers'

-

-// ========== OFBiz Server tasks ==========

-

-task loadDefault(group: ofbizServer) {

-    dependsOn 'ofbiz --load-data'

-    description 'Load default data; meant for OFBiz development, testing, and demo purposes'

-}

-

-task testIntegration(group: ofbizServer) {

-    dependsOn 'ofbiz --test'

-    description 'Run OFBiz integration tests; You must run loadDefault before running this task'

-}

-

-task start(group: ofbizServer) {

-    dependsOn 'ofbiz --start'

-    description 'Start an OFBiz instance'

-}

-

-task stop(group: ofbizServer) {

-    dependsOn 'ofbiz --shutdown'

-    description 'Stop currently running instance'

-}

-

-task terminateOfbiz(group: ofbizServer,

-    description: 'Force termination of any running OFBiz servers, only use if \"--shutdown\" command fails') << {

-    def os = System.getProperty("os.name").toLowerCase()

-    if (os.contains("windows")) {

-        Runtime.getRuntime().exec("wmic process where \"CommandLine Like \'%org.apache.ofbiz.base.start.Start%\'\" Call Terminate")

-    } else {

-        def processOutput = new ByteArrayOutputStream()

-        exec {

-            commandLine 'ps', 'ax'

-            standardOutput = processOutput

-        }

-        processOutput.toString().split(System.lineSeparator()).each { line ->

-            if(line ==~ /.*org\.apache\.ofbiz\.base\.start\.Start.*/) {

-                exec { commandLine 'kill', '-9', line.tokenize().first() }

-            }

-        }

-    }

-}

-

-task loadAdminUserLogin(group: ofbizServer) {

-    description 'Create admin user with temporary password equal to ofbiz. You must provide userLoginId'

-    createOfbizCommandTask('executeLoadAdminUser',

-        ['--load-data', 'file=/runtime/tmp/AdminUserLoginData.xml'],

-        jvmArguments, false)

-    executeLoadAdminUser.doFirst {

-        copy {

-            from ("${rootDir}/framework/resources/templates/AdminUserLoginData.xml") {

-                filter(ReplaceTokens, tokens: [userLoginId: userLoginId])

-            }

-            into "${rootDir}/runtime/tmp/"

-        }

-    }

-    dependsOn executeLoadAdminUser

-    doLast {

-        delete("${rootDir}/runtime/tmp/AdminUserLoginData.xml")

-    }

-}

-

-task loadTenant(group: ofbizServer, description: 'Load data using tenantId') {

-

-    createOfbizCommandTask('executeLoadTenant', [], jvmArguments, false)

-

-    if(project.hasProperty('tenantId')) {

-        executeLoadTenant.args '--load-data'

-        executeLoadTenant.args "delegator=default#${tenantId}"

-    }

-    if(project.hasProperty('tenantReaders')) {

-        executeLoadTenant.args '--load-data'

-        executeLoadTenant.args "readers=${tenantReaders}"

-    }

-    if(project.hasProperty('tenantComponent')) {

-        executeLoadTenant.args '--load-data'

-        executeLoadTenant.args "component=${tenantComponent}"

-    }

-

-    doLast {

-        if(!project.hasProperty('tenantId')) {

-            throw new GradleException('Missing project property tenantId')

-        }

-    }

-    dependsOn executeLoadTenant

-}

-

-task createTenant(group: ofbizServer, description: 'Create a new tenant in your environment') {

-

-    def databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Derby.xml"

-

-    task prepareAndValidateTenantArguments << {

-        if(!project.hasProperty('tenantId')) {

-            throw new GradleException('Project property tenantId is missing')

-        }

-        if(!project.hasProperty('tenantName')) {

-            throw new GradleException('Project property tenantName is missing')

-        }

-        // dbPlatform values: D(Derby), M(MySQL), O(Oracle), P(PostgreSQL) (default D)

-        if(project.hasProperty('dbPlatform')) {

-            if(dbPlatform == 'D') {

-                databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Derby.xml"

-            } else if(dbPlatform == 'M') {

-                databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-MySQL.xml"

-            } else if(dbPlatform == 'O') {

-                databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Oracle.xml"

-            } else if(dbPlatform == 'P') {

-                databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml"

-            } else {

-                throw new GradleException('Invalid value for property dbPlatform: ' + "${dbPlatform}")

-            }

-        }

-    }

-

-    task generateDatabaseTemplateFile(dependsOn: prepareAndValidateTenantArguments) << {

-        def filterTokens = ['tenantId': tenantId,

-            'tenantName': tenantName,

-            'domainName': project.hasProperty('domainName')? "${domainName}":'org.apache.ofbiz',

-            'db-IP': project.hasProperty('dbIp')? "${dbIp}":'',

-            'db-User': project.hasProperty('dbUser')? "${dbUser}":'',

-            'db-Password': project.hasProperty('dbPassword')? "${dbPassword}":'']

-

-        generateFileFromTemplate(databaseTemplateFile, 'runtime/tmp',

-            filterTokens, 'tmpFilteredTenantData.xml')

-    }

-

-    task generateAdminUserTemplateFile(dependsOn: prepareAndValidateTenantArguments) << {

-        generateFileFromTemplate(

-            "${rootDir}/framework/resources/templates/AdminUserLoginData.xml",

-            'runtime/tmp',

-            ['userLoginId': "${tenantId}-admin".toString()],

-            'tmpFilteredUserLogin.xml')

-    }

-

-    // Load the tenants master database

-    createOfbizCommandTask('loadTenantOnDefaultDelegator',

-        ['--load-data', 'file=/runtime/tmp/tmpFilteredTenantData.xml'],

-        jvmArguments, false)

-    loadTenantOnDefaultDelegator.dependsOn(generateDatabaseTemplateFile, generateAdminUserTemplateFile)

-

-    // Load the actual tenant data

-    createOfbizCommandTask('loadTenantData', [], jvmArguments, false)

-    loadTenantData.dependsOn(loadTenantOnDefaultDelegator)

-

-    // Load the tenant admin user account

-    createOfbizCommandTask('loadTenantAdminUserLogin', [], jvmArguments, false)

-    loadTenantAdminUserLogin.dependsOn(loadTenantData)

-

-    /* pass arguments to tasks, must be done this way

-     * because we are in the configuration phase. We cannot

-     * set the parameters at the execution phase. */

-    if(project.hasProperty('tenantId')) {

-        loadTenantData.args '--load-data'

-        loadTenantData.args "delegator=default#${tenantId}"

-

-        loadTenantAdminUserLogin.args '--load-data'

-        loadTenantAdminUserLogin.args "delegator=default#${tenantId}"

-        loadTenantAdminUserLogin.args '--load-data'

-        loadTenantAdminUserLogin.args "file=${rootDir}/runtime/tmp/tmpFilteredUserLogin.xml"

-    }

-    if(project.hasProperty('tenantReaders')) {

-        loadTenantData.args '--load-data'

-        loadTenantData.args "readers=${tenantReaders}"

-    }

-

-    dependsOn(loadTenantAdminUserLogin)

-

-    // cleanup

-    doLast {

-        delete("${rootDir}/runtime/tmp/tmpFilteredTenantData.xml")

-        delete("${rootDir}/runtime/tmp/tmpFilteredUserLogin.xml")

-    }

-}

-

-// ========== System Administration tasks ==========

-task createComponent(group: sysadminGroup, description: 'Create the layout of an OFBiz component in the hot-deploy folder.') << {

-

-    def filterTokens = ['component-name': componentName,

-        'component-resource-name': componentResourceName,

-        'webapp-name': webappName,

-        'base-permission': basePermission]

-    def templateDir = "${rootDir}/framework/resources/templates"

-    def componentDir = "${rootDir}/hot-deploy/${componentName}"

-

-    logger.info('Creating a component with the following properties: ')

-    logger.info(" - componentName: ${componentName}")

-    logger.info(" - componentResourceName: ${componentResourceName}")

-    logger.info(" - webappName: ${webappName}")

-    logger.info(" - basePermission: ${basePermission}")

-

-    mkdir componentDir

-    mkdir componentDir+"/config"

-    mkdir componentDir+"/data"

-    mkdir componentDir+"/data/helpdata"

-    mkdir componentDir+"/dtd"

-    mkdir componentDir+"/documents"

-    mkdir componentDir+"/entitydef"

-    mkdir componentDir+"/lib"

-    mkdir componentDir+"/patches"

-    mkdir componentDir+"/patches/test"

-    mkdir componentDir+"/patches/qa"

-    mkdir componentDir+"/patches/production"

-    mkdir componentDir+"/script"

-    mkdir componentDir+"/servicedef"

-    mkdir componentDir+"/src"

-    mkdir componentDir+"/testdef"

-    mkdir componentDir+"/webapp"

-    mkdir componentDir+"/webapp/${webappName}"

-    mkdir componentDir+"/webapp/${webappName}/error"

-    mkdir componentDir+"/webapp/${webappName}/WEB-INF"

-    mkdir componentDir+"/webapp/${webappName}/WEB-INF/actions"

-    mkdir componentDir+"/widget/"

-

-    generateFileFromTemplate(templateDir+"/ofbiz-component.xml", componentDir,

-        filterTokens, "ofbiz-component.xml")

-    generateFileFromTemplate(templateDir+"/TypeData.xml", componentDir+"/data",

-        filterTokens, "${componentResourceName}TypeData.xml")

-    generateFileFromTemplate(templateDir+"/SecurityPermissionSeedData.xml", componentDir+"/data",

-        filterTokens, "${componentResourceName}SecurityPermissionSeedData.xml")

-    generateFileFromTemplate(templateDir+"/SecurityGroupDemoData.xml", componentDir+"/data",

-        filterTokens, "${componentResourceName}SecurityGroupDemoData.xml")

-    generateFileFromTemplate(templateDir+"/DemoData.xml", componentDir+"/data",

-        filterTokens, "${componentResourceName}DemoData.xml")

-    generateFileFromTemplate(templateDir+"/HELP.xml", componentDir+"/data/helpdata",

-        filterTokens, "HELP_${componentResourceName}.xml")

-    generateFileFromTemplate(templateDir+"/document.xml", componentDir+"/documents",

-        filterTokens, "${componentResourceName}.xml")

-    generateFileFromTemplate(templateDir+"/entitymodel.xml", componentDir+"/entitydef",

-        filterTokens, "entitymodel.xml")

-    generateFileFromTemplate(templateDir+"/services.xml", componentDir+"/servicedef",

-        filterTokens, "services.xml")

-    generateFileFromTemplate(templateDir+"/Tests.xml", componentDir+"/testdef",

-        filterTokens, "${componentResourceName}Tests.xml")

-    generateFileFromTemplate(templateDir+"/UiLabels.xml", componentDir+"/config",

-        filterTokens, "${componentResourceName}UiLabels.xml")

-    generateFileFromTemplate(templateDir+"/index.jsp", componentDir+"/webapp/${webappName}",

-        filterTokens, "index.jsp")

-    generateFileFromTemplate(templateDir+"/error.jsp", componentDir+"/webapp/${webappName}/error",

-        filterTokens, "error.jsp")

-    generateFileFromTemplate(templateDir+"/controller.xml", componentDir+"/webapp/${webappName}/WEB-INF",

-        filterTokens, "controller.xml")

-    generateFileFromTemplate(templateDir+"/web.xml", componentDir+"/webapp/${webappName}/WEB-INF",

-        filterTokens, "web.xml")

-    generateFileFromTemplate(templateDir+"/CommonScreens.xml", componentDir+"/widget",

-        filterTokens, "CommonScreens.xml")

-    generateFileFromTemplate(templateDir+"/Screens.xml", componentDir+"/widget",

-        filterTokens, "${componentResourceName}Screens.xml")

-    generateFileFromTemplate(templateDir+"/Menus.xml", componentDir+"/widget",

-        filterTokens, "${componentResourceName}Menus.xml")

-    generateFileFromTemplate(templateDir+"/Forms.xml", componentDir+"/widget",

-        filterTokens, "${componentResourceName}Forms.xml")

-

-    logger.info("Component successfully created in folder ${rootDir}/hot-deploy/${componentName}.")

-    logger.info("Restart OFBiz and then visit the URL: https://localhost:8443/${webappName}")

-}

-

-task createTestReports(group: sysadminGroup, description: 'Generate HTML reports from junit XML output') << {

-    ant.taskdef(name: 'junitreport',

-        classname: 'org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator',

-        classpath: configurations.junitLibs.asPath)

-    ant.junitreport(todir: './runtime/logs/test-results') {

-        fileset(dir: './runtime/logs/test-results') {

-            include(name: '*.xml')

-        }

-        report(format:'frames', todir:'./runtime/logs/test-results/html')

-    }

-}

-/*

- * TODO replace this code with something more declarative.

- * We are using it so that if tests fail we still get HTML reports

- */

-gradle.taskGraph.afterTask { Task task, TaskState state ->

-    if (task.name ==~ /^ofbiz.*--test.*/

-        || task.name ==~ /^ofbiz.*-t.*/) {

-        tasks.createTestReports.execute()

-    }

-}

-

-// ========== Clean up tasks ==========

-task cleanCatalina(group: cleanupGroup, description: 'Clean Catalina data in runtime/catalina/work') << {

-    delete "${rootDir}/runtime/catalina/work"

-}

-task cleanData(group: cleanupGroup, description: 'Clean all DB data (Derby) under runtime/data') << {

-    deleteAllInDirWithExclusions("${rootDir}/runtime/data/", ['README', 'derby.properties'])

-}

-task cleanDownloads(group: cleanupGroup, description: 'Clean all downloaded files') << {

-    delete fileTree(dir: "${rootDir}/framework/base/lib", includes: ['activemq-*.jar'])

-    delete fileTree(dir: "${rootDir}/framework/entity/lib/jdbc", includes: ['postgresql-*.jar'])

-    delete fileTree(dir: "${rootDir}/framework/entity/lib/jdbc", includes: ['mysql-*.jar'])

-}

-task cleanLogs(group: cleanupGroup, description: 'Clean all logs in runtime/logs') << {

-    deleteAllInDirWithExclusions("${rootDir}/runtime/logs/", ['README'])

-}

-task cleanOutput(group: cleanupGroup, description: 'Clean runtime/output directory') << {

-    deleteAllInDirWithExclusions("${rootDir}/runtime/output/", ['README'])

-}

-task cleanIndexes(group: cleanupGroup, description: 'Remove search indexes (e.g. Lucene) from runtime/indexes') << {

-    deleteAllInDirWithExclusions("${rootDir}/runtime/indexes/", ['README', 'index.properties'])

-}

-task cleanTempfiles(group: cleanupGroup, description: 'Remove file in runtime/tempfiles') << {

-    deleteAllInDirWithExclusions("${rootDir}/runtime/tempfiles/", ['README'])

-    deleteAllInDirWithExclusions("${rootDir}/runtime/tmp/", ['README'])

-}

-task cleanUploads(group: cleanupGroup, description: 'Remove uploaded files.') << {

-    deleteAllInDirWithExclusions("${rootDir}/runtime/uploads/", [])

-}

-task cleanXtra(group: cleanupGroup, description: 'Clean extra generated files like .rej, .DS_Store, etc.') << {

-    delete fileTree(dir: "${rootDir}", includes: ['**/.nbattrs', '**/*~','**/.#*', '**/.DS_Store', '**/*.rej', '**/*.orig'])

-}

-task cleanGradle(group: cleanupGroup, description: 'clean generated files from Gradle') << {

-    delete file("${rootDir}/.gradle")

-}

-task cleanAnt(group: cleanupGroup, type: Delete, description: "clean old artifacts generated by Ant") {

-    /* TODO this task is temporary and should be deleted after some

-     * time when users have updated their trees. */

-    ['framework', 'specialpurpose', 'applications'].each { componentGroup ->

-        file(componentGroup).eachDir { component ->

-            delete file(component.toString() + '/build')

-        }

-    }

-    delete 'ofbiz.jar'

-}

-

-def cleanTasks = getTasksMatchingRegex(/^clean.+/)

-task cleanAll(group: cleanupGroup, dependsOn: [cleanTasks, clean]) {

-    description 'Execute all cleaning tasks.'

-}

-

-// ========== Tasks for OFBiz committers ==========

-def websiteDir = "${rootDir}/../site"

-task copyDtds(group: committerGroup, description: 'Copy all DTDs from OFBiz instance to website') << {

-    mkdir websiteDir+'/dtds'

-    copy {

-        from(fileTree("${rootDir}").files) {

-            include '**/*.xsd'

-            exclude '**/002*.xsd'

-            exclude '**/068*.xsd'

-            exclude '**/161*.xsd'

-            exclude '**/196*.xsd'

-            exclude '**/197*.xsd'

-        }

-        into websiteDir+'/dtds'

-    }

-}

-

-task gitInfoFooter(group: committerGroup, description: 'Update the Git Branch-revision info in the footer') << {

-    def branch

-    def revision

-    def timestamp = new Date().format 'yyyy-MM-dd HH:mm:ss'

-    File gitFooterFile = new File("${rootDir}/runtime/GitInfo.ftl")

-

-    def branchOutput = new ByteArrayOutputStream()

-    exec{

-        commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD'

-        standardOutput = branchOutput

-    }

-    branch = branchOutput.toString()

-    def revisionOutput = new ByteArrayOutputStream()

-    exec{

-        commandLine 'git', 'rev-parse', 'HEAD'

-        standardOutput = revisionOutput

-    }

-    revision = revisionOutput.toString()

-    gitFooterFile.delete()

-    gitFooterFile.createNewFile()

-    gitFooterFile << "Branch: ${branch}"

-    gitFooterFile << "Revision: ${revision}"

-    gitFooterFile << "Built on: ${timestamp}" + System.lineSeparator()

-    gitFooterFile << "Java Version: ${org.gradle.internal.jvm.Jvm.current()}"

-}

-

-task svnInfoFooter(group: committerGroup, description: 'Update the Subversion revision info in the footer') << {

-    def timestamp = new Date().format 'yyyy-MM-dd HH:mm:ss'

-    File svnFooterFile = new File("${rootDir}/runtime/SvnInfo.ftl")

-    def svnOutput = new ByteArrayOutputStream()

-    exec{

-        commandLine 'svn', 'info', '--xml'

-        standardOutput = svnOutput

-    }

-    def info = new XmlParser().parseText(svnOutput.toString())

-    svnFooterFile.delete()

-    svnFooterFile.createNewFile()

-    svnFooterFile << "Branch: ${info.entry.url.text()}" + System.lineSeparator()

-    svnFooterFile << "Revision: ${info.entry.commit.@revision}" + System.lineSeparator()

-    svnFooterFile << "Built on: ${timestamp}" + System.lineSeparator()

-    svnFooterFile << "Java Version: ${org.gradle.internal.jvm.Jvm.current()}"

-}

-

-// ========== hidden support tasks ==========

-

-/* without executing this task, a test would fail that is named

- * org.apache.ofbiz.base.util.test.UtilObjectTests.testGetObjectFromFactory()

- *

- * The test fails because it requires defining a service provider, read more below.

- * http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Service_Provider

- */

-task createBaseTestServiceProviderJar << {

-    ant.jar(destfile: "${rootDir}/build/libs/ofbiz-base-test.jar") {

-        service(type: 'org.apache.ofbiz.base.util.test.UtilObjectTests$TestFactoryIntf') {

-            provider(classname: 'org.apache.ofbiz.base.util.test.UtilObjectTests$FirstTestFactory')

-            provider(classname: 'org.apache.ofbiz.base.util.test.UtilObjectTests$SecondTestFactory')

-        }

-    }

-}

-classes.dependsOn createBaseTestServiceProviderJar

-

-/* ========================================================

- * Rules-based OFBiz server commands

- * ======================================================== */

-

-tasks.addRule('Pattern: ofbiz <Commands>: Execute OFBiz startup commands') { String taskName ->

-    if(taskName ==~ /^ofbiz\s.*/ || taskName == 'ofbiz') {

-        def arguments = (taskName - 'ofbiz').toLowerCase().tokenize(' ')

-        createOfbizCommandTask(taskName, arguments, jvmArguments, false)

-    }

-}

-

-tasks.addRule('Pattern: ofbizDebug <Commands>: Execute OFBiz startup commands in remote debug mode') { String taskName ->

-    if(taskName ==~ /^ofbizDebug\s.*/ || taskName == 'ofbizDebug') {

-        def arguments = (taskName - 'ofbizDebug').toLowerCase().tokenize(' ')

-        createOfbizCommandTask(taskName, arguments, jvmArguments, true)

-    }

-}

-

-tasks.addRule('Pattern: ofbizSecure <Commands>: Execute OFBiz startup commands pre-loading the notsoserial Java agent') { String taskName ->

-    if(taskName ==~ /^ofbizSecure\s.*/ || taskName == 'ofbizSecure') {

-        def arguments = (taskName - 'ofbizSecure').toLowerCase().tokenize(' ')

-        jvmArguments.add('-server')

-        jvmArguments.add("-javaagent:${rootDir}/tools/security/notsoserial/notsoserial-1.0-SNAPSHOT.jar")

-        jvmArguments.add("-Dnotsoserial.whitelist=${rootDir}/tools/security/notsoserial/empty.txt")

-        jvmArguments.add("-Dnotsoserial.dryrun=${rootDir}/tools/security/notsoserial/is-deserialized.txt")

-        jvmArguments.add("-Dnotsoserial.trace=${rootDir}/tools/security/notsoserial/deserialize-trace.txt")

-        createOfbizCommandTask(taskName, arguments, jvmArguments, false)

-    }

-}

-

-tasks.addRule('Pattern: ofbizBackground <Commands>: Execute OFBiz startup commands in background and output to console.log') { String taskName ->

-    if(taskName ==~ /^ofbizBackground\s.*/ || taskName == 'ofbizBackground') {

-        createOfbizBackgroundCommandTask(taskName)

-    }

-}

-

-tasks.addRule('Pattern: ofbizBackgroundSecure <Commands>: Execute OFBiz startup commands in background (secure mode) and output to console.log') { String taskName ->

-    if(taskName ==~ /^ofbizBackgroundSecure\s.*/ || taskName == 'ofbizBackgroundSecure') {

-        createOfbizBackgroundCommandTask(taskName)

-    }

-}

-

-/* ========================================================

- * Helper Functions

- * ======================================================== */

-

-def createOfbizCommandTask(taskName, arguments, jvmArguments, isDebugMode) {

-

-    def ofbizJarName = buildDir.toString()+'/libs/'+project.name+'.jar'

-

-    task(type: JavaExec, dependsOn: build, taskName) {

-        jvmArgs(jvmArguments)

-        debug = isDebugMode

-        classpath = files(ofbizJarName)

-        main = ofbizMainClass

-        arguments.each { argument ->

-            args argument

-        }

-    }

-}

-

-def createOfbizBackgroundCommandTask(taskName) {

-    def os = System.getProperty("os.name").toLowerCase()

-    def sourceTask = taskName.tokenize().first()

-    def arguments = (taskName - sourceTask)

-

-    def targetTask

-    def gradleRunner

-

-    if(sourceTask == 'ofbizBackground') {

-        targetTask = 'ofbiz'

-    } else if(sourceTask == 'ofbizBackgroundSecure') {

-        targetTask = 'ofbizSecure'

-    }

-

-    if (os.contains("windows")) {

-        gradleRunner = 'gradlew.bat'

-    } else {

-        gradleRunner = './gradlew'

-    }

-

-    task (taskName) {

-        doLast {

-            spawnProcess(gradleRunner, "${targetTask} ${arguments}")

-        }

-    }

-}

-

-def spawnProcess(command, arguments) {

-    ProcessBuilder pb = new ProcessBuilder(command, arguments)

-    File consoleLog = file("${rootDir}/runtime/logs/console.log");

-

-    pb.directory(file("${rootDir}"))

-    pb.redirectErrorStream(true)

-    pb.redirectOutput(ProcessBuilder.Redirect.appendTo(consoleLog))

-    pb.start()

-}

-

-def getDirectoryInActiveComponentsIfExists(String dirName) {

-    def dirInComponents = []

-    iterateOverActiveComponents { component ->

-        def subDir = file(component.toString() + '/' + dirName)

-        if(subDir.exists()) {

-            dirInComponents.add subDir

-        }

-    }

-    return dirInComponents

-}

-

-def deleteAllInDirWithExclusions(dirName, exclusions) {

-    ant.delete (includeEmptyDirs: 'true', verbose: 'on') {

-        fileset(dir: dirName, includes: '**/*', erroronmissingdir: "false") {

-            exclusions.each { exclusion ->

-                exclude name: exclusion

-            }

-        }

-    }

-}

-

-def getTasksMatchingRegex(theRegex) {

-    def filteredTasks = []

-    tasks.each { task ->

-        if(task.name ==~ theRegex) {

-            filteredTasks.add(task)

-        }

-    }

-    return filteredTasks

-}

-

-def generateFileFromTemplate(templateFileInFullPath, targetDirectory, filterTokens, newFileName) {

-    copy {

-        from (templateFileInFullPath) {

-            filter ReplaceTokens, tokens: filterTokens

-            rename templateFileInFullPath.tokenize('/').last(), newFileName

-        }

-        into targetDirectory

-    }

-}

-

-def getJarManifestClasspathForCurrentOs() {

-    def osClassPath = ''

-    if(System.getProperty('os.name').toLowerCase().contains('windows')) {

-        configurations.runtime.files.each { cpEntry ->

-            osClassPath += '\\' + cpEntry.toString() + ' '

-        }

-    } else {

-        osClassPath = configurations.runtime.files.collect { "$it" }.join(' ')

-    }

-    return osClassPath

-}

+/*
+ * 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.
+ */
+import org.apache.tools.ant.filters.ReplaceTokens
+
+/* ========================================================
+ * Project setup
+ * ======================================================== */
+
+apply plugin: 'java'
+apply plugin: 'eclipse'
+
+apply from: 'common.gradle'
+
+// java settings
+def jvmArguments = ['-Xms128M', '-Xmx512M']
+ext.ofbizMainClass = 'org.apache.ofbiz.base.start.Start'
+javadoc.failOnError = false
+sourceCompatibility = '1.8'
+targetCompatibility = '1.8'
+
+// root and subproject settings
+defaultTasks 'build'
+
+allprojects {
+    repositories{
+        jcenter()
+    }
+}
+
+subprojects {
+    configurations {
+        // compile-time plugin libraries
+        pluginLibsCompile
+        // runtime plugin libraries
+        pluginLibsRuntime
+    }
+}
+
+configurations {
+    junitLibs
+}
+
+dependencies {
+    // general framework compile libs
+    compile 'apache-xerces:resolver:2.9.1'
+    compile 'apache-xerces:xercesImpl:2.9.1'
+    compile 'avalon-framework:avalon-framework-impl:4.2.0'
+    compile 'bouncycastle:bouncycastle-jce-jdk13:112'
+    compile 'com.fasterxml.jackson.core:jackson-annotations:2.4.0'
+    compile 'com.fasterxml.jackson.core:jackson-core:2.4.2'
+    compile 'com.google.guava:guava:19.0'
+    compile 'com.google.zxing:core:3.2.1'
+    compile 'com.googlecode.concurrentlinkedhashmap:concurrentlinkedhashmap-lru:1.0'
+    compile 'com.googlecode.owasp-java-html-sanitizer:owasp-java-html-sanitizer:20160628.1'
+    compile 'com.ibm.icu:icu4j:57.1'
+    compile 'com.lowagie:itext:2.1.7'
+    compile 'com.sun.mail:javax.mail:1.5.1'
+    compile 'com.sun.syndication:com.springsource.com.sun.syndication:0.9.0'
+    compile 'com.thoughtworks.xstream:xstream:1.4.9'
+    compile 'commons-beanutils:commons-beanutils-core:1.8.3'
+    compile 'commons-cli:commons-cli:1.3.1'
+    compile 'commons-codec:commons-codec:1.10'
+    compile 'commons-el:commons-el:1.0'
+    compile 'commons-fileupload:commons-fileupload:1.3.1'
+    compile 'commons-io:commons-io:2.4'
+    compile 'commons-logging:commons-logging:1.2'
+    compile 'commons-net:commons-net:3.3'
+    compile 'commons-validator:commons-validator:1.5.1'
+    compile 'de.odysseus.juel:juel-impl:2.2.7'
+    compile 'de.odysseus.juel:juel-spi:2.2.7'
+    compile 'httpunit:httpunit:1.7'
+    compile 'javax.el:javax.el-api:3.0.1-b04'
+    compile 'javax.servlet:javax.servlet-api:3.1.0'
+    compile 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.0'
+    compile 'javolution:javolution:5.4.3'
+    compile 'junit:junit-dep:4.10'
+    compile 'jython:jython:2.1'
+    compile 'net.fortuna.ical4j:ical4j:1.0-rc3-atlassian-11'
+    compile 'net.sf.barcode4j:barcode4j-fop-ext-complete:2.0'
+    compile 'net.sf.dozer:dozer:4.2.1'
+    compile 'net.sf.ezmorph:ezmorph:0.9.1'
+    compile 'net.sourceforge.nekohtml:nekohtml:1.9.16'
+    compile 'org.apache.ant:ant-apache-bsf:1.9.0'
+    compile 'org.apache.ant:ant-junit:1.9.0'
+    compile 'org.apache.ant:ant-launcher:1.9.0'
+    compile 'org.apache.axis2:axis2-adb:1.7.1'
+    compile 'org.apache.axis2:axis2-kernel:1.7.1'
+    compile 'org.apache.axis2:axis2-transport-http:1.7.1'
+    compile 'org.apache.axis2:axis2-transport-local:1.7.1'
+    compile 'org.apache.bsf:com.springsource.org.apache.bsf:2.4.0'
+    compile 'org.apache.commons:commons-collections4:4.1'
+    compile 'org.apache.commons:commons-compress:1.11'
+    compile 'org.apache.commons:commons-csv:1.1'
+    compile 'org.apache.commons:commons-dbcp2:2.1'
+    compile 'org.apache.commons:commons-pool2:2.3'
+    compile 'org.apache.derby:derby:10.11.1.1'
+    compile 'org.apache.geronimo.components:geronimo-transaction:3.1.1'
+    compile 'org.apache.geronimo.specs:geronimo-activation_1.0.2_spec:1.0'
+    compile 'org.apache.geronimo.specs:geronimo-j2ee-connector_1.5_spec:2.0.0'
+    compile 'org.apache.geronimo.specs:geronimo-jaxr_1.0_spec:1.0'
+    compile 'org.apache.geronimo.specs:geronimo-jaxrpc_1.1_spec:1.1'
+    compile 'org.apache.geronimo.specs:geronimo-jms_1.1_spec:1.1.1'
+    compile 'org.apache.geronimo.specs:geronimo-jta_1.1_spec:1.1.1'
+    compile 'org.apache.geronimo.specs:geronimo-saaj_1.3_spec:1.1'
+    compile 'org.apache.httpcomponents:httpclient-cache:4.4.1'
+    compile 'org.apache.httpcomponents:httpcore:4.4.1'
+    compile 'org.apache.logging.log4j:log4j-1.2-api:2.3'
+    compile 'org.apache.logging.log4j:log4j-api:2.3'
+    compile 'org.apache.logging.log4j:log4j-core:2.3'
+    compile 'org.apache.logging.log4j:log4j-nosql:2.3'
+    compile 'org.apache.logging.log4j:log4j-slf4j-impl:2.3'
+    compile 'org.apache.neethi:neethi:3.0.3'
+    compile 'org.apache.pdfbox:fontbox:1.8.11'
+    compile 'org.apache.pdfbox:jempbox:1.8.11'
+    compile 'org.apache.pdfbox:pdfbox:1.8.12'
+    compile 'org.apache.poi:poi:3.14'
+    compile 'org.apache.servicemix.bundles:org.apache.servicemix.bundles.xpp3:1.1.4c_7'
+    compile 'org.apache.shiro:shiro-core:1.2.5'
+    compile 'org.apache.tika:tika-core:1.12'
+    compile 'org.apache.tika:tika-parsers:1.12'
+    compile 'org.apache.tomcat:tomcat-annotations-api:7.0.54'
+    compile 'org.apache.tomcat:tomcat-api:8.0.33'
+    compile 'org.apache.tomcat:tomcat-catalina-ha:8.0.33'
+    compile 'org.apache.tomcat:tomcat-catalina:8.0.33'
+    compile 'org.apache.tomcat:tomcat-coyote:8.0.33'
+    compile 'org.apache.tomcat:tomcat-jasper:8.0.33'
+    compile 'org.apache.tomcat:tomcat-jni:8.0.33'
+    compile 'org.apache.tomcat:tomcat-tribes:8.0.33'
+    compile 'org.apache.tomcat:tomcat-util-scan:8.0.33'
+    compile 'org.apache.tomcat:tomcat-util:8.0.33'
+    compile 'org.apache.tomcat.embed:tomcat-embed-websocket:8.0.33'
+    compile 'org.apache.tomcat.extras:tomcat-extras-juli-adapters:8.0.33'
+    compile 'org.apache.tomcat.extras:tomcat-extras-juli:8.0.33'
+    compile 'org.apache.woden:woden-core:1.0M10'
+    compile 'org.apache.ws.commons.axiom:axiom-api:1.2.17'
+    compile 'org.apache.ws.commons.axiom:axiom-impl:1.2.17'
+    compile 'org.apache.ws.commons.util:ws-commons-util:1.0.2'
+    compile 'org.apache.ws.xmlschema:xmlschema-core:2.2.1'
+    compile 'org.apache.xalan:com.springsource.org.apache.xml.serializer:2.7.1'
+    compile 'org.apache.xmlgraphics:fop:2.1'
+    compile 'org.apache.xmlgraphics:xmlgraphics-commons:2.1'
+    compile 'org.apache.xmlrpc:xmlrpc-client:3.1.2'
+    compile 'org.apache.xmlrpc:xmlrpc-common:3.1.2'
+    compile 'org.apache.xmlrpc:xmlrpc-server:3.1.2'
+    compile 'org.codeartisans.thirdparties.swing:batik-all:1.8pre-r1084380'
+    compile 'org.codehaus.groovy:groovy-all:2.4.5'
+    compile 'org.dom4j:com.springsource.org.dom4j:1.6.1'
+    compile 'org.eclipse.jdt.core.compiler:ecj:4.5'
+    compile 'org.freemarker:freemarker:2.3.24-incubating'
+    compile 'org.hamcrest:hamcrest-all:1.3'
+    compile 'org.jdom:jdom:1.1'
+    compile 'org.lucee:commons-lang:2.6.0'
+    compile 'org.owasp.esapi:esapi:2.1.0'
+    compile 'org.slf4j:slf4j-api:1.6.4'
+    compile 'org.springframework:spring-core:4.2.3.RELEASE'
+    compile 'org.springframework:spring-test:4.2.3.RELEASE'
+    compile 'org.zapodot:jackson-databind-java-optional:2.4.2'
+    compile 'oro:oro:2.0.8'
+    compile 'ws-commons-java5:ws-commons-java5:1.0.1'
+    compile 'wsdl4j:wsdl4j:1.6.2'
+    compile 'xalan:xalan:2.7.2'
+    compile 'xml-apis:xml-apis-ext:1.3.04'
+    compile 'xml-apis:xml-apis:1.4.01'
+
+    // general framework runtime libs
+    runtime 'mysql:mysql-connector-java:5.1.36'
+    runtime 'postgresql:postgresql:9.0-801.jdbc4'
+
+    // plugin libs
+    subprojects.each { subProject ->
+        compile project(path: subProject.path, configuration: 'pluginLibsCompile')
+        runtime project(path: subProject.path, configuration: 'pluginLibsRuntime')
+    }
+
+    // libs needed for junitreport
+    junitLibs 'junit:junit:4.12'
+    junitLibs 'org.apache.ant:ant-junit:1.9.7'
+    junitLibs 'org.apache.ant:ant-junit4:1.9.7'
+
+    // local libs
+    getDirectoryInActiveComponentsIfExists('lib').each { libDir ->
+        compile fileTree(dir: libDir, include: '**/*.jar')
+    }
+    runtime files("${rootDir}/build/libs/ofbiz-base-test.jar")
+}
+
+def excludedJavaSources = []
+excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/cybersource/IcsPaymentServices.java'
+excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/ideal/IdealEvents.java'
+excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/ideal/IdealPaymentServiceTest.java'
+excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/orbital/OrbitalPaymentServices.java'
+excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/paypal/PayPalServices.java'
+excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/securepay/SecurePayPaymentServices.java'
+excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/securepay/SecurePayServiceTest.java'
+excludedJavaSources.add 'org/apache/ofbiz/accounting/thirdparty/verisign/PayflowPro.java'
+excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeByteArrayInputStream.java'
+excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeByteArrayOutputStream.java'
+excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeServices.java'
+excludedJavaSources.add 'org/apache/ofbiz/content/openoffice/OpenOfficeWorker.java'
+excludedJavaSources.add 'org/apache/ofbiz/content/report/JREntityListIteratorDataSource.java'
+excludedJavaSources.add 'org/apache/ofbiz/content/report/JRMapCollectionDataSource.java'
+excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareException.java'
+excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareServices.java'
+excludedJavaSources.add 'org/apache/ofbiz/order/thirdparty/taxware/TaxwareUTL.java'
+excludedJavaSources.add 'ShipmentScaleApplet.java'
+excludedJavaSources.add 'org/apache/ofbiz/securityext/thirdparty/truition/TruitionCoReg.java'
+excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsJXlsViewHandler.java'
+excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsPdfViewHandler.java'
+excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsPoiXlsViewHandler.java'
+excludedJavaSources.add 'org/apache/ofbiz/webapp/view/JasperReportsXmlViewHandler.java'
+
+sourceSets {
+    main {
+        java {
+            srcDirs = getDirectoryInActiveComponentsIfExists('src/main/java')
+            exclude excludedJavaSources
+        }
+        resources {
+            srcDirs = getDirectoryInActiveComponentsIfExists('src/main/java')
+            srcDirs += getDirectoryInActiveComponentsIfExists('config')
+            exclude excludedJavaSources
+        }
+    }
+
+    test {
+        java {
+            srcDirs = getDirectoryInActiveComponentsIfExists('src/test/java')
+        }
+        resources {
+            srcDirs = getDirectoryInActiveComponentsIfExists('src/test/java')
+        }
+    }
+}
+
+jar {
+    manifest {
+        attributes(
+            "Implementation-Title": project.name,
+            "Main-Class": ofbizMainClass,
+            "Class-Path": getJarManifestClasspathForCurrentOs()
+        )
+    }
+}
+
+// Eclipse plugin settings
+eclipse.classpath.file.whenMerged { classpath ->
+    /* The code inside this block removes unnecessary entries
+     * in the .classpath file which are generated automatically
+     * due to the settings in the sourceSets block
+     */
+    def osName = System.getProperty('os.name').toLowerCase()
+    def osDirSeparator = osName.contains('windows') ? '\\' : '/'
+
+    iterateOverActiveComponents { component ->
+        def componentName = component.toString() - rootDir.toString()
+        classpath.entries.removeAll { entry ->
+            // remove any "src" entries in .classpath of the form /componentName
+            entry.kind == 'src' &&
+            entry.path ==~ '.*/+(' + componentName.tokenize(osDirSeparator).last() + ')$'
+        }
+    }
+    classpath.entries.removeAll { entry ->
+        /* remove "src" entries in .classpath named:
+         *   /framework, /applications, /specialpurpose and /hot-deploy
+         */
+        entry.kind == 'src' &&
+            entry.path ==~ /(\/+framework)$/ ||
+            entry.path ==~ /(\/+applications)$/ ||
+            entry.path ==~ /(\/+specialpurpose)$/ ||
+            entry.path ==~ /(\/+hot-deploy)$/
+    }
+    getDirectoryInActiveComponentsIfExists('config').each { configDir ->
+        /* remove any "src" entries in .classpath of the form componentName/config
+         *
+         * windows format: \framework\base\config
+         * Unix format: /framework/base/config
+         * .classpath format: framework/base/config
+         *
+         * Must convert both windows and unix to .classpath format to
+         * be able to remove it from the file
+         */
+        def relativeDir = configDir.toString() - rootDir.toString() - osDirSeparator
+        def eclipseConfigSrc = osName.contains('windows') ? relativeDir.replaceAll("\\\\", "/") : relativeDir
+        classpath.entries.removeAll { entry ->
+            entry.kind == 'src' &&
+            entry.path == eclipseConfigSrc
+        }
+    }
+}
+tasks.eclipse.dependsOn(cleanEclipse)
+
+/* ========================================================
+ * Tasks
+ * ======================================================== */
+
+// ========== Task group labels ==========
+def cleanupGroup = 'Cleaning'
+def ofbizServer = 'OFBiz Server'
+def sysadminGroup = 'System Administration'
+def committerGroup = 'OFBiz committers'
+
+// ========== OFBiz Server tasks ==========
+
+task loadDefault(group: ofbizServer) {
+    dependsOn 'ofbiz --load-data'
+    description 'Load default data; meant for OFBiz development, testing, and demo purposes'
+}
+
+task testIntegration(group: ofbizServer) {
+    dependsOn 'ofbiz --test'
+    description 'Run OFBiz integration tests; You must run loadDefault before running this task'
+}
+
+task start(group: ofbizServer) {
+    dependsOn 'ofbiz --start'
+    description 'Start an OFBiz instance'
+}
+
+task stop(group: ofbizServer) {
+    dependsOn 'ofbiz --shutdown'
+    description 'Stop currently running instance'
+}
+
+task terminateOfbiz(group: ofbizServer,
+    description: 'Force termination of any running OFBiz servers, only use if \"--shutdown\" command fails') << {
+    def os = System.getProperty("os.name").toLowerCase()
+    if (os.contains("windows")) {
+        Runtime.getRuntime().exec("wmic process where \"CommandLine Like \'%org.apache.ofbiz.base.start.Start%\'\" Call Terminate")
+    } else {
+        def processOutput = new ByteArrayOutputStream()
+        exec {
+            commandLine 'ps', 'ax'
+            standardOutput = processOutput
+        }
+        processOutput.toString().split(System.lineSeparator()).each { line ->
+            if(line ==~ /.*org\.apache\.ofbiz\.base\.start\.Start.*/) {
+                exec { commandLine 'kill', '-9', line.tokenize().first() }
+            }
+        }
+    }
+}
+
+task loadAdminUserLogin(group: ofbizServer) {
+    description 'Create admin user with temporary password equal to ofbiz. You must provide userLoginId'
+    createOfbizCommandTask('executeLoadAdminUser',
+        ['--load-data', 'file=/runtime/tmp/AdminUserLoginData.xml'],
+        jvmArguments, false)
+    executeLoadAdminUser.doFirst {
+        copy {
+            from ("${rootDir}/framework/resources/templates/AdminUserLoginData.xml") {
+                filter(ReplaceTokens, tokens: [userLoginId: userLoginId])
+            }
+            into "${rootDir}/runtime/tmp/"
+        }
+    }
+    dependsOn executeLoadAdminUser
+    doLast {
+        delete("${rootDir}/runtime/tmp/AdminUserLoginData.xml")
+    }
+}
+
+task loadTenant(group: ofbizServer, description: 'Load data using tenantId') {
+
+    createOfbizCommandTask('executeLoadTenant', [], jvmArguments, false)
+
+    if(project.hasProperty('tenantId')) {
+        executeLoadTenant.args '--load-data'
+        executeLoadTenant.args "delegator=default#${tenantId}"
+    }
+    if(project.hasProperty('tenantReaders')) {
+        executeLoadTenant.args '--load-data'
+        executeLoadTenant.args "readers=${tenantReaders}"
+    }
+    if(project.hasProperty('tenantComponent')) {
+        executeLoadTenant.args '--load-data'
+        executeLoadTenant.args "component=${tenantComponent}"
+    }
+
+    doLast {
+        if(!project.hasProperty('tenantId')) {
+            throw new GradleException('Missing project property tenantId')
+        }
+    }
+    dependsOn executeLoadTenant
+}
+
+task createTenant(group: ofbizServer, description: 'Create a new tenant in your environment') {
+
+    def databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Derby.xml"
+
+    task prepareAndValidateTenantArguments << {
+        if(!project.hasProperty('tenantId')) {
+            throw new GradleException('Project property tenantId is missing')
+        }
+        if(!project.hasProperty('tenantName')) {
+            throw new GradleException('Project property tenantName is missing')
+        }
+        // dbPlatform values: D(Derby), M(MySQL), O(Oracle), P(PostgreSQL) (default D)
+        if(project.hasProperty('dbPlatform')) {
+            if(dbPlatform == 'D') {
+                databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Derby.xml"
+            } else if(dbPlatform == 'M') {
+                databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-MySQL.xml"
+            } else if(dbPlatform == 'O') {
+                databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-Oracle.xml"
+            } else if(dbPlatform == 'P') {
+                databaseTemplateFile = "${rootDir}/framework/resources/templates/AdminNewTenantData-PostgreSQL.xml"
+            } else {
+                throw new GradleException('Invalid value for property dbPlatform: ' + "${dbPlatform}")
+            }
+        }
+    }
+
+    task generateDatabaseTemplateFile(dependsOn: prepareAndValidateTenantArguments) << {
+        def filterTokens = ['tenantId': tenantId,
+            'tenantName': tenantName,
+            'domainName': project.hasProperty('domainName')? "${domainName}":'org.apache.ofbiz',
+            'db-IP': project.hasProperty('dbIp')? "${dbIp}":'',
+            'db-User': project.hasProperty('dbUser')? "${dbUser}":'',
+            'db-Password': project.hasProperty('dbPassword')? "${dbPassword}":'']
+
+        generateFileFromTemplate(databaseTemplateFile, 'runtime/tmp',
+            filterTokens, 'tmpFilteredTenantData.xml')
+    }
+
+    task generateAdminUserTemplateFile(dependsOn: prepareAndValidateTenantArguments) << {
+        generateFileFromTemplate(
+            "${rootDir}/framework/resources/templates/AdminUserLoginData.xml",
+            'runtime/tmp',
+            ['userLoginId': "${tenantId}-admin".toString()],
+            'tmpFilteredUserLogin.xml')
+    }
+
+    // Load the tenants master database
+    createOfbizCommandTask('loadTenantOnDefaultDelegator',
+        ['--load-data', 'file=/runtime/tmp/tmpFilteredTenantData.xml'],
+        jvmArguments, false)
+    loadTenantOnDefaultDelegator.dependsOn(generateDatabaseTemplateFile, generateAdminUserTemplateFile)
+
+    // Load the actual tenant data
+    createOfbizCommandTask('loadTenantData', [], jvmArguments, false)
+    loadTenantData.dependsOn(loadTenantOnDefaultDelegator)
+
+    // Load the tenant admin user account
+    createOfbizCommandTask('loadTenantAdminUserLogin', [], jvmArguments, false)
+    loadTenantAdminUserLogin.dependsOn(loadTenantData)
+
+    /* pass arguments to tasks, must be done this way
+     * because we are in the configuration phase. We cannot
+     * set the parameters at the execution phase. */
+    if(project.hasProperty('tenantId')) {
+        loadTenantData.args '--load-data'
+        loadTenantData.args "delegator=default#${tenantId}"
+
+        loadTenantAdminUserLogin.args '--load-data'
+        loadTenantAdminUserLogin.args "delegator=default#${tenantId}"
+        loadTenantAdminUserLogin.args '--load-data'
+        loadTenantAdminUserLogin.args "file=${rootDir}/runtime/tmp/tmpFilteredUserLogin.xml"
+    }
+    if(project.hasProperty('tenantReaders')) {
+        loadTenantData.args '--load-data'
+        loadTenantData.args "readers=${tenantReaders}"
+    }
+
+    dependsOn(loadTenantAdminUserLogin)
+
+    // cleanup
+    doLast {
+        delete("${rootDir}/runtime/tmp/tmpFilteredTenantData.xml")
+        delete("${rootDir}/runtime/tmp/tmpFilteredUserLogin.xml")
+    }
+}
+
+// ========== System Administration tasks ==========
+task createComponent(group: sysadminGroup, description: 'Create the layout of an OFBiz component in the hot-deploy folder.') << {
+
+    def filterTokens = ['component-name': componentName,
+        'component-resource-name': componentResourceName,
+        'webapp-name': webappName,
+        'base-permission': basePermission]
+    def templateDir = "${rootDir}/framework/resources/templates"
+    def componentDir = "${rootDir}/hot-deploy/${componentName}"
+
+    logger.info('Creating a component with the following properties: ')
+    logger.info(" - componentName: ${componentName}")
+    logger.info(" - componentResourceName: ${componentResourceName}")
+    logger.info(" - webappName: ${webappName}")
+    logger.info(" - basePermission: ${basePermission}")
+
+    mkdir componentDir
+    mkdir componentDir+"/config"
+    mkdir componentDir+"/data"
+    mkdir componentDir+"/data/helpdata"
+    mkdir componentDir+"/dtd"
+    mkdir componentDir+"/documents"
+    mkdir componentDir+"/entitydef"
+    mkdir componentDir+"/lib"
+    mkdir componentDir+"/patches"
+    mkdir componentDir+"/patches/test"
+    mkdir componentDir+"/patches/qa"
+    mkdir componentDir+"/patches/production"
+    mkdir componentDir+"/script"
+    mkdir componentDir+"/servicedef"
+    mkdir componentDir+"/src"
+    mkdir componentDir+"/testdef"
+    mkdir componentDir+"/webapp"
+    mkdir componentDir+"/webapp/${webappName}"
+    mkdir componentDir+"/webapp/${webappName}/error"
+    mkdir componentDir+"/webapp/${webappName}/WEB-INF"
+    mkdir componentDir+"/webapp/${webappName}/WEB-INF/actions"
+    mkdir componentDir+"/widget/"
+
+    generateFileFromTemplate(templateDir+"/ofbiz-component.xml", componentDir,
+        filterTokens, "ofbiz-component.xml")
+    generateFileFromTemplate(templateDir+"/TypeData.xml", componentDir+"/data",
+        filterTokens, "${componentResourceName}TypeData.xml")
+    generateFileFromTemplate(templateDir+"/SecurityPermissionSeedData.xml", componentDir+"/data",
+        filterTokens, "${componentResourceName}SecurityPermissionSeedData.xml")
+    generateFileFromTemplate(templateDir+"/SecurityGroupDemoData.xml", componentDir+"/data",
+        filterTokens, "${componentResourceName}SecurityGroupDemoData.xml")
+    generateFileFromTemplate(templateDir+"/DemoData.xml", componentDir+"/data",
+        filterTokens, "${componentResourceName}DemoData.xml")
+    generateFileFromTemplate(templateDir+"/HELP.xml", componentDir+"/data/helpdata",
+        filterTokens, "HELP_${componentResourceName}.xml")
+    generateFileFromTemplate(templateDir+"/document.xml", componentDir+"/documents",
+        filterTokens, "${componentResourceName}.xml")
+    generateFileFromTemplate(templateDir+"/entitymodel.xml", componentDir+"/entitydef",
+        filterTokens, "entitymodel.xml")
+    generateFileFromTemplate(templateDir+"/services.xml", componentDir+"/servicedef",
+        filterTokens, "services.xml")
+    generateFileFromTemplate(templateDir+"/Tests.xml", componentDir+"/testdef",
+        filterTokens, "${componentResourceName}Tests.xml")
+    generateFileFromTemplate(templateDir+"/UiLabels.xml", componentDir+"/config",
+        filterTokens, "${componentResourceName}UiLabels.xml")
+    generateFileFromTemplate(templateDir+"/index.jsp", componentDir+"/webapp/${webappName}",
+        filterTokens, "index.jsp")
+    generateFileFromTemplate(templateDir+"/error.jsp", componentDir+"/webapp/${webappName}/error",
+        filterTokens, "error.jsp")
+    generateFileFromTemplate(templateDir+"/controller.xml", componentDir+"/webapp/${webappName}/WEB-INF",
+        filterTokens, "controller.xml")
+    generateFileFromTemplate(templateDir+"/web.xml", componentDir+"/webapp/${webappName}/WEB-INF",
+        filterTokens, "web.xml")
+    generateFileFromTemplate(templateDir+"/CommonScreens.xml", componentDir+"/widget",
+        filterTokens, "CommonScreens.xml")
+    generateFileFromTemplate(templateDir+"/Screens.xml", componentDir+"/widget",
+        filterTokens, "${componentResourceName}Screens.xml")
+    generateFileFromTemplate(templateDir+"/Menus.xml", componentDir+"/widget",
+        filterTokens, "${componentResourceName}Menus.xml")
+    generateFileFromTemplate(templateDir+"/Forms.xml", componentDir+"/widget",
+        filterTokens, "${componentResourceName}Forms.xml")
+
+    logger.info("Component successfully created in folder ${rootDir}/hot-deploy/${componentName}.")
+    logger.info("Restart OFBiz and then visit the URL: https://localhost:8443/${webappName}")
+}
+
+task createTestReports(group: sysadminGroup, description: 'Generate HTML reports from junit XML output') << {
+    ant.taskdef(name: 'junitreport',
+        classname: 'org.apache.tools.ant.taskdefs.optional.junit.XMLResultAggregator',
+        classpath: configurations.junitLibs.asPath)
+    ant.junitreport(todir: './runtime/logs/test-results') {
+        fileset(dir: './runtime/logs/test-results') {
+            include(name: '*.xml')
+        }
+        report(format:'frames', todir:'./runtime/logs/test-results/html')
+    }
+}
+/*
+ * TODO replace this code with something more declarative.
+ * We are using it so that if tests fail we still get HTML reports
+ */
+gradle.taskGraph.afterTask { Task task, TaskState state ->
+    if (task.name ==~ /^ofbiz.*--test.*/
+        || task.name ==~ /^ofbiz.*-t.*/) {
+        tasks.createTestReports.execute()
+    }
+}
+
+// ========== Clean up tasks ==========
+task cleanCatalina(group: cleanupGroup, description: 'Clean Catalina data in runtime/catalina/work') << {
+    delete "${rootDir}/runtime/catalina/work"
+}
+task cleanData(group: cleanupGroup, description: 'Clean all DB data (Derby) under runtime/data') << {
+    deleteAllInDirWithExclusions("${rootDir}/runtime/data/", ['README', 'derby.properties'])
+}
+task cleanDownloads(group: cleanupGroup, description: 'Clean all downloaded files') << {
+    delete fileTree(dir: "${rootDir}/framework/base/lib", includes: ['activemq-*.jar'])
+    delete fileTree(dir: "${rootDir}/framework/entity/lib/jdbc", includes: ['postgresql-*.jar'])
+    delete fileTree(dir: "${rootDir}/framework/entity/lib/jdbc", includes: ['mysql-*.jar'])
+}
+task cleanLogs(group: cleanupGroup, description: 'Clean all logs in runtime/logs') << {
+    deleteAllInDirWithExclusions("${rootDir}/runtime/logs/", ['README'])
+}
+task cleanOutput(group: cleanupGroup, description: 'Clean runtime/output directory') << {
+    deleteAllInDirWithExclusions("${rootDir}/runtime/output/", ['README'])
+}
+task cleanIndexes(group: cleanupGroup, description: 'Remove search indexes (e.g. Lucene) from runtime/indexes') << {
+    deleteAllInDirWithExclusions("${rootDir}/runtime/indexes/", ['README', 'index.properties'])
+}
+task cleanTempfiles(group: cleanupGroup, description: 'Remove file in runtime/tempfiles') << {
+    deleteAllInDirWithExclusions("${rootDir}/runtime/tempfiles/", ['README'])
+    deleteAllInDirWithExclusions("${rootDir}/runtime/tmp/", ['README'])
+}
+task cleanUploads(group: cleanupGroup, description: 'Remove uploaded files.') << {
+    deleteAllInDirWithExclusions("${rootDir}/runtime/uploads/", [])
+}
+task cleanXtra(group: cleanupGroup, description: 'Clean extra generated files like .rej, .DS_Store, etc.') << {
+    delete fileTree(dir: "${rootDir}", includes: ['**/.nbattrs', '**/*~','**/.#*', '**/.DS_Store', '**/*.rej', '**/*.orig'])
+}
+task cleanGradle(group: cleanupGroup, description: 'clean generated files from Gradle') << {
+    delete file("${rootDir}/.gradle")
+}
+task cleanAnt(group: cleanupGroup, type: Delete, description: "clean old artifacts generated by Ant") {
+    /* TODO this task is temporary and should be deleted after some
+     * time when users have updated their trees. */
+    ['framework', 'specialpurpose', 'applications'].each { componentGroup ->
+        file(componentGroup).eachDir { component ->
+            delete file(component.toString() + '/build')
+        }
+    }
+    delete 'ofbiz.jar'
+}
+
+def cleanTasks = getTasksMatchingRegex(/^clean.+/)
+task cleanAll(group: cleanupGroup, dependsOn: [cleanTasks, clean]) {
+    description 'Execute all cleaning tasks.'
+}
+
+// ========== Tasks for OFBiz committers ==========
+def websiteDir = "${rootDir}/../site"
+task copyDtds(group: committerGroup, description: 'Copy all DTDs from OFBiz instance to website') << {
+    mkdir websiteDir+'/dtds'
+    copy {
+        from(fileTree("${rootDir}").files) {
+            include '**/*.xsd'
+            exclude '**/002*.xsd'
+            exclude '**/068*.xsd'
+            exclude '**/161*.xsd'
+            exclude '**/196*.xsd'
+            exclude '**/197*.xsd'
+        }
+        into websiteDir+'/dtds'
+    }
+}
+
+task gitInfoFooter(group: committerGroup, description: 'Update the Git Branch-revision info in the footer') << {
+    def branch
+    def revision
+    def timestamp = new Date().format 'yyyy-MM-dd HH:mm:ss'
+    File gitFooterFile = new File("${rootDir}/runtime/GitInfo.ftl")
+
+    def branchOutput = new ByteArrayOutputStream()
+    exec{
+        commandLine 'git', 'rev-parse', '--abbrev-ref', 'HEAD'
+        standardOutput = branchOutput
+    }
+    branch = branchOutput.toString()
+    def revisionOutput = new ByteArrayOutputStream()
+    exec{
+        commandLine 'git', 'rev-parse', 'HEAD'
+        standardOutput = revisionOutput
+    }
+    revision = revisionOutput.toString()
+    gitFooterFile.delete()
+    gitFooterFile.createNewFile()
+    gitFooterFile << "Branch: ${branch}"
+    gitFooterFile << "Revision: ${revision}"
+    gitFooterFile << "Built on: ${timestamp}" + System.lineSeparator()
+    gitFooterFile << "Java Version: ${org.gradle.internal.jvm.Jvm.current()}"
+}
+
+task svnInfoFooter(group: committerGroup, description: 'Update the Subversion revision info in the footer') << {
+    def timestamp = new Date().format 'yyyy-MM-dd HH:mm:ss'
+    File svnFooterFile = new File("${rootDir}/runtime/SvnInfo.ftl")
+    def svnOutput = new ByteArrayOutputStream()
+    exec{
+        commandLine 'svn', 'info', '--xml'
+        standardOutput = svnOutput
+    }
+    def info = new XmlParser().parseText(svnOutput.toString())
+    svnFooterFile.delete()
+    svnFooterFile.createNewFile()
+    svnFooterFile << "Branch: ${info.entry.url.text()}" + System.lineSeparator()
+    svnFooterFile << "Revision: ${info.entry.commit.@revision}" + System.lineSeparator()
+    svnFooterFile << "Built on: ${timestamp}" + System.lineSeparator()
+    svnFooterFile << "Java Version: ${org.gradle.internal.jvm.Jvm.current()}"
+}
+
+// ========== hidden support tasks ==========
+
+/* without executing this task, a test would fail that is named
+ * org.apache.ofbiz.base.util.test.UtilObjectTests.testGetObjectFromFactory()
+ *
+ * The test fails because it requires defining a service provider, read more below.
+ * http://docs.oracle.com/javase/8/docs/technotes/guides/jar/jar.html#Service_Provider
+ */
+task createBaseTestServiceProviderJar << {
+    ant.jar(destfile: "${rootDir}/build/libs/ofbiz-base-test.jar") {
+        service(type: 'org.apache.ofbiz.base.util.test.UtilObjectTests$TestFactoryIntf') {
+            provider(classname: 'org.apache.ofbiz.base.util.test.UtilObjectTests$FirstTestFactory')
+            provider(classname: 'org.apache.ofbiz.base.util.test.UtilObjectTests$SecondTestFactory')
+        }
+    }
+}
+classes.dependsOn createBaseTestServiceProviderJar
+
+/* ========================================================
+ * Rules-based OFBiz server commands
+ * ======================================================== */
+
+tasks.addRule('Pattern: ofbiz <Commands>: Execute OFBiz startup commands') { String taskName ->
+    if(taskName ==~ /^ofbiz\s.*/ || taskName == 'ofbiz') {
+        def arguments = (taskName - 'ofbiz').toLowerCase().tokenize(' ')
+        createOfbizCommandTask(taskName, arguments, jvmArguments, false)
+    }
+}
+
+tasks.addRule('Pattern: ofbizDebug <Commands>: Execute OFBiz startup commands in remote debug mode') { String taskName ->
+    if(taskName ==~ /^ofbizDebug\s.*/ || taskName == 'ofbizDebug') {
+        def arguments = (taskName - 'ofbizDebug').toLowerCase().tokenize(' ')
+        createOfbizCommandTask(taskName, arguments, jvmArguments, true)
+    }
+}
+
+tasks.addRule('Pattern: ofbizSecure <Commands>: Execute OFBiz startup commands pre-loading the notsoserial Java agent') { String taskName ->
+    if(taskName ==~ /^ofbizSecure\s.*/ || taskName == 'ofbizSecure') {
+        def arguments = (taskName - 'ofbizSecure').toLowerCase().tokenize(' ')
+        jvmArguments.add('-server')
+        jvmArguments.add("-javaagent:${rootDir}/tools/security/notsoserial/notsoserial-1.0-SNAPSHOT.jar")
+        jvmArguments.add("-Dnotsoserial.whitelist=${rootDir}/tools/security/notsoserial/empty.txt")
+        jvmArguments.add("-Dnotsoserial.dryrun=${rootDir}/tools/security/notsoserial/is-deserialized.txt")
+        jvmArguments.add("-Dnotsoserial.trace=${rootDir}/tools/security/notsoserial/deserialize-trace.txt")
+        createOfbizCommandTask(taskName, arguments, jvmArguments, false)
+    }
+}
+
+tasks.addRule('Pattern: ofbizBackground <Commands>: Execute OFBiz startup commands in background and output to console.log') { String taskName ->
+    if(taskName ==~ /^ofbizBackground\s.*/ || taskName == 'ofbizBackground') {
+        createOfbizBackgroundCommandTask(taskName)
+    }
+}
+
+tasks.addRule('Pattern: ofbizBackgroundSecure <Commands>: Execute OFBiz startup commands in background (secure mode) and output to console.log') { String taskName ->
+    if(taskName ==~ /^ofbizBackgroundSecure\s.*/ || taskName == 'ofbizBackgroundSecure') {
+        createOfbizBackgroundCommandTask(taskName)
+    }
+}
+
+/* ========================================================
+ * Helper Functions
+ * ======================================================== */
+
+def createOfbizCommandTask(taskName, arguments, jvmArguments, isDebugMode) {
+
+    def ofbizJarName = buildDir.toString()+'/libs/'+project.name+'.jar'
+
+    task(type: JavaExec, dependsOn: build, taskName) {
+        jvmArgs(jvmArguments)
+        debug = isDebugMode
+        classpath = files(ofbizJarName)
+        main = ofbizMainClass
+        arguments.each { argument ->
+            args argument
+        }
+    }
+}
+
+def createOfbizBackgroundCommandTask(taskName) {
+    def os = System.getProperty("os.name").toLowerCase()
+    def sourceTask = taskName.tokenize().first()
+    def arguments = (taskName - sourceTask)
+
+    def targetTask
+    def gradleRunner
+
+    if(sourceTask == 'ofbizBackground') {
+        targetTask = 'ofbiz'
+    } else if(sourceTask == 'ofbizBackgroundSecure') {
+        targetTask = 'ofbizSecure'
+    }
+
+    if (os.contains("windows")) {
+        gradleRunner = 'gradlew.bat'
+    } else {
+        gradleRunner = './gradlew'
+    }
+
+    task (taskName) {
+        doLast {
+            spawnProcess(gradleRunner, "${targetTask} ${arguments}")
+        }
+    }
+}
+
+def spawnProcess(command, arguments) {
+    ProcessBuilder pb = new ProcessBuilder(command, arguments)
+    File consoleLog = file("${rootDir}/runtime/logs/console.log");
+
+    pb.directory(file("${rootDir}"))
+    pb.redirectErrorStream(true)
+    pb.redirectOutput(ProcessBuilder.Redirect.appendTo(consoleLog))
+    pb.start()
+}
+
+def getDirectoryInActiveComponentsIfExists(String dirName) {
+    def dirInComponents = []
+    iterateOverActiveComponents { component ->
+        def subDir = file(component.toString() + '/' + dirName)
+        if(subDir.exists()) {
+            dirInComponents.add subDir
+        }
+    }
+    return dirInComponents
+}
+
+def deleteAllInDirWithExclusions(dirName, exclusions) {
+    ant.delete (includeEmptyDirs: 'true', verbose: 'on') {
+        fileset(dir: dirName, includes: '**/*', erroronmissingdir: "false") {
+            exclusions.each { exclusion ->
+                exclude name: exclusion
+            }
+        }
+    }
+}
+
+def getTasksMatchingRegex(theRegex) {
+    def filteredTasks = []
+    tasks.each { task ->
+        if(task.name ==~ theRegex) {
+            filteredTasks.add(task)
+        }
+    }
+    return filteredTasks
+}
+
+def generateFileFromTemplate(templateFileInFullPath, targetDirectory, filterTokens, newFileName) {
+    copy {
+        from (templateFileInFullPath) {
+            filter ReplaceTokens, tokens: filterTokens
+            rename templateFileInFullPath.tokenize('/').last(), newFileName
+        }
+        into targetDirectory
+    }
+}
+
+def getJarManifestClasspathForCurrentOs() {
+    def osClassPath = ''
+    if(System.getProperty('os.name').toLowerCase().contains('windows')) {
+        configurations.runtime.files.each { cpEntry ->
+            osClassPath += '\\' + cpEntry.toString() + ' '
+        }
+    } else {
+        osClassPath = configurations.runtime.files.collect { "$it" }.join(' ')
+    }
+    return osClassPath
+}