buildscript {
    repositories {
        mavenLocal()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath "gradle.plugin.org.eclipse.virgo.bundlor:bundlor-plugin:0.2"
    }
}

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

defaultTasks 'clean', 'build', 'javadoc', 'sourcesJar', 'javadocJar', 'collectArtifacts', 'buildCommandlineDist'

ext.javaProjects = [
    project(':org.eclipse.virgo.bundlor'),
    project(':org.eclipse.virgo.bundlor.ant'),
    project(':org.eclipse.virgo.bundlor.blint'),
    project(':org.eclipse.virgo.bundlor.commandline'),
    project(':org.eclipse.virgo.bundlor.maven')    
]

allprojects {
    apply plugin: 'base'
    if (System.properties['ci.build'] == 'true') {
        def buildQualifier = System.properties['ci.build.qualifier']
        if(buildQualifier) { 
            version = version + '.' + buildQualifier
        } else {
            version = version + '.D-' + timestamp
        }
    } else {
        version = version + '.SNAPSHOT'
    }
}

configure(javaProjects) {
    apply plugin: 'java'
    apply plugin: 'jacoco'
    apply plugin: 'findbugs'

    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']
            }
        }
    }
    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']
            }
        }
    }
    configurations {
    	ecj {}
		embedded
		compile.extendsFrom(embedded)
		testBundles {
			transitive = false
		}
	}
    repositories {
        mavenCentral()
    }
    test {
    	// we need to set the system properties for the jvm executing the tests explicitly
    	// so we copy system properties relevant for proxying external requests
    	// see Bug 501842 
    	System.properties.each { k,v ->
    		if(k.startsWith('http.') || k.startsWith('https.') || k.startsWith('ftp')) {    		
    			systemProperty k,v
    		}
    	}
    }
    classes.doLast {
    	// including 'embedded' dependencies in archive
    	// doing this here so that bundlor sees the embedded stuff and is able to generate sound manifest file 
    	copy {
    		from project.configurations.embedded.collect { 
    			println '|--> Embedding: ' + it.name
    			it.isDirectory() ? it : zipTree(it)
	    	}
    		into(project.sourceSets.main.output.classesDir)
    	}
    }
    jar {
    	// add SUA to archive
        from "$rootDir/build-bundlor/resources/about/notice.html"
		duplicatesStrategy 'exclude'
    }
    jar.doLast {
    	// signing the archives
        if(System.properties['ci.build.signjars'] == 'true') {
            println '|--> Signing Jar File: ' + archivePath
            exec {
                workingDir destinationDir
                commandLine 'curl',
                            '-o',
                            archiveName,
                            '-F',
                            "file=@${archiveName}",
                            '--show-error',
                            'http://build.eclipse.org:31338/sign'
            }
        }
    }
    jacoco {
        toolVersion = "0.8.1"
    }
    findbugs {
        sourceSets = [sourceSets.main]
        ignoreFailures = true
        effort = "max"
        reportLevel = "high"
    }
    javadoc {
        failOnError = false
    }
    test.dependsOn('copyTestBundles')
	task copyTestBundles(){
		doLast {
	     	configurations.testBundles.resolvedConfiguration.resolvedArtifacts.each { artifact ->
	     		copy {
	     			into "$buildDir/testBundles"
	     			from artifact.file
	     			rename '.*', artifact.name + '.jar'
	     		}
	     	}
	    }
	}
    task sourcesJar(type: Jar, dependsOn: classes) {
    	description 'Assembles a jar archive containing the sources.'
    	group = 'build'
	    classifier = 'sources'
    	from sourceSets.main.allSource
	}
	task javadocJar(type: Jar, dependsOn: javadoc) {
	    description 'Assembles a jar archive containing the javadocs.'
    	group = 'build'
	    classifier = 'javadoc'
	    from javadoc.destinationDir
	}
}

configure(javaProjects) {
    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
		doLast {
			def gradleProperties = new Properties()
			gradleProperties.load(new FileReader("${buildDir}/bundlor-properties/gradle.properties"))
			gradleProperties.setProperty('bundleName', "${archivesBaseName}")
			gradleProperties.setProperty('timestamp', "${timestamp}")
			gradleProperties.setProperty('version', "${version}")
			def writer = new FileWriter("${buildDir}/bundlor-properties/gradle.properties")
   			try {
      			gradleProperties.store(writer, 'modified during build process')
      			writer.flush()
   			} finally {
      			writer.close()
   			}
		}
	}
	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 = true
    }
}

//configure(javaProjects) {
//	apply plugin: 'signing'
//	signing {
//		sign configurations.archives
//	}
//}

configure(javaProjects) {
    apply plugin: 'eclipse'

    eclipse {
        jdt {
            sourceCompatibility = 1.8
            targetCompatibility = 1.8
            file.withProperties { p ->
            	p.setProperty('org.eclipse.jdt.core.compiler.problem.discouragedReference','ignore')
            	p.setProperty('org.eclipse.jdt.core.compiler.problem.forbiddenReference', 'ignore')
            }
        }
        project {
            file.beforeMerged {
                project.natures.clear()
            }
            natures = ['org.eclipse.buildship.core.gradleprojectnature']
        }
    }
    cleanEclipse.doLast {
        delete '.settings'
        delete 'bin'
        delete '.springBeans'
    }
}

configure(javaProjects + project(':org.eclipse.virgo.bundlor.gradle')) {
    apply plugin: 'maven-publish'

    publishing {
        publications {
        	bundlor(MavenPublication) {
        	    from components.java
                artifact sourcesJar
                artifact javadocJar
                groupId 'org.eclipse.virgo.bundlor'
        		pom.withXml {
                    asNode().with {
                        appendNode('description', 'Bundlor is a tool that automates the detection of dependencies and the creation of OSGi manifest directives for JARs after their creation. Bundlor takes as input a JAR and a template consisting of a superset of the standard OSGi manifest headers.')
                        appendNode('url', 'http://www.eclipse.org/virgo/')
                        appendNode('licenses').appendNode('license').with {
                            appendNode('name', 'Eclipse Public License Version 1.0')
                            appendNode('url', 'http://www.eclipse.org/legal/epl-v10.html')
                        }
                        appendNode('developers').appendNode('developer').with {
                            appendNode('id', 'virgo-dev')
                            appendNode('name', 'Virgo Developer List')
                            appendNode('email', 'virgo-dev@eclipse.org')
                            appendNode('url', 'http://projects.eclipse.org/projects/rt.virgo/who/')
                            appendNode('roles').appendNode('role', 'Developer')
                        }
                        appendNode('scm').with {
                            appendNode('connection', 'http://wiki.eclipse.org/Virgo/Source#Virgo_git_Repositories')
                            appendNode('url', 'http://wiki.eclipse.org/Virgo/Source#Virgo_git_Repositories')
                        }
                    }
                    asNode().dependencies.'*'.findAll() {
                    	if('org.eclipse.virgo.util'.equalsIgnoreCase(it.groupId.text())) {
                    		println '|--> Excluding groupId:' + it.groupId.text() + ', artifactId:' + it.artifactId.text() + ' from Maven pom'
                    		it.parent().remove(it)
                    	} 
                    }
                }
        	}
        }
        repositories {
            maven {
                name = "BuildEclipseOrg"
                url "/opt/public/rt/virgo/gradle/bundles"
            }
            if(System.properties['ci.build'] == 'true') {
                maven {
                    name = "CentralSonatype"
                    credentials {
                        username ossrhUsername
                        password ossrhPassword
                    }
                    url "https://oss.sonatype.org/service/local/staging/deploy/maven2/"
                }
            }
        }        
    }
}

task bundlorJarDist(type: Zip) {
	description 'Builds Zip file containg all project Jars'
	group = 'distribution'
	
	archiveName "bundlor-jars-${version}.zip"		
	from javaProjects.jar
	from javaProjects.sourcesJar
	from javaProjects.javadocJar
}

task bundlorCommandlineDist(type: Zip) {
    description 'Build Bundlor Commandline distribution Zip file'
    group = 'distribution'
    
	archiveName "bundlor-commandline-${version}.zip"
    duplicatesStrategy 'exclude'
    into("bundlor-${version}/plugins") {
        from project(':org.eclipse.virgo.bundlor.commandline').jar
        from project(':org.eclipse.virgo.bundlor.commandline').configurations.runtime
    }
    into("bundlor-${version}/bin") {
        from "$rootDir/build-bundlor/resources/bin"
    }
    into("bundlor-${version}") {
        from "$rootDir/build-bundlor/resources/about"
    }
}

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