/* ====================================================================
   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.13'
        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:3.0.0'
        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'
}
