buildscript {
	repositories {
		mavenCentral()
		maven { url 'https://plugins.gradle.org/m2' }
		maven { url 'https://repo.spring.io/plugins-release-local' }
	}
}

plugins {
	id 'java-library'
	id 'eclipse'
	id 'idea'
	id 'jacoco'
	id 'org.sonarqube' version '2.8'
	id 'com.jfrog.artifactory' version '4.21.0'
}

description = 'Spring Integration Zip Adapter'

group = 'org.springframework.integration'

repositories {
	mavenCentral()
	maven { url 'https://repo.spring.io/release' }
	maven { url 'https://repo.spring.io/milestone' }
	if (version.endsWith('SNAPSHOT')) {
		maven { url 'https://repo.spring.io/snapshot' }
	}
}

java {
	withJavadocJar()
	withSourcesJar()
}

sourceCompatibility=1.8
targetCompatibility=1.8

ext {

	linkHomepage = 'https://github.com/spring-projects/spring-integration-extensions'
	linkCi       = 'https://build.spring.io/browse/INTEXT-ZIP'
	linkIssue    = 'https://github.com/spring-projects/spring-integration-extensions/issues'
	linkScmUrl           = 'https://github.com/spring-projects/spring-integration-extensions'
	linkScmConnection    = 'https://github.com/spring-projects/spring-integration-extensions.git'
	linkScmDevConnection = 'git@github.com:spring-projects/spring-integration-extensions.git'

	assertjVersion = '3.20.2'
	junitVersion = '5.7.2'
	log4jVersion = '2.14.1'
	springIntegrationVersion = '5.5.1'
	ztZipVersion = '1.14'

	idPrefix = 'zip'
}

eclipse {
	project {
		natures += 'org.springframework.ide.eclipse.core.springnature'
	}
}

sourceSets {
	test {
		resources {
			srcDirs = ['src/test/resources', 'src/test/java']
		}
	}
}

jacoco {
	toolVersion = '0.8.7'
}

dependencies {
	api "org.springframework.integration:spring-integration-file:$springIntegrationVersion"
	api "org.zeroturnaround:zt-zip:$ztZipVersion"

	testImplementation "org.springframework.integration:spring-integration-test:$springIntegrationVersion"
	testImplementation "org.assertj:assertj-core:$assertjVersion"
	testImplementation "org.junit.jupiter:junit-jupiter-api:$junitVersion"

	testRuntimeOnly "org.apache.logging.log4j:log4j-jcl:$log4jVersion"
	testRuntimeOnly "org.apache.logging.log4j:log4j-slf4j-impl:$log4jVersion"
	testRuntimeOnly "org.junit.jupiter:junit-jupiter-engine:$junitVersion"
	testRuntimeOnly "org.junit.platform:junit-platform-launcher:1.7.2"
}


// enable all compiler warnings; individual projects may customize further
ext.xLintArg = '-Xlint:all,-options'
[compileJava, compileTestJava]*.options*.compilerArgs = [xLintArg]

test {
	// suppress all console output during testing unless running `gradle -i`
	logging.captureStandardOutput(LogLevel.INFO)
	maxHeapSize = '1024m'
	jacoco {
		destinationFile = file("$buildDir/jacoco.exec")
	}
	useJUnitPlatform()
	if (System.properties['sonar.host.url']) {
		finalizedBy jacocoTestReport
	}
}

jacocoTestReport {
	reports {
		xml.enabled true
		csv.enabled false
		html.enabled false
		xml.destination file("${buildDir}/reports/jacoco/test/jacocoTestReport.xml")
	}
}

check.dependsOn javadoc

sonarqube {
	properties {
		property 'sonar.links.homepage', linkHomepage
		property 'sonar.links.ci', linkCi
		property 'sonar.links.issue', linkIssue
		property 'sonar.links.scm', linkScmUrl
		property 'sonar.links.scm_dev', linkScmDevConnection
	}
}

task api(type: Javadoc) {
	group = 'Documentation'
	description = 'Generates the Javadoc API documentation.'
	title = "${rootProject.description} ${version} API"
	options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
	options.author = true
	options.header = rootProject.description
	options.overview = 'src/api/overview.html'

	source = sourceSets.main.allJava
	classpath = project.sourceSets.main.compileClasspath
	destinationDir = new File(buildDir, 'api')
}

task schemaZip(type: Zip) {
	group = 'Distribution'
	archiveClassifier = 'schema'
	description = "Builds -${archiveClassifier} archive containing all " +
		"XSDs for deployment at static.springframework.org/schema."

	Properties schemas = new Properties();
	def shortName = idPrefix.replaceFirst("${idPrefix}-", '')

	project.sourceSets.main.resources.find {
		it.path.endsWith("META-INF${File.separator}spring.schemas")
	}?.withInputStream { schemas.load(it) }

	for (def key : schemas.keySet()) {
		File xsdFile = project.sourceSets.main.resources.find {
			it.path.replaceAll('\\\\', '/').endsWith(schemas.get(key))
		}
		assert xsdFile != null
		into ("integration/${shortName}") {
			from xsdFile.path
		}
	}
}

task docsZip(type: Zip) {
	group = 'Distribution'
	archiveClassifier = 'docs'
	description = "Builds -${archiveClassifier} archive containing api docs " +
			"for deployment at static.springframework.org/spring-integration/docs."

	from('src/dist') {
		include 'changelog.txt'
	}

	from (api) {
		into 'api'
	}

}

task distZip(type: Zip, dependsOn: [docsZip, schemaZip]) {
	group = 'Distribution'
	archiveClassifier = 'dist'
	description = "Builds -${archiveClassifier} archive, containing all jars and docs, " +
		"suitable for community download page."

	ext.baseDir = "${project.name}-${project.version}"

	from('src/dist') {
		include 'readme.txt'
		include 'license.txt'
		include 'notice.txt'
		into "${baseDir}"
	}

	from(zipTree(docsZip.archiveFile)) {
		into "${baseDir}/docs"
	}

	from(zipTree(schemaZip.archiveFile)) {
		into "${baseDir}/schema"
	}

	into ("${baseDir}/libs") {
		from project.jar
		from project.sourcesJar
		from project.javadocJar
	}
}

// Create an optional "with dependencies" distribution.
// Not published by default; only for use when building from source.
task depsZip(type: Zip, dependsOn: distZip) { zipTask ->
	group = 'Distribution'
	archiveClassifier = 'dist-with-deps'
	description = "Builds -${archiveClassifier} archive, containing everything " +
		"in the -${distZip.archiveClassifier} archive plus all dependencies."

	from zipTree(distZip.archiveFile)

	gradle.taskGraph.whenReady { taskGraph ->
		if (taskGraph.hasTask(":${zipTask.name}")) {
			def projectName = rootProject.name
			def artifacts = new HashSet()

			rootProject.configurations.runtime.resolvedConfiguration.resolvedArtifacts.each { artifact ->
				def dependency = artifact.moduleVersion.id
				if (projectName != dependency.name) {
					artifacts << artifact.file
				}
			}

			zipTask.from(artifacts) {
				into "${distZip.baseDir}/deps"
			}
		}
	}
}

task dist(dependsOn: assemble) {
	group = 'Distribution'
	description = 'Builds -dist, -docs and -schema distribution archives.'
}

apply from: "${rootProject.projectDir}/publish-maven.gradle"