import java.util.regex.Pattern

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


plugins {
    id 'java'
    id 'maven-publish'
    id 'java-library'
}

final String MODULE_NAME = 'org.apache.poi.ooxml.schemas'
final String JAVA9_SRC = 'src/main/java9'
final String JAVA9_OUT = "${buildDir}/classes/java9/main/"
final String VERSIONS9 = 'META-INF/versions/9'
final String BEANS_SRC = "${buildDir}/generated-sources"
final String BEANS_RES = "${buildDir}/generated-resources"

sourceSets {
    main {
        // TypeSystemHolder.class is in the resources
        output.dir(BEANS_RES, builtBy: 'generate_beans')
        compileClasspath += files(BEANS_RES)
        if (JavaVersion.current() != JavaVersion.VERSION_1_8) {
            output.dir(JAVA9_OUT, builtBy: 'cacheJava9')
        }
        java {
            srcDirs = [BEANS_SRC]
        }
    }
}

dependencies {
    api "org.apache.xmlbeans:xmlbeans:${xmlbeansVersion}"
//    implementation "org.apache.logging.log4j:log4j-api:${log4jVersion}"
    runtimeOnly "org.apache.logging.log4j:log4j-core:${log4jVersion}"
}

final Pattern MODULE_REGEX = ~'\\.jar$'
final List MAIN_MODULE_PATH = sourceSets.main.runtimeClasspath.findAll{ it.path =~ MODULE_REGEX }.collect{ it.parent }.unique()

compileJava {
    dependsOn 'generate_beans'
    sourceCompatibility = 8
    targetCompatibility = 8
}

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

    sourceCompatibility = 9
    targetCompatibility = 9
    destinationDirectory = file(JAVA9_OUT + VERSIONS9)
    source = file(JAVA9_SRC)
    classpath = files()
    options.compilerArgs = [
        '--patch-module', "${MODULE_NAME}=${sourceSets.main.output.asPath}",
        '--module-path', files(MAIN_MODULE_PATH).asPath
    ]
}

task cacheJava9(type: Copy) {
    dependsOn 'compileJava9'

    from(file(JAVA9_OUT + VERSIONS9))
    into(JAVA9_SRC)
}

task copy_xsds(type: Copy) {
    from ('src/main/xmlschema/org/apache/poi/xdgf')
    from ('src/main/xmlschema/org/apache/poi/schemas') {
        include 'XAdES*.xsd', '*.xsdconfig', 'xmldsig*.xsd', 'ooxmlSchemas.xsdconfig', 'markup-compatibility.xsd', 'vmlDrawing.xsd'
        exclude '*.zip'
    }
    from ('src/main/xmlschema/org/apache/poi/poifs/crypt') {
        include 'signatureInfo.xsd'
    }
    from (zipTree('src/main/xmlschema/org/apache/poi/schemas/OfficeOpenXML-XMLSchema-Transitional.zip'))
    from (zipTree('src/main/xmlschema/org/apache/poi/schemas/OpenPackagingConventions-XMLSchema.zip')) {
        include 'opc-digSig.xsd', 'opc-relationships.xsd'
    }
    into 'build/xsds'
}

task generate_beans(dependsOn: copy_xsds) {
    // incremental feature is not working ...
    inputs.files fileTree(dir: 'build/xsds', include: '*.xsd')
    outputs.file 'build/generated-resources/org/apache/poi/schemas/ooxml/system/ooxml/TypeSystemHolder.class'

    doLast {
        ant.uptodate(
            property: 'xmlbeans_uptodate',
            targetfile: 'build/generated-resources/org/apache/poi/schemas/ooxml/system/ooxml/TypeSystemHolder.class'
        ) {
            srcFiles(dir: 'build/xsds', includes: '*.xsd')
        }

        ant.taskdef(
            name: 'xmlbean',
            classname: 'org.apache.xmlbeans.impl.tool.XMLBean',
            classpath: sourceSets.main.runtimeClasspath.asPath
        )

        if (!ant.properties.xmlbeans_uptodate) {
            ant.xmlbean(
                schema: 'build/xsds',
                srcgendir: 'build/generated-sources',
                classgendir: 'build/generated-resources',
                destfile: 'build/xsds.jar',
                srconly: true,
                failonerror: true,
                fork: true,
                memoryMaximumSize: '1536m',
                typesystemname: 'ooxml',
                repackage: 'org.apache.xmlbeans.metadata:org.apache.poi.schemas.ooxml'
            ) {
                classpath = sourceSets.main.runtimeClasspath.asPath
            }
        }
    }
}

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

task sourceJar(type: Jar) {
    classifier 'sources'
    from sourceSets.main.allJava
}

jar {
    dependsOn 'sourceJar'

    if (JavaVersion.current() == JavaVersion.VERSION_1_8) {
        into('META-INF/versions/9') {
            from JAVA9_SRC include '*.class'
        }
    }

    manifest {
        attributes ('Automatic-Module-Name': MODULE_NAME, 'Multi-Release': 'true')
    }
}

publishing {
    publications {
        POI(MavenPublication) {
            artifactId "${project.archivesBaseName}"

            from components.java
            artifact tasks.sourceJar

            pom {
                name = 'Apache POI - OOXML schemas (full)'
                description =
                    'XmlBeans generated from the Ecma supplied xsds (since POI 5.0.0, the 5th edition is used):\n' +
                    '    https://www.ecma-international.org/publications/standards/Ecma-376.htm'
            }
        }
    }
}

generatePomFileForPOIPublication.destination = "../build/dist/maven/${project.archivesBaseName}/${project.archivesBaseName}-${project.version}.pom"
