buildscript {
	repositories {
		mavenCentral()
        jcenter()
	    maven {
	      url "https://plugins.gradle.org/m2/"
	    }
	}
	dependencies {
		classpath "gradle.plugin.org.eclipse.virgo.bundlor:bundlor-plugin:0.2"
		classpath "gradle.plugin.com.eclipsesource.dockerizor:dockerizor:0.5"
        classpath 'org.asciidoctor:asciidoctor-gradle-plugin:1.5.0'
	}
}

apply plugin: 'org.asciidoctor.gradle.asciidoctor'

ext.virgoProjects = [
	project(':org.eclipse.virgo.samples.recipe.restservice'),
]

ext.dockerProjects = [
	project(':recipe-rest-service-runtime'),
	project(':recipe-rest-service-app'),
]

configure(virgoProjects + dockerProjects) {
	repositories {
		mavenLocal()
		mavenCentral()
		ivy {
			url "http://build.eclipse.org/rt/virgo/ivy/bundles/release/"
			layout "pattern", { artifact "[organisation]/[module]/[revision]/[artifact]-[revision].[ext]" }
		}
	}
}

configure(virgoProjects) {
	apply plugin: 'java'
	apply plugin: 'eclipse'
	apply plugin: 'eclipse-wtp'

	version = '0.1.0.BUILD-SNAPSHOT'

	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',
					'-source',
					'1.8',
	                '-target',
	                '1.8',
					'-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',
					'-source',
					'1.8',
					'-target',
					'1.8',
					'-warn:-unused'
				]
			}
		}
	}

	eclipse {
		jdt {
			sourceCompatibility = 1.8
			targetCompatibility = 1.8
		}

		project {
		  	natures 'org.eclipse.virgo.ide.facet.core.bundlenature', 'org.eclipse.wst.common.project.facet.core.nature'
		}

		wtp {
		    facet {
				facets = []
				facet name: 'jst.java', version: '1.8'
				facet name: 'org.eclipse.virgo.server.bundle', version: '1.0'
			}
		}
	}

	configurations {  ecj { } }

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

configure(virgoProjects) {
	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
	}

	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(dockerProjects) {
	// add the build task 'clean'
	apply plugin: 'base'

	// add the build task 'dockerize'
	apply plugin: 'com.eclipsesource.dockerizor'

	dockerizor {
		maintainer = 'Florian Waibel <fwaibel@eclipsesource.com>'

		javaImage = 'java:openjdk-8u72-jre'

		virgoVersion = 'latest'
		hudsonJobName = 'gradle-build'

		createLocalCopy = System.properties['local.build'] == 'true'
		removeAdminConsole = System.properties['local.build'] != 'true'

		virgoFlavour = 'VTS'
		virgoVersion = 'latest'
	}

	dockerize.dependsOn configurations.repositoryExt
	dockerize.dependsOn configurations.repositoryUsr
}

task wrapper(type: Wrapper) {
    gradleVersion = '2.10'
}
