buildscript {
	repositories {
		mavenCentral()
		maven { url 'https://repo.spring.io/plugins-release' }
		maven { url 'https://plugins.gradle.org/m2/' }
		maven { url 'https://repo.spring.io/snapshot' }
	}
	dependencies {
		classpath 'org.springframework.build.gradle:propdeps-plugin:0.0.7'
		classpath 'io.spring.gradle:spring-io-plugin:0.0.8.RELEASE'
		classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.6.2'
		classpath "io.spring.javaformat:spring-javaformat-gradle-plugin:$javaFormatVersion"
	}
}

allprojects {
	group = 'org.springframework.restdocs'
	repositories {
		mavenCentral()
		maven { url 'https://repo.spring.io/snapshot' }
	}
}

apply plugin: 'samples'
apply plugin: 'org.sonarqube'

sonarqube {
	properties {
		property 'sonar.jacoco.reportPath', "${buildDir.name}/jacoco.exec"
		property 'sonar.java.coveragePlugin', 'jacoco'
		property 'sonar.links.ci', 'https://build.spring.io/browse/SRD'
		property 'sonar.links.homepage', 'https://github.com/spring-projects/spring-restdocs'
		property 'sonar.links.issue', 'https://github.com/spring-projects/spring-restdocs'
		property 'sonar.links.scm', 'https://github.com/spring-projects/spring-restdocs'
	}
}

ext {
	springVersion = '4.3.15.RELEASE'
	javadocLinks = [
		'https://docs.oracle.com/javase/8/docs/api/',
		"https://docs.spring.io/spring-framework/docs/$springVersion/javadoc-api/",
		'https://docs.jboss.org/hibernate/stable/beanvalidation/api/',
		'https://docs.jboss.org/hibernate/stable/validator/api/'
	] as String[]
}

subprojects {
	apply plugin: 'io.spring.dependency-management'
	apply plugin: 'java'
	apply plugin: 'eclipse'
	apply plugin: 'propdeps'
	apply plugin: 'propdeps-eclipse'
	apply plugin: 'propdeps-maven'
	apply plugin: 'maven'

	sourceCompatibility = 1.7
	targetCompatibility = 1.7

	dependencyManagement {
		imports {
			mavenBom "org.springframework:spring-framework-bom:$springVersion"
		}
		dependencies {
			dependency 'com.fasterxml.jackson.core:jackson-databind:2.5.5'
			dependency 'com.jayway.restassured:rest-assured:2.8.0'
			dependency 'com.samskivert:jmustache:1.12'
			dependency 'commons-codec:commons-codec:1.10'
			dependency 'javax.servlet:javax.servlet-api:3.1.0'
			dependency 'javax.validation:validation-api:1.1.0.Final'
			dependency 'junit:junit:4.12'
			dependency 'io.rest-assured:rest-assured:3.0.7'
			dependency 'org.apache.pdfbox:pdfbox:2.0.7'
			dependency 'org.assertj:assertj-core:2.9.1'
			dependency 'org.asciidoctor:asciidoctorj:1.5.6'
			dependency 'org.asciidoctor:asciidoctorj-pdf:1.5.0-alpha.16'
			dependency 'org.hamcrest:hamcrest-core:1.3'
			dependency 'org.hamcrest:hamcrest-library:1.3'
			dependency 'org.hibernate:hibernate-validator:5.2.5.Final'
			dependency 'org.jruby:jruby-complete:9.1.13.0'
			dependency 'org.mockito:mockito-core:1.10.19'
			dependency 'org.springframework.hateoas:spring-hateoas:0.19.0.RELEASE'
			dependency 'org.jacoco:org.jacoco.agent:0.7.9'
		}
	}

	test {
		testLogging {
			exceptionFormat "full"
		}
	}

	eclipseJdt {
		inputFile = rootProject.file('config/eclipse/org.eclipse.jdt.core.prefs')
		doLast {
			project.file('.settings/org.eclipse.jdt.ui.prefs').withWriter { writer ->
				writer << rootProject.file('config/eclipse/org.eclipse.jdt.ui.prefs').text
			}
		}
	}

	compileJava {
		options.compilerArgs = [ '-Xlint:deprecation', '-Xlint:-options', '-Werror' ]
	}

	tasks.withType(JavaCompile) {
		options.encoding = 'UTF-8'
	}

}

configure(subprojects - project(":docs")) { subproject ->
	apply plugin: 'io.spring.javaformat'
	apply plugin: 'checkstyle'
	apply from: "${rootProject.projectDir}/gradle/publish-maven.gradle"

	if (project.hasProperty('platformVersion') && subproject.path != ':spring-restdocs-asciidoctor') {
		apply plugin: 'spring-io'

		repositories {
			maven { url "https://repo.spring.io/libs-snapshot" }
		}

		dependencyManagement {
			springIoTestRuntime {
				imports {
					mavenBom "io.spring.platform:platform-bom:${platformVersion}"
				}
			}
		}
	}

	checkstyle {
		configFile = rootProject.file('config/checkstyle/checkstyle.xml')
		configProperties = [ 'checkstyle.config.dir' : rootProject.file('config/checkstyle') ]
		toolVersion = '6.10.1'
	}

	configurations {
		jacoco
	}

	dependencies {
		checkstyle "io.spring.javaformat:spring-javaformat-checkstyle:$javaFormatVersion"
		jacoco 'org.jacoco:org.jacoco.agent::runtime'
	}

	javadoc {
		description = "Generates project-level javadoc for use in -javadoc jar"
		options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
		options.author = true
		options.header = "Spring REST Docs $version"
		options.docTitle = "${options.header} API"
		options.links = javadocLinks
		options.addStringOption '-quiet'
		options.encoding = 'UTF-8'
	}

	task sourcesJar(type: Jar) {
		classifier = 'sources'
		from project.sourceSets.main.allSource
	}

	task javadocJar(type: Jar) {
		classifier = "javadoc"
		from javadoc
	}

	artifacts {
		archives sourcesJar
		archives javadocJar
	}
}

samples {
	dependOn 'spring-restdocs-core:install'
	dependOn 'spring-restdocs-mockmvc:install'
	dependOn 'spring-restdocs-restassured:install'
	dependOn 'spring-restdocs-asciidoctor:install'

	restNotesGrails {
		workingDir "$projectDir/samples/rest-notes-grails"
	}

	restNotesSpringHateoas {
		workingDir "$projectDir/samples/rest-notes-spring-hateoas"
	}

	restNotesSpringDataRest {
		workingDir "$projectDir/samples/rest-notes-spring-data-rest"
	}

	testNg {
		workingDir "$projectDir/samples/testng"
	}

	restAssured {
		workingDir "$projectDir/samples/rest-assured"
	}

	slate {
		workingDir "$projectDir/samples/rest-notes-slate"
		build false
	}

}

task api (type: Javadoc) {
	group = "Documentation"
	description = "Generates aggregated Javadoc API documentation."
	dependsOn {
		subprojects.collect {
			it.tasks.getByName("jar")
		}
	}
	options.memberLevel = org.gradle.external.javadoc.JavadocMemberLevel.PROTECTED
	options.author = true
	options.header = "Spring REST Docs $version"
	options.splitIndex = true
	options.links = javadocLinks
	options.addStringOption '-quiet'

	source subprojects.findAll { project -> project.path != ":spring-restdocs-asciidoctor" }
			.collect { project -> project.sourceSets.main.allJava }

	destinationDir = new File(buildDir, "api")

	doFirst {
		classpath = files(subprojects.collect { it.sourceSets.main.compileClasspath })
	}
}

task docsZip(type: Zip, dependsOn: [':docs:asciidoctor', ':api', ':buildSamples']) {
	group = 'Distribution'
	baseName = 'spring-restdocs'
	classifier = 'docs'
	description = "Builds -${classifier} archive containing API and reference documentation"
	destinationDir = file("${project.buildDir}/distributions")

	from(project.tasks.findByPath(':docs:asciidoctor')) {
		into 'reference'
	}

	from(api) {
		into 'api'
	}

	from(file('samples/rest-notes-spring-hateoas/build/asciidoc/html5')) {
		into 'samples/restful-notes'
	}

	from(file('samples/rest-notes-slate/build/docs')) {
		into 'samples/slate'
	}
}

configurations {
	archives
}

artifacts {
	archives docsZip
}