You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by as...@apache.org on 2026/09/02 18:01:13 UTC
(grails-website) branch asf-site-production updated: Deploying to documentation branch - 18:00:52
This is an automated email from the ASF dual-hosted git repository.
asf-ci-deploy pushed a commit to branch asf-site-production
in repository https://gitbox.apache.org/repos/asf/grails-website.git
The following commit(s) were added to refs/heads/asf-site-production by this push:
new 49e97a8c155 Deploying to documentation branch - 18:00:52
49e97a8c155 is described below
commit 49e97a8c1556ad82af9966572e6a1515db3ca3d7
Author: jdaugherty <jd...@users.noreply.github.com>
AuthorDate: Wed Sep 2 18:00:56 2026 +0000
Deploying to documentation branch - 18:00:52
---
docs/snapshot/api/allclasses-frame.html | 2 +
.../api/grails/util/AbstractTypeConvertingMap.html | 17 ++
.../grails/web/servlet/mvc/GrailsParameterMap.html | 52 +++---
docs/snapshot/api/index-all.html | 35 +++-
.../org/apache/grails/buildsrc/CompilePlugin.html | 62 ++++++-
...on.html => AutoConfigurationImportsWriter.html} | 205 +++++++++++----------
.../beans/GrailsBeansASTTransformation.html | 55 +++++-
.../org/grails/compiler/beans/package-frame.html | 2 +-
.../org/grails/compiler/beans/package-summary.html | 9 +
.../AutoConfigurationImportsCompileInput.html} | 112 +++++++----
.../grails/gradle/plugin/core/package-frame.html | 2 +-
.../grails/gradle/plugin/core/package-summary.html | 8 +
.../org/grails/taglib/GroovyPageAttributes.html | 14 +-
.../developer-manual/gettingStarted.html | 2 +-
.../grails-data/developer-manual/introduction.html | 2 +-
.../grails-data/developer-manual/stepByStep.html | 2 +-
.../grails-data/developer-manual/testing.html | 2 +-
.../developer-manual/understandingApi.html | 2 +-
.../understandingApi/datastoreBasics.html | 2 +-
.../understandingApi/gormApis.html | 2 +-
.../understandingApi/gormEnhancer.html | 2 +-
.../understandingApi/implementingCrud.html | 2 +-
.../understandingApi/implementingQueries.html | 2 +-
.../understandingApi/secondaryIndexes.html | 2 +-
.../grails-data/whats-new-manual/index.html | 2 +-
docs/snapshot/guide/async.html | 2 +-
docs/snapshot/guide/introduction.html | 15 ++
docs/snapshot/guide/plugins.html | 11 +-
docs/snapshot/guide/single.html | 116 +++++++++++-
docs/snapshot/guide/spring.html | 2 +-
docs/snapshot/guide/upgrading.html | 86 +++++++++
31 files changed, 626 insertions(+), 205 deletions(-)
diff --git a/docs/snapshot/api/allclasses-frame.html b/docs/snapshot/api/allclasses-frame.html
index 8ced4b5b974..cc23ce82968 100644
--- a/docs/snapshot/api/allclasses-frame.html
+++ b/docs/snapshot/api/allclasses-frame.html
@@ -292,7 +292,9 @@
<li><a href="org/springframework/security/access/vote/AuthenticatedVoter.html" title="class in org.springframework.security.access.vote" target="classFrame">AuthenticatedVoter</a></li>
<li><a href="grails/plugin/springsecurity/annotation/Authorities.html" title="annotation type in grails.plugin.springsecurity.annotation" target="classFrame">Authorities</a></li>
<li><a href="grails/plugin/springsecurity/annotation/AuthoritiesTransformation.html" title="class in grails.plugin.springsecurity.annotation" target="classFrame">AuthoritiesTransformation</a></li>
+<li><a href="org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html" title="class in org.grails.gradle.plugin.core" target="classFrame">AutoConfigurationImportsCompileInput</a></li>
<li><a href="org/apache/grails/buildsrc/AutoConfigurationImportsPlugin.html" title="class in org.apache.grails.buildsrc" target="classFrame">AutoConfigurationImportsPlugin</a></li>
+<li><a href="org/grails/compiler/beans/AutoConfigurationImportsWriter.html" title="class in org.grails.compiler.beans" target="classFrame">AutoConfigurationImportsWriter</a></li>
<li><a href="org/apache/grails/testing/mongo/AutoStartedMongoSpec.html" title="class in org.apache.grails.testing.mongo" target="classFrame">AutoStartedMongoSpec</a></li>
<li><a href="org/grails/datastore/gorm/events/AutoTimestampEventListener.html" title="class in org.grails.datastore.gorm.events" target="classFrame">AutoTimestampEventListener</a></li>
<li><a href="org/grails/datastore/gorm/events/AutoTimestampEventListener.TimestampSuppression.html" title="class in org.grails.datastore.gorm.events.AutoTimestampEventListener" target="classFrame">AutoTimestampEventListener.TimestampSuppression</a></li>
diff --git a/docs/snapshot/api/grails/util/AbstractTypeConvertingMap.html b/docs/snapshot/api/grails/util/AbstractTypeConvertingMap.html
index fd0ca5c6c28..092d5c97308 100644
--- a/docs/snapshot/api/grails/util/AbstractTypeConvertingMap.html
+++ b/docs/snapshot/api/grails/util/AbstractTypeConvertingMap.html
@@ -115,6 +115,23 @@ implements java.util.Map, java.lang.Cloneable</pre>
Type converting maps have no inherent ordering. Two maps with identical entries
but arranged in a different order internally are considered equal.
+
+ <h2>Subclasses must not declare JavaBean accessors</h2>
+
+ A subclass must not declare a no-argument <CODE>getX()</CODE> or <CODE>isX()</CODE> method, because this
+ class implements java.util.Map and Groovy resolves a JavaBean accessor ahead of the map entry of
+ the same name. Such an accessor makes the entry <CODE>x</CODE> unreadable through
+ <CODE>map.x</CODE> and <CODE>map['x']</CODE>, and makes assignment to it fail with
+ <CODE>ReadOnlyPropertyException</CODE>. It applies to statically compiled callers too: the static
+ compiler binds to the declared accessor and never reaches <CODE>getProperty</CODE>/<CODE>setProperty</CODE>,
+ so the collision cannot be worked around at runtime.
+
+ Expose such a value under a name that is not a JavaBean accessor - for example
+ <CODE>GrailsParameterMap.request()</CODE> - or under a method that takes an argument.
+
+ A setter is a weaker case and is allowed: it leaves reads addressing the map, but assignment to
+ that one name invokes the setter instead of storing an entry, so such an entry must be written
+ with java.util.Map#put. <CODE>GroovyPageAttributes.setGspTagSyntaxCall(boolean)</CODE> is the only one.
<DL><DT><B>Authors:</B></DT><DD>Graeme Rocher</DD><DD>Lari Hotari</DD></DL><DL><DT><B>Since:</B></DT><DD>1.2</DD></DL></p>
</li>
diff --git a/docs/snapshot/api/grails/web/servlet/mvc/GrailsParameterMap.html b/docs/snapshot/api/grails/web/servlet/mvc/GrailsParameterMap.html
index 0bd622d438b..8a8dd038e1d 100644
--- a/docs/snapshot/api/grails/web/servlet/mvc/GrailsParameterMap.html
+++ b/docs/snapshot/api/grails/web/servlet/mvc/GrailsParameterMap.html
@@ -250,18 +250,6 @@ implements java.lang.Cloneable</pre>
<td class="colLast"><code><strong><a href="#getDate(java.lang.String)">getDate</a></strong>(java.lang.String name)</code><br>Obtains a date for the parameter name using the default format</td>
</tr>
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>public java.lang.Object</code></td>
- <td class="colLast"><code><strong><a href="#getIdentifier()">getIdentifier</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>The identifier in the request</DD></DL></td>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>public <a href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a></code></td>
- <td class="colLast"><code><strong><a href="#getRequest()">getRequest</a></strong>()</code><br> <DL><DT><B>Returns:</B></DT><DD>Returns the request.</DD></DL></td>
- </tr>
-
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public java.lang.Object</code></td>
@@ -281,12 +269,18 @@ implements java.lang.Cloneable</pre>
</tr>
<tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>public <a href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a></code></td>
+ <td class="colLast"><code><strong><a href="#request()">request</a></strong>()</code><br>Returns the request this map was populated from.</td>
+ </tr>
+
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public java.lang.String</code></td>
<td class="colLast"><code><strong><a href="#toQueryString()">toQueryString</a></strong>()</code><br>Converts this parameter map into a query String. </td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected void</code></td>
<td class="colLast"><code><strong><a href="#updateNestedKeys(java.util.Map)">updateNestedKeys</a></strong>(java.util.Map keys)</code><br></td>
@@ -436,24 +430,6 @@ implements java.lang.Cloneable</pre>
</li>
</ul>
- <a name="getIdentifier()"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public java.lang.Object <strong>getIdentifier</strong>()</h4>
- <p>
- <DL><DT><B>Returns:</B></DT><DD>The identifier in the request</DD></DL></p>
- </li>
- </ul>
-
- <a name="getRequest()"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public <a href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a> <strong>getRequest</strong>()</h4>
- <p>
- <DL><DT><B>Returns:</B></DT><DD>Returns the request.</DD></DL></p>
- </li>
- </ul>
-
<a name="put(java.lang.Object, java.lang.Object)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -478,6 +454,20 @@ implements java.lang.Cloneable</pre>
</li>
</ul>
+ <a name="request()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public <a href='../../../../jakarta.servlet.http.HttpServletRequest.html'>HttpServletRequest</a> <strong>request</strong>()</h4>
+ <p> Returns the request this map was populated from.
+
+ <p>Deliberately not named <CODE>getRequest()</CODE>. This class implements java.util.Map, and a
+ JavaBean accessor on a map shadows the map entry of the same name, which made a request
+ parameter named <CODE>request</CODE> unreadable and unwritable. See
+ <a href='../../../../grails/util/AbstractTypeConvertingMap.html' title='AbstractTypeConvertingMap'>AbstractTypeConvertingMap</a> for the rule.
+ <DL><DT><B>Returns:</B></DT><DD>the request, never <CODE>null</CODE> for a map created from a request</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0</DD></DL></p>
+ </li>
+ </ul>
+
<a name="toQueryString()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index 02b5085aedb..6b48628c191 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -3414,6 +3414,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/core/artefact/ApplicationArtefactHandler.html#AUTO_CONFIGURATION_CLASS_NODE" title="Field in ApplicationArtefactHandler">AUTO_CONFIGURATION_CLASS_NODE</a></span> - Field in <a href="org/grails/core/artefact/ApplicationArtefactHandler.html">ApplicationArtefactHandler</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/apache/grails/buildsrc/CompilePlugin.html#AUTO_CONFIGURATION_IMPORTS_PATH" title="Property in CompilePlugin">AUTO_CONFIGURATION_IMPORTS_PATH</a></span> - Property in <a href="org/apache/grails/buildsrc/CompilePlugin.html">CompilePlugin</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/query/GrailsQueryFlushMode.html#AUTO" title="Enum Constant in GrailsQueryFlushMode">AUTO</a></span> - Enum Constant in <a href="org/grails/orm/hibernate/query/GrailsQueryFlushMode.html">GrailsQueryFlushMode</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/config/Settings.html#AUTO_GROW_COLLECTION_LIMIT" title="Field in Settings">AUTO_GROW_COLLECTION_LIMIT</a></span> - Field in <a href="grails/config/Settings.html">Settings</a>
@@ -3432,12 +3434,19 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/SpringSecurityBeanFactoryPostProcessor.html#AUTOCONFIG_NAME" title="Field in SpringSecurityBeanFactoryPostProcessor">AUTOCONFIG_NAME</a></span> - Field in <a href="grails/plugin/springsecurity/SpringSecurityBeanFactoryPostProcessor.html">SpringSecurityBeanFactoryPostProcessor</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html" title="Class in org.grails.gradle.plugin.core">AutoConfigurationImportsCompileInput</a></span> - Class in <a href="./org/grails/gradle/plugin/core/package-summary.html">org.grails.gradle.plugin.core</a>
+</dt><dd><div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html#AutoConfigurationImportsCompileInput()" title="Constructor in AutoConfigurationImportsCompileInput">AutoConfigurationImportsCompileInput()</a></span> - Constructor in <a href="org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html">AutoConfigurationImportsCompileInput</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/buildsrc/AutoConfigurationImportsPlugin.html" title="Class in org.apache.grails.buildsrc">AutoConfigurationImportsPlugin</a></span> - Class in <a href="./org/apache/grails/buildsrc/package-summary.html">org.apache.grails.buildsrc</a>
</dt><dd><div class="block">Convention plugin that wires <a href='../../../../org/apache/grails/buildsrc/GenerateAutoConfigurationImportsTask.html' title='GenerateAutoConfigurationImportsTask'>GenerateAutoConfigurationImportsTask</a> into the <CODE>main</CODE>
source set's output, so a module authoring <CODE>@AutoConfiguration</CODE> classes never has to
hand-maintain <CODE>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</CODE>.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/buildsrc/AutoConfigurationImportsPlugin.html#AutoConfigurationImportsPlugin()" title="Constructor in AutoConfigurationImportsPlugin">AutoConfigurationImportsPlugin()</a></span> - Constructor in <a href="org/apache/grails/buildsrc/AutoConfigurationImportsPlugin.html">AutoConfigurationImportsPlugin</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/compiler/beans/AutoConfigurationImportsWriter.html" title="Class in org.grails.compiler.beans">AutoConfigurationImportsWriter</a></span> - Class in <a href="./org/grails/compiler/beans/package-summary.html">org.grails.compiler.beans</a>
+</dt><dd><div class="block">Registers a generated auto-configuration in
+ <CODE>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</CODE>.</div></dd>
<dt><span class="strong"><a href="grails/compiler/beans/GrailsBeans.html#autoConfigurationName" title="Field in GrailsBeans">autoConfigurationName</a></span> - Field in <a href="grails/compiler/beans/GrailsBeans.html">GrailsBeans</a>
</dt><dd> <div class="block">The name of the generated sibling class, for a <CODE>grails.plugins.Plugin</CODE> subclass. </div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/bom/BomPropertyOverridesExtension.html#autoDetect" title="Property in BomPropertyOverridesExtension">autoDetect</a></span> - Property in <a href="org/grails/gradle/plugin/bom/BomPropertyOverridesExtension.html">BomPropertyOverridesExtension</a>
@@ -22135,8 +22144,6 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Obtain the identifier</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/reflect/FieldEntityAccess.html#getIdentifier()" title="Method in FieldEntityAccess">getIdentifier()</a></span> - Method in <a href="org/grails/datastore/mapping/reflect/FieldEntityAccess.html">FieldEntityAccess</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="grails/web/servlet/mvc/GrailsParameterMap.html#getIdentifier()" title="Method in GrailsParameterMap">getIdentifier()</a></span> - Method in <a href="grails/web/servlet/mvc/GrailsParameterMap.html">GrailsParameterMap</a>
-</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The identifier in the request</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/proxy/GroovyProxyFactory.html#getIdentifier(java.lang.Object)" title="Method in GroovyProxyFactory">getIdentifier(java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/gorm/proxy/GroovyProxyFactory.html">GroovyProxyFactory</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/proxy/GroovyProxyInterceptorLogic.html#getIdentifier(java.lang.Object)" title="Method in GroovyProxyInterceptorLogic">getIdentifier(java.lang.Object)</a></span> - Method in <a href="org/grails/orm/hibernate/proxy/GroovyProxyInterceptorLogic.html">GroovyProxyInterceptorLogic</a>
@@ -25509,8 +25516,6 @@ if (location.href.indexOf('is-external=true') == -1) {
resolve dependencies.</div></dd>
<dt><span class="strong"><a href="org/grails/cli/command/options/OptionSetGroovyCompilerConfiguration.html#getRepositoryConfiguration()" title="Method in OptionSetGroovyCompilerConfiguration">getRepositoryConfiguration()</a></span> - Method in <a href="org/grails/cli/command/options/OptionSetGroovyCompilerConfiguration.html">OptionSetGroovyCompilerConfiguration</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="grails/web/servlet/mvc/GrailsParameterMap.html#getRequest()" title="Method in GrailsParameterMap">getRequest()</a></span> - Method in <a href="grails/web/servlet/mvc/GrailsParameterMap.html">GrailsParameterMap</a>
-</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Returns the request.</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/web/servlet/GrailsRequestContext.html#getRequest()" title="Method in GrailsRequestContext">getRequest()</a></span> - Method in <a href="org/grails/web/servlet/GrailsRequestContext.html">GrailsRequestContext</a>
</dt><dd> <div class="block">The request object.</div></dd>
<dt><span class="strong"><a href="grails/testing/web/GrailsWebUnitTest.html#getRequest()" title="Method in GrailsWebUnitTest">getRequest()</a></span> - Method in <a href="grails/testing/web/GrailsWebUnitTest.html">GrailsWebUnitTest</a>
@@ -29542,6 +29547,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd><div class="block"></div></dd>
<dt><span class="strong"><a href="grails/doc/macros/GspTagSourceMacro.html#GspTagSourceMacro(java.lang.Object)" title="Constructor in GspTagSourceMacro">GspTagSourceMacro(java.lang.Object)</a></span> - Constructor in <a href="grails/doc/macros/GspTagSourceMacro.html">GspTagSourceMacro</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/taglib/GroovyPageAttributes.html#gspTagSyntaxCall()" title="Method in GroovyPageAttributes">gspTagSyntaxCall()</a></span> - Method in <a href="org/grails/taglib/GroovyPageAttributes.html">GroovyPageAttributes</a>
+</dt><dd> <div class="block">Whether the tag was invoked with GSP tag syntax rather than as a method call.</div></dd>
<dt><span class="strong"><a href="grails/gsp/boot/GspAutoConfiguration.GspViewResolverConfiguration.html#gspViewResolver(org.grails.gsp.GroovyPagesTemplateEngine, org.grails.web.gsp.io.GrailsConventionGroovyPageLocator)" title="Method in GspAutoConfiguration.GspViewResolverConfiguration">gspViewResolver(org.grails.gsp.GroovyPagesTemplateEngine, org.grails.web.gsp.io.GrailsConventionGroovyPageLocator)</a></span> - Method in <a href="grails/gsp/boot/GspAutoConfiguration.GspViewResolverConf [...]
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GSPWriter.html" title="Class in org.grails.gsp.compiler">GSPWriter</a></span> - Class in <a href="./org/grails/gsp/compiler/package-summary.html">org.grails.gsp.compiler</a>
@@ -31634,6 +31641,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsExtension.html#importJavaTime" title="Property in GrailsExtension">importJavaTime</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsExtension.html">GrailsExtension</a>
</dt><dd> <div class="block">Whether java.time.* package should be a default import package</div></dd>
+<dt><span class="strong"><a href="org/grails/compiler/beans/AutoConfigurationImportsWriter.html#IMPORTS_LOCATION" title="Field in AutoConfigurationImportsWriter">IMPORTS_LOCATION</a></span> - Field in <a href="org/grails/compiler/beans/AutoConfigurationImportsWriter.html">AutoConfigurationImportsWriter</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/buildsrc/GenerateAutoConfigurationImportsTask.html#IMPORTS_RESOURCE_PATH" title="Property in GenerateAutoConfigurationImportsTask">IMPORTS_RESOURCE_PATH</a></span> - Property in <a href="org/apache/grails/buildsrc/GenerateAutoConfigurationImportsTask.html">GenerateAutoConfigurationImportsTask</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.html#in(java.lang.String, java.lang.Object)" title="Method in AbstractCriteriaBuilder">in(java.lang.String, java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.html">AbstractCriteriaBuilder</a>
@@ -33978,8 +33987,6 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Whether the given type is a Groovy object</div></dd>
<dt><span class="strong"><a href="org/apache/grails/web/layout/GrailsPageResponseWrapper.html#isGspGrailsLayoutActive()" title="Method in GrailsPageResponseWrapper">isGspGrailsLayoutActive()</a></span> - Method in <a href="org/apache/grails/web/layout/GrailsPageResponseWrapper.html">GrailsPageResponseWrapper</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a href="org/grails/taglib/GroovyPageAttributes.html#isGspTagSyntaxCall()" title="Method in GroovyPageAttributes">isGspTagSyntaxCall()</a></span> - Method in <a href="org/grails/taglib/GroovyPageAttributes.html">GroovyPageAttributes</a>
-</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/compiler/GroovyCompilerConfiguration.html#isGuessDependencies()" title="Method in GroovyCompilerConfiguration">isGuessDependencies()</a></span> - Method in <a href="org/grails/cli/compiler/GroovyCompilerConfiguration.html">GroovyCompilerConfiguration</a>
</dt><dd> <div class="block">Returns if jar dependencies should be guessed.</div></dd>
<dt><span class="strong"><a href="org/grails/cli/command/options/OptionSetGroovyCompilerConfiguration.html#isGuessDependencies()" title="Method in OptionSetGroovyCompilerConfiguration">isGuessDependencies()</a></span> - Method in <a href="org/grails/cli/command/options/OptionSetGroovyCompilerConfiguration.html">OptionSetGroovyCompilerConfiguration</a>
@@ -42390,6 +42397,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd><div class="block">A segment</div></dd>
<dt><span class="strong"><a href="grails/rest/render/errors/AbstractVndErrorRenderer.html#PATH_ATTRIBUTE" title="Field in AbstractVndErrorRenderer">PATH_ATTRIBUTE</a></span> - Field in <a href="grails/rest/render/errors/AbstractVndErrorRenderer.html">AbstractVndErrorRenderer</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html#PATH" title="Property in AutoConfigurationImportsCompileInput">PATH</a></span> - Property in <a href="org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html">AutoConfigurationImportsCompileInput</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/converters/Converter.CircularReferenceBehaviour.html#PATH" title="Enum Constant in Converter.CircularReferenceBehaviour">PATH</a></span> - Enum Constant in <a href="org/grails/web/converters/Converter.CircularReferenceBehaviour.html">Converter.CircularReferenceBehaviour</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/io/DefaultGroovyPageLocator.PluginViewPathInfo.html#path" title="Field in DefaultGroovyPageLocator.PluginViewPathInfo">path</a></span> - Field in <a href="org/grails/gsp/io/DefaultGroovyPageLocator.PluginViewPathInfo.html">DefaultGroovyPageLocator.PluginViewPathInfo</a>
@@ -45414,6 +45423,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/boot/internal/JavaCompiler.html#recompile(org.codehaus.groovy.control.CompilerConfiguration, java.io.File)" title="Method in JavaCompiler">recompile(org.codehaus.groovy.control.CompilerConfiguration, java.io.File)</a></span> - Method in <a href="org/grails/boot/internal/JavaCompiler.html">JavaCompiler</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/compiler/beans/AutoConfigurationImportsWriter.html#reconcile(java.io.File, java.lang.Object, org.codehaus.groovy.control.SourceUnit)" title="Method in AutoConfigurationImportsWriter">reconcile(java.io.File, java.lang.Object, org.codehaus.groovy.control.SourceUnit)</a></span> - Method in <a href="org/grails/compiler/beans/AutoConfigurationImportsWriter.html">AutoConfigurationImportsWriter</a>
+</dt><dd> <div class="block">Drops entries naming classes this module no longer generates, adding none.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/support/AbstractDatastorePersistenceContextInterceptor.html#reconnect()" title="Method in AbstractDatastorePersistenceContextInterceptor">reconnect()</a></span> - Method in <a href="org/grails/datastore/gorm/support/AbstractDatastorePersistenceContextInterceptor.html">AbstractDatastorePersistenceContextInterceptor</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.html#reconnect()" title="Method in AbstractMultipleDataSourceAggregatePersistenceContextInterceptor">reconnect()</a></span> - Method in <a href="org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.html">AbstractMultipleDataSourceAggregatePersistenceContextInterceptor</a>
@@ -45625,6 +45636,11 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Constructs a new RegexUrlMapping for the given pattern, controller name, action name and constraints.</div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/AbstractGormApiRegistry.html#register(java.lang.String, T)" title="Method in AbstractGormApiRegistry">register(java.lang.String, T)</a></span> - Method in <a href="org/grails/datastore/gorm/AbstractGormApiRegistry.html">AbstractGormApiRegistry</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html#register(org.gradle.api.Project, org.gradle.api.tasks.compile.GroovyCompile)" title="Method in AutoConfigurationImportsCompileInput">register(org.gradle.api.Project, org.gradle.api.tasks.compile.GroovyCompile)</a></span> - Method in <a href="org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html">AutoConfigurationImportsCompileInput</a>
+</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/compiler/beans/AutoConfigurationImportsWriter.html#register(java.lang.String, java.io.File, org.codehaus.groovy.control.SourceUnit, java.lang.Object)" title="Method in AutoConfigurationImportsWriter">register(java.lang.String, java.io.File, org.codehaus.groovy.control.SourceUnit, java.lang.Object)</a></span> - Method in <a href="org/grails/compiler/beans/AutoConfigurationImportsWriter.html">AutoConfigurationImportsWriter</a>
+</dt><dd> <div class="block">Adds <CODE>className</CODE> to the generated imports file under <CODE>targetDirectory</CODE>, together
+ with anything an earlier source unit of the same compilation registered there. </div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/model/types/BasicTypeConverterRegistrar.html#register(org.springframework.core.convert.converter.ConverterRegistry)" title="Method in BasicTypeConverterRegistrar">register(org.springframework.core.convert.converter.ConverterRegistry)</a></span> - Method in <a href="org/grails/datastore/mapping/model/types/BasicTypeConverterRegistrar.html">BasicTypeConverterRegistrar</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/ui/strategy/DefaultRegistrationCodeStrategy.html#register(java.lang.Object, java.lang.String)" title="Method in DefaultRegistrationCodeStrategy">register(java.lang.Object, java.lang.String)</a></span> - Method in <a href="grails/plugin/springsecurity/ui/strategy/DefaultRegistrationCodeStrategy.html">DefaultRegistrationCodeStrategy</a>
@@ -45667,6 +45683,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/gsp/boot/StandaloneGrailsApplication.html#registerArtefactHandler(grails.core.ArtefactHandler)" title="Method in StandaloneGrailsApplication">registerArtefactHandler(grails.core.ArtefactHandler)</a></span> - Method in <a href="grails/gsp/boot/StandaloneGrailsApplication.html">StandaloneGrailsApplication</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/apache/grails/buildsrc/CompilePlugin.html#registerAutoConfigurationImportsInput(org.gradle.api.Project, org.gradle.api.tasks.compile.GroovyCompile)" title="Method in CompilePlugin">registerAutoConfigurationImportsInput(org.gradle.api.Project, org.gradle.api.tasks.compile.GroovyCompile)</a></span> - Method in <a href="org/apache/grails/buildsrc/CompilePlugin.html">CompilePlugin</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/gsp/boot/GspAutoConfiguration.ReplaceViewResolverRegistrar.html#registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry)" title="Method in GspAutoConfiguration.ReplaceViewResolverRegistrar">registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry)</a></span> - Method in <a href="grails [...]
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/gsp/boot/GspAutoConfiguration.TagLibraryLookupRegistrar.html#registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry)" title="Method in GspAutoConfiguration.TagLibraryLookupRegistrar">registerBeanDefinitions(org.springframework.core.type.AnnotationMetadata, org.springframework.beans.factory.support.BeanDefinitionRegistry)</a></span> - Method in <a href="grails/gsp/b [...]
@@ -46613,6 +46631,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Retained for binary compatibility. </div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/SecurityFilterPosition.html#REQUEST_CACHE_FILTER" title="Enum Constant in SecurityFilterPosition">REQUEST_CACHE_FILTER</a></span> - Enum Constant in <a href="grails/plugin/springsecurity/SecurityFilterPosition.html">SecurityFilterPosition</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/web/servlet/mvc/GrailsParameterMap.html#request()" title="Method in GrailsParameterMap">request()</a></span> - Method in <a href="grails/web/servlet/mvc/GrailsParameterMap.html">GrailsParameterMap</a>
+</dt><dd> <div class="block">Returns the request this map was populated from.</div></dd>
<dt><span class="strong"><a href="grails/views/api/HttpView.html#request" title="Property in HttpView">request</a></span> - Property in <a href="grails/views/api/HttpView.html">HttpView</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>The request object</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/testing/MockAsyncContext.html#request" title="Property in MockAsyncContext">request</a></span> - Property in <a href="org/grails/plugins/testing/MockAsyncContext.html">MockAsyncContext</a>
@@ -46897,6 +46917,9 @@ if (location.href.indexOf('is-external=true') == -1) {
by inspecting the JDBC connection metadata. </div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/services/implementers/AbstractProjectionImplementer.html#RESOLVED_PROPERTY_NAME" title="Field in AbstractProjectionImplementer">RESOLVED_PROPERTY_NAME</a></span> - Field in <a href="org/grails/datastore/gorm/services/implementers/AbstractProjectionImplementer.html">AbstractProjectionImplementer</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/compiler/beans/GrailsBeansASTTransformation.html#RESOLVED_TARGET_DIRECTORY_METADATA" title="Field in GrailsBeansASTTransformation">RESOLVED_TARGET_DIRECTORY_METADATA</a></span> - Field in <a href="org/grails/compiler/beans/GrailsBeansASTTransformation.html">GrailsBeansASTTransformation</a>
+</dt><dd> <div class="block">Class-node metadata carrying the compilation's output directory, seeded by the global Grails
+ transform. </div></dd>
<dt><span class="strong"><a href="org/grails/transaction/ChainedTransactionManagerPostProcessor.html#resolveDataSourceSuffix(java.lang.String)" title="Method in ChainedTransactionManagerPostProcessor">resolveDataSourceSuffix(java.lang.String)</a></span> - Method in <a href="org/grails/transaction/ChainedTransactionManagerPostProcessor.html">ChainedTransactionManagerPostProcessor</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/ConnectionSourceNameResolver.html#resolveDefaultConnectionSourceName(java.lang.Object)" title="Method in ConnectionSourceNameResolver">resolveDefaultConnectionSourceName(java.lang.Object)</a></span> - Method in <a href="org/grails/datastore/gorm/ConnectionSourceNameResolver.html">ConnectionSourceNameResolver</a>
diff --git a/docs/snapshot/api/org/apache/grails/buildsrc/CompilePlugin.html b/docs/snapshot/api/org/apache/grails/buildsrc/CompilePlugin.html
index 3be5b706263..d961f9565e2 100644
--- a/docs/snapshot/api/org/apache/grails/buildsrc/CompilePlugin.html
+++ b/docs/snapshot/api/org/apache/grails/buildsrc/CompilePlugin.html
@@ -70,11 +70,11 @@ if (location.href.indexOf('is-external=true') == -1) {
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -128,6 +128,28 @@ implements Plugin<Project></pre>
<!-- =========== PROPERTY SUMMARY =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="property_summary"><!-- --></a>
+ <h3>Properties Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Properties Summary table, listing nested classes, and an explanation">
+ <caption><span>Properties</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Type</th>
+ <th class="colLast" scope="col">Name and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#AUTO_CONFIGURATION_IMPORTS_PATH">AUTO_CONFIGURATION_IMPORTS_PATH</a></code><br></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
<!-- =========== ELEMENT SUMMARY =========== -->
@@ -176,6 +198,12 @@ implements Plugin<Project></pre>
<td class="colLast"><code><strong><a href="#apply(org.gradle.api.Project)">apply</a></strong>(<a href='../../../../org.gradle.api.Project.html'>Project</a> project)</code><br></td>
</tr>
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>static void</code></td>
+ <td class="colLast"><code><strong><a href="#registerAutoConfigurationImportsInput(org.gradle.api.Project, org.gradle.api.tasks.compile.GroovyCompile)">registerAutoConfigurationImportsInput</a></strong>(<a href='../../../../org.gradle.api.Project.html'>Project</a> project, <a href='../../../../org.gradle.api.tasks.compile.GroovyCompile.html'>GroovyCompile</a> task)</code><br></td>
+ </tr>
+
</table>
</ul>
</li>
@@ -212,6 +240,24 @@ implements Plugin<Project></pre>
+ <!-- =========== PROPERTY DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="prop_detail">
+ <!-- -->
+ </a>
+ <h3>Property Detail</h3>
+
+ <a name="AUTO_CONFIGURATION_IMPORTS_PATH"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>static final java.lang.String <strong>AUTO_CONFIGURATION_IMPORTS_PATH</strong></h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
@@ -252,6 +298,14 @@ implements Plugin<Project></pre>
</li>
</ul>
+ <a name="registerAutoConfigurationImportsInput(org.gradle.api.Project, org.gradle.api.tasks.compile.GroovyCompile)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>static void <strong>registerAutoConfigurationImportsInput</strong>(<a href='../../../../org.gradle.api.Project.html'>Project</a> project, <a href='../../../../org.gradle.api.tasks.compile.GroovyCompile.html'>GroovyCompile</a> task)</h4>
+ <p></p>
+ </li>
+ </ul>
+
</li>
</ul>
@@ -286,11 +340,11 @@ implements Plugin<Project></pre>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/compiler/beans/GrailsBeansASTTransformation.html b/docs/snapshot/api/org/grails/compiler/beans/AutoConfigurationImportsWriter.html
similarity index 50%
copy from docs/snapshot/api/org/grails/compiler/beans/GrailsBeansASTTransformation.html
copy to docs/snapshot/api/org/grails/compiler/beans/AutoConfigurationImportsWriter.html
index 16b2e8e87f7..96741b91772 100644
--- a/docs/snapshot/api/org/grails/compiler/beans/GrailsBeansASTTransformation.html
+++ b/docs/snapshot/api/org/grails/compiler/beans/AutoConfigurationImportsWriter.html
@@ -27,7 +27,7 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GrailsBeansASTTransformation (Grails 8.0.0-SNAPSHOT)</title>
+ <title>AutoConfigurationImportsWriter (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
@@ -37,7 +37,7 @@
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="GrailsBeansASTTransformation (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="AutoConfigurationImportsWriter (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -63,18 +63,18 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../index.html?org/grails/compiler/beans/GrailsBeansASTTransformation" target="_top">Frames</a></li>
- <li><a href="GrailsBeansASTTransformation.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/compiler/beans/AutoConfigurationImportsWriter" target="_top">Frames</a></li>
+ <li><a href="AutoConfigurationImportsWriter.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field Constructor <li><a href="#method_summary">Method</a></li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field Constructor <li><a href="#method_detail">Method</a></li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -87,95 +87,50 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subTitle">Package: <strong>org.grails.compiler.beans</strong></div>
- <h2 title="[Java] Class GrailsBeansASTTransformation" class="title">[Java] Class GrailsBeansASTTransformation</h2>
+ <h2 title="[Java] Class AutoConfigurationImportsWriter" class="title">[Java] Class AutoConfigurationImportsWriter</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.compiler.beans.GrailsBeansASTTransformation
+<li><ul class="inheritance"></ul></li><li>org.grails.compiler.beans.AutoConfigurationImportsWriter
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
- <dl>
- <dt>All Implemented Interfaces and Traits:</dt>
- <dd>org.codehaus.groovy.transform.ASTTransformation, groovy.transform.CompilationUnitAware</dd>
- </dl>
-
<!-- todo: direct known subclasses -->
<hr>
-<pre>@org.codehaus.groovy.transform.GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION)
-public class GrailsBeansASTTransformation
-extends java.lang.Object
-implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.CompilationUnitAware</pre>
-
- <p> Rewrites the <CODE>beans</CODE> closure DSL on a <a href='../../../../grails/compiler/beans/GrailsBeans.html' title='GrailsBeans'>GrailsBeans</a>-annotated
- class into real <CODE>@Bean</CODE> factory methods, at compile time.
-
- <p>Recognises three kinds of top-level statement inside the <CODE>beans</CODE> closure:
- <ul>
- <li><CODE>bean(["name", ] Type) { ... </CODE>}, optionally chained with any combination of
- <CODE>.conditionalOnMissingBean(...)</CODE> (positional types, named annotation attributes, or bare),
- <CODE>.conditionalOnMissingBeanName(...)</CODE> (backs off by this bean's own name, set
- automatically), <CODE>.primary()</CODE>, <CODE>.lazy()</CODE>,
- <CODE>.scope("name")</CODE>, <CODE>.staticMethod()</CODE> (a static factory method, for
- <CODE>BeanFactoryPostProcessor</CODE>/<CODE>BeanPostProcessor</CODE> beans), and (repeatably)
- <CODE>.annotate(AnnotationType[, attr: value, ...])</CODE>. Synthesises a public method, returning
- the declared type, annotated <CODE>@org.springframework.context.annotation.Bean("name")</CODE> plus
- whichever qualifiers were chained. Its parameters are always the DSL closure's own, annotations
- included. Its body is the closure's, except where that body is empty - or the closure is omitted
- altogether - in which case a <CODE>new Type(...)</CODE> call over those same parameters is synthesised
- instead, leaving the compiler to select the constructor from their types exactly as it would for a
- body written out by hand. The generated method's name is an implementation detail: it matches the
- bean name when that is a usable Java identifier not already taken by an existing or generated
- member, and falls back to a synthesized <CODE><type>$N</CODE> name otherwise (a non-identifier name
- like <CODE>"my-service"</CODE>, a reserved keyword, or a collision - a bean named <CODE>toString</CODE>
- never overrides <CODE>Object.toString()</CODE>) - Spring resolves the bean by its <CODE>@Bean("name")</CODE>
- value either way, never by the method name. One bean name may be declared by several
- <CODE>bean(...)</CODE> statements when every declaration carries its own discriminating condition
- (see <a href='#validateSharedBeanNames'>validateSharedBeanNames</a>).</li>
- <li><CODE>field(["name", ] Type)</CODE>, optionally chained with <CODE>.value(...)</CODE> (config
- injection: key + default, a bare key, or a verbatim placeholder/SpEL string) and/or (repeatably)
- <CODE>.annotate(AnnotationType[, attr: value, ...])</CODE>. Declares a private field on the
- generated class, for state shared across bean methods.</li>
- <li><CODE>method(["name", ] Type) { ... </CODE>}, chainable with <CODE>.annotate(...)</CODE> only
- (<CODE>.value(...)</CODE> is field-specific).
- Declares a private helper method on the generated class, for logic shared across bean methods,
- lifted from the DSL closure the same way <CODE>bean(...)</CODE> is.</li>
- </ul>
-
- <p>Fields and helper methods declared this way are ordinary private members of the generated
- class - <CODE>bean(...)</CODE> closures reference them the same way a hand-written <CODE>@Bean</CODE>
- method would reference a sibling field or method on its <CODE>@Configuration</CODE> class. The
- <CODE>beans</CODE> property itself is removed so no closure survives into the compiled class.
-
- <p>When the annotated class extends <CODE>grails.plugins.Plugin</CODE>, the generated members land
- on a new sibling class instead of on the plugin class itself - named by swapping a
- <CODE>*GrailsPlugin</CODE> suffix for <CODE>AutoConfiguration</CODE>, or appending
- <CODE>AutoConfiguration</CODE> otherwise, and placed in the plugin's own package unless
- <CODE>@GrailsBeans(autoConfigurationName = ...)</CODE> names another. A <CODE>Plugin</CODE> subclass is
- instantiated by <CODE>DefaultGrailsPlugin</CODE> via plain reflection, never as a Spring bean, so
- it cannot carry <CODE>@Bean</CODE> methods or a meaningful <CODE>@AutoConfiguration</CODE> annotation
- of its own.
- <CODE>@AutoConfiguration</CODE> and every annotation that gates or configures it - the
- <CODE>@Conditional*</CODE> family, <CODE>@Import</CODE>/<CODE>@ImportAutoConfiguration</CODE>/
- <CODE>@ImportResource</CODE>, <CODE>@ComponentScan</CODE>, <CODE>@EnableConfigurationProperties</CODE>,
- <CODE>@PropertySource</CODE>/<CODE>@PropertySources</CODE>, and
- <CODE>@AutoConfigureOrder</CODE>/<CODE>Before</CODE>/<CODE>After</CODE> - found on the plugin class are moved
- onto the generated sibling, since that is the only place any of them has any effect; annotations
- outside that set can be named explicitly via <CODE>@GrailsBeans(moveAnnotations = ...)</CODE>. This lets a
- plugin author keep bean definitions in the familiar <CODE>*GrailsPlugin.groovy</CODE> file while
- everything else about the plugin class - <CODE>doWithApplicationContext</CODE>, <CODE>onChange</CODE>,
- <CODE>watchedResources</CODE>, etc. - continues to work exactly as it does today.
-
- <p><CODE>@CompileStatic</CODE>/<CODE>@GrailsCompileStatic</CODE> on the plugin class is propagated to the
- generated sibling. Since the sibling is created after Groovy schedules local annotation
- transforms, this transformation invokes Groovy's static-compilation transform directly after
- generating the sibling's members. This is the same approach used by other Grails AST transforms
- that generate code after local transform discovery.
- </p>
+<pre>public final class AutoConfigurationImportsWriter
+extends java.lang.Object</pre>
+
+ <p> Registers a generated auto-configuration in
+ <CODE>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</CODE>.
+
+ <p>The class a <CODE>beans</CODE> closure compiles to is created during compilation and is not a source
+ file anyone can open. Leaving its registration to be written by hand made a plugin whose beans are
+ silently never registered the ordinary consequence of not knowing the class exists - and the name
+ to write is one only the compiler knows, since it follows from the descriptor's name and package.
+ Writing it where the class is created is the only point at which that name is known for certain.
+
+ <p>A module that keeps the file by hand at {<DL><DT><B>value:</B></DT><DD>#SOURCE_IMPORTS_LOCATION} keeps it: generating
+ a second copy would put the same resource at the same path twice, and folding its entries into a
+ copy under the build directory would lose them the moment anyone deleted the file that was, until
+ then, where they were written down. Such a module is warned when the generated class is missing
+ from it and is otherwise left alone, so nothing that builds today builds differently - deleting
+ the hand-authored file is what opts in, and is safe once it holds nothing but what is generated.
+
+ <p>That one conventional location is all a compiler can look in: a source set's resource
+ directories are a build-tool notion and are not among the things the compiler is told, so a module
+ that relocates them keeps a file this cannot see and gets a second copy generated, which the build
+ then reports as two resources at one path. <CODE>FactoriesFileWriter</CODE> reads
+ <CODE>META-INF/grails.factories</CODE> from the same fixed location for the same reason. Handling a
+ relocated one needs the build to say where it is.
+
+ <p>Hand-authored entries have to remain possible: a module may register a class from another jar,
+ one annotated with a composed annotation, or one carrying no annotation at all, the imports file
+ being the registration and <CODE>@AutoConfiguration</CODE> only supplying ordering.</DD></DL>
+ <DL><DT><B>Since:</B></DT><DD>8.0</DD></DL></p>
</li>
</ul>
@@ -191,6 +146,30 @@ implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.Com
<!-- =========== FIELD SUMMARY =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="field_summary"><!-- --></a>
+ <h3>Field Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
+ <caption><span>Fields</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Modifiers</th>
+ <th class="colLast" scope="col">Name</th>
+ <th class="colLast" scope="col">Description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#IMPORTS_LOCATION">IMPORTS_LOCATION</a></code></td>
+ <td class="colLast"></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
<!-- =========== PROPERTY SUMMARY =========== -->
@@ -217,14 +196,15 @@ implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.Com
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a href="#setCompilationUnit(org.codehaus.groovy.control.CompilationUnit)">setCompilationUnit</a></strong>(org.codehaus.groovy.control.CompilationUnit compilationUnit)</code><br></td>
+ <td class="colLast"><code>public static boolean</code></td>
+ <td class="colLast"><code><strong><a href="#reconcile(java.io.File, java.lang.Object, org.codehaus.groovy.control.SourceUnit)">reconcile</a></strong>(java.io.File targetDirectory, java.lang.Object compilation, org.codehaus.groovy.control.SourceUnit source)</code><br>Drops entries naming classes this module no longer generates, adding none.</td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a href="#visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)">visit</a></strong>(org.codehaus.groovy.ast.ASTNode[] nodes, org.codehaus.groovy.control.SourceUnit source)</code><br></td>
+ <td class="colLast"><code>public static boolean</code></td>
+ <td class="colLast"><code><strong><a href="#register(java.lang.String, java.io.File, org.codehaus.groovy.control.SourceUnit, java.lang.Object)">register</a></strong>(java.lang.String className, java.io.File targetDirectory, org.codehaus.groovy.control.SourceUnit source, java.lang.Object compilation)</code><br>Adds <CODE>className</CODE> to the generated imports file under <CODE>targetDirectory</CODE>, together
+ with anything an earlier source unit of the same compilation registered there. </td>
</tr>
</table>
@@ -261,6 +241,24 @@ implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.Com
+ <!-- =========== FIELD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="field_detail">
+ <!-- -->
+ </a>
+ <h3>Field Detail</h3>
+
+ <a name="IMPORTS_LOCATION"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>IMPORTS_LOCATION</strong></h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
@@ -277,19 +275,32 @@ implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.Com
</a>
<h3>Method Detail</h3>
- <a name="setCompilationUnit(org.codehaus.groovy.control.CompilationUnit)"><!-- --></a>
+ <a name="reconcile(java.io.File, java.lang.Object, org.codehaus.groovy.control.SourceUnit)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>public void <strong>setCompilationUnit</strong>(org.codehaus.groovy.control.CompilationUnit compilationUnit)</h4>
- <p></p>
+ <h4>public static boolean <strong>reconcile</strong>(java.io.File targetDirectory, java.lang.Object compilation, org.codehaus.groovy.control.SourceUnit source)</h4>
+ <p> Drops entries naming classes this module no longer generates, adding none.
+
+ <p><a href='#register'>register</a> prunes as it writes, but only runs when something is generated: a
+ descriptor that is deleted outright, loses its <CODE>beans</CODE> closure, or is left with an empty
+ one calls nothing at all, and the entry naming the class it used to generate would survive a
+ build that removed the class. This runs from the compilation itself rather than from the
+ generating of a class, so it happens either way.
+ <DL><DT><B>Parameters:</B></DT><DD><code>targetDirectory</code> - the compilation output directory holding the generated file</DD><DD><code>compilation</code> - what scopes the names registered so far, so a class generated in this
+ compilation is not pruned before its class file is written</DD><DD><code>source</code> - the source being compiled, used to report a metadata write failure</DD></DL><DL><DT><B>Returns:</B></DT><DD><CODE>true</CODE> when an entry was dropped</DD></DL></p>
</li>
</ul>
- <a name="visit(org.codehaus.groovy.ast.ASTNode, org.codehaus.groovy.control.SourceUnit)"><!-- --></a>
+ <a name="register(java.lang.String, java.io.File, org.codehaus.groovy.control.SourceUnit, java.lang.Object)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>public void <strong>visit</strong>(org.codehaus.groovy.ast.ASTNode[] nodes, org.codehaus.groovy.control.SourceUnit source)</h4>
- <p></p>
+ <h4>public static boolean <strong>register</strong>(java.lang.String className, java.io.File targetDirectory, org.codehaus.groovy.control.SourceUnit source, java.lang.Object compilation)</h4>
+ <p> Adds <CODE>className</CODE> to the generated imports file under <CODE>targetDirectory</CODE>, together
+ with anything an earlier source unit of the same compilation registered there. A module that
+ keeps the file by hand is warned instead, and its file is left as the only one.
+ <DL><DT><B>Parameters:</B></DT><DD><code>className</code> - the generated auto-configuration's binary name</DD><DD><code>targetDirectory</code> - the compilation output directory, or <CODE>null</CODE> when the compiler did
+ not supply one - in which case there is nowhere to write and the class
+ stays registerable by hand</DD><DD><code>source</code> - the source being compiled, used for warnings and write errors</DD><DD><code>compilation</code> - what scopes names registered before their class files are written</DD></DL><DL><DT><B>Returns:</B></DT><DD><CODE>true</CODE> when the file was written</DD></DL></p>
</li>
</ul>
@@ -320,18 +331,18 @@ implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.Com
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../index.html?org/grails/compiler/beans/GrailsBeansASTTransformation" target="_top">Frames</a></li>
- <li><a href="GrailsBeansASTTransformation.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../index.html?org/grails/compiler/beans/AutoConfigurationImportsWriter" target="_top">Frames</a></li>
+ <li><a href="AutoConfigurationImportsWriter.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field Constructor <li><a href="#method_summary">Method</a></li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field Constructor <li><a href="#method_detail">Method</a></li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/compiler/beans/GrailsBeansASTTransformation.html b/docs/snapshot/api/org/grails/compiler/beans/GrailsBeansASTTransformation.html
index 16b2e8e87f7..4d165f22337 100644
--- a/docs/snapshot/api/org/grails/compiler/beans/GrailsBeansASTTransformation.html
+++ b/docs/snapshot/api/org/grails/compiler/beans/GrailsBeansASTTransformation.html
@@ -70,11 +70,11 @@ if (location.href.indexOf('is-external=true') == -1) {
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field Constructor <li><a href="#method_summary">Method</a></li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field Constructor <li><a href="#method_detail">Method</a></li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -191,6 +191,31 @@ implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.Com
<!-- =========== FIELD SUMMARY =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="field_summary"><!-- --></a>
+ <h3>Field Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Enum constants summary table">
+ <caption><span>Fields</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Modifiers</th>
+ <th class="colLast" scope="col">Name</th>
+ <th class="colLast" scope="col">Description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#RESOLVED_TARGET_DIRECTORY_METADATA">RESOLVED_TARGET_DIRECTORY_METADATA</a></code></td>
+ <td class="colLast">Class-node metadata carrying the compilation's output directory, seeded by the global Grails
+ transform. </td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
<!-- =========== PROPERTY SUMMARY =========== -->
@@ -261,6 +286,28 @@ implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.Com
+ <!-- =========== FIELD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="field_detail">
+ <!-- -->
+ </a>
+ <h3>Field Detail</h3>
+
+ <a name="RESOLVED_TARGET_DIRECTORY_METADATA"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>RESOLVED_TARGET_DIRECTORY_METADATA</strong></h4>
+ <p> Class-node metadata carrying the compilation's output directory, seeded by the global Grails
+ transform. It resolves the directory for Groovy-Eclipse, where the compiler configuration
+ either has none or has one relative to the Eclipse project, and that resolution lives in
+ grails-core - which this module cannot depend on.
+ </p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
@@ -327,11 +374,11 @@ implements org.codehaus.groovy.transform.ASTTransformation, groovy.transform.Com
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field Constructor <li><a href="#method_summary">Method</a></li>
+ Nested <li><a href="#field_summary">Field</a></li> Constructor <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field Constructor <li><a href="#method_detail">Method</a></li>
+ <li><a href="#field_detail">Field</a></li> Constructor <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/compiler/beans/package-frame.html b/docs/snapshot/api/org/grails/compiler/beans/package-frame.html
index 2874462078e..ecea5a56a77 100644
--- a/docs/snapshot/api/org/grails/compiler/beans/package-frame.html
+++ b/docs/snapshot/api/org/grails/compiler/beans/package-frame.html
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="GrailsBeansASTTransformation.html" title="class in org.grails.compiler.beans" target="classFrame">GrailsBeansASTTransformation</a></li>
+ <li><a href="AutoConfigurationImportsWriter.html" title="class in org.grails.compiler.beans" target="classFrame">AutoConfigurationImportsWriter</a></li><li><a href="GrailsBeansASTTransformation.html" title="class in org.grails.compiler.beans" target="classFrame">GrailsBeansASTTransformation</a></li>
</ul>
</div>
diff --git a/docs/snapshot/api/org/grails/compiler/beans/package-summary.html b/docs/snapshot/api/org/grails/compiler/beans/package-summary.html
index f457226b117..91134e6e31c 100644
--- a/docs/snapshot/api/org/grails/compiler/beans/package-summary.html
+++ b/docs/snapshot/api/org/grails/compiler/beans/package-summary.html
@@ -88,6 +88,15 @@ function windowTitle()
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="AutoConfigurationImportsWriter.html" title="class in org/grails/compiler/beans">
+ AutoConfigurationImportsWriter
+ </a></strong>
+ </td>
+ <td>Registers a generated auto-configuration in
+ <CODE>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</CODE>.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="GrailsBeansASTTransformation.html" title="class in org/grails/compiler/beans">
diff --git a/docs/snapshot/api/org/apache/grails/buildsrc/CompilePlugin.html b/docs/snapshot/api/org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html
similarity index 61%
copy from docs/snapshot/api/org/apache/grails/buildsrc/CompilePlugin.html
copy to docs/snapshot/api/org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html
index 3be5b706263..1c564273f8e 100644
--- a/docs/snapshot/api/org/apache/grails/buildsrc/CompilePlugin.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>CompilePlugin (Grails 8.0.0-SNAPSHOT)</title>
+ <title>AutoConfigurationImportsCompileInput (Grails 8.0.0-SNAPSHOT)</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <link href="../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
- <link href="../../../../groovy.ico" type="image/x-icon" rel="icon">
- <link rel="stylesheet" type="text/css" href="../../../../stylesheet.css" title="Style">
+ <link href="../../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
+ <link href="../../../../../groovy.ico" type="image/x-icon" rel="icon">
+ <link rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
<body class="center">
<script type="text/javascript"><!--
if (location.href.indexOf('is-external=true') == -1) {
- parent.document.title="CompilePlugin (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="AutoConfigurationImportsCompileInput (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,30 +51,30 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../../index-all.html">Index</a></li>
- <li><a href="../../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../index.html?org/apache/grails/buildsrc/CompilePlugin" target="_top">Frames</a></li>
- <li><a href="CompilePlugin.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../index.html?org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput" target="_top">Frames</a></li>
+ <li><a href="AutoConfigurationImportsCompileInput.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -85,31 +85,25 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.apache.grails.buildsrc</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.gradle.plugin.core</strong></div>
- <h2 title="[Groovy] Class CompilePlugin" class="title">[Groovy] Class CompilePlugin</h2>
+ <h2 title="[Groovy] Class AutoConfigurationImportsCompileInput" class="title">[Groovy] Class AutoConfigurationImportsCompileInput</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.apache.grails.buildsrc.CompilePlugin
+<li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.core.AutoConfigurationImportsCompileInput
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
- <dl>
- <dt>All Implemented Interfaces and Traits:</dt>
- <dd>Plugin<Project></dd>
- </dl>
-
<!-- todo: direct known subclasses -->
<hr>
<pre>@groovy.transform.CompileStatic
-class CompilePlugin
-extends java.lang.Object
-implements Plugin<Project></pre>
+class AutoConfigurationImportsCompileInput
+extends java.lang.Object</pre>
</li>
</ul>
@@ -128,6 +122,28 @@ implements Plugin<Project></pre>
<!-- =========== PROPERTY SUMMARY =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="property_summary"><!-- --></a>
+ <h3>Properties Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Properties Summary table, listing nested classes, and an explanation">
+ <caption><span>Properties</span><span class="tabEnd"> </span></caption>
+ <tr>
+ <th class="colFirst" scope="col">Type</th>
+ <th class="colLast" scope="col">Name and description</th>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#PATH">PATH</a></code><br></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
<!-- =========== ELEMENT SUMMARY =========== -->
@@ -146,7 +162,7 @@ implements Plugin<Project></pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#CompilePlugin()">CompilePlugin</a></strong>()</code><br></td>
+ <code><strong><a href="#AutoConfigurationImportsCompileInput()">AutoConfigurationImportsCompileInput</a></strong>()</code><br></td>
</tr>
</table>
@@ -172,8 +188,8 @@ implements Plugin<Project></pre>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>void</code></td>
- <td class="colLast"><code><strong><a href="#apply(org.gradle.api.Project)">apply</a></strong>(<a href='../../../../org.gradle.api.Project.html'>Project</a> project)</code><br></td>
+ <td class="colLast"><code>static void</code></td>
+ <td class="colLast"><code><strong><a href="#register(org.gradle.api.Project, org.gradle.api.tasks.compile.GroovyCompile)">register</a></strong>(<a href='../../../../../org.gradle.api.Project.html'>Project</a> project, <a href='../../../../../org.gradle.api.tasks.compile.GroovyCompile.html'>GroovyCompile</a> task)</code><br></td>
</tr>
</table>
@@ -212,6 +228,24 @@ implements Plugin<Project></pre>
+ <!-- =========== PROPERTY DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="prop_detail">
+ <!-- -->
+ </a>
+ <h3>Property Detail</h3>
+
+ <a name="PATH"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>static final java.lang.String <strong>PATH</strong></h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
@@ -223,10 +257,10 @@ implements Plugin<Project></pre>
</a>
<h3>Constructor Detail</h3>
- <a name="CompilePlugin()"><!-- --></a>
+ <a name="AutoConfigurationImportsCompileInput()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>CompilePlugin</strong>()</h4>
+ <h4><strong>AutoConfigurationImportsCompileInput</strong>()</h4>
<p></p>
</li>
</ul>
@@ -244,10 +278,10 @@ implements Plugin<Project></pre>
</a>
<h3>Method Detail</h3>
- <a name="apply(org.gradle.api.Project)"><!-- --></a>
+ <a name="register(org.gradle.api.Project, org.gradle.api.tasks.compile.GroovyCompile)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>void <strong>apply</strong>(<a href='../../../../org.gradle.api.Project.html'>Project</a> project)</h4>
+ <h4>static void <strong>register</strong>(<a href='../../../../../org.gradle.api.Project.html'>Project</a> project, <a href='../../../../../org.gradle.api.tasks.compile.GroovyCompile.html'>GroovyCompile</a> task)</h4>
<p></p>
</li>
</ul>
@@ -267,30 +301,30 @@ implements Plugin<Project></pre>
<!-- -->
</a>
<ul class="navList" title="Navigation">
- <li><a href="../../../../overview-summary.html">Overview</a></li>
+ <li><a href="../../../../../overview-summary.html">Overview</a></li>
<li><a href="package-summary.html">Package</a></li>
<li class="navBarCell1Rev">Class</li>
- <li><a href="../../../../deprecated-list.html">Deprecated</a></li>
- <li><a href="../../../../index-all.html">Index</a></li>
- <li><a href="../../../../help-doc.html">Help</a></li>
+ <li><a href="../../../../../deprecated-list.html">Deprecated</a></li>
+ <li><a href="../../../../../index-all.html">Index</a></li>
+ <li><a href="../../../../../help-doc.html">Help</a></li>
</ul>
</div>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../index.html?org/apache/grails/buildsrc/CompilePlugin" target="_top">Frames</a></li>
- <li><a href="CompilePlugin.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../index.html?org/grails/gradle/plugin/core/AutoConfigurationImportsCompileInput" target="_top">Frames</a></li>
+ <li><a href="AutoConfigurationImportsCompileInput.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Nested Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
+ Nested Field <li><a href="#property_summary">Property</a></li> <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- Field <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
+ Field <li><a href="#prop_detail">Property</a></li> <li><a href="#constructor_detail">Constructor</a></li> <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/core/package-frame.html b/docs/snapshot/api/org/grails/gradle/plugin/core/package-frame.html
index 44c2661f9bb..c9c0822adc3 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/core/package-frame.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/core/package-frame.html
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="BootRunExitCodeVerifier.html" title="class in org.grails.gradle.plugin.core" target="classFrame">BootRunExitCodeVerifier</a></li><li><a href="GrailsAppBaseDirProvider.html" title="class in org.grails.gradle.plugin.core" target="classFrame">GrailsAppBaseDirProvider</a></li><li><a href="GrailsCompileStaticArtefactsProvider.html" title="class in org.grails.gradle.plugin.core" target="classFrame">GrailsCompileStaticArtefactsProvider</a></li><li><a href="GrailsCompileStat [...]
+ <li><a href="AutoConfigurationImportsCompileInput.html" title="class in org.grails.gradle.plugin.core" target="classFrame">AutoConfigurationImportsCompileInput</a></li><li><a href="BootRunExitCodeVerifier.html" title="class in org.grails.gradle.plugin.core" target="classFrame">BootRunExitCodeVerifier</a></li><li><a href="GrailsAppBaseDirProvider.html" title="class in org.grails.gradle.plugin.core" target="classFrame">GrailsAppBaseDirProvider</a></li><li><a href="GrailsCompileStat [...]
</ul>
</div>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/core/package-summary.html b/docs/snapshot/api/org/grails/gradle/plugin/core/package-summary.html
index ca124720d71..5728858b061 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/core/package-summary.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/core/package-summary.html
@@ -88,6 +88,14 @@ function windowTitle()
<th class="colFirst" scope="col">Class</th>
<th class="colLast" scope="col">Description</th>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="AutoConfigurationImportsCompileInput.html" title="class in org/grails/gradle/plugin/core">
+ AutoConfigurationImportsCompileInput
+ </a></strong>
+ </td>
+ <td></td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="BootRunExitCodeVerifier.html" title="class in org/grails/gradle/plugin/core">
diff --git a/docs/snapshot/api/org/grails/taglib/GroovyPageAttributes.html b/docs/snapshot/api/org/grails/taglib/GroovyPageAttributes.html
index 9d21f9d71ce..58d506151eb 100644
--- a/docs/snapshot/api/org/grails/taglib/GroovyPageAttributes.html
+++ b/docs/snapshot/api/org/grails/taglib/GroovyPageAttributes.html
@@ -212,7 +212,7 @@ implements java.lang.Cloneable</pre>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public boolean</code></td>
- <td class="colLast"><code><strong><a href="#isGspTagSyntaxCall()">isGspTagSyntaxCall</a></strong>()</code><br></td>
+ <td class="colLast"><code><strong><a href="#gspTagSyntaxCall()">gspTagSyntaxCall</a></strong>()</code><br>Whether the tag was invoked with GSP tag syntax rather than as a method call.</td>
</tr>
<tr class="altColor">
@@ -317,11 +317,17 @@ implements java.lang.Cloneable</pre>
</li>
</ul>
- <a name="isGspTagSyntaxCall()"><!-- --></a>
+ <a name="gspTagSyntaxCall()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public boolean <strong>isGspTagSyntaxCall</strong>()</h4>
- <p></p>
+ <h4>public boolean <strong>gspTagSyntaxCall</strong>()</h4>
+ <p> Whether the tag was invoked with GSP tag syntax rather than as a method call.
+
+ <p>Deliberately not named <CODE>isGspTagSyntaxCall()</CODE>. This class implements java.util.Map,
+ and a JavaBean accessor on a map shadows the map entry of the same name, which made an
+ attribute named <CODE>gspTagSyntaxCall</CODE> unreadable. See
+ <a href='../../../grails/util/AbstractTypeConvertingMap.html' title='AbstractTypeConvertingMap'>AbstractTypeConvertingMap</a> for the rule.
+ <DL><DT><B>Returns:</B></DT><DD><CODE>true</CODE> when invoked with GSP tag syntax</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0</DD></DL></p>
</li>
</ul>
diff --git a/docs/snapshot/grails-data/developer-manual/gettingStarted.html b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
index adb7510ea9a..13095e19829 100644
--- a/docs/snapshot/grails-data/developer-manual/gettingStarted.html
+++ b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
@@ -523,7 +523,7 @@ cd grails-core</pre>
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/introduction.html b/docs/snapshot/grails-data/developer-manual/introduction.html
index 91421cf7ef4..17f0f6d1914 100644
--- a/docs/snapshot/grails-data/developer-manual/introduction.html
+++ b/docs/snapshot/grails-data/developer-manual/introduction.html
@@ -476,7 +476,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/stepByStep.html b/docs/snapshot/grails-data/developer-manual/stepByStep.html
index c50d8c23d03..fe2c4e5523f 100644
--- a/docs/snapshot/grails-data/developer-manual/stepByStep.html
+++ b/docs/snapshot/grails-data/developer-manual/stepByStep.html
@@ -621,7 +621,7 @@ class XyzTestSuite {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/testing.html b/docs/snapshot/grails-data/developer-manual/testing.html
index 735f27c1fbb..1d116871134 100644
--- a/docs/snapshot/grails-data/developer-manual/testing.html
+++ b/docs/snapshot/grails-data/developer-manual/testing.html
@@ -511,7 +511,7 @@ class PagedResultSpec extends GormDatastoreSpec{
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi.html b/docs/snapshot/grails-data/developer-manual/understandingApi.html
index e48cad6089c..889f158fd9c 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi.html
@@ -454,7 +454,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
index 55b5e74ad48..b71b2129e9f 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/datastoreBasics.html
@@ -561,7 +561,7 @@ protected Session createSession(PropertyResolver connDetails) {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
index 829377484ae..6e8a2870b4f 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormApis.html
@@ -496,7 +496,7 @@ class Neo4jEntityTraitProvider implements GormEntityTraitProvider {
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
index ca437092df9..e0af73f4365 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/gormEnhancer.html
@@ -488,7 +488,7 @@ enhancer.enhance()</code></pre>
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
index 560a18d8186..f917aabe075 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingCrud.html
@@ -673,7 +673,7 @@ protected void deleteEntry(String family, final Object key, final Object entry)
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
index 5a3909cc1fb..fdbe15851f7 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/implementingQueries.html
@@ -588,7 +588,7 @@ If, for instance, the underlying datastore does not support the calculation of a
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
index 8b02cb93bcc..944096958dc 100644
--- a/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
+++ b/docs/snapshot/grails-data/developer-manual/understandingApi/secondaryIndexes.html
@@ -526,7 +526,7 @@ If the underlying datastore supports secondary indexes then it is ok to just ret
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/whats-new-manual/index.html b/docs/snapshot/grails-data/whats-new-manual/index.html
index 0f9df704b60..8d98a7bcff7 100644
--- a/docs/snapshot/grails-data/whats-new-manual/index.html
+++ b/docs/snapshot/grails-data/whats-new-manual/index.html
@@ -527,7 +527,7 @@ body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-b
<div id="footer">
<div id="footer-text">
Version 8.0.0-SNAPSHOT<br>
-Last updated 2026-09-01 15:11:44 UTC
+Last updated 2026-09-02 17:35:38 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/guide/async.html b/docs/snapshot/guide/async.html
index bcc1c35aa87..b2b6d46f36d 100644
--- a/docs/snapshot/guide/async.html
+++ b/docs/snapshot/guide/async.html
@@ -1017,7 +1017,7 @@ Although GORM executes persistence operations asynchronously, these operations s
<div class="sect2">
<h3 id="_the_asyncentity_trait">The AsyncEntity Trait</h3>
<div class="paragraph">
-<p>Since Grails 3.3, the asynchronous part of GORM is optional. To enable it you first need to add the <code>grails-datastore-gorm-async</code> dependency to <code>build.gradle</code>:</p>
+<p>Since Grails 3.3, the asynchronous part of GORM is optional. To enable it you first need to add the <code>grails-datamapping-async</code> dependency to <code>build.gradle</code>:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
diff --git a/docs/snapshot/guide/introduction.html b/docs/snapshot/guide/introduction.html
index 81b11e07b67..6d1bb62027e 100644
--- a/docs/snapshot/guide/introduction.html
+++ b/docs/snapshot/guide/introduction.html
@@ -350,6 +350,21 @@ The <code>database-migration</code> feature also selects the matching <code>grai
</div>
</div>
<div class="sect3">
+<h4 id="_asynchronous_grails_data_application_generation">Asynchronous Grails Data Application Generation</h4>
+<div class="paragraph">
+<p>Grails Forge offers a new <code>gorm-async</code> feature that adds the asynchronous programming model for Grails Data — the <code>AsyncEntity</code> trait and the <code>async</code> namespace — to a generated application:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">grails -t forge create-app --features=gorm-async com.example.demo</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The feature layers on top of whichever GORM implementation is selected, defaulting to Hibernate when none is chosen.
+The <code>grails-datamapping-async</code> artifact it brings in is intended for direct consumption by applications and libraries, so it moved from the <code>org.apache.grails.data</code> group to <code>org.apache.grails</code>; see the <a href="upgrading.html#upgrading80x">upgrade guide</a> for the coordinate change.</p>
+</div>
+</div>
+<div class="sect3">
<h4 id="_plugin_beans_register_before_spring_boot_auto_configuration">Plugin Beans Register Before Spring Boot Auto-Configuration</h4>
<div class="paragraph">
<p>Grails 8 unifies and retimes the plugin lifecycle so that the beans a plugin contributes are registered before Spring Boot processes its auto-configurations.
diff --git a/docs/snapshot/guide/plugins.html b/docs/snapshot/guide/plugins.html
index 418d3830494..c6d1041dd12 100644
--- a/docs/snapshot/guide/plugins.html
+++ b/docs/snapshot/guide/plugins.html
@@ -1578,7 +1578,16 @@ bean(<span class="string"><span class="delimiter">'</span><span class="content">
</div>
</div>
<div class="paragraph">
-<p>Because the result is an ordinary <code>AutoConfiguration</code> class, it must be registered the same way any Spring Boot auto-configuration is: listed in <code>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</code>. Modules built as part of this project can apply the <code>org.apache.grails.buildsrc.autoconfiguration-imports</code> Gradle convention plugin to generate that file automatically, by scanning the module’s own compiled classes for <c [...]
+<p>Because the result is an ordinary <code>AutoConfiguration</code> class, it must be registered the same way any Spring Boot auto-configuration is: listed in <code>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</code>. <strong>The compiler writes that entry for you.</strong> The class is generated rather than written, so its name is one only the compiler knows — leaving the registration to be typed by hand made a plugin whose beans are silently never re [...]
+</div>
+<div class="paragraph">
+<p>A module that keeps the imports file by hand at <code>src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</code> keeps it, and nothing is generated beside it: two copies of the same resource cannot both go into the jar, and folding the hand-authored entries into a copy under the build directory would lose them as soon as anyone deleted the file they were written in. Such a module is warned at compile time when the generated class is miss [...]
+</div>
+<div class="paragraph">
+<p>That conventional path is the only one the compiler can look in, since a source set’s resource directories are a build-tool notion rather than something the compiler is told — the same reason <code>META-INF/grails.factories</code> is read from a fixed location. A module that relocates its resource directories keeps a file this cannot see, and gets a second copy generated that the build reports as two resources at one path.</p>
+</div>
+<div class="paragraph">
+<p>A standalone <code>@GrailsBeans</code> class — one that is neither a plugin descriptor nor an <code>Application</code> — is a source file you can see, so it is registered by hand like any other auto-configuration.</p>
</div>
<div class="admonitionblock note">
<table>
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index 5fe02503738..b5a08a29cb1 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -988,6 +988,21 @@ The <code>database-migration</code> feature also selects the matching <code>grai
</div>
</div>
<div class="sect3">
+<h4 id="_asynchronous_grails_data_application_generation">Asynchronous Grails Data Application Generation</h4>
+<div class="paragraph">
+<p>Grails Forge offers a new <code>gorm-async</code> feature that adds the asynchronous programming model for Grails Data — the <code>AsyncEntity</code> trait and the <code>async</code> namespace — to a generated application:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">grails -t forge create-app --features=gorm-async com.example.demo</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The feature layers on top of whichever GORM implementation is selected, defaulting to Hibernate when none is chosen.
+The <code>grails-datamapping-async</code> artifact it brings in is intended for direct consumption by applications and libraries, so it moved from the <code>org.apache.grails.data</code> group to <code>org.apache.grails</code>; see the <a href="upgrading.html#upgrading80x">upgrade guide</a> for the coordinate change.</p>
+</div>
+</div>
+<div class="sect3">
<h4 id="_plugin_beans_register_before_spring_boot_auto_configuration">Plugin Beans Register Before Spring Boot Auto-Configuration</h4>
<div class="paragraph">
<p>Grails 8 unifies and retimes the plugin lifecycle so that the beans a plugin contributes are registered before Spring Boot processes its auto-configurations.
@@ -5022,6 +5037,64 @@ Code that walks a configuration source with <code>[]</code> and expects a missin
<p>Grails applies this guard internally when resolving Spring profile activation keys; you only need it in application code that navigates a raw <code>ConfigObject</code> by subscript.</p>
</div>
</div>
+<div class="sect4">
+<h5 id="_28_3_a_getter_on_a_map_no_longer_hides_behind_a_map_entry">28.3 A getter on a map no longer hides behind a map entry</h5>
+<div class="paragraph">
+<p>In Groovy 4, reading or writing a property on a class that implements <code>Map</code> always addressed a map entry.
+In Groovy 5 a public JavaBean accessor declared on such a class is resolved first, so an entry whose name matches an accessor becomes unreadable, and assigning to it throws <code>groovy.lang.ReadOnlyPropertyException</code>.
+This affected <code>params</code>, where <code>getRequest()</code> and <code>getIdentifier()</code> made request parameters named <code>request</code> and <code>identifier</code> unreachable.</p>
+</div>
+<div class="paragraph">
+<p>Grails 8 removes those accessors, so <code>params</code> behaves as it did in Grails 7 - every parameter name is an ordinary map entry, in dotted and subscript form, and under static compilation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">params.identifier = <span class="string"><span class="delimiter">'</span><span class="content">id1</span><span class="delimiter">'</span></span> <span class="comment">// the request parameter, not a property</span>
+params[<span class="string"><span class="delimiter">'</span><span class="content">request</span><span class="delimiter">'</span></span>] = <span class="string"><span class="delimiter">'</span><span class="content">req1</span><span class="delimiter">'</span></span> <span class="comment">// the request parameter, not the HttpServletRequest</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Two methods changed as a result:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Grails 7</th>
+<th class="tableblock halign-left valign-top">Grails 8</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params.getRequest()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params.request()</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params.getIdentifier()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params.id</code> — it only ever read the <code>id</code> parameter</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The same change applies to the <code>attrs</code> map passed to a GSP tag, whose internal implementation renames <code>isGspTagSyntaxCall()</code> to <code>gspTagSyntaxCall()</code>.
+Its setter is retained, so assigning <code>attrs.gspTagSyntaxCall</code> still invokes that setter rather than storing an attribute - as in Grails 7. Store an attribute of that name with <code>attrs.put('gspTagSyntaxCall', value)</code>.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+When adding a class that extends <code>grails.util.TypeConvertingMap</code>, do not declare a no-argument <code>getX()</code> or <code>isX()</code> method on it, or the entry <code>x</code> becomes unreachable for the same reason. Statically compiled callers bind directly to the accessor, so the collision cannot be corrected at runtime.
+</td>
+</tr>
+</table>
+</div>
+</div>
</div>
<div class="sect3">
<h4 id="_29_mime_types_are_now_framework_defaults">29. MIME Types Are Now Framework Defaults</h4>
@@ -7097,6 +7170,34 @@ job is disabled with <code>jobEnabled = false</code>, or the class is not a job
</div>
</div>
</div>
+<div class="sect3">
+<h4 id="_52_coordinate_changes">52. Coordinate Changes</h4>
+<div class="paragraph">
+<p><code>grails-datamapping-async</code> provides the asynchronous programming model for Grails Data — the
+<code>AsyncEntity</code> trait and the <code>async</code> namespace — and is meant to be depended on directly by
+applications and libraries. Groups nested below <code>org.apache.grails</code> are reserved for implementation
+details of Grails, so the artifact moved from the <code>org.apache.grails.data</code> group to
+<code>org.apache.grails</code>. The artifact id is unchanged:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">implementation <span class="string"><span class="delimiter">"</span><span class="content">org.apache.grails:grails-datamapping-async</span><span class="delimiter">"</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <a href="https://github.com/apache/grails-core/blob/8.0.x/RENAME.md">RENAME.md</a> reference table in the
+grails-core repository maps previous coordinate names to new names. The <code>rename_gradle_artifacts.sh</code>
+script in the <a href="https://github.com/apache/grails-core/tree/8.0.x/etc/bin">etc/bin</a> directory of the
+grails-core repository rewrites both the Grails 6 (<code>org.grails:grails-datastore-gorm-async</code>) and the
+Grails 7 (<code>org.apache.grails.data:grails-datamapping-async</code>) coordinates in a project’s Gradle files:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">./rename_gradle_artifacts.sh -l my/project/location</code></pre>
+</div>
+</div>
+</div>
</div>
@@ -33763,7 +33864,7 @@ Although GORM executes persistence operations asynchronously, these operations s
<div class="sect2">
<h3 id="_the_asyncentity_trait">The AsyncEntity Trait</h3>
<div class="paragraph">
-<p>Since Grails 3.3, the asynchronous part of GORM is optional. To enable it you first need to add the <code>grails-datastore-gorm-async</code> dependency to <code>build.gradle</code>:</p>
+<p>Since Grails 3.3, the asynchronous part of GORM is optional. To enable it you first need to add the <code>grails-datamapping-async</code> dependency to <code>build.gradle</code>:</p>
</div>
<div class="listingblock">
<div class="title">build.gradle</div>
@@ -59678,7 +59779,16 @@ bean(<span class="string"><span class="delimiter">'</span><span class="content">
</div>
</div>
<div class="paragraph">
-<p>Because the result is an ordinary <code>AutoConfiguration</code> class, it must be registered the same way any Spring Boot auto-configuration is: listed in <code>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</code>. Modules built as part of this project can apply the <code>org.apache.grails.buildsrc.autoconfiguration-imports</code> Gradle convention plugin to generate that file automatically, by scanning the module’s own compiled classes for <c [...]
+<p>Because the result is an ordinary <code>AutoConfiguration</code> class, it must be registered the same way any Spring Boot auto-configuration is: listed in <code>META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</code>. <strong>The compiler writes that entry for you.</strong> The class is generated rather than written, so its name is one only the compiler knows — leaving the registration to be typed by hand made a plugin whose beans are silently never re [...]
+</div>
+<div class="paragraph">
+<p>A module that keeps the imports file by hand at <code>src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports</code> keeps it, and nothing is generated beside it: two copies of the same resource cannot both go into the jar, and folding the hand-authored entries into a copy under the build directory would lose them as soon as anyone deleted the file they were written in. Such a module is warned at compile time when the generated class is miss [...]
+</div>
+<div class="paragraph">
+<p>That conventional path is the only one the compiler can look in, since a source set’s resource directories are a build-tool notion rather than something the compiler is told — the same reason <code>META-INF/grails.factories</code> is read from a fixed location. A module that relocates its resource directories keeps a file this cannot see, and gets a second copy generated that the build reports as two resources at one path.</p>
+</div>
+<div class="paragraph">
+<p>A standalone <code>@GrailsBeans</code> class — one that is neither a plugin descriptor nor an <code>Application</code> — is a source file you can see, so it is registered by hand like any other auto-configuration.</p>
</div>
<div class="admonitionblock note">
<table>
@@ -60820,7 +60930,7 @@ If you define a bean in <code>resources.groovy</code> with the same name as one
<p>Both the name and the body are optional. <code>bean(MyService)</code> declares a bean named <code>myService</code> — the type’s decapitalized simple name — that is simply <code>new MyService()</code>; give it a name only when the type does not produce the one you want, and a body only when there is something to say beyond constructing it.</p>
</div>
<div class="paragraph">
-<p>No annotation is required on the <code>Application</code> class, or on a <code>*GrailsPlugin.groovy</code> plugin descriptor: a <code>beans</code> property on either is compiled automatically, in the same way <code>doWithSpring</code> and <code>watchedResources</code> are conventions rather than annotated members. <code>@GrailsBeans</code> is only needed on a class that is neither — a standalone <code>@AutoConfiguration</code> class, which must also be listed in <code>META-INF/spring/ [...]
+<p>No annotation is required on the <code>Application</code> class, or on a <code>*GrailsPlugin.groovy</code> plugin descriptor: a <code>beans</code> property on either is compiled automatically, in the same way <code>doWithSpring</code> and <code>watchedResources</code> are conventions rather than annotated members. <code>@GrailsBeans</code> is only needed on a class that is neither — a standalone <code>@AutoConfiguration</code> class, which must also be listed in <code>META-INF/spring/ [...]
</div>
<div class="paragraph">
<p>No further registration is needed on the <code>Application</code> class — Spring Boot already processes it. Beans declared here are also ordinary user beans as far as Spring Boot is concerned, so any auto-configuration guarded by <code>@ConditionalOnMissingBean</code> backs off in their favour, exactly as it would for a bean defined in <code>resources.groovy</code>. A standalone class annotated with both <code>@GrailsBeans</code> and <code>@AutoConfiguration</code> must instead be lis [...]
diff --git a/docs/snapshot/guide/spring.html b/docs/snapshot/guide/spring.html
index 3f85d87212b..668cdfe7108 100644
--- a/docs/snapshot/guide/spring.html
+++ b/docs/snapshot/guide/spring.html
@@ -479,7 +479,7 @@ If you define a bean in <code>resources.groovy</code> with the same name as one
<p>Both the name and the body are optional. <code>bean(MyService)</code> declares a bean named <code>myService</code> — the type’s decapitalized simple name — that is simply <code>new MyService()</code>; give it a name only when the type does not produce the one you want, and a body only when there is something to say beyond constructing it.</p>
</div>
<div class="paragraph">
-<p>No annotation is required on the <code>Application</code> class, or on a <code>*GrailsPlugin.groovy</code> plugin descriptor: a <code>beans</code> property on either is compiled automatically, in the same way <code>doWithSpring</code> and <code>watchedResources</code> are conventions rather than annotated members. <code>@GrailsBeans</code> is only needed on a class that is neither — a standalone <code>@AutoConfiguration</code> class, which must also be listed in <code>META-INF/spring/ [...]
+<p>No annotation is required on the <code>Application</code> class, or on a <code>*GrailsPlugin.groovy</code> plugin descriptor: a <code>beans</code> property on either is compiled automatically, in the same way <code>doWithSpring</code> and <code>watchedResources</code> are conventions rather than annotated members. <code>@GrailsBeans</code> is only needed on a class that is neither — a standalone <code>@AutoConfiguration</code> class, which must also be listed in <code>META-INF/spring/ [...]
</div>
<div class="paragraph">
<p>No further registration is needed on the <code>Application</code> class — Spring Boot already processes it. Beans declared here are also ordinary user beans as far as Spring Boot is concerned, so any auto-configuration guarded by <code>@ConditionalOnMissingBean</code> backs off in their favour, exactly as it would for a bean defined in <code>resources.groovy</code>. A standalone class annotated with both <code>@GrailsBeans</code> and <code>@AutoConfiguration</code> must instead be lis [...]
diff --git a/docs/snapshot/guide/upgrading.html b/docs/snapshot/guide/upgrading.html
index 6c7be464041..9086083404c 100644
--- a/docs/snapshot/guide/upgrading.html
+++ b/docs/snapshot/guide/upgrading.html
@@ -2362,6 +2362,64 @@ Code that walks a configuration source with <code>[]</code> and expects a missin
<p>Grails applies this guard internally when resolving Spring profile activation keys; you only need it in application code that navigates a raw <code>ConfigObject</code> by subscript.</p>
</div>
</div>
+<div class="sect4">
+<h5 id="_28_3_a_getter_on_a_map_no_longer_hides_behind_a_map_entry">28.3 A getter on a map no longer hides behind a map entry</h5>
+<div class="paragraph">
+<p>In Groovy 4, reading or writing a property on a class that implements <code>Map</code> always addressed a map entry.
+In Groovy 5 a public JavaBean accessor declared on such a class is resolved first, so an entry whose name matches an accessor becomes unreadable, and assigning to it throws <code>groovy.lang.ReadOnlyPropertyException</code>.
+This affected <code>params</code>, where <code>getRequest()</code> and <code>getIdentifier()</code> made request parameters named <code>request</code> and <code>identifier</code> unreachable.</p>
+</div>
+<div class="paragraph">
+<p>Grails 8 removes those accessors, so <code>params</code> behaves as it did in Grails 7 - every parameter name is an ordinary map entry, in dotted and subscript form, and under static compilation:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">params.identifier = <span class="string"><span class="delimiter">'</span><span class="content">id1</span><span class="delimiter">'</span></span> <span class="comment">// the request parameter, not a property</span>
+params[<span class="string"><span class="delimiter">'</span><span class="content">request</span><span class="delimiter">'</span></span>] = <span class="string"><span class="delimiter">'</span><span class="content">req1</span><span class="delimiter">'</span></span> <span class="comment">// the request parameter, not the HttpServletRequest</span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Two methods changed as a result:</p>
+</div>
+<table class="tableblock frame-all grid-all stretch">
+<colgroup>
+<col style="width: 50%;">
+<col style="width: 50%;">
+</colgroup>
+<thead>
+<tr>
+<th class="tableblock halign-left valign-top">Grails 7</th>
+<th class="tableblock halign-left valign-top">Grails 8</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params.getRequest()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params.request()</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params.getIdentifier()</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params.id</code> — it only ever read the <code>id</code> parameter</p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>The same change applies to the <code>attrs</code> map passed to a GSP tag, whose internal implementation renames <code>isGspTagSyntaxCall()</code> to <code>gspTagSyntaxCall()</code>.
+Its setter is retained, so assigning <code>attrs.gspTagSyntaxCall</code> still invokes that setter rather than storing an attribute - as in Grails 7. Store an attribute of that name with <code>attrs.put('gspTagSyntaxCall', value)</code>.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+When adding a class that extends <code>grails.util.TypeConvertingMap</code>, do not declare a no-argument <code>getX()</code> or <code>isX()</code> method on it, or the entry <code>x</code> becomes unreachable for the same reason. Statically compiled callers bind directly to the accessor, so the collision cannot be corrected at runtime.
+</td>
+</tr>
+</table>
+</div>
+</div>
</div>
<div class="sect3">
<h4 id="_29_mime_types_are_now_framework_defaults">29. MIME Types Are Now Framework Defaults</h4>
@@ -4437,6 +4495,34 @@ job is disabled with <code>jobEnabled = false</code>, or the class is not a job
</div>
</div>
</div>
+<div class="sect3">
+<h4 id="_52_coordinate_changes">52. Coordinate Changes</h4>
+<div class="paragraph">
+<p><code>grails-datamapping-async</code> provides the asynchronous programming model for Grails Data — the
+<code>AsyncEntity</code> trait and the <code>async</code> namespace — and is meant to be depended on directly by
+applications and libraries. Groups nested below <code>org.apache.grails</code> are reserved for implementation
+details of Grails, so the artifact moved from the <code>org.apache.grails.data</code> group to
+<code>org.apache.grails</code>. The artifact id is unchanged:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">implementation <span class="string"><span class="delimiter">"</span><span class="content">org.apache.grails:grails-datamapping-async</span><span class="delimiter">"</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The <a href="https://github.com/apache/grails-core/blob/8.0.x/RENAME.md">RENAME.md</a> reference table in the
+grails-core repository maps previous coordinate names to new names. The <code>rename_gradle_artifacts.sh</code>
+script in the <a href="https://github.com/apache/grails-core/tree/8.0.x/etc/bin">etc/bin</a> directory of the
+grails-core repository rewrites both the Grails 6 (<code>org.grails:grails-datastore-gorm-async</code>) and the
+Grails 7 (<code>org.apache.grails.data:grails-datamapping-async</code>) coordinates in a project’s Gradle files:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="console">./rename_gradle_artifacts.sh -l my/project/location</code></pre>
+</div>
+</div>
+</div>
</div>