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