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

import static virgobuild.VirgoToolsPlugin.DOWNLOAD_VIRGO_BUILD_TOOLS_TASK_NAME
import static virgobuild.VirgoToolsPlugin.installProduct
import static virgobuild.VirgoToolsPlugin.publishProduct

import virgobuild.Config

apply plugin: 'distribution'

distributions {
    main {
        baseName = 'virgo-tomcat-server'
        contents {
            from ( 'src/main/filtered' ) {
                include ( '**/*.properties' )
                include ( '**/.version' )
                filter(ReplaceTokens, tokens: tokenMap) // tokens are used in e.g. oev.kernel.userregion.properties
            }
            from ( 'src/main/filtered' ) {
                include ( 'bin/*.sh' )
                fileMode 0755
            }
            from ( "${buildDir}/VTS/tomcat-server/" ) { exclude ( 'Eclipse.app' ) }
            from ( "${buildDir}/common_resources/" )
        }
    }
}

task ('assembleTomcatServer', dependsOn: [
    'installProductTomcatServer',
    'packageResourcesAndProducts'
]) {
    installDist.dependsOn(['assembleTomcatServer'])
    distZip.dependsOn(['assembleTomcatServer'])
}

task ('packageResourcesAndProducts', dependsOn: [
    ':kernel:org.eclipse.virgo.kernel.equinox.extensions:jar',
    ':kernel:org.eclipse.virgo.management.console:war',
    ':nano:org.eclipse.virgo.nano.authentication:jar',
    ':nano:org.eclipse.virgo.nano.shutdown:jar',
    ':util:org.eclipse.virgo.util.env:jar',
]) {
    doLast {
        packageConfiguration('lib', configurations.nanoLib, file("${buildDir}/common_resources/lib/"))
        packageConfiguration('libPersistence', configurations.nanoLibPersistence, file("${buildDir}/common_resources/lib/persistence/"))
        packageConfiguration('libEndorsed', configurations.nanoLibEndorsed, file("${buildDir}/common_resources/lib/endorsed/"))
        packageConfiguration('pluginsExtras', configurations.kernelPluginsExtras, file("${buildDir}/common_resources/plugins/"))
        packageConfiguration('repositoryExt', configurations.repositoryExt, file("${buildDir}/common_resources/repository/ext/"))
        packageConfiguration('pickup', configurations.nanoPickup, file("${buildDir}/common_resources/pickup/"))
    }
}

task ('publishTomcatServer', dependsOn: [
    ':org.eclipse.virgo.site:publishBase',
    ':org.eclipse.virgo.site:publishKernelBase',
]) {
    description = "Publishes a product to a p2 repository. The publishing uses ANY environment configurations."

    def product = 'tomcat-server'
    def productFileLocation = file("${projectDir}/publish_resources/products/${product}/${product}.product")
    def javaProfileLocation = file("${projectDir}/src/main/dist/configuration/java-server.profile")

    doLast() { publishProduct(project, productFileLocation, javaProfileLocation) }
}

task ('installProductTomcatServer', dependsOn: ['publishTomcatServer',]) {

    description = "Installs a Virgo product to a desired destination. Default profile(roaming) is VIRGOProfile, the environment cofigurations are ANY."

    def product = 'tomcat-server'
    def shortProduct = 'VTS'
    def destinationDir = file("${buildDir}/${shortProduct}/${product}")
    def productIu = "${product}.product"

    doLast() { installProduct(project, productIu, destinationDir) }
}
