/* ====================================================================
   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/' }
        mavenCentral()
    }

    dependencies {
        classpath 'org.sonarsource.scanner.gradle:sonarqube-gradle-plugin:3.3'
        classpath 'de.thetaphi:forbiddenapis:3.3'
    }
}


plugins {
    id 'java'
    id 'java-library'
    id 'idea'
    id 'maven-publish'
    id 'distribution'
    id('org.nosphere.apache.rat') version '0.7.1'
    id('de.thetaphi.forbiddenapis') version '3.3'
    id 'jacoco'
    id "com.github.spotbugs" version '5.0.9'
    id 'org.cyclonedx.bom' version '1.7.0'
}

// Only add the plugin for Sonar if enabled
if (project.hasProperty('enableSonar')) {
    println 'Enabling Sonar support'
    apply plugin: 'org.sonarqube'
}




sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8

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

configurations {
    bootstrap
    genresources
    java9
}

ext {
    antVersion = '1.10.12'
    javaparserVersion = '3.24.2'
    log4jVersion = '2.18.0'
    saxonVersion = '11.3'
}

def testSchemas =  [
    [dir:'test/tools/lib',path:'xsl',name:'sTOOLS'],
    [dir:'src/test/resources/xbean/compile/scomp',path:'detailed',name:'sLAX'],
    [dir:'src/test/resources/xbean',path:'dom',name:'sDOM'],
    [dir:'src/test/resources/xbean',path:'xmlcursor',name:'sXMLCURSOR'],
    [dir:'src/test/resources/xbean',path:'scomp',name:'sSCOMP'],
    [dir:'src/test/resources/xbean',path:'simple',name:'sSIMPLE'],
    [dir:'src/test/resources/xbean',path:'ValidatingStream',name:'sVALIDATE'],
    [dir:'src/test/resources/xbean',path:'usertype',name:'sUSERTYPE'],
    [dir:'build/schemas/sTRANXML',path:'tranxml',name:'sTRANXML'],
    [dir:'src/test/resources/xbean/xmlobject',path:'CR192525.xsd defaults.xsd easypo.xsd easypo.xsdconfig enumtest.xsd enumtest.xsdconfig inttest.xsd listandunion.xsd nameworld.xsd numerals.xsd redefine2.xsd SelectAttribute.xsd SelectChildren.xsd selectChldAttTest.xsd soap-envelope.xsd soapfaults.xsd substgroup.xsd substgroup2.xsd Test.xsd Test36510.xsd Test40907.xsd version3.xsd', name:'sXMLOBJECT'],
    [dir:'src/test/resources/xbean/misc/jira',path:'xmlbeans_33b.xsd xmlbeans_46.xsd xmlbeans_48.xsd xmlbeans_64.xsd xmlbeans_68.xsd xmlbeans_71.xsd xmlbeans_98.xsd xmlbeans_99.xsd xmlbeans_105.xsd xmlbeans_175.xsd xmlbeans_177.xsd xmlbeans_177a.xsd xmlbeans_208.xsd xmlbeans_228.xsd xmlbeans_307_maxallowedenum.xsd xmlbeans_307_morethanallowedenum.xsd', name:'sJIRA' ],
    [dir:'src/test/resources/xbean',path:'xmltokensource',name:'sTOKENSOURCE']
] + xsdDirs(file('src/test/resources/xbean/extensions')).withIndex().collect { element, index ->
    // the extensions need to be generated separately, because the *.xsdconfigs have overlapping definitions
    [dir:'src/test/resources/xbean/extensions',path:element,name:"sEXT${index}"]
}

//

sourceSets {
    main {
        java {
            srcDir files('build/generated/sources/base/main/java').builtBy('base_SchemaGen')
        }
        resources {
            srcDir files('build/generated/sources/base/main/resources').builtBy('base_SchemaGen')
        }
    }
    test {
        java {
            testSchemas.each {
                srcDir files("build/generated/sources/${it.name}/test/java").builtBy("${it.name}_SchemaGen")
            }
        }
        resources {
            testSchemas.each {
                srcDir files("build/generated/sources/${it.name}/test/resources").builtBy("${it.name}_SchemaGen")
            }
        }
    }
}

dependencies {

    implementation "org.apache.logging.log4j:log4j-api:${log4jVersion}"
    implementation "net.sf.saxon:Saxon-HE:${saxonVersion}"
    implementation "org.apache.ant:ant:${antVersion}"
    implementation "com.github.javaparser:javaparser-core:${javaparserVersion}"
    implementation "com.github.javaparser:javaparser-symbol-solver-core:${javaparserVersion}"

    // only for java 8
    if (JavaVersion.current() == JavaVersion.VERSION_1_8) {
        implementation 'xml-apis:xml-apis:1.4.01'
    }
    // only necessary to compile against JDK8 internals - for Java9+ there's a multimodule implementation
    implementation 'com.sun.org.apache.xml.internal:resolver:20050927'

    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-params:5.8.2'
    testImplementation 'org.junit.jupiter:junit-jupiter-engine:5.8.2'
    testImplementation 'org.junit.platform:junit-platform-launcher:1.8.2'
    testImplementation "org.apache.logging.log4j:log4j-core:${log4jVersion}"
//    testImplementation "org.apache.ant:ant-junit:${antVersion}"
//    testImplementation "org.apache.ant:ant-junit4:${antVersion}"
    testImplementation 'org.hamcrest:hamcrest:2.2'
    testImplementation('xerces:xercesImpl:2.12.2') {
        if (JavaVersion.current() != JavaVersion.VERSION_1_8) {
            exclude group: 'xml-apis', module: 'xml-apis'
        }
    }
    testRuntimeOnly 'org.xmlresolver:xmlresolver:4.1.2'

    // maven plugin dependencies
    implementation('org.apache.maven:maven-core:3.8.4')
    implementation 'org.apache.maven:maven-model:3.8.4'
    implementation('org.apache.maven:maven-plugin-api:3.8.4')
    implementation 'org.apache.maven.plugin-tools:maven-plugin-annotations:3.6.2'


    // previous xmlbeans version is used to bootstrap necessary schema bindings
    bootstrap 'org.apache.xmlbeans:xmlbeans:5.0.3'
    bootstrap "org.apache.logging.log4j:log4j-core:${log4jVersion}"

    genresources "org.apache.logging.log4j:log4j-core:${log4jVersion}"
    genresources project.files('build/generated/classes/bootstrap/main')
    genresources project.files('build/generated/sources/bootstrap/main/resources')
    genresources project.files('src/main/resources')
    genresources "com.github.javaparser:javaparser-core:${javaparserVersion}"
    genresources "com.github.javaparser:javaparser-symbol-solver-core:${javaparserVersion}"

    // need an own configuration for Java9 builds, as the maven plugin module-config is overlapping lot
    java9 "org.apache.logging.log4j:log4j-api:${log4jVersion}"
    java9("net.sf.saxon:Saxon-HE:${saxonVersion}") {
        exclude group: 'xml-apis', module: 'xml-apis'
        exclude group: 'org.apache.httpcomponents', module: 'httpclient'
        exclude group: 'org.apache.httpcomponents', module: 'httpcore'
    }
    java9 "org.apache.ant:ant:${antVersion}"
    java9 "com.github.javaparser:javaparser-core:${javaparserVersion}"
    java9("com.github.javaparser:javaparser-symbol-solver-core:${javaparserVersion}") {
        exclude group: 'com.google.guava', module: 'failureaccess'
        exclude group: 'com.google.guava', module: 'listenablefuture'
        exclude group: 'com.google.code.findbugs', module: 'jsr305'
        exclude group: 'org.checkerframework', module: 'checker-qual'
        exclude group: 'com.google.errorprone', module: 'error_prone_annotations'
        exclude group: 'com.google.j2objc', module: 'j2objc-annotations'
    }
}

wrapper {
    gradleVersion = '7.5'
}

def extCP = files(configurations.testCompileClasspath + sourceSets.main.output.files + sourceSets.main.resources.srcDirs)
testSchemas.each {
    schemaGenTask(it.name, 'test', (it.name =~ /sEXT/ ? extCP : configurations.genresources), it.dir, "${it.path}:${it.name}")
}

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

// https://discuss.gradle.org/t/passing-arguments-to-a-task/8427
def schemaGenTask(String baseName, String mainTest, FileCollection beansPath, String xsdDir, String... xsdIncludes) {
    String srcDir = "build/generated/sources/${baseName}/${mainTest}/java"
    String rscDir = "build/generated/sources/${baseName}/${mainTest}/resources"

    Map<String,String> map = xsdIncludes.collectEntries{it.split(':')}

    return tasks.create("${baseName}_SchemaGen") {

        FileTree inputFiles = fileTree(dir: xsdDir, includes: map.keySet().collect{ it.split(' ')}.flatten())

        it.inputs.files(inputFiles)
        it.outputs.dir(srcDir)
        it.outputs.dir(rscDir)
        it.outputs.cacheIf { true }

        doLast {
            ant.mkdir(dir:srcDir)
            ant.mkdir(dir:rscDir)

            // https://www.reddit.com/r/gradle/comments/aaqofp/extend_javaexec_task_with_additional/
            map.each {xmlEntry ->
                javaexec {
                    classpath beansPath
                    mainClass = "org.apache.xmlbeans.impl.tool.SchemaCompiler"
                    jvmArgs "-ea"
                    args = [ "-name", xmlEntry.value, "-quiet", "-srconly", "-noann", "-d", rscDir, "-src", srcDir ] + xmlEntry.key.split(' ').collect{"${xsdDir}/${it}"}
                    if (baseName =~ /sEXT/) {
                        args += ['src/test/java/xmlobject/extensions']
                    }
                    if (baseName =~ /sUSERTYPE/) {
//                        debugOptions {
//                            enabled = true
//                            port = 5006
//                            server = true
//                            suspend = true
//                        }
                    }
                }
            }
        }
    }
}


schemaGenTask('bootstrap', 'main', configurations.bootstrap, 'src/main/schema', 'xml:sXMLLANG','xsd:sXMLSCHEMA','config:sXMLCONFIG','tools:sXMLTOOLS')
task bootstrapMigrate(type: JavaCompile) {
    dependsOn 'bootstrap_SchemaGen'
    source files('build/generated/sources/bootstrap/main/java', 'src/main/java')
    destinationDirectory = layout.buildDirectory.dir('generated/classes/bootstrap/main')
    classpath = configurations.compileClasspath
    outputs.cacheIf { true }
}

// base_SchemaGen
schemaGenTask('base', 'main', configurations.genresources, 'src/main/schema', 'xml:sXMLLANG','xsd:sXMLSCHEMA','config:sXMLCONFIG','tools:sXMLTOOLS')
base_SchemaGen.dependsOn 'bootstrapMigrate'

task unpackTranXml(type: Copy) {
    from tarTree(resources.bzip2('src/test/resources/xbean/tranxml.tar.bz2'))
    into 'build/schemas/sTRANXML/tranxml'
    include 'tranxml/Version4.0/schemas/StandAlone/CarLocationMessage_40_LX.xsd'
    includeEmptyDirs = false
    eachFile { path = name }
    outputs.cacheIf { true }
}

sTRANXML_SchemaGen.dependsOn 'unpackTranXml'

java {
    withJavadocJar()
    withSourcesJar()
}


javadoc {
    failOnError = true
    maxMemory = "1024M"
    doFirst {
        options {
            if (JavaVersion.current() != JavaVersion.VERSION_1_8) {
                addBooleanOption('html5', true)
            }
            addBooleanOption('Xdoclint:all,-missing', true)
            links 'https://poi.apache.org/apidocs/dev/'
            links 'https://docs.oracle.com/javase/8/docs/api/'
            links 'https://xmlbeans.apache.org/docs/5.0.0/'
            source = "1.8"
        }
    }
}

compileTestJava {
    dependsOn 'jar'
    dependsOn testSchemas.collect {"${it.name}_SchemaGen" }
}

task compileJava9(type: JavaCompile) {
    dependsOn 'compileJava'
    onlyIf { JavaVersion.current() != JavaVersion.VERSION_1_8 }

    sourceCompatibility = 9
    targetCompatibility = 9
    destinationDirectory = file('build/classes/java9/main/META-INF/versions/9')
    source = file('src/main/java9')
    classpath = files()
    options.compilerArgs = [
        '--patch-module', "org.apache.xmlbeans=${sourceSets.main.output.asPath}",
        '--module-path',  files(sourceSets.main.output.files + configurations.java9.asFileTree.files).asPath
    ]
}

task cacheJava9(type: Copy) {
    dependsOn 'compileJava9'
    onlyIf { JavaVersion.current() != JavaVersion.VERSION_1_8 }

    from(file('build/classes/java9/main/META-INF/versions/9'))
    into('src/main/java9')
}



processTestResources {
    duplicatesStrategy = DuplicatesStrategy.INCLUDE
}

task export4anttest(type: Copy) {
    dependsOn 'jar'
    into "build/libs"
    from configurations.java9
}

test {
    dependsOn 'export4anttest'
    useJUnitPlatform()
    environment 'xbean.rootdir', rootDir.path
}

idea {
    module {
        generatedSourceDirs += file('build/generated/sources/base/main/java')
        generatedSourceDirs += files( testSchemas.collect {"build/generated/sources/${it.name}/test/java" } )
        // setting those has no effect and there's no generatedResourceDirs
        generatedSourceDirs += file('build/generated/sources/base/main/resources')
        generatedSourceDirs += files( testSchemas.collect {"build/generated/sources/${it.name}/test/resources" } )
    }
}

jar {
    dependsOn 'cacheJava9'

    archiveBaseName = "xmlbeans-${XMLBeansVersion}"

    from(project.rootDir) {
        include 'NOTICE.txt'
        include 'LICENSE.txt'
    }

    from('build/classes/java9/main')

    from('src/main/maven') {
        exclude '**/*.java'
        into 'META-INF/maven'
        filter { line -> line.replaceAll('@VERSION@', XMLBeansVersion) }
    }

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

    duplicatesStrategy = DuplicatesStrategy.INCLUDE

    manifest {
        attributes('Multi-Release':'true')
        attributes([
                'Comment': "Apache XmlBeans version ${XMLBeansVersion}",
                'Specification-Title': 'Apache XmlBeans',
                'Specification-Version': XMLBeansVersion,
                'Specification-Vendor': 'The Apache Software Foundation',
                'Implementation-Title': 'Apache XmlBeans',
                'Implementation-Version': XMLBeansVersion,
                'Implementation-Vendor': 'org.apache.xmlbeans',
                'Implementation-Vendor-Id': 'The Apache Software Foundation',
                'Built-By': System.properties['user.name'],
                'Build-Timestamp': new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").format(new Date()),
                //'Build-Revision': versioning.info.commit,
                'Created-By': "Gradle ${gradle.gradleVersion}",
                'Build-Jdk': "${System.properties['java.version']} (${System.properties['java.vendor']} ${System.properties['java.vm.version']})",
                'Build-OS': "${System.properties['os.name']} ${System.properties['os.arch']} ${System.properties['os.version']}"
        ], 'org/apache/xmlbeans/'
        )
    }
}

javadocJar {
    archiveBaseName = "xmlbeans-${XMLBeansVersion}"
}

sourcesJar {
    archiveBaseName = "xmlbeans-${XMLBeansVersion}"
}

rat {
    dependsOn 'cacheJava9'

    excludes = [
        'tmp',
        'out',
        'build',
        'javadoc',
        '.gradle',
        '.idea',
        'src/test/java/org/w3c/**',
        'samples/*/build',
        'test/perf',
        'test/docs',
        "**/gradle-wrapper.properties",
        '**/*.iml',
        '**/XML.xsd',
        '**/XMLSchema.xsd',
        '**/zvon*.xml',
        '**/xmldsig-core-schema.xsd',
        'src/test/resources/xbean/xmlobject/japanese',
        'src/test/resources/xbean/compile/scomp/j2ee',
        'src/test/resources/xbean/dom/W3C/level2/core/files',
        'src/test/resources/xbean/xmlobject/soap-envelope.xsd',
        'src/test/resources/xbean/xmlobject/soap12-encoding.xsd',
        'src/test/resources/xbean/compile/scomp/partials',
        'src/test/resources/xbean/dom/W3C/level2',
        'xbeanenv.*',
        'CHANGES.txt',
        'SECURITY.md',
        '.travis.yml',
        'build.javacheck.xml'
    ]

    // Prints the list of files with unapproved licences to the console, defaults to false
    verbose = true
}

distributions {

    def date = new Date().format('yyyyMMdd')
    String root = "xmlbeans-${XMLBeansVersion}/"

    bin {

        // for this to work, project.version shouldn't be defined
        distributionBaseName = "xmlbeans-bin-${XMLBeansVersion}-${date}"

        contents {
            from('build/libs') {
                into 'lib'
            }
            from(sourcesJar) {
                into 'lib'
            }
            from(javadocJar) {
                into 'lib'
            }
            from ('xkit')
            from ('samples') {
                into 'samples'
            }
            from ('src/main/shell') {
                into 'bin'
            }
            from ('.') {
                include 'LICENSE.txt'
                include 'NOTICE.txt'
            }

            includeEmptyDirs = false
            duplicatesStrategy = DuplicatesStrategy.EXCLUDE

            eachFile {
                path = root + path.replaceAll("^[^/]+/","")
            }
        }
    }
    src {
        distributionBaseName = "xmlbeans-src-${XMLBeansVersion}-${date}"
        contents {
            from(".") {
                exclude 'tmp'
                exclude 'out'
                exclude 'gradle'
                exclude 'gradlew*'
                exclude '.gradle'
                exclude '.idea'
                exclude 'build'
                exclude '**/build'
            }

            from ('src/main/shell') {
                into 'bin'
            }

            from ('build/docs/javadoc') {
                into 'javadocs'
            }

            includeEmptyDirs = false
            duplicatesStrategy = DuplicatesStrategy.EXCLUDE

            eachFile {
                path = root + path.replaceAll("^[^/]+/","")
            }
        }
    }
}

publishing {
    publications {
        POI(MavenPublication) {
            groupId 'org.apache.xmlbeans'
            artifactId project.archivesBaseName
            version XMLBeansVersion

            from components.java

            pom {
                packaging = 'jar'
                url = 'https://xmlbeans.apache.org/'
                name = 'XmlBeans'
                description = 'XmlBeans main jar'

                mailingLists {
                    mailingList {
                        name = 'POI Users List'
                        subscribe = 'user-subscribe@poi.apache.org'
                        unsubscribe = 'user-unsubscribe@poi.apache.org'
                        archive = 'http://mail-archives.apache.org/mod_mbox/poi-user/'
                    }
                    mailingList {
                        name = 'POI Developer List'
                        subscribe = 'dev-subscribe@poi.apache.org'
                        unsubscribe = 'dev-unsubscribe@poi.apache.org'
                        archive = 'http://mail-archives.apache.org/mod_mbox/poi-dev/'
                    }
                }

                licenses {
                    license {
                        name = 'Apache License, Version 2.0'
                        url = 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                        distribution = 'repo'
                    }
                }

                organization {
                    name = 'Apache Software Foundation'
                    url = 'http://www.apache.org/'
                }
            }
        }
    }
}

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

[binDistTar, binDistZip]*.dependsOn 'jar'
[binDistTar, binDistZip]*.dependsOn 'export4anttest'
[srcDistTar, srcDistZip]*.dependsOn 'cacheJava9'

tasks.withType(Tar) {
    compression = Compression.GZIP
    archiveExtension = 'tgz'
}


task jenkins() {
    dependsOn 'check'
    dependsOn 'jacocoTestReport'
    dependsOn 'rat'
    dependsOn 'spotbugsMain'
    dependsOn 'spotbugsTest'
    dependsOn 'binDistZip'
    dependsOn 'binDistTar'
    dependsOn 'srcDistZip'
    dependsOn 'srcDistTar'
}

clean {
    ant.delete(includeemptydirs:true) {
        fileset(dir:"samples", includes:"*/build/**")
    }
    ant.delete(failonerror:false) {
        fileset(dir:"lib")
    }
}

forbiddenApis {
    bundledSignatures = [ 'jdk-unsafe', 'jdk-deprecated', 'jdk-internal', 'jdk-non-portable', 'jdk-reflection' ]
    //
    // signaturesFiles = files('src/test/resources/forbiddenApis/forbidden-signatures.txt')
    ignoreFailures = false
    suppressAnnotations = [ 'org.apache.xmlbeans.impl.util.SuppressForbidden' ]
    // forbiddenapis bundled signatures max supported version is 14
    targetCompatibility = (JavaVersion.VERSION_14.isCompatibleWith(JavaVersion.current()) ? JavaVersion.current() : JavaVersion.VERSION_14)
}

//forbiddenApisMain.onlyIf { false }
forbiddenApisTest.onlyIf { false }


if (project.hasProperty('enableSonar')) {
    // See https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-gradle/ and
    // https://docs.sonarqube.org/display/SONARQUBE52/Analyzing+with+SonarQube+Scanner+for+Gradle
    // for documentation of properties.
    //
    // Some additional properties are currently set in the Jenkins-DSL, see jenksin/create_jobs.groovy
    //
    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"
            // currently supported providers on Jenkins: "hg,git": property "sonar.scm.provider", "svn"

            // the plugin seems to not detect our non-standard build-layout
            property "sonar.junit.reportPaths", "$projectDir/build/test-results/test"

            // the Gradle run will report an invalid directory for 'ooxml-schema', but it seems to still work fine
            property "sonar.coverage.jacoco.xmlReportPaths", "$projectDir/build/reports/jacoco/test/jacocoTestReport.xml"

            // somehow the version was not use properly
            property "sonar.projectVersion", version
        }
    }
}


jacoco {
    toolVersion = '0.8.8'
}

test {
    jacoco {
        excludes = [
            // this is necessary to make JaCoCo work with JDK 18 for now
            'sun/**',
            'javax/**',
        ]
    }
}

jacocoTestReport {
    reports {
        xml.required = true
    }
}

spotbugs {
    ignoreFailures = true
    showStackTraces = false
    showProgress = false
}

spotbugsMain {
    reports {
        xml {
            required = true
            outputLocation = file("build/reports/spotbugs/main/spotbugs.xml")
        }
        html {
            required = true
            outputLocation = file("build/reports/spotbugs/main/spotbugs.html")
            stylesheet = 'fancy-hist.xsl'
        }
    }
}

spotbugsTest {
    reports {
        xml {
            required = true
            outputLocation = file("build/reports/spotbugs/test/spotbugs.xml")
        }
        html {
            required = true
            outputLocation = file("build/reports/spotbugs/test/spotbugs.html")
            stylesheet = 'fancy-hist.xsl'
        }
    }
}

if (project.hasProperty('enableSonar')) {
    // See https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-gradle/ and
    // https://docs.sonarqube.org/display/SONARQUBE52/Analyzing+with+SonarQube+Scanner+for+Gradle
    // for documentation of properties.
    //
    // Some additional properties are currently set in the Jenkins-DSL, see jenksin/create_jobs.groovy
    //
    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"
            // currently supported providers on Jenkins: "hg,git": property "sonar.scm.provider", "svn"

            // the plugin seems to not detect our non-standard build-layout
            property "sonar.junit.reportPaths", "$projectDir/build/test-results/test"

            // the Gradle run will report an invalid directory for 'ooxml-schema', but it seems to still work fine
            property "sonar.coverage.jacoco.xmlReportPaths", "$projectDir/build/reports/jacoco/test/jacocoTestReport.xml"

            // somehow the version was not use properly
            property "sonar.projectVersion", version
        }
    }
}

cyclonedxBom {
    // includeConfigs is the list of configuration names to include when generating the BOM (leave empty to include every configuration)
    includeConfigs = ["runtimeClasspath"]
    // skipConfigs is a list of configuration names to exclude when generating the BOM
    //skipConfigs = ["compileClasspath", "testCompileClasspath"]
    // Specified the type of project being built. Defaults to 'library'
    projectType = "library"
    // Specified the version of the CycloneDX specification to use. Defaults to 1.4.
    schemaVersion = "1.4"
    // Boms destination directory (defaults to build/reports)
    destination = file("build/reports")
    // The file name for the generated BOMs (before the file format suffix). Defaults to 'bom'
    outputName = "xmlbeans-${XMLBeansVersion}.bom"
    // The file format generated, can be xml, json or all for generating both
    outputFormat = "xml"
    // Exclude BOM Serial Number
    includeBomSerialNumber = true
}

Set<File> xsdDirs(File parent) {
    Set<File> xsdDirs = [] as Set<File>
    parent.eachDirRecurse {dirIt ->
        dirIt.eachFileMatch(groovy.io.FileType.FILES, ~/.*\.xsd.*/, { xsdDirs << parent.toPath().relativize(dirIt.toPath()).toFile() })
    }
    return xsdDirs
}

