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

apply plugin: virgobuild.VirgoToolsPlugin

if (System.properties['eclipse.build'] == 'true') {
    // https://gradle.org/docs/current/userguide/build_environment.html
    // https://wiki.eclipse.org/Hudson#Why_use_a_Proxy.3F
    println "Checking that proxy properties are set before proceeding..."
    if (!System.properties['http.proxyHost'] && !System.properties['http.proxyPort']) {
        throw new StopActionException("Properties 'http.proxyHost' and 'http.proxyPort' are both not set.")
    }
    println 'http.proxyHost = ' + System.properties['http.proxyHost']
    println 'http.proxyPort = ' + System.properties['http.proxyPort']
    println 'http.nonProxyHosts = ' + System.properties['http.nonProxyHosts']
    println 'Done.'
}

buildscript {
    repositories {
        mavenLocal()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
        if (System.properties['local.build'] == 'true') {
            jcenter()
            maven { url 'https://repo.spring.io/libs-release' }
        }
    }
    dependencies {
        classpath "gradle.plugin.org.eclipse.virgo.bundlor:bundlor-plugin:0.2"
        if (System.properties['include.docs'] == 'true') {
            // docbook processing
            classpath 'net.sf.docbook:docbook-xsl:1.78.1:resources@zip'
            // TODO use docbook 4.5 to reduce buildtime? 4.5 DTDs are not available locally?
            // TODO alternatively switch to docbook 5.0?
            classpath 'net.sf.docbook:docbook-xml:5.0:xsd-resources@zip'
            classpath 'net.sf.docbook:docbook-xsl-saxon:1.0.0'
            classpath 'org.apache.xerces:resolver:2.9.1'
            classpath 'org.apache.xerces:xercesImpl:2.9.1'
            classpath 'saxon:saxon:6.5.3'
            classpath 'net.sf.xslthl:xslthl:2.0.1'
            classpath 'org.apache.xmlgraphics:fop:0.95-1@jar'
            classpath 'org.apache.xmlgraphics:xmlgraphics-commons:1.3'
            classpath 'org.apache.xmlgraphics:batik-bridge:1.7@jar'
            classpath 'org.apache.xmlgraphics:batik-util:1.7@jar'
            classpath 'org.apache.xmlgraphics:batik-css:1.7@jar'
            classpath 'org.apache.xmlgraphics:batik-dom:1.7'
            classpath 'org.apache.xmlgraphics:batik-svg-dom:1.7@jar'
            classpath 'org.apache.avalon.framework:avalon-framework-api:4.3.1'
        }
    }
}

def timestamp = new Date().format('yyyyMMddHHmmss', TimeZone.getTimeZone('GMT'))

defaultTasks 'clean', 'jar', 'build', 'distZip'

def Properties versions = new Properties()
versions.load(new FileInputStream(project.rootProject.file('gradle.properties')))
project.ext.props = versions

allprojects() {
    if (System.properties['ci.build'] == 'true') {
        version = '3.8.0.D-' + timestamp
    } else {
        version = '3.8.0.SNAPSHOT'
    }
}

ext.appsProjects = [
        project(':apps:org.eclipse.virgo.apps.repository.core'),
        project(':apps:org.eclipse.virgo.apps.repository.web'),
        project(':apps:org.eclipse.virgo.apps.splash'),
]

ext.kernelProjects = [
        project(':kernel:org.eclipse.virgo.kernel.agent.dm'),
        project(':kernel:org.eclipse.virgo.kernel.artifact'),
        project(':kernel:org.eclipse.virgo.kernel.deployer'),
        project(':kernel:org.eclipse.virgo.kernel.deployer.dm'),
        project(':kernel:org.eclipse.virgo.kernel.dmfragment'),
        project(':kernel:org.eclipse.virgo.kernel.equinox.extensions'),
        project(':kernel:org.eclipse.virgo.kernel.kerneldmfragment'),
        project(':kernel:org.eclipse.virgo.kernel.model'),
        project(':kernel:org.eclipse.virgo.kernel.osgi'),
        project(':kernel:org.eclipse.virgo.kernel.services'),
        project(':kernel:org.eclipse.virgo.kernel.userregion'),
        project(':kernel:org.eclipse.virgo.kernel.userregionfactory'),
        project(':kernel:org.eclipse.virgo.management.console'),
        project(':kernel:org.eclipse.virgo.management.fragment'),
        project(':kernel:org.eclipse.virgo.shell.command'),
]

ext.medicProjects = [
        project(':medic:org.eclipse.virgo.medic'),
        project(':medic:org.eclipse.virgo.medic.core'),
        project(':medic:org.eclipse.virgo.medic.logbackclassicfragment'),
        project(':medic:org.eclipse.virgo.medic.logbackcorefragment'),
]

ext.nanoProjects = [
        project(':nano:org.eclipse.virgo.nano.core'),
        project(':nano:org.eclipse.virgo.nano.deployer'),
        project(':nano:org.eclipse.virgo.nano.deployer.api'),
        project(':nano:org.eclipse.virgo.nano.deployer.hot'),
        project(':nano:org.eclipse.virgo.nano.management'),
        project(':nano:org.eclipse.virgo.nano.management.controller'),
        project(':nano:org.eclipse.virgo.nano.services.concurrent'),
        project(':nano:org.eclipse.virgo.nano.services.ds'),
]

ext.repositoryProjects = [
        project(':repository:org.eclipse.virgo.repository'),
]

ext.testUtils = [
        project(':test:org.eclipse.virgo.test.stubs'),
        project(':medic:org.eclipse.virgo.medic.test'),
        project(':kernel:org.eclipse.virgo.kernel.stubs'),
        project(':test:org.eclipse.virgo.test.tools'),
]

ext.utilProjects = [
        project(':util:org.eclipse.virgo.util.common'),
        project(':util:org.eclipse.virgo.util.env'),
        project(':util:org.eclipse.virgo.util.io'),
        project(':util:org.eclipse.virgo.util.jmx'),
        project(':util:org.eclipse.virgo.util.math'),
        project(':util:org.eclipse.virgo.util.osgi'),
        project(':util:org.eclipse.virgo.util.osgi.manifest'),
        project(':util:org.eclipse.virgo.util.parser.launcher'),
        project(':util:org.eclipse.virgo.util.parser.manifest'),
]

ext.webProjects = [
        project(':web:org.eclipse.virgo.web.core'),
        project(':web:org.eclipse.virgo.web.dm'),
        project(':web:org.eclipse.virgo.web.tomcat.support'),
        project(':web:org.eclipse.virgo.web.enterprise.appdeployer'),
        project(':web:org.eclipse.virgo.web.enterprise.applistener'),
        project(':web:org.eclipse.virgo.web.enterprise.catalina.fragment.webbeans'),
        project(':web:org.eclipse.virgo.web.enterprise.javax.persistence.extension'),
        project(':web:org.eclipse.virgo.web.enterprise.javax.persistence.provider.initializer'),
        project(':web:org.eclipse.virgo.web.enterprise.jsf.support'),
        project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.bval'),
        project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jotm'),
        project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.jpa'),
        project(':web:org.eclipse.virgo.web.enterprise.openejb.fragment.webbeans'),
        project(':web:org.eclipse.virgo.web.enterprise.openejb.initialiser'),
        project(':web:org.eclipse.virgo.web.enterprise.openejb.jpa.integration'),
        project(':web:org.eclipse.virgo.web.enterprise.openejb.tomcat.factory'),
        project(':web:org.eclipse.virgo.web.enterprise.openwebbeans.initialiser'),
        project(':web:org.eclipse.virgo.web.enterprise.persistence.openejb.classloading.hook'),
        project(':web:org.eclipse.virgo.web.enterprise.security'),
        project(':web:org.eclipse.virgo.web.enterprise.security.openejb.classloading.hook'),
        project(':web:org.eclipse.virgo.web.enterprise.security.valve'),
        project(':web:org.eclipse.virgo.web.enterprise.services.accessor'),
        project(':web:org.eclipse.virgo.web.servlet.adapter'),
        project(':web:org.eclipse.virgo.web.spring.integration'),
        project(':web:org.eclipse.virgo.web.war.deployer'),
]

ext.integrationTestProjects = [
        project(':test:org.eclipse.virgo.test.launcher'),
        project(':test:org.eclipse.virgo.test.framework'),

        project(':util:org.eclipse.virgo.util.integrationtest'),
        //	project(':medic:org.eclipse.virgo.medic.integrationtest'),
]

ext.smokeTestProjects = [
        project(':packaging:nano:org.eclipse.virgo.nano.smoketest'),
        project(':packaging:kernel:org.eclipse.virgo.kernel.smoketest'),
        project(':packaging:jetty-server:org.eclipse.virgo.jetty.smoketest'),
        project(':packaging:tomcat-server:org.eclipse.virgo.tomcat.smoketest'),
]

ext.javaProjects = ext.utilProjects + ext.medicProjects + ext.repositoryProjects + ext.nanoProjects + ext.kernelProjects + ext.webProjects + ext.appsProjects + ext.testUtils + ext.integrationTestProjects + smokeTestProjects +
        [
                project(':nano:org.eclipse.virgo.nano.authentication'),
                project(':nano:org.eclipse.virgo.nano.shutdown'),
        ]

if (System.properties['local.build'] == 'true') {
    ext.javaProjects += [
            // project(':system-tests:org.eclipse.virgo.server.svt'),
            // project(':performance-tests:org.eclipse.virgo.qa.performance'),
    ]
}

ext.aspectjProjects = [
        // these projects contain aspects
        project(':util:org.eclipse.virgo.util.jmx'),
        project(':test:org.eclipse.virgo.test.stubs'),
        project(':medic:org.eclipse.virgo.medic'),
        project(':nano:org.eclipse.virgo.nano.core'),
        // these projects are woven
        project(':kernel:org.eclipse.virgo.kernel.model'),
        project(':kernel:org.eclipse.virgo.kernel.osgi'),
]

if (System.properties['local.build'] == 'true') {
    if (System.properties['weaving.enabled'] == 'true') {
        ext.aspectjProjects + [
                project(':apps:org.eclipse.virgo.apps.repository.core'),
                project(':kernel:org.eclipse.virgo.kernel.deployer'),
                project(':kernel:org.eclipse.virgo.kernel.deployer.dm'),
                project(':kernel:org.eclipse.virgo.kernel.dmfragment'),
                project(':kernel:org.eclipse.virgo.shell.command'),
                project(':repository:org.eclipse.virgo.repository'),
                project(':web:org.eclipse.virgo.web.core'),
                project(':web:org.eclipse.virgo.web.dm'),
                project(':web:org.eclipse.virgo.web.tomcat.support'),
        ]
    }
}

/*
 TODO - What about these modules? Do they have AspectJ nature in Eclipse?
 aspectpath project(':nano:org.eclipse.virgo.nano.deployer.api')
 aspectpath project(':nano:org.eclipse.virgo.nano.deployer.hot')
 aspectpath project(':kernel:org.eclipse.virgo.kernel.services')
 */

ext.packagingProjects = [
        project(':packaging:nano'),
        project(':packaging:kernel'),
        project(':packaging:jetty-server'),
        project(':packaging:tomcat-server'),
]

ext {
    // used when copying features and products
    tokenMap = [
            'VIRGO.VERSION'                : version,

            'OSGI.SERVICES.VERSION'        : osgiServicesVersion, // used in oev.kernel.userregion.properties
            'OSGI.ENTERPRISE.VERSION'      : osgiEnterpriseVersion,

            'EQUINOX.HTTP.JETTY.VERSION'   : equinoxHttpJettyVersion,
            'EQUINOX.APP.VERSION'          : equinoxAppVersion,
            'EQUINOX.COMMON.VERSION'       : equinoxCommonVersion,
            'EQUINOX.CONFIGADMIN.VERSION'  : equinoxCmVersion,
            'EQUINOX.DS.VERSION'           : equinoxDsVersion,
            'EQUINOX.SC.VERSION'           : equinoxSimpleConfiguratorVersion,
            'EQUINOX.SC.M.VERSION'         : equinoxSimpleConfiguratorManipulatorVersion,
            'EQUINOX.CONSOLE.VERSION'      : equinoxConsoleVersion,
            'EQUINOX.CONSOLE.SSH.VERSION'  : equinoxConsoleSshVersion,
            'EQUINOX.EVENT'                : equinoxEventVersion,
            'EQUINOX.FRKA.E.VERSION'       : equinoxFrameworkadminEquinoxVersion,
            'EQUINOX.FRKA.VERSION'         : equinoxFrameworkadminVersion,
            'EQUINOX.PFRCS.VERSION'        : equinoxPreferencesVersion,
            'REGION.VERSION'               : equinoxRegionVersion,
            'EQUINOX.REGISTRY.VERSION'     : equinoxRegistryVersion,
            'EQUINOX.SECURITY.VERSION'     : equinoxSecurityVersion,

            'CONTENTTYPE.VERSION'          : eclipseCoreContenttypeVersion,
            'JOBS.VERSION'                 : eclipseCoreJobsVersion,
            'CORE.NET.VERSION'             : eclipseCoreNetVersion,
            'CORE.VERSION'                 : eclipseCoreRuntimeVersion,

            'ECF.FT.VERSION'               : eclipseEcfFiletransferVersion,
            'ECF.I.VERSION'                : eclipseEcfIdentityVersion,
            'ECF.P.FT.VERSION'             : eclipseEcfProviderFiletransferVersion,
            'ECF.SSL.VERSION'              : eclipseEcfSslVersion,
            'ECF.VERSION'                  : eclipseEcfVersion,

            'MINA.CORE.VERSION'            : minaCoreVersion,
            'SSHD.CORE.VERSION'            : apacheSshdCoreVersion,
            'FELIX.GOGO.COMMAND.VERSION'   : gogoCommandVersion,
            'FELIX.GOGO.RUNTIME.VERSION'   : gogoRuntimeVersion,
            'FELIX.GOGO.SHELL.VERSION'     : gogoShellVersion,

            'JOLOKIA.VERSION'              : jolokiaVersion,

            'SPRING.VERSION'               : springframeworkVersion,

            'GEMINI.MANAGEMENT.VERSION'    : geminiManagementVersion,
            // TODO rename to 'GENIMI.BLUEPRINT.VERSION'
            'SPRING.DM.VERSION'            : geminiBlueprintVersion,
            'GEMINI.WEB.VERSION'           : geminiWebVersion,

            'CATALINA.VERSION'             : apacheCatalinaVersion,

            'ASPECTJ'                      : aspectjVersion,
            'LOGBACK.CLASSIC.VERSION'      : logbackVersion,
            'LOGBACK.CORE.VERSION'         : logbackVersion,
            'SLF4J.API'                    : slf4jVersion,
            'SLF4J.JCL'                    : slf4jVersion,
            'SLF4J.LOG4J'                  : slf4jVersion,

            'C.FILEUPLOAD.VERSION'         : commonsFileuploadVersion,
            'C.IO.VERSION'                 : commonsIoVersion,

            'SCANNOTATION'                 : scannotationVersion,
            'JAVASSIST'                    : javassistVersion,
            'JOTM'                         : jotmVersion,
            'OBJECTWEB.ASM'                : objectwebAsmVersion,

            'JAVAX.ACTIVATION'             : javaxActivationVersion,
            'JAVAX.ANNOTATION'             : javaxAnnotationVersion,
            'JAVAX.EJB'                    : javaxEjbVersion,
            'JAVAX.EL'                     : javaxElVersion,
            'JAVAX.INJECT'                 : javaxInjectVersion,
            'JAVAX.JMS'                    : javaxJmsVersion,
            'JAVAX.MAIL'                   : javaxMailVersion,
            'JAVAX.PERSISTENCE'            : javaxPersistenceVersion,
            'JAVAX.RESOURCE'               : javaxResourceVersion,
            'JAVAX.SECURITY.AUTH'          : javaxSecurityAuthMessageVersion,
            'JAVAX.SECURITY.JACC'          : javaxSecurityJaccVersion,
            // TODO remove duplication 'JAVAX.SERVLET.VERSION' and 'JAVAX.SERVLET'
            'JAVAX.SERVLET.VERSION'        : javaxServletVersion,
            'JAVAX.SERVLET'                : javaxServletVersion,
            'JAVAX.SERVLET.JSP'            : javaxServletJspVersion,
            'JSTL.API'                     : javaxServletJspJstlApiVersion,
            'JSTL.IMPL'                    : javaxServletJspJstlImplOsgiVersion,
            'JAVAX.TRANSACTION'            : javaxTransactionVersion,
            'JAVAX.VALIDATION'             : javaxValidationVersion,
            'JAVAX.WEBSOCKET'              : javaxWebsocketVersion,
            'JAVAX.WSDL'                   : javaxWsdlVersion,
            'JAVAX.WS.RS'                  : javaxWsRsVersion,
            'JAVAX.XML.RPC'                : javaxXmlRpcVersion,

            'JETTY.VERSION'                : jettyVersion,
            'RAP.RWT.VERSION'              : rapRwtVersion,
            'RAP.RWT.OSGI.VERSION'         : rapRwtOsgiVersion,
            'RAP.JFACE.VERSION'            : rapJfaceVersion,
            'RAP.JFACE.DATABINDING.VERSION': rapJfaceDatabindingVersion,

            'P2.A.R.VERSION'               : p2ArtifactRepositoryVersion,
            'P2.CONSOLE.VERSION'           : p2ConsoleVersion,
            'P2.CORE.VERSION'              : p2CoreVersion,
            'P2.DIRECTOR.VERSION'          : p2DirectorVersion,
            'P2.ENGINE.VERSION'            : p2EngineVersion,
            'P2.GC.VERSION'                : p2GarbageCollectorVersion,
            'P2.JP.VERSION'                : p2JarProcessorVersion,
            'P2.METADATA.VERSION'          : p2MetadataVersion,
            'P2.M.R.VERSION'               : p2MetadataRepositoryVersion,
            'P2.PUBLISHER.VERSION'         : p2PublisherVersion,
            'P2.P.E.VERSION'               : p2PublisherEclipseVersion,
            'P2.REPOSITORY.VERSION'        : p2RepositoryVersion,
            'P2.T.E.VERSION'               : p2TouchpointEclipseVersion,
            'P2.T.N.VERSION'               : p2TouchpointNativesVersion,
            'P2.T.ECF.VERSION'             : p2TransportEcfVersion,

            'QUARTZ'                       : quartzVersion,
            'WB.COMMON'                    : apacheOpenwebbeansVersion,
            'WB.EE'                        : apacheOpenwebbeansEEVersion,
            'WB.EJB'                       : apacheOpenwebbeansEEVersion,
            'WB.IMPL'                      : apacheOpenwebbeansVersion,
            'WB.SPI'                       : apacheOpenwebbeansVersion,
            'WB.WEB'                       : apacheOpenwebbeansVersion,
            'WB.JSF'                       : apacheOpenwebbeansVersion,
            'WB.TOMCAT7'                   : apacheOpenwebbeansTomcat7Version,

            'COMMOMS.BEANUTILS'            : commonsBeanutilsVersion,
            'COMMONS.CLI'                  : commonsCliVersion,
            'COMMONS.COLLECTIONS'          : commonsCollectionsVersion,
            'COMMONS.DBCP'                 : commonsDbcpVersion,
            'COMMONS.LANG'                 : commonsLangVersion,
            'COMMONS.POOL'                 : commonsPoolVersion,

            'BVAL'                         : apacheBvalVersion,
            'G.CONNECTOR'                  : geronimoComponentsConnectorVersion,
            'G.TRANSACTIONS'               : geronimoComponentsTransactionVersion,
            'G.MANAGEMENT'                 : geronimoSpecsJ2eeManagementVersion,
            'G.OSGI.LOCATOR'               : geronimoSpecsOsgiLocatorVersion,
            'G.OSGI.REGISTRY'              : geronimoSpecsOsgiRegistryVersion,

            'CDI.API'                      : cdiApiVersion,

            'OE.API'                       : apacheOpenejbVersion,
            'OE.CORE'                      : apacheOpenejbCoreVersion,
            'OE.JAVAAGENT'                 : apacheOpenejbVersion,
            'OE.JEE'                       : apacheOpenejbVersion,
            'OE.LOADER'                    : apacheOpenejbVersion,
            'OE.JPA.INTEGRATION'           : apacheOpenejbVersion,
            'XB.ASM'                       : apacheXBeanAsmVersion,
            'XB.BUNDLEUTILS'               : apacheXBeanBundleutilsVersion,
            'XB.FINDER'                    : apacheXBeanFinderVersion,
            'XB.NAMING'                    : apacheXBeanNamingVersion,
            'XB.REFLECT'                   : apacheXBeanReflectVersion,
            'EL.ANTLR'                     : eclipsePersistenceAntlrVersion,
            'EL.ASM'                       : eclipsePersistenceAsmVersion,
            'EL.CORE'                      : eclipsePersistenceCoreVersion,
            'EL.JPA'                       : eclipsePersistenceJpaVersion,
            'EL.JPQL'                      : eclipsePersistenceJpaJpqlVersion,
            'FACES.API'                    : glassfishJavaxFacesVersion,
            'FACES.IMPL'                   : glassfishComSunFacesVersion,

            'DERBY'                        : apacheDerbyVersion,

            // used in documentation
            'project.name'                 : 'Virgo',
            'runtime.category'             : 'EclipseRT',
            'umbrella.product.name'        : 'Virgo Runtime Environment',
            'umbrella.product.name.short'  : 'Virgo Runtime',
            'tomcat.product.name'          : 'Virgo Server for Apache Tomcat',
            'tomcat.product.name.short'    : 'VTS',
            'jetty.product.name'           : 'Virgo Jetty Server',
            'jetty.product.name.short'     : 'VJS',
            'kernel.product.name'          : 'Virgo Kernel',
            'kernel.product.name.short'    : 'VK',
            'nano.product.name'            : 'Virgo Nano',
            'nano.product.name.short'      : 'VN',
            'nanoweb.product.name'         : 'Virgo Nano Web',
            'snaps.product.name'           : 'Virgo Snaps',
            'snaps.product.name.short'     : 'VS',
            'ebr'                          : 'SpringSource Enterprise Bundle Repository',
            'p2repo'                       : "http://download.eclipse.org/virgo/updatesite/${version}".toString(),
            'bundle.version'               : "${version}".toString(),
    ]
}

configure(javaProjects + aspectjProjects) {

    apply plugin: 'java'
    apply plugin: 'eclipse'

    sourceCompatibility = '1.8'
    targetCompatibility = '1.8'

    compileJava {
        options.encoding = 'utf-8'
        options.fork = true
        doFirst {
            options.forkOptions.with {
                executable = 'java'
                jvmArgs = [
                        '-cp',
                        configurations.ecj.asPath,
                        'org.eclipse.jdt.internal.compiler.batch.Main',
                        '-warn:-unused'
                ]
            }
        }
    }
    compileTestJava {
        options.encoding = 'utf-8'
        options.fork = true
        doFirst {
            options.forkOptions.with {
                executable = 'java'
                jvmArgs = [
                        '-cp',
                        configurations.ecj.asPath,
                        'org.eclipse.jdt.internal.compiler.batch.Main',
                        '-warn:-unused'
                ]
            }
        }
    }

    test {
        if (System.properties['ci.build'] == 'true') {
            ignoreFailures = true
        }
    }

    configurations { ecj {} }

    dependencies {
        ecj group: "org.eclipse.jdt.core.compiler", name: "ecj", version: ecjVersion

        testCompile group: 'junit', name: 'junit', version: junitVersion, configuration: "compile", ext: "jar"
        testRuntime group: 'org.eclipse.virgo.mirrored', name: "org.apache.commons.logging", version: commonsLoggingVersion, ext: "jar"
    }

    eclipse {
        jdt {
            sourceCompatibility = 1.8
            targetCompatibility = 1.8
        }
    }
}

configure(ext.utilProjects + ext.medicProjects + ext.repositoryProjects + ext.nanoProjects + ext.kernelProjects + ext.webProjects + ext.appsProjects) {
    assemble.doLast {
        println '|--> Assembled Jar File: ' + jar.archivePath
        if (System.properties['ci.build.signjars'] == 'true') {
            println '|--> Normalize Jar File: ' + jar.archivePath
            project.javaexec {
                main = 'org.eclipse.equinox.internal.p2.jarprocessor.Main'
                classpath Config.on(project).jarProcessorJar
                args = [
                        '-repack',
                        jar.archivePath
                ]
            }
            println '|--> Signing Jar File: ' + jar.archivePath
            exec {
                workingDir jar.destinationDir
                commandLine 'curl',
                        '-o',
                        jar.archivePath,
                        '-F',
                        "file=@${jar.archivePath}",
                        '--show-error',
                        'http://build.eclipse.org:31338/sign'
            }
            println '|--> Compress Jar File: ' + jar.archivePath
            project.javaexec {
                main = 'org.eclipse.equinox.internal.p2.jarprocessor.Main'
                classpath Config.on(project).jarProcessorJar
                args = [
                        '-pack',
                        jar.archivePath
                ]
            }
        } else {
            println '|--> Skipping normalize/signing/compression of Jar File: ' + jar.archivePath
        }
    }
}

configure(javaProjects) {
    task sourcesJar(type: Jar, dependsOn: classes) {
        classifier = 'sources'
        from sourceSets.main.allSource
    }

    artifacts {
        archives sourcesJar
    }
}

configure(javaProjects) {
    apply plugin: 'maven-publish'
    publishing {
        repositories {
            maven {
                name = "BuildEclipseOrg"
                url "/opt/public/rt/virgo/gradle/bundles"
            }
        }
        publications {
            virgo(MavenPublication) {
                groupId 'org.eclipse.virgo'
                from components.java
                artifact sourcesJar {
                    classifier "sources"
                }
            }
        }
    }
}

configure(javaProjects + aspectjProjects + packagingProjects + project(":org.eclipse.virgo.site")) {
    repositories {
        mavenCentral()
        ivy {
            url "http://build.eclipse.org/rt/virgo/ivy/bundles/release/"
            layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
        }
        ivy {
            url "http://build.eclipse.org/rt/virgo/ivy/bundles/milestone/"
            layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
        }
    }
}

configure(javaProjects) {
    if (System.properties['ci.build'] == 'true' || System.properties['include.findbugs'] == 'true') {
        apply plugin: 'findbugs'

        findbugs {
            toolVersion = "3.0.1"
            sourceSets = [sourceSets.main]
            ignoreFailures = true
            effort = "max"
            reportLevel = "high"
            excludeFilter = file("$rootProject.projectDir/config/findbugs/excludeFilter.xml")
        }
    }
}

configure(javaProjects) {
    if (System.properties['ci.build'] == 'true' || System.properties['include.jacoco'] == 'true') {
        apply plugin: "jacoco"

        jacoco { toolVersion = "0.7.4.201502262128" }
    }
}

configure(packagingProjects) {
    configurations {
        aspects { // visibility="private"
            description = "Aspects to be woven"
        }

        nanoLib {
            description = "Dependencies to be packaged in lib"
            transitive = true
            exclude module: "org.eclipse.osgi"
        }
        nanoLibEndorsed { description = "Dependencies to be packaged in endorsed" }
        nanoLibPersistence {
            transitive = false
            description = "Dependencies to be packaged in lib/persistence"
        }
        nanoPickup {
            transitive = false
            description = "Dependencies to be packaged in pickup"
        }
        kernelPluginsExtras {
            transitive = false
            description = "Dependencies to be published without p2 into Kernel plugin directory"
        }
        repositoryExt {
            transitive = false
            description = "Dependencies to be packaged in repository/ext"
        }
    }
}

ext.wabProjects = [
        project(':apps:org.eclipse.virgo.apps.splash'),
        project(':kernel:org.eclipse.virgo.management.console'),
]

configure(utilProjects + medicProjects + repositoryProjects + nanoProjects + kernelProjects + webProjects + appsProjects) {

    apply plugin: 'org.eclipse.virgo.bundlor'

    task('addProjectVersionToGradlePropertiesTask', type: Copy) {
        ext.outputDir = new File(buildDir, 'bundlor-properties')
        inputs.file project.rootProject.file('gradle.properties')
        outputs.dir ext.outputDir
        from project.rootProject.file('gradle.properties')
        into ext.outputDir
        filter(ReplaceTokens, tokens: [
                'VIRGO.VERSION': version,
        ])
    }

    task('mergeClassesAndResources', type: Copy, dependsOn: 'compileJava') {
        ext.bundlorInputPath = new File(buildDir, 'bundlor-inputPath')
        inputs.file sourceSets.main.output.classesDir
        inputs.file sourceSets.main.resources
        outputs.dir ext.bundlorInputPath
        from sourceSets.main.output.classesDir
        from sourceSets.main.resources
        into ext.bundlorInputPath
    }

    project.tasks.'bundlor'.dependsOn('addProjectVersionToGradlePropertiesTask', 'mergeClassesAndResources')

    bundlor {
        ext.bundlorInputPath = new File(buildDir, 'bundlor-inputPath')
        project.tasks['bundlor'].inputs.file ext.bundlorInputPath
        manifestTemplatePath = "template.mf"
        propertiesPath = new File("${project.buildDir}/bundlor-properties/gradle.properties")
        inputPath = ext.bundlorInputPath
        failOnWarnings = false
    }
}

configure(wabProjects) {
    apply plugin: 'war'

    war.dependsOn('bundlor')

    war {
        extension = 'jar'
        rootSpec.exclude("**/*.jar")
        manifest = project.manifest { from 'build/bundlor/META-INF/MANIFEST.MF' }
    }
}

configure(aspectjProjects) {
    configurations.compile.dependencies.each { dep ->
        if (dep.hasProperty("dependencyProject")) {
            println "dependent project: ${dep}"
            iajcClasspath += ":" + dep.dependencyProject.buildDir + "/bundles/release/classes.jar"
        } else {
            println "other dependency: ${dep}"
        }
    }

    configurations {
        ajtools {
            transitive = false
            description = "AspectJ tools runtime"
        }

        aspectpath {
            transitive = false
            description = "Aspects are applied to types present in the project"
        }

        testAspectpath {
            transitive = false
            description = "Aspects are applied to tests present in the project"
        }
    }

    dependencies {
        compile "org.aspectj:aspectjrt:${project.aspectjVersion}"
        ajtools "org.aspectj:aspectjtools:${project.aspectjVersion}"
    }

    apply plugin: aspectj.AspectJPlugin

    // Add nature and buildCommand
    eclipse.project {
        natures 'org.eclipse.ajdt.ui.ajnature'
        buildCommand 'org.eclipse.ajdt.core.ajbuilder'
    }

    eclipse {
        classpath {
            file {
                withXml { xmlProvider ->
                    def classpath = xmlProvider.asNode()
                    def xmlparser = new XmlParser()
                    configurations.aspectpath.dependencies.each { dep ->
                        if (dep.hasProperty("dependencyProject")) {
                            println "Name of project containing aspects to weave: " + dep.dependencyProject.name
                            classpath.children().findAll { it['@path'] == '/' + dep.dependencyProject.name }.each {
                                println "Adding ${it['@path']} to Aspect Path"
                                def attrs = xmlparser.createNode(it, 'attributes', [:])
                                xmlparser.createNode(attrs, 'attribute', [name: 'org.eclipse.ajdt.aspectpath', value: 'org.eclipse.ajdt.aspectpath']);
                            }
                        }
                    }
                }
            }
        }
    }
}

configure(testUtils) {
    dependencies {
        // changing junit dependency to configuration compile - this is a test util project based on JUnit :)
        compile group: 'junit', name: 'junit', version: junitVersion
    }
}

configure(integrationTestProjects) {
    dependencies {
        // OSGi runtime
        testRuntime group: "org.eclipse.virgo.mirrored", name: "org.eclipse.osgi", version: equinoxVersion, configuration: "compile", ext: "jar"

        testCompile group: "org.eclipse.virgo.mirrored", name: "javax.inject", version: javaxInjectVersion, configuration: "compile", ext: "jar"

        // PaxExam
        testRuntime group: "org.slf4j", name: "slf4j-api", version: slf4jVersion
        testCompile group: "org.ops4j.pax.exam", name: "pax-exam-junit4", version: paxExamJunit4Version
        testRuntime group: "org.ops4j.pax.exam", name: "pax-exam-container-native", version: paxExamContainerNativeVersion
        testRuntime group: "org.ops4j.pax.exam", name: "pax-exam-link-mvn", version: paxExamLinkMvnVersion
        testRuntime group: "org.ops4j.pax.url", name: "pax-url-aether", version: paxUrlAetherVersion
        testRuntime group: "org.ops4j.pax.url", name: "pax-url-aether", version: paxUrlAetherVersion
        testRuntime group: "org.ops4j.pax.url", name: "pax-url-wrap", version: paxUrlWrapVersion
    }
}

configure(smokeTestProjects) {
    sourceSets {
        smokeTest {
            java.srcDir file('src/smokeTest/java')
            resources.srcDir file('src/smokeTest/resources')
        }
    }

    task smokeTest(type: Test) {
        testClassesDir = sourceSets.smokeTest.output.classesDir
        classpath = sourceSets.smokeTest.runtimeClasspath
    }

    dependencies {
        testCompile project(':test:org.eclipse.virgo.test.tools')
        testCompile project(':util:org.eclipse.virgo.util.io')

        testRuntime group: "org.apache.httpcomponents", name: "httpcore", version: httpcomponentsCoreVersion
        testRuntime group: "org.apache.httpcomponents", name: "httpclient", version: httpcomponentsClientVersion

        smokeTestCompile sourceSets.main.output
        smokeTestCompile configurations.testCompile
        smokeTestCompile sourceSets.test.output
        smokeTestRuntime configurations.testRuntime
    }
}

task wrapper(type: Wrapper) {
    description 'Creates a local Gradle Wrapper'
    group = 'Build Setup'
    gradleVersion = '3.5' // CQ 13634
}
