/* ====================================================================
   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.5"
    }
}

repositories {
    mavenCentral()
}

// Only add the plugin for Sonar if enabled
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

configurations {
    antLibs
}

dependencies {
    antLibs("junit:junit:4.12")
    antLibs("org.apache.ant:ant-junit:1.10.4")
    antLibs("org.apache.ant:ant-junit4:1.10.4")
}

ant.taskdef(name: "junit",
        classname: "org.apache.tools.ant.taskdefs.optional.junit.JUnitTask",
        classpath: configurations.antLibs.asPath)

ant.importBuild 'build.xml'

/**

Define properties for all projects, including this one 

*/
allprojects {
    apply plugin: 'eclipse'

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

    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 = '4.1.1-SNAPSHOT'
    ext {
        japicmpversion = '4.1.0'
    }

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

    sourceCompatibility = 1.8

    repositories {
        mavenCentral()
        maven {
            url 'https://repository.apache.org/content/repositories/releases'
        }
    }

    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'

        // Exclude Test Suites
        exclude '**/All*Tests.class'
        exclude '**/HSSFTests.class'

        // set heap size for the test JVM(s)
        minHeapSize = "128m"
        maxHeapSize = "768m"

        // Specifying the local via system properties did not work, so we set them this way
        jvmArgs '-Duser.language=en -Duser.country=US'
  
        // 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'
        
        // this is necessary for JDK 9+ to keep formatting dates the same way as in previous JDK-versions
        systemProperties['java.locale.providers'] = 'JRE,CLDR'
    }

    jacoco {
        toolVersion = '0.8.3'
    }
    
    // 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/../.."
            }
        }
    }

    task(japicmp, type: me.champeau.gradle.ArtifactJapicmpTask, dependsOn: jar) {
        to = jar.archivePath
        onlyModified = true
        onlyBinaryIncompatibleModified = true
        failOnModification = false
        txtOutputFile = file("$buildDir/reports/japi.txt")
        htmlOutputFile = file("$buildDir/reports/japi.html")
    }
}

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.12'
        compile 'commons-logging:commons-logging:1.2'
        compile 'org.apache.commons:commons-collections4:4.3'
        compile 'org.apache.commons:commons-math3:3.6.1'
        compile 'javax.xml.bind:jaxb-api:2.3.1'
        compile 'com.sun.xml.bind:jaxb-impl:2.3.2'
        compile 'com.sun.xml.bind:jaxb-core:2.3.0.1'
        compile 'javax.activation:activation:1.1.1'

        testCompile 'junit:junit:4.12'
        testCompile 'org.mockito:mockito-core:2.23.4'
        testCompile 'org.reflections:reflections:0.9.11'
    }

    jar {
        manifest {
            attributes 'Automatic-Module-Name': 'org.apache.poi.main'
        }
    }

    // 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
    }

    japicmp.baseline = 'org.apache.poi:poi:' + japicmpversion + '@jar'
}

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:3.1.0'
        compile 'org.apache.commons:commons-collections4:4.3'
        compile 'org.apache.commons:commons-math3:3.6.1'
        compile 'org.apache.commons:commons-compress:1.18'
        compile 'org.apache.santuario:xmlsec:2.1.2'
        compile 'org.bouncycastle:bcpkix-jdk15on:1.61'
        compile 'com.github.virtuald:curvesapi:1.06'

        // compile only, don't add it to our dist as it blows up the size
        compile 'org.apache.xmlgraphics:batik-all:1.11'
        compile 'xml-apis:xml-apis-ext:1.3.04'
        compile 'org.apache.xmlgraphics:xmlgraphics-commons:2.3'

        // 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.4.jar')
        compile files('../../ooxml-lib/ooxml-security-1.1.jar')

        testCompile 'junit:junit:4.12'
        testCompile 'org.mockito:mockito-core:2.23.4'
        testCompile 'org.xmlunit:xmlunit-core:2.5.1'
        testCompile 'org.reflections:reflections:0.9.11'
        testCompile project(path: ':main', configuration: 'tests')
        testCompile 'org.openjdk.jmh:jmh-core:1.19'
        testCompile 'org.openjdk.jmh:jmh-generator-annprocess:1.19'
    }

    jar {
        manifest {
            attributes 'Automatic-Module-Name': 'org.apache.poi.ooxml'
        }
    }

    japicmp.baseline = 'org.apache.poi:poi-ooxml:' + japicmpversion + '@jar'
}

project('examples') {
    sourceSets.main.java.srcDirs = ['../../src/examples/src']

    dependencies {
        compile project(':main')
        compile project(':ooxml')
    }

    japicmp.enabled = false
}


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.10.4'

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

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

	jar {
		manifest {
			attributes 'Automatic-Module-Name': 'org.apache.poi.excelant'
		}
	}

    japicmp.baseline = 'org.apache.poi:poi-excelant:' + japicmpversion + '@jar'
}

project('integrationtest') {
    sourceSets.test.java.srcDirs = ['../../src/integrationtest']

    dependencies {
        compile 'org.apache.ant:ant:1.10.4'

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

        testCompile 'junit:junit:4.12'
    }

	jar {
		manifest {
			attributes 'Automatic-Module-Name': 'org.apache.poi.integrationtest'
		}
	}

	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'
    }

    japicmp.enabled = false
}

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')
    }

	jar {
		manifest {
			attributes 'Automatic-Module-Name': 'org.apache.poi.scratchpad'
		}
	}

    japicmp.baseline = 'org.apache.poi:poi-scratchpad:' + japicmpversion + '@jar'
}
