This is an automated email from the ASF dual-hosted git repository. jdaugherty pushed a commit to branch feat/addHibernate7ForgeFeature in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit 4d81ad43af50a74f46dfdeea94e7be3ee666532f Author: James Daugherty <[email protected]> AuthorDate: Thu Jul 9 10:50:54 2026 -0400 updating command switches, renaming Gorm => Grails Data, & renaming Hibernate => Hibernate5 --- .../src/en/guide/commandLine/creatingProject.adoc | 24 ++++---- .../commandLine/gradleBuild/gradlePlugins.adoc | 2 +- .../src/en/guide/commandLine/interactiveMode.adoc | 6 +- grails-doc/src/en/ref/Command Line/create-app.adoc | 10 ++-- .../src/en/ref/Command Line/create-plugin.adoc | 4 +- .../src/en/ref/Command Line/create-restapi.adoc | 2 +- .../src/en/ref/Command Line/create-web-plugin.adoc | 2 +- grails-doc/src/en/ref/Command Line/help.adoc | 6 +- .../java/org/grails/forge/api/GormImplDTO.java | 6 +- .../org/grails/forge/api/SelectOptionsDTO.java | 2 +- .../java/org/grails/forge/api/ServletImplDTO.java | 2 +- .../grails/forge/cli/command/CreateCommand.java | 2 +- .../forge/cli/command/GormImplConverter.java | 12 ++-- .../forge/cli/command/CreateAppCommandSpec.groovy | 67 +++++++++++++++++++++- .../java/org/grails/forge/analytics/Generated.java | 2 +- .../feature/database/GrailsDataHibernate5.java | 6 +- .../feature/database/GrailsDataHibernate7.java | 4 +- .../database/GrailsDataHibernateValidator.java | 2 +- .../forge/feature/database/GrailsDataMongoDB.java | 4 +- .../grails/forge/feature/database/GraphqlGorm.java | 4 +- .../java/org/grails/forge/feature/database/H2.java | 2 +- .../java/org/grails/forge/options/GormImpl.java | 32 ++++++++++- .../{GormImpl.java => GormImplTypeConverter.java} | 36 +++++------- .../database/GrailsDataHibernate7Spec.groovy | 2 +- .../org/grails/forge/options/GormImplSpec.groovy} | 42 +++++++------- 25 files changed, 182 insertions(+), 101 deletions(-) diff --git a/grails-doc/src/en/guide/commandLine/creatingProject.adoc b/grails-doc/src/en/guide/commandLine/creatingProject.adoc index 7bd657235b..87b058a304 100644 --- a/grails-doc/src/en/guide/commandLine/creatingProject.adoc +++ b/grails-doc/src/en/guide/commandLine/creatingProject.adoc @@ -51,7 +51,7 @@ After generating a project with Forge, switch to the created directory and use t [none] * -jdk, --java-version * -s, --servlet -* -g, --gorm +* -d, --data (-g, --gorm are legacy aliases) * -t, --test * -f, --features * -i, --inplace @@ -61,7 +61,7 @@ After generating a project with Forge, switch to the created directory and use t ./grails -t forge create-app \ --servlet=tomcat \ --jdk=11 \ - --gorm=hibernate \ + --data=hibernate5 \ --test=spock \ --features=github-workflow-java-ci \ com.example.demo @@ -73,7 +73,7 @@ After generating a project with Forge, switch to the created directory and use t [none] * -jdk, --java-version * -s, --servlet -* -g, --gorm +* -d, --data (-g, --gorm are legacy aliases) * -t, --test * -f, --features * -i, --inplace @@ -83,7 +83,7 @@ After generating a project with Forge, switch to the created directory and use t ./grails -t forge create-restapi \ --servlet=tomcat \ --jdk=11 \ - --gorm=hibernate \ + --data=hibernate5 \ --test=spock \ --features=github-workflow-java-ci \ com.example.demo @@ -95,7 +95,7 @@ After generating a project with Forge, switch to the created directory and use t [none] * -jdk, --java-version * -s, --servlet -* -g, --gorm +* -d, --data (-g, --gorm are legacy aliases) * -t, --test * -f, --features * -i, --inplace @@ -105,7 +105,7 @@ After generating a project with Forge, switch to the created directory and use t ./grails -t forge create-plugin \ --servlet=tomcat \ --jdk=11 \ - --gorm=hibernate \ + --data=hibernate5 \ --test=spock \ --features=github-workflow-java-ci \ com.example.demo @@ -117,7 +117,7 @@ After generating a project with Forge, switch to the created directory and use t [none] * -jdk, --java-version * -s, --servlet -* -g, --gorm +* -d, --data (-g, --gorm are legacy aliases) * -t, --test * -f, --features * -i, --inplace @@ -127,7 +127,7 @@ After generating a project with Forge, switch to the created directory and use t ./grails -t forge create-web-plugin \ --servlet=tomcat \ --jdk=11 \ - --gorm=hibernate \ + --data=hibernate5 \ --test=spock \ --features=github-workflow-java-ci \ com.example.demo @@ -136,7 +136,7 @@ After generating a project with Forge, switch to the created directory and use t === The `create-` command flags -The "create-*" commands are used to produce a fundamental Grails project, allowing for the inclusion of optional flags to select additional features, to customize GORM settings, an embedded servlet, the test framework, and the Java version. +The "create-*" commands are used to produce a fundamental Grails project, allowing for the inclusion of optional flags to select additional features, to customize Grails Data settings, an embedded servlet, the test framework, and the Java version. [cols="4,8,6a"] |=== @@ -158,12 +158,12 @@ The "create-*" commands are used to produce a fundamental Grails project, allowi --servlet=tomcat ---- -| -g, --gorm -| Which GORM Implementation to configure. Possible values: hibernate, hibernate7, mongodb. +| -d, --data (-g, --gorm are legacy aliases) +| Which Grails Data implementation to configure. Possible values: hibernate5, hibernate7, mongodb. The value hibernate is accepted as a legacy alias for hibernate5. | [source,shell] ---- ---gorm hibernate +--data hibernate5 ---- | -t, --test diff --git a/grails-doc/src/en/guide/commandLine/gradleBuild/gradlePlugins.adoc b/grails-doc/src/en/guide/commandLine/gradleBuild/gradlePlugins.adoc index 8ee5c8672f..4c55b7b081 100644 --- a/grails-doc/src/en/guide/commandLine/gradleBuild/gradlePlugins.adoc +++ b/grails-doc/src/en/guide/commandLine/gradleBuild/gradlePlugins.adoc @@ -20,7 +20,7 @@ under the License. The `create-app` command is available in both the Grails Shell CLI and the Forge CLI. - Use `grails create-app myapp` to generate a default project using the Grails Shell CLI. This is the most common usage. -- Use `grails -t forge create-app myapp` to access advanced application generation options such as `--jdk`, `--gorm`, and other Forge-only flags. +- Use `grails -t forge create-app myapp` to access advanced application generation options such as `--jdk`, `--data`, and other Forge-only flags. The example below assumes you are using the Forge CLI, which is solely intended for **application generation**. It does not support running, building, or managing a Grails application. diff --git a/grails-doc/src/en/guide/commandLine/interactiveMode.adoc b/grails-doc/src/en/guide/commandLine/interactiveMode.adoc index e111e0f25d..706fc91a96 100644 --- a/grails-doc/src/en/guide/commandLine/interactiveMode.adoc +++ b/grails-doc/src/en/guide/commandLine/interactiveMode.adoc @@ -75,9 +75,9 @@ Creates an application grails-console, views-markup, asset-pipeline-grails, views-json, gorm-neo4j, asciidoctor, grails-web-console, logbackGroovy, mongo-sync, shade, geb, properties - -g, --gorm=GORM Implementation - Which GORM Implementation to configure. Possible values: hibernate, - mongodb, neo4j. + -d, --data, -g, --gorm=Grails Data Implementation + Which Grails Data implementation to configure (-g, --gorm are legacy + aliases). Possible values: hibernate5, hibernate7, mongodb. -h, --help Show this help message and exit. -i, --inplace Create a service using the current directory --jdk, --java-version=<javaVersion> diff --git a/grails-doc/src/en/ref/Command Line/create-app.adoc b/grails-doc/src/en/ref/Command Line/create-app.adoc index a12deccbf3..8fec687d53 100644 --- a/grails-doc/src/en/ref/Command Line/create-app.adoc +++ b/grails-doc/src/en/ref/Command Line/create-app.adoc @@ -29,7 +29,7 @@ In Grails {grailsMajorVersion}, `create-app` is available in both the **Grails S - Most users should use the **Grails Shell CLI** by default (`grails create-app bookstore`). This version supports core development commands and project lifecycle management, and includes basic `create-*` flags like `--inplace`, `--features`, and `--profile`. -- The **Forge CLI** (`grails -t forge create-app bookstore`) is intended solely for **application generation** with extended configuration flags such as `--jdk`, `--gorm`, and `--servlet`. +- The **Forge CLI** (`grails -t forge create-app bookstore`) is intended solely for **application generation** with extended configuration flags such as `--jdk`, `--data`, and `--servlet`. Forge-specific flags will result in an error if used with the Shell CLI. ==== @@ -50,7 +50,7 @@ This uses the **Forge CLI** to generate an application with extended configurati ---- $ grails -t forge create-app bookstore \ --jdk=17 \ - --gorm=hibernate \ + --data=hibernate5 \ --servlet=tomcat \ --test=spock \ --features=asciidoctor,github-workflow-java-ci @@ -62,7 +62,7 @@ These options are available only when using `grails -t forge`: - `NAME`: The desired name for the application. - `-f, --features=FEATURE[,FEATURE...]`: Enable features like `gorm-hibernate5`, `postgres`, `asciidoctor`, `grails-gsp`, etc. -- `-g, --gorm=GORM Implementation`: Choose GORM implementation: `hibernate`, `mongodb`, `neo4j`. +- `-d, --data=Grails Data Implementation` (`-g`, `--gorm` are legacy aliases): Choose the Grails Data implementation: `hibernate5`, `hibernate7`, `mongodb`. - `--jdk=<javaVersion>`: Target JDK version (e.g., 11 or 17). - `-s, --servlet=Servlet Implementation`: Choose embedded servlet: `tomcat`, `jetty`, `undertow`, `none`. - `-t, --test=TEST`: Select test framework: `spock`, `junit`. @@ -83,7 +83,7 @@ Available flags: - `--features` _(limited support depending on profile)_ - `--profile` -Forge-only options such as `--jdk`, `--gorm`, or `--servlet` are **not supported** in the Shell CLI. +Forge-only options such as `--jdk`, `--data`, or `--servlet` are **not supported** in the Shell CLI. === Examples @@ -101,7 +101,7 @@ $ cd bookstore ---- $ grails -t forge create-app bookstore \ --jdk=17 \ - --gorm=hibernate \ + --data=hibernate5 \ --features=asciidoctor,grails-gsp ---- diff --git a/grails-doc/src/en/ref/Command Line/create-plugin.adoc b/grails-doc/src/en/ref/Command Line/create-plugin.adoc index ee9f88f044..d4561a6c4d 100644 --- a/grails-doc/src/en/ref/Command Line/create-plugin.adoc +++ b/grails-doc/src/en/ref/Command Line/create-plugin.adoc @@ -71,7 +71,7 @@ Options include specifying features, configuring the GORM implementation, select Here are the available options for the create-plugin command: - -f, --features=FEATURE[,FEATURE...]: Specifies the features to include in the plugin. Available options include h2, gorm-hibernate5, spring-boot-starter-jetty, micronaut-http-client, cache-ehcache, hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp, hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow, github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console, views-markup, views-json, gorm-neo4j, asciidoctor, grails-web-cons [...] -- -g, --gorm=GORM Implementation: Specifies the GORM Implementation to configure for the plugin. Possible values are hibernate, mongodb, neo4j. +- -d, --data=Grails Data Implementation (-g, --gorm are legacy aliases): Specifies the Grails Data implementation to configure for the plugin. Possible values are hibernate5, hibernate7, mongodb. - -h, --help: Displays the help message and exits. - -i, --inplace: Creates a service within the current directory. - --jdk=<javaVersion>: Specifies the JDK version the project should target. @@ -106,7 +106,7 @@ This command will create a Grails plugin project named "minimal-plugin" with the + [source,shell] ---- -grails create-plugin mongodb-plugin --gorm=mongodb +grails create-plugin mongodb-plugin --data=mongodb ---- + This command will generate a Grails plugin project named "mongodb-plugin" configured to use MongoDB as the GORM implementation. diff --git a/grails-doc/src/en/ref/Command Line/create-restapi.adoc b/grails-doc/src/en/ref/Command Line/create-restapi.adoc index 69c47c943c..ceef4c809c 100644 --- a/grails-doc/src/en/ref/Command Line/create-restapi.adoc +++ b/grails-doc/src/en/ref/Command Line/create-restapi.adoc @@ -42,7 +42,7 @@ The `create-restapi` command accepts the following options: - `-f, --features=FEATURE[,FEATURE...]`: Specifies the features to include. Available options include h2, scaffolding, gorm-hibernate5, spring-boot-starter-jetty, spring-boot-starter-tomcat, micronaut-http-client, cache-ehcache, hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp, hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow, github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console, views-markup, asset-pipeline-grails, v [...] -- `-g, --gorm=GORM Implementation`: Specifies the GORM Implementation to configure, with options like hibernate, mongodb, neo4j. +- `-d, --data=Grails Data Implementation` (`-g`, `--gorm` are legacy aliases): Specifies the Grails Data implementation to configure, with options hibernate5, hibernate7, mongodb. - `-h, --help`: Displays the help message and exits. diff --git a/grails-doc/src/en/ref/Command Line/create-web-plugin.adoc b/grails-doc/src/en/ref/Command Line/create-web-plugin.adoc index 02d3a48c91..51a72ec191 100644 --- a/grails-doc/src/en/ref/Command Line/create-web-plugin.adoc +++ b/grails-doc/src/en/ref/Command Line/create-web-plugin.adoc @@ -40,7 +40,7 @@ Here are the available options for the `create-web-plugin` command: - `-f, --features=FEATURE[,FEATURE...]`: Specifies the features to include in the plugin. Available options include h2, gorm-hibernate5, spring-boot-starter-jetty, micronaut-http-client, cache-ehcache, hibernate-validator, postgres, mysql, cache, database-migration, grails-gsp, hamcrest, gorm-mongodb, assertj, mockito, spring-boot-starter-undertow, github-workflow-java-ci, jrebel, testcontainers, sqlserver, grails-console, views-markup, views-json, gorm-neo4j, asciidoctor, grails-web-con [...] -- `-g, --gorm=GORM Implementation`: Specifies the GORM Implementation to configure for the plugin. Possible values are hibernate, mongodb, neo4j. +- `-d, --data=Grails Data Implementation` (`-g`, `--gorm` are legacy aliases): Specifies the Grails Data implementation to configure for the plugin. Possible values are hibernate5, hibernate7, mongodb. - `-h, --help`: Displays the help message and exits. diff --git a/grails-doc/src/en/ref/Command Line/help.adoc b/grails-doc/src/en/ref/Command Line/help.adoc index d4290d21ce..de78f61431 100644 --- a/grails-doc/src/en/ref/Command Line/help.adoc +++ b/grails-doc/src/en/ref/Command Line/help.adoc @@ -148,9 +148,9 @@ Creates an application grails-console, views-markup, asset-pipeline-grails, views-json, gorm-neo4j, asciidoctor, grails-web-console, logbackGroovy, mongo-sync, shade, geb, properties - -g, --gorm=GORM Implementation - Which GORM Implementation to configure. Possible values: hibernate, - mongodb, neo4j. + -d, --data, -g, --gorm=Grails Data Implementation + Which Grails Data implementation to configure (-g, --gorm are legacy + aliases). Possible values: hibernate5, hibernate7, mongodb. -h, --help Show this help message and exit. -i, --inplace Create a service using the current directory --jdk, --java-version=<javaVersion> diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GormImplDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GormImplDTO.java index af0e8a9a34..7cfd1c299c 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GormImplDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/GormImplDTO.java @@ -85,7 +85,7 @@ public class GormImplDTO extends Linkable implements Named, Described, Selectabl @NonNull @Override - @Schema(description = "A description of the GORM Implementation") + @Schema(description = "A description of the Grails Data implementation") public String getDescription() { return description; } @@ -98,13 +98,13 @@ public class GormImplDTO extends Linkable implements Named, Described, Selectabl } @Override - @Schema(description = "The value of the GORM Implementation for select options") + @Schema(description = "The value of the Grails Data implementation for select options") public GormImpl getValue() { return value; } @Override - @Schema(description = "The label of the GORM Implementation for select options") + @Schema(description = "The label of the Grails Data implementation for select options") public String getLabel() { return value.getLabel(); } diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java index f25ee04940..319a9dfd01 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/SelectOptionsDTO.java @@ -90,7 +90,7 @@ public class SelectOptionsDTO { return reloading; } - @Schema(description = "supported options for GORM Implementation") + @Schema(description = "supported options for the Grails Data implementation") public GormImplSelectOptions getGorm() { return gorm; } diff --git a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ServletImplDTO.java b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ServletImplDTO.java index f1c72e6c59..3af07892ef 100644 --- a/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ServletImplDTO.java +++ b/grails-forge/grails-forge-api/src/main/java/org/grails/forge/api/ServletImplDTO.java @@ -74,7 +74,7 @@ public class ServletImplDTO extends Linkable implements Named, Described, Select @NonNull @Override - @Schema(description = "A description of the GORM Implementation") + @Schema(description = "A description of the Servlet implementation") public String getDescription() { return description; } diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java index aa478ae674..a65722da2c 100644 --- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java +++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/CreateCommand.java @@ -50,7 +50,7 @@ public abstract class CreateCommand extends BaseCommand implements Callable<Inte DevelopmentReloading reloading; @ReflectiveAccess - @CommandLine.Option(names = {"-g", "--gorm"}, paramLabel = "GORM Implementation", description = "Which GORM Implementation to configure. Possible values: ${COMPLETION-CANDIDATES}.", completionCandidates = GormImplCandidates.class, converter = GormImplConverter.class) + @CommandLine.Option(names = {"-d", "--data", "-g", "--gorm"}, paramLabel = "Grails Data Implementation", description = "Which Grails Data implementation to configure (-g, --gorm are legacy aliases). Possible values: ${COMPLETION-CANDIDATES}.", completionCandidates = GormImplCandidates.class, converter = GormImplConverter.class) GormImpl gormImpl; @ReflectiveAccess diff --git a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplConverter.java b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplConverter.java index 5b802d3b38..7dbbcd48a7 100644 --- a/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplConverter.java +++ b/grails-forge/grails-forge-cli/src/main/java/org/grails/forge/cli/command/GormImplConverter.java @@ -29,13 +29,11 @@ public class GormImplConverter implements CommandLine.ITypeConverter<GormImpl> { public GormImpl convert(String value) throws Exception { if (value == null) { return GormImpl.DEFAULT_OPTION; - } else { - for (GormImpl impl : GormImpl.values()) { - if (value.equalsIgnoreCase(impl.toString())) { - return impl; - } - } } - throw new CommandLine.TypeConversionException("Invalid GORM implementation selection: " + value); + GormImpl impl = GormImpl.parse(value); + if (impl != null) { + return impl; + } + throw new CommandLine.TypeConversionException("Invalid Grails Data implementation selection: " + value); } } diff --git a/grails-forge/grails-forge-cli/src/test/groovy/org/grails/forge/cli/command/CreateAppCommandSpec.groovy b/grails-forge/grails-forge-cli/src/test/groovy/org/grails/forge/cli/command/CreateAppCommandSpec.groovy index 23f7adc642..7aceef2214 100644 --- a/grails-forge/grails-forge-cli/src/test/groovy/org/grails/forge/cli/command/CreateAppCommandSpec.groovy +++ b/grails-forge/grails-forge-cli/src/test/groovy/org/grails/forge/cli/command/CreateAppCommandSpec.groovy @@ -64,7 +64,72 @@ class CreateAppCommandSpec extends CommandSpec implements CommandFixture { then: noExceptionThrown() - baos.toString().contains("Invalid GORM implementation selection: xyz") + baos.toString().contains("Invalid Grails Data implementation selection: xyz") + } + + void "test creating a project with the data switch"() { + given: + ByteArrayOutputStream out = new ByteArrayOutputStream() + System.setOut(new PrintStream(out)) + + when: + PicocliRunner.run(CreateAppCommand, ctx, "dataswitch", "--data", "hibernate7") + + then: + noExceptionThrown() + out.toString().contains("Application created") + } + + void "test creating a project with the -d short alias"() { + given: + ByteArrayOutputStream out = new ByteArrayOutputStream() + System.setOut(new PrintStream(out)) + + when: + PicocliRunner.run(CreateAppCommand, ctx, "dshort", "-d", "hibernate7") + + then: + noExceptionThrown() + out.toString().contains("Application created") + } + + void "test creating a project with the legacy -g short alias"() { + given: + ByteArrayOutputStream out = new ByteArrayOutputStream() + System.setOut(new PrintStream(out)) + + when: + PicocliRunner.run(CreateAppCommand, ctx, "gshort", "-g", "hibernate5") + + then: + noExceptionThrown() + out.toString().contains("Application created") + } + + void "test creating a project with the legacy hibernate gorm value"() { + given: + ByteArrayOutputStream out = new ByteArrayOutputStream() + System.setOut(new PrintStream(out)) + + when: + PicocliRunner.run(CreateAppCommand, ctx, "legacygorm", "--gorm", "hibernate") + + then: + noExceptionThrown() + out.toString().contains("Application created") + } + + void "test creating a project with the hibernate5 gorm value"() { + given: + ByteArrayOutputStream out = new ByteArrayOutputStream() + System.setOut(new PrintStream(out)) + + when: + PicocliRunner.run(CreateAppCommand, ctx, "hib5gorm", "--gorm", "hibernate5") + + then: + noExceptionThrown() + out.toString().contains("Application created") } void "community and preview features are labelled as such"() { diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java index 408933655a..e37e2431f0 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/analytics/Generated.java @@ -47,7 +47,7 @@ public class Generated { @NonNull DevelopmentReloading reloading, @NonNull JdkVersion jdkVersion) { this.type = Objects.requireNonNull(type, "Type cannot be null"); - this.gorm = Objects.requireNonNull(gorm, "GORM cannot be null"); + this.gorm = Objects.requireNonNull(gorm, "Grails Data implementation cannot be null"); this.servlet = Objects.requireNonNull(servlet, "Embedded Servlet cannot be null"); this.reloading = Objects.requireNonNull(reloading, "Development reloading cannot be null"); this.jdkVersion = Objects.requireNonNull(jdkVersion, "JDK version cannot be null"); diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernate5.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernate5.java index 280fb3d9b8..9bc9d538a6 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernate5.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernate5.java @@ -55,12 +55,12 @@ public class GrailsDataHibernate5 extends GormFeature implements DatabaseDriverC @Override public String getTitle() { - return "GORM for Hibernate 5"; + return "Grails Data for Hibernate 5"; } @Override public String getDescription() { - return "Configure GORM for using Hibernate 5."; + return "Configure Grails Data for using Hibernate 5."; } @Override @@ -124,7 +124,7 @@ public class GrailsDataHibernate5 extends GormFeature implements DatabaseDriverC @Override public boolean shouldApply(ApplicationType applicationType, Options options, Set<Feature> selectedFeatures) { return selectedFeatures.stream().anyMatch(f -> f instanceof GrailsDataHibernate5) - || (options.getGormImpl() == GormImpl.HIBERNATE + || (options.getGormImpl() == GormImpl.HIBERNATE5 && selectedFeatures.stream().noneMatch(GrailsDataHibernate7.class::isInstance)); } } diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernate7.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernate7.java index 43f7c0a4b7..834a3b2cfa 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernate7.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernate7.java @@ -53,12 +53,12 @@ public class GrailsDataHibernate7 extends GormFeature implements DatabaseDriverC @Override public String getTitle() { - return "GORM for Hibernate 7"; + return "Grails Data for Hibernate 7"; } @Override public String getDescription() { - return "Configure GORM for using Hibernate 7."; + return "Configure Grails Data for using Hibernate 7."; } @Override diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernateValidator.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernateValidator.java index 912e163c49..f69ce47e0e 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernateValidator.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataHibernateValidator.java @@ -34,7 +34,7 @@ public class GrailsDataHibernateValidator implements FeatureValidator { public void validatePreProcessing(Options options, ApplicationType applicationType, Set<Feature> features) { if (features.stream().anyMatch(GrailsDataHibernate5.class::isInstance) && features.stream().anyMatch(GrailsDataHibernate7.class::isInstance)) { - throw new IllegalArgumentException("Only one GORM for Hibernate implementation can be selected: gorm-hibernate5 or gorm-hibernate7"); + throw new IllegalArgumentException("Only one Grails Data for Hibernate implementation can be selected: gorm-hibernate5 or gorm-hibernate7"); } } diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataMongoDB.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataMongoDB.java index 94df495e9f..254863aac7 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataMongoDB.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GrailsDataMongoDB.java @@ -47,12 +47,12 @@ public class GrailsDataMongoDB extends GormOneOfFeature { @Override public String getTitle() { - return "GORM for MongoDB"; + return "Grails Data for MongoDB"; } @Override public String getDescription() { - return "Configure GORM for using MongoDB."; + return "Configure Grails Data for using MongoDB."; } @Override diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GraphqlGorm.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GraphqlGorm.java index 1e06d0975f..81650a688f 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GraphqlGorm.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/GraphqlGorm.java @@ -52,12 +52,12 @@ public class GraphqlGorm implements Feature { @Override public String getTitle() { - return "GORM for GraphQL"; + return "Grails Data for GraphQL"; } @Override public String getDescription() { - return "Generates a GraphQL schema based on entities in GORM."; + return "Generates a GraphQL schema based on entities in Grails Data."; } @Override diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java index 19be11c6bd..5cf1b5ac16 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/feature/database/H2.java @@ -100,7 +100,7 @@ public class H2 extends DatabaseDriverFeature implements DefaultFeature { @Override public boolean shouldApply(ApplicationType applicationType, Options options, Set<Feature> selectedFeatures) { - return (options.getGormImpl() == GormImpl.HIBERNATE || options.getGormImpl() == GormImpl.HIBERNATE7) && + return (options.getGormImpl() == GormImpl.HIBERNATE5 || options.getGormImpl() == GormImpl.HIBERNATE7) && selectedFeatures.stream().noneMatch(f -> f instanceof DatabaseDriverFeature); } } diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java index 1c53118c8e..1f071e35d5 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java @@ -19,14 +19,19 @@ package org.grails.forge.options; import io.micronaut.core.annotation.NonNull; +import io.micronaut.core.annotation.Nullable; public enum GormImpl { - HIBERNATE("gorm-hibernate5", "Hibernate 5"), + HIBERNATE5("gorm-hibernate5", "Hibernate 5"), HIBERNATE7("gorm-hibernate7", "Hibernate 7"), MONGODB("gorm-mongodb", "MongoDB"); - public static final GormImpl DEFAULT_OPTION = HIBERNATE; + public static final GormImpl DEFAULT_OPTION = HIBERNATE5; + + // Selection value accepted before HIBERNATE5 replaced the HIBERNATE constant + private static final String LEGACY_HIBERNATE_VALUE = "hibernate"; + private final String featureName; private final String label; @@ -45,4 +50,27 @@ public enum GormImpl { return label; } + /** + * Resolves a user-supplied selection value to a {@link GormImpl}. + * + * @param value the selection value (case-insensitive), e.g. {@code hibernate5}; + * the legacy value {@code hibernate} resolves to {@link #HIBERNATE5} + * @return the matching implementation, or {@code null} when the value is unknown + */ + @Nullable + public static GormImpl parse(@Nullable String value) { + if (value == null) { + return null; + } + if (LEGACY_HIBERNATE_VALUE.equalsIgnoreCase(value)) { + return HIBERNATE5; + } + for (GormImpl impl : values()) { + if (value.equalsIgnoreCase(impl.name())) { + return impl; + } + } + return null; + } + } diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImplTypeConverter.java similarity index 58% copy from grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java copy to grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImplTypeConverter.java index 1c53118c8e..eb8624fe77 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java +++ b/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImplTypeConverter.java @@ -18,31 +18,21 @@ */ package org.grails.forge.options; -import io.micronaut.core.annotation.NonNull; +import java.util.Optional; -public enum GormImpl { +import io.micronaut.core.convert.ConversionContext; +import io.micronaut.core.convert.TypeConverter; +import jakarta.inject.Singleton; - HIBERNATE("gorm-hibernate5", "Hibernate 5"), - HIBERNATE7("gorm-hibernate7", "Hibernate 7"), - MONGODB("gorm-mongodb", "MongoDB"); - - public static final GormImpl DEFAULT_OPTION = HIBERNATE; - private final String featureName; - private final String label; - - GormImpl(String featureName, String label) { - this.featureName = featureName; - this.label = label; - } - - @NonNull - public String getName() { - return featureName; - } +/** + * Converts user-supplied selection values (including the legacy {@code hibernate} + * value) to {@link GormImpl} for HTTP parameter binding. + */ +@Singleton +public class GormImplTypeConverter implements TypeConverter<CharSequence, GormImpl> { - @NonNull - public String getLabel() { - return label; + @Override + public Optional<GormImpl> convert(CharSequence object, Class<GormImpl> targetType, ConversionContext context) { + return Optional.ofNullable(GormImpl.parse(object.toString())); } - } diff --git a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/GrailsDataHibernate7Spec.groovy b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/GrailsDataHibernate7Spec.groovy index c795b6e039..5c22075f5a 100644 --- a/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/GrailsDataHibernate7Spec.groovy +++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/feature/database/GrailsDataHibernate7Spec.groovy @@ -167,7 +167,7 @@ class GrailsDataHibernate7Spec extends ApplicationContextSpec implements Command then: IllegalArgumentException e = thrown() - e.message.contains('Only one GORM for Hibernate implementation can be selected') + e.message.contains('Only one Grails Data for Hibernate implementation can be selected') } void "test config"() { diff --git a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/GormImplSpec.groovy similarity index 53% copy from grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java copy to grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/GormImplSpec.groovy index 1c53118c8e..8334323918 100644 --- a/grails-forge/grails-forge-core/src/main/java/org/grails/forge/options/GormImpl.java +++ b/grails-forge/grails-forge-core/src/test/groovy/org/grails/forge/options/GormImplSpec.groovy @@ -16,33 +16,33 @@ * specific language governing permissions and limitations * under the License. */ -package org.grails.forge.options; -import io.micronaut.core.annotation.NonNull; +package org.grails.forge.options -public enum GormImpl { +import spock.lang.Specification +import spock.lang.Unroll - HIBERNATE("gorm-hibernate5", "Hibernate 5"), - HIBERNATE7("gorm-hibernate7", "Hibernate 7"), - MONGODB("gorm-mongodb", "MongoDB"); +class GormImplSpec extends Specification { - public static final GormImpl DEFAULT_OPTION = HIBERNATE; - private final String featureName; - private final String label; + @Unroll + void "parse resolves #value to #expected"() { + expect: + GormImpl.parse(value) == expected - GormImpl(String featureName, String label) { - this.featureName = featureName; - this.label = label; + where: + value | expected + 'hibernate5' | GormImpl.HIBERNATE5 + 'HIBERNATE5' | GormImpl.HIBERNATE5 + 'hibernate' | GormImpl.HIBERNATE5 + 'HIBERNATE' | GormImpl.HIBERNATE5 + 'hibernate7' | GormImpl.HIBERNATE7 + 'mongodb' | GormImpl.MONGODB + 'neo4j' | null + null | null } - @NonNull - public String getName() { - return featureName; + void "the default option is Hibernate 5"() { + expect: + GormImpl.DEFAULT_OPTION == GormImpl.HIBERNATE5 } - - @NonNull - public String getLabel() { - return label; - } - }
