diff --git a/.evergreen/config.yml b/.evergreen/config.yml index 8ae8aed8..85ff0df3 100644 --- a/.evergreen/config.yml +++ b/.evergreen/config.yml @@ -137,6 +137,21 @@ tasks: args: - run-integration-tests.sh + - name: run-smoke-tests + tags: + - pr + commands: + - func: bootstrap-mongo-orchestration + - command: subprocess.exec + type: test + params: + working_dir: src + binary: bash + add_to_path: + - .evergreen + args: + - run-smoke-tests.sh + - name: publish-snapshot depends_on: - variant: static-checks @@ -227,9 +242,16 @@ buildvariants: tasks: - name: run-unit-tests - - matrix_name: mongo-hibernate - matrix_spec: { mongo-version: "*", topology: "*", os: "*" } + - matrix_name: run-smoke-tests + matrix_spec: { mongo-version: "8.0", topology: replicaset, os: linux } + display_name: "Smoke Tests" + tags: + - pr + tasks: + - name: run-smoke-tests + - matrix_name: run-integration-tests + matrix_spec: { mongo-version: "*", topology: "*", os: "*" } display_name: "${mongo-version} ${topology} ${os}" tags: - pr diff --git a/.evergreen/fetch-drivers-tools.sh b/.evergreen/fetch-drivers-tools.sh index 299482b3..a87c5a80 100755 --- a/.evergreen/fetch-drivers-tools.sh +++ b/.evergreen/fetch-drivers-tools.sh @@ -7,5 +7,5 @@ if [[ -z "$DRIVERS_TOOLS" ]]; then exit 1 fi -rm -rf $DRIVERS_TOOLS -git clone https://github.com/mongodb-labs/drivers-evergreen-tools.git $DRIVERS_TOOLS +rm -rf "$DRIVERS_TOOLS" +git clone https://github.com/mongodb-labs/drivers-evergreen-tools.git "$DRIVERS_TOOLS" diff --git a/.evergreen/java-config.sh b/.evergreen/java-config.sh index d8f0cb13..c74ff08e 100755 --- a/.evergreen/java-config.sh +++ b/.evergreen/java-config.sh @@ -3,7 +3,6 @@ # Java configurations for evergreen export JDK17="/opt/java/jdk17" -export JDK21="/opt/java/jdk21" if [ -d "$JDK17" ]; then export JAVA_HOME=$JDK17 diff --git a/.evergreen/publish.sh b/.evergreen/publish.sh index 0597672a..0605f1b9 100755 --- a/.evergreen/publish.sh +++ b/.evergreen/publish.sh @@ -25,4 +25,4 @@ fi SYSTEM_PROPERTIES="-Dorg.gradle.internal.publish.checksums.insecure=true" ./gradlew -version -./gradlew ${SYSTEM_PROPERTIES} --stacktrace --info ${TASK} +./gradlew ${SYSTEM_PROPERTIES} --stacktrace --info "${TASK}" diff --git a/.evergreen/run-integration-tests.sh b/.evergreen/run-integration-tests.sh index b7b8dd77..68b0e69a 100644 --- a/.evergreen/run-integration-tests.sh +++ b/.evergreen/run-integration-tests.sh @@ -15,4 +15,4 @@ echo "MongoDB version: ${MONGODB_VERSION}; topology: ${TOPOLOGY}" ./gradlew -version -./gradlew -PjavaVersion=${JAVA_VERSION} --stacktrace --info --continue clean integrationTest +./gradlew -PjavaVersion="${JAVA_VERSION}" --stacktrace --info --continue clean integrationTest diff --git a/.evergreen/run-smoke-tests.sh b/.evergreen/run-smoke-tests.sh new file mode 100644 index 00000000..734deb79 --- /dev/null +++ b/.evergreen/run-smoke-tests.sh @@ -0,0 +1,21 @@ +#!/usr/bin/env bash + +set -o xtrace # Write all commands first to stderr +set -o errexit # Exit the script with error if any of the commands fail + +############################################ +# Main Program # +############################################ + +source java-config.sh + +echo "mongo-hibernate: running smoke tests ..." + +echo "MongoDB version: ${MONGODB_VERSION}; topology: ${TOPOLOGY}" + +./gradlew -version + +./gradlew -PjavaVersion="${JAVA_VERSION}" publishToMavenLocal \ + && ./example-module/mvnw clean verify -f ./example-module/pom.xml \ + -DjavaVersion="${JAVA_VERSION}" \ + -DprojectVersion="$(./gradlew -q printProjectVersion)" diff --git a/.evergreen/run-unit-tests.sh b/.evergreen/run-unit-tests.sh index 04b5abed..5dd18b81 100644 --- a/.evergreen/run-unit-tests.sh +++ b/.evergreen/run-unit-tests.sh @@ -13,4 +13,4 @@ echo "mongo-hibernate: running unit tests ..." ./gradlew -version -./gradlew -PjavaVersion=${JAVA_VERSION} --stacktrace --info --continue clean test +./gradlew -PjavaVersion="${JAVA_VERSION}" --stacktrace --info --continue clean test diff --git a/.gitattributes b/.gitattributes index f91f6460..bf831849 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,7 +6,7 @@ # These are Windows script files and should use crlf *.bat text eol=crlf +*.cmd text eol=crlf # Binary files should be left untouched *.jar binary - diff --git a/.gitignore b/.gitignore index ddb3849f..ede46c27 100644 --- a/.gitignore +++ b/.gitignore @@ -24,7 +24,7 @@ /bin/ # Intellij IDEA -/.idea/ +.idea/ /*.ipr /*.iws /*.iml @@ -34,4 +34,5 @@ # Gradle .gradle/ .kotlin/ -build/ \ No newline at end of file +build/ +target/ diff --git a/README.md b/README.md index d5c86378..604f861d 100644 --- a/README.md +++ b/README.md @@ -35,7 +35,7 @@ instead of SQL. This product works by: - [Manual](https://www.mongodb.com/docs/languages/java/mongodb-hibernate/current) - [API](https://javadoc.io/doc/org.mongodb/mongodb-hibernate/latest/index.html) -[Standalone deployments](https://www.mongodb.com/docs/manual/reference/glossary/#std-term-standalone) are not supported, +MongoDB [standalone deployments](https://www.mongodb.com/docs/manual/reference/glossary/#std-term-standalone) are not supported, because they [do not support transactions](https://www.mongodb.com/docs/manual/core/transactions-production-consideration/). If you use one, you may [convert it to a replica set](https://www.mongodb.com/docs/manual/tutorial/convert-standalone-to-replica-set/). @@ -46,6 +46,16 @@ The `groupId:artifactId` coordinates: `org.mongodb:mongodb-hibernate`. - [Maven Central Repository](https://repo.maven.apache.org/maven2/org/mongodb/mongodb-hibernate/) - [Maven Central Repository Search](https://central.sonatype.com/artifact/org.mongodb/mongodb-hibernate) +### Examples + +[Maven](https://maven.apache.org/) is used as a build tool. + +The Java module with example applications is located in + +- [`./example-module`](example-module) + +The examples may be run by running the smoke tests as specified in [Run Smoke Tests](#run-smoke-tests). + ### Bug Reports Use ["Extension for Hibernate ORM" at jira.mongodb.org](https://jira.mongodb.org/projects/HIBERNATE/issues). @@ -61,7 +71,7 @@ Use ["Drivers & Frameworks"/"Frameworks (e.g. Django, Hibernate, EFCore)" at fee ### Build from Source ```console -./gradlew clean build +./gradlew build ``` ### Static Code Analysis @@ -97,19 +107,11 @@ The analysis is done as part of the Gradle `compileJava` task execution. ### Testing -This project uses separate directories for unit and integration tests: +This project uses separate directories for unit, integration, smoke tests: - [`./src/test`](src/test) - [`./src/integrationTest`](src/integrationTest) - -Integration tests require a MongoDB deployment with test commands enabled, which may be achieved with the -[`--setParameter enableTestCommands=1`](https://www.mongodb.com/docs/manual/reference/parameters/) -command-line arguments. - -You may change the [MongoDB connection string](https://www.mongodb.com/docs/manual/reference/connection-string/) -via the [`jakarta.persistence.jdbc.url`](https://docs.hibernate.org/orm/6.6/userguide/html_single/#settings-jakarta.persistence.jdbc.url) -configuration property -in [`./src/integrationTest/resources/hibernate.properties`](src/integrationTest/resources/hibernate.properties). +- [`./example-module/src/smokeTest`](example-module/src/smokeTest) #### Run Unit Tests @@ -119,10 +121,38 @@ in [`./src/integrationTest/resources/hibernate.properties`](src/integrationTest/ #### Run Integration Tests +The integration tests require a MongoDB deployment that + +- is accessible at `localhost:27017`; + - You may change the [MongoDB connection string](https://www.mongodb.com/docs/manual/reference/connection-string/) + via the [`jakarta.persistence.jdbc.url`](https://docs.hibernate.org/orm/6.6/userguide/html_single/#settings-jakarta.persistence.jdbc.url) + configuration property + in [`./src/integrationTest/resources/hibernate.properties`](src/integrationTest/resources/hibernate.properties). +- has test commands enabled. + - This may be achieved with the + [`--setParameter enableTestCommands=1`](https://www.mongodb.com/docs/manual/reference/parameters/) + command-line arguments. + ```console ./gradlew integrationTest ``` +#### Run Smoke Tests + +The smoke tests with the `Tests` suffix do not require a MongoDB deployment. +The smoke tests with the `IntegrationTests` suffix, as well as the examples, require a MongoDB deployment that + +- is accessible at `localhost:27017`. + - You may change this by modifying the examples run by the smoke tests. + +```console +source ./.evergreen/java-config.sh \ + && ./gradlew -PjavaVersion=${JAVA_VERSION} publishToMavenLocal \ + && ./example-module/mvnw verify -f ./example-module/pom.xml \ + -DjavaVersion="${JAVA_VERSION}" \ + -DprojectVersion="$(./gradlew -q printProjectVersion)" +``` + ### Continuous Integration -[Evergreen](https://github.com/evergreen-ci/evergreen) and [GitHub actions](https://docs.github.com/en/actions) +[Evergreen](https://github.com/evergreen-ci/evergreen) and [GitHub Actions](https://docs.github.com/en/actions) are used for continuous integration. diff --git a/build.gradle.kts b/build.gradle.kts index 2c179807..4e43b320 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -39,20 +39,28 @@ java { } tasks.withType { - exclude("/com/mongodb/hibernate/internal/**") - exclude("com/mongodb/hibernate/dialect/**") - exclude("com/mongodb/hibernate/jdbc/**") - val standardDocletOptions = options as StandardJavadocDocletOptions standardDocletOptions.apply { + addBooleanOption("Werror", false) + // TODO-HIBERNATE-129 addStringOption("-link-modularity-mismatch", "info") + addBooleanOption("serialwarn", true) + addBooleanOption("Xdoclint:all", true) + addBooleanOption( + "Xdoclint/package:-" + + "com.mongodb.hibernate.internal.*" + + ",com.mongodb.hibernate.dialect.*" + + ",com.mongodb.hibernate.jdbc.*", + true) + addStringOption("-show-module-contents", "api") + addStringOption("-show-packages", "exported") + addStringOption("-show-types", "protected") author(true) version(true) - encoding = "UTF-8" + encoding("UTF-8") charSet("UTF-8") docEncoding("UTF-8") addBooleanOption("html5", true) addBooleanOption("-allow-script-in-comments", true) - // TODO-HIBERNATE-129 addStringOption("-link-modularity-mismatch", "info") links = listOf( "https://docs.oracle.com/en/java/javase/17/docs/api/", @@ -141,11 +149,15 @@ spotless { tasks.check { dependsOn(tasks.spotlessApply) } tasks.withType().configureEach { - options.compilerArgs.addAll(listOf("-Xlint:all", "-Werror")) + options.compilerArgs.addAll( + listOf("-Xlint:all", "-Xlint:-requires-automatic", "-Xlint:-requires-transitive-automatic", "-Werror")) when (this) { tasks.compileJava.get() -> options.errorprone { disableWarningsInGeneratedCode = true + // Error Prone does not understand the `@hidden` standard tag + disable("InvalidBlockTag") + disable("AssignmentExpression") option("NullAway:AnnotatedPackages", "com.mongodb.hibernate") error("NullAway") } @@ -159,6 +171,8 @@ tasks.withType().configureEach { buildConfig { useJavaOutput() packageName("com.mongodb.hibernate.internal") + documentation.set( + "Generated by the BuildConfig plugin.\n\n@hidden") buildConfigField("NAME", provider { project.name }) buildConfigField("VERSION", provider { "${project.version}" }) } @@ -205,6 +219,9 @@ publishing { repositories { // publish to local build dir for testing // `./gradlew publishMavenPublicationToLocalBuildRepository` + // + // publish to the local Maven cache + // `./gradlew publishToMavenLocal` maven { url = uri(localBuildRepo.get()) name = "LocalBuild" @@ -222,8 +239,8 @@ publishing { url = "https://www.mongodb.com/" licenses { license { - name = "The Apache License, Version 2.0" - url = "http://www.apache.org/licenses/LICENSE-2.0.txt" + name = "Apache License, Version 2.0" + url = "https://www.apache.org/licenses/LICENSE-2.0" } } developers { @@ -234,8 +251,8 @@ publishing { } scm { url.set("https://github.com/mongodb/mongo-hibernate") - connection.set("scm:https://github.com/mongodb/mongo-hibernate.git") - developerConnection.set("scm:https://github.com/mongodb/mongo-hibernate.git") + connection.set("scm:git:https://github.com/mongodb/mongo-hibernate.git") + developerConnection.set("scm:git:https://github.com/mongodb/mongo-hibernate.git") } } } @@ -337,3 +354,6 @@ tasks.register("publishArchives") { dependsOn(tasks.named("publishToSonatype")) } } + +// `./gradlew -q printProjectVersion` +tasks.register("printProjectVersion") { doLast { logger.quiet(project.version.toString()) } } diff --git a/example-module/.mvn/jvm.config b/example-module/.mvn/jvm.config new file mode 100644 index 00000000..e69de29b diff --git a/example-module/.mvn/maven.config b/example-module/.mvn/maven.config new file mode 100644 index 00000000..aff93939 --- /dev/null +++ b/example-module/.mvn/maven.config @@ -0,0 +1,13 @@ +# Copyright 2025-present MongoDB, Inc. +# +# Licensed 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. diff --git a/example-module/.mvn/wrapper/maven-wrapper.properties b/example-module/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 00000000..c0b02622 --- /dev/null +++ b/example-module/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,3 @@ +wrapperVersion=3.3.4 +distributionType=only-script +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/4.0.0-rc-5/apache-maven-4.0.0-rc-5-bin.zip diff --git a/example-module/mvnw b/example-module/mvnw new file mode 100755 index 00000000..bd8896bf --- /dev/null +++ b/example-module/mvnw @@ -0,0 +1,295 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# 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. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Apache Maven Wrapper startup batch script, version 3.3.4 +# +# Optional ENV vars +# ----------------- +# JAVA_HOME - location of a JDK home dir, required when download maven via java source +# MVNW_REPOURL - repo url base for downloading maven distribution +# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output +# ---------------------------------------------------------------------------- + +set -euf +[ "${MVNW_VERBOSE-}" != debug ] || set -x + +# OS specific support. +native_path() { printf %s\\n "$1"; } +case "$(uname)" in +CYGWIN* | MINGW*) + [ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")" + native_path() { cygpath --path --windows "$1"; } + ;; +esac + +# set JAVACMD and JAVACCMD +set_java_home() { + # For Cygwin and MinGW, ensure paths are in Unix format before anything is touched + if [ -n "${JAVA_HOME-}" ]; then + if [ -x "$JAVA_HOME/jre/sh/java" ]; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + JAVACCMD="$JAVA_HOME/jre/sh/javac" + else + JAVACMD="$JAVA_HOME/bin/java" + JAVACCMD="$JAVA_HOME/bin/javac" + + if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then + echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2 + echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2 + return 1 + fi + fi + else + JAVACMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v java + )" || : + JAVACCMD="$( + 'set' +e + 'unset' -f command 2>/dev/null + 'command' -v javac + )" || : + + if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then + echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2 + return 1 + fi + fi +} + +# hash string like Java String::hashCode +hash_string() { + str="${1:-}" h=0 + while [ -n "$str" ]; do + char="${str%"${str#?}"}" + h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296)) + str="${str#?}" + done + printf %x\\n $h +} + +verbose() { :; } +[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; } + +die() { + printf %s\\n "$1" >&2 + exit 1 +} + +trim() { + # MWRAPPER-139: + # Trims trailing and leading whitespace, carriage returns, tabs, and linefeeds. + # Needed for removing poorly interpreted newline sequences when running in more + # exotic environments such as mingw bash on Windows. + printf "%s" "${1}" | tr -d '[:space:]' +} + +scriptDir="$(dirname "$0")" +scriptName="$(basename "$0")" + +# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties +while IFS="=" read -r key value; do + case "${key-}" in + distributionUrl) distributionUrl=$(trim "${value-}") ;; + distributionSha256Sum) distributionSha256Sum=$(trim "${value-}") ;; + esac +done <"$scriptDir/.mvn/wrapper/maven-wrapper.properties" +[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" + +case "${distributionUrl##*/}" in +maven-mvnd-*bin.*) + MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ + case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in + *AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;; + :Darwin*x86_64) distributionPlatform=darwin-amd64 ;; + :Darwin*arm64) distributionPlatform=darwin-aarch64 ;; + :Linux*x86_64*) distributionPlatform=linux-amd64 ;; + *) + echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2 + distributionPlatform=linux-amd64 + ;; + esac + distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip" + ;; +maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;; +*) MVN_CMD="mvn${scriptName#mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;; +esac + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}" +distributionUrlName="${distributionUrl##*/}" +distributionUrlNameMain="${distributionUrlName%.*}" +distributionUrlNameMain="${distributionUrlNameMain%-bin}" +MAVEN_USER_HOME="${MAVEN_USER_HOME:-${HOME}/.m2}" +MAVEN_HOME="${MAVEN_USER_HOME}/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")" + +exec_maven() { + unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || : + exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD" +} + +if [ -d "$MAVEN_HOME" ]; then + verbose "found existing MAVEN_HOME at $MAVEN_HOME" + exec_maven "$@" +fi + +case "${distributionUrl-}" in +*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;; +*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;; +esac + +# prepare tmp dir +if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then + clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; } + trap clean HUP INT TERM EXIT +else + die "cannot create temp dir" +fi + +mkdir -p -- "${MAVEN_HOME%/*}" + +# Download and Install Apache Maven +verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +verbose "Downloading from: $distributionUrl" +verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +# select .zip or .tar.gz +if ! command -v unzip >/dev/null; then + distributionUrl="${distributionUrl%.zip}.tar.gz" + distributionUrlName="${distributionUrl##*/}" +fi + +# verbose opt +__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR='' +[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v + +# normalize http auth +case "${MVNW_PASSWORD:+has-password}" in +'') MVNW_USERNAME='' MVNW_PASSWORD='' ;; +has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;; +esac + +if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then + verbose "Found wget ... using wget" + wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl" +elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then + verbose "Found curl ... using curl" + curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl" +elif set_java_home; then + verbose "Falling back to use Java to download" + javaSource="$TMP_DOWNLOAD_DIR/Downloader.java" + targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName" + cat >"$javaSource" <<-END + public class Downloader extends java.net.Authenticator + { + protected java.net.PasswordAuthentication getPasswordAuthentication() + { + return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() ); + } + public static void main( String[] args ) throws Exception + { + setDefault( new Downloader() ); + java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() ); + } + } + END + # For Cygwin/MinGW, switch paths to Windows format before running javac and java + verbose " - Compiling Downloader.java ..." + "$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java" + verbose " - Running Downloader.java ..." + "$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")" +fi + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +if [ -n "${distributionSha256Sum-}" ]; then + distributionSha256Result=false + if [ "$MVN_CMD" = mvnd.sh ]; then + echo "Checksum validation is not supported for maven-mvnd." >&2 + echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + elif command -v sha256sum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c - >/dev/null 2>&1; then + distributionSha256Result=true + fi + elif command -v shasum >/dev/null; then + if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then + distributionSha256Result=true + fi + else + echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2 + echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2 + exit 1 + fi + if [ $distributionSha256Result = false ]; then + echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2 + echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2 + exit 1 + fi +fi + +# unzip and move +if command -v unzip >/dev/null; then + unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip" +else + tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar" +fi + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +actualDistributionDir="" + +# First try the expected directory name (for regular distributions) +if [ -d "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" ]; then + if [ -f "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/bin/$MVN_CMD" ]; then + actualDistributionDir="$distributionUrlNameMain" + fi +fi + +# If not found, search for any directory with the Maven executable (for snapshots) +if [ -z "$actualDistributionDir" ]; then + # enable globbing to iterate over items + set +f + for dir in "$TMP_DOWNLOAD_DIR"/*; do + if [ -d "$dir" ]; then + if [ -f "$dir/bin/$MVN_CMD" ]; then + actualDistributionDir="$(basename "$dir")" + break + fi + fi + done + set -f +fi + +if [ -z "$actualDistributionDir" ]; then + verbose "Contents of $TMP_DOWNLOAD_DIR:" + verbose "$(ls -la "$TMP_DOWNLOAD_DIR")" + die "Could not find Maven distribution directory in extracted archive" +fi + +verbose "Found extracted Maven distribution directory: $actualDistributionDir" +printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$actualDistributionDir/mvnw.url" +mv -- "$TMP_DOWNLOAD_DIR/$actualDistributionDir" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME" + +clean || : +exec_maven "$@" diff --git a/example-module/mvnw.cmd b/example-module/mvnw.cmd new file mode 100644 index 00000000..92450f93 --- /dev/null +++ b/example-module/mvnw.cmd @@ -0,0 +1,189 @@ +<# : batch portion +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM http://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Apache Maven Wrapper startup batch script, version 3.3.4 +@REM +@REM Optional ENV vars +@REM MVNW_REPOURL - repo url base for downloading maven distribution +@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven +@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output +@REM ---------------------------------------------------------------------------- + +@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0) +@SET __MVNW_CMD__= +@SET __MVNW_ERROR__= +@SET __MVNW_PSMODULEP_SAVE=%PSModulePath% +@SET PSModulePath= +@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @( + IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B) +) +@SET PSModulePath=%__MVNW_PSMODULEP_SAVE% +@SET __MVNW_PSMODULEP_SAVE= +@SET __MVNW_ARG0_NAME__= +@SET MVNW_USERNAME= +@SET MVNW_PASSWORD= +@IF NOT "%__MVNW_CMD__%"=="" ("%__MVNW_CMD__%" %*) +@echo Cannot start maven from wrapper >&2 && exit /b 1 +@GOTO :EOF +: end batch / begin powershell #> + +$ErrorActionPreference = "Stop" +if ($env:MVNW_VERBOSE -eq "true") { + $VerbosePreference = "Continue" +} + +# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties +$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl +if (!$distributionUrl) { + Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties" +} + +switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) { + "maven-mvnd-*" { + $USE_MVND = $true + $distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip" + $MVN_CMD = "mvnd.cmd" + break + } + default { + $USE_MVND = $false + $MVN_CMD = $script -replace '^mvnw','mvn' + break + } +} + +# apply MVNW_REPOURL and calculate MAVEN_HOME +# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-,maven-mvnd--}/ +if ($env:MVNW_REPOURL) { + $MVNW_REPO_PATTERN = if ($USE_MVND -eq $False) { "/org/apache/maven/" } else { "/maven/mvnd/" } + $distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace "^.*$MVNW_REPO_PATTERN",'')" +} +$distributionUrlName = $distributionUrl -replace '^.*/','' +$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$','' + +$MAVEN_M2_PATH = "$HOME/.m2" +if ($env:MAVEN_USER_HOME) { + $MAVEN_M2_PATH = "$env:MAVEN_USER_HOME" +} + +if (-not (Test-Path -Path $MAVEN_M2_PATH)) { + New-Item -Path $MAVEN_M2_PATH -ItemType Directory | Out-Null +} + +$MAVEN_WRAPPER_DISTS = $null +if ((Get-Item $MAVEN_M2_PATH).Target[0] -eq $null) { + $MAVEN_WRAPPER_DISTS = "$MAVEN_M2_PATH/wrapper/dists" +} else { + $MAVEN_WRAPPER_DISTS = (Get-Item $MAVEN_M2_PATH).Target[0] + "/wrapper/dists" +} + +$MAVEN_HOME_PARENT = "$MAVEN_WRAPPER_DISTS/$distributionUrlNameMain" +$MAVEN_HOME_NAME = ([System.Security.Cryptography.SHA256]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join '' +$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME" + +if (Test-Path -Path "$MAVEN_HOME" -PathType Container) { + Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME" + Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" + exit $? +} + +if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) { + Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl" +} + +# prepare tmp dir +$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile +$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir" +$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null +trap { + if ($TMP_DOWNLOAD_DIR.Exists) { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } + } +} + +New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null + +# Download and Install Apache Maven +Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..." +Write-Verbose "Downloading from: $distributionUrl" +Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName" + +$webclient = New-Object System.Net.WebClient +if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) { + $webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD) +} +[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 +$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null + +# If specified, validate the SHA-256 sum of the Maven distribution zip file +$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum +if ($distributionSha256Sum) { + if ($USE_MVND) { + Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." + } + Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash + if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) { + Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property." + } +} + +# unzip and move +Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null + +# Find the actual extracted directory name (handles snapshots where filename != directory name) +$actualDistributionDir = "" + +# First try the expected directory name (for regular distributions) +$expectedPath = Join-Path "$TMP_DOWNLOAD_DIR" "$distributionUrlNameMain" +$expectedMvnPath = Join-Path "$expectedPath" "bin/$MVN_CMD" +if ((Test-Path -Path $expectedPath -PathType Container) -and (Test-Path -Path $expectedMvnPath -PathType Leaf)) { + $actualDistributionDir = $distributionUrlNameMain +} + +# If not found, search for any directory with the Maven executable (for snapshots) +if (!$actualDistributionDir) { + Get-ChildItem -Path "$TMP_DOWNLOAD_DIR" -Directory | ForEach-Object { + $testPath = Join-Path $_.FullName "bin/$MVN_CMD" + if (Test-Path -Path $testPath -PathType Leaf) { + $actualDistributionDir = $_.Name + } + } +} + +if (!$actualDistributionDir) { + Write-Error "Could not find Maven distribution directory in extracted archive" +} + +Write-Verbose "Found extracted Maven distribution directory: $actualDistributionDir" +Rename-Item -Path "$TMP_DOWNLOAD_DIR/$actualDistributionDir" -NewName $MAVEN_HOME_NAME | Out-Null +try { + Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null +} catch { + if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) { + Write-Error "fail to move MAVEN_HOME" + } +} finally { + try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null } + catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" } +} + +Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD" diff --git a/example-module/pom.xml b/example-module/pom.xml new file mode 100644 index 00000000..d5d5b048 --- /dev/null +++ b/example-module/pom.xml @@ -0,0 +1,180 @@ + + + + + 4.0.0 + org.mongodb + mongodb-hibernate-example + ${projectVersion} + mongodb-hibernate-example + https://www.mongodb.com/ + + + Apache License, Version 2.0 + https://www.apache.org/licenses/LICENSE-2.0 + + + + https://github.com/mongodb/mongo-hibernate + scm:git:https://github.com/mongodb/mongo-hibernate.git + scm:git:https://github.com/mongodb/mongo-hibernate.git + + + UTF-8 + ${project.build.sourceEncoding} + + + + + ch.qos.logback + logback-classic + 1.5.21 + + + org.mongodb + mongodb-hibernate + ${projectVersion} + + + jakarta.enterprise + jakarta.enterprise.cdi-api + 4.1.0 + + + org.junit + junit-bom + 6.0.1 + pom + import + + + org.assertj + assertj-core + 3.27.6 + test + + + + + + ch.qos.logback + logback-classic + + + org.mongodb + mongodb-hibernate + + + jakarta.enterprise + jakarta.enterprise.cdi-api + + + org.junit.jupiter + junit-jupiter + test + + + org.assertj + assertj-core + + + + ${project.basedir}/src/smokeTest/java + + + + maven-clean-plugin + 3.5.0 + + + maven-resources-plugin + 3.3.1 + + + maven-compiler-plugin + 3.14.1 + + ${javaVersion} + true + lines,vars,source + true + true + + -Werror + -Xlint:all + -Xlint:-requires-automatic + + + + + maven-surefire-plugin + 3.5.4 + + 1 + true + true + true + + + + + + + + + maven-failsafe-plugin + 3.5.4 + + + integration-test + + integration-test + verify + + + 1 + true + true + true + + **/*IntegrationTests.java + + + + + + + maven-jar-plugin + 3.4.2 + + + maven-install-plugin + 3.1.2 + + + + + + org.apache.maven.plugins + maven-failsafe-plugin + + + + diff --git a/example-module/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectly.java b/example-module/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectly.java new file mode 100644 index 00000000..31c1e2c1 --- /dev/null +++ b/example-module/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedDirectly.java @@ -0,0 +1,103 @@ +/* + * Copyright 2025-present MongoDB, Inc. + * + * Licensed 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. + */ + +package com.mongodb.hibernate.example; + +import com.mongodb.ServerAddress; +import com.mongodb.client.model.Aggregates; +import com.mongodb.client.model.Filters; +import com.mongodb.connection.ClusterConnectionMode; +import com.mongodb.hibernate.example.model.Item; +import com.mongodb.hibernate.service.spi.MongoConfigurationContributor; +import org.bson.BsonArray; +import org.bson.BsonDocument; +import org.bson.BsonString; +import org.bson.json.JsonMode; +import org.bson.json.JsonWriterSettings; +import org.bson.types.ObjectId; +import org.hibernate.SessionFactory; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.AvailableSettings; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public final class AppWithMongoConfiguratorContributorAddedDirectly { + private static final Logger LOGGER = LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME); + + private AppWithMongoConfiguratorContributorAddedDirectly() {} + + public static void main(String... args) { + try (var sessionFactory = new MetadataSources() + // add metadata sources, for example, by calling `addAnnotatedClasses` + // ... + .addAnnotatedClasses(Item.class) + .getMetadataBuilder(new StandardServiceRegistryBuilder() + .applySetting(AvailableSettings.DIALECT, "com.mongodb.hibernate.dialect.MongoDialect") + .applySetting(AvailableSettings.CONNECTION_PROVIDER, "com.mongodb.hibernate.jdbc.MongoConnectionProvider") + .applySetting(AvailableSettings.STATEMENT_BATCH_SIZE, 2) + .addService(MongoConfigurationContributor.class, configurator -> + configurator.applyToMongoClientSettings(mongoClientSettings -> mongoClientSettings + .applyToClusterSettings(clusterSettings -> clusterSettings + .hosts(List.of(new ServerAddress("localhost", 27017))) + .mode(ClusterConnectionMode.MULTIPLE)) + .build()) + .databaseName("example")) + .build()) + .build() + .buildSessionFactory()) { + // use `sessionFactory` + // ... + useSessionFactory(sessionFactory); + } + } + + static void useSessionFactory(SessionFactory sessionFactory) { + sessionFactory.inTransaction(session -> session.createMutationQuery("delete from Item").executeUpdate()); + LOGGER.info("Deleted using HQL all `{}`s", Item.class.getSimpleName()); + var ids = sessionFactory.fromTransaction(session -> { + var result = new ArrayList(); + var itemWithExplicitId = new Item(new ObjectId()) + .addToStructsList(new Item.MyStruct(Instant.now(), Set.of(4, 2))) + .addToStructsList(new Item.MyStruct(null, null)); + { + session.persist(itemWithExplicitId); + result.add(itemWithExplicitId.getId()); + } + var itemWithGeneratedId = new Item().setString("with auto-generated ID"); + { + session.persist(itemWithGeneratedId); + result.add(itemWithGeneratedId.getId()); + } + return result; + }); + LOGGER.info("Persisted using API `{}`s with identifiers {}", Item.class.getSimpleName(), ids); + sessionFactory.inTransaction(session -> { + var mql = new BsonDocument("aggregate", new BsonString(Item.COLLECTION_NAME)) + .append("pipeline", new BsonArray(List.of( + Aggregates.match(Filters.in("_id", ids)).toBsonDocument(), + Item.projectAll()))) + .toJson(JsonWriterSettings.builder().outputMode(JsonMode.EXTENDED).build()); + var items = session.createNativeQuery(mql, Item.class).getResultList(); + LOGGER.info("Found using MQL {}", items); + }); + } +} diff --git a/example-module/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributor.java b/example-module/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributor.java new file mode 100644 index 00000000..4327ec1c --- /dev/null +++ b/example-module/src/main/java/com/mongodb/hibernate/example/AppWithMongoConfiguratorContributorAddedViaServiceContributor.java @@ -0,0 +1,93 @@ +/* + * Copyright 2025-present MongoDB, Inc. + * + * Licensed 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. + */ + +package com.mongodb.hibernate.example; + +import com.mongodb.ServerAddress; +import com.mongodb.connection.ClusterConnectionMode; +import com.mongodb.hibernate.cfg.MongoConfigurator; +import com.mongodb.hibernate.example.model.Item; +import com.mongodb.hibernate.service.spi.MongoConfigurationContributor; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceInitiator; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.AvailableSettings; +import org.hibernate.service.spi.ServiceRegistryImplementor; + +import java.io.Serial; +import java.util.List; +import java.util.Map; + +import static com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedDirectly.useSessionFactory; + +public final class AppWithMongoConfiguratorContributorAddedViaServiceContributor { + private AppWithMongoConfiguratorContributorAddedViaServiceContributor() {} + + public static void main(String... args) { + try (var sessionFactory = new MetadataSources() + // add metadata sources, for example, by calling `addAnnotatedClasses` + // ... + .addAnnotatedClasses(Item.class) + .getMetadataBuilder(new StandardServiceRegistryBuilder() + .applySetting(AvailableSettings.DIALECT, "com.mongodb.hibernate.dialect.MongoDialect") + .applySetting(AvailableSettings.CONNECTION_PROVIDER, "com.mongodb.hibernate.jdbc.MongoConnectionProvider") + .applySetting(AvailableSettings.STATEMENT_BATCH_SIZE, 2) + .build()) + .build() + .buildSessionFactory()) { + // use `sessionFactory` + // ... + useSessionFactory(sessionFactory); + } + } + + public static final class MyMongoConfigurationContributor implements MongoConfigurationContributor { + @Serial + private static final long serialVersionUID = 1L; + + private MyMongoConfigurationContributor() {} + + @Override + public void configure(MongoConfigurator configurator) { + configurator.applyToMongoClientSettings(mongoClientSettings -> mongoClientSettings + .applyToClusterSettings(clusterSettings -> clusterSettings + .hosts(List.of(new ServerAddress("localhost", 27017))) + .mode(ClusterConnectionMode.MULTIPLE)) + .build()) + .databaseName("example"); + } + + public static final class ServiceContributor implements org.hibernate.service.spi.ServiceContributor { + public ServiceContributor() {} + + @Override + public void contribute(StandardServiceRegistryBuilder serviceRegistryBuilder) { + serviceRegistryBuilder.addInitiator(new StandardServiceInitiator() { + @Override + public Class getServiceInitiated() { + return MongoConfigurationContributor.class; + } + + @Override + public MongoConfigurationContributor initiateService( + Map configurationValues, ServiceRegistryImplementor serviceRegistry) { + return new MyMongoConfigurationContributor(); + } + }); + } + } + } +} diff --git a/example-module/src/main/java/com/mongodb/hibernate/example/model/Item.java b/example-module/src/main/java/com/mongodb/hibernate/example/model/Item.java new file mode 100644 index 00000000..403c3c45 --- /dev/null +++ b/example-module/src/main/java/com/mongodb/hibernate/example/model/Item.java @@ -0,0 +1,106 @@ +/* + * Copyright 2025-present MongoDB, Inc. + * + * Licensed 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. + */ + +package com.mongodb.hibernate.example.model; + +import com.mongodb.client.model.Aggregates; +import com.mongodb.client.model.Projections; +import com.mongodb.hibernate.annotations.ObjectIdGenerator; +import jakarta.persistence.Embeddable; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import org.bson.BsonDocument; +import org.bson.types.ObjectId; +import org.hibernate.annotations.Struct; + +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +import static com.mongodb.hibernate.example.model.Item.COLLECTION_NAME; +import static java.util.Collections.unmodifiableList; + +@Entity +@Table(name = COLLECTION_NAME) +public class Item { + public static final String COLLECTION_NAME = "items"; + + @Id + // specifying `@Column(name = "_id")` is not necessary, as it is implied + @ObjectIdGenerator + private final ObjectId id; + private String string; + private final List structsList; + + public Item() { + this(null, null, null); + } + + public Item(ObjectId id) { + this(id, null, null); + } + + private Item(ObjectId id, String string, List structsList) { + this.id = id; + this.string = string; + this.structsList = structsList == null ? new ArrayList<>() : structsList; + } + + public ObjectId getId() { + return id; + } + + public Item setString(String string) { + this.string = string; + return this; + } + + public String getString() { + return string; + } + + public Item addToStructsList(MyStruct struct) { + structsList.add(struct); + return this; + } + + public List getStructsList() { + return unmodifiableList(structsList); + } + + @Override + public String toString() { + return "Item{" + + "id=" + id + + ", string=" + string + + ", structsList=" + structsList + + '}'; + } + + public static BsonDocument projectAll() { + return Aggregates.project(Projections.include( + "_id", + "string", + "structsList")) + .toBsonDocument(); + } + + @Embeddable + @Struct(name = "MyStruct") + public record MyStruct(Instant instant, Set intsSet) {} +} diff --git a/example-module/src/main/java/module-info.java b/example-module/src/main/java/module-info.java new file mode 100644 index 00000000..ee4a0f8d --- /dev/null +++ b/example-module/src/main/java/module-info.java @@ -0,0 +1,33 @@ +/* + * Copyright 2025-present MongoDB, Inc. + * + * Licensed 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. + */ + +import com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedViaServiceContributor; +import org.hibernate.service.spi.ServiceContributor; + +module com.mongodb.hibernate.example { + requires org.slf4j; + requires jakarta.persistence; + requires transitive com.mongodb.hibernate; + requires org.mongodb.bson; + + provides ServiceContributor + with AppWithMongoConfiguratorContributorAddedViaServiceContributor.MyMongoConfigurationContributor.ServiceContributor; + + opens com.mongodb.hibernate.example.model + to org.hibernate.orm.core; + + exports com.mongodb.hibernate.example; +} diff --git a/example-module/src/main/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor b/example-module/src/main/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor new file mode 100644 index 00000000..33d6a55a --- /dev/null +++ b/example-module/src/main/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor @@ -0,0 +1 @@ +com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedViaServiceContributor$MyMongoConfigurationContributor$ServiceContributor diff --git a/example-module/src/main/resources/logback.xml b/example-module/src/main/resources/logback.xml new file mode 100644 index 00000000..c9057a4a --- /dev/null +++ b/example-module/src/main/resources/logback.xml @@ -0,0 +1,30 @@ + + + + + + + + + + %date{STRICT, Etc/UTC, en-US} [%thread] %level %logger{36} - %message%n + + + + + + diff --git a/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests.java b/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests.java new file mode 100644 index 00000000..505ac220 --- /dev/null +++ b/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests.java @@ -0,0 +1,27 @@ +/* + * Copyright 2025-present MongoDB, Inc. + * + * Licensed 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. + */ + +package com.mongodb.hibernate.example.test; + +import com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedDirectly; +import org.junit.jupiter.api.Test; + +class AppWithMongoConfiguratorContributorAddedDirectlyIntegrationTests { + @Test + void testMain() { + AppWithMongoConfiguratorContributorAddedDirectly.main(); + } +} diff --git a/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests.java b/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests.java new file mode 100644 index 00000000..c78a38af --- /dev/null +++ b/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests.java @@ -0,0 +1,27 @@ +/* + * Copyright 2025-present MongoDB, Inc. + * + * Licensed 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. + */ + +package com.mongodb.hibernate.example.test; + +import com.mongodb.hibernate.example.AppWithMongoConfiguratorContributorAddedViaServiceContributor; +import org.junit.jupiter.api.Test; + +class AppWithMongoConfiguratorContributorAddedViaServiceContributorIntegrationTests { + @Test + void testMain() { + AppWithMongoConfiguratorContributorAddedViaServiceContributor.main(); + } +} diff --git a/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/MongoAdditionalMappingContributorTests.java b/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/MongoAdditionalMappingContributorTests.java new file mode 100644 index 00000000..4dfc4a05 --- /dev/null +++ b/example-module/src/smokeTest/java/com/mongodb/hibernate/example/test/MongoAdditionalMappingContributorTests.java @@ -0,0 +1,59 @@ +/* + * Copyright 2025-present MongoDB, Inc. + * + * Licensed 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. + */ + +package com.mongodb.hibernate.example.test; + +import jakarta.persistence.Embeddable; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Table; +import org.hibernate.boot.MetadataSources; +import org.hibernate.boot.registry.StandardServiceRegistryBuilder; +import org.hibernate.cfg.AvailableSettings; +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +class MongoAdditionalMappingContributorTests { + @Test + void testContribute() { + assertThatThrownBy(() -> new MetadataSources() + .addAnnotatedClass(Item.class) + .buildMetadata(new StandardServiceRegistryBuilder() + .applySetting(AvailableSettings.DIALECT, "com.mongodb.hibernate.dialect.MongoDialect") + .applySetting(AvailableSettings.CONNECTION_PROVIDER, "com.mongodb.hibernate.jdbc.MongoConnectionProvider") + .applySetting(AvailableSettings.ALLOW_METADATA_ON_BOOT, false) + .applySetting(AvailableSettings.JAKARTA_JDBC_URL, "mongodb://host/db") + .build())) + .hasMessageContaining("does not support primary key spanning multiple columns"); + } + + @Entity + @Table(name = Item.COLLECTION_NAME) + static class Item { + static final String COLLECTION_NAME = "items"; + + @Id + MultipleColumns id; + + Item(MultipleColumns id) { + this.id = id; + } + + @Embeddable + record MultipleColumns(int a, int b) {} + } +} diff --git a/example-module/src/smokeTest/java/module-info.java b/example-module/src/smokeTest/java/module-info.java new file mode 100644 index 00000000..331f4109 --- /dev/null +++ b/example-module/src/smokeTest/java/module-info.java @@ -0,0 +1,22 @@ +/* + * Copyright 2025-present MongoDB, Inc. + * + * Licensed 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. + */ + +open module com.mongodb.hibernate.example.test { + requires com.mongodb.hibernate.example; + requires jakarta.persistence; + requires org.junit.jupiter.api; + requires org.assertj.core; +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 54fc15b6..9b2086a3 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -15,19 +15,19 @@ [versions] junit-jupiter = "5.13.4" assertj = "3.27.3" -google-errorprone-core = "2.36.0" +google-errorprone-core = "2.42.0" nullaway = "0.12.4" jspecify = "1.0.0" hibernate-orm = "6.6.34.Final" # Remember to update javadoc links mongo-java-driver-sync = "5.6.1" # Remember to update javadoc links findbugs-jsr = "3.0.2" -slf4j-api = "2.0.16" -logback-classic = "1.5.16" +slf4j-api = "2.0.17" +logback-classic = "1.5.21" mockito = "5.16.0" checker-qual = "3.49.1" plugin-spotless = "7.0.2" -plugin-errorprone = "4.1.0" +plugin-errorprone = "4.3.0" plugin-buildconfig = "5.5.4" plugin-palantir = "2.58.0" plugin-ktfmt = "0.54" diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 9bbc975c..f8e1ee31 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2a84e188..23449a2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.0.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index faf93008..adff685a 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,8 +210,7 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ - org.gradle.wrapper.GradleWrapperMain \ + -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" # Stop when "xargs" is not available. diff --git a/gradlew.bat b/gradlew.bat index 9d21a218..c4bdd3ab 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/integrationTest/java/com/mongodb/hibernate/query/AbstractQueryIntegrationTests.java b/src/integrationTest/java/com/mongodb/hibernate/query/AbstractQueryIntegrationTests.java index b8aa009e..f3001d37 100644 --- a/src/integrationTest/java/com/mongodb/hibernate/query/AbstractQueryIntegrationTests.java +++ b/src/integrationTest/java/com/mongodb/hibernate/query/AbstractQueryIntegrationTests.java @@ -26,7 +26,7 @@ import com.mongodb.client.MongoCollection; import com.mongodb.hibernate.TestCommandListener; -import com.mongodb.hibernate.dialect.MongoDialect; +import com.mongodb.hibernate.internal.dialect.TestMongoDialect; import com.mongodb.hibernate.junit.MongoExtension; import java.util.Set; import java.util.function.Consumer; @@ -251,7 +251,7 @@ private void assertAffectedCollections(Set expectedAffectedCollections) .containsExactlyInAnyOrderElementsOf(expectedAffectedCollections); } - protected static final class TranslateResultAwareDialect extends MongoDialect { + protected static final class TranslateResultAwareDialect extends TestMongoDialect { private AbstractJdbcOperationQuery capturedTranslateResult; public TranslateResultAwareDialect(DialectResolutionInfo info) { diff --git a/src/integrationTest/java/com/mongodb/hibernate/query/select/LimitOffsetFetchClauseIntegrationTests.java b/src/integrationTest/java/com/mongodb/hibernate/query/select/LimitOffsetFetchClauseIntegrationTests.java index 54bba000..a327e7bc 100644 --- a/src/integrationTest/java/com/mongodb/hibernate/query/select/LimitOffsetFetchClauseIntegrationTests.java +++ b/src/integrationTest/java/com/mongodb/hibernate/query/select/LimitOffsetFetchClauseIntegrationTests.java @@ -23,9 +23,9 @@ import static org.hibernate.cfg.AvailableSettings.QUERY_PLAN_CACHE_ENABLED; import static org.junit.jupiter.params.provider.EnumSource.Mode.EXCLUDE; -import com.mongodb.hibernate.dialect.MongoDialect; import com.mongodb.hibernate.internal.FeatureNotSupportedException; import com.mongodb.hibernate.internal.MongoConstants; +import com.mongodb.hibernate.internal.dialect.TestMongoDialect; import com.mongodb.hibernate.query.AbstractQueryIntegrationTests; import com.mongodb.hibernate.query.Book; import java.util.Arrays; @@ -625,7 +625,7 @@ private void setQueryOptionsAndQuery( * the query plan cache is hit, not whether {@link SqlAstTranslator} is reused afterwards (e.g., incompatible * {@link org.hibernate.query.spi.QueryOptions QueryOptions}s will end up with new translator bing created). */ - protected static final class TranslatingCacheTestingDialect extends MongoDialect { + protected static final class TranslatingCacheTestingDialect extends TestMongoDialect { private final AtomicInteger selectTranslatingCounter = new AtomicInteger(); public TranslatingCacheTestingDialect(DialectResolutionInfo info) { diff --git a/src/integrationTest/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor b/src/integrationTest/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor index 8dfbbf99..bb5fb375 100644 --- a/src/integrationTest/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor +++ b/src/integrationTest/resources/META-INF/services/org.hibernate.service.spi.ServiceContributor @@ -1 +1 @@ -com.mongodb.hibernate.TestServiceContributor \ No newline at end of file +com.mongodb.hibernate.TestServiceContributor diff --git a/src/integrationTest/resources/hibernate.properties b/src/integrationTest/resources/hibernate.properties index b59c4af4..63238a19 100644 --- a/src/integrationTest/resources/hibernate.properties +++ b/src/integrationTest/resources/hibernate.properties @@ -1,4 +1,4 @@ hibernate.dialect=com.mongodb.hibernate.dialect.MongoDialect hibernate.connection.provider_class=com.mongodb.hibernate.jdbc.MongoConnectionProvider jakarta.persistence.jdbc.url=mongodb://localhost/mongo-hibernate-test?directConnection=false -hibernate.query.plan_cache_enabled=false #make tests more isolated from each other \ No newline at end of file +hibernate.query.plan_cache_enabled=false #make tests more isolated from each other diff --git a/src/integrationTest/resources/logback-test.xml b/src/integrationTest/resources/logback-test.xml index 428be00c..9af82987 100644 --- a/src/integrationTest/resources/logback-test.xml +++ b/src/integrationTest/resources/logback-test.xml @@ -1,11 +1,32 @@ + + + + - - - - %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n - + + + + + %date{STRICT} [%thread] %level %logger{36} - %message%n + + + @@ -14,7 +35,4 @@ - - - - \ No newline at end of file + diff --git a/src/main/java/com/mongodb/hibernate/cfg/MongoConfigurator.java b/src/main/java/com/mongodb/hibernate/cfg/MongoConfigurator.java index ae5d67cc..1c225eaf 100644 --- a/src/main/java/com/mongodb/hibernate/cfg/MongoConfigurator.java +++ b/src/main/java/com/mongodb/hibernate/cfg/MongoConfigurator.java @@ -18,7 +18,7 @@ import com.mongodb.ConnectionString; import com.mongodb.MongoClientSettings; -import com.mongodb.hibernate.internal.Sealed; +import com.mongodb.hibernate.internal.cfg.MongoConfigurationBuilder; import com.mongodb.hibernate.service.spi.MongoConfigurationContributor; import java.util.Map; import java.util.function.Consumer; @@ -74,8 +74,7 @@ * * @see MongoConfigurationContributor */ -@Sealed -public interface MongoConfigurator { +public sealed interface MongoConfigurator permits MongoConfigurationBuilder { /** * Configures {@link MongoClientSettings}. * diff --git a/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java b/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java index 184b25b4..fcf1cb3a 100644 --- a/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java +++ b/src/main/java/com/mongodb/hibernate/dialect/MongoDialect.java @@ -20,8 +20,8 @@ import static java.lang.String.format; import com.mongodb.hibernate.internal.FeatureNotSupportedException; -import com.mongodb.hibernate.internal.Sealed; import com.mongodb.hibernate.internal.dialect.MongoAggregateSupport; +import com.mongodb.hibernate.internal.dialect.TestMongoDialect; import com.mongodb.hibernate.internal.dialect.function.array.MongoArrayConstructorFunction; import com.mongodb.hibernate.internal.dialect.function.array.MongoArrayContainsFunction; import com.mongodb.hibernate.internal.dialect.function.array.MongoArrayIncludesFunction; @@ -152,8 +152,7 @@ * href="https://docs.jboss.org/hibernate/orm/6.6/userguide/html_single/Hibernate_User_Guide.html#hql-exp-functions">HQL * functions see {@link #initializeFunctionRegistry(FunctionContributions)}. */ -@Sealed -public class MongoDialect extends Dialect { +public sealed class MongoDialect extends Dialect permits TestMongoDialect { private static final DatabaseVersion MINIMUM_VERSION = DatabaseVersion.make(7); public MongoDialect(DialectResolutionInfo info) { @@ -168,7 +167,7 @@ public MongoDialect(DialectResolutionInfo info) { * {@link MongoDialect#MongoDialect(DialectResolutionInfo)} fails. * @throws RuntimeException Always. */ - @Deprecated() + @Deprecated public MongoDialect() { throw new RuntimeException(format( "Could not instantiate [%s], see the earlier exceptions to find out why", diff --git a/src/main/java/com/mongodb/hibernate/internal/FeatureNotSupportedException.java b/src/main/java/com/mongodb/hibernate/internal/FeatureNotSupportedException.java index dc63e46a..c473da65 100644 --- a/src/main/java/com/mongodb/hibernate/internal/FeatureNotSupportedException.java +++ b/src/main/java/com/mongodb/hibernate/internal/FeatureNotSupportedException.java @@ -19,6 +19,8 @@ import java.io.Serial; import java.sql.SQLFeatureNotSupportedException; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class FeatureNotSupportedException extends RuntimeException { @Serial diff --git a/src/main/java/com/mongodb/hibernate/internal/MongoAssertions.java b/src/main/java/com/mongodb/hibernate/internal/MongoAssertions.java index e992043f..31d760fe 100644 --- a/src/main/java/com/mongodb/hibernate/internal/MongoAssertions.java +++ b/src/main/java/com/mongodb/hibernate/internal/MongoAssertions.java @@ -18,7 +18,11 @@ import org.jspecify.annotations.Nullable; -/** Util class for various assertion purposes. */ +/** + * Util class for various assertion purposes. + * + * @hidden + */ public final class MongoAssertions { private MongoAssertions() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/MongoChecks.java b/src/main/java/com/mongodb/hibernate/internal/MongoChecks.java index 8048a5d0..8b2697ee 100644 --- a/src/main/java/com/mongodb/hibernate/internal/MongoChecks.java +++ b/src/main/java/com/mongodb/hibernate/internal/MongoChecks.java @@ -20,7 +20,11 @@ import org.jspecify.annotations.Nullable; -/** Util class for checking, for example, argument values. */ +/** + * Util class for checking, for example, argument values. + * + * @hidden + */ public final class MongoChecks { private MongoChecks() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/MongoConstants.java b/src/main/java/com/mongodb/hibernate/internal/MongoConstants.java index 1e37e5e8..74393279 100644 --- a/src/main/java/com/mongodb/hibernate/internal/MongoConstants.java +++ b/src/main/java/com/mongodb/hibernate/internal/MongoConstants.java @@ -19,6 +19,8 @@ import org.bson.json.JsonMode; import org.bson.json.JsonWriterSettings; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoConstants { private MongoConstants() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/Sealed.java b/src/main/java/com/mongodb/hibernate/internal/Sealed.java deleted file mode 100644 index 3730442c..00000000 --- a/src/main/java/com/mongodb/hibernate/internal/Sealed.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright 2024-present MongoDB, Inc. - * - * Licensed 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. - */ - -package com.mongodb.hibernate.internal; - -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; - -/** - * Signifies that the annotated class or interface should be treated as sealed: it must not be extended or implemented - * by consumers of the library. Using such classes and interfaces is no different from using ordinary unannotated - * classes and interfaces. - */ -// TODO-HIBERNATE-52 The `permits` interface/class must be located in the same package as the `sealed` interface/class, -// unless they are in the same named module. Once we modularize, we should be able to use `sealed` instead of this -// annotation. -@Retention(RetentionPolicy.CLASS) -@Target(ElementType.TYPE) -@Documented -public @interface Sealed {} diff --git a/src/main/java/com/mongodb/hibernate/internal/VisibleForTesting.java b/src/main/java/com/mongodb/hibernate/internal/VisibleForTesting.java index 9a8610df..54a5e16e 100644 --- a/src/main/java/com/mongodb/hibernate/internal/VisibleForTesting.java +++ b/src/main/java/com/mongodb/hibernate/internal/VisibleForTesting.java @@ -26,6 +26,8 @@ * Denotes that the annotated program element is made more accessible than otherwise necessary for the purpose of * testing. The annotated program element must be used as if it had the {@linkplain #otherwise() intended} access * modifier for any purpose other than testing. + * + * @hidden */ @Documented @Retention(RetentionPolicy.SOURCE) @@ -33,6 +35,8 @@ public @interface VisibleForTesting { VisibleForTesting.AccessModifier otherwise(); + /** @hidden */ + @SuppressWarnings("MissingSummary") enum AccessModifier { PRIVATE, PACKAGE, diff --git a/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfiguration.java b/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfiguration.java index 6b4e3e1c..820be942 100644 --- a/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfiguration.java +++ b/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfiguration.java @@ -26,5 +26,6 @@ * @param mongoClientSettings {@link MongoConfigurator#applyToMongoClientSettings(Consumer)}. * @param databaseName {@link MongoConfigurator#databaseName(String)}. * @see MongoConfigurationBuilder#build() + * @hidden */ public record MongoConfiguration(MongoClientSettings mongoClientSettings, String databaseName) {} diff --git a/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfigurationBuilder.java b/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfigurationBuilder.java index 2982ac38..2e0aab82 100644 --- a/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfigurationBuilder.java +++ b/src/main/java/com/mongodb/hibernate/internal/cfg/MongoConfigurationBuilder.java @@ -33,6 +33,8 @@ import java.util.stream.Collectors; import org.jspecify.annotations.Nullable; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoConfigurationBuilder implements MongoConfigurator { private final MongoClientSettings.Builder mongoClientSettingsBuilder; private @Nullable String databaseName; diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/MongoAggregateSupport.java b/src/main/java/com/mongodb/hibernate/internal/dialect/MongoAggregateSupport.java index 53af28c8..5385c5f7 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/MongoAggregateSupport.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/MongoAggregateSupport.java @@ -25,6 +25,8 @@ import org.hibernate.mapping.AggregateColumn; import org.hibernate.mapping.Column; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoAggregateSupport extends AggregateSupportImpl { public static final MongoAggregateSupport INSTANCE = new MongoAggregateSupport(); public static final String UNSUPPORTED_MESSAGE_PREFIX = diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java b/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java new file mode 100644 index 00000000..e64b071b --- /dev/null +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/TestMongoDialect.java @@ -0,0 +1,28 @@ +/* + * Copyright 2024-present MongoDB, Inc. + * + * Licensed 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. + */ + +package com.mongodb.hibernate.internal.dialect; + +import com.mongodb.hibernate.dialect.MongoDialect; +import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo; + +/** @hidden */ +@SuppressWarnings("MissingSummary") +public abstract non-sealed class TestMongoDialect extends MongoDialect { + protected TestMongoDialect(DialectResolutionInfo info) { + super(info); + } +} diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayConstructorFunction.java b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayConstructorFunction.java index 5418a9bd..0e8b4d08 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayConstructorFunction.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayConstructorFunction.java @@ -34,6 +34,8 @@ * {@code array}, {@code array_list}. * *

Thread-safe. + * + * @hidden */ public final class MongoArrayConstructorFunction extends ArrayConstructorFunction { static final Set NAMES = Set.of("array", "array_list"); diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayContainsFunction.java b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayContainsFunction.java index a513a54f..6675edac 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayContainsFunction.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayContainsFunction.java @@ -56,6 +56,8 @@ *

See Query an Array. * *

Thread-safe. + * + * @hidden */ public final class MongoArrayContainsFunction extends AbstractArrayContainsFunction { public MongoArrayContainsFunction(boolean nullable, TypeConfiguration typeConfiguration) { diff --git a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayIncludesFunction.java b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayIncludesFunction.java index 4da26e54..f0fd407f 100644 --- a/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayIncludesFunction.java +++ b/src/main/java/com/mongodb/hibernate/internal/dialect/function/array/MongoArrayIncludesFunction.java @@ -49,6 +49,8 @@ *

See Query an Array. * *

Thread-safe. + * + * @hidden */ public final class MongoArrayIncludesFunction extends AbstractArrayIncludesFunction { public MongoArrayIncludesFunction(boolean nullable, TypeConfiguration typeConfiguration) { diff --git a/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java b/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java index 1d475b6b..62dd5588 100644 --- a/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java +++ b/src/main/java/com/mongodb/hibernate/internal/extension/MongoAdditionalMappingContributor.java @@ -50,6 +50,8 @@ import org.hibernate.type.BasicPluralType; import org.hibernate.type.ComponentType; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoAdditionalMappingContributor implements AdditionalMappingContributor { /** * We do not support these characters because BSON fields with names containing them must be handled specially as diff --git a/src/main/java/com/mongodb/hibernate/internal/extension/service/StandardServiceRegistryScopedState.java b/src/main/java/com/mongodb/hibernate/internal/extension/service/StandardServiceRegistryScopedState.java index 01d0adf0..57718fb8 100644 --- a/src/main/java/com/mongodb/hibernate/internal/extension/service/StandardServiceRegistryScopedState.java +++ b/src/main/java/com/mongodb/hibernate/internal/extension/service/StandardServiceRegistryScopedState.java @@ -40,6 +40,8 @@ import org.hibernate.service.spi.ServiceRegistryImplementor; import org.jspecify.annotations.Nullable; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class StandardServiceRegistryScopedState implements Service { @Serial private static final long serialVersionUID = 1L; @@ -61,6 +63,7 @@ private void writeObject(ObjectOutputStream out) throws IOException { "This class is not designed to be serialized despite it having to implement `Serializable`"); } + /** @hidden */ public static final class ServiceContributor implements org.hibernate.service.spi.ServiceContributor { public ServiceContributor() {} diff --git a/src/main/java/com/mongodb/hibernate/internal/id/objectid/ObjectIdGenerator.java b/src/main/java/com/mongodb/hibernate/internal/id/objectid/ObjectIdGenerator.java index f56d63e1..5f2266f6 100644 --- a/src/main/java/com/mongodb/hibernate/internal/id/objectid/ObjectIdGenerator.java +++ b/src/main/java/com/mongodb/hibernate/internal/id/objectid/ObjectIdGenerator.java @@ -32,6 +32,7 @@ * Tread-safe. * * @see com.mongodb.hibernate.annotations.ObjectIdGenerator + * @hidden */ public final class ObjectIdGenerator implements BeforeExecutionGenerator { @Serial diff --git a/src/main/java/com/mongodb/hibernate/internal/jdbc/MongoArray.java b/src/main/java/com/mongodb/hibernate/internal/jdbc/MongoArray.java index fc816f1a..b4985f71 100644 --- a/src/main/java/com/mongodb/hibernate/internal/jdbc/MongoArray.java +++ b/src/main/java/com/mongodb/hibernate/internal/jdbc/MongoArray.java @@ -16,6 +16,8 @@ package com.mongodb.hibernate.internal.jdbc; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoArray implements ArrayAdapter { private final Object contents; diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/AbstractMqlTranslator.java b/src/main/java/com/mongodb/hibernate/internal/translate/AbstractMqlTranslator.java index 6bfb898d..89472c0d 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/AbstractMqlTranslator.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/AbstractMqlTranslator.java @@ -201,6 +201,8 @@ import org.hibernate.type.BasicType; import org.jspecify.annotations.Nullable; +/** @hidden */ +@SuppressWarnings("MissingSummary") public abstract class AbstractMqlTranslator implements SqlAstTranslator { private final SessionFactoryImplementor sessionFactory; diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/AstVisitorValueDescriptor.java b/src/main/java/com/mongodb/hibernate/internal/translate/AstVisitorValueDescriptor.java index 557e0b32..e5199d28 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/AstVisitorValueDescriptor.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/AstVisitorValueDescriptor.java @@ -30,7 +30,8 @@ import java.util.Map; import org.hibernate.sql.ast.tree.expression.Expression; -@SuppressWarnings("UnusedTypeParameter") +/** @hidden */ +@SuppressWarnings({"MissingSummary", "UnusedTypeParameter"}) public final class AstVisitorValueDescriptor { static final AstVisitorValueDescriptor MODEL_MUTATION_RESULT = diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java b/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java index e596b89e..f82f9ac1 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/MongoTranslatorFactory.java @@ -26,6 +26,8 @@ import org.hibernate.sql.model.ast.TableMutation; import org.hibernate.sql.model.jdbc.JdbcMutationOperation; +/** @hidden */ +@SuppressWarnings("MissingSummary") public final class MongoTranslatorFactory implements SqlAstTranslatorFactory { @Override public SqlAstTranslator buildSelectTranslator( diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstArray.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstArray.java index 4f93c9a9..ee8440a9 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstArray.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstArray.java @@ -19,6 +19,8 @@ import java.util.Collection; import org.bson.BsonWriter; +/** @hidden */ +@SuppressWarnings("MissingSummary") public record AstArray(Collection elements) implements AstValue { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstDocument.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstDocument.java index e18acff3..eca0cd8f 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstDocument.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstDocument.java @@ -19,7 +19,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See Documents. */ +/** + * See Documents. + * + * @hidden + */ public record AstDocument(Collection elements) implements AstValue { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstElement.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstElement.java index 0def409a..5b40d01c 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstElement.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstElement.java @@ -18,7 +18,10 @@ import org.bson.BsonWriter; -/** @see AstDocument */ +/** + * @see AstDocument + * @hidden + */ @SuppressWarnings("MissingSummary") public record AstElement(String name, AstValue value) implements AstNode { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstFieldUpdate.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstFieldUpdate.java index 1957e36c..925e9011 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstFieldUpdate.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstFieldUpdate.java @@ -18,7 +18,10 @@ import org.bson.BsonWriter; -/** @see com.mongodb.hibernate.internal.translate.mongoast.command.AstUpdateCommand */ +/** + * @see com.mongodb.hibernate.internal.translate.mongoast.command.AstUpdateCommand + * @hidden + */ @SuppressWarnings("MissingSummary") public record AstFieldUpdate(String name, AstValue value) implements AstNode { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstLiteral.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstLiteral.java index 47781a41..fd4f46f2 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstLiteral.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstLiteral.java @@ -22,6 +22,8 @@ import org.bson.codecs.BsonValueCodec; import org.bson.codecs.EncoderContext; +/** @hidden */ +@SuppressWarnings("MissingSummary") public record AstLiteral(BsonValue literalValue) implements AstValue { private static final BsonValueCodec BSON_VALUE_CODEC = new BsonValueCodec(); diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstNode.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstNode.java index 01056839..30b023fe 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstNode.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstNode.java @@ -18,6 +18,8 @@ import org.bson.BsonWriter; +/** @hidden */ +@SuppressWarnings("MissingSummary") public interface AstNode { void render(BsonWriter writer); } diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstParameterMarker.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstParameterMarker.java index 0c420686..641f8743 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstParameterMarker.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstParameterMarker.java @@ -18,7 +18,10 @@ import org.bson.BsonWriter; -/** @see org.hibernate.cfg.AvailableSettings#DIALECT_NATIVE_PARAM_MARKERS */ +/** + * @see org.hibernate.cfg.AvailableSettings#DIALECT_NATIVE_PARAM_MARKERS + * @hidden + */ @SuppressWarnings("MissingSummary") public final class AstParameterMarker implements AstValue { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstValue.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstValue.java index dbd7aca9..9f266d52 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstValue.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/AstValue.java @@ -16,4 +16,6 @@ package com.mongodb.hibernate.internal.translate.mongoast; +/** @hidden */ +@SuppressWarnings("MissingSummary") public interface AstValue extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstCommand.java index 5cd524b0..9948252f 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstCommand.java @@ -18,5 +18,9 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; -/** See Database Commands. */ +/** + * See Database Commands. + * + * @hidden + */ public interface AstCommand extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstDeleteCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstDeleteCommand.java index 0770db17..a3fa7f2e 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstDeleteCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstDeleteCommand.java @@ -19,7 +19,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.filter.AstFilter; import org.bson.BsonWriter; -/** See {@code delete}. */ +/** + * See {@code delete}. + * + * @hidden + */ public record AstDeleteCommand(String collection, AstFilter filter) implements AstCommand { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstInsertCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstInsertCommand.java index 314bbbe7..2053e8b6 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstInsertCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstInsertCommand.java @@ -22,7 +22,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code insert}. */ +/** + * See {@code insert}. + * + * @hidden + */ public record AstInsertCommand(String collection, Collection documents) implements AstCommand { public AstInsertCommand { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstUpdateCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstUpdateCommand.java index 7ec882e1..3a3bf615 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstUpdateCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/AstUpdateCommand.java @@ -21,7 +21,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code update}. */ +/** + * See {@code update}. + * + * @hidden + */ @SuppressWarnings("InvalidParam") public record AstUpdateCommand(String collection, AstFilter filter, Collection updates) implements AstCommand { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstAggregateCommand.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstAggregateCommand.java index c4cebaac..8fd6b51c 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstAggregateCommand.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstAggregateCommand.java @@ -20,7 +20,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code aggregate}. */ +/** + * See {@code aggregate}. + * + * @hidden + */ public record AstAggregateCommand(String collection, Collection stages) implements AstCommand { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstLimitStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstLimitStage.java index 73f69eae..7f372892 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstLimitStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstLimitStage.java @@ -19,7 +19,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstValue; import org.bson.BsonWriter; -/** See {@code limit}. */ +/** + * See {@code limit}. + * + * @hidden + */ public record AstLimitStage(AstValue value) implements AstStage { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstMatchStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstMatchStage.java index 8a6ba461..f3c009ee 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstMatchStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstMatchStage.java @@ -19,7 +19,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.filter.AstFilter; import org.bson.BsonWriter; -/** See {@code $match}. */ +/** + * See {@code $match}. + * + * @hidden + */ public record AstMatchStage(AstFilter filter) implements AstStage { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStage.java index 8ca00b68..77c805f8 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStage.java @@ -21,7 +21,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code project}. */ +/** + * See {@code project}. + * + * @hidden + */ public record AstProjectStage(Collection specifications) implements AstStage { public AstProjectStage { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageIncludeSpecification.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageIncludeSpecification.java index b5acdcce..a10c881d 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageIncludeSpecification.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageIncludeSpecification.java @@ -18,6 +18,8 @@ import org.bson.BsonWriter; +/** @hidden */ +@SuppressWarnings("MissingSummary") public record AstProjectStageIncludeSpecification(String field) implements AstProjectStageSpecification { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageSpecification.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageSpecification.java index 4e2d80b8..8967eed0 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageSpecification.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstProjectStageSpecification.java @@ -18,6 +18,9 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; -/** @see AstProjectStage */ +/** + * @see AstProjectStage + * @hidden + */ @SuppressWarnings("MissingSummary") public interface AstProjectStageSpecification extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSkipStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSkipStage.java index 13381ebe..b2e6a6f6 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSkipStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSkipStage.java @@ -19,7 +19,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstValue; import org.bson.BsonWriter; -/** See {@code $skip}. */ +/** + * See {@code $skip}. + * + * @hidden + */ public record AstSkipStage(AstValue value) implements AstStage { @Override public void render(BsonWriter writer) { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortField.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortField.java index bc913461..ca78da65 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortField.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortField.java @@ -19,7 +19,10 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; import org.bson.BsonWriter; -/** @see AstSortStage */ +/** + * @see AstSortStage + * @hidden + */ @SuppressWarnings("MissingSummary") public record AstSortField(String path, AstSortOrder order) implements AstNode { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortOrder.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortOrder.java index eb18451f..6ba6cf0f 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortOrder.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortOrder.java @@ -19,7 +19,10 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; import org.bson.BsonWriter; -/** @see AstSortField */ +/** + * @see AstSortField + * @hidden + */ @SuppressWarnings("MissingSummary") public enum AstSortOrder implements AstNode { ASC(1), diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortStage.java index 51da3bc3..3b94e507 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstSortStage.java @@ -21,7 +21,11 @@ import java.util.Collection; import org.bson.BsonWriter; -/** See {@code $sort}. */ +/** + * See {@code $sort}. + * + * @hidden + */ public record AstSortStage(Collection sortFields) implements AstStage { public AstSortStage { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstStage.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstStage.java index b649214c..d684522b 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstStage.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/command/aggregate/AstStage.java @@ -20,5 +20,7 @@ /** * See Aggregation Stages. + * + * @hidden */ public interface AstStage extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstAllFilterOperation.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstAllFilterOperation.java index 757b7da4..c16bf1db 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstAllFilterOperation.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstAllFilterOperation.java @@ -23,8 +23,11 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstValue; import org.bson.BsonWriter; -/** See {@code $all}. */ -@SuppressWarnings("MissingSummary") +/** + * See {@code $all}. + * + * @hidden + */ public record AstAllFilterOperation(AstValue parameterMarkerOrArrayValue) implements AstFilterOperation { public AstAllFilterOperation { assertTrue(parameterMarkerOrArrayValue instanceof AstParameterMarker diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperation.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperation.java index cce5ac61..c2743f38 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperation.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperation.java @@ -22,6 +22,8 @@ /** * See Query and Projection * Operators. Query Selectors. Comparison. + * + * @hidden */ public record AstComparisonFilterOperation(AstComparisonFilterOperator operator, AstValue value) implements AstFilterOperation { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperator.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperator.java index 507aa64c..79e3fb9e 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperator.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstComparisonFilterOperator.java @@ -16,7 +16,10 @@ package com.mongodb.hibernate.internal.translate.mongoast.filter; -/** @see AstComparisonFilterOperation */ +/** + * @see AstComparisonFilterOperation + * @hidden + */ @SuppressWarnings("MissingSummary") public enum AstComparisonFilterOperator { /** See {@code $eq}. */ diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstEmptyFilter.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstEmptyFilter.java index c166a301..a869b389 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstEmptyFilter.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstEmptyFilter.java @@ -22,6 +22,8 @@ * Matches all documents. * *

{@link AstFieldOperationFilter} is used for specifying a concrete filter to match documents. + * + * @hidden */ public final class AstEmptyFilter implements AstFilter { public static final AstEmptyFilter INSTANCE = new AstEmptyFilter(); diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFieldOperationFilter.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFieldOperationFilter.java index cfa36cd9..b0eda5ca 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFieldOperationFilter.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFieldOperationFilter.java @@ -23,6 +23,7 @@ * Query Documents. * * @see AstEmptyFilter + * @hidden */ public record AstFieldOperationFilter(String fieldPath, AstFilterOperation filterOperation) implements AstFilter { @Override diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilter.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilter.java index d013100d..ca3ca01b 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilter.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilter.java @@ -18,4 +18,6 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; +/** @hidden */ +@SuppressWarnings("MissingSummary") public interface AstFilter extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilterOperation.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilterOperation.java index 60ca2409..f94f8060 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilterOperation.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstFilterOperation.java @@ -18,6 +18,9 @@ import com.mongodb.hibernate.internal.translate.mongoast.AstNode; -/** @see AstFieldOperationFilter */ +/** + * @see AstFieldOperationFilter + * @hidden + */ @SuppressWarnings("MissingSummary") interface AstFilterOperation extends AstNode {} diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilter.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilter.java index 48ed5cee..55d2186c 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilter.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilter.java @@ -24,6 +24,8 @@ /** * See Query and Projection Operators. * Query Selectors. Logical. + * + * @hidden */ public record AstLogicalFilter(AstLogicalFilterOperator operator, Collection filters) implements AstFilter { diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilterOperator.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilterOperator.java index 1dc7d94f..a8082e1a 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilterOperator.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstLogicalFilterOperator.java @@ -16,7 +16,10 @@ package com.mongodb.hibernate.internal.translate.mongoast.filter; -/** @see AstLogicalFilter */ +/** + * @see AstLogicalFilter + * @hidden + */ @SuppressWarnings("MissingSummary") public enum AstLogicalFilterOperator { /** See {@code $and}. */ diff --git a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstTypeFilterOperation.java b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstTypeFilterOperation.java index 7a6a7afd..30f00f04 100644 --- a/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstTypeFilterOperation.java +++ b/src/main/java/com/mongodb/hibernate/internal/translate/mongoast/filter/AstTypeFilterOperation.java @@ -22,7 +22,11 @@ import org.bson.BsonType; import org.bson.BsonWriter; -/** See {@code $type}. */ +/** + * See {@code $type}. + * + * @hidden + */ public record AstTypeFilterOperation(Collection types) implements AstFilterOperation { public AstTypeFilterOperation { assertFalse(types.isEmpty()); diff --git a/src/main/java/com/mongodb/hibernate/internal/type/MongoArrayJdbcType.java b/src/main/java/com/mongodb/hibernate/internal/type/MongoArrayJdbcType.java index 1f577645..3d68d056 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/MongoArrayJdbcType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/MongoArrayJdbcType.java @@ -32,7 +32,11 @@ import org.hibernate.type.spi.TypeConfiguration; import org.jspecify.annotations.Nullable; -/** Thread-safe. */ +/** + * Thread-safe. + * + * @hidden + */ public final class MongoArrayJdbcType extends ArrayJdbcType { @Serial private static final long serialVersionUID = 1L; @@ -58,6 +62,8 @@ public int getJdbcTypeCode() { return super.getArray(extractor, array, options); } + /** @hidden */ + @SuppressWarnings("MissingSummary") public static final class Constructor implements JdbcTypeConstructor { public static final Constructor INSTANCE = new Constructor(); diff --git a/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java b/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java index 2d383196..d4e5143a 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/MongoStructJdbcType.java @@ -55,7 +55,11 @@ import org.hibernate.type.descriptor.jdbc.StructJdbcType; import org.jspecify.annotations.Nullable; -/** Thread-safe. */ +/** + * Thread-safe. + * + * @hidden + */ public final class MongoStructJdbcType implements StructJdbcType { @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJavaType.java b/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJavaType.java index 9b693201..9cb5bf7c 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJavaType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJavaType.java @@ -29,7 +29,11 @@ import org.hibernate.type.descriptor.jdbc.JdbcTypeIndicators; import org.jspecify.annotations.Nullable; -/** Thread-safe. */ +/** + * Thread-safe. + * + * @hidden + */ public final class ObjectIdJavaType extends AbstractClassJavaType { @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJdbcType.java b/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJdbcType.java index 637fb1f2..688afa2a 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJdbcType.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/ObjectIdJdbcType.java @@ -34,7 +34,11 @@ import org.hibernate.type.descriptor.jdbc.JdbcType; import org.jspecify.annotations.Nullable; -/** Thread-safe. */ +/** + * Thread-safe. + * + * @hidden + */ public final class ObjectIdJdbcType implements JdbcType { @Serial private static final long serialVersionUID = 1L; diff --git a/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java b/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java index 9a22f04b..121dd66b 100644 --- a/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java +++ b/src/main/java/com/mongodb/hibernate/internal/type/ValueConversions.java @@ -53,6 +53,8 @@ * Provides conversion methods between {@link BsonValue}s, which our {@link PreparedStatement}/{@link ResultSet} * implementation uses under the hood and rarely exposes, and domain values we usually use when setting parameter values * on our {@link PreparedStatement}, or retrieving column values from a {@link ResultSet}. + * + * @hidden */ public final class ValueConversions { private ValueConversions() {} diff --git a/src/main/java/com/mongodb/hibernate/jdbc/MongoPreparedStatement.java b/src/main/java/com/mongodb/hibernate/jdbc/MongoPreparedStatement.java index b7e49ce9..317f9512 100644 --- a/src/main/java/com/mongodb/hibernate/jdbc/MongoPreparedStatement.java +++ b/src/main/java/com/mongodb/hibernate/jdbc/MongoPreparedStatement.java @@ -96,16 +96,16 @@ public void setNull(int parameterIndex, int sqlType) throws SQLException { checkClosed(); checkParameterIndex(parameterIndex); switch (sqlType) { - case Types.BLOB: - case Types.CLOB: - case Types.DATALINK: - case Types.NCHAR: - case Types.NCLOB: - case Types.NVARCHAR: - case Types.LONGNVARCHAR: - case Types.REF: - case Types.ROWID: - case Types.SQLXML: + case Types.BLOB, + Types.CLOB, + Types.DATALINK, + Types.NCHAR, + Types.NCLOB, + Types.NVARCHAR, + Types.LONGNVARCHAR, + Types.REF, + Types.ROWID, + Types.SQLXML -> throw new SQLFeatureNotSupportedException( "Unsupported SQL type: " + JDBCType.valueOf(sqlType).getName()); } diff --git a/src/main/java/com/mongodb/hibernate/jdbc/MongoStatement.java b/src/main/java/com/mongodb/hibernate/jdbc/MongoStatement.java index 754f6fdf..f282df9b 100644 --- a/src/main/java/com/mongodb/hibernate/jdbc/MongoStatement.java +++ b/src/main/java/com/mongodb/hibernate/jdbc/MongoStatement.java @@ -524,29 +524,28 @@ static void convertToWriteModels( throws SQLFeatureNotSupportedException, SQLSyntaxErrorException { try { switch (commandDescription) { - case INSERT: + case INSERT -> { checkCommandFields(command, commandDescription, SUPPORTED_INSERT_COMMAND_FIELDS); var documentsToInsert = command.getArray("documents"); for (var documentToInsert : documentsToInsert) { writeModels.add(createInsertModel(documentToInsert.asDocument())); } - break; - case UPDATE: + } + case UPDATE -> { checkCommandFields(command, commandDescription, SUPPORTED_UPDATE_COMMAND_FIELDS); var updateStatements = command.getArray("updates"); for (var updateStatement : updateStatements) { writeModels.add(createUpdateModel(updateStatement.asDocument(), commandDescription)); } - break; - case DELETE: + } + case DELETE -> { checkCommandFields(command, commandDescription, SUPPORTED_DELETE_COMMAND_FIELDS); var deleteStatements = command.getArray("deletes"); for (var deleteStatement : deleteStatements) { writeModels.add(createDeleteModel(deleteStatement.asDocument(), commandDescription)); } - break; - default: - throw fail(commandDescription.toString()); + } + default -> throw fail(commandDescription.toString()); } } catch (BSONException bsonException) { throw createSyntaxErrorException("%s: [%s]", command, bsonException); diff --git a/src/main/java/com/mongodb/hibernate/service/spi/MongoConfigurationContributor.java b/src/main/java/com/mongodb/hibernate/service/spi/MongoConfigurationContributor.java index 3d06a320..073ce0f4 100644 --- a/src/main/java/com/mongodb/hibernate/service/spi/MongoConfigurationContributor.java +++ b/src/main/java/com/mongodb/hibernate/service/spi/MongoConfigurationContributor.java @@ -28,7 +28,8 @@ * A {@link Service} an application may use for programmatically configuring the MongoDB Extension for Hibernate ORM. * *

This {@link Service} may be contributed either via a {@link ServiceContributor}, which allows access to - * {@link StandardServiceRegistryBuilder}, or via a {@link StandardServiceRegistryBuilder} directly, as shown below: + * {@link StandardServiceRegistryBuilder}, or via a {@link StandardServiceRegistryBuilder} directly, as shown below (if + * both approaches are used, the latter takes precedence): * *

{@code
  * MongoConfigurationContributor mongoConfigContributor = configurator -> {
diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java
new file mode 100644
index 00000000..a75ef6eb
--- /dev/null
+++ b/src/main/java/module-info.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright 2025-present MongoDB, Inc.
+ *
+ * Licensed 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.
+ */
+
+import com.mongodb.hibernate.internal.extension.MongoAdditionalMappingContributor;
+import com.mongodb.hibernate.internal.extension.service.StandardServiceRegistryScopedState;
+import org.hibernate.boot.spi.AdditionalMappingContributor;
+import org.hibernate.service.spi.ServiceContributor;
+
+/** The MongoDB Extension for Hibernate ORM module. */
+module com.mongodb.hibernate {
+    requires java.naming;
+    requires java.sql;
+    requires jakarta.persistence;
+    requires transitive org.hibernate.orm.core;
+    requires org.mongodb.bson;
+    requires transitive org.mongodb.driver.core;
+    requires org.mongodb.driver.sync.client;
+    requires org.jspecify;
+
+    provides ServiceContributor with
+            StandardServiceRegistryScopedState.ServiceContributor;
+    provides AdditionalMappingContributor with
+            MongoAdditionalMappingContributor;
+
+    opens com.mongodb.hibernate.dialect to
+            org.hibernate.orm.core;
+    opens com.mongodb.hibernate.jdbc to
+            org.hibernate.orm.core;
+    opens com.mongodb.hibernate.internal.id.objectid to
+            org.hibernate.orm.core;
+
+    exports com.mongodb.hibernate.service.spi;
+    exports com.mongodb.hibernate.cfg;
+    exports com.mongodb.hibernate.annotations;
+}
diff --git a/src/main/resources/META-INF/services/org.hibernate.boot.spi.AdditionalMappingContributor b/src/main/resources/META-INF/services/org.hibernate.boot.spi.AdditionalMappingContributor
index 842d5ddb..a6b49d35 100644
--- a/src/main/resources/META-INF/services/org.hibernate.boot.spi.AdditionalMappingContributor
+++ b/src/main/resources/META-INF/services/org.hibernate.boot.spi.AdditionalMappingContributor
@@ -1 +1 @@
-com.mongodb.hibernate.internal.extension.MongoAdditionalMappingContributor
\ No newline at end of file
+com.mongodb.hibernate.internal.extension.MongoAdditionalMappingContributor
diff --git a/src/test/resources/logback-test.xml b/src/test/resources/logback-test.xml
index 9719b07c..a6ad8b56 100644
--- a/src/test/resources/logback-test.xml
+++ b/src/test/resources/logback-test.xml
@@ -1,15 +1,33 @@
+
+
+
+
 
-    
-        
-            
-                %d{HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n
-            
+    
+    
+    
+        
+            %date{STRICT} [%thread] %level %logger{36} - %message%n
         
     
-    
-    
-    
     
         
     
-
\ No newline at end of file
+    
+    
+    
+