buildscript {
    repositories { mavenCentral() }
    dependencies {
        classpath 'org.apache.ivy:ivy:2.4.0'
    }
}

defaultTasks 'clean', 'bundlor', 'publishToMavenLocal', 'test', 'publishIvyPublicationToIvyRepository'

apply plugin: 'java'

allprojects {
    apply plugin: 'java'

    repositories {
        mavenCentral()
        maven {
            url "https://build.eclipse.org/rt/virgo/gradle/bundles"
        }
        ivy {
            url "https://build.eclipse.org/rt/virgo/ivy/bundles/release/"
            layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
        }
    }
}

subprojects {
    apply plugin: 'ivy-publish'
    apply plugin: 'maven-publish'

    configurations {
        bundlorRuntime
        sourceBundle
    }

    dependencies {
        bundlorRuntime('org.eclipse.virgo.bundlor:org.eclipse.virgo.bundlor.commandline:1.1.3.M01')
        bundlorRuntime('org.eclipse.virgo.bundlor:org.eclipse.virgo.bundlor:1.1.3.M01')
        bundlorRuntime('org.eclipse.virgo.bundlor:org.eclipse.virgo.bundlor.blint:1.1.3.M01')
    }

    task createBuildDir() {
        doLast() {
            file(project.buildDir).mkdir()
        }
    }

    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
    }

    def artifactName = project.name.split('-')[0]
    def artifactVersion = project.name.split('-')[1]

    def outputFile = new File(file(project.buildDir), "${project.name}.jar")

    def propertiesPath = new File(file(project.buildDir), "bundlor-properties/gradle.properties")

    task bundlor(type: JavaExec, dependsOn: [createBuildDir, 'addProjectVersionToGradlePropertiesTask']) {

        classpath = configurations.bundlorRuntime

        main = 'org.eclipse.virgo.bundlor.commandline.Bundlor'
        args '-r', propertiesPath
        args '-D', "springframeworkVersion=${springframeworkVersion}"
        args '-i', "${-> configurations.sourceBundle[0]}" // lazy GString to resolve the configuration at runtime
        args '-m', "${artifactName}.mf"
        args '-o', outputFile
        args '-f'
    }

    publishing {
        publications {
            ivy(IvyPublication) {
                organisation 'org.eclipse.virgo.mirrored'
                module "${artifactName}"
                revision "${artifactVersion}"
                artifact(outputFile)
            }
            maven(MavenPublication) {
                groupId 'org.eclipse.virgo.mirrored'
                artifactId "${artifactName}"
                version "${artifactVersion}"
                artifact(outputFile)
            }
        }
        repositories {
            ivy {
                // doesn't work anymore on JIPP - no access to /opt/public
//                url "/opt/public/rt/virgo/ivy/bundles/release"
                // use this path and the script publish.sh to push the bundles to build server
                url "/tmp/ivy"
//                url "/home/data/httpd/download.eclipse.org/virgo"
            }
        }
    }
}

dependencies {
    testCompile "junit:junit:${junitVersion}"
    testCompile "org.ops4j.pax.exam:pax-exam-junit4:$paxExamJunit4Version"
    testCompile 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"
    testRuntime "org.ops4j.pax.exam:pax-exam-container-native:$paxExamContainerNativeVersion"
    testRuntime "org.ops4j.pax.exam:pax-exam-link-mvn:$paxExamLinkMvnVersion"
    testRuntime "org.ops4j.pax.url:pax-url-aether:$paxUrlAetherVersion"
}

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