dockerizor {
	repository = 'virgo-recipe/accessing-data-mongodb-runtime'
    description = 'Virgo Recipe MongoDB (runtime-only) created with Gradle Plugin: com.eclipsesource.dockerizor'

	createLocalCopy = true

	virgoVersion = 'latest'
	hudsonJobName = 'virgo-blueprint3'

	virgoHome = '/home/virgo/virgo-recipe-accessing-data-mongodb-runtime'
}

repositories {
	mavenCentral()
}

//tag::dependencies[]
dependencies {
	repositoryUsr 'org.reactivestreams:reactive-streams:1.0.2'
	repositoryUsr "org.mongodb:mongo-java-driver:${mongoJavaDriverVersion}"
	repositoryUsr "org.mongodb:mongodb-driver-async:${mongoJavaDriverVersion}"
	repositoryUsr 'org.mongodb:mongodb-driver-reactivestreams:${mongodbDriverReactivestreamsVersion}'

	//	repositoryUsr "org.springframework.data:spring-data-commons:${springDataCommonsVersion}"
//	repositoryUsr "org.springframework.data:spring-data-mongodb:${springDataMongodbVersion}"

	// Spring Data 2.0.8+ doesn't provide OSGi metadata
	repositoryUsr files("org.springframework.data.commons-${springDataCommonsVersion}/build/org.springframework.data.commons-${springDataCommonsVersion}.jar")
	repositoryUsr files("org.springframework.data.mongodb-${springDataMongodbVersion}/build/org.springframework.data.mongodb-${springDataMongodbVersion}.jar")
}
//end::dependencies[]

// OSGi-ify 3rd party dependencies

subprojects {
	apply plugin: 'base'

	repositories {
		mavenCentral()
		maven {
			url "http://build.eclipse.org/rt/virgo/gradle/bundles"
		}
	}

	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')
	}

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

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

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

	task bundlor(type: JavaExec, dependsOn: createBuildDir) {

		classpath = configurations.bundlorRuntime

		// template.mf based on
		// * https://github.com/spring-projects/spring-data-commons/blob/1.13.x/template.mf
		// * https://github.com/spring-projects/spring-data-mongodb/blob/1.10.x/spring-data-mongodb/template.mf

		// versions taken from
		// * https://github.com/spring-projects/spring-data-build/blob/2.0.8.RELEASE/parent/pom.xml
		// * https://github.com/spring-projects/spring-data-commons/blob/2.0.8.RELEASE/pom.xml
		// * https://github.com/spring-projects/spring-data-mongodb/blob/2.0.8.RELEASE/pom.xml
		main = 'org.eclipse.virgo.bundlor.commandline.Bundlor'
		args '-D', "version=${artifactVersion}"
		args '-D', "guava=19"
		args '-D', "jackson=2.9.6"
		args '-D', "javaslang=2.0.6"
		args '-D', "jodatime=2.9.9"
		args '-D', "jsonpath=2.4.0"
		args '-D', "mongo=3.5.0"
		args '-D', "mongodbDriverReactivestreamsVersion=${mongodbDriverReactivestreamsVersion}"
		args '-D', "objenesis=2.6"
		args '-D', "querydsl=4.1.1"
		args '-D', "scala=2.11.7"
		args '-D', "slf4j=1.7.25"
		args '-D', "spring=5.0.7.RELEASE"
		args '-D', "springHateoas=0.24.0"
		args '-D', "springDataCommonsVersion=${springDataCommonsVersion}"
		args '-D', "threetenbp=1.3.6"
		args '-D', "validation=1.1.0.Final"
		args '-D', "vavr=0.9.2"
		args '-D', "xmlbeam=1.4.15"
		args '-i', "${-> configurations.sourceBundle[0]}" // lazy GString to resolve the configuration at runtime
		args '-m', "${artifactName}.mf"
		args '-o', outputFile

		doFirst() {
			println "Processing ${-> configurations.sourceBundle[0]} with ${artifactName}.mf"
		}

		doLast() {

		}
	}

	dockerize.dependsOn bundlor
}
