/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */

pluginManagement {
    repositories {
        gradlePluginPortal()
        maven {
            name = 'localPluginRepository'
            url = uri( "${gradle.gradleUserHomeDir}/tmp/plugins" )
        }
    }

    includeBuild 'local-build-plugins'
}

plugins {
    id 'org.hibernate.orm.build.env-settings'
    id 'com.gradle.enterprise' version '3.10.2'
    id 'com.gradle.common-custom-user-data-gradle-plugin' version '1.7.2'
}

// version catalog support
//      - https://docs.gradle.org/7.3.3/userguide/platforms.html#sub:central-declaration-of-dependencies
enableFeaturePreview("VERSION_CATALOGS")


dependencyResolutionManagement {
    repositories {
        mavenCentral()
        // Needed for the RC versions of Jakarta Persistence
        maven {
            url "https://jakarta.oss.sonatype.org/content/repositories/releases/"
        }
        // Needed for the SNAPSHOT versions of Jakarta Persistence
        maven {
            url "https://jakarta.oss.sonatype.org/content/repositories/snapshots/"
        }

        //Allow loading additional dependencies from a local path;
        //useful to load JDBC drivers which can not be distributed in public.
        if (System.env['ADDITIONAL_REPO'] != null) {
            flatDir {
                dirs "${System.env.ADDITIONAL_REPO}"
            }
        }
    }

    pluginManagement {
        repositories {
            gradlePluginPortal()
        }
    }

    versionCatalogs {
        libs {
            version( "antlr", "4.10" )
            version( "hcann", "6.0.2.Final" )
            version( "geolatte", "1.8.2" )
            version( "byteBuddy", "1.12.9" )
            version( "agroal", "2.0" )
            version( "c3po", "0.9.5.5" )
            version( "hikaricp", "3.2.0" )
            version( "proxool", "0.8.3" )
            version( "vibur", "25.0" )
            version( "micrometer", "1.6.1" )

            alias( "antlr" ).to( "org.antlr", "antlr4" ).versionRef( "antlr")
            alias( "antlrRuntime" ).to( "org.antlr", "antlr4-runtime" ).versionRef( "antlr")

            alias( "byteBuddy" ).to( "net.bytebuddy", "byte-buddy" ).versionRef( "byteBuddy" )
            alias( "byteBuddyAgent" ).to( "net.bytebuddy", "byte-buddy-agent" ).versionRef( "byteBuddy" )

            alias( "logging" ).to ( "org.jboss.logging", "jboss-logging" ).version( "3.4.3.Final" )
            alias( "loggingAnnotations" ).to ( "org.jboss.logging", "jboss-logging-annotations" ).version( "2.2.1.Final" )
            alias( "loggingProcessor" ).to ( "org.jboss.logging", "jboss-logging-processor" ).version( "2.2.1.Final" )

            alias( "hcann" ).to( "org.hibernate.common", "hibernate-commons-annotations" ).versionRef( "hcann" )
            alias( "jandex" ).to("org.jboss", "jandex" ).version( "2.4.2.Final" )
            alias( "classmate" ).to( "com.fasterxml", "classmate" ).version( "1.5.1" )

            alias( "jackson" ).to ( "com.fasterxml.jackson.core", "jackson-databind" ).version( "2.13.0" )
            alias( "jacksonXml" ).to ( "com.fasterxml.jackson.dataformat", "jackson-dataformat-xml" ).version( "2.13.0" )
            alias( "validator" ).to( "org.hibernate.validator", "hibernate-validator" ).version( "7.0.4.Final" )

            alias( "ant" ).to( "org.apache.ant", "ant" ).version( "1.8.2" )

            alias( "geolatte" ).to( "org.geolatte", "geolatte-geom" ).versionRef( "geolatte" )

            alias( "jcache" ).to( "javax.cache", "cache-api" ).version( "1.0.0" )
            alias( "ehcache3" ).to( "org.ehcache:ehcache:3.10.0-alpha0" )

            alias( "agroal" ).to( "io.agroal", "agroal-api" ).versionRef( "agroal" )
            alias( "agroalPool" ).to( "io.agroal", "agroal-pool" ).versionRef( "agroal" )
            alias( "c3p0" ).to( "com.mchange", "c3p0" ).versionRef( "c3po" )
            alias( "hikaricp" ).to( "com.zaxxer", "HikariCP" ).versionRef( "hikaricp" )
            alias( "proxool" ).to( "proxool", "proxool" ).versionRef( "proxool" )
            alias( "vibur" ).to( "org.vibur", "vibur-dbcp" ).versionRef( "vibur" )

            alias( "micrometer" ).to ( "io.micrometer", "micrometer-core" ).versionRef( "micrometer" )
        }
        jakartaLibs {
            version( "jaxbRuntime", "3.0.2" )
            version( "jsonbRuntime", "2.0.4" )

            // `jakartaJpaVersion` comes from the local-build-plugins to allow for command-line overriding of the JPA version to use
            alias( "jpa" ).to( "jakarta.persistence", "jakarta.persistence-api" ).version( "${jakartaJpaVersion}" )
            alias( "jta" ).to( "jakarta.transaction", "jakarta.transaction-api" ).version( "2.0.0")
            alias( "validation" ).to( "jakarta.validation", "jakarta.validation-api" ).version( "3.0.0" )
            alias( "jacc" ).to( "jakarta.authorization", "jakarta.authorization-api" ).version( "2.0.0" )
            alias( "cdi" ).to( "jakarta.enterprise", "jakarta.enterprise.cdi-api" ).version( "3.0.0" )
            alias( "jsonbApi" ).to( "jakarta.json.bind", "jakarta.json.bind-api" ).version( "2.0.0" )
            alias( "jsonb" ).to( "org.eclipse", "yasson" ).versionRef( "jsonbRuntime" )
            alias( "inject" ).to( "jakarta.inject", "jakarta.inject-api" ).version( "2.0.0" )
            alias( "jaxbApi" ).to( "jakarta.xml.bind", "jakarta.xml.bind-api" ).version( "3.0.1" )
            alias( "jaxb" ).to( "org.glassfish.jaxb", "jaxb-runtime" ).versionRef( "jaxbRuntime" )
            alias( "xjc" ).to( "org.glassfish.jaxb", "jaxb-xjc" ).versionRef( "jaxbRuntime" )
            alias( "el" ).to( "org.glassfish", "jakarta.el" ).version( "4.0.1" )
        }
        testLibs {
            version( "junit4", "4.13.2" )
            version( "junit5", "5.8.2" )
            version( "assertj", "3.14.0" )
            version( "mockito", "4.3.1" )
            version( "byteman", "4.0.16" )
            version( "shrinkwrap", "1.2.6" )
            version( "shrinkwrapDescriptors", "2.0.0" )

            alias( "junit5Api" ).to( "org.junit.jupiter", "junit-jupiter-api" ).versionRef( "junit5" )
            alias( "junit5Engine" ).to( "org.junit.jupiter", "junit-jupiter-engine" ).versionRef( "junit5" )
            alias( "junit5Params" ).to( "org.junit.jupiter", "junit-jupiter-params" ).versionRef( "junit5" )
            alias( "junit4Engine" ).to( "org.junit.vintage", "junit-vintage-engine" ).versionRef( "junit5" )
            alias( "junit4" ).to( "junit", "junit" ).versionRef( "junit4" )

            alias( "assertjCore" ).to( "org.assertj", "assertj-core" ).versionRef( "assertj" )
            alias( "assertjApi" ).to( "org.assertj", "assertj-core-api" ).versionRef( "assertj" )

            alias( "mockito" ).to( "org.mockito", "mockito-core" ).versionRef( "mockito" )
            alias( "mockitoInline" ).to( "org.mockito", "mockito-inline" ).versionRef( "mockito" )

            alias( "log4j2" ).to( "org.apache.logging.log4j", "log4j-core" ).version( "2.17.1" )

            alias( "byteman" ).to ( "org.jboss.byteman", "byteman" ).versionRef("byteman" )
            alias( "bytemanInstall" ).to ( "org.jboss.byteman", "byteman-install" ).versionRef("byteman" )
            alias( "bytemanBmunit" ).to ( "org.jboss.byteman", "byteman-bmunit" ).versionRef("byteman" )

            alias( "xapool" ).to( "com.experlog", "xapool" ).version( "1.5.0" )

            alias( "shrinkwrap" ).to( "org.jboss.shrinkwrap", "shrinkwrap-impl-base" ).versionRef( "shrinkwrap" )
            alias( "shrinkwrapApi" ).to( "org.jboss.shrinkwrap", "shrinkwrap-api" ).versionRef( "shrinkwrap" )
            alias( "shrinkwrapDescriptors" ).to( "org.jboss.shrinkwrap.descriptors", "shrinkwrap-descriptors-impl-javaee" ).versionRef( "shrinkwrapDescriptors" )
            alias( "shrinkwrapDescriptorsApi" ).to( "org.jboss.shrinkwrap.descriptors", "shrinkwrap-descriptors-api-javaee" ).versionRef( "shrinkwrapDescriptors" )

            alias( "jbossJta" ).to( "org.jboss.narayana.jta", "narayana-jta-jakarta" ).version( "5.11.2.Final" )
            alias( "jbossTxSpi" ).to( "org.jboss", "jboss-transaction-spi-jakarta" ).version( "7.6.1.Final" )
            alias( "wildFlyTxnClient" ).to( "org.wildfly.transaction", "wildfly-transaction-client-jakarta" ).version( "2.0.0.Final" )
            alias( "weld" ).to( "org.jboss.weld.se", "weld-se-shaded" ).version( "4.0.1.SP1" )
        }
        dbLibs {
            version( "h2", "2.1.210" )
            version( "pgsql", "42.2.16" )
            version( "mysql", "8.0.27" )
            version( "oracle", "21.3.0.0" )

            alias( "h2" ).to( "com.h2database", "h2" ).versionRef( "h2" )
            alias( "h2gis" ).to( "org.orbisgis", "h2gis" ).version( "2.0.0" )
            alias( "hsqldb" ).to( "org.hsqldb", "hsqldb" ).version( "2.6.1" )
            alias( "derby" ).to( "org.apache.derby", "derby" ).version( "10.14.2.0" )
            alias( "postgresql" ).to( "org.postgresql", "postgresql" ).versionRef( "pgsql" )
            alias( "cockroachdb" ).to( "org.postgresql", "postgresql" ).version( "42.2.8" )
            alias( "mysql" ).to( "mysql", "mysql-connector-java" ).versionRef( "mysql" )
            alias( "tidb" ).to( "mysql", "mysql-connector-java" ).versionRef( "mysql" )
            alias( "mariadb" ).to( "org.mariadb.jdbc", "mariadb-java-client" ).version( "2.2.3" )
            alias( "oracle" ).to( "com.oracle.database.jdbc", "ojdbc8" ).versionRef( "oracle" )
            alias( "oracleXml" ).to( "com.oracle.database.xml", "xdb" ).versionRef( "oracle" )
            alias( "oracleXmlParser" ).to( "com.oracle.database.xml", "xmlparserv2" ).versionRef( "oracle" )
            alias( "mssql" ).to( "com.microsoft.sqlserver", "mssql-jdbc" ).version( "7.2.1.jre8" )
            alias( "db2" ).to( "com.ibm.db2", "jcc" ).version( "11.5.7.0" )
            alias( "hana" ).to( "com.sap.cloud.db.jdbc", "ngdbc" ).version( "2.4.59" )
            alias( "sybase" ).to( "net.sourceforge.jtds", "jtds" ).version( "1.3.1" )
            alias( "informix" ).to( "com.ibm.informix", "jdbc" ).version( "4.10.12" )
            alias( "firebird" ).to( "org.firebirdsql.jdbc", "jaybird" ).version( "4.0.3.java8" )
        }
        mavenLibs {
            alias( "mavenCore" ).to( "org.apache.maven", "maven-core" ).version( "3.8.1" )
            alias( "mavenArtifact" ).to( "org.apache.maven", "maven-artifact" ).version( "3.0.5" )
            alias( "mavenPlugin" ).to( "org.apache.maven", "maven-plugin-api" ).version( "3.0.5" )
            alias( "mavenPluginTools" ).to( "org.apache.maven.plugin-tools", "maven-plugin-annotations" ).version( "3.2" )
        }
    }
}

rootProject.name = 'hibernate-orm'

apply from: file( 'gradle/gradle-enterprise.gradle' )

if ( !JavaVersion.current().java11Compatible ) {
    throw new GradleException( "Gradle must be run with Java 11 or later" )
}

buildCache {
    local {
        // do not use local build cache for CI jobs, period!
        enabled = !settings.ext.isCiEnvironment
    }
    remote(HttpBuildCache) {
        enabled = true
        push = settings.ext.populateRemoteBuildCache
        url = 'https://ge.hibernate.org/cache/'
    }
}

gradle.ext.baselineJavaVersion = JavaLanguageVersion.of( 11 )

// Gradle does bytecode transformation on tests.
// You can't use bytecode higher than what Gradle supports, even with toolchains.
def GRADLE_MAX_SUPPORTED_BYTECODE_VERSION = 17

// If either 'main.jdk.version' or 'test.jdk.version' is set, enable the toolchain and use the selected jdk.
// If only one property is set, the other defaults to the baseline Java version (8).
// Note that when toolchain is enabled, you also need to specify
// the location of the selected jdks
// (auto-download and auto-detect are disabled in gradle.properties).
//
// Example (with SDKMAN):
// ./gradlew build -Ptest.jdk.version=15 \
// -Porg.gradle.java.installations.paths=$SDKMAN_CANDIDATES_DIR/java/15.0.1-open,$SDKMAN_CANDIDATES_DIR/java/8
if ( hasProperty( 'main.jdk.version' ) || hasProperty( 'test.jdk.version' ) ) {
    // Testing a particular JDK version
    // Gradle doesn't support all JDK versions unless we use toolchains
    gradle.ext.javaToolchainEnabled = true
    gradle.ext.javaVersions = [
            main: [
                    compiler: JavaLanguageVersion.of( hasProperty( 'main.jdk.version' )
                            ? getProperty( 'main.jdk.version' ) : gradle.ext.baselineJavaVersion.asInt() ),
                    release: gradle.ext.baselineJavaVersion
            ],
            test: [
                    compiler: JavaLanguageVersion.of( hasProperty( 'test.jdk.version' )
                            ? getProperty( 'test.jdk.version' ) : gradle.ext.baselineJavaVersion.asInt() )
            ]
    ]
    def testCompilerVersion = gradle.ext.javaVersions.test.compiler
    if ( testCompilerVersion.asInt() > GRADLE_MAX_SUPPORTED_BYTECODE_VERSION ) {
        logger.warn( "[WARN] Gradle does not support bytecode version '${testCompilerVersion}'." +
                 " Forcing test bytecode to version ${GRADLE_MAX_SUPPORTED_BYTECODE_VERSION}." )
        gradle.ext.javaVersions.test.release = JavaLanguageVersion.of( GRADLE_MAX_SUPPORTED_BYTECODE_VERSION )
    }
    else {
        gradle.ext.javaVersions.test.release = testCompilerVersion
    }
    gradle.ext.javaVersions.test.launcher = testCompilerVersion
}
else {
    // Not testing a particular JDK version: we will use the same JDK used to run Gradle.
    // We disable toolchains for convenience, so that anyone can just run the build with their own JDK
    // without any additional options and without downloading the whole JDK.
    gradle.ext.javaToolchainEnabled = false
    def gradleJdkVersion = JavaLanguageVersion.of( JavaVersion.current().getMajorVersion() )
    if ( gradleJdkVersion.asInt() > GRADLE_MAX_SUPPORTED_BYTECODE_VERSION ) {
        logger.warn( "[WARN] Gradle does not support this JDK, because it is too recent; build is likely to fail." +
                " To avoid failures, you should use an older Java version when running Gradle, and rely on toolchains." +
                " To that end, specify the version of Java you want to run tests with using property 'test.jdk.version'," +
                " and specify the path to JDK8 *and* a JDK of the test version using property 'org.gradle.java.installations.paths'." +
                " Example:" +
                "./gradlew build -Ptest.jdk.version=15 -Porg.gradle.java.installations.paths=\$SDKMAN_CANDIDATES_DIR/java/15.0.1-open,\$SDKMAN_CANDIDATES_DIR/java/8" )
    }

    gradle.ext.javaVersions = [
            main: [
                    compiler: gradleJdkVersion,
                    release: gradle.ext.baselineJavaVersion
            ],
            test: [
                    compiler: gradleJdkVersion,
                    release: JavaLanguageVersion.of(
                            Math.min( GRADLE_MAX_SUPPORTED_BYTECODE_VERSION, gradleJdkVersion.asInt() ) ),
                    launcher: gradleJdkVersion
            ]
    ]
}

logger.lifecycle "Java versions for main code: " + gradle.ext.javaVersions.main
logger.lifecycle "Java versions for tests: " + gradle.ext.javaVersions.test

include 'hibernate-core'
include 'hibernate-testing'

include 'hibernate-envers'
include 'hibernate-spatial'

include 'hibernate-platform'

include 'hibernate-community-dialects'

include 'hibernate-c3p0'
include 'hibernate-proxool'
include 'hibernate-hikaricp'
include 'hibernate-vibur'
include 'hibernate-agroal'

include 'hibernate-jcache'

include 'hibernate-micrometer'
include 'hibernate-graalvm'
include 'hibernate-integrationtest-java-modules'

include 'documentation'
include 'release'

include 'metamodel-generator'
project(':metamodel-generator').projectDir = new File(rootProject.projectDir, "tooling/metamodel-generator")
project(':metamodel-generator').name = 'hibernate-jpamodelgen'

include 'hibernate-gradle-plugin'
project(':hibernate-gradle-plugin').projectDir = new File(rootProject.projectDir, "tooling/hibernate-gradle-plugin")

include 'hibernate-enhance-maven-plugin'
project(':hibernate-enhance-maven-plugin').projectDir = new File(rootProject.projectDir, "tooling/hibernate-enhance-maven-plugin")

include 'hibernate-ant'
project(':hibernate-ant').projectDir = new File(rootProject.projectDir, "tooling/hibernate-ant")


rootProject.children.each { project ->
    project.buildFileName = "${project.name}.gradle"
    assert project.projectDir.isDirectory()
    assert project.buildFile.exists()
    assert project.buildFile.isFile()
}
include 'hibernate-platform'

