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

sourceSets {
    main {
        output.dir(JAVA9_OUT, builtBy: 'compileJava9')
    }
}

dependencies {
    api 'net.bytebuddy:byte-buddy:1.14.16'
    api 'net.bytebuddy:byte-buddy-agent:1.14.16'
    api "org.apache.xmlbeans:xmlbeans:${xmlbeansVersion}"
}

final MODULE_NAME = 'org.apache.poi.ooxml_lite'

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(jdkVersion)
        if (jdkVendor != '') vendor = JvmVendorSpec.matching(jdkVendor)
    }
}

task compileJava9(type: JavaCompile) {
    dependsOn 'compileJava'

    javaCompiler = javaToolchains.compilerFor {
        languageVersion = JavaLanguageVersion.of(Math.max(11, jdkVersion))
    }
    sourceCompatibility = 1.9
    targetCompatibility = 1.9
    destinationDirectory = file(JAVA9_OUT + VERSIONS9)
    source = file(JAVA9_SRC)
    classpath = files()
    doFirst {
        options.compilerArgs = [
            '--patch-module', "${MODULE_NAME}=${sourceSets.main.output.classesDirs.asPath}",
            '--module-path', sourceSets.main.compileClasspath.asPath
        ]
    }
}

jar {
    destinationDirectory = file("../build/dist/maven/${project.archivesBaseName}")

    manifest {
        attributes (
            'Automatic-Module-Name' : MODULE_NAME,
            'Multi-Release': 'true',
            'Premain-Class' : 'org.apache.poi.ooxml.lite.OOXMLLiteAgent'
        )
    }
}

spotbugsMain.enabled = false
javadoc.enabled = false
javadocJar.enabled = false

