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

javadoc {
    failOnError = true
    maxMemory = "1024M"
    doFirst {
        options {
            if (JavaVersion.current().isJava9Compatible()) {
                addBooleanOption('html5', true)
            }
            links 'https://xmlbeans.apache.org/docs/5.0.0/'
            use = true
            splitIndex = true
            source = "1.8"
        }
    }
}

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"
