This is an automated email from the ASF dual-hosted git repository. jamesfredley pushed a commit to branch spring-boot-4 in repository https://gitbox.apache.org/repos/asf/grails-core.git
commit fb217b99bac2bb9e2f987a44f0176f9508028c43 Merge: f1a881e9be cee6619f4a Author: James Fredley <[email protected]> AuthorDate: Fri Mar 20 15:33:20 2026 -0400 Merge remote-tracking branch 'origin/8.0.x' into spring-boot-4 # Conflicts: # dependencies.gradle # grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java # grails-data-mongodb/boot-plugin/src/test/groovy/org/grails/datastore/gorm/mongodb/boot/autoconfigure/MongoDbGormAutoConfigurationSpec.groovy # grails-data-mongodb/boot-plugin/src/test/groovy/org/grails/datastore/gorm/mongodb/boot/autoconfigure/MongoDbGormAutoConfigureWithGeoSpacialSpec.groovy .agents/skills/grails-developer/SKILL.md | 885 +++++++++++++++ .agents/skills/groovy-developer/SKILL.md | 521 +++++++++ .agents/skills/java-developer/SKILL.md | 286 +++++ .claude/skills/grails-developer/SKILL.md | 1 + .claude/skills/groovy-developer/SKILL.md | 1 + .claude/skills/java-developer/SKILL.md | 1 + .clinerules | 1 + .cursorrules | 1 + .github/workflows/codeql.yml | 4 +- .github/workflows/codestyle.yml | 69 +- .github/workflows/forge-deploy-next.yml | 12 +- .github/workflows/forge-deploy-prev-snapshot.yml | 12 +- .github/workflows/forge-deploy-prev.yml | 12 +- .github/workflows/forge-deploy-release.yml | 12 +- .github/workflows/forge-deploy-snapshot.yml | 12 +- .github/workflows/gradle.yml | 168 ++- .github/workflows/groovy-joint-workflow.yml | 21 +- .github/workflows/rat.yml | 8 +- .github/workflows/release-close.yml | 96 ++ .github/workflows/release-notes.yml | 10 +- .github/workflows/release-publish-docs.yml | 79 ++ .github/workflows/release.yml | 51 +- .idea/codeStyles/Project.xml | 6 + .mailmap | 933 ---------------- .sdkmanrc | 7 +- .windsurfrules | 1 + AGENTS.md | 268 +++++ CLAUDE.md | 1 + GEMINI.md | 1 + INSTALL | 4 + README.md | 2 +- RELEASE.md | 2 +- build-logic/docs-core/build.gradle | 8 +- .../gradle/tasks/bom/CoordinateHolder.groovy | 2 +- .../tasks/bom/CoordinateVersionHolder.groovy | 10 + .../tasks/bom/ExtractDependenciesTask.groovy | 24 +- .../gradle/tasks/bom/PropertyNameCalculator.groovy | 28 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- build-logic/plugins/build.gradle | 16 + .../buildsrc/GrailsCodeStyleExtension.groovy | 62 ++ .../grails/buildsrc/GrailsCodeStylePlugin.groovy | 190 ++++ .../grails/buildsrc/GrailsGroovydocPlugin.groovy | 54 + .../buildsrc/GrailsRepoSettingsPlugin.groovy | 113 ++ .../buildsrc/GroovydocEnhancerExtension.groovy | 108 ++ .../grails/buildsrc/GroovydocEnhancerPlugin.groovy | 180 +++ .../org/apache/grails/buildsrc/SbomPlugin.groovy | 8 + .../checkstyle/checkstyle-suppressions.xml | 0 .../checkstyle/checkstyle.xml | 0 .../codenarc/codenarc.groovy | 0 build-logic/settings.gradle | 19 +- build.gradle | 38 +- buildSrc/build.gradle | 2 +- buildSrc/settings.gradle | 73 +- dependencies.gradle | 43 +- etc/bin/Dockerfile | 3 +- etc/bin/test-reproducible-builds.sh | 5 + etc/bin/verify.sh | 49 +- gradle.properties | 8 +- gradle/code-style-config.gradle | 69 -- gradle/docs-dependencies.gradle | 58 +- gradle/functional-test-config.gradle | 1 + gradle/grails-data-tck-config.gradle | 4 +- gradle/grails-extension-gradle-config.gradle | 7 + gradle/publish-root-config.gradle | 3 + gradle/test-config.gradle | 23 +- gradle/wrapper/gradle-wrapper.properties | 4 +- grails-async/core/build.gradle | 2 +- grails-async/gpars/build.gradle | 2 +- grails-async/plugin/build.gradle | 2 +- grails-async/rxjava/build.gradle | 2 +- grails-async/rxjava2/build.gradle | 2 +- grails-async/rxjava3/build.gradle | 2 +- grails-bom/build.gradle | 58 +- grails-bootstrap/build.gradle | 2 +- .../codegen/model/AbstractMemberDefinition.groovy | 225 ++++ .../codegen/model/DomainFieldModifier.groovy | 391 +++++++ .../grails/codegen/model/FieldDefinition.groovy | 156 +++ .../grails/codegen/model/PropertyDefinition.groovy | 119 ++ .../codegen/model/DomainFieldModifierSpec.groovy | 502 +++++++++ .../codegen/model/FieldDefinitionSpec.groovy | 162 +++ .../codegen/model/PropertyDefinitionSpec.groovy | 364 ++++++ grails-cache/build.gradle | 2 +- grails-codecs-core/build.gradle | 2 +- grails-codecs/build.gradle | 2 +- grails-common/build.gradle | 2 +- grails-console/build.gradle | 3 +- .../GrailsApplicationContextCommandRunner.groovy | 34 +- .../ui/script/GrailsApplicationScriptRunner.groovy | 9 +- ...railsApplicationContextCommandRunnerSpec.groovy | 136 +++ .../GrailsApplicationScriptRunnerSpec.groovy | 54 + grails-controllers/build.gradle | 2 +- grails-converters/build.gradle | 2 +- .../src/main/groovy/grails/web/JSONBuilder.groovy | 2 +- grails-core/build.gradle | 2 +- .../main/groovy/grails/core/GrailsApplication.java | 6 +- .../grails/dev/commands/ApplicationCommand.groovy | 41 +- grails-core/src/main/groovy/grails/util/Mixin.java | 2 +- .../groovy/grails/util/MixinTargetAware.groovy | 2 +- .../grails/validation/ConstraintsEvaluator.java | 2 +- .../injection/ApplicationClassInjector.groovy | 46 +- .../injection/ArtefactTypeAstTransformation.java | 2 +- .../compiler/injection/MixinTransformation.java | 2 +- .../grails/boot/DevelopmentModeWatchSpec.groovy | 4 +- ...aceHolderConfigurerCorePluginRuntimeSpec.groovy | 2 + .../injection/ApplicationClassInjectorSpec.groovy | 100 ++ .../compiler/injection/GrailsASTUtilsTests.groovy | 9 +- .../injection/GrailsArtefactTransformerSpec.groovy | 6 +- .../config/NavigableMapSpringProfilesSpec.groovy | 2 + .../config/YamlPropertySourceLoaderSpec.groovy | 8 +- .../org/grails/plugins/GrailsPluginTests.groovy | 9 +- grails-core/src/test/resources/application.yml | 4 +- .../src/test/resources/foo-plugin-environments.yml | 4 +- grails-data-docs/stage/build.gradle | 10 +- .../grails-app/conf/application.yml | 8 +- .../groovy/myapp/BarIntegrationSpec.groovy | 3 +- .../groovy/myapp/FooIntegrationSpec.groovy | 3 +- grails-data-graphql/gradle.properties | 2 +- grails-data-graphql/settings.gradle | 2 +- grails-data-hibernate5/boot-plugin/build.gradle | 2 +- grails-data-hibernate5/core/build.gradle | 2 +- .../grails/orm/HibernateCriteriaBuilder.java | 27 + .../AbstractHibernateGormStaticApi.groovy | 2 +- .../grails/orm/hibernate/cfg/PropertyConfig.groovy | 5 +- .../query/AbstractHibernateCriteriaBuilder.java | 102 +- .../hibernate/query/AbstractHibernateQuery.java | 105 +- .../mapping/HibernateMappingBuilderTests.groovy | 13 +- .../gorm/tests/BasicCollectionInQuerySpec.groovy | 167 +++ .../gorm/tests/DetachedCriteriaJoinSpec.groovy | 124 ++- ...hedCriteriaProjectionNullAssociationSpec.groovy | 136 +++ .../grails/gorm/tests/WhereQueryBugFixSpec.groovy | 106 ++ .../WhereQueryOldIssueVerificationSpec.groovy | 371 +++++++ .../tests/compositeid/CompositeIdCriteria.groovy | 80 ++ .../MultiTenancyBidirectionalManyToManySpec.groovy | 2 + .../core/GrailsDataHibernate5TckManager.groovy | 91 +- .../orm/hibernate/ExistsCrossJoinSpec.groovy | 122 ++ .../DataServiceDatasourceInheritanceSpec.groovy | 239 ++++ .../DataServiceMultiDataSourceSpec.groovy | 460 ++++++++ ...ataServiceMultiTenantMultiDataSourceSpec.groovy | 287 +++++ .../MultipleDataSourceConnectionsSpec.groovy | 72 +- .../connections/SchemaMultiTenantSpec.groovy | 3 + .../hibernate/connections/SingleTenantSpec.groovy | 3 + .../WhereQueryMultiDataSourceSpec.groovy | 179 +++ grails-data-hibernate5/dbmigration/README.md | 26 +- grails-data-hibernate5/dbmigration/build.gradle | 20 +- grails-data-hibernate5/docs/build.gradle | 26 +- .../asciidoc/gettingStarted/outsideGrails.adoc | 2 +- .../multipleDataSources/dataSourceNamespaces.adoc | 2 + .../docs/asciidoc/multipleDataSources/index.adoc | 4 + .../docs/src/docs/asciidoc/services/index.adoc | 5 + .../asciidoc/services/multipleDataSources.adoc | 262 +++++ grails-data-hibernate5/grails-plugin/build.gradle | 3 +- .../GrailsOpenSessionInViewInterceptor.java | 137 ++- .../support/MultiDataSourceSessionSpec.groovy | 193 ++++ grails-data-mongodb/boot-plugin/build.gradle | 2 +- .../MongoDbGormAutoConfigurationSpec.groovy | 1 + ...ngoDbGormAutoConfigureWithGeoSpacialSpec.groovy | 1 + .../src/test/resources/docker-java.properties | 2 + grails-data-mongodb/bson/build.gradle | 2 +- grails-data-mongodb/core/build.gradle | 2 +- .../main/groovy/grails/mongodb/MongoEntity.groovy | 2 +- .../mongodb/api/MongoInstanceOperations.groovy | 5 +- .../datastore/gorm/mongo/api/MongoStaticApi.groovy | 2 +- .../MongoDbDataStoreSpringInitializerSpec.groovy | 24 +- .../mongo/core/GrailsDataMongoTckManager.groovy | 81 ++ .../connections/MongoConnectionSourcesSpec.groovy | 7 + .../gorm/mongo/connections/MultiTenancySpec.groovy | 5 +- .../connections/SchemaBasedMultiTenancySpec.groovy | 5 +- .../mongo/connections/SingleTenancySpec.groovy | 5 +- .../MongoStaticApiMultiTenancySpec.groovy | 5 +- grails-data-mongodb/docs/build.gradle | 26 +- grails-data-mongodb/ext/build.gradle | 2 +- grails-data-mongodb/grails-plugin/build.gradle | 2 +- grails-data-mongodb/gson-templates/build.gradle | 2 +- .../Neo4jAutoConfigurationSpec.groovy | 2 + grails-data-neo4j/docs/build.gradle | 17 + .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/javascripts/application.js | 2 +- grails-data-neo4j/gradle.properties | 2 +- .../tests/multitenancy/MultiTenancySpec.groovy | 4 + .../tests/multitenancy/SingleTenancySpec.groovy | 2 + grails-data-neo4j/settings.gradle | 4 +- grails-data-simple/build.gradle | 2 +- grails-databinding-core/build.gradle | 2 +- grails-databinding/build.gradle | 2 +- grails-datamapping-async/build.gradle | 2 +- .../database/DatabasePerTenantSpec.groovy | 3 +- .../MultiTenantServiceTransformSpec.groovy | 2 + .../partitioned/PartitionMultiTenancySpec.groovy | 3 +- .../multitenancy/schema/SchemaPerTenantSpec.groovy | 6 +- .../gorm/tests/CurrentTenantTransformSpec.groovy | 6 +- .../gorm/tests/DeepValidateWithSaveSpec.groovy | 46 +- .../gorm/tests/MultipleDataSourceSpec.groovy | 67 +- .../grails/gorm/tests/TenantServiceSpec.groovy | 7 +- .../grails/gorm/tests/WhereMethodSpec.groovy | 151 +++ .../gorm/SaveWithFailOnErrorDefaultSpec.groovy | 50 +- grails-datamapping-core/build.gradle | 3 +- .../groovy/grails/gorm/DetachedCriteria.groovy | 22 +- .../org/grails/datastore/gorm/GormEnhancer.groovy | 30 +- .../org/grails/datastore/gorm/GormEntity.groovy | 4 +- .../datastore/gorm/finders/CountByFinder.java | 1 + .../datastore/gorm/jdbc/DataSourceBuilder.java | 64 +- .../jdbc/connections/DataSourceSettings.groovy | 2 +- .../datastore/gorm/query/NamedCriteriaProxy.groovy | 2 +- .../gorm/query/NamedQueriesBuilder.groovy | 2 + .../query/criteria/AbstractDetachedCriteria.groovy | 4 + .../transform/DetachedCriteriaTransformer.java | 99 +- ...stractDetachedCriteriaServiceImplementor.groovy | 13 +- .../implementers/AbstractSaveImplementer.groovy | 6 +- .../implementers/AbstractWhereImplementer.groovy | 8 +- .../services/implementers/DeleteImplementer.groovy | 11 +- .../implementers/FindAndDeleteImplementer.groovy | 32 +- .../services/implementers/SaveImplementer.groovy | 19 +- .../implementers/UpdateOneImplementer.groovy | 2 +- .../transform/ServiceTransformation.groovy | 187 +++- .../CompileStaticServiceInjectionSpec.groovy | 356 ++++++ .../ConnectionRoutingServiceTransformSpec.groovy | 596 ++++++++++ .../services/WhereConnectionRoutingSpec.groovy | 211 ++++ .../gorm/GormEnhancerAllQualifiersSpec.groovy | 236 ++++ .../gorm/jdbc/DataSourceBuilderSpec.groovy | 927 ++++++++++++++++ .../criteria/DetachedCriteriaCloneSpec.groovy | 123 ++ grails-datamapping-rx/build.gradle | 2 +- grails-datamapping-support/build.gradle | 2 +- grails-datamapping-tck/build.gradle | 2 +- .../testing/tck/base/GrailsDataTckManager.groovy | 32 + .../tck/domains/DataServiceRoutingMetric.groovy | 42 + .../domains/DataServiceRoutingMetricService.groovy | 39 + .../tck/domains/DataServiceRoutingProduct.groovy | 40 + .../DataServiceRoutingProductDataService.groovy | 41 + .../DataServiceRoutingProductService.groovy | 43 + .../testing/tck/domains/WhereRoutingItem.groovy | 43 + .../tck/domains/WhereRoutingItemService.groovy | 37 + .../tck/tests/CrossLayerMultiDataSourceSpec.groovy | 148 +++ ...CrossLayerMultiTenantMultiDataSourceSpec.groovy | 132 +++ .../tests/DataServiceConnectionRoutingSpec.groovy | 288 +++++ ...aServiceMultiTenantConnectionRoutingSpec.groovy | 153 +++ .../tck/tests/DomainMultiDataSourceSpec.groovy | 180 +++ .../DomainMultiTenantMultiDataSourceSpec.groovy | 168 +++ .../tests/WhereQueryConnectionRoutingSpec.groovy | 136 +++ grails-datamapping-validation/build.gradle | 2 +- .../grails/gorm/validation/Constrained.groovy | 10 +- .../validation/DefaultConstrainedProperty.groovy | 51 +- .../grails/gorm/validation/DisplayType.groovy | 81 ++ .../grails/gorm/validation/DisplayTypeSpec.groovy | 151 +++ grails-datasource/build.gradle | 2 +- grails-datastore-async/build.gradle | 2 +- grails-datastore-core/build.gradle | 2 +- ...atastoreServiceMethodInvokingFactoryBean.groovy | 102 +- .../grails/datastore/mapping/config/Entity.groovy | 8 +- .../datastore/mapping/core/AbstractSession.java | 2 +- .../dirty/checking/DirtyCheckingSupport.groovy | 2 +- .../mapping/query/jpa/JpaQueryBuilder.java | 53 + ...toreServiceMethodInvokingFactoryBeanSpec.groovy | 174 +++ grails-datastore-web/build.gradle | 2 +- grails-doc/build.gradle | 14 +- grails-doc/src/en/guide/GORM/quickStartGuide.adoc | 4 +- .../en/guide/GORM/quickStartGuide/basicCRUD.adoc | 16 +- grails-doc/src/en/guide/REST/domainResources.adoc | 15 + grails-doc/src/en/guide/REST/hypermedia/hal.adoc | 13 + .../src/en/guide/REST/versioningResources.adoc | 13 + .../{contributing.adoc => bestPractices.adoc} | 2 +- .../en/guide/bestPractices/codeAnalysisGroovy.adoc | 159 +++ .../guide/cache/cacheUsage/cacheConfiguration.adoc | 2 +- grails-doc/src/en/guide/commandLine.adoc | 2 +- .../guide/commandLine/creatingCustomCommands.adoc | 2 +- .../dataSource/automaticDatabaseMigration.adoc | 15 +- .../guide/conf/dataSource/multipleDatasources.adoc | 302 ++++- grails-doc/src/en/guide/conf/docengine.adoc | 23 +- grails-doc/src/en/guide/conf/environments.adoc | 33 +- grails-doc/src/en/guide/contributing.adoc | 2 +- grails-doc/src/en/guide/index.adoc | 6 +- .../guide/plugins/artefactApi/customArtefacts.adoc | 2 +- .../src/en/guide/profiles/pluginProfile.adoc | 2 +- .../src/en/guide/profiles/profileProfile.adoc | 2 +- .../en/guide/profiles/restAPIPluginProfile.adoc | 2 +- .../src/en/guide/profiles/restAPIProfile.adoc | 2 +- .../src/en/guide/profiles/webPluginProfile.adoc | 2 +- grails-doc/src/en/guide/profiles/webProfile.adoc | 2 +- grails-doc/src/en/guide/reference.adoc | 4 +- grails-doc/src/en/guide/security/codecs.adoc | 10 + .../src/en/guide/security/xssPrevention.adoc | 34 + .../transactionsMultiDataSource.adoc | 4 + .../spring/propertyPlaceholderConfiguration.adoc | 9 + .../src/en/guide/testing/integrationTesting.adoc | 179 +++ .../en/guide/theWebLayer/contentNegotiation.adoc | 42 + .../guide/theWebLayer/controllers/dataBinding.adoc | 56 +- .../gsp/GSPBasics/variablesAndScopes.adoc | 8 +- .../gsp/taglibs/taglibVariablesAndScopes.adoc | 8 +- .../interceptors/interceptorOrdering.adoc | 9 + .../urlmappings/customizingUrlFormat.adoc | 11 + grails-doc/src/en/guide/toc.yml | 3 + .../src/en/guide/upgrading/upgrading60x.adoc | 124 ++- grails-doc/src/en/ref/Constraints.adoc | 51 +- grails-doc/src/en/ref/Constraints/nullable.adoc | 14 + grails-doc/src/en/ref/Controllers/withFormat.adoc | 16 + .../src/en/ref/Database Mapping/insertable.adoc | 4 +- .../{updateable.adoc => updatable.adoc} | 10 +- grails-doc/src/en/ref/Domain Classes/save.adoc | 14 + grails-doc/src/en/ref/Plug-ins/dataSource.adoc | 13 + .../src/en/ref/Servlet API/servletContext.adoc | 2 +- .../src/en/ref/Tag Libraries/actionName.adoc | 13 +- .../src/en/ref/Tag Libraries/controllerName.adoc | 14 +- grails-doc/src/en/ref/Tag Libraries/flash.adoc | 11 +- grails-doc/src/en/ref/Tag Libraries/pageScope.adoc | 5 +- grails-doc/src/en/ref/Tag Libraries/params.adoc | 26 +- grails-doc/src/en/ref/Tag Libraries/request.adoc | 16 +- grails-doc/src/en/ref/Tag Libraries/response.adoc | 13 +- .../src/en/ref/Tag Libraries/servletContext.adoc | 20 +- grails-doc/src/en/ref/Tag Libraries/session.adoc | 27 +- grails-domain-class/build.gradle | 2 +- .../GrailsDomainClassAutoConfiguration.groovy | 1 + .../domain/support/ConstraintEvaluatorAdapter.java | 1 + .../grails/persistence/DomainClassTraitSpec.groovy | 6 + grails-encoder/build.gradle | 2 +- grails-events/compat/build.gradle | 2 +- .../src/main/groovy/grails/artefact/Service.groovy | 2 +- .../src/main/groovy/grails/events/Events.groovy | 2 +- .../compat/src/main/groovy/reactor/bus/Bus.java | 2 +- .../compat/src/main/groovy/reactor/bus/Event.java | 2 +- .../src/main/groovy/reactor/bus/EventBus.groovy | 2 +- .../reactor/bus/registry/Registration.groovy | 2 +- .../reactor/bus/registry/Subscription.groovy | 2 +- .../main/groovy/reactor/bus/selector/Selector.java | 2 +- .../src/main/groovy/reactor/fn/Consumer.java | 2 +- .../spring/context/annotation/Consumer.groovy | 1 + .../spring/context/annotation/Selector.groovy | 1 + grails-events/core/build.gradle | 2 +- grails-events/gpars/build.gradle | 2 +- grails-events/plugin/build.gradle | 2 +- grails-events/rxjava/build.gradle | 2 +- grails-events/rxjava2/build.gradle | 2 +- grails-events/rxjava3/build.gradle | 2 +- grails-events/spring/build.gradle | 2 +- grails-events/transforms/build.gradle | 2 +- grails-fields/build.gradle | 2 +- .../plugin/formfields/FormFieldsTagLib.groovy | 33 +- .../plugin/formfields/BeanPropertyAccessor.groovy | 2 +- .../formfields/BeanPropertyAccessorImpl.groovy | 2 + .../DelegatingBeanPropertyAccessorImpl.groovy | 2 +- .../plugin/formfields/PropertyPathAccessor.groovy | 1 + .../scaffolding/model/DomainModelService.groovy | 1 + .../model/DomainModelServiceImpl.groovy | 58 +- .../scaffolding/model/property/Constrained.groovy | 20 + .../formfields/DefaultInputRenderingSpec.groovy | 22 + .../model/DomainModelServiceSpec.groovy | 6 +- grails-forge/buildSrc/build.gradle | 1 - grails-forge/buildSrc/settings.gradle | 67 +- ...uppressions.xml => checkstyle-suppressions.xml} | 0 grails-forge/config/checkstyle/checkstyle.xml | 2 +- grails-forge/gradle.properties | 5 +- grails-forge/gradle/code-style-config.gradle | 42 +- grails-forge/gradle/doc-config.gradle | 30 +- grails-forge/gradle/test-config.gradle | 10 - .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../analytics/postgres/AnalyticsController.java | 8 +- .../forge/analytics/postgres/Application.java | 14 +- .../analytics/postgres/FeatureRepository.java | 4 +- .../postgres/StoreGeneratedProjectStatsSpec.groovy | 10 +- .../grails/forge/api/ApplicationController.java | 2 +- ...estFramework.java => DevelopmentReloading.java} | 23 +- ...meworkDTO.java => DevelopmentReloadingDTO.java} | 64 +- .../org/grails/forge/api/SelectOptionsDTO.java | 28 +- .../forge/api/analytics/GenerationListener.java | 2 +- .../forge/api/create/AbstractCreateController.java | 6 +- .../api/create/github/GitHubCreateController.java | 12 +- .../api/create/github/GitHubCreateOperation.java | 6 +- .../api/create/github/GitHubCreateService.java | 6 +- .../forge/api/create/zip/ZipCreateController.java | 22 +- .../forge/api/create/zip/ZipCreateOperation.java | 6 +- .../org/grails/forge/api/diff/DiffController.java | 12 +- .../org/grails/forge/api/diff/DiffOperations.java | 8 +- ...java => DevelopmentReloadingSelectOptions.java} | 14 +- .../forge/api/preview/PreviewController.java | 10 +- .../forge/api/preview/PreviewOperations.java | 6 +- .../src/main/resources/select_options.properties | 2 +- .../org/grails/forge/api/CreateClient.groovy | 12 +- .../groovy/org/grails/forge/api/DiffClient.groovy | 8 +- .../grails/forge/api/FeatureControllerSpec.groovy | 22 +- .../org/grails/forge/api/PreviewClient.groovy | 4 +- .../forge/api/ZipCreateControllerSpec.groovy | 4 +- grails-forge/grails-forge-cli/build.gradle | 5 + .../java/org/grails/forge/cli/Application.java | 4 +- .../java/org/grails/forge/cli/CodeGenConfig.java | 19 +- .../forge/cli/command/AddPropertyCommand.java | 181 +++ .../grails/forge/cli/command/CreateCommand.java | 8 +- ...es.java => DevelopmentReloadingCandidates.java} | 8 +- ...ter.java => DevelopmentReloadingConverter.java} | 14 +- .../CodeGenConfigDevelopmentReloadingSpec.groovy | 288 +++++ .../org/grails/forge/cli/CommandFixture.groovy | 5 +- .../groovy/org/grails/forge/cli/CommandSpec.groovy | 2 +- .../java/org/grails/forge/analytics/Generated.java | 10 +- .../grails/forge/application/ContextFactory.java | 10 +- .../generator/DefaultProjectGenerator.java | 2 +- .../application/generator/GeneratorContext.java | 15 +- .../build/gradle/DefaultGradleRepository.java | 59 +- .../forge/build/gradle/GradleConfiguration.java | 6 +- .../forge/build/gradle/GradleDependency.java | 10 +- .../forge/build/gradle/GradleRepository.java | 51 +- .../gradle/VersionType.java} | 9 +- ...st.java => HasDefaultDevelopmentReloading.java} | 6 +- .../grails/forge/defaults/LanguageDefaults.java | 14 +- .../java/org/grails/forge/diff/FeatureDiffer.java | 2 +- .../org/grails/forge/feature/FeatureContext.java | 32 +- .../java/org/grails/forge/feature/Features.java | 12 +- .../forge/feature/assetPipeline/AssetPipeline.java | 59 +- .../build/gradle/templates/buildGradle.rocker.raw | 4 +- .../templates/gradleWrapperProperties.rocker.raw | 3 +- .../java/org/grails/forge/feature/cli.rocker.raw | 6 +- .../forge/feature/database/TestContainers.java | 27 +- .../GrailsMicronautValidator.java} | 18 +- .../org/grails/forge/feature/reloading/Jrebel.java | 16 + .../forge/feature/reloading/ReloadingFeature.java | 11 +- .../feature/reloading/SpringBootDevTools.java | 31 +- .../feature/spring/SpringBootUndertowFeature.java | 4 + .../feature/spring/SpringBootVirtualThreads.java | 6 +- .../org/grails/forge/feature/test/AssertJ.java | 68 -- .../forge/feature/test/GebWithTestcontainers.java | 8 +- .../feature/test/GebWithWebDriverBinaries.java | 6 +- .../org/grails/forge/feature/test/Hamcrest.java | 68 -- .../forge/feature/test/HamcrestValidator.java | 44 - .../java/org/grails/forge/feature/test/Junit.java | 70 -- .../org/grails/forge/feature/test/Mockito.java | 2 +- .../forge/feature/test/MockitoValidator.java | 2 +- .../java/org/grails/forge/feature/test/Spock.java | 17 +- .../org/grails/forge/feature/test/TestFeature.java | 71 -- .../feature/test/template/javaJunit.rocker.raw | 49 - .../options/DefaultTestRockerModelProvider.java | 10 +- .../forge/options/DevelopmentReloading.java} | 27 +- .../org/grails/forge/options/FeatureFilter.java | 12 +- .../java/org/grails/forge/options/JdkVersion.java | 5 +- .../java/org/grails/forge/options/Language.java | 2 +- .../java/org/grails/forge/options/Options.java | 48 +- .../org/grails/forge/options/TestFramework.java | 46 +- .../forge/options/TestRockerModelProvider.java | 9 +- .../resources/assets/images/advancedgrails.svg | 6 +- .../assets/images/apple-touch-icon-retina.png | Bin 7038 -> 0 bytes .../resources/assets/images/apple-touch-icon.png | Bin 3077 -> 0 bytes .../src/main/resources/assets/images/community.svg | 9 + .../main/resources/assets/images/documentation.svg | 4 +- .../src/main/resources/assets/images/favicon.ico | Bin 5558 -> 27198 bytes .../assets/images/grails-cupsonly-logo-white.svg | 26 - .../src/main/resources/assets/images/groovy.svg | 1 + .../src/main/resources/assets/images/java.svg | 1 + .../src/main/resources/assets/images/slack.svg | 18 - .../main/resources/assets/images/spring-boot.svg | 20 + .../src/main/resources/assets/images/spring.svg | 1 + .../resources/assets/javascripts/application.js | 4 +- .../main/resources/assets/javascripts/welcome.js | 116 ++ .../resources/assets/stylesheets/application.css | 4 +- .../main/resources/assets/stylesheets/welcome.css | 63 ++ .../src/main/resources/gsp/index.gsp | 397 +++++-- .../src/main/resources/gsp/main.gsp | 113 +- .../grails-forge-core/src/main/resources/pom.xml | 6 + .../groovy/org/grails/forge/BuildBuilder.groovy | 14 +- .../dependencies/GradleConfigurationSpec.groovy | 3 +- .../GradleDependencyComparatorSpec.groovy | 3 +- .../grails/forge/build/gradle/GradleSpec.groovy | 13 +- .../feature/asciidoctor/AsciidoctorSpec.groovy | 5 +- .../feature/assetPipeline/AssetPipelineSpec.groovy | 45 +- .../feature/database/HibernateGormSpec.groovy | 5 +- .../feature/database/TestContainersSpec.groovy | 22 +- .../workflows/PlainGithubWorkflowSpec.groovy | 5 +- .../forge/feature/grails/GrailsBaseSpec.groovy | 11 +- .../feature/grails/GrailsDefaultPluginsSpec.groovy | 5 +- .../feature/grails/GrailsGradlePluginSpec.groovy | 5 +- .../grailsProfiles/GrailsProfilesSpec.groovy | 5 +- .../feature/grailsWrapper/GrailsWrapperSpec.groovy | 3 +- .../feature/lang/GrailsApplicationSpec.groovy | 7 +- .../forge/feature/logging/LogbackSpec.groovy | 4 +- .../migration/DatabaseMigrationPluginSpec.groovy | 5 +- .../forge/feature/other/ShadePluginSpec.groovy | 3 +- .../reloading/SpringBootDevToolsSpec.groovy | 38 +- .../forge/feature/spring/SpringBootSpec.groovy | 19 +- .../spring/SpringBootVirtualThreadsSpec.groovy | 7 +- .../feature/spring/SpringResourcesSpec.groovy | 3 +- .../feature/test/GebWithTestcontainersSpec.groovy | 5 +- .../test/GebWithWebDriverBinariesSpec.groovy | 11 +- .../org/grails/forge/feature/test/JUnitSpec.groovy | 39 - .../grails/forge/feature/view/GrailsGspSpec.groovy | 9 +- .../forge/feature/view/json/ViewJsonSpec.groovy | 7 +- .../forge/feature/view/json/ViewMarkupSpec.groovy | 4 +- .../grails/forge/feature/web/GrailsWebSpec.groovy | 5 +- .../org/grails/forge/fixture/ContextFixture.groovy | 3 +- .../grails/forge/options/TestFrameworkSpec.groovy | 13 +- .../options/TestRockerModelProviderSpec.groovy | 12 +- grails-forge/settings.gradle | 79 +- .../org/grails/forge/utils/CommandSpec.groovy | 7 +- grails-geb/README.md | 4 +- grails-geb/build.gradle | 2 +- .../src/main/templates/FunctionalSpec.groovy | 19 +- .../plugin/geb/WebDriverContainerHolder.groovy | 4 +- .../geb/serviceloader/ServiceRegistry.groovy | 2 +- grails-gradle/buildSrc/settings.gradle | 64 +- grails-gradle/common/build.gradle | 2 +- grails-gradle/gradle/code-style-config.gradle | 61 - grails-gradle/gradle/docs-config.gradle | 18 +- grails-gradle/gradle/test-config.gradle | 9 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- grails-gradle/model/build.gradle | 2 +- .../src/main/groovy/grails/util/Metadata.groovy | 4 +- grails-gradle/plugins/build.gradle | 19 +- .../gradle/plugin/core/GrailsExtension.groovy | 14 + .../gradle/plugin/core/GrailsGradlePlugin.groovy | 223 +++- .../gradle/plugin/web/GrailsWebGradlePlugin.groovy | 40 +- .../gradle/plugin/core/GradleSpecification.groovy | 134 +++ .../core/GrailsGradlePluginJavaCompatSpec.groovy | 109 ++ .../core/GrailsGradlePluginToolchainSpec.groovy | 136 +++ .../fork-settings-custom/build.gradle | 18 + .../fork-settings-custom/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../fork-settings-custom/settings.gradle | 1 + .../fork-settings-defaults/build.gradle | 18 + .../fork-settings-defaults/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../fork-settings-defaults/settings.gradle | 1 + .../java-compat-no-toolchain/build.gradle | 21 + .../java-compat-no-toolchain/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../java-compat-no-toolchain/settings.gradle | 1 + .../java-compat-toolchain-23/build.gradle | 29 + .../java-compat-toolchain-23/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../java-compat-toolchain-23/settings.gradle | 1 + .../java-compat-toolchain-24/build.gradle | 29 + .../java-compat-toolchain-24/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../java-compat-toolchain-24/settings.gradle | 1 + .../java-compat-toolchain-current/build.gradle | 27 + .../gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../java-compat-toolchain-current/settings.gradle | 1 + .../no-toolchain-javaexec/build.gradle | 19 + .../no-toolchain-javaexec/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../no-toolchain-javaexec/settings.gradle | 1 + .../test-projects/no-toolchain-web/build.gradle | 9 + .../no-toolchain-web/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../test-projects/no-toolchain-web/settings.gradle | 1 + .../test-projects/toolchain-command/build.gradle | 25 + .../toolchain-command/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../toolchain-command/settings.gradle | 1 + .../test-projects/toolchain-javaexec/build.gradle | 26 + .../toolchain-javaexec/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../toolchain-javaexec/settings.gradle | 1 + .../test-projects/toolchain-override/build.gradle | 30 + .../toolchain-override/gradle.properties | 1 + .../grails-app/conf/application.yml | 0 .../toolchain-override/settings.gradle | 1 + .../test-projects/toolchain-test/build.gradle | 21 + .../test-projects/toolchain-test/gradle.properties | 1 + .../toolchain-test/grails-app/conf/application.yml | 0 .../test-projects/toolchain-test/settings.gradle | 1 + grails-gradle/settings.gradle | 70 +- grails-gradle/tasks/build.gradle | 2 +- grails-gsp/core/build.gradle | 2 +- .../org/grails/gsp/compiler/GroovyPageParser.java | 13 +- grails-gsp/grails-layout/build.gradle | 2 +- grails-gsp/grails-sitemesh3/build.gradle | 2 +- grails-gsp/grails-taglib/build.gradle | 2 +- .../grails/core/gsp/DefaultGrailsTagLibClass.java | 17 + .../core/gsp/DefaultGrailsTagLibClassSpec.groovy | 108 ++ grails-gsp/grails-web-gsp-taglib/build.gradle | 2 +- grails-gsp/grails-web-gsp/build.gradle | 2 +- grails-gsp/grails-web-jsp/build.gradle | 2 +- grails-gsp/grails-web-taglib/build.gradle | 2 +- grails-gsp/plugin/build.gradle | 8 +- .../plugins/web/taglib/ApplicationTagLib.groovy | 3 +- .../grails/plugins/web/taglib/FormTagLib.groovy | 2 +- .../mapping/RestfulReverseUrlRenderingTests.groovy | 21 + .../groovy/org/grails/web/pages/ParseSpec.groovy | 31 + .../web/taglib/AbstractGrailsTagTests.groovy | 7 + .../org/grails/web/taglib/FormTagLibTests.groovy | 28 + grails-i18n/build.gradle | 2 +- grails-interceptors/build.gradle | 2 +- .../web/interceptors/UrlMappingMatcherSpec.groovy | 7 +- grails-logging/build.gradle | 2 +- grails-micronaut/build.gradle | 3 +- .../micronaut/GrailsMicronautGrailsPlugin.groovy | 36 +- grails-mimetypes/build.gradle | 2 +- .../web/mime/HttpServletRequestExtension.groovy | 14 +- .../web/mime/HttpServletResponseExtension.groovy | 2 +- .../groovy/grails/web/mime/MimeUtilitySpec.groovy | 11 + .../web/mime/MimeTypesConfigurationSpec.groovy | 11 + .../grails/web/mime/AcceptHeaderParserSpec.groovy | 5 + .../mvc/RequestAndResponseMimeTypesApiSpec.groovy | 7 + grails-profiles/base/commands/add-property.groovy | 132 +++ grails-profiles/base/features/geb2/feature.yml | 2 +- grails-profiles/base/profile.yml | 2 + grails-profiles/base/skeleton/build.gradle | 15 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../gradle/wrapper/gradle-wrapper.properties | 4 +- .../grails-app/assets/images/advancedgrails.svg | 6 +- .../assets/images/apple-touch-icon-retina.png | Bin 7038 -> 0 bytes .../grails-app/assets/images/apple-touch-icon.png | Bin 3077 -> 0 bytes .../grails-app/assets/images/community.svg | 9 + .../grails-app/assets/images/documentation.svg | 4 +- .../skeleton/grails-app/assets/images/favicon.ico | Bin 5558 -> 27198 bytes .../assets/images/grails-cupsonly-logo-white.svg | 26 - .../skeleton/grails-app/assets/images/groovy.svg | 1 + .../web/skeleton/grails-app/assets/images/java.svg | 1 + .../skeleton/grails-app/assets/images/slack.svg | 18 - .../grails-app/assets/images/spring-boot.svg | 20 + .../skeleton/grails-app/assets/images/spring.svg | 1 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/javascripts/welcome.js | 115 ++ .../grails-app/assets/stylesheets/application.css | 4 +- .../grails-app/assets/stylesheets/welcome.css | 63 ++ .../web/skeleton/grails-app/views/index.gsp | 397 +++++-- .../web/skeleton/grails-app/views/layouts/main.gsp | 113 +- grails-rest-transforms/build.gradle | 2 +- .../rest/render/DefaultRendererRegistrySpec.groovy | 11 + .../web/rest/render/VndErrorRenderingSpec.groovy | 8 + .../web/rest/render/hal/HalJsonRendererSpec.groovy | 10 + .../web/rest/render/html/HtmlRendererSpec.groovy | 10 + .../web/rest/render/json/JsonRendererSpec.groovy | 2 + grails-scaffolding/build.gradle | 2 +- grails-services/build.gradle | 2 +- grails-shell-cli/build.gradle | 10 +- .../cli/compiler/grape/AetherGrapeEngine.java | 2 +- .../compiler/grape/AetherGrapeEngineFactory.java | 2 +- .../grails/cli/profile/ProfileRepoConfig.groovy | 14 +- .../cli/profile/commands/CreateAppCommand.groovy | 204 +++- .../profile/commands/CreateAppCommandSpec.groovy | 4 +- grails-spring/build.gradle | 2 +- .../grails/spring/GrailsApplicationContext.java | 13 + grails-test-core/build.gradle | 2 +- grails-test-examples/app1/build.gradle | 3 +- .../grails-app/assets/javascripts/application.js | 2 +- .../functionaltests/BookController.groovy | 11 +- .../controllers/functionaltests/UrlMappings.groovy | 62 ++ .../async/AsyncTestController.groovy | 304 +++++ .../binding/AdvancedDataBindingController.groovy | 306 +++++ .../caching/CacheTestController.groovy | 131 +++ .../codecs/CodecTestController.groovy | 281 +++++ .../commanddi/CommandDIController.groovy | 406 +++++++ .../contentneg/ContentNegotiationController.groovy | 168 +++ .../functionaltests/cors/CorsTestController.groovy | 113 ++ .../ErrorHandlingTestController.groovy | 215 ++++ .../fileupload/FileUploadTestController.groovy | 241 ++++ .../functionaltests/flow/FlowController.groovy | 245 ++++ .../flow/FlowTargetController.groovy | 43 +- .../functionaltests/i18n/I18nTestController.groovy | 226 ++++ .../interceptors/ActionExcludeInterceptor.groovy | 35 +- .../interceptors/AdvancedMatchingController.groovy | 107 ++ .../AttributeSettingInterceptor.groovy | 28 +- .../interceptors/BlockingInterceptor.groovy | 42 +- .../ConditionalMatchInterceptor.groovy | 52 + .../interceptors/FirstInterceptor.groovy | 38 +- .../HttpMethodMatchingInterceptor.groovy} | 24 +- .../interceptors/InterceptorTestController.groovy | 172 +++ .../interceptors/MultipleRulesInterceptor.groovy | 35 +- .../NamespaceMatchingInterceptor.groovy} | 24 +- .../interceptors/SecondInterceptor.groovy | 38 +- .../interceptors/SessionInterceptor.groovy | 36 +- .../interceptors/ThirdInterceptor.groovy | 38 +- .../interceptors/TimingInterceptor.groovy | 37 +- .../RequestResponseTestController.groovy | 270 +++++ .../springevents/SpringEventController.groovy | 148 +++ .../taglib/TagLibTestController.groovy | 326 ++++++ .../urlmappings/UrlMappingsTestController.groovy | 167 +++ .../domain/functionaltests/binding/Address.groovy} | 25 +- .../functionaltests/binding/Contributor.groovy} | 21 +- .../domain/functionaltests/binding/Employee.groovy | 43 +- .../domain/functionaltests/binding/Project.groovy} | 24 +- .../domain/functionaltests/binding/Team.groovy} | 22 +- .../functionaltests/binding/TeamMember.groovy} | 24 +- .../functionaltests/constraints/Appointment.groovy | 109 ++ .../functionaltests/constraints/PaymentInfo.groovy | 178 +++ .../functionaltests/constraints/Product.groovy | 76 ++ .../constraints/Registration.groovy | 158 +++ .../functionaltests/events/AuditedEntity.groovy | 108 ++ .../functionaltests/events/StatefulEntity.groovy | 81 ++ .../functionaltests/events/VetoableEntity.groovy | 67 ++ .../domain/functionaltests/gorm/Author.groovy} | 40 +- .../domain/functionaltests/gorm/GormBook.groovy | 70 ++ .../functionaltests/services/InventoryItem.groovy} | 25 +- .../app1/grails-app/i18n/messages.properties | 9 + .../app1/grails-app/i18n/messages_de.properties | 9 + .../app1/grails-app/i18n/messages_fr.properties | 9 + .../caching/CacheTestService.groovy | 133 +++ .../commanddi/NotificationService.groovy | 88 ++ .../commanddi/PricingService.groovy | 77 ++ .../commanddi/ValidationHelperService.groovy | 80 ++ .../services/AsyncProcessingService.groovy | 122 ++ .../services/InventoryService.groovy | 204 ++++ .../functionaltests/services/OrderService.groovy | 118 ++ .../springevents/EventListenerService.groovy | 169 +++ .../springevents/EventPublisherService.groovy | 78 ++ .../functionaltests/taglib/CustomTagLib.groovy | 341 ++++++ .../grails-app/views/contentNegotiation/error.gsp | 29 + .../grails-app/views/contentNegotiation/index.gsp | 34 + .../views/tagLibTest/_simpleTemplate.gsp | 19 + .../grails-app/views/tagLibTest/testAlertTag.gsp | 20 + .../grails-app/views/tagLibTest/testAppInfoTag.gsp | 20 + .../grails-app/views/tagLibTest/testBadgeTag.gsp | 20 + .../views/tagLibTest/testBuiltInCheckBox.gsp | 20 + .../views/tagLibTest/testBuiltInCollect.gsp | 20 + .../views/tagLibTest/testBuiltInCookie.gsp | 20 + .../views/tagLibTest/testBuiltInCreateLink.gsp | 21 + .../views/tagLibTest/testBuiltInEach.gsp | 21 + .../views/tagLibTest/testBuiltInFieldValue.gsp | 20 + .../views/tagLibTest/testBuiltInFindAll.gsp | 20 + .../views/tagLibTest/testBuiltInForm.gsp | 23 + .../views/tagLibTest/testBuiltInFormatDate.gsp | 21 + .../views/tagLibTest/testBuiltInFormatNumber.gsp | 21 + .../views/tagLibTest/testBuiltInHeader.gsp | 20 + .../views/tagLibTest/testBuiltInHiddenField.gsp | 20 + .../grails-app/views/tagLibTest/testBuiltInIf.gsp | 24 + .../views/tagLibTest/testBuiltInInclude.gsp | 20 + .../views/tagLibTest/testBuiltInJoin.gsp | 20 + .../views/tagLibTest/testBuiltInLink.gsp | 22 + .../views/tagLibTest/testBuiltInMessage.gsp | 20 + .../views/tagLibTest/testBuiltInPaginate.gsp | 20 + .../views/tagLibTest/testBuiltInPasswordField.gsp | 20 + .../views/tagLibTest/testBuiltInRadio.gsp | 22 + .../views/tagLibTest/testBuiltInRender.gsp | 20 + .../views/tagLibTest/testBuiltInResource.gsp | 20 + .../views/tagLibTest/testBuiltInSelect.gsp | 20 + .../grails-app/views/tagLibTest/testBuiltInSet.gsp | 23 + .../views/tagLibTest/testBuiltInSortableColumn.gsp | 26 + .../views/tagLibTest/testBuiltInTextArea.gsp | 20 + .../views/tagLibTest/testBuiltInTextField.gsp | 20 + .../views/tagLibTest/testBuiltInUploadForm.gsp | 23 + .../views/tagLibTest/testBuiltInWhile.gsp | 21 + .../views/tagLibTest/testConditionalTags.gsp | 21 + .../views/tagLibTest/testCssClassTag.gsp | 20 + .../views/tagLibTest/testDefinitionListTag.gsp | 20 + .../views/tagLibTest/testEncodingTags.gsp | 22 + .../views/tagLibTest/testFormattedTag.gsp | 20 + .../grails-app/views/tagLibTest/testHelloTag.gsp | 20 + .../grails-app/views/tagLibTest/testIterateTag.gsp | 20 + .../grails-app/views/tagLibTest/testJoinTag.gsp | 20 + .../grails-app/views/tagLibTest/testListTag.gsp | 20 + .../grails-app/views/tagLibTest/testNestedTags.gsp | 22 + .../grails-app/views/tagLibTest/testPanelTag.gsp | 20 + .../views/tagLibTest/testProgressTag.gsp | 20 + .../grails-app/views/tagLibTest/testRawTag.gsp | 20 + .../grails-app/views/tagLibTest/testRepeatTag.gsp | 20 + .../views/tagLibTest/testRequestInfoTag.gsp | 20 + .../views/tagLibTest/testSessionValueTag.gsp | 20 + .../grails-app/views/tagLibTest/testSetVarTag.gsp | 20 + .../views/tagLibTest/testTagsWithModel.gsp | 26 + .../grails-app/views/tagLibTest/testWrapperTag.gsp | 20 + .../groovy/functionaltests/AtResourceSpec.groovy | 27 +- .../functionaltests/BookFunctionalSpec.groovy | 47 +- .../BookRestfulControllerSpec.groovy | 36 +- .../groovy/functionaltests/HomeSpec.groovy | 37 +- .../groovy/functionaltests/LoadAfterSpec.groovy | 10 +- .../functionaltests/MiscFunctionalSpec.groovy | 28 +- .../functionaltests/async/AsyncPromiseSpec.groovy | 337 ++++++ .../binding/AdvancedDataBindingSpec.groovy | 445 ++++++++ .../functionaltests/caching/CachingSpec.groovy | 357 ++++++ .../codecs/SecurityCodecsSpec.groovy | 374 +++++++ .../commanddi/CommandObjectDISpec.groovy | 325 ++++++ .../constraints/ConstraintValidationSpec.groovy | 996 +++++++++++++++++ .../contentneg/ContentNegotiationSpec.groovy | 310 ++++++ .../functionaltests/cors/CorsAdvancedSpec.groovy | 253 +++++ .../errorhandling/ErrorHandlingSpec.groovy | 166 +++ .../functionaltests/events/DomainEventsSpec.groovy | 574 ++++++++++ .../fileupload/FileUploadSpec.groovy | 321 ++++++ .../flow/FlashChainForwardSpec.groovy | 305 +++++ .../functionaltests/gorm/GormAdvancedSpec.groovy | 719 ++++++++++++ .../i18n/InternationalizationSpec.groovy | 375 +++++++ .../InterceptorAdvancedMatchingSpec.groovy | 241 ++++ .../interceptors/InterceptorOrderingSpec.groovy | 264 +++++ .../layout/LayoutFunctionalSpec.groovy | 27 +- .../layout/LayoutWithTemplateSpec.groovy | 13 +- .../functionaltests/pages/BarListPage.groovy} | 16 +- .../groovy/functionaltests/pages/BookPages.groovy | 62 ++ .../pages/ConventionLayoutPage.groovy} | 17 +- .../functionaltests/pages/FooLayoutPage.groovy} | 17 +- .../pages/FooLayoutSnippetPage.groovy} | 17 +- .../functionaltests/pages/FooListPage.groovy} | 16 +- .../groovy/functionaltests/pages/HomePage.groovy} | 20 +- .../functionaltests/pages/LoginAuthPage.groovy} | 17 +- .../groovy/functionaltests/pages/MiscPages.groovy} | 27 +- .../functionaltests/pages/PartialPage.groovy} | 17 +- .../requestresponse/RequestResponseSpec.groovy | 325 ++++++ .../scaffolding/BarFunctionalSpec.groovy | 14 +- .../scaffolding/FooFunctionalSpec.groovy | 14 +- .../services/ServiceIntegrationSpec.groovy | 379 +++++++ .../springevents/SpringEventsSpec.groovy | 293 +++++ .../functionaltests/taglib/TagLibSpec.groovy | 720 ++++++++++++ .../urlmappings/UrlMappingsSpec.groovy | 265 +++++ .../springevents/CustomApplicationEvent.groovy | 34 +- .../springevents/PriorityEvent.groovy | 25 +- .../springevents/UserActionEvent.groovy | 34 +- .../functionaltests/BookControllerSpec.groovy | 10 +- .../grails-app/assets/javascripts/application.js | 2 +- .../groovy/app2/NotFoundHandlerSpec.groovy | 22 +- .../groovy/app2/pages/FooPages.groovy} | 23 +- .../groovy/app3/LoadAfterSpec.groovy | 9 +- .../groovy/app3/pages/LoginAuthPage.groovy} | 16 +- .../async-events-pubsub-demo/build.gradle | 4 +- .../services/pubsub/demo/TotalService.groovy | 12 +- .../groovy/pubsub/demo/AsyncEventsSpec.groovy | 203 ++++ .../groovy/pubsub/demo/PubSubSpec.groovy | 37 +- .../groovy/pubsub/demo/TaskControllerSpec.groovy | 34 +- .../main/groovy/pubsub/demo/BookSubscriber.groovy | 16 +- grails-test-examples/cache/build.gradle | 6 +- .../com/demo/AdvancedCachingController.groovy | 123 ++ .../controllers/com/demo/UrlMappings.groovy | 54 + .../com/demo/AdvancedCachingService.groovy | 158 +++ .../com/demo/AdvancedCachingIntegrationSpec.groovy | 204 ++++ .../com/demo/AdvancedCachingServiceSpec.groovy | 316 ++++++ .../{gorm => database-cleanup}/build.gradle | 28 +- .../grails-app/conf/application.yml | 44 +- .../database-cleanup/grails-app/conf/logback.xml | 26 +- .../controllers/dbcleanup}/UrlMappings.groovy | 2 +- .../grails-app/domain/dbcleanup/Author.groovy | 16 +- .../grails-app/domain/dbcleanup}/Book.groovy | 13 +- .../grails-app/init/dbcleanup/Application.groovy} | 17 +- .../database-cleanup/grails-app/views/error.gsp | 27 + .../groovy/dbcleanup/ClassLevelCleanupSpec.groovy | 74 ++ .../groovy/dbcleanup/MethodLevelCleanupSpec.groovy | 87 ++ .../datasources/OsivBookController.groovy} | 24 +- .../controllers/datasources/UrlMappings.groovy | 13 +- .../datasources/grails-app/domain/ds2/Book.groovy | 2 + .../domain/ds2/{Book.groovy => Chapter.groovy} | 4 +- .../datasources/grails-app/views/osivBook/show.gsp | 29 + .../CrossDatasourceTransactionSpec.groovy | 284 +++++ .../functionaltests/DatasourceSwitchingSpec.groovy | 456 ++++++++ .../functionaltests/MultipleDataSourcesSpec.groovy | 13 +- .../functionaltests/OsivGspRenderingSpec.groovy} | 18 +- .../functionaltests/pages/OsivBookPage.groovy} | 13 +- grails-test-examples/demo33/build.gradle | 2 + .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 2 +- .../groovy/demo/JsonControllerSpec.groovy | 26 +- .../groovy/exploded/LoadAfterSpec.groovy | 9 +- .../groovy/exploded/pages/LoginAuthPage.groovy} | 15 +- .../test/app/ConfigurationPrioritySpec.groovy | 249 +++++ .../test/app/EnvironmentConfigurationSpec.groovy | 223 ++++ .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 2 +- .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 2 +- grails-test-examples/geb/grails-cli.yml | 2 +- grails-test-examples/gorm/build.gradle | 5 +- .../controllers/gorm/AuthorController.groovy | 10 +- .../gorm/BookController.groovy} | 17 +- .../controllers/gorm}/UrlMappings.groovy | 2 +- .../grails-app/domain/gorm/AuditedEntity.groovy | 148 +++ .../grails-app/domain/gorm/Author.groovy} | 29 +- .../gorm/grails-app/domain/gorm/Book.groovy | 33 +- .../grails-app/i18n/messages.properties | 1 + .../gorm/AuthorDataService.groovy} | 20 +- .../services/gorm/BookDataService.groovy | 151 +++ .../services/gorm/CompileStaticBookService.groovy | 89 ++ .../services/gorm/TransactionTestService.groovy | 187 ++++ .../gorm/WhereQueryVariableScopeService.groovy | 86 ++ .../gorm/grails-app/views/error.gsp | 48 + .../gorm/grails-app/views/index.gsp | 32 + .../gorm/grails-app/views/notFound.gsp | 28 + .../groovy/gorm/BindingOutsideRequestSpec.groovy | 5 + ...OutsideRequestSpec.groovy => ExistsSpec.groovy} | 53 +- .../groovy/gorm/FieldsValidationSpec.groovy | 552 +++++++++ .../groovy/gorm/GormCascadeOperationsSpec.groovy | 357 ++++++ .../groovy/gorm/GormCriteriaQueriesSpec.groovy | 614 ++++++++++ .../groovy/gorm/GormDataServicesSpec.groovy | 421 +++++++ .../groovy/gorm/GormEventsSpec.groovy | 377 +++++++ .../groovy/gorm/GormWhereQueryAdvancedSpec.groovy | 420 +++++++ .../groovy/gorm/ScaffoldingFunctionalSpec.groovy | 293 +++++ .../groovy/gorm/TransactionPropagationSpec.groovy | 268 +++++ ...TransactionalWhereQueryVariableScopeSpec.groovy | 109 ++ .../integration-test/groovy/gorm/UserSpec.groovy | 33 +- .../groovy/gorm/ValidationConstraintsSpec.groovy | 496 +++++++++ .../groovy/gorm/pages/AuthorPages.groovy | 75 ++ .../groovy/gorm/pages/BookPages.groovy | 79 ++ .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 2 +- .../example/grails/layout/TagLibController.groovy | 95 ++ .../grails-app/views/tagLib/_partial.gsp | 21 + .../grails-app/views/tagLib/collectTag.gsp | 29 + .../grails-app/views/tagLib/createLinkTag.gsp | 30 + .../gsp-layout/grails-app/views/tagLib/eachTag.gsp | 33 + .../gsp-layout/grails-app/views/tagLib/elseTag.gsp | 33 + .../grails-app/views/tagLib/encodeTags.gsp | 30 + .../gsp-layout/grails-app/views/tagLib/formTag.gsp | 50 + .../grails-app/views/tagLib/formatTags.gsp | 30 + .../gsp-layout/grails-app/views/tagLib/ifTag.gsp | 31 + .../gsp-layout/grails-app/views/tagLib/index.gsp | 32 + .../gsp-layout/grails-app/views/tagLib/joinTag.gsp | 30 + .../gsp-layout/grails-app/views/tagLib/linkTag.gsp | 30 + .../grails-app/views/tagLib/renderTag.gsp | 31 + .../gsp-layout/grails-app/views/tagLib/setTag.gsp | 35 + .../gsp-layout/grails-forge-cli.yml | 2 +- .../integration-test/groovy/GspTagLibSpec.groovy | 275 +++++ .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 2 +- .../gsp-sitemesh3/grails-forge-cli.yml | 2 +- .../gsp-spring-boot/script/.sdkmanrc | 4 +- .../build.gradle | 25 +- .../grails-app/conf/application.yml | 58 + .../grails-app/conf/logback.xml | 26 +- .../grails-app/domain/example/Product.groovy} | 21 +- .../grails-app/init/example/Application.groovy} | 19 +- .../example/InheritedProductService.groovy} | 24 +- .../services/example/ProductService.groovy | 58 + .../DataServiceDatasourceInheritanceSpec.groovy | 112 ++ .../DataServiceMultiDataSourceSpec.groovy | 180 +++ .../grails-app/assets/javascripts/application.js | 2 +- .../controllers/example/BookController.groovy | 8 +- .../groovy/example/DatabasePerTenantSpec.groovy | 6 +- .../grails-app/assets/javascripts/application.js | 2 +- .../functional/tests/BookController.groovy | 8 +- .../functional/tests/BookControllerSpec.groovy | 24 +- .../functional/tests/pages/BookPages.groovy} | 40 +- .../functional/tests/BookControllerUnitSpec.groovy | 10 +- .../grails-multiple-datasources/build.gradle | 4 + .../datasources/SecondaryBookController.groovy | 78 ++ .../controllers/datasources}/UrlMappings.groovy | 11 +- .../MultiDataSourceWithSessionSpec.groovy | 74 ++ .../build.gradle | 25 +- .../grails-app/conf/application.yml | 62 ++ .../grails-app/conf/logback.xml | 26 +- .../grails-app/domain/example/Metric.groovy} | 25 +- .../grails-app/init/example/Application.groovy} | 16 +- .../services/example/MetricService.groovy | 65 ++ .../MultiTenantMultiDataSourceSpec.groovy | 183 +++ .../grails-app/assets/javascripts/application.js | 2 +- .../controllers/example/BookController.groovy | 8 +- .../example/PartitionedMultiTenancySpec.groovy | 6 +- .../grails-app/assets/javascripts/application.js | 2 +- .../schemapertenant/BookController.groovy | 8 +- .../schemapertenant/SchemaPerTenantSpec.groovy | 5 +- .../hibernate5/issue450/build.gradle | 3 +- .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 2 +- .../groovy/example/BookControllerSpec.groovy | 27 +- .../grails-app/assets/javascripts/application.js | 2 +- grails-test-examples/issue-11102/build.gradle | 6 +- .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 2 +- .../groovy/issue11102/HttpClientCommonSpec.groovy | 45 - .../groovy/issue11102/TestControllerSpec.groovy | 27 +- grails-test-examples/issue-11767/build.gradle | 7 +- .../groovy/issue11767/app/ConfigLoadingSpec.groovy | 37 +- grails-test-examples/issue-15228/build.gradle | 3 +- .../issue11767/app/GsonViewRespondSpec.groovy | 58 +- grails-test-examples/issue-views-182/build.gradle | 3 +- .../groovy/views182/CustomErrorSpec.groovy | 27 +- .../groovy/views182/HttpClientCommonSpec.groovy | 46 - .../build.gradle | 18 +- .../grails-app/conf/application.yml | 35 +- .../micronautgroovyonly}/UrlMappings.groovy | 3 +- .../init/micronautgroovyonly/Application.groovy | 20 +- .../BeanInjectionService.groovy | 44 +- .../micronautgroovyonly/TestService.groovy | 11 +- .../BeanInjectionServiceSpec.groovy} | 41 +- .../MicronautContextSpec.groovy | 83 ++ .../MicronautQualifierSpec.groovy | 97 ++ .../main/groovy/bean/injection/AppConfig.groovy} | 17 +- .../bean/injection/FactoryCreatedService.groovy | 10 +- .../main/groovy/bean/injection/NamedService.groovy | 7 +- .../bean/injection/PrimaryNamedService.groovy} | 16 +- .../main/groovy/bean/injection/Qualified.groovy} | 19 +- .../bean/injection/QualifiedNamedService.groovy} | 16 +- .../bean/injection/RegularNamedService.groovy} | 17 +- .../groovy/bean/injection/ServiceFactory.groovy | 24 +- .../bean/injection/SpecialNamedService.groovy} | 17 +- grails-test-examples/micronaut/build.gradle | 15 +- .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 2 +- .../micronaut/grails-app/conf/application.yml | 7 + .../micronaut/ExternalApiController.groovy | 113 ++ .../micronaut/MicronautTestController.groovy} | 41 +- .../controllers/micronaut/UrlMappings.groovy | 15 + .../services/micronaut/ExternalApiService.groovy | 110 ++ .../micronaut/MicronautBeanDuplicationSpec.groovy | 105 ++ .../groovy/micronaut/MicronautBeanTypesSpec.groovy | 99 ++ .../groovy/micronaut/MicronautContextSpec.groovy | 92 ++ .../MicronautDeclarativeClientSpec.groovy | 246 ++++ .../micronaut/MicronautErsatzAdvancedSpec.groovy | 557 ++++++++++ .../micronaut/MicronautErsatzPatternSpec.groovy | 444 ++++++++ .../micronaut/MicronautErsatzRoundtripSpec.groovy | 426 +++++++ .../micronaut/MicronautPluginBeanSpec.groovy | 85 ++ .../groovy/micronaut/MicronautQualifierSpec.groovy | 106 ++ .../main/groovy/bean/injection/AppConfig.groovy} | 17 +- .../bean/injection/FactoryCreatedService.groovy | 10 +- .../groovy/bean/injection/ServiceFactory.groovy | 24 +- .../client/MicronautAdvancedClient.groovy | 59 + .../client/MicronautFilteredClient.groovy} | 23 +- .../micronaut/client/MicronautHeaderClient.groovy | 21 +- .../micronaut/client/MicronautPathClient.groovy} | 26 +- .../client/MicronautReactiveClient.groovy | 41 +- .../micronaut/client/MicronautTestClient.groovy | 43 +- .../java/bean/injection/JavaMessageProvider.java | 30 +- .../java/bean/injection/JavaSingletonService.java | 33 +- .../client/MicronautRetryableClient.java} | 21 +- .../micronaut/filter/AuthTokenClientFilter.java} | 20 +- .../grails-app/assets/javascripts/application.js | 2 +- .../functional/tests/BookController.groovy | 8 +- .../functional/tests/BookControllerSpec.groovy | 28 +- .../functional/tests/pages/BookPages.groovy} | 40 +- .../grails-app/assets/javascripts/application.js | 2 +- .../examples/mongo/tenant/BookController.groovy | 8 +- .../groovy/examples/mongo/tenant/BookSpec.groovy | 7 +- .../grails-app/assets/javascripts/application.js | 2 +- .../grails-app/assets/javascripts/application.js | 2 +- .../functional/tests/AuthorController.groovy | 8 +- .../functional/tests/BookController.groovy | 8 +- .../functional/tests/AuthorControllerSpec.groovy | 28 +- .../functional/tests/BookControllerSpec.groovy | 28 +- .../functional/tests/pages/AuthorPages.groovy} | 39 +- .../functional/tests/pages/BookPages.groovy} | 40 +- .../grails-app/assets/javascripts/application.js | 2 +- .../groovy/context/ContextPathSpec.groovy | 23 +- .../groovy/context/pages/EnvironmentPages.groovy} | 23 +- .../groovy/namespaces/PageControllerSpec.groovy | 19 +- .../namespaces/admin/ReportControllerSpec.groovy | 18 +- .../namespaces/admin/pages/ReportPages.groovy} | 24 +- .../groovy/namespaces/pages/AdminPage.groovy} | 16 +- .../groovy/namespaces/pages/FrontendPage.groovy} | 16 +- grails-test-examples/plugins/exploded/build.gradle | 3 + .../groovy/exploded/PluginDependencySpec.groovy | 223 ++++ .../plugins/issue-11767/build.gradle | 6 +- .../plugins/loadfirst/build.gradle | 3 + .../groovy/loadfirst/PluginLifecycleSpec.groovy | 236 ++++ .../plugins/loadsecond/build.gradle | 3 + .../groovy/loadsecond/PluginLoadOrderSpec.groovy | 222 ++++ .../build.gradle | 18 +- .../MicronautSingletonGrailsPlugin.groovy} | 18 +- .../plugins/micronaut/PluginMessageProvider.java | 31 +- .../plugins/micronaut/PluginSingletonService.java | 33 +- .../{micronaut => scaffolding-fields}/build.gradle | 26 +- .../grails-app/conf/application.yml | 62 +- .../scaffoldingfields/DepartmentController.groovy | 20 +- .../scaffoldingfields/EmployeeController.groovy | 15 +- .../scaffoldingfields/ProjectController.groovy | 15 +- .../scaffoldingfields}/UrlMappings.groovy | 2 +- .../domain/scaffoldingfields/Address.groovy} | 23 +- .../domain/scaffoldingfields/Department.groovy} | 19 +- .../domain/scaffoldingfields/Employee.groovy | 129 +++ .../domain/scaffoldingfields/Project.groovy} | 30 +- .../grails-app/i18n/messages.properties | 1 + .../init/scaffoldingfields/Application.groovy} | 18 +- .../init/scaffoldingfields/BootStrap.groovy | 114 ++ .../grails-app/views/_fields/default/_wrapper.gsp | 38 + .../views/_fields/employee/biography/_wrapper.gsp | 38 + .../views/_fields/employee/email/_wrapper.gsp | 39 + .../scaffoldingfields/CrudFunctionalSpec.groovy | 215 ++++ .../scaffoldingfields/CustomTemplatesSpec.groovy | 171 +++ .../groovy/scaffoldingfields/FieldTypesSpec.groovy | 248 +++++ .../groovy/scaffoldingfields/PaginationSpec.groovy | 502 +++++++++ .../RelationshipsFunctionalSpec.groovy | 534 +++++++++ .../ValidationFunctionalSpec.groovy | 861 ++++++++++++++ .../scaffoldingfields/pages/DepartmentPages.groovy | 101 ++ .../scaffoldingfields/pages/EmployeePages.groovy | 149 +++ .../scaffoldingfields/pages/ProjectPages.groovy | 105 ++ .../pages/ScaffoldCreatePage.groovy | 147 +++ .../pages/ScaffoldEditPage.groovy | 159 +++ .../pages/ScaffoldListPage.groovy | 112 ++ .../pages/ScaffoldShowPage.groovy | 106 ++ .../grails-app/assets/javascripts/application.js | 4 +- .../grails-app/assets/stylesheets/application.css | 4 +- .../grails-app/domain/com/example/User.groovy | 9 +- .../com/example/UserCommunityControllerSpec.groovy | 29 +- .../groovy/com/example/UserControllerSpec.groovy | 27 +- ...outPage.groovy => CommunityUserListPage.groovy} | 12 +- .../groovy/com/example/pages/LoginPage.groovy | 17 +- .../groovy/com/example/pages/LogoutPage.groovy | 15 +- .../{LogoutPage.groovy => UserListPage.groovy} | 12 +- .../views-functional-tests/build.gradle | 5 +- .../grails-app/assets/javascripts/application.js | 2 +- .../groovy/functional/tests/BookSpec.groovy | 181 +-- .../groovy/functional/tests/BulletinSpec.groovy | 26 +- .../groovy/functional/tests/CircularSpec.groovy | 74 +- .../groovy/functional/tests/CustomerSpec.groovy | 41 +- .../groovy/functional/tests/EmbeddedSpec.groovy | 58 +- .../groovy/functional/tests/HttpClientSpec.groovy | 44 - .../groovy/functional/tests/InheritanceSpec.groovy | 38 +- .../tests/ModelInterceptorIntSpec.groovy | 37 +- .../functional/tests/ObjectTemplateSpec.groovy | 27 +- .../functional/tests/PersonInheritanceSpec.groovy | 32 +- .../groovy/functional/tests/ProductSpec.groovy | 218 ++-- .../groovy/functional/tests/ProjectSpec.groovy | 38 +- .../groovy/functional/tests/ProxySpec.groovy | 31 +- .../groovy/functional/tests/TeamSpec.groovy | 91 +- .../functional/tests/TestControllerSpec.groovy | 28 +- .../functional/tests/TestGmlControllerSpec.groovy | 32 +- .../functional/tests/TestGsonControllerSpec.groovy | 86 +- .../groovy/functional/tests/VehicleSpec.groovy | 61 +- .../functional/tests/api/NamespacedBookSpec.groovy | 143 +-- grails-test-suite-base/build.gradle | 5 +- grails-test-suite-uber/build.gradle | 85 +- ...GrailsCompileStaticCompilationErrorsSpec.groovy | 9 + .../GrailsTypeCheckedCompilationErrorsSpec.groovy | 9 + .../grails/persistence/EntityTransformTests.groovy | 9 + .../groovy/grails/spring/BeanBuilderTests.groovy | 9 + .../test/mixin/ControllerUnitTestMixinTests.groovy | 26 + .../grails/test/mixin/RestfulControllerSpec.groovy | 11 + .../rest/render/BaseDomainClassRendererSpec.groovy | 8 + .../web/codecs/HTMLJSCodecIntegrationSpec.groovy | 5 + .../DefaultGrailsApplicationAttributesTests.groovy | 6 + .../web/servlet/FlashScopeWithErrorsTests.groovy | 5 + .../grails/web/util/StreamCharBufferSpec.groovy | 5 + .../org/grails/web/util/WebUtilsTests.groovy | 5 + grails-test-suite-web/build.gradle | 2 +- .../grails/rest/web/RespondMethodSpec.groovy | 20 + .../org/grails/compiler/web/WithFormatSpec.groovy | 11 + .../rest/render/xml/DefaultXmlRendererSpec.groovy | 5 + ...ngHelperDomainClassSpecialPropertiesSpec.groovy | 9 + .../web/binding/JSONBindingToNullSpec.groovy | 23 +- .../JsonBindingWithExceptionHandlerSpec.groovy | 24 + .../commandobjects/CommandObjectNoDataSpec.groovy | 27 + .../CommandObjectNullabilitySpec.groovy | 26 + .../web/commandobjects/CommandObjectsSpec.groovy | 29 + .../web/controllers/ContentNegotiationSpec.groovy | 16 + .../metaclass/CollectionBindDataMethodSpec.groovy | 11 + .../web/mime/ContentFormatControllerTests.groovy | 10 + .../web/mime/WithFormatContentTypeSpec.groovy | 16 + grails-testing-support-core/build.gradle | 2 +- .../groovy/grails/testing/spock/OnceBefore.groovy | 2 - grails-testing-support-datamapping/build.gradle | 2 +- grails-testing-support-dbcleanup-core/README.md | 137 +++ .../build.gradle | 20 +- .../cleanup/core/ApplicationContextResolver.groovy | 50 + .../testing/cleanup/core/DatabaseCleaner.groovy | 91 ++ .../testing/cleanup/core/DatabaseCleanup.groovy | 127 +++ .../cleanup/core/DatabaseCleanupContext.groovy | 220 ++++ .../cleanup/core/DatabaseCleanupExtension.groovy | 235 ++++ .../cleanup/core/DatabaseCleanupInterceptor.groovy | 210 ++++ .../cleanup/core/DatabaseCleanupStats.groovy | 200 ++++ .../cleanup/core/DatasourceCleanupMapping.groovy | 156 +++ .../core/DefaultApplicationContextResolver.groovy | 67 ++ .../cleanup/core/TestContextHolderListener.groovy | 59 + ...ockframework.runtime.extension.IGlobalExtension | 1 + .../src/main/resources/META-INF/spring.factories | 1 + .../cleanup/core/DatabaseCleanupContextSpec.groovy | 478 ++++++++ .../core/DatabaseCleanupExtensionSpec.groovy | 446 ++++++++ .../core/DatabaseCleanupInterceptorSpec.groovy | 678 ++++++++++++ .../cleanup/core/DatabaseCleanupStatsSpec.groovy | 297 +++++ .../core/DatasourceCleanupMappingSpec.groovy | 175 +++ .../DefaultApplicationContextResolverSpec.groovy | 96 ++ grails-testing-support-dbcleanup-h2/README.md | 28 + .../build.gradle | 30 +- .../testing/cleanup/h2/H2DatabaseCleaner.groovy | 103 ++ .../cleanup/h2/H2DatabaseCleanupHelper.groovy | 121 ++ ...che.grails.testing.cleanup.core.DatabaseCleaner | 1 + .../cleanup/h2/H2DatabaseCleanerSpec.groovy | 229 ++++ .../cleanup/h2/H2DatabaseCleanupHelperSpec.groovy | 137 +++ .../README.md | 32 + .../build.gradle | 38 +- .../postgresql/PostgresDatabaseCleaner.groovy | 132 +++ .../PostgresDatabaseCleanupHelper.groovy | 100 ++ .../postgresql/PostgresContainerHolder.groovy | 66 ++ .../PostgresDatabaseCleanerFunctionalSpec.groovy | 318 ++++++ .../postgresql/PostgresDatabaseCleanerSpec.groovy | 114 ++ .../PostgresDatabaseCleanupHelperSpec.groovy | 83 ++ grails-testing-support-http-client/README.md | 201 ++++ .../build.gradle | 32 +- .../testing/http/client/HttpClientSupport.groovy | 1169 ++++++++++++++++++++ .../testing/http/client/MultipartBody.groovy | 191 ++++ .../testing/http/client/TestHttpResponse.groovy | 994 +++++++++++++++++ .../testing/http/client/utils/JsonUtils.groovy | 276 +++++ .../testing/http/client/utils/XmlUtils.groovy | 241 ++++ .../http/client/HttpClientSupportSpec.groovy | 1165 +++++++++++++++++++ .../testing/http/client/MultipartBodySpec.groovy | 67 ++ .../http/client/TestHttpResponseSpec.groovy | 542 +++++++++ .../testing/http/client/utils/JsonUtilsSpec.groovy | 159 +++ .../testing/http/client/utils/XmlUtilsSpec.groovy | 329 ++++++ grails-testing-support-mongodb/build.gradle | 2 +- grails-testing-support-views-gson/build.gradle | 2 +- grails-testing-support-web/build.gradle | 2 +- .../grails/testing/web/UrlMappingsUnitTest.groovy | 10 + grails-url-mappings/build.gradle | 2 +- grails-validation/build.gradle | 2 +- .../grails/validation/ConstrainedDelegate.groovy | 7 + .../groovy/grails/validation/Validateable.groovy | 13 + .../CommandObjectConstraintGettersSpec.groovy | 40 + .../DefaultASTValidateableHelperSpec.groovy | 9 + .../validation/SerializableValidateableSpec.groovy | 24 + .../grails/validation/ValidateableMockSpec.groovy | 24 + .../validation/ValidateableTraitAdHocSpec.groovy | 14 + .../grails/validation/ValidateableTraitSpec.groovy | 14 + grails-views-core/build.gradle | 2 +- grails-views-gson/build.gradle | 2 +- .../plugin/json/builder/DefaultJsonGenerator.java | 542 +-------- .../grails/plugin/json/builder/JsonGenerator.java | 270 +---- .../grails/plugin/json/builder/JsonOutput.java | 268 +---- .../plugin/json/builder/StreamingJsonBuilder.java | 800 +------------- .../json/converters/InstantJsonConverter.groovy | 3 +- .../json/converters/LocalDateJsonConverter.groovy | 3 +- .../converters/LocalDateTimeJsonConverter.groovy | 3 +- .../json/converters/LocalTimeJsonConverter.groovy | 3 +- .../converters/OffsetDateTimeJsonConverter.groovy | 3 +- .../json/converters/OffsetTimeJsonConverter.groovy | 3 +- .../json/converters/PeriodJsonConverter.groovy | 3 +- .../converters/ZonedDateTimeJsonConverter.groovy | 3 +- .../plugin/json/view/JsonViewTemplateEngine.groovy | 30 +- .../plugin/json/view/JsonViewWritableScript.groovy | 67 +- .../json/view/api/GrailsJsonViewHelper.groovy | 18 +- .../plugin/json/view/api/HalViewHelper.groovy | 18 +- .../grails/plugin/json/view/api/JsonView.groovy | 38 +- .../internal/DefaultGrailsJsonViewHelper.groovy | 94 +- .../view/api/internal/DefaultHalViewHelper.groovy | 134 +-- .../api/internal/DefaultJsonApiViewHelper.groovy | 11 +- .../view/api/internal/DefaultJsonViewHelper.groovy | 3 +- .../JsonTemplateTypeCheckingExtension.groovy | 9 +- .../json/view/template/JsonViewTemplate.groovy | 23 +- .../grails/plugin/json/view/api/JsonApiSpec.groovy | 21 + grails-views-markup/build.gradle | 2 +- grails-web-boot/build.gradle | 2 +- grails-web-common/build.gradle | 2 +- grails-web-core/build.gradle | 2 +- .../context/GrailsWebApplicationContext.java | 4 + .../web/servlet/context/GrailsConfigUtils.java | 3 +- grails-web-databinding/build.gradle | 2 +- grails-web-mvc/build.gradle | 2 +- grails-web-url-mappings/build.gradle | 2 +- .../groovy/grails/web/mapping/UrlMappingData.java | 10 + .../grails/web/mapping/DefaultUrlMappingData.java | 8 + .../org/grails/web/mapping/RegexUrlMapping.java | 24 +- .../mvc/AbstractGrailsControllerUrlMappings.groovy | 12 +- .../reporting/UrlMappingsReportCommand.groovy | 21 +- .../resources/META-INF/services/grails.factories | 1 - .../UrlMappingsWithGreedyExtensionSpec.groovy | 203 ++++ .../LinkGeneratorWithUrlMappingsSpec.groovy | 13 + .../web/mapping/RestfulUrlMappingSpec.groovy | 6 + .../mapping/UrlMappingsWithHttpMethodSpec.groovy | 6 + .../web/mapping/mvc/EncodePathFromURISpec.groovy | 5 + grails-wrapper/build.gradle | 2 +- ...pe.java => GrailsReleaseNotFoundException.java} | 29 +- .../main/java/grails/init/GrailsReleaseType.java | 4 +- .../src/main/java/grails/init/GrailsUpdater.java | 82 +- .../src/main/java/grails/init/GrailsVersion.java | 26 +- .../main/java/grails/init/GrailsWrapperHome.java | 31 +- .../main/java/grails/init/GrailsWrapperRepo.java | 54 +- .../main/java/grails/init/RootMetadataHandler.java | 2 +- settings.gradle | 100 +- 1233 files changed, 66286 insertions(+), 9204 deletions(-) diff --cc dependencies.gradle index 735aa33ec9,ecbbca0f2e..cf32aed8f2 --- a/dependencies.gradle +++ b/dependencies.gradle @@@ -37,8 -37,7 +37,7 @@@ ext 'jna.version' : '5.17.0', 'jquery.version' : '3.7.1', 'objenesis.version' : '3.4', - 'gradle-spock.version' : '2.3-groovy-3.0', - 'spring-boot.version' : '3.5.11', + 'spring-boot.version' : '4.0.1', ] // Note: the name of the dependency must be the prefix of the property name so properties in the pom are resolved correctly diff --cc grails-core/src/main/groovy/org/grails/compiler/injection/ApplicationClassInjector.groovy index 094826672f,9279072fb6..aba6d87fe8 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/ApplicationClassInjector.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/ApplicationClassInjector.groovy @@@ -64,9 -64,30 +64,30 @@@ class ApplicationClassInjector implemen public static final List<String> EXCLUDED_AUTO_CONFIGURE_CLASSES = [ 'org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration', 'org.springframework.boot.autoconfigure.reactor.ReactorAutoConfiguration', - 'org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration' + 'org.springframework.boot.hibernate.autoconfigure.HibernateJpaAutoConfiguration' ] + /** + * Auto-configuration classes that are conditionally excluded when + * a specific plugin is detected on the classpath. Each entry maps a + * plugin class (checked via {@link ClassUtils#isPresent}) to the + * auto-configuration class name to exclude, with an optional system + * property that can disable the exclusion. + * + * <p>The system property defaults to {@code "true"} (exclusion enabled). + * Set it to {@code "false"} in {@code gradle.properties} to opt out:</p> + * <pre> + * systemProp.grails.autoconfigure.exclude.liquibase=false + * </pre> + */ + static final List<Map<String, String>> CONDITIONAL_EXCLUSIONS = [ + [ + pluginClass: 'org.grails.plugins.databasemigration.DatabaseMigrationGrailsPlugin', + excludeClass: 'org.springframework.boot.autoconfigure.liquibase.LiquibaseAutoConfiguration', + systemProperty: 'grails.autoconfigure.exclude.liquibase' + ] + ] + ApplicationArtefactHandler applicationArtefactHandler = new ApplicationArtefactHandler() private static final List<Integer> transformedInstances = [] diff --cc grails-data-hibernate5/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java index 8057983f69,522ae45193..a4972c5924 --- a/grails-data-hibernate5/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java +++ b/grails-data-hibernate5/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java @@@ -36,8 -38,10 +38,9 @@@ import org.hibernate.sql.JoinType import org.hibernate.type.StandardBasicTypes; import org.hibernate.type.Type; -import org.springframework.orm.hibernate5.SessionHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; + import org.grails.datastore.gorm.query.criteria.AbstractDetachedCriteria; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.query.api.QueryableCriteria; import org.grails.orm.hibernate.GrailsHibernateTemplate; diff --cc grails-data-hibernate5/core/src/test/groovy/org/apache/grails/data/hibernate5/core/GrailsDataHibernate5TckManager.groovy index 6cbf6c35c7,d8666d9414..e71e88bd59 --- a/grails-data-hibernate5/core/src/test/groovy/org/apache/grails/data/hibernate5/core/GrailsDataHibernate5TckManager.groovy +++ b/grails-data-hibernate5/core/src/test/groovy/org/apache/grails/data/hibernate5/core/GrailsDataHibernate5TckManager.groovy @@@ -28,12 -28,15 +28,15 @@@ import org.grails.datastore.mapping.cor import org.grails.orm.hibernate.GrailsHibernateTransactionManager import org.grails.orm.hibernate.HibernateDatastore import org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration + import org.grails.datastore.mapping.multitenancy.MultiTenancySettings + import org.grails.datastore.mapping.multitenancy.resolvers.SystemPropertyTenantResolver import org.h2.Driver import org.hibernate.SessionFactory + import org.hibernate.dialect.H2Dialect import org.springframework.beans.factory.DisposableBean import org.springframework.context.ApplicationContext -import org.springframework.orm.hibernate5.SessionFactoryUtils -import org.springframework.orm.hibernate5.SessionHolder +import org.grails.orm.hibernate.support.hibernate5.SessionFactoryUtils +import org.grails.orm.hibernate.support.hibernate5.SessionHolder import org.springframework.transaction.TransactionStatus import org.springframework.transaction.support.DefaultTransactionDefinition import org.springframework.transaction.support.TransactionSynchronizationManager diff --cc grails-data-hibernate5/core/src/test/groovy/org/grails/orm/hibernate/connections/SchemaMultiTenantSpec.groovy index ad2d8ebc78,701700e0f0..599181c7fa --- a/grails-data-hibernate5/core/src/test/groovy/org/grails/orm/hibernate/connections/SchemaMultiTenantSpec.groovy +++ b/grails-data-hibernate5/core/src/test/groovy/org/grails/orm/hibernate/connections/SchemaMultiTenantSpec.groovy @@@ -27,9 -27,10 +27,10 @@@ import org.grails.orm.hibernate.Hiberna import org.hibernate.Session import org.hibernate.dialect.H2Dialect import org.hibernate.resource.jdbc.spi.JdbcSessionOwner -import org.springframework.orm.hibernate5.SessionHolder +import org.grails.orm.hibernate.support.hibernate5.SessionHolder import org.springframework.transaction.support.TransactionSynchronizationManager import spock.lang.AutoCleanup + import spock.util.environment.RestoreSystemProperties import spock.lang.Shared import spock.lang.Specification diff --cc grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java index 719461c9ce,782e1710a6..6c7facb331 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java @@@ -27,13 -34,18 +31,20 @@@ import org.springframework.transaction. import org.springframework.ui.ModelMap; import org.springframework.web.context.request.WebRequest; + import org.grails.datastore.mapping.core.connections.ConnectionSource; import org.grails.orm.hibernate.AbstractHibernateDatastore; + import org.grails.orm.hibernate.HibernateDatastore; + import org.grails.orm.hibernate.connections.HibernateConnectionSourceSettings; +import org.grails.orm.hibernate.support.hibernate5.SessionHolder; +import org.grails.orm.hibernate.support.hibernate5.support.OpenSessionInViewInterceptor; /** - * Extends the default spring OSIV and doesn't flush the session if it has been set - * to MANUAL on the session itself. + * Extends the default Spring OSIV to support multiple datasources. + * <p> + * The default datasource's SessionFactory is managed by the parent class. + * Additional (non-default) datasource SessionFactories are managed by this + * subclass, which opens and closes sessions for each one alongside the + * default session. * * @author Graeme Rocher * @since 0.5 diff --cc grails-spring/build.gradle index 875378a531,21322cb0cd..df049dc440 --- a/grails-spring/build.gradle +++ b/grails-spring/build.gradle @@@ -60,11 -61,5 +61,10 @@@ dependencies } apply { - from rootProject.layout.projectDirectory.file('gradle/code-style-config.gradle') from rootProject.layout.projectDirectory.file('gradle/docs-config.gradle') +} + +// Exclude copied Spring Framework theme classes from checkstyle (deprecated legacy code from Spring 6.x) +tasks.named('checkstyleMain') { + exclude '**/org/springframework/ui/**' }
