/* ====================================================================
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
==================================================================== */
buildscript {
	repositories {
		maven { url "https://plugins.gradle.org/m2/" }
	}

	dependencies {
		classpath 'me.champeau.gradle:japicmp-gradle-plugin:0.1.2'	// 2.x requires Gradle >=4
		classpath "org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:2.2.1"
	}
}

// Only add the plugin for Sonar if enabled as it requires Java 8
if (project.hasProperty('enableSonar')) {
	println 'Enabling Sonar support'
	apply plugin: "org.sonarqube"
}

// For help converting an Ant build to a Gradle build, see
// https://docs.gradle.org/current/userguide/ant.html

ant.importBuild 'build.xml'

/**

Define properties for all projects, including this one 

*/
allprojects {
	apply plugin: 'eclipse'

	task wrapper(type: Wrapper) {
	    gradleVersion = '3.4.1'
	}
	
	task adjustWrapperPropertiesFile {
		doLast {
			ant.replaceregexp(match:'^#.*', replace:'', flags:'g', byline:true) {
				fileset(dir: project.projectDir, includes: 'gradle/wrapper/gradle-wrapper.properties')
			}
			new File(project.projectDir, 'gradle/wrapper/gradle-wrapper.properties').with { it.text = it.readLines().findAll { it }.sort().join('\n') }
			ant.fixcrlf(file: 'gradle/wrapper/gradle-wrapper.properties', eol: 'lf')
		}
	}
	wrapper.finalizedBy adjustWrapperPropertiesFile
}

/**

Define things that are only necessary in sub-projects, but not in the master-project itself

*/
subprojects {
    //Put instructions for each sub project, but not the master
    apply plugin: 'java'
    apply plugin: 'jacoco'

    // See https://github.com/melix/japicmp-gradle-plugin 
	apply plugin: 'me.champeau.gradle.japicmp'
        
	version = '3.16-beta3'
	ext {
		japicmpversion = '3.15'
	}

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

    sourceCompatibility = 1.6

    repositories {
        mavenCentral()
    }

	jar {
		manifest {
			attributes 'Implementation-Title': 'Apache POI', 'Implementation-Version': version
		}
	}

    test {
		// Exclude some tests that are not actually tests or do not run cleanly on purpose
		exclude '**/BaseTestBorderStyle.class'
		exclude '**/BaseTestCellUtil.class'
		exclude '**/TestUnfixedBugs.class'
		exclude '**/TestOneFile.class'

        systemProperties = System.properties
    
        // set heap size for the test JVM(s)
        minHeapSize = "128m"
        maxHeapSize = "768m"
  
        // show standard out and standard error of the test JVM(s) on the console
        //testLogging.showStandardStreams = true

        // http://forums.gradle.org/gradle/topics/jacoco_related_failure_in_multiproject_build
        systemProperties['user.dir'] = workingDir
        
        systemProperties['POI.testdata.path'] = '../../test-data'
        //systemProperties['user.language'] = 'en'
        //systemProperties['user.country'] = 'US'
    }

	test.beforeSuite { TestDescriptor suite ->
	   System.setProperty('user.language', 'en')
	   System.setProperty('user.country', 'US')
	}

    jacoco {
        toolVersion = '0.7.8'
    }
    
    // ensure the build-dir exists
    projectDir.mkdirs()

	if (project.hasProperty('enableSonar')) {
		sonarqube {
			properties {
				// as we currently use build/<module>/ as project-basedir, we need to tell Sonar to use
				// the root-folder as "basedir" for the projects
				property "sonar.projectBaseDir", "$projectDir/../.."
			}
		}
	}
}

project('main') {
	sourceSets.main.java.srcDirs = ['../../src/java']
	sourceSets.main.resources.srcDirs = ['../../src/resources/main']
	sourceSets.test.java.srcDirs = ['../../src/testcases']
	
	dependencies {
		compile 'commons-codec:commons-codec:1.10'
		compile 'commons-logging:commons-logging:1.2'
		compile 'org.apache.commons:commons-collections4:4.1'
		
		testCompile 'junit:junit:4.12'
	}
	
	// Create a separate jar for test-code to depend on it in other projects
	// See http://stackoverflow.com/questions/5144325/gradle-test-dependency
	task testJar(type: Jar, dependsOn: testClasses) {
		baseName = "test-${project.archivesBaseName}"
		from sourceSets.test.output
	}

	configurations {
		tests
	}

	artifacts {
		tests testJar
	}

	// TOOD: we should not duplicate this task in each project, but I did not figure out how to inject the artifactId for each project
    task japicmp(type: me.champeau.gradle.ArtifactJapicmpTask, dependsOn: jar) {
		baseline = 'org.apache.poi:poi:' + japicmpversion + '@jar'
		to = jar.archivePath
		onlyModified = true
		onlyBinaryIncompatibleModified = true
		failOnModification = false
		txtOutputFile = file("$buildDir/reports/japi.txt")
		htmlOutputFile = file("$buildDir/reports/japi.html")
	}
}

project('ooxml') {
	sourceSets.main.java.srcDirs = ['../../src/ooxml/java']
	sourceSets.main.resources.srcDirs = ['../../src/ooxml/resources', '../../src/resources/ooxml']
	sourceSets.test.java.srcDirs = ['../../src/ooxml/testcases']

    // for now import the ant-task for building the jars from build.xml
    // we need to rename the tasks as e.g. task "jar" conflicts with :ooxml:jar
	ant.importBuild('../../build.xml') { antTargetName ->
		'ant-' + antTargetName
	}
	compileJava.dependsOn 'ant-compile-ooxml-xsds'
	
	dependencies {
		compile 'org.apache.xmlbeans:xmlbeans:2.6.0'
		compile 'org.apache.commons:commons-collections4:4.1'
		compile 'org.apache.santuario:xmlsec:2.0.6'
		compile 'org.bouncycastle:bcpkix-jdk15on:1.54'
		compile 'com.github.virtuald:curvesapi:1.04'

		// for ooxml-lite, should we move this somewhere else?
		compile 'junit:junit:4.12'

		compile project(':main')
		compile project(':scratchpad')		// TODO: get rid of this dependency!
		compile files('../../ooxml-lib/ooxml-schemas-1.3.jar')
		compile files('../../ooxml-lib/ooxml-security-1.1.jar')
		
		testCompile 'junit:junit:4.12'
		testCompile project(path: ':main', configuration: 'tests')
		// Keep using 1.15 until we switch to Java 7
		testCompile 'org.openjdk.jmh:jmh-core:1.15'
		testCompile 'org.openjdk.jmh:jmh-generator-annprocess:1.15'
	}

	// TOOD: we should not duplicate this task in each project, but I did not figure out how to inject the artifactId for each project
    task japicmp(type: me.champeau.gradle.ArtifactJapicmpTask, dependsOn: jar) {
		baseline = 'org.apache.poi:poi-ooxml:' + japicmpversion + '@jar'
		to = jar.archivePath
		onlyModified = true
		onlyBinaryIncompatibleModified = true
		failOnModification = false
		txtOutputFile = file("$buildDir/reports/japi.txt")
		htmlOutputFile = file("$buildDir/reports/japi.html")
	}
}

project('examples') {
	sourceSets.main.java.srcDirs = ['../../src/examples/src']
	
	dependencies {
		compile project(':main')
		compile project(':ooxml')
	}
}


project('excelant') {
	sourceSets.main.java.srcDirs = ['../../src/excelant/java']
	sourceSets.main.resources.srcDirs = ['../../src/excelant/resources']
	sourceSets.test.java.srcDirs = ['../../src/excelant/testcases']
	
	dependencies {
		compile 'org.apache.ant:ant:1.9.4'

		compile project(':main')
		compile project(':ooxml')

		testCompile project(path: ':main', configuration: 'tests')
	}

	// TOOD: we should not duplicate this task in each project, but I did not figure out how to inject the artifactId for each project
    task japicmp(type: me.champeau.gradle.ArtifactJapicmpTask, dependsOn: jar) {
		baseline = 'org.apache.poi:poi-excelant:' + japicmpversion + '@jar'
		to = jar.archivePath
		onlyModified = true
		onlyBinaryIncompatibleModified = true
		failOnModification = false
		txtOutputFile = file("$buildDir/reports/japi.txt")
		htmlOutputFile = file("$buildDir/reports/japi.html")
	}
}

project('integrationtest') {
	sourceSets.test.java.srcDirs = ['../../src/integrationtest']
	
	dependencies {
		compile 'org.apache.ant:ant:1.9.4'

		compile project(':main')
		compile project(':ooxml')
		compile project(':scratchpad')
		compile project(':examples')
		
		testCompile 'junit:junit:4.12'
	}

    test {
		// exclude these from the normal test-run
		exclude '**/TestAllFiles.class'
		exclude '**/*FileHandler.class'
		exclude '**/RecordsStresser.class'
	}
	
	task integrationTest(type: Test) {
		// these are just tests used during development of more test-code
		exclude '**/*FileHandler.class'
		exclude '**/RecordStresser.class'
	}
}

project('scratchpad') {
	sourceSets.main.java.srcDirs = ['../../src/scratchpad/src']
	sourceSets.main.resources.srcDirs = ['../../src/resources/scratchpad']
	sourceSets.test.java.srcDirs = ['../../src/scratchpad/testcases']
	
	dependencies {
		compile project(':main')
		// cyclic-dependency here: compile project(':ooxml')
		
		testCompile 'junit:junit:4.12'
		testCompile project(path: ':main', configuration: 'tests')
	}

	// TOOD: we should not duplicate this task in each project, but I did not figure out how to inject the artifactId for each project
    task japicmp(type: me.champeau.gradle.ArtifactJapicmpTask, dependsOn: jar) {
		baseline = 'org.apache.poi:poi-scratchpad:' + japicmpversion + '@jar'
		to = jar.archivePath
		onlyModified = true
		onlyBinaryIncompatibleModified = true
		failOnModification = false
		txtOutputFile = file("$buildDir/reports/japi.txt")
		htmlOutputFile = file("$buildDir/reports/japi.html")
	}
}
