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/08/25 07:55:45 UTC
(grails-website) branch asf-site-production updated: Deploying to documentation branch - 07:55:25
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 af68c236d10 Deploying to documentation branch - 07:55:25
af68c236d10 is described below
commit af68c236d10a9ae3cd245e658d51a43eda7af6a6
Author: codeconsole <co...@users.noreply.github.com>
AuthorDate: Tue Aug 25 07:55:29 2026 +0000
Deploying to documentation branch - 07:55:25
---
docs/snapshot/api/allclasses-frame.html | 5 +
docs/snapshot/api/grails/util/BuildSettings.html | 40 ++
docs/snapshot/api/index-all.html | 80 +++-
.../testing/mongo/EmbeddedReplicaSetSpec.html} | 133 ++++---
.../apache/grails/testing/mongo/package-frame.html | 2 +-
.../grails/testing/mongo/package-summary.html | 9 +
.../plugin/core/GrailsCompileStaticOptions.html | 68 +++-
.../GrailsGspCompileStaticProvider.html} | 92 +++--
.../grails/gradle/plugin/core/package-frame.html | 2 +-
.../grails/gradle/plugin/core/package-summary.html | 9 +
.../GenerateScaffoldedViewsTask.html} | 158 +++++---
.../{views/gsp => scaffolding}/package-frame.html | 10 +-
.../plugin/scaffolding}/package-summary.html | 50 +--
.../views/gsp/GroovyPageForkCompileTask.html | 30 ++
...gePlugin.ScaffoldedControllers.Parameters.html} | 122 +++---
...=> GroovyPagePlugin.ScaffoldedControllers.html} | 94 +++--
.../gradle/plugin/views/gsp/GroovyPagePlugin.html | 55 ++-
.../gradle/plugin/views/gsp/package-frame.html | 10 +-
.../gradle/plugin/views/gsp/package-summary.html | 34 ++
.../org/grails/gsp/compiler/GroovyPageParser.html | 48 ++-
.../gsp/compiler/GroovyPageTypeCheckingConfig.html | 41 +++
...ncWebRequestPromiseDecoratorLookupStrategy.html | 3 +-
.../taglib/WebRequestTemplateVariableBinding.html | 24 +-
docs/snapshot/api/overview-frame.html | 3 +
docs/snapshot/api/overview-summary.html | 330 +++++++++--------
docs/snapshot/api/package-list | 1 +
.../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 +-
.../manual/gettingStarted/embeddedMongo.html | 63 +++-
.../snapshot/grails-data/mongodb/manual/index.html | 63 +++-
.../grails-data/whats-new-manual/index.html | 2 +-
docs/snapshot/guide/index.html | 28 +-
docs/snapshot/guide/single.html | 408 +++++++++++++++++++--
.../guide/staticTypeCheckingAndCompilation.html | 28 ++
docs/snapshot/guide/theWebLayer.html | 379 +++++++++++++++++--
docs/snapshot/index.html | 30 +-
.../ref/Configuration/Application Properties.html | 15 +
docs/snapshot/ref/Tags - GSP/set.html | 12 +
47 files changed, 1894 insertions(+), 609 deletions(-)
diff --git a/docs/snapshot/api/allclasses-frame.html b/docs/snapshot/api/allclasses-frame.html
index 62a0a017ca1..cdebc388e68 100644
--- a/docs/snapshot/api/allclasses-frame.html
+++ b/docs/snapshot/api/allclasses-frame.html
@@ -1089,6 +1089,7 @@
<li><a href="org/grails/gorm/graphql/types/output/EmbeddedObjectTypeBuilder.html" title="class in org.grails.gorm.graphql.types.output" target="classFrame">EmbeddedObjectTypeBuilder</a></li>
<li><a href="org/grails/datastore/mapping/model/EmbeddedPersistentEntity.html" title="class in org.grails.datastore.mapping.model" target="classFrame">EmbeddedPersistentEntity</a></li>
<li><a href="org/grails/datastore/bson/query/EmbeddedQueryEncoder.html" title="interface in org.grails.datastore.bson.query" target="classFrame"><I>EmbeddedQueryEncoder</I></a></li>
+<li><a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html" title="class in org.apache.grails.testing.mongo" target="classFrame">EmbeddedReplicaSetSpec</a></li>
<li><a href="org/grails/datastore/mapping/model/types/mapping/EmbeddedWithMapping.html" title="class in org.grails.datastore.mapping.model.types.mapping" target="classFrame">EmbeddedWithMapping</a></li>
<li><a href="grails/views/api/internal/EmptyParameters.html" title="class in grails.views.api.internal" target="classFrame">EmptyParameters</a></li>
<li><a href="org/grails/boot/internal/EnableAutoConfiguration.html" title="annotation type in org.grails.boot.internal" target="classFrame">EnableAutoConfiguration</a></li>
@@ -1290,6 +1291,7 @@
<li><a href="org/apache/grails/buildsrc/GenerateAutoConfigurationImportsTask.html" title="class in org.apache.grails.buildsrc" target="classFrame">GenerateAutoConfigurationImportsTask</a></li>
<li><a href="org/grails/gradle/plugin/i18n/GenerateI18nDescriptorTask.html" title="class in org.grails.gradle.plugin.i18n" target="classFrame">GenerateI18nDescriptorTask</a></li>
<li><a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html" title="class in org.apache.grails.gradle.plugin.aot" target="classFrame">GenerateNativeMetadataTask</a></li>
+<li><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html" title="class in org.grails.gradle.plugin.scaffolding" target="classFrame">GenerateScaffoldedViewsTask</a></li>
<li><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GenerateTagLibraryIndexTask</a></li>
<li><a href="org/grails/orm/hibernate/cfg/domainbinding/util/GeneratorCreationContextWrapper.html" title="class in org.grails.orm.hibernate.cfg.domainbinding.util" target="classFrame">GeneratorCreationContextWrapper</a></li>
<li><a href="org/grails/spring/beans/factory/GenericBeanFactoryAccessor.html" title="class in org.grails.spring.beans.factory" target="classFrame">GenericBeanFactoryAccessor</a></li>
@@ -1502,6 +1504,7 @@
<li><a href="org/grails/gorm/graphql/plugin/binding/GrailsGraphQLDataBinder.html" title="class in org.grails.gorm.graphql.plugin.binding" target="classFrame">GrailsGraphQLDataBinder</a></li>
<li><a href="org/apache/grails/buildsrc/GrailsGroovydocPlugin.html" title="class in org.apache.grails.buildsrc" target="classFrame">GrailsGroovydocPlugin</a></li>
<li><a href="org/grails/gradle/plugin/views/json/GrailsGsonViewsPlugin.html" title="class in org.grails.gradle.plugin.views.json" target="classFrame">GrailsGsonViewsPlugin</a></li>
+<li><a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html" title="class in org.grails.gradle.plugin.core" target="classFrame">GrailsGspCompileStaticProvider</a></li>
<li><a href="org/apache/grails/web/layout/GrailsHTMLPageParser.html" title="class in org.apache.grails.web.layout" target="classFrame">GrailsHTMLPageParser</a></li>
<li><a href="org/grails/orm/hibernate/exceptions/GrailsHibernateConfigurationException.html" title="class in org.grails.orm.hibernate.exceptions" target="classFrame">GrailsHibernateConfigurationException</a></li>
<li><a href="org/grails/orm/hibernate/exceptions/GrailsHibernateException.html" title="class in org.grails.orm.hibernate.exceptions" target="classFrame">GrailsHibernateException</a></li>
@@ -1749,6 +1752,8 @@
<li><a href="org/grails/gsp/GroovyPageMetaInfo.html" title="class in org.grails.gsp" target="classFrame">GroovyPageMetaInfo</a></li>
<li><a href="org/grails/gsp/compiler/GroovyPageParser.html" title="class in org.grails.gsp.compiler" target="classFrame">GroovyPageParser</a></li>
<li><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPagePlugin</a></li>
+<li><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html" title="class in org.grails.gradle.plugin.views.gsp.GroovyPagePlugin" target="classFrame">GroovyPagePlugin.ScaffoldedControllers</a></li>
+<li><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters.html" title="interface in org.grails.gradle.plugin.views.gsp.GroovyPagePlugin.ScaffoldedControllers" target="classFrame"><I>GroovyPagePlugin.ScaffoldedControllers.Parameters</I></a></li>
<li><a href="org/grails/gsp/GroovyPageResourceLoader.html" title="class in org.grails.gsp" target="classFrame">GroovyPageResourceLoader</a></li>
<li><a href="org/grails/gsp/io/GroovyPageResourceScriptSource.html" title="class in org.grails.gsp.io" target="classFrame">GroovyPageResourceScriptSource</a></li>
<li><a href="org/grails/gsp/io/GroovyPageScriptSource.html" title="interface in org.grails.gsp.io" target="classFrame"><I>GroovyPageScriptSource</I></a></li>
diff --git a/docs/snapshot/api/grails/util/BuildSettings.html b/docs/snapshot/api/grails/util/BuildSettings.html
index 04482ff7ef1..016b26b0717 100644
--- a/docs/snapshot/api/grails/util/BuildSettings.html
+++ b/docs/snapshot/api/grails/util/BuildSettings.html
@@ -212,6 +212,19 @@ extends java.lang.Object</pre>
<CODE>@GrailsCompileStatic</CODE> automatically during compilation.</td>
</tr>
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#COMPILE_STATIC_GSP">COMPILE_STATIC_GSP</a></code></td>
+ <td class="colLast">A property name that, when set to <CODE>true</CODE>, compiles every GSP page statically.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#COMPILE_STATIC_GSP_STRICT">COMPILE_STATIC_GSP_STRICT</a></code></td>
+ <td class="colLast">A property name that, when set to <CODE>true</CODE>, holds every page to the names it declares
+ rather than only the pages that declare a model.</td>
+ </tr>
+
<tr class="rowColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
<td class="colLast"><code><a href="#COMPILE_STATIC_SERVICES">COMPILE_STATIC_SERVICES</a></code></td>
@@ -652,6 +665,33 @@ extends java.lang.Object</pre>
</li>
</ul>
+ <a name="COMPILE_STATIC_GSP"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>COMPILE_STATIC_GSP</strong></h4>
+ <p> A property name that, when set to <CODE>true</CODE>, compiles every GSP page statically.
+
+ <p>Unlike the artefact opt-ins above this is not a name of its own: it is the configuration
+ setting <CODE>grails.views.gsp.compileStatic</CODE>, stated as a system property so that it reaches
+ both the build's page compiler and the running application, which compiles a page again when it
+ changes. A page compiled one way by the build and another way while being developed would be
+ worse than not offering the build option at all.</p></p>
+ </li>
+ </ul>
+
+ <a name="COMPILE_STATIC_GSP_STRICT"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>COMPILE_STATIC_GSP_STRICT</strong></h4>
+ <p> A property name that, when set to <CODE>true</CODE>, holds every page to the names it declares
+ rather than only the pages that declare a model.
+
+ <p>As with <a href='#COMPILE_STATIC_GSP'>COMPILE_STATIC_GSP</a> this is the configuration setting
+ <CODE>grails.views.gsp.compileStaticConfig.strict</CODE> stated as a system property, so that it
+ reaches both the build's page compiler and the running application.</p></p>
+ </li>
+ </ul>
+
<a name="COMPILE_STATIC_SERVICES"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index 74e2334d434..c8c82f86e05 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -1782,8 +1782,7 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Display the property in all views (input and output).
</div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html#all" title="Property in GrailsCompileStaticOptions">all</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html">GrailsCompileStaticOptions</a>
-</dt><dd> <div class="block">Whether every controller, service and tag library should be compiled with <CODE>@GrailsCompileStatic</CODE>.
- </div></dd>
+</dt><dd> <div class="block">What every artefact type falls back to where it says nothing of its own. </div></dd>
<dt><span class="strong"><a href="grails/web/mime/MimeType.html#ALL" title="Field in MimeType">ALL</a></span> - Field in <a href="grails/web/mime/MimeType.html">MimeType</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gorm/graphql/entity/dsl/Operations.html#all" title="Property in Operations">all</a></span> - Property in <a href="org/grails/gorm/graphql/entity/dsl/Operations.html">Operations</a>
@@ -2804,6 +2803,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticArtefactsProvider.html#asArguments()" title="Method in GrailsCompileStaticArtefactsProvider">asArguments()</a></span> - Method in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticArtefactsProvider.html">GrailsCompileStaticArtefactsProvider</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html#asArguments()" title="Method in GrailsGspCompileStaticProvider">asArguments()</a></span> - Method in <a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html">GrailsGspCompileStaticProvider</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/core/RunAppPidFileProvider.html#asArguments()" title="Method in RunAppPidFileProvider">asArguments()</a></span> - Method in <a href="org/grails/gradle/plugin/core/RunAppPidFileProvider.html">RunAppPidFileProvider</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/mongodb/geo/Point.html#asArray()" title="Method in Point">asArray()</a></span> - Method in <a href="grails/mongodb/geo/Point.html">Point</a>
@@ -6220,6 +6221,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/data/testing/tck/base/GrailsDataTckManager.html#cleanupMultiTenantMultiDataSource()" title="Method in GrailsDataTckManager">cleanupMultiTenantMultiDataSource()</a></span> - Method in <a href="org/apache/grails/data/testing/tck/base/GrailsDataTckManager.html">GrailsDataTckManager</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html#cleanupSpec()" title="Method in EmbeddedReplicaSetSpec">cleanupSpec()</a></span> - Method in <a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html">EmbeddedReplicaSetSpec</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/data/testing/tck/base/GrailsDataTckManager.html#cleanupSpec()" title="Method in GrailsDataTckManager">cleanupSpec()</a></span> - Method in <a href="org/apache/grails/data/testing/tck/base/GrailsDataTckManager.html">GrailsDataTckManager</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/data/testing/tck/base/GrailsDataTckSpec.html#cleanupSpec()" title="Method in GrailsDataTckSpec">cleanupSpec()</a></span> - Method in <a href="org/apache/grails/data/testing/tck/base/GrailsDataTckSpec.html">GrailsDataTckSpec</a>
@@ -7215,6 +7218,11 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageParser.html#COMPILE_STATIC_DIRECTIVE" title="Field in GroovyPageParser">COMPILE_STATIC_DIRECTIVE</a></span> - Field in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="grails/util/BuildSettings.html#COMPILE_STATIC_GSP" title="Field in BuildSettings">COMPILE_STATIC_GSP</a></span> - Field in <a href="grails/util/BuildSettings.html">BuildSettings</a>
+</dt><dd> <div class="block">A property name that, when set to <CODE>true</CODE>, compiles every GSP page statically.</div></dd>
+<dt><span class="strong"><a href="grails/util/BuildSettings.html#COMPILE_STATIC_GSP_STRICT" title="Field in BuildSettings">COMPILE_STATIC_GSP_STRICT</a></span> - Field in <a href="grails/util/BuildSettings.html">BuildSettings</a>
+</dt><dd> <div class="block">A property name that, when set to <CODE>true</CODE>, holds every page to the names it declares
+ rather than only the pages that declare a model.</div></dd>
<dt><span class="strong"><a href="grails/plugin/markup/view/MarkupViewTemplateEngine.html#COMPILE_STATIC" title="Field in MarkupViewTemplateEngine">COMPILE_STATIC</a></span> - Field in <a href="grails/plugin/markup/view/MarkupViewTemplateEngine.html">MarkupViewTemplateEngine</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/util/BuildSettings.html#COMPILE_STATIC_SERVICES" title="Field in BuildSettings">COMPILE_STATIC_SERVICES</a></span> - Field in <a href="grails/util/BuildSettings.html">BuildSettings</a>
@@ -7296,6 +7304,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsExtension.html#compileStatic" title="Property in GrailsExtension">compileStatic</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsExtension.html">GrailsExtension</a>
</dt><dd> <div class="block">Lazy opt-ins for compiling controllers, services and tag libraries with <CODE>@GrailsCompileStatic</CODE>
automatically, configured through the nested <CODE>compileStatic</CODE> block. </div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html#compileStatic" title="Property in GroovyPageForkCompileTask">compileStatic</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html">GroovyPageForkCompileTask</a>
+</dt><dd> <div class="block">Whether the pages this task compiles are compiled statically.</div></dd>
<dt><span class="strong"><a href="org/grails/compiler/injection/CompileStaticArtefactInjector.html" title="Class in org.grails.compiler.injection">CompileStaticArtefactInjector</a></span> - Class in <a href="./org/grails/compiler/injection/package-summary.html">org.grails.compiler.injection</a>
</dt><dd><div class="block">Opts controllers, services and tag libraries into <CODE>@GrailsCompileStatic</CODE> automatically when the
corresponding build opt-in is enabled.</div></dd>
@@ -7307,6 +7317,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/springsecurity/web/access/intercept/AnnotationFilterInvocationDefinition.html#compileStaticRules(java.lang.Object)" title="Method in AnnotationFilterInvocationDefinition">compileStaticRules(java.lang.Object)</a></span> - Method in <a href="grails/plugin/springsecurity/web/access/intercept/AnnotationFilterInvocationDefinition.html">AnnotationFilterInvocationDefinition</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html#compileStaticStrict" title="Property in GroovyPageForkCompileTask">compileStaticStrict</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html">GroovyPageForkCompileTask</a>
+</dt><dd> <div class="block">Whether the pages this task compiles are held to the names they declare. </div></dd>
<dt><span class="strong"><a href="org/grails/cli/profile/commands/ArgumentCompletingCommand.html#complete(org.grails.build.parsing.CommandLine, org.grails.cli.profile.CommandDescription, List<Candidate>)" title="Method in ArgumentCompletingCommand">complete(org.grails.build.parsing.CommandLine, org.grails.cli.profile.CommandDescription, List<Candidate>)</a></span> - Method in <a href="org/grails/cli/profile/commands/ArgumentCompletingCommand.html">ArgumentCompletingCommand</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/interactive/completers/ClosureCompleter.html#complete(org.jline.reader.LineReader, org.jline.reader.ParsedLine, List<Candidate>)" title="Method in ClosureCompleter">complete(org.jline.reader.LineReader, org.jline.reader.ParsedLine, List<Candidate>)</a></span> - Method in <a href="org/grails/cli/interactive/completers/ClosureCompleter.html">ClosureCompleter</a>
@@ -7491,6 +7503,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageParser.html#CONFIG_PROPERTY_GSP_COMPILESTATIC" title="Field in GroovyPageParser">CONFIG_PROPERTY_GSP_COMPILESTATIC</a></span> - Field in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageParser.html#CONFIG_PROPERTY_GSP_COMPILESTATIC_STRICT" title="Field in GroovyPageParser">CONFIG_PROPERTY_GSP_COMPILESTATIC_STRICT</a></span> - Field in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/GroovyPagesTemplateEngine.html#CONFIG_PROPERTY_GSP_ENABLE_RELOAD" title="Field in GroovyPagesTemplateEngine">CONFIG_PROPERTY_GSP_ENABLE_RELOAD</a></span> - Field in <a href="org/grails/gsp/GroovyPagesTemplateEngine.html">GroovyPagesTemplateEngine</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageParser.html#CONFIG_PROPERTY_GSP_ENCODING" title="Field in GroovyPageParser">CONFIG_PROPERTY_GSP_ENCODING</a></span> - Field in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
@@ -14374,6 +14388,11 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/bson/query/EmbeddedQueryEncoder.html" title="Interface in org.grails.datastore.bson.query">EmbeddedQueryEncoder</a></span> - Interface in <a href="./org/grails/datastore/bson/query/package-summary.html">org.grails.datastore.bson.query</a>
</dt><dd><div class="block">Encodes an embedded object as a query</div></dd>
+<dt><span class="strong"><a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html" title="Class in org.apache.grails.testing.mongo">EmbeddedReplicaSetSpec</a></span> - Class in <a href="./org/apache/grails/testing/mongo/package-summary.html">org.apache.grails.testing.mongo</a>
+</dt><dd><div class="block">A base for the specifications that need real MongoDB transactions, which a standalone server
+ refuses: they are served by an embedded replica set of one.</div></dd>
+<dt><span class="strong"><a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html#EmbeddedReplicaSetSpec()" title="Constructor in EmbeddedReplicaSetSpec">EmbeddedReplicaSetSpec()</a></span> - Constructor in <a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html">EmbeddedReplicaSetSpec</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/model/types/mapping/EmbeddedWithMapping.html" title="Class in org.grails.datastore.mapping.model.types.mapping">EmbeddedWithMapping</a></span> - Class in <a href="./org/grails/datastore/mapping/model/types/mapping/package-summary.html">org.grails.datastore.mapping.model.types.mapping</a>
</dt><dd><div class="block">An <a href='../../../../../../../org/grails/datastore/mapping/model/types/Embedded.html' title='Embedded'>Embedded</a> property with a <a href='../../../../../../../org/grails/datastore/mapping/model/PropertyMapping.html' title='PropertyMapping'>PropertyMapping</a></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/mapping/model/types/mapping/EmbeddedWithMapping.html#EmbeddedWithMapping(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.beans.PropertyDescriptor, PropertyMapping<T>)" title="Constructor in EmbeddedWithMapping">EmbeddedWithMapping(org.grails.datastore.mapping.model.PersistentEntity, org.grails.datastore.mapping.model.MappingContext, java.beans.PropertyDescriptor, PropertyMa [...]
@@ -17919,6 +17938,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html#generate()" title="Method in GenerateNativeMetadataTask">generate()</a></span> - Method in <a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html">GenerateNativeMetadataTask</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html#generate()" title="Method in GenerateScaffoldedViewsTask">generate()</a></span> - Method in <a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html">GenerateScaffoldedViewsTask</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html#generate()" title="Method in GenerateTagLibraryIndexTask">generate()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GenerateTagLibraryIndexTask.html">GenerateTagLibraryIndexTask</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/cache/GrailsCacheKeyGenerator.html#generate(java.lang.String, java.lang.String, int, java.util.Map)" title="Method in GrailsCacheKeyGenerator">generate(java.lang.String, java.lang.String, int, java.util.Map)</a></span> - Method in <a href="grails/plugin/cache/GrailsCacheKeyGenerator.html">GrailsCacheKeyGenerator</a>
@@ -18014,6 +18035,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html#generateRollbackStatements(liquibase.database.Database)" title="Method in GroovyChange">generateRollbackStatements(liquibase.database.Database)</a></span> - Method in <a href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html">GroovyChange</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html" title="Class in org.grails.gradle.plugin.scaffolding">GenerateScaffoldedViewsTask</a></span> - Class in <a href="./org/grails/gradle/plugin/scaffolding/package-summary.html">org.grails.gradle.plugin.scaffolding</a>
+</dt><dd><div class="block">Writes the views a scaffolded controller would otherwise generate on its first request.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html#GenerateScaffoldedViewsTask()" title="Constructor in GenerateScaffoldedViewsTask">GenerateScaffoldedViewsTask()</a></span> - Constructor in <a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html">GenerateScaffoldedViewsTask</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/services/transform/ServiceTransformation.html#generateServiceDescriptor(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)" title="Method in ServiceTransformation">generateServiceDescriptor(org.codehaus.groovy.control.SourceUnit, org.codehaus.groovy.ast.ClassNode)</a></span> - Method in <a href="org/grails/datastore/gorm/services/transform/ServiceTransformation.html">ServiceTransformation</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html#generateStatements(liquibase.database.Database)" title="Method in GroovyChange">generateStatements(liquibase.database.Database)</a></span> - Method in <a href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html">GroovyChange</a>
@@ -18619,6 +18644,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"><DL><DT><B>deprecated:</B></DT><DD>Use <a href='../../../../org/grails/web/servlet/mvc/GrailsWebRequest.html#getContextPath()' title='instead'>instead</a></DD></DL> </div></dd>
<dt><span class="strong"><a href="grails/util/Metadata.html#getApplicationVersion()" title="Method in Metadata">getApplicationVersion()</a></span> - Method in <a href="grails/util/Metadata.html">Metadata</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html#getApplicationViews()" title="Method in GenerateScaffoldedViewsTask">getApplicationViews()</a></span> - Method in <a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html">GenerateScaffoldedViewsTask</a>
+</dt><dd> <div class="block">The application's own views; anything declared here is left alone.</div></dd>
<dt><span class="strong"><a href="grails/validation/ConstrainedDelegate.html#getAppliedConstraint(java.lang.String)" title="Method in ConstrainedDelegate">getAppliedConstraint(java.lang.String)</a></span> - Method in <a href="grails/validation/ConstrainedDelegate.html">ConstrainedDelegate</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/gorm/validation/ConstrainedProperty.html#getAppliedConstraint(java.lang.String)" title="Method in ConstrainedProperty">getAppliedConstraint(java.lang.String)</a></span> - Method in <a href="grails/gorm/validation/ConstrainedProperty.html">ConstrainedProperty</a>
@@ -19437,6 +19464,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html#getClassesDirs()" title="Method in GenerateNativeMetadataTask">getClassesDirs()</a></span> - Method in <a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html">GenerateNativeMetadataTask</a>
</dt><dd> <div class="block">Compiled application classes.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html#getClassesDirs()" title="Method in GenerateScaffoldedViewsTask">getClassesDirs()</a></span> - Method in <a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html">GenerateScaffoldedViewsTask</a>
+</dt><dd> <div class="block">Compiled application classes, searched for scaffolded controllers.</div></dd>
<dt><span class="strong"><a href="grails/core/DefaultGrailsApplication.html#GETCLASSESMETH_PATTERN" title="Field in DefaultGrailsApplication">GETCLASSESMETH_PATTERN</a></span> - Field in <a href="grails/core/DefaultGrailsApplication.html">DefaultGrailsApplication</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/core/DefaultGrailsApplication.html#GETCLASSESPROP_PATTERN" title="Field in DefaultGrailsApplication">GETCLASSESPROP_PATTERN</a></span> - Field in <a href="grails/core/DefaultGrailsApplication.html">DefaultGrailsApplication</a>
@@ -20008,6 +20037,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/web/api/WebAttributes.html#getControllerNamespace()" title="Method in WebAttributes">getControllerNamespace()</a></span> - Method in <a href="grails/web/api/WebAttributes.html">WebAttributes</a>
</dt><dd> <div class="block">Obtains the currently executing controller namespace</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters.html#getControllers()" title="Method in GroovyPagePlugin.ScaffoldedControllers.Parameters">getControllers()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters.html">GroovyPagePlugin.ScaffoldedControllers.Parameters</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/testing/web/UrlMappingsUnitTest.html#getControllersToMock()" title="Method in UrlMappingsUnitTest">getControllersToMock()</a></span> - Method in <a href="grails/testing/web/UrlMappingsUnitTest.html">UrlMappingsUnitTest</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/artefact/Controller.html#getControllerUri()" title="Method in Controller">getControllerUri()</a></span> - Method in <a href="grails/artefact/Controller.html">Controller</a>
@@ -24053,6 +24084,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Directory contributed to <CODE>processResources</CODE>; holds <a href='#DESCRIPTOR_PATH'>DESCRIPTOR_PATH</a>.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html#getOutputDirectory()" title="Method in GenerateNativeMetadataTask">getOutputDirectory()</a></span> - Method in <a href="org/apache/grails/gradle/plugin/aot/GenerateNativeMetadataTask.html">GenerateNativeMetadataTask</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html#getOutputDirectory()" title="Method in GenerateScaffoldedViewsTask">getOutputDirectory()</a></span> - Method in <a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html">GenerateScaffoldedViewsTask</a>
+</dt><dd> <div class="block">Where the generated views are written.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/gradle/plugin/aot/NativeMetadataExtension.html#getOutputDirectory()" title="Method in NativeMetadataExtension">getOutputDirectory()</a></span> - Method in <a href="org/apache/grails/gradle/plugin/aot/NativeMetadataExtension.html">NativeMetadataExtension</a>
</dt><dd> <div class="block">Where what was recorded is merged, in the application's sources so it can be reviewed.</div></dd>
<dt><span class="strong"><a href="org/apache/grails/gradle/plugin/aot/TraceNativeMetadataTask.html#getOutputDirectory()" title="Method in TraceNativeMetadataTask">getOutputDirectory()</a></span> - Method in <a href="org/apache/grails/gradle/plugin/aot/TraceNativeMetadataTask.html">TraceNativeMetadataTask</a>
@@ -26358,12 +26391,16 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block">Obtain a template by path</div></dd>
<dt><span class="strong"><a href="org/apache/grails/web/layout/SpringMVCViewDecorator.html#getTemplate()" title="Method in SpringMVCViewDecorator">getTemplate()</a></span> - Method in <a href="org/apache/grails/web/layout/SpringMVCViewDecorator.html">SpringMVCViewDecorator</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html#getTemplateClasspath()" title="Method in GenerateScaffoldedViewsTask">getTemplateClasspath()</a></span> - Method in <a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html">GenerateScaffoldedViewsTask</a>
+</dt><dd> <div class="block">The classpath the scaffolding templates are read from. </div></dd>
<dt><span class="strong"><a href="grails/views/api/GrailsView.html#getTemplateEngine()" title="Method in GrailsView">getTemplateEngine()</a></span> - Method in <a href="grails/views/api/GrailsView.html">GrailsView</a>
</dt><dd> <div class="block">The template engine</div></dd>
<dt><span class="strong"><a href="grails/views/json/test/JsonViewUnitTest.html#getTemplateEngine()" title="Method in JsonViewUnitTest">getTemplateEngine()</a></span> - Method in <a href="grails/views/json/test/JsonViewUnitTest.html">JsonViewUnitTest</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/formfields/FormFieldsTemplateService.html#getTemplateFor(java.lang.String)" title="Method in FormFieldsTemplateService">getTemplateFor(java.lang.String)</a></span> - Method in <a href="grails/plugin/formfields/FormFieldsTemplateService.html">FormFieldsTemplateService</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html#getTemplateOverrides()" title="Method in GenerateScaffoldedViewsTask">getTemplateOverrides()</a></span> - Method in <a href="org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html">GenerateScaffoldedViewsTask</a>
+</dt><dd> <div class="block">Application template overrides, normally <CODE>src/main/templates/scaffolding</CODE>.</div></dd>
<dt><span class="strong"><a href="grails/views/ViewConfiguration.html#getTemplatePath()" title="Method in ViewConfiguration">getTemplatePath()</a></span> - Method in <a href="grails/views/ViewConfiguration.html">ViewConfiguration</a>
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Path to the templates</DD></DL></div></dd>
<dt><span class="strong"><a href="grails/artefact/Controller.html#getTemplateUri(java.lang.String)" title="Method in Controller">getTemplateUri(java.lang.String)</a></span> - Method in <a href="grails/artefact/Controller.html">Controller</a>
@@ -28142,6 +28179,11 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd><div class="block">Concrete implementation of plugin for JSON views</div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/views/json/GrailsGsonViewsPlugin.html#GrailsGsonViewsPlugin()" title="Constructor in GrailsGsonViewsPlugin">GrailsGsonViewsPlugin()</a></span> - Constructor in <a href="org/grails/gradle/plugin/views/json/GrailsGsonViewsPlugin.html">GrailsGsonViewsPlugin</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html" title="Class in org.grails.gradle.plugin.core">GrailsGspCompileStaticProvider</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">Publishes the <CODE>grails { compileStatic { gsp </CODE> }} opt-in to a forked JVM as the
+ BuildSettings#COMPILE_STATIC_GSP#COMPILE_STATIC_GSP system property.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html#GrailsGspCompileStaticProvider(org.grails.gradle.plugin.core.GrailsCompileStaticOptions)" title="Constructor in GrailsGspCompileStaticProvider">GrailsGspCompileStaticProvider(org.grails.gradle.plugin.core.GrailsCompileStaticOptions)</a></span> - Constructor in <a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html">GrailsGspCompileStaticProvider</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/exceptions/GrailsHibernateConfigurationException.html" title="Class in org.grails.orm.hibernate.exceptions">GrailsHibernateConfigurationException</a></span> - Class in <a href="./org/grails/orm/hibernate/exceptions/package-summary.html">org.grails.orm.hibernate.exceptions</a>
</dt><dd><div class="block">Thrown when configuration Hibernate for GORM features.</div></dd>
<dt><span class="strong"><a href="org/grails/orm/hibernate/exceptions/GrailsHibernateConfigurationException.html#GrailsHibernateConfigurationException(java.lang.String, java.lang.Throwable)" title="Constructor in GrailsHibernateConfigurationException">GrailsHibernateConfigurationException(java.lang.String, java.lang.Throwable)</a></span> - Constructor in <a href="org/grails/orm/hibernate/exceptions/GrailsHibernateConfigurationException.html">GrailsHibernateConfigurationException</a>
@@ -29192,6 +29234,12 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html" title="Class in org.grails.gradle.plugin.views.gsp">GroovyPagePlugin</a></span> - Class in <a href="./org/grails/gradle/plugin/views/gsp/package-summary.html">org.grails.gradle.plugin.views.gsp</a>
</dt><dd><div class="block">A plugin that adds support for compiling Groovy Server Pages (GSP)</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html" title="Class in org.grails.gradle.plugin.views.gsp.GroovyPagePlugin">GroovyPagePlugin.ScaffoldedControllers</a></span> - Class in <a href="./org/grails/gradle/plugin/views/gsp/package-summary.html">org.grails.gradle.plugin.views.gsp</a>
+</dt><dd><div class="block">Reads the controller sources for the mark of a scaffolded one, as a tracked build input.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters.html" title="Interface in org.grails.gradle.plugin.views.gsp.GroovyPagePlugin.ScaffoldedControllers">GroovyPagePlugin.ScaffoldedControllers.Parameters</a></span> - Interface in <a href="./org/grails/gradle/plugin/views/gsp/package-summary.html">org.grails.gradle.plugin.views.gsp</a>
+</dt><dd><div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html#GroovyPagePlugin.ScaffoldedControllers()" title="Constructor in GroovyPagePlugin.ScaffoldedControllers">GroovyPagePlugin.ScaffoldedControllers()</a></span> - Constructor in <a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html">GroovyPagePlugin.ScaffoldedControllers</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html#GroovyPagePlugin()" title="Constructor in GroovyPagePlugin">GroovyPagePlugin()</a></span> - Constructor in <a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html">GroovyPagePlugin</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/GroovyPageResourceLoader.html" title="Class in org.grails.gsp">GroovyPageResourceLoader</a></span> - Class in <a href="./org/grails/gsp/package-summary.html">org.grails.gsp</a>
@@ -29388,6 +29436,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/plugins/web/taglib/GrailsLayoutTagLib.html#GSP_GRAILS_LAYOUT_PAGE" title="Field in GrailsLayoutTagLib">GSP_GRAILS_LAYOUT_PAGE</a></span> - Field in <a href="org/grails/plugins/web/taglib/GrailsLayoutTagLib.html">GrailsLayoutTagLib</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html#gsp" title="Property in GrailsCompileStaticOptions">gsp</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html">GrailsCompileStaticOptions</a>
+</dt><dd> <div class="block">Whether every GSP page under <CODE>grails-app/views</CODE> should be compiled statically, by stating
+ the <CODE>grails.views.gsp.compileStatic</CODE> configuration setting for both the build and the
+ running application. </div></dd>
<dt><span class="strong"><a href="org/apache/grails/common/compiler/GroovyTransformOrder.html#GSP_LINE_ORDER" title="Field in GroovyTransformOrder">GSP_LINE_ORDER</a></span> - Field in <a href="org/apache/grails/common/compiler/GroovyTransformOrder.html">GroovyTransformOrder</a>
</dt><dd> <div class="block">Adds line numbers to GSPs</div></dd>
<dt><span class="strong"><a href="org/grails/plugins/web/GroovyPagesGrailsPlugin.html#GSP_RELOAD_INTERVAL" title="Field in GroovyPagesGrailsPlugin">GSP_RELOAD_INTERVAL</a></span> - Field in <a href="org/grails/plugins/web/GroovyPagesGrailsPlugin.html">GroovyPagesGrailsPlugin</a>
@@ -33392,6 +33444,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>Should compile statically</DD></DL></div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticArtefactsProvider.html#isCompileStaticControllers()" title="Method in GrailsCompileStaticArtefactsProvider">isCompileStaticControllers()</a></span> - Method in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticArtefactsProvider.html">GrailsCompileStaticArtefactsProvider</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html#isCompileStaticGsp()" title="Method in GrailsGspCompileStaticProvider">isCompileStaticGsp()</a></span> - Method in <a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html">GrailsGspCompileStaticProvider</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/GroovyPageMetaInfo.html#isCompileStaticMode()" title="Method in GroovyPageMetaInfo">isCompileStaticMode()</a></span> - Method in <a href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageParser.html#isCompileStaticMode()" title="Method in GroovyPageParser">isCompileStaticMode()</a></span> - Method in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
@@ -34848,6 +34902,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/cli/gradle/RunningApplicationProcess.html#isStopRequested(java.io.File)" title="Method in RunningApplicationProcess">isStopRequested(java.io.File)</a></span> - Method in <a href="org/grails/cli/gradle/RunningApplicationProcess.html">RunningApplicationProcess</a>
</dt><dd> <div class="block"> <DL><DT><B>Parameters:</B></DT><DD><code>buildDir</code> - the project build directory</DD></DL></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html#isStrict()" title="Method in GrailsGspCompileStaticProvider">isStrict()</a></span> - Method in <a href="org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html">GrailsGspCompileStaticProvider</a>
+</dt><dd> <div class="block">Strictness only reaches the compiler where pages are compiled statically, so it is reported as
+ false while that is off. </div></dd>
<dt><span class="strong"><a href="org/grails/taglib/index/TagLibraryIndex.html#isStrict()" title="Method in TagLibraryIndex">isStrict()</a></span> - Method in <a href="org/grails/taglib/index/TagLibraryIndex.html">TagLibraryIndex</a>
</dt><dd> <div class="block">Whether the build asked for a tag no compiled tag library declares to fail compilation.</div></dd>
<dt><span class="strong"><a href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html#isStringType(java.lang.Class)" title="Method in DefaultJsonViewHelper">isStringType(java.lang.Class)</a></span> - Method in <a href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html">DefaultJsonViewHelper</a>
@@ -39391,6 +39448,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/datastore/gorm/mongodb/boot/autoconfigure/MongoDbGormAutoConfiguration.html#mongoTransactionManager()" title="Method in MongoDbGormAutoConfiguration">mongoTransactionManager()</a></span> - Method in <a href="org/grails/datastore/gorm/mongodb/boot/autoconfigure/MongoDbGormAutoConfiguration.html">MongoDbGormAutoConfiguration</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html#mongoUrl" title="Field in EmbeddedReplicaSetSpec">mongoUrl</a></span> - Field in <a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html">EmbeddedReplicaSetSpec</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/web/json/JSONTokener.html#more()" title="Method in JSONTokener">more()</a></span> - Method in <a href="org/grails/web/json/JSONTokener.html">JSONTokener</a>
</dt><dd> <div class="block">Determine if the source string still contains characters that next()
can consume.</div></dd>
@@ -40860,6 +40919,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/springframework/security/access/intercept/AbstractSecurityInterceptor.html#observeOncePerRequest" title="Property in AbstractSecurityInterceptor">observeOncePerRequest</a></span> - Property in <a href="org/springframework/security/access/intercept/AbstractSecurityInterceptor.html">AbstractSecurityInterceptor</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html#obtain()" title="Method in GroovyPagePlugin.ScaffoldedControllers">obtain()</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html">GroovyPagePlugin.ScaffoldedControllers</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/web/layout/EmbeddedGrailsLayoutView.html#obtainContent(Map<String,Object>, org.grails.web.servlet.mvc.GrailsWebRequest, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)" title="Method in EmbeddedGrailsLayoutView">obtainContent(Map<String,Object>, org.grails.web.servlet.mvc.GrailsWebRequest, jakarta.servlet.http.HttpServletRequest, jakarta.servlet.http.HttpServletResponse)</a></span> - Method in <a [...]
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/springframework/security/access/intercept/AbstractSecurityInterceptor.html#obtainSecurityMetadataSource()" title="Method in AbstractSecurityInterceptor">obtainSecurityMetadataSource()</a></span> - Method in <a href="org/springframework/security/access/intercept/AbstractSecurityInterceptor.html">AbstractSecurityInterceptor</a>
@@ -41903,6 +41964,9 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/gsp/PageRenderer.html#PageRenderer(org.grails.gsp.GroovyPagesTemplateEngine)" title="Constructor in PageRenderer">PageRenderer(org.grails.gsp.GroovyPagesTemplateEngine)</a></span> - Constructor in <a href="grails/gsp/PageRenderer.html">PageRenderer</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html#pageScopeVariables" title="Field in GroovyPageTypeCheckingConfig">pageScopeVariables</a></span> - Field in <a href="org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html">GroovyPageTypeCheckingConfig</a>
+</dt><dd> <div class="block">Names the page introduces for itself, through the <CODE>var</CODE> and <CODE>status</CODE> attributes of
+ the tags it calls -- <CODE><g:set var="total"/></CODE>, <CODE><g:each var="book"/></CODE> and the like.</div></dd>
<dt><span class="strong"><a href="grails/plugin/json/view/api/internal/DefaultHalViewHelper.html#paginate(java.lang.Object, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String)" title="Method in DefaultHalViewHelper">paginate(java.lang.Object, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String)</a></span> - Method in <a href="grails/plugin/json/view/api/internal/DefaultHalViewHelper.html">DefaultHalViewHelper</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="grails/plugin/json/view/api/HalViewHelper.html#paginate(java.lang.Object, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String)" title="Method in HalViewHelper">paginate(java.lang.Object, java.lang.Integer, java.lang.Integer, java.lang.Integer, java.lang.String, java.lang.String)</a></span> - Method in <a href="grails/plugin/json/view/api/HalViewHelper.html">HalViewHelper</a>
@@ -48016,6 +48080,9 @@ if (location.href.indexOf('is-external=true') == -1) {
<CODE>doWithSpring()</CODE> bean DSL. </div></dd>
<dt><span class="strong"><a href="grails/plugin/scaffolding/ScaffoldingViewResolverDefinitionPostProcessor.html#ScaffoldingViewResolverDefinitionPostProcessor()" title="Constructor in ScaffoldingViewResolverDefinitionPostProcessor">ScaffoldingViewResolverDefinitionPostProcessor()</a></span> - Constructor in <a href="grails/plugin/scaffolding/ScaffoldingViewResolverDefinitionPostProcessor.html">ScaffoldingViewResolverDefinitionPostProcessor</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html#scaffoldsAnyController(org.gradle.api.Project)" title="Method in GroovyPagePlugin">scaffoldsAnyController(org.gradle.api.Project)</a></span> - Method in <a href="org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html">GroovyPagePlugin</a>
+</dt><dd> <div class="block">Whether any controller in this project is scaffolded, which decides whether the views are
+ staged before they are compiled. </div></dd>
<dt><span class="strong"><a href="grails/plugin/scaffolding/ScaffoldService.html" title="Interface in grails.plugin.scaffolding">ScaffoldService</a></span> - Interface in <a href="./grails/plugin/scaffolding/package-summary.html">grails.plugin.scaffolding</a>
</dt><dd><div class="block">Scaffold service interface providing CRUD operations for domain entities.</div></dd>
<dt><span class="strong"><a href="grails/plugin/scaffolding/ScaffoldingViewResolver.html#scaffoldValueCache" title="Field in ScaffoldingViewResolver">scaffoldValueCache</a></span> - Field in <a href="grails/plugin/scaffolding/ScaffoldingViewResolver.html">ScaffoldingViewResolver</a>
@@ -51255,6 +51322,8 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/data/testing/tck/tests/DomainEventsSpec.html#setupSpec()" title="Method in DomainEventsSpec">setupSpec()</a></span> - Method in <a href="org/apache/grails/data/testing/tck/tests/DomainEventsSpec.html">DomainEventsSpec</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html#setupSpec()" title="Method in EmbeddedReplicaSetSpec">setupSpec()</a></span> - Method in <a href="org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html">EmbeddedReplicaSetSpec</a>
+</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/data/testing/tck/tests/EnumSpec.html#setupSpec()" title="Method in EnumSpec">setupSpec()</a></span> - Method in <a href="org/apache/grails/data/testing/tck/tests/EnumSpec.html">EnumSpec</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/apache/grails/data/testing/tck/tests/FindByExampleSpec.html#setupSpec()" title="Method in FindByExampleSpec">setupSpec()</a></span> - Method in <a href="org/apache/grails/data/testing/tck/tests/FindByExampleSpec.html">FindByExampleSpec</a>
@@ -53032,8 +53101,15 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a href="org/grails/test/io/MultiplexingOutputStream.html#streams" title="Property in MultiplexingOutputStream">streams</a></span> - Property in <a href="org/grails/test/io/MultiplexingOutputStream.html">MultiplexingOutputStream</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a href="org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html#strict" title="Field in GroovyPageTypeCheckingConfig">strict</a></span> - Field in <a href="org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html">GroovyPageTypeCheckingConfig</a>
+</dt><dd> <div class="block">Whether a name the page never declares, and a member read from something whose type is not
+ known, fail the compilation rather than resolving as they would in a page that is not compiled
+ statically.</div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html#STRICT_KEY" title="Property in TagLibraryIndexFiles">STRICT_KEY</a></span> - Property in <a href="org/grails/gradle/plugin/views/gsp/TagLibraryIndexFiles.html">TagLibraryIndexFiles</a>
</dt><dd> <div class="block">The keys the settings file is written with, matching <CODE>TagLibraryIndex</CODE>.</div></dd>
+<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html#strictGsp" title="Property in GrailsCompileStaticOptions">strictGsp</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html">GrailsCompileStaticOptions</a>
+</dt><dd> <div class="block">Whether every page is held to the names it declares, rather than only the pages that declare a
+ model. </div></dd>
<dt><span class="strong"><a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html#strictTags" title="Property in GrailsCompileStaticOptions">strictTags</a></span> - Property in <a href="org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html">GrailsCompileStaticOptions</a>
</dt><dd> <div class="block">Whether a tag no compiled tag library declares should fail compilation. </div></dd>
<dt><span class="strong"><a href="org/grails/web/servlet/FlashScopeExtension.html#string(grails.web.mvc.FlashScope, java.lang.String, java.lang.String)" title="Method in FlashScopeExtension">string(grails.web.mvc.FlashScope, java.lang.String, java.lang.String)</a></span> - Method in <a href="org/grails/web/servlet/FlashScopeExtension.html">FlashScopeExtension</a>
diff --git a/docs/snapshot/api/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.html b/docs/snapshot/api/org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html
similarity index 63%
copy from docs/snapshot/api/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.html
copy to docs/snapshot/api/org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html
index d9b54e49659..fb8a93f80ab 100644
--- a/docs/snapshot/api/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.html
+++ b/docs/snapshot/api/org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec.html
@@ -27,7 +27,7 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>AsyncWebRequestPromiseDecoratorLookupStrategy (Grails 8.0.0-SNAPSHOT)</title>
+ <title>EmbeddedReplicaSetSpec (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="AsyncWebRequestPromiseDecoratorLookupStrategy (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="EmbeddedReplicaSetSpec (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/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy" target="_top">Frames</a></li>
- <li><a href="AsyncWebRequestPromiseDecoratorLookupStrategy.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../index.html?org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec" target="_top">Frames</a></li>
+ <li><a href="EmbeddedReplicaSetSpec.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 <li><a href="#field_summary">Field</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>
+ <li><a href="#field_detail">Field</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,33 +85,34 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.plugins.web.async</strong></div>
+ <div class="subTitle">Package: <strong>org.apache.grails.testing.mongo</strong></div>
- <h2 title="[Groovy] Class AsyncWebRequestPromiseDecoratorLookupStrategy" class="title">[Groovy] Class AsyncWebRequestPromiseDecoratorLookupStrategy</h2>
+ <h2 title="[Groovy] Class EmbeddedReplicaSetSpec" class="title">[Groovy] Class EmbeddedReplicaSetSpec</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.plugins.web.async.AsyncWebRequestPromiseDecoratorLookupStrategy
+<li><ul class="inheritance"></ul></li><li><ul class="inheritance"></ul></li><li>org.apache.grails.testing.mongo.EmbeddedReplicaSetSpec
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
- <dl>
- <dt>All Implemented Interfaces and Traits:</dt>
- <dd><a href='../../../../../grails/async/decorator/PromiseDecoratorLookupStrategy.html'>PromiseDecoratorLookupStrategy</a></dd>
- </dl>
-
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.transform.CompileStatic
-class AsyncWebRequestPromiseDecoratorLookupStrategy
-extends java.lang.Object
-implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookupStrategy.html'>PromiseDecoratorLookupStrategy</a></pre>
+<pre>abstract class EmbeddedReplicaSetSpec
+extends <a href='../../../../../spock.lang.Specification.html'>Specification</a></pre>
+
+ <p> A base for the specifications that need real MongoDB transactions, which a standalone server
+ refuses: they are served by an embedded replica set of one.
- <p> A promise decorated lookup strategy that binds a WebRequest to the promise thread <DL><DT><B>Authors:</B></DT><DD>Graeme Rocher</DD></DL><DL><DT><B>Since:</B></DT><DD>2.3</DD></DL></p>
+ <p>It is a real mongod, as a container is, and it needs no Docker - so a developer without one
+ runs these, and a CI job runs them without a container to lose halfway through a specification.
+
+ <p>A specification extending this needs <CODE>grails-data-mongodb-embedded</CODE> and the flapdoodle
+ library it runs the server with on its test class path; this module compiles against them and
+ carries neither.</p>
</li>
</ul>
@@ -127,6 +128,30 @@ implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookup
<!-- =========== 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>protected java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#mongoUrl">mongoUrl</a></code></td>
+ <td class="colLast"></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+
+ </ul>
+
<!-- =========== PROPERTY SUMMARY =========== -->
@@ -148,7 +173,7 @@ implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookup
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#AsyncWebRequestPromiseDecoratorLookupStrategy()">AsyncWebRequestPromiseDecoratorLookupStrategy</a></strong>()</code><br></td>
+ <code><strong><a href="#EmbeddedReplicaSetSpec()">EmbeddedReplicaSetSpec</a></strong>()</code><br></td>
</tr>
</table>
@@ -174,32 +199,20 @@ implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookup
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>java.util.List<PromiseDecorator></code></td>
- <td class="colLast"><code><strong><a href="#findDecorators()">findDecorators</a></strong>()</code><br></td>
+ <td class="colLast"><code>void</code></td>
+ <td class="colLast"><code><strong><a href="#cleanupSpec()">cleanupSpec</a></strong>()</code><br></td>
</tr>
- </table>
- </ul>
- </li>
-
- <li class="blockList"><a name="method_summary"><!-- --></a>
- <h3>Inherited Methods Summary</h3>
- <ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
- <caption><span>Inherited Methods</span><span class="tabEnd"> </span></caption>
- <tr>
- <th class="colFirst" scope="col">Methods inherited from class</th>
- <th class="colLast" scope="col">Name</th>
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>void</code></td>
+ <td class="colLast"><code><strong><a href="#setupSpec()">setupSpec</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
- <td class="colFirst"><code>class java.lang.Object</code></td>
- <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
- </tr>
</table>
</ul>
</li>
-
+
</ul>
</li>
@@ -212,6 +225,24 @@ implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookup
+ <!-- =========== FIELD DETAIL =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="field_detail">
+ <!-- -->
+ </a>
+ <h3>Field Detail</h3>
+
+ <a name="mongoUrl"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@spock.lang.Shared<br>protected java.lang.String <strong>mongoUrl</strong></h4>
+ <p></p>
+ </li>
+ </ul>
+
+ </li>
+ </ul>
+
@@ -225,10 +256,10 @@ implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookup
</a>
<h3>Constructor Detail</h3>
- <a name="AsyncWebRequestPromiseDecoratorLookupStrategy()"><!-- --></a>
+ <a name="EmbeddedReplicaSetSpec()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>AsyncWebRequestPromiseDecoratorLookupStrategy</strong>()</h4>
+ <h4><strong>EmbeddedReplicaSetSpec</strong>()</h4>
<p></p>
</li>
</ul>
@@ -246,10 +277,18 @@ implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookup
</a>
<h3>Method Detail</h3>
- <a name="findDecorators()"><!-- --></a>
+ <a name="cleanupSpec()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>void <strong>cleanupSpec</strong>()</h4>
+ <p></p>
+ </li>
+ </ul>
+
+ <a name="setupSpec()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>@java.lang.Override<br>java.util.List<PromiseDecorator> <strong>findDecorators</strong>()</h4>
+ <h4>void <strong>setupSpec</strong>()</h4>
<p></p>
</li>
</ul>
@@ -281,18 +320,18 @@ implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookup
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../../index.html?org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy" target="_top">Frames</a></li>
- <li><a href="AsyncWebRequestPromiseDecoratorLookupStrategy.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../index.html?org/apache/grails/testing/mongo/EmbeddedReplicaSetSpec" target="_top">Frames</a></li>
+ <li><a href="EmbeddedReplicaSetSpec.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 <li><a href="#field_summary">Field</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>
+ <li><a href="#field_detail">Field</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/apache/grails/testing/mongo/package-frame.html b/docs/snapshot/api/org/apache/grails/testing/mongo/package-frame.html
index 70a7e8f21c5..e4704ee2384 100644
--- a/docs/snapshot/api/org/apache/grails/testing/mongo/package-frame.html
+++ b/docs/snapshot/api/org/apache/grails/testing/mongo/package-frame.html
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="AbstractMongoGrailsExtension.html" title="class in org.apache.grails.testing.mongo" target="classFrame">AbstractMongoGrailsExtension</a></li><li><a href="AutoStartedMongoSpec.html" title="class in org.apache.grails.testing.mongo" target="classFrame">AutoStartedMongoSpec</a></li><li><a href="MongoContainerHolder.html" title="class in org.apache.grails.testing.mongo" target="classFrame">MongoContainerHolder</a></li><li><a href="StartMongoGrailsIntegrationExtension.html [...]
+ <li><a href="AbstractMongoGrailsExtension.html" title="class in org.apache.grails.testing.mongo" target="classFrame">AbstractMongoGrailsExtension</a></li><li><a href="AutoStartedMongoSpec.html" title="class in org.apache.grails.testing.mongo" target="classFrame">AutoStartedMongoSpec</a></li><li><a href="EmbeddedReplicaSetSpec.html" title="class in org.apache.grails.testing.mongo" target="classFrame">EmbeddedReplicaSetSpec</a></li><li><a href="MongoContainerHolder.html" title="cla [...]
</ul>
</div>
diff --git a/docs/snapshot/api/org/apache/grails/testing/mongo/package-summary.html b/docs/snapshot/api/org/apache/grails/testing/mongo/package-summary.html
index 42dde9f04b4..8eda08b1be0 100644
--- a/docs/snapshot/api/org/apache/grails/testing/mongo/package-summary.html
+++ b/docs/snapshot/api/org/apache/grails/testing/mongo/package-summary.html
@@ -105,6 +105,15 @@ function windowTitle()
<td>A base specification class to handling autostarting MongoDB & bootstrapping the mongo datastore if defined.
</td>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="EmbeddedReplicaSetSpec.html" title="class in org/apache/grails/testing/mongo">
+ EmbeddedReplicaSetSpec
+ </a></strong>
+ </td>
+ <td>A base for the specifications that need real MongoDB transactions, which a standalone server
+ refuses: they are served by an embedded replica set of one.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="MongoContainerHolder.html" title="class in org/apache/grails/testing/mongo">
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html b/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html
index 8a98649db18..63f69a8ed05 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html
@@ -163,8 +163,7 @@ implements java.io.Serializable</pre>
<tr class="altColor">
<td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
- <td class="colLast"><code><a href="#all">all</a></code><br>Whether every controller, service and tag library should be compiled with <CODE>@GrailsCompileStatic</CODE>.
- </td>
+ <td class="colLast"><code><a href="#all">all</a></code><br>What every artefact type falls back to where it says nothing of its own. </td>
</tr>
<tr class="rowColor">
@@ -180,11 +179,24 @@ implements java.io.Serializable</pre>
</tr>
<tr class="rowColor">
+ <td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
+ <td class="colLast"><code><a href="#gsp">gsp</a></code><br>Whether every GSP page under <CODE>grails-app/views</CODE> should be compiled statically, by stating
+ the <CODE>grails.views.gsp.compileStatic</CODE> configuration setting for both the build and the
+ running application. </td>
+ </tr>
+
+ <tr class="altColor">
<td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
<td class="colLast"><code><a href="#services">services</a></code><br>Whether every service under <CODE>grails-app/services</CODE> should be compiled with
<CODE>@GrailsCompileStatic</CODE>. </td>
</tr>
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
+ <td class="colLast"><code><a href="#strictGsp">strictGsp</a></code><br>Whether every page is held to the names it declares, rather than only the pages that declare a
+ model. </td>
+ </tr>
+
<tr class="altColor">
<td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
<td class="colLast"><code><a href="#strictTags">strictTags</a></code><br>Whether a tag no compiled tag library declares should fail compilation. </td>
@@ -281,9 +293,20 @@ implements java.io.Serializable</pre>
<ul class="blockListLast">
<li class="blockList">
<h4>final Property<java.lang.Boolean> <strong>all</strong></h4>
- <p> Whether every controller, service and tag library should be compiled with <CODE>@GrailsCompileStatic</CODE>.
- A shortcut equivalent to enabling <a href='#getControllers()'>controllers</a>, <a href='#getServices()'>services</a>
- and <a href='#getTagLibs()'>tagLibs</a> together. Disabled by default.</p>
+ <p> What every artefact type falls back to where it says nothing of its own. A shortcut for enabling
+ <a href='#getControllers()'>controllers</a>, <a href='#getServices()'>services</a> and <a href='#getTagLibs()'> tagLibs</a> together. Disabled by default.
+
+ <p>An artefact type that states a value keeps it, so a single type can be held back from the
+ shortcut:</p>
+
+ <pre>
+ grails {
+ compileStatic {
+ all = true
+ services = false // every artefact type but services
+ }
+ }
+ </pre></p>
</li>
</ul>
@@ -292,7 +315,7 @@ implements java.io.Serializable</pre>
<li class="blockList">
<h4>final Property<java.lang.Boolean> <strong>controllers</strong></h4>
<p> Whether every controller under <CODE>grails-app/controllers</CODE> should be compiled with
- <CODE>@GrailsCompileStatic</CODE>. Disabled by default.</p>
+ <CODE>@GrailsCompileStatic</CODE>. Follows <a href='#getAll()'>all</a> where it is not set.</p>
</li>
</ul>
@@ -306,12 +329,41 @@ implements java.io.Serializable</pre>
</li>
</ul>
+ <a name="gsp"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>final Property<java.lang.Boolean> <strong>gsp</strong></h4>
+ <p> Whether every GSP page under <CODE>grails-app/views</CODE> should be compiled statically, by stating
+ the <CODE>grails.views.gsp.compileStatic</CODE> configuration setting for both the build and the
+ running application. Disabled by default.
+
+ <p>Deliberately not covered by <a href='#getAll()'>all</a>. The artefact opt-ins fail on code that is
+ doubtful anyway; this one fails on a page that reads a model variable it has not declared, which
+ describes most pages in an application that has never declared one. Enabling it is a migration,
+ not a switch, so it is never turned on as a side effect of asking for everything.</p></p>
+ </li>
+ </ul>
+
<a name="services"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
<h4>final Property<java.lang.Boolean> <strong>services</strong></h4>
<p> Whether every service under <CODE>grails-app/services</CODE> should be compiled with
- <CODE>@GrailsCompileStatic</CODE>. Disabled by default.</p>
+ <CODE>@GrailsCompileStatic</CODE>. Follows <a href='#getAll()'>all</a> where it is not set.</p>
+ </li>
+ </ul>
+
+ <a name="strictGsp"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>final Property<java.lang.Boolean> <strong>strictGsp</strong></h4>
+ <p> Whether every page is held to the names it declares, rather than only the pages that declare a
+ model. Disabled by default.
+
+ <p>A page that declares a model is held to it either way: declaring one states what the page is
+ rendered with, so a name outside it is a mistake. This asks for the same of a page that declares
+ nothing, which otherwise reads what it is rendered with the way a dynamically compiled page
+ does. Meaningless unless <a href='#getGsp()'>gsp</a> is enabled.</p></p>
</li>
</ul>
@@ -350,7 +402,7 @@ implements java.io.Serializable</pre>
<li class="blockList">
<h4>final Property<java.lang.Boolean> <strong>tagLibs</strong></h4>
<p> Whether every tag library under <CODE>grails-app/taglib</CODE> should be compiled with
- <CODE>@GrailsCompileStatic</CODE>. Disabled by default.</p>
+ <CODE>@GrailsCompileStatic</CODE>. Follows <a href='#getAll()'>all</a> where it is not set.</p>
</li>
</ul>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html b/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html
similarity index 70%
copy from docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
copy to docs/snapshot/api/org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html
index ce92b215d3e..c80c1dd586b 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPagePlugin (Grails 8.0.0-SNAPSHOT)</title>
+ <title>GrailsGspCompileStaticProvider (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="GroovyPagePlugin (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="GrailsGspCompileStaticProvider (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,20 +51,20 @@ 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/grails/gradle/plugin/views/gsp/GroovyPagePlugin" target="_top">Frames</a></li>
- <li><a href="GroovyPagePlugin.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../index.html?org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider" target="_top">Frames</a></li>
+ <li><a href="GrailsGspCompileStaticProvider.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,13 +85,13 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.gradle.plugin.views.gsp</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.gradle.plugin.core</strong></div>
- <h2 title="[Groovy] Class GroovyPagePlugin" class="title">[Groovy] Class GroovyPagePlugin</h2>
+ <h2 title="[Groovy] Class GrailsGspCompileStaticProvider" class="title">[Groovy] Class GrailsGspCompileStaticProvider</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.views.gsp.GroovyPagePlugin
+<li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.core.GrailsGspCompileStaticProvider
</ul>
<div class="description">
<ul class="blockList">
@@ -99,7 +99,7 @@ if (location.href.indexOf('is-external=true') == -1) {
<dl>
<dt>All Implemented Interfaces and Traits:</dt>
- <dd>Plugin<Project></dd>
+ <dd><a href='../../../../../org.gradle.process.CommandLineArgumentProvider.html'>CommandLineArgumentProvider</a></dd>
</dl>
@@ -107,11 +107,20 @@ if (location.href.indexOf('is-external=true') == -1) {
<hr>
<pre>@groovy.transform.CompileStatic
-class GroovyPagePlugin
+class GrailsGspCompileStaticProvider
extends java.lang.Object
-implements Plugin<Project></pre>
+implements <a href='../../../../../org.gradle.process.CommandLineArgumentProvider.html'>CommandLineArgumentProvider</a></pre>
- <p> A plugin that adds support for compiling Groovy Server Pages (GSP) <DL><DT><B>Authors:</B></DT><DD>Graeme Rocher</DD></DL><DL><DT><B>Since:</B></DT><DD>3.0</DD></DL></p>
+ <p> Publishes the <CODE>grails { compileStatic { gsp </CODE> }} opt-in to a forked JVM as the
+ BuildSettings#COMPILE_STATIC_GSP#COMPILE_STATIC_GSP system property.
+
+ <p>Applied to the JVM that compiles pages ahead of time and to the JVM that runs the application,
+ which compiles a page again when it changes. Both read the setting under the name it carries in
+ configuration, so a page compiles the same way whichever compiled it.</p>
+
+ <p>The lazy <a href='../../../../../org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html' title='GrailsCompileStaticOptions'>GrailsCompileStaticOptions</a> property is read in <a href='#asArguments'>asArguments</a> (when the
+ task runs, not when it is configured). The effective value is also exposed as an Input
+ getter so that toggling the flag invalidates the task.</p> <DL><DT><B>Since:</B></DT><DD>8.0</DD></DL></p>
</li>
</ul>
@@ -148,7 +157,7 @@ implements Plugin<Project></pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#GroovyPagePlugin()">GroovyPagePlugin</a></strong>()</code><br></td>
+ <code><strong><a href="#GrailsGspCompileStaticProvider(org.grails.gradle.plugin.core.GrailsCompileStaticOptions)">GrailsGspCompileStaticProvider</a></strong>(<a href='../../../../../org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html'>GrailsCompileStaticOptions</a> compileStatic)</code><br></td>
</tr>
</table>
@@ -174,20 +183,21 @@ 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>java.lang.Iterable<java.lang.String></code></td>
+ <td class="colLast"><code><strong><a href="#asArguments()">asArguments</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.lang.String</code></td>
- <td class="colLast"><code><strong><a href="#getTmpDirPath(org.gradle.api.Project)">getTmpDirPath</a></strong>(<a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</code><br></td>
+ <td class="colLast"><code>boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isCompileStaticGsp()">isCompileStaticGsp</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected <a href='../../../../../../org.gradle.api.file.FileCollection.html'>FileCollection</a></code></td>
- <td class="colLast"><code><strong><a href="#resolveClassesDirs(org.gradle.api.tasks.SourceSetOutput, org.gradle.api.Project)">resolveClassesDirs</a></strong>(<a href='../../../../../../org.gradle.api.tasks.SourceSetOutput.html'>SourceSetOutput</a> output, <a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</code><br></td>
+ <td class="colLast"><code>boolean</code></td>
+ <td class="colLast"><code><strong><a href="#isStrict()">isStrict</a></strong>()</code><br>Strictness only reaches the compiler where pages are compiled statically, so it is reported as
+ false while that is off. </td>
</tr>
</table>
@@ -237,10 +247,10 @@ implements Plugin<Project></pre>
</a>
<h3>Constructor Detail</h3>
- <a name="GroovyPagePlugin()"><!-- --></a>
+ <a name="GrailsGspCompileStaticProvider(org.grails.gradle.plugin.core.GrailsCompileStaticOptions)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>GroovyPagePlugin</strong>()</h4>
+ <h4><strong>GrailsGspCompileStaticProvider</strong>(<a href='../../../../../org/grails/gradle/plugin/core/GrailsCompileStaticOptions.html'>GrailsCompileStaticOptions</a> compileStatic)</h4>
<p></p>
</li>
</ul>
@@ -258,27 +268,29 @@ implements Plugin<Project></pre>
</a>
<h3>Method Detail</h3>
- <a name="apply(org.gradle.api.Project)"><!-- --></a>
+ <a name="asArguments()"><!-- --></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>@java.lang.Override<br>java.lang.Iterable<java.lang.String> <strong>asArguments</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="getTmpDirPath(org.gradle.api.Project)"><!-- --></a>
+ <a name="isCompileStaticGsp()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>protected java.lang.String <strong>getTmpDirPath</strong>(<a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</h4>
+ <h4>@org.gradle.api.tasks.Input<br>boolean <strong>isCompileStaticGsp</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="resolveClassesDirs(org.gradle.api.tasks.SourceSetOutput, org.gradle.api.Project)"><!-- --></a>
+ <a name="isStrict()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>protected <a href='../../../../../../org.gradle.api.file.FileCollection.html'>FileCollection</a> <strong>resolveClassesDirs</strong>(<a href='../../../../../../org.gradle.api.tasks.SourceSetOutput.html'>SourceSetOutput</a> output, <a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</h4>
- <p></p>
+ <h4>@org.gradle.api.tasks.Input<br>boolean <strong>isStrict</strong>()</h4>
+ <p> Strictness only reaches the compiler where pages are compiled statically, so it is reported as
+ false while that is off. Reporting the raw flag would make toggling it invalidate the task
+ without changing anything it produces.</p>
</li>
</ul>
@@ -297,20 +309,20 @@ 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/grails/gradle/plugin/views/gsp/GroovyPagePlugin" target="_top">Frames</a></li>
- <li><a href="GroovyPagePlugin.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../index.html?org/grails/gradle/plugin/core/GrailsGspCompileStaticProvider" target="_top">Frames</a></li>
+ <li><a href="GrailsGspCompileStaticProvider.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
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 2b9f8e83cec..4c1550f9208 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="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 [...]
</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 0adc09466b1..92530be27e3 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
@@ -142,6 +142,15 @@ function windowTitle()
</td>
<td>The main Grails gradle plugin implementation</td>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="GrailsGspCompileStaticProvider.html" title="class in org/grails/gradle/plugin/core">
+ GrailsGspCompileStaticProvider
+ </a></strong>
+ </td>
+ <td>Publishes the <CODE>grails { compileStatic { gsp </CODE> }} opt-in to a forked JVM as the
+ BuildSettings#COMPILE_STATIC_GSP#COMPILE_STATIC_GSP system property.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="GrailsI18nOptions.html" title="class in org/grails/gradle/plugin/core">
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html b/docs/snapshot/api/org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html
similarity index 52%
copy from docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
copy to docs/snapshot/api/org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html
index ce92b215d3e..44aa9a765dd 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPagePlugin (Grails 8.0.0-SNAPSHOT)</title>
+ <title>GenerateScaffoldedViewsTask (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="GroovyPagePlugin (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="GenerateScaffoldedViewsTask (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -51,20 +51,20 @@ 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/grails/gradle/plugin/views/gsp/GroovyPagePlugin" target="_top">Frames</a></li>
- <li><a href="GroovyPagePlugin.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../index.html?org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask" target="_top">Frames</a></li>
+ <li><a href="GenerateScaffoldedViewsTask.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
@@ -85,33 +85,44 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.gradle.plugin.views.gsp</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.gradle.plugin.scaffolding</strong></div>
- <h2 title="[Groovy] Class GroovyPagePlugin" class="title">[Groovy] Class GroovyPagePlugin</h2>
+ <h2 title="[Groovy] Class GenerateScaffoldedViewsTask" class="title">[Groovy] Class GenerateScaffoldedViewsTask</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.views.gsp.GroovyPagePlugin
+<li><ul class="inheritance"></ul></li><li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.scaffolding.GenerateScaffoldedViewsTask
</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 GroovyPagePlugin
-extends java.lang.Object
-implements Plugin<Project></pre>
+<pre>@org.gradle.api.tasks.CacheableTask
+@groovy.transform.CompileStatic
+abstract class GenerateScaffoldedViewsTask
+extends <a href='../../../../../org.gradle.api.DefaultTask.html'>DefaultTask</a></pre>
+
+ <p> Writes the views a scaffolded controller would otherwise generate on its first request.
+
+ <p>Scaffolding expands a template into GSP source and compiles the result, and until now it did
+ both when the view was first asked for. That costs the first request on the JVM, and a native
+ image cannot do it at all: defining a class at runtime is exactly what an ahead-of-time image
+ gives up. Expanding the templates here instead lets the ordinary GSP compiler precompile the
+ result, so at runtime the views are found rather than produced.</p>
- <p> A plugin that adds support for compiling Groovy Server Pages (GSP) <DL><DT><B>Authors:</B></DT><DD>Graeme Rocher</DD></DL><DL><DT><B>Since:</B></DT><DD>3.0</DD></DL></p>
+ <p>Only naming is substituted -- the templates read <CODE>className</CODE>, <CODE>propertyName</CODE>,
+ <CODE>fullName</CODE> and <CODE>packageName</CODE>, and defer everything else about the domain class to the
+ field tag libraries at render time. That is why this needs no GORM, no application context and no
+ loading of application classes: the controllers are read with ASM and the domain class name is
+ enough. The qualified name is bound too, so that a template can declare the type of its model in a
+ form that resolves from the generated page.</p>
+
+ <p>A view the application already declares is never overwritten, which keeps the existing
+ precedence: a hand-written <CODE>grails-app/views</CODE> page wins over a scaffolded one.</p> <DL><DT><B>Since:</B></DT><DD>8.0</DD></DL></p>
</li>
</ul>
@@ -148,7 +159,7 @@ implements Plugin<Project></pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#GroovyPagePlugin()">GroovyPagePlugin</a></strong>()</code><br></td>
+ <code><strong><a href="#GenerateScaffoldedViewsTask()">GenerateScaffoldedViewsTask</a></strong>()</code><br></td>
</tr>
</table>
@@ -175,43 +186,43 @@ 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><strong><a href="#generate()">generate</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.lang.String</code></td>
- <td class="colLast"><code><strong><a href="#getTmpDirPath(org.gradle.api.Project)">getTmpDirPath</a></strong>(<a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</code><br></td>
+ <td class="colLast"><code>abstract <a href='../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a></code></td>
+ <td class="colLast"><code><strong><a href="#getApplicationViews()">getApplicationViews</a></strong>()</code><br>The application's own views; anything declared here is left alone.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected <a href='../../../../../../org.gradle.api.file.FileCollection.html'>FileCollection</a></code></td>
- <td class="colLast"><code><strong><a href="#resolveClassesDirs(org.gradle.api.tasks.SourceSetOutput, org.gradle.api.Project)">resolveClassesDirs</a></strong>(<a href='../../../../../../org.gradle.api.tasks.SourceSetOutput.html'>SourceSetOutput</a> output, <a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</code><br></td>
+ <td class="colLast"><code>abstract <a href='../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a></code></td>
+ <td class="colLast"><code><strong><a href="#getClassesDirs()">getClassesDirs</a></strong>()</code><br>Compiled application classes, searched for scaffolded controllers.</td>
</tr>
- </table>
- </ul>
- </li>
-
- <li class="blockList"><a name="method_summary"><!-- --></a>
- <h3>Inherited Methods Summary</h3>
- <ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
- <caption><span>Inherited Methods</span><span class="tabEnd"> </span></caption>
- <tr>
- <th class="colFirst" scope="col">Methods inherited from class</th>
- <th class="colLast" scope="col">Name</th>
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../org.gradle.api.file.DirectoryProperty.html'>DirectoryProperty</a></code></td>
+ <td class="colLast"><code><strong><a href="#getOutputDirectory()">getOutputDirectory</a></strong>()</code><br>Where the generated views are written.</td>
</tr>
<tr class="altColor">
- <td class="colFirst"><code>class java.lang.Object</code></td>
- <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a></code></td>
+ <td class="colLast"><code><strong><a href="#getTemplateClasspath()">getTemplateClasspath</a></strong>()</code><br>The classpath the scaffolding templates are read from. </td>
</tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a></code></td>
+ <td class="colLast"><code><strong><a href="#getTemplateOverrides()">getTemplateOverrides</a></strong>()</code><br>Application template overrides, normally <CODE>src/main/templates/scaffolding</CODE>.</td>
+ </tr>
+
</table>
</ul>
</li>
-
+
</ul>
</li>
@@ -237,10 +248,10 @@ implements Plugin<Project></pre>
</a>
<h3>Constructor Detail</h3>
- <a name="GroovyPagePlugin()"><!-- --></a>
+ <a name="GenerateScaffoldedViewsTask()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>GroovyPagePlugin</strong>()</h4>
+ <h4><strong>GenerateScaffoldedViewsTask</strong>()</h4>
<p></p>
</li>
</ul>
@@ -258,27 +269,52 @@ implements Plugin<Project></pre>
</a>
<h3>Method Detail</h3>
- <a name="apply(org.gradle.api.Project)"><!-- --></a>
+ <a name="generate()"><!-- --></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>@org.gradle.api.tasks.TaskAction<br>void <strong>generate</strong>()</h4>
<p></p>
</li>
</ul>
- <a name="getTmpDirPath(org.gradle.api.Project)"><!-- --></a>
+ <a name="getApplicationViews()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>protected java.lang.String <strong>getTmpDirPath</strong>(<a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</h4>
- <p></p>
+ <h4>@org.gradle.api.tasks.InputFiles<br>@java.util.Optional<br>@org.gradle.api.tasks.PathSensitive(value: PathSensitivity.RELATIVE)<br>abstract <a href='../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a> <strong>getApplicationViews</strong>()</h4>
+ <p>The application's own views; anything declared here is left alone.</p>
</li>
</ul>
- <a name="resolveClassesDirs(org.gradle.api.tasks.SourceSetOutput, org.gradle.api.Project)"><!-- --></a>
+ <a name="getClassesDirs()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>protected <a href='../../../../../../org.gradle.api.file.FileCollection.html'>FileCollection</a> <strong>resolveClassesDirs</strong>(<a href='../../../../../../org.gradle.api.tasks.SourceSetOutput.html'>SourceSetOutput</a> output, <a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</h4>
- <p></p>
+ <h4>@org.gradle.api.tasks.InputFiles<br>@org.gradle.api.tasks.PathSensitive(value: PathSensitivity.RELATIVE)<br>abstract <a href='../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a> <strong>getClassesDirs</strong>()</h4>
+ <p>Compiled application classes, searched for scaffolded controllers.</p>
+ </li>
+ </ul>
+
+ <a name="getOutputDirectory()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.OutputDirectory<br>abstract <a href='../../../../../org.gradle.api.file.DirectoryProperty.html'>DirectoryProperty</a> <strong>getOutputDirectory</strong>()</h4>
+ <p>Where the generated views are written.</p>
+ </li>
+ </ul>
+
+ <a name="getTemplateClasspath()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.InputFiles<br>@org.gradle.api.tasks.PathSensitive(value: PathSensitivity.RELATIVE)<br>abstract <a href='../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a> <strong>getTemplateClasspath</strong>()</h4>
+ <p> The classpath the scaffolding templates are read from. The application's own
+ <CODE>src/main/templates/scaffolding</CODE> takes precedence, matching the runtime lookup.</p>
+ </li>
+ </ul>
+
+ <a name="getTemplateOverrides()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.InputFiles<br>@java.util.Optional<br>@org.gradle.api.tasks.PathSensitive(value: PathSensitivity.RELATIVE)<br>abstract <a href='../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a> <strong>getTemplateOverrides</strong>()</h4>
+ <p>Application template overrides, normally <CODE>src/main/templates/scaffolding</CODE>.</p>
</li>
</ul>
@@ -297,20 +333,20 @@ 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/grails/gradle/plugin/views/gsp/GroovyPagePlugin" target="_top">Frames</a></li>
- <li><a href="GroovyPagePlugin.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../index.html?org/grails/gradle/plugin/scaffolding/GenerateScaffoldedViewsTask" target="_top">Frames</a></li>
+ <li><a href="GenerateScaffoldedViewsTask.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html b/docs/snapshot/api/org/grails/gradle/plugin/scaffolding/package-frame.html
similarity index 64%
copy from docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html
copy to docs/snapshot/api/org/grails/gradle/plugin/scaffolding/package-frame.html
index ef82970ce73..63e36a25f38 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/scaffolding/package-frame.html
@@ -21,19 +21,19 @@
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
- <title>org.grails.gradle.plugin.views.gsp</title>
+ <title>org.grails.gradle.plugin.scaffolding</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <meta name="keywords" CONTENT="org/grails/gradle/plugin/views/gsp package">
+ <meta name="keywords" CONTENT="org/grails/gradle/plugin/scaffolding package">
<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 rel="stylesheet" type="text/css" href="../../../../../stylesheet.css" title="Style">
</head>
<body class="left">
<div class="indexHeader">
- <b><a href="package-summary.html" target="classFrame">org.grails.gradle.plugin.views.gsp</a></b>
+ <b><a href="package-summary.html" target="classFrame">org.grails.gradle.plugin.scaffolding</a></b>
</div>
@@ -43,7 +43,7 @@
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="GenerateTagLibraryIndexTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GenerateTagLibraryIndexTask</a></li><li><a href="GroovyPageForkCompileTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPageForkCompileTask</a></li><li><a href="GroovyPagePlugin.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPagePlugin</a></li><li><a href="TagLibraryIndexFiles.html" title [...]
+ <li><a href="GenerateScaffoldedViewsTask.html" title="class in org.grails.gradle.plugin.scaffolding" target="classFrame">GenerateScaffoldedViewsTask</a></li>
</ul>
</div>
diff --git a/docs/snapshot/api/org/apache/grails/testing/mongo/package-summary.html b/docs/snapshot/api/org/grails/gradle/plugin/scaffolding/package-summary.html
similarity index 63%
copy from docs/snapshot/api/org/apache/grails/testing/mongo/package-summary.html
copy to docs/snapshot/api/org/grails/gradle/plugin/scaffolding/package-summary.html
index 42dde9f04b4..2b58c14082d 100644
--- a/docs/snapshot/api/org/apache/grails/testing/mongo/package-summary.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/scaffolding/package-summary.html
@@ -22,8 +22,8 @@
<html>
<head>
-<title>org.apache.grails.testing.mongo (Grails 8.0.0-SNAPSHOT)</title>
-<meta name="keywords" content="org.apache.grails.testing.mongo package">
+<title>org.grails.gradle.plugin.scaffolding (Grails 8.0.0-SNAPSHOT)</title>
+<meta name="keywords" content="org.grails.gradle.plugin.scaffolding package">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel ="stylesheet" TYPE="text/css" HREF="../../../../../stylesheet.css" title="Style">
<link href="../../../../../groovy.ico" type="image/x-icon" rel="shortcut icon">
@@ -31,7 +31,7 @@
<script type="text/javascript">
function windowTitle()
{
- parent.document.title="org.apache.grails.testing.mongo (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="org.grails.gradle.plugin.scaffolding (Grails 8.0.0-SNAPSHOT)";
}
</script>
<noscript>
@@ -60,7 +60,7 @@ function windowTitle()
<div class="subNav">
<ul class="navList">
- <li><a href="../../../../../index.html?org/apache/grails/testing/mongo/package-summary.html" target="_top">Frames</a></li>
+ <li><a href="../../../../../index.html?org/grails/gradle/plugin/scaffolding/package-summary.html" target="_top">Frames</a></li>
<li><a href="package-summary.html" target="_top">No Frames</a></li>
</ul>
</div>
@@ -68,7 +68,7 @@ function windowTitle()
<!-- ========= END OF TOP NAVBAR ========= -->
<div class="header">
- <h1 class="title">Package org.apache.grails.testing.mongo</h1>
+ <h1 class="title">Package org.grails.gradle.plugin.scaffolding</h1>
</div>
@@ -90,45 +90,11 @@ function windowTitle()
</tr>
<tr class="altColor">
<td class="colOne">
- <strong><a href="AbstractMongoGrailsExtension.html" title="class in org/apache/grails/testing/mongo">
- AbstractMongoGrailsExtension
+ <strong><a href="GenerateScaffoldedViewsTask.html" title="class in org/grails/gradle/plugin/scaffolding">
+ GenerateScaffoldedViewsTask
</a></strong>
</td>
- <td>Abstract class for Mongo Grails extensions.</td>
- </tr>
-<tr class="altColor">
- <td class="colOne">
- <strong><a href="AutoStartedMongoSpec.html" title="class in org/apache/grails/testing/mongo">
- AutoStartedMongoSpec
- </a></strong>
- </td>
- <td>A base specification class to handling autostarting MongoDB & bootstrapping the mongo datastore if defined.
- </td>
- </tr>
-<tr class="altColor">
- <td class="colOne">
- <strong><a href="MongoContainerHolder.html" title="class in org/apache/grails/testing/mongo">
- MongoContainerHolder
- </a></strong>
- </td>
- <td></td>
- </tr>
-<tr class="altColor">
- <td class="colOne">
- <strong><a href="StartMongoGrailsIntegrationExtension.html" title="class in org/apache/grails/testing/mongo">
- StartMongoGrailsIntegrationExtension
- </a></strong>
- </td>
- <td>While unit tests can spin up as many Mongo instances as they desire, integration tests require a fully running
- server. </td>
- </tr>
-<tr class="altColor">
- <td class="colOne">
- <strong><a href="StartMongoGrailsUnitExtension.html" title="class in org/apache/grails/testing/mongo">
- StartMongoGrailsUnitExtension
- </a></strong>
- </td>
- <td>Unit tests do not have a full server environment, and thus can have varying options for when a Mongo instance is built, reused, and torn down</td>
+ <td>Writes the views a scaffolded controller would otherwise generate on its first request.</td>
</tr>
</tbody>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html
index d47ec63026c..84cfda6fb6e 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html
@@ -156,6 +156,16 @@ extends <a href='../../../../../../org.gradle.api.tasks.compile.AbstractCompile.
<td class="colLast"><code><a href="#compileOptions">compileOptions</a></code><br></td>
</tr>
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
+ <td class="colLast"><code><a href="#compileStatic">compileStatic</a></code><br>Whether the pages this task compiles are compiled statically.</td>
+ </tr>
+
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>Property<java.lang.Boolean></strong></code> </td>
+ <td class="colLast"><code><a href="#compileStaticStrict">compileStaticStrict</a></code><br>Whether the pages this task compiles are held to the names they declare. </td>
+ </tr>
+
<tr class="rowColor">
<td class="colFirst"><code><strong><a href='../../../../../../org.gradle.api.file.DirectoryProperty.html'>DirectoryProperty</a></strong></code> </td>
<td class="colLast"><code><a href="#destinationDirectory">destinationDirectory</a></code><br></td>
@@ -320,6 +330,26 @@ extends <a href='../../../../../../org.gradle.api.tasks.compile.AbstractCompile.
</li>
</ul>
+ <a name="compileStatic"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Input<br>final Property<java.lang.Boolean> <strong>compileStatic</strong></h4>
+ <p> Whether the pages this task compiles are compiled statically.
+
+ <p>Stated to the forked compiler as the <CODE>grails.views.gsp.compileStatic</CODE> system property,
+ which is the same setting <CODE>grails-app/conf/application.yml</CODE> carries and the same one the
+ running application reads, so that a page compiled here compiles the same way there.</p></p>
+ </li>
+ </ul>
+
+ <a name="compileStaticStrict"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>@org.gradle.api.tasks.Input<br>final Property<java.lang.Boolean> <strong>compileStaticStrict</strong></h4>
+ <p>Whether the pages this task compiles are held to the names they declare. See <a href='#compileStatic'>compileStatic</a>.</p>
+ </li>
+ </ul>
+
<a name="destinationDirectory"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters.html
similarity index 56%
copy from docs/snapshot/api/org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html
copy to docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters.html
index cfb29dca014..3847edaeb78 100644
--- a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters.html
@@ -27,17 +27,17 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPageTypeCheckingConfig (Grails 8.0.0-SNAPSHOT)</title>
+ <title>GroovyPagePlugin.ScaffoldedControllers.Parameters (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="GroovyPageTypeCheckingConfig (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="GroovyPagePlugin.ScaffoldedControllers.Parameters (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/grails/gsp/compiler/GroovyPageTypeCheckingConfig" target="_top">Frames</a></li>
- <li><a href="GroovyPageTypeCheckingConfig.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters" target="_top">Frames</a></li>
+ <li><a href="GroovyPagePlugin.ScaffoldedControllers.Parameters.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Required <li><a href="#optional_element_summary">Optional</a></li>
+ Nested Field <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- <li><a href="#element_detail">Element</a></li>
+ Field <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<a name="skip-navbar_top">
@@ -85,25 +85,27 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- ======== START OF CLASS DATA ======== -->
<div class="header">
- <div class="subTitle">Package: <strong>org.grails.gsp.compiler</strong></div>
+ <div class="subTitle">Package: <strong>org.grails.gradle.plugin.views.gsp</strong></div>
- <h2 title="[Java] Annotation Type GroovyPageTypeCheckingConfig" class="title">[Java] Annotation Type GroovyPageTypeCheckingConfig</h2>
+ <h2 title="[Groovy] Interface GroovyPagePlugin.ScaffoldedControllers.Parameters" class="title">[Groovy] Interface GroovyPagePlugin.ScaffoldedControllers.Parameters</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gsp.compiler.GroovyPageTypeCheckingConfig
+<li><ul class="inheritance"></ul></li><li>org.gradle.api.provider.ValueSourceParameters
</ul>
<div class="description">
<ul class="blockList">
<li class="blockList">
-
+ <dl>
+ <dt>All Superinterfaces:</dt>
+ <dd><a href='../../../../../../org.gradle.api.provider.ValueSourceParameters.html'>ValueSourceParameters</a></dd>
+ </dl>
<!-- todo: direct known subclasses -->
<hr>
-<pre>@java.lang.annotation.Retention(RetentionPolicy.SOURCE)
-@java.lang.annotation.Target(ElementType.TYPE)
-public @interface GroovyPageTypeCheckingConfig</pre>
+<pre>static interface GroovyPagePlugin.ScaffoldedControllers.Parameters
+extends <a href='../../../../../../org.gradle.api.provider.ValueSourceParameters.html'>ValueSourceParameters</a></pre>
</li>
</ul>
@@ -125,29 +127,6 @@ public @interface GroovyPageTypeCheckingConfig</pre>
<!-- =========== ELEMENT SUMMARY =========== -->
- <ul class="blockList"><a name="element_summary"><!-- --></a>
- <li class="blockList">
- <h3>Element Summary</h3>
- <a name="required_element_summary"><!-- --></a><a name="optional_element_summary"><!-- --></a>
- <ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Optional Element Summary table">
- <caption><span>Optional Element Summary</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>java.lang.String[]</strong></code> </td>
- <td class="colLast"><code><a href="#taglibs">taglibs</a></code><br> <DL><DT><B>Default:</B></DT><DD>{}</DD></DL></td>
- </tr>
-
- </table>
- </ul>
-
- </li>
- </ul>
-
@@ -156,23 +135,26 @@ public @interface GroovyPageTypeCheckingConfig</pre>
<ul class="blockList">
<li class="blockList"><a name="method_summary"><!-- --></a>
- <h3>Inherited Methods Summary</h3>
+ <h3>Methods Summary</h3>
<ul class="blockList">
- <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Inherited Methods Summary table">
- <caption><span>Inherited Methods</span><span class="tabEnd"> </span></caption>
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Methods Summary table">
+ <caption><span>Methods</span><span class="tabEnd"> </span></caption>
<tr>
- <th class="colFirst" scope="col">Methods inherited from class</th>
- <th class="colLast" scope="col">Name</th>
+ <th class="colFirst" scope="col">Type Params</th>
+ <th class="colLast" scope="col">Return Type</th>
+ <th class="colLast" scope="col">Name and description</th>
</tr>
<tr class="altColor">
- <td class="colFirst"><code>class java.lang.Object</code></td>
- <td class="colLast"><code>java.lang.Object#equals(java.lang.Object), java.lang.Object#getClass(), java.lang.Object#hashCode(), java.lang.Object#notify(), java.lang.Object#notifyAll(), java.lang.Object#toString(), java.lang.Object#wait(), java.lang.Object#wait(long), java.lang.Object#wait(long, int)</code></td>
+ <td class="colFirst"><code></code></td>
+ <td class="colLast"><code>abstract <a href='../../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a></code></td>
+ <td class="colLast"><code><strong><a href="#getControllers()">getControllers</a></strong>()</code><br></td>
</tr>
+
</table>
</ul>
</li>
-
+
</ul>
</li>
@@ -189,29 +171,29 @@ public @interface GroovyPageTypeCheckingConfig</pre>
- <!-- =========== ELEMENT DETAIL =========== -->
+
+
+
+
+
+ <!-- =========== METHOD DETAIL =========== -->
<ul class="blockList">
- <li class="blockList"><a name="element_detail">
+ <li class="blockList"><a name="method_detail">
<!-- -->
</a>
- <h3>Element Detail</h3>
+ <h3>Method Detail</h3>
- <a name="taglibs"><!-- --></a>
+ <a name="getControllers()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public java.lang.String[] <strong>taglibs</strong></h4>
- <p> <DL><DT><B>Default:</B></DT><DD>{}</DD></DL></p>
+ <h4>abstract <a href='../../../../../../org.gradle.api.file.ConfigurableFileCollection.html'>ConfigurableFileCollection</a> <strong>getControllers</strong>()</h4>
+ <p></p>
</li>
</ul>
</li>
</ul>
-
-
-
-
-
</li>
</ul>
</div>
@@ -224,30 +206,30 @@ public @interface GroovyPageTypeCheckingConfig</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/grails/gsp/compiler/GroovyPageTypeCheckingConfig" target="_top">Frames</a></li>
- <li><a href="GroovyPageTypeCheckingConfig.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters" target="_top">Frames</a></li>
+ <li><a href="GroovyPagePlugin.ScaffoldedControllers.Parameters.html" target="_top">No Frames</a></li>
</ul>
</div>
<div>
<ul class="subNavList">
<li>Summary: </li>
- Required <li><a href="#optional_element_summary">Optional</a></li>
+ Nested Field <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
- <li><a href="#element_detail">Element</a></li>
+ Field <li><a href="#method_detail">Method</a></li>
</ul>
</div>
<p><!-- Matomo -->
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html
similarity index 72%
copy from docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
copy to docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html
index ce92b215d3e..18c807a59ad 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html
@@ -27,7 +27,7 @@
<html>
<head>
<!-- Generated by groovydoc (5.1.0) -->
- <title>GroovyPagePlugin (Grails 8.0.0-SNAPSHOT)</title>
+ <title>GroovyPagePlugin.ScaffoldedControllers (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="GroovyPagePlugin (Grails 8.0.0-SNAPSHOT)";
+ parent.document.title="GroovyPagePlugin.ScaffoldedControllers (Grails 8.0.0-SNAPSHOT)";
}
//-->
</script>
@@ -63,14 +63,14 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/GroovyPagePlugin" target="_top">Frames</a></li>
- <li><a href="GroovyPagePlugin.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers" target="_top">Frames</a></li>
+ <li><a href="GroovyPagePlugin.ScaffoldedControllers.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>
+ <li><a href="#nested_summary">Nested</a></li> Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
@@ -87,11 +87,11 @@ if (location.href.indexOf('is-external=true') == -1) {
<div class="subTitle">Package: <strong>org.grails.gradle.plugin.views.gsp</strong></div>
- <h2 title="[Groovy] Class GroovyPagePlugin" class="title">[Groovy] Class GroovyPagePlugin</h2>
+ <h2 title="[Groovy] Class GroovyPagePlugin.ScaffoldedControllers" class="title">[Groovy] Class GroovyPagePlugin.ScaffoldedControllers</h2>
</div>
<div class="contentContainer">
<ul class="inheritance">
-<li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.views.gsp.GroovyPagePlugin
+<li><ul class="inheritance"></ul></li><li>org.grails.gradle.plugin.views.gsp.GroovyPagePlugin.ScaffoldedControllers
</ul>
<div class="description">
<ul class="blockList">
@@ -99,19 +99,18 @@ if (location.href.indexOf('is-external=true') == -1) {
<dl>
<dt>All Implemented Interfaces and Traits:</dt>
- <dd>Plugin<Project></dd>
+ <dd>ValueSource<java.lang.Boolean, ScaffoldedControllers.Parameters></dd>
</dl>
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.transform.CompileStatic
-class GroovyPagePlugin
+<pre>static abstract class GroovyPagePlugin.ScaffoldedControllers
extends java.lang.Object
-implements Plugin<Project></pre>
+implements ValueSource<java.lang.Boolean, ScaffoldedControllers.Parameters></pre>
- <p> A plugin that adds support for compiling Groovy Server Pages (GSP) <DL><DT><B>Authors:</B></DT><DD>Graeme Rocher</DD></DL><DL><DT><B>Since:</B></DT><DD>3.0</DD></DL></p>
+ <p>Reads the controller sources for the mark of a scaffolded one, as a tracked build input.</p>
</li>
</ul>
@@ -122,6 +121,29 @@ implements Plugin<Project></pre>
<li class="blockList">
<!-- =========== NESTED CLASS SUMMARY =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="nested_summary"><!-- --></a>
+ <h3>Nested Class Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
+ <caption><span>Nested classes</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 interface</strong></code> </td>
+ <td class="colLast"><code><a href='../../../../../../org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.Parameters.html'>GroovyPagePlugin.ScaffoldedControllers.Parameters</a></code></td>
+ <td class="colLast"></td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+ </ul>
+
<!-- =========== ENUM CONSTANT SUMMARY =========== -->
@@ -148,7 +170,7 @@ implements Plugin<Project></pre>
<tr class="altColor">
<td class="colFirst">
- <code><strong><a href="#GroovyPagePlugin()">GroovyPagePlugin</a></strong>()</code><br></td>
+ <code><strong><a href="#GroovyPagePlugin.ScaffoldedControllers()">GroovyPagePlugin.ScaffoldedControllers</a></strong>()</code><br></td>
</tr>
</table>
@@ -174,20 +196,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>
- </tr>
-
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected java.lang.String</code></td>
- <td class="colLast"><code><strong><a href="#getTmpDirPath(org.gradle.api.Project)">getTmpDirPath</a></strong>(<a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</code><br></td>
- </tr>
-
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td class="colLast"><code>protected <a href='../../../../../../org.gradle.api.file.FileCollection.html'>FileCollection</a></code></td>
- <td class="colLast"><code><strong><a href="#resolveClassesDirs(org.gradle.api.tasks.SourceSetOutput, org.gradle.api.Project)">resolveClassesDirs</a></strong>(<a href='../../../../../../org.gradle.api.tasks.SourceSetOutput.html'>SourceSetOutput</a> output, <a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</code><br></td>
+ <td class="colLast"><code>java.lang.Boolean</code></td>
+ <td class="colLast"><code><strong><a href="#obtain()">obtain</a></strong>()</code><br></td>
</tr>
</table>
@@ -237,10 +247,10 @@ implements Plugin<Project></pre>
</a>
<h3>Constructor Detail</h3>
- <a name="GroovyPagePlugin()"><!-- --></a>
+ <a name="GroovyPagePlugin.ScaffoldedControllers()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4><strong>GroovyPagePlugin</strong>()</h4>
+ <h4><strong>GroovyPagePlugin.ScaffoldedControllers</strong>()</h4>
<p></p>
</li>
</ul>
@@ -258,26 +268,10 @@ implements Plugin<Project></pre>
</a>
<h3>Method Detail</h3>
- <a name="apply(org.gradle.api.Project)"><!-- --></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>
- <p></p>
- </li>
- </ul>
-
- <a name="getTmpDirPath(org.gradle.api.Project)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>protected java.lang.String <strong>getTmpDirPath</strong>(<a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</h4>
- <p></p>
- </li>
- </ul>
-
- <a name="resolveClassesDirs(org.gradle.api.tasks.SourceSetOutput, org.gradle.api.Project)"><!-- --></a>
+ <a name="obtain()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>protected <a href='../../../../../../org.gradle.api.file.FileCollection.html'>FileCollection</a> <strong>resolveClassesDirs</strong>(<a href='../../../../../../org.gradle.api.tasks.SourceSetOutput.html'>SourceSetOutput</a> output, <a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</h4>
+ <h4>@java.lang.Override<br>java.lang.Boolean <strong>obtain</strong>()</h4>
<p></p>
</li>
</ul>
@@ -309,14 +303,14 @@ implements Plugin<Project></pre>
<div class="subNav">
<div>
<ul class="navList">
- <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/GroovyPagePlugin" target="_top">Frames</a></li>
- <li><a href="GroovyPagePlugin.html" target="_top">No Frames</a></li>
+ <li><a href="../../../../../../index.html?org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers" target="_top">Frames</a></li>
+ <li><a href="GroovyPagePlugin.ScaffoldedControllers.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>
+ <li><a href="#nested_summary">Nested</a></li> Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
index ce92b215d3e..33ea3a67202 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.html
@@ -70,7 +70,7 @@ 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>
+ <li><a href="#nested_summary">Nested</a></li> Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
@@ -122,6 +122,29 @@ implements Plugin<Project></pre>
<li class="blockList">
<!-- =========== NESTED CLASS SUMMARY =========== -->
+ <ul class="blockList">
+ <li class="blockList"><a name="nested_summary"><!-- --></a>
+ <h3>Nested Class Summary</h3>
+ <ul class="blockList">
+ <table class="overviewSummary" border="0" cellpadding="3" cellspacing="0" summary="Nested Class Summary table, listing nested classes, and an explanation">
+ <caption><span>Nested classes</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 class</strong></code> </td>
+ <td class="colLast"><code><a href='../../../../../../org/grails/gradle/plugin/views/gsp/GroovyPagePlugin.ScaffoldedControllers.html'>GroovyPagePlugin.ScaffoldedControllers</a></code></td>
+ <td class="colLast">Reads the controller sources for the mark of a scaffolded one, as a tracked build input.</td>
+ </tr>
+
+ </table>
+ </ul>
+ </li>
+ </ul>
+
<!-- =========== ENUM CONSTANT SUMMARY =========== -->
@@ -190,6 +213,13 @@ implements Plugin<Project></pre>
<td class="colLast"><code><strong><a href="#resolveClassesDirs(org.gradle.api.tasks.SourceSetOutput, org.gradle.api.Project)">resolveClassesDirs</a></strong>(<a href='../../../../../../org.gradle.api.tasks.SourceSetOutput.html'>SourceSetOutput</a> output, <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>protected Provider<java.lang.Boolean></code></td>
+ <td class="colLast"><code><strong><a href="#scaffoldsAnyController(org.gradle.api.Project)">scaffoldsAnyController</a></strong>(<a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</code><br>Whether any controller in this project is scaffolded, which decides whether the views are
+ staged before they are compiled. </td>
+ </tr>
+
</table>
</ul>
</li>
@@ -282,6 +312,27 @@ implements Plugin<Project></pre>
</li>
</ul>
+ <a name="scaffoldsAnyController(org.gradle.api.Project)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>protected Provider<java.lang.Boolean> <strong>scaffoldsAnyController</strong>(<a href='../../../../../../org.gradle.api.Project.html'>Project</a> project)</h4>
+ <p> Whether any controller in this project is scaffolded, which decides whether the views are
+ staged before they are compiled. The answer is needed while the build is being configured,
+ before anything has been compiled, so it is read from the sources.
+
+ <p>Read through a ValueSource rather than by opening the files here. Gradle re-runs a
+ value source on every build and invalidates the configuration cache when its answer changes,
+ so a controller that becomes scaffolded rebuilds the graph that generates its views. Read
+ directly, the answer would be an undeclared input: settled once, cached, and wrong from then
+ on.</p>
+
+ <p>The match is deliberately loose. GenerateScaffoldedViewsTask reads the real
+ annotation from the compiled class, so a false positive here costs a staging copy and a
+ generation task that writes nothing -- while a false negative costs a view that is missing
+ from the artifact, found by whoever opens that page.</p></p>
+ </li>
+ </ul>
+
</li>
</ul>
@@ -316,7 +367,7 @@ 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>
+ <li><a href="#nested_summary">Nested</a></li> Field <li><a href="#constructor_summary">Constructor</a></li> <li><a href="#method_summary">Method</a></li>
</ul>
<ul class="subNavList">
<li> | Detail: </li>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html
index ef82970ce73..1351a001684 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-frame.html
@@ -38,12 +38,20 @@
+<div class="indexContainer">
+ <h2>Interfaces</h2>
+ <ul>
+ <li><a href="GroovyPagePlugin.ScaffoldedControllers.Parameters.html" title="interface in org.grails.gradle.plugin.views.gsp" target="classFrame"><em>GroovyPagePlugin.ScaffoldedControllers.Parameters</em></a></li>
+ </ul>
+</div>
+
+
<div class="indexContainer">
<h2>Classes</h2>
<ul>
- <li><a href="GenerateTagLibraryIndexTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GenerateTagLibraryIndexTask</a></li><li><a href="GroovyPageForkCompileTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPageForkCompileTask</a></li><li><a href="GroovyPagePlugin.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPagePlugin</a></li><li><a href="TagLibraryIndexFiles.html" title [...]
+ <li><a href="GenerateTagLibraryIndexTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GenerateTagLibraryIndexTask</a></li><li><a href="GroovyPageForkCompileTask.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPageForkCompileTask</a></li><li><a href="GroovyPagePlugin.html" title="class in org.grails.gradle.plugin.views.gsp" target="classFrame">GroovyPagePlugin</a></li><li><a href="GroovyPagePlugin.ScaffoldedContr [...]
</ul>
</div>
diff --git a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-summary.html b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-summary.html
index 8a722db8ec3..77169d0aa48 100644
--- a/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-summary.html
+++ b/docs/snapshot/api/org/grails/gradle/plugin/views/gsp/package-summary.html
@@ -76,6 +76,32 @@ function windowTitle()
<div class="contentContainer">
+ <div class="summary">
+ <ul class="blockList">
+ <li class="blockList">
+ <table border="0" cellpadding="3" cellspacing="0" summary="Interface Summary">
+ <caption><span>Interface Summary</span><span class="tabEnd"> </span></caption>
+ <tbody>
+ <tr>
+ <th class="colFirst" scope="col">Interface</th>
+ <th class="colLast" scope="col">Description</th>
+ </tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="GroovyPagePlugin.ScaffoldedControllers.Parameters.html" title="class in org/grails/gradle/plugin/views/gsp">
+ GroovyPagePlugin.ScaffoldedControllers.Parameters
+ </a></strong>
+ </td>
+ <td></td>
+ </tr>
+
+ </tbody>
+ </table>
+ </li>
+ </ul>
+ </div>
+
+
<div class="summary">
@@ -114,6 +140,14 @@ function windowTitle()
</td>
<td>A plugin that adds support for compiling Groovy Server Pages (GSP)</td>
</tr>
+<tr class="altColor">
+ <td class="colOne">
+ <strong><a href="GroovyPagePlugin.ScaffoldedControllers.html" title="class in org/grails/gradle/plugin/views/gsp">
+ GroovyPagePlugin.ScaffoldedControllers
+ </a></strong>
+ </td>
+ <td>Reads the controller sources for the mark of a scaffolded one, as a tracked build input.</td>
+ </tr>
<tr class="altColor">
<td class="colOne">
<strong><a href="TagLibraryIndexFiles.html" title="class in org/grails/gradle/plugin/views/gsp">
diff --git a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html b/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
index 52d543e0ab9..1fd0618d2db 100644
--- a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
+++ b/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
@@ -182,107 +182,113 @@ implements <a href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
<tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONFIG_PROPERTY_GSP_ENCODING">CONFIG_PROPERTY_GSP_ENCODING</a></code></td>
+ <td class="colLast"><code><a href="#CONFIG_PROPERTY_GSP_COMPILESTATIC_STRICT">CONFIG_PROPERTY_GSP_COMPILESTATIC_STRICT</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONFIG_PROPERTY_GSP_GRAILS_LAYOUT_PREPROCESS">CONFIG_PROPERTY_GSP_GRAILS_LAYOUT_PREPROCESS</a></code></td>
+ <td class="colLast"><code><a href="#CONFIG_PROPERTY_GSP_ENCODING">CONFIG_PROPERTY_GSP_ENCODING</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONFIG_PROPERTY_GSP_KEEPGENERATED_DIR">CONFIG_PROPERTY_GSP_KEEPGENERATED_DIR</a></code></td>
+ <td class="colLast"><code><a href="#CONFIG_PROPERTY_GSP_GRAILS_LAYOUT_PREPROCESS">CONFIG_PROPERTY_GSP_GRAILS_LAYOUT_PREPROCESS</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_COMPILE_STATIC_MODE">CONSTANT_NAME_COMPILE_STATIC_MODE</a></code></td>
+ <td class="colLast"><code><a href="#CONFIG_PROPERTY_GSP_KEEPGENERATED_DIR">CONFIG_PROPERTY_GSP_KEEPGENERATED_DIR</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_CONTENT_TYPE">CONSTANT_NAME_CONTENT_TYPE</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_COMPILE_STATIC_MODE">CONSTANT_NAME_COMPILE_STATIC_MODE</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_EXPRESSION_CODEC">CONSTANT_NAME_EXPRESSION_CODEC</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_CONTENT_TYPE">CONSTANT_NAME_CONTENT_TYPE</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_JSP_TAGS">CONSTANT_NAME_JSP_TAGS</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_EXPRESSION_CODEC">CONSTANT_NAME_EXPRESSION_CODEC</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_MODEL_FIELDS_MODE">CONSTANT_NAME_MODEL_FIELDS_MODE</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_JSP_TAGS">CONSTANT_NAME_JSP_TAGS</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_OUT_CODEC">CONSTANT_NAME_OUT_CODEC</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_MODEL_FIELDS_MODE">CONSTANT_NAME_MODEL_FIELDS_MODE</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_SOURCE_CHECKSUM">CONSTANT_NAME_SOURCE_CHECKSUM</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_OUT_CODEC">CONSTANT_NAME_OUT_CODEC</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_STATIC_CODEC">CONSTANT_NAME_STATIC_CODEC</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_SOURCE_CHECKSUM">CONSTANT_NAME_SOURCE_CHECKSUM</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#CONSTANT_NAME_TAGLIB_CODEC">CONSTANT_NAME_TAGLIB_CODEC</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_STATIC_CODEC">CONSTANT_NAME_STATIC_CODEC</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a href="#DEFAULT_ENCODING">DEFAULT_ENCODING</a></code></td>
+ <td class="colLast"><code><a href="#CONSTANT_NAME_TAGLIB_CODEC">CONSTANT_NAME_TAGLIB_CODEC</a></code></td>
<td class="colLast"></td>
</tr>
<tr class="rowColor">
+ <td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
+ <td class="colLast"><code><a href="#DEFAULT_ENCODING">DEFAULT_ENCODING</a></code></td>
+ <td class="colLast"></td>
+ </tr>
+
+ <tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String[]</strong></code> </td>
<td class="colLast"><code><a href="#DEFAULT_IMPORTS">DEFAULT_IMPORTS</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static java.util.List<java.lang.String></strong></code> </td>
<td class="colLast"><code><a href="#DEFAULT_TAGLIB_NAMESPACES">DEFAULT_TAGLIB_NAMESPACES</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
<td class="colLast"><code><a href="#GROOVY_SOURCE_CHAR_ENCODING">GROOVY_SOURCE_CHAR_ENCODING</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
<td class="colLast"><code><a href="#MODEL_DIRECTIVE">MODEL_DIRECTIVE</a></code></td>
<td class="colLast"></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
<td class="colLast"><code><a href="#TAGLIBS_DIRECTIVE">TAGLIBS_DIRECTIVE</a></code></td>
<td class="colLast"></td>
@@ -660,6 +666,14 @@ implements <a href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
</li>
</ul>
+ <a name="CONFIG_PROPERTY_GSP_COMPILESTATIC_STRICT"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static final java.lang.String <strong>CONFIG_PROPERTY_GSP_COMPILESTATIC_STRICT</strong></h4>
+ <p></p>
+ </li>
+ </ul>
+
<a name="CONFIG_PROPERTY_GSP_ENCODING"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html b/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html
index cfb29dca014..2f766747d16 100644
--- a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html
+++ b/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageTypeCheckingConfig.html
@@ -137,6 +137,19 @@ public @interface GroovyPageTypeCheckingConfig</pre>
<th class="colLast" scope="col">Name and Description</th>
</tr>
+ <tr class="altColor">
+ <td class="colFirst"><code><strong>java.lang.String[]</strong></code> </td>
+ <td class="colLast"><code><a href="#pageScopeVariables">pageScopeVariables</a></code><br>Names the page introduces for itself, through the <CODE>var</CODE> and <CODE>status</CODE> attributes of
+ the tags it calls -- <CODE><g:set var="total"/></CODE>, <CODE><g:each var="book"/></CODE> and the like.</td>
+ </tr>
+
+ <tr class="rowColor">
+ <td class="colFirst"><code><strong>boolean</strong></code> </td>
+ <td class="colLast"><code><a href="#strict">strict</a></code><br>Whether a name the page never declares, and a member read from something whose type is not
+ known, fail the compilation rather than resolving as they would in a page that is not compiled
+ statically.</td>
+ </tr>
+
<tr class="altColor">
<td class="colFirst"><code><strong>java.lang.String[]</strong></code> </td>
<td class="colLast"><code><a href="#taglibs">taglibs</a></code><br> <DL><DT><B>Default:</B></DT><DD>{}</DD></DL></td>
@@ -196,6 +209,34 @@ public @interface GroovyPageTypeCheckingConfig</pre>
</a>
<h3>Element Detail</h3>
+ <a name="pageScopeVariables"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.lang.String[] <strong>pageScopeVariables</strong></h4>
+ <p> Names the page introduces for itself, through the <CODE>var</CODE> and <CODE>status</CODE> attributes of
+ the tags it calls -- <CODE><g:set var="total"/></CODE>, <CODE><g:each var="book"/></CODE> and the like.
+
+ <p>A page that writes one of these has declared it as plainly as it can; what it holds is
+ decided by the tag at render time and cannot be known here. They are resolved dynamically
+ rather than reported, so that using a tag to introduce a name does not require declaring it a
+ second time in the model directive.</p> <DL><DT><B>Default:</B></DT><DD>{}</DD></DL></p>
+ </li>
+ </ul>
+
+ <a name="strict"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public boolean <strong>strict</strong></h4>
+ <p> Whether a name the page never declares, and a member read from something whose type is not
+ known, fail the compilation rather than resolving as they would in a page that is not compiled
+ statically.
+
+ <p>Off by default, so that compiling a page statically is worth doing on an application that
+ has not declared the model of every page: what can be checked is checked, and what cannot is
+ left to run as it always has. Turning it on asks for the guarantee instead.</p> <DL><DT><B>Default:</B></DT><DD>false</DD></DL></p>
+ </li>
+ </ul>
+
<a name="taglibs"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.html b/docs/snapshot/api/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.html
index d9b54e49659..b4c45554614 100644
--- a/docs/snapshot/api/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.html
+++ b/docs/snapshot/api/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.html
@@ -106,7 +106,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<!-- todo: direct known subclasses -->
<hr>
-<pre>@groovy.transform.CompileStatic
+<pre>@groovy.util.logging.Slf4j
+@groovy.transform.CompileStatic
class AsyncWebRequestPromiseDecoratorLookupStrategy
extends java.lang.Object
implements <a href='../../../../../grails/async/decorator/PromiseDecoratorLookupStrategy.html'>PromiseDecoratorLookupStrategy</a></pre>
diff --git a/docs/snapshot/api/org/grails/web/taglib/WebRequestTemplateVariableBinding.html b/docs/snapshot/api/org/grails/web/taglib/WebRequestTemplateVariableBinding.html
index 35e3faeeb3a..317f3e4489f 100644
--- a/docs/snapshot/api/org/grails/web/taglib/WebRequestTemplateVariableBinding.html
+++ b/docs/snapshot/api/org/grails/web/taglib/WebRequestTemplateVariableBinding.html
@@ -239,36 +239,42 @@ extends <a href='../../../../org/grails/taglib/AbstractTemplateVariableBinding.h
</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="#evaluate(org.grails.web.servlet.mvc.GrailsWebRequest)">evaluate</a></strong>(<a href='../../../../org/grails/web/servlet/mvc/GrailsWebRequest.html'>GrailsWebRequest</a> webRequest)</code><br></td>
+ </tr>
+
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public groovy.lang.Binding</code></td>
<td class="colLast"><code><strong><a href="#findBindingForVariable(java.lang.String)">findBindingForVariable</a></strong>(java.lang.String name)</code><br></td>
</tr>
- <tr class="rowColor">
+ <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="#getVariable(java.lang.String)">getVariable</a></strong>(java.lang.String name)</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public java.util.Set<java.lang.String></code></td>
<td class="colLast"><code><strong><a href="#getVariableNames()">getVariableNames</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public boolean</code></td>
<td class="colLast"><code><strong><a href="#isRequestAttributeVariable(java.lang.String)">isRequestAttributeVariable</a></strong>(java.lang.String name)</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public boolean</code></td>
<td class="colLast"><code><strong><a href="#isVariableCachingAllowed(java.lang.String)">isVariableCachingAllowed</a></strong>(java.lang.String name)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>protected java.lang.Object</code></td>
<td class="colLast"><code><strong><a href="#resolveMissingVariable(java.lang.String)">resolveMissingVariable</a></strong>(java.lang.String name)</code><br></td>
@@ -438,6 +444,14 @@ extends <a href='../../../../org/grails/taglib/AbstractTemplateVariableBinding.h
</li>
</ul>
+ <a name="evaluate(org.grails.web.servlet.mvc.GrailsWebRequest)"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.lang.Object <strong>evaluate</strong>(<a href='../../../../org/grails/web/servlet/mvc/GrailsWebRequest.html'>GrailsWebRequest</a> webRequest)</h4>
+ <p></p>
+ </li>
+ </ul>
+
<a name="findBindingForVariable(java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/overview-frame.html b/docs/snapshot/api/overview-frame.html
index f2f6432ac55..0563a9b1364 100644
--- a/docs/snapshot/api/overview-frame.html
+++ b/docs/snapshot/api/overview-frame.html
@@ -1742,6 +1742,9 @@
<li><a href="org/grails/gradle/plugin/run/package-frame.html"
target="packageFrame">org.grails.gradle.plugin.run</a></li>
+ <li><a href="org/grails/gradle/plugin/scaffolding/package-frame.html"
+ target="packageFrame">org.grails.gradle.plugin.scaffolding</a></li>
+
<li><a href="org/grails/gradle/plugin/util/package-frame.html"
target="packageFrame">org.grails.gradle.plugin.util</a></li>
diff --git a/docs/snapshot/api/overview-summary.html b/docs/snapshot/api/overview-summary.html
index 2b443b16c0f..ac63fd1189c 100644
--- a/docs/snapshot/api/overview-summary.html
+++ b/docs/snapshot/api/overview-summary.html
@@ -3500,978 +3500,984 @@ if (location.href.indexOf('is-external=true') == -1) {
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/gradle/plugin/util/package-summary.html">org.grails.gradle.plugin.util</a></td>
+ <td class="colFirst"><a href="org/grails/gradle/plugin/scaffolding/package-summary.html">org.grails.gradle.plugin.scaffolding</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/gradle/plugin/views/package-summary.html">org.grails.gradle.plugin.views</a></td>
+ <td class="colFirst"><a href="org/grails/gradle/plugin/util/package-summary.html">org.grails.gradle.plugin.util</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/gradle/plugin/views/gsp/package-summary.html">org.grails.gradle.plugin.views.gsp</a></td>
+ <td class="colFirst"><a href="org/grails/gradle/plugin/views/package-summary.html">org.grails.gradle.plugin.views</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/gradle/plugin/views/json/package-summary.html">org.grails.gradle.plugin.views.json</a></td>
+ <td class="colFirst"><a href="org/grails/gradle/plugin/views/gsp/package-summary.html">org.grails.gradle.plugin.views.gsp</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/gradle/plugin/views/markup/package-summary.html">org.grails.gradle.plugin.views.markup</a></td>
+ <td class="colFirst"><a href="org/grails/gradle/plugin/views/json/package-summary.html">org.grails.gradle.plugin.views.json</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/gradle/plugin/web/package-summary.html">org.grails.gradle.plugin.web</a></td>
+ <td class="colFirst"><a href="org/grails/gradle/plugin/views/markup/package-summary.html">org.grails.gradle.plugin.views.markup</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/gsp/package-summary.html">org.grails.gsp</a></td>
+ <td class="colFirst"><a href="org/grails/gradle/plugin/web/package-summary.html">org.grails.gradle.plugin.web</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/gsp/compiler/package-summary.html">org.grails.gsp.compiler</a></td>
+ <td class="colFirst"><a href="org/grails/gsp/package-summary.html">org.grails.gsp</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/gsp/compiler/tags/package-summary.html">org.grails.gsp.compiler.tags</a></td>
+ <td class="colFirst"><a href="org/grails/gsp/compiler/package-summary.html">org.grails.gsp.compiler</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/gsp/compiler/transform/package-summary.html">org.grails.gsp.compiler.transform</a></td>
+ <td class="colFirst"><a href="org/grails/gsp/compiler/tags/package-summary.html">org.grails.gsp.compiler.tags</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/gsp/io/package-summary.html">org.grails.gsp.io</a></td>
+ <td class="colFirst"><a href="org/grails/gsp/compiler/transform/package-summary.html">org.grails.gsp.compiler.transform</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/gsp/jsp/package-summary.html">org.grails.gsp.jsp</a></td>
+ <td class="colFirst"><a href="org/grails/gsp/io/package-summary.html">org.grails.gsp.io</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/io/support/package-summary.html">org.grails.io.support</a></td>
+ <td class="colFirst"><a href="org/grails/gsp/jsp/package-summary.html">org.grails.gsp.jsp</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/io/watch/package-summary.html">org.grails.io.watch</a></td>
+ <td class="colFirst"><a href="org/grails/io/support/package-summary.html">org.grails.io.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/package-summary.html">org.grails.orm.hibernate</a></td>
+ <td class="colFirst"><a href="org/grails/io/watch/package-summary.html">org.grails.io.watch</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/access/package-summary.html">org.grails.orm.hibernate.access</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/package-summary.html">org.grails.orm.hibernate</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/package-summary.html">org.grails.orm.hibernate.cfg</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/access/package-summary.html">org.grails.orm.hibernate.access</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/binder/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.binder</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/package-summary.html">org.grails.orm.hibernate.cfg</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/collectionType/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.collectionType</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/binder/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.binder</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/generator/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.generator</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/collectionType/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.collectionType</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.hibernate</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/generator/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.generator</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/secondpass/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.secondpass</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/hibernate/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.hibernate</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/util/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.util</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/secondpass/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.secondpass</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/compiler/package-summary.html">org.grails.orm.hibernate.compiler</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/cfg/domainbinding/util/package-summary.html">org.grails.orm.hibernate.cfg.domainbinding.util</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/connections/package-summary.html">org.grails.orm.hibernate.connections</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/compiler/package-summary.html">org.grails.orm.hibernate.compiler</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/datasource/package-summary.html">org.grails.orm.hibernate.datasource</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/connections/package-summary.html">org.grails.orm.hibernate.connections</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/dirty/package-summary.html">org.grails.orm.hibernate.dirty</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/datasource/package-summary.html">org.grails.orm.hibernate.datasource</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/event/listener/package-summary.html">org.grails.orm.hibernate.event.listener</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/dirty/package-summary.html">org.grails.orm.hibernate.dirty</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/exceptions/package-summary.html">org.grails.orm.hibernate.exceptions</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/event/listener/package-summary.html">org.grails.orm.hibernate.event.listener</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/multitenancy/package-summary.html">org.grails.orm.hibernate.multitenancy</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/exceptions/package-summary.html">org.grails.orm.hibernate.exceptions</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/proxy/package-summary.html">org.grails.orm.hibernate.proxy</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/multitenancy/package-summary.html">org.grails.orm.hibernate.multitenancy</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/query/package-summary.html">org.grails.orm.hibernate.query</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/proxy/package-summary.html">org.grails.orm.hibernate.proxy</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/support/package-summary.html">org.grails.orm.hibernate.support</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/query/package-summary.html">org.grails.orm.hibernate.query</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/orm/hibernate/transaction/package-summary.html">org.grails.orm.hibernate.transaction</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/support/package-summary.html">org.grails.orm.hibernate.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugin/cache/package-summary.html">org.grails.plugin.cache</a></td>
+ <td class="colFirst"><a href="org/grails/orm/hibernate/transaction/package-summary.html">org.grails.orm.hibernate.transaction</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugin/cache/compiler/package-summary.html">org.grails.plugin.cache.compiler</a></td>
+ <td class="colFirst"><a href="org/grails/plugin/cache/package-summary.html">org.grails.plugin.cache</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugin/hibernate/support/package-summary.html">org.grails.plugin.hibernate.support</a></td>
+ <td class="colFirst"><a href="org/grails/plugin/cache/compiler/package-summary.html">org.grails.plugin.cache.compiler</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/package-summary.html">org.grails.plugins</a></td>
+ <td class="colFirst"><a href="org/grails/plugin/hibernate/support/package-summary.html">org.grails.plugin.hibernate.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/codecs/package-summary.html">org.grails.plugins.codecs</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/package-summary.html">org.grails.plugins</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/converters/package-summary.html">org.grails.plugins.converters</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/codecs/package-summary.html">org.grails.plugins.codecs</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/converters/api/package-summary.html">org.grails.plugins.converters.api</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/converters/package-summary.html">org.grails.plugins.converters</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/databasemigration/package-summary.html">org.grails.plugins.databasemigration</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/converters/api/package-summary.html">org.grails.plugins.converters.api</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/databasemigration/liquibase/package-summary.html">org.grails.plugins.databasemigration.liquibase</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/databasemigration/package-summary.html">org.grails.plugins.databasemigration</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/databinding/package-summary.html">org.grails.plugins.databinding</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/databasemigration/liquibase/package-summary.html">org.grails.plugins.databasemigration.liquibase</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/datasource/package-summary.html">org.grails.plugins.datasource</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/databinding/package-summary.html">org.grails.plugins.databinding</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/domain/package-summary.html">org.grails.plugins.domain</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/datasource/package-summary.html">org.grails.plugins.datasource</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/domain/support/package-summary.html">org.grails.plugins.domain.support</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/domain/package-summary.html">org.grails.plugins.domain</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/events/package-summary.html">org.grails.plugins.events</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/domain/support/package-summary.html">org.grails.plugins.domain.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/i18n/package-summary.html">org.grails.plugins.i18n</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/events/package-summary.html">org.grails.plugins.events</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/services/package-summary.html">org.grails.plugins.services</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/i18n/package-summary.html">org.grails.plugins.i18n</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/sitemesh3/package-summary.html">org.grails.plugins.sitemesh3</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/services/package-summary.html">org.grails.plugins.services</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/support/package-summary.html">org.grails.plugins.support</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/sitemesh3/package-summary.html">org.grails.plugins.sitemesh3</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/testing/package-summary.html">org.grails.plugins.testing</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/support/package-summary.html">org.grails.plugins.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/package-summary.html">org.grails.plugins.web</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/testing/package-summary.html">org.grails.plugins.testing</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/api/package-summary.html">org.grails.plugins.web.api</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/package-summary.html">org.grails.plugins.web</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/async/package-summary.html">org.grails.plugins.web.async</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/api/package-summary.html">org.grails.plugins.web.api</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/async/mvc/package-summary.html">org.grails.plugins.web.async.mvc</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/async/package-summary.html">org.grails.plugins.web.async</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/async/spring/package-summary.html">org.grails.plugins.web.async.spring</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/async/mvc/package-summary.html">org.grails.plugins.web.async.mvc</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/controllers/package-summary.html">org.grails.plugins.web.controllers</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/async/spring/package-summary.html">org.grails.plugins.web.async.spring</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/controllers/api/package-summary.html">org.grails.plugins.web.controllers.api</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/controllers/package-summary.html">org.grails.plugins.web.controllers</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/controllers/metaclass/package-summary.html">org.grails.plugins.web.controllers.metaclass</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/controllers/api/package-summary.html">org.grails.plugins.web.controllers.api</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/interceptors/package-summary.html">org.grails.plugins.web.interceptors</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/controllers/metaclass/package-summary.html">org.grails.plugins.web.controllers.metaclass</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/mapping/package-summary.html">org.grails.plugins.web.mapping</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/interceptors/package-summary.html">org.grails.plugins.web.interceptors</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/mapping/factory/package-summary.html">org.grails.plugins.web.mapping.factory</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/mapping/package-summary.html">org.grails.plugins.web.mapping</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/mime/package-summary.html">org.grails.plugins.web.mime</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/mapping/factory/package-summary.html">org.grails.plugins.web.mapping.factory</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/rest/plugin/package-summary.html">org.grails.plugins.web.rest.plugin</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/mime/package-summary.html">org.grails.plugins.web.mime</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/rest/render/package-summary.html">org.grails.plugins.web.rest.render</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/rest/plugin/package-summary.html">org.grails.plugins.web.rest.plugin</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/rest/render/html/package-summary.html">org.grails.plugins.web.rest.render.html</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/rest/render/package-summary.html">org.grails.plugins.web.rest.render</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/rest/render/json/package-summary.html">org.grails.plugins.web.rest.render.json</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/rest/render/html/package-summary.html">org.grails.plugins.web.rest.render.html</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/rest/render/xml/package-summary.html">org.grails.plugins.web.rest.render.xml</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/rest/render/json/package-summary.html">org.grails.plugins.web.rest.render.json</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/rest/transform/package-summary.html">org.grails.plugins.web.rest.transform</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/rest/render/xml/package-summary.html">org.grails.plugins.web.rest.render.xml</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/servlet/context/package-summary.html">org.grails.plugins.web.servlet.context</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/rest/transform/package-summary.html">org.grails.plugins.web.rest.transform</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/plugins/web/servlet/mvc/package-summary.html">org.grails.plugins.web.servlet.mvc</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/servlet/context/package-summary.html">org.grails.plugins.web.servlet.context</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/plugins/web/taglib/package-summary.html">org.grails.plugins.web.taglib</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/servlet/mvc/package-summary.html">org.grails.plugins.web.servlet.mvc</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/scaffolding/package-summary.html">org.grails.scaffolding</a></td>
+ <td class="colFirst"><a href="org/grails/plugins/web/taglib/package-summary.html">org.grails.plugins.web.taglib</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/scaffolding/markup/package-summary.html">org.grails.scaffolding.markup</a></td>
+ <td class="colFirst"><a href="org/grails/scaffolding/package-summary.html">org.grails.scaffolding</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/scaffolding/model/package-summary.html">org.grails.scaffolding.model</a></td>
+ <td class="colFirst"><a href="org/grails/scaffolding/markup/package-summary.html">org.grails.scaffolding.markup</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/scaffolding/model/property/package-summary.html">org.grails.scaffolding.model.property</a></td>
+ <td class="colFirst"><a href="org/grails/scaffolding/model/package-summary.html">org.grails.scaffolding.model</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/scaffolding/registry/package-summary.html">org.grails.scaffolding.registry</a></td>
+ <td class="colFirst"><a href="org/grails/scaffolding/model/property/package-summary.html">org.grails.scaffolding.model.property</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/scaffolding/registry/input/package-summary.html">org.grails.scaffolding.registry.input</a></td>
+ <td class="colFirst"><a href="org/grails/scaffolding/registry/package-summary.html">org.grails.scaffolding.registry</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/scaffolding/registry/output/package-summary.html">org.grails.scaffolding.registry.output</a></td>
+ <td class="colFirst"><a href="org/grails/scaffolding/registry/input/package-summary.html">org.grails.scaffolding.registry.input</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/spring/package-summary.html">org.grails.spring</a></td>
+ <td class="colFirst"><a href="org/grails/scaffolding/registry/output/package-summary.html">org.grails.scaffolding.registry.output</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/spring/aop/autoproxy/package-summary.html">org.grails.spring.aop.autoproxy</a></td>
+ <td class="colFirst"><a href="org/grails/spring/package-summary.html">org.grails.spring</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/spring/beans/package-summary.html">org.grails.spring.beans</a></td>
+ <td class="colFirst"><a href="org/grails/spring/aop/autoproxy/package-summary.html">org.grails.spring.aop.autoproxy</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/spring/beans/factory/package-summary.html">org.grails.spring.beans.factory</a></td>
+ <td class="colFirst"><a href="org/grails/spring/beans/package-summary.html">org.grails.spring.beans</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/spring/context/package-summary.html">org.grails.spring.context</a></td>
+ <td class="colFirst"><a href="org/grails/spring/beans/factory/package-summary.html">org.grails.spring.beans.factory</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/spring/context/annotation/package-summary.html">org.grails.spring.context.annotation</a></td>
+ <td class="colFirst"><a href="org/grails/spring/context/package-summary.html">org.grails.spring.context</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/spring/context/support/package-summary.html">org.grails.spring.context.support</a></td>
+ <td class="colFirst"><a href="org/grails/spring/context/annotation/package-summary.html">org.grails.spring.context.annotation</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/taglib/package-summary.html">org.grails.taglib</a></td>
+ <td class="colFirst"><a href="org/grails/spring/context/support/package-summary.html">org.grails.spring.context.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a></td>
+ <td class="colFirst"><a href="org/grails/taglib/package-summary.html">org.grails.taglib</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/taglib/encoder/package-summary.html">org.grails.taglib.encoder</a></td>
+ <td class="colFirst"><a href="org/grails/taglib/discovery/package-summary.html">org.grails.taglib.discovery</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/taglib/index/package-summary.html">org.grails.taglib.index</a></td>
+ <td class="colFirst"><a href="org/grails/taglib/encoder/package-summary.html">org.grails.taglib.encoder</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/test/io/package-summary.html">org.grails.test.io</a></td>
+ <td class="colFirst"><a href="org/grails/taglib/index/package-summary.html">org.grails.taglib.index</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/test/spock/package-summary.html">org.grails.test.spock</a></td>
+ <td class="colFirst"><a href="org/grails/test/io/package-summary.html">org.grails.test.io</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/test/support/package-summary.html">org.grails.test.support</a></td>
+ <td class="colFirst"><a href="org/grails/test/spock/package-summary.html">org.grails.test.spock</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/testing/package-summary.html">org.grails.testing</a></td>
+ <td class="colFirst"><a href="org/grails/test/support/package-summary.html">org.grails.test.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/testing/context/junit4/package-summary.html">org.grails.testing.context.junit4</a></td>
+ <td class="colFirst"><a href="org/grails/testing/package-summary.html">org.grails.testing</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/testing/gorm/package-summary.html">org.grails.testing.gorm</a></td>
+ <td class="colFirst"><a href="org/grails/testing/context/junit4/package-summary.html">org.grails.testing.context.junit4</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/testing/gorm/spock/package-summary.html">org.grails.testing.gorm.spock</a></td>
+ <td class="colFirst"><a href="org/grails/testing/gorm/package-summary.html">org.grails.testing.gorm</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/testing/runtime/support/package-summary.html">org.grails.testing.runtime.support</a></td>
+ <td class="colFirst"><a href="org/grails/testing/gorm/spock/package-summary.html">org.grails.testing.gorm.spock</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/testing/spock/package-summary.html">org.grails.testing.spock</a></td>
+ <td class="colFirst"><a href="org/grails/testing/runtime/support/package-summary.html">org.grails.testing.runtime.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/transaction/package-summary.html">org.grails.transaction</a></td>
+ <td class="colFirst"><a href="org/grails/testing/spock/package-summary.html">org.grails.testing.spock</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/validation/package-summary.html">org.grails.validation</a></td>
+ <td class="colFirst"><a href="org/grails/transaction/package-summary.html">org.grails.transaction</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/validation/discovery/package-summary.html">org.grails.validation.discovery</a></td>
+ <td class="colFirst"><a href="org/grails/validation/package-summary.html">org.grails.validation</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/beans/package-summary.html">org.grails.web.beans</a></td>
+ <td class="colFirst"><a href="org/grails/validation/discovery/package-summary.html">org.grails.validation.discovery</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/binding/package-summary.html">org.grails.web.binding</a></td>
+ <td class="colFirst"><a href="org/grails/web/beans/package-summary.html">org.grails.web.beans</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/config/http/package-summary.html">org.grails.web.config.http</a></td>
+ <td class="colFirst"><a href="org/grails/web/binding/package-summary.html">org.grails.web.binding</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/context/package-summary.html">org.grails.web.context</a></td>
+ <td class="colFirst"><a href="org/grails/web/config/http/package-summary.html">org.grails.web.config.http</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/converters/package-summary.html">org.grails.web.converters</a></td>
+ <td class="colFirst"><a href="org/grails/web/context/package-summary.html">org.grails.web.context</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/converters/configuration/package-summary.html">org.grails.web.converters.configuration</a></td>
+ <td class="colFirst"><a href="org/grails/web/converters/package-summary.html">org.grails.web.converters</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/converters/exceptions/package-summary.html">org.grails.web.converters.exceptions</a></td>
+ <td class="colFirst"><a href="org/grails/web/converters/configuration/package-summary.html">org.grails.web.converters.configuration</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/converters/marshaller/package-summary.html">org.grails.web.converters.marshaller</a></td>
+ <td class="colFirst"><a href="org/grails/web/converters/exceptions/package-summary.html">org.grails.web.converters.exceptions</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/converters/marshaller/json/package-summary.html">org.grails.web.converters.marshaller.json</a></td>
+ <td class="colFirst"><a href="org/grails/web/converters/marshaller/package-summary.html">org.grails.web.converters.marshaller</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/converters/marshaller/xml/package-summary.html">org.grails.web.converters.marshaller.xml</a></td>
+ <td class="colFirst"><a href="org/grails/web/converters/marshaller/json/package-summary.html">org.grails.web.converters.marshaller.json</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/databinding/package-summary.html">org.grails.web.databinding</a></td>
+ <td class="colFirst"><a href="org/grails/web/converters/marshaller/xml/package-summary.html">org.grails.web.converters.marshaller.xml</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/databinding/bindingsource/package-summary.html">org.grails.web.databinding.bindingsource</a></td>
+ <td class="colFirst"><a href="org/grails/web/databinding/package-summary.html">org.grails.web.databinding</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/databinding/converters/package-summary.html">org.grails.web.databinding.converters</a></td>
+ <td class="colFirst"><a href="org/grails/web/databinding/bindingsource/package-summary.html">org.grails.web.databinding.bindingsource</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/errors/package-summary.html">org.grails.web.errors</a></td>
+ <td class="colFirst"><a href="org/grails/web/databinding/converters/package-summary.html">org.grails.web.databinding.converters</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/filters/package-summary.html">org.grails.web.filters</a></td>
+ <td class="colFirst"><a href="org/grails/web/errors/package-summary.html">org.grails.web.errors</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/gsp/package-summary.html">org.grails.web.gsp</a></td>
+ <td class="colFirst"><a href="org/grails/web/filters/package-summary.html">org.grails.web.filters</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/gsp/io/package-summary.html">org.grails.web.gsp.io</a></td>
+ <td class="colFirst"><a href="org/grails/web/gsp/package-summary.html">org.grails.web.gsp</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/i18n/package-summary.html">org.grails.web.i18n</a></td>
+ <td class="colFirst"><a href="org/grails/web/gsp/io/package-summary.html">org.grails.web.gsp.io</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/json/package-summary.html">org.grails.web.json</a></td>
+ <td class="colFirst"><a href="org/grails/web/i18n/package-summary.html">org.grails.web.i18n</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/json/parser/package-summary.html">org.grails.web.json.parser</a></td>
+ <td class="colFirst"><a href="org/grails/web/json/package-summary.html">org.grails.web.json</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/mapping/package-summary.html">org.grails.web.mapping</a></td>
+ <td class="colFirst"><a href="org/grails/web/json/parser/package-summary.html">org.grails.web.json.parser</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/mapping/mvc/package-summary.html">org.grails.web.mapping.mvc</a></td>
+ <td class="colFirst"><a href="org/grails/web/mapping/package-summary.html">org.grails.web.mapping</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/mapping/servlet/package-summary.html">org.grails.web.mapping.servlet</a></td>
+ <td class="colFirst"><a href="org/grails/web/mapping/mvc/package-summary.html">org.grails.web.mapping.mvc</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/mime/package-summary.html">org.grails.web.mime</a></td>
+ <td class="colFirst"><a href="org/grails/web/mapping/servlet/package-summary.html">org.grails.web.mapping.servlet</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/pages/package-summary.html">org.grails.web.pages</a></td>
+ <td class="colFirst"><a href="org/grails/web/mime/package-summary.html">org.grails.web.mime</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/plugins/support/package-summary.html">org.grails.web.plugins.support</a></td>
+ <td class="colFirst"><a href="org/grails/web/pages/package-summary.html">org.grails.web.pages</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/servlet/package-summary.html">org.grails.web.servlet</a></td>
+ <td class="colFirst"><a href="org/grails/web/plugins/support/package-summary.html">org.grails.web.plugins.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/servlet/boostrap/package-summary.html">org.grails.web.servlet.boostrap</a></td>
+ <td class="colFirst"><a href="org/grails/web/servlet/package-summary.html">org.grails.web.servlet</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/servlet/context/package-summary.html">org.grails.web.servlet.context</a></td>
+ <td class="colFirst"><a href="org/grails/web/servlet/boostrap/package-summary.html">org.grails.web.servlet.boostrap</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/servlet/context/support/package-summary.html">org.grails.web.servlet.context.support</a></td>
+ <td class="colFirst"><a href="org/grails/web/servlet/context/package-summary.html">org.grails.web.servlet.context</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/servlet/mvc/package-summary.html">org.grails.web.servlet.mvc</a></td>
+ <td class="colFirst"><a href="org/grails/web/servlet/context/support/package-summary.html">org.grails.web.servlet.context.support</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/servlet/mvc/exceptions/package-summary.html">org.grails.web.servlet.mvc.exceptions</a></td>
+ <td class="colFirst"><a href="org/grails/web/servlet/mvc/package-summary.html">org.grails.web.servlet.mvc</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/servlet/view/package-summary.html">org.grails.web.servlet.view</a></td>
+ <td class="colFirst"><a href="org/grails/web/servlet/mvc/exceptions/package-summary.html">org.grails.web.servlet.mvc.exceptions</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/taglib/package-summary.html">org.grails.web.taglib</a></td>
+ <td class="colFirst"><a href="org/grails/web/servlet/view/package-summary.html">org.grails.web.servlet.view</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/taglib/encoder/package-summary.html">org.grails.web.taglib.encoder</a></td>
+ <td class="colFirst"><a href="org/grails/web/taglib/package-summary.html">org.grails.web.taglib</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/taglib/jsp/package-summary.html">org.grails.web.taglib.jsp</a></td>
+ <td class="colFirst"><a href="org/grails/web/taglib/encoder/package-summary.html">org.grails.web.taglib.encoder</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/grails/web/util/package-summary.html">org.grails.web.util</a></td>
+ <td class="colFirst"><a href="org/grails/web/taglib/jsp/package-summary.html">org.grails.web.taglib.jsp</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/grails/web/xml/package-summary.html">org.grails.web.xml</a></td>
+ <td class="colFirst"><a href="org/grails/web/util/package-summary.html">org.grails.web.util</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/hibernate/proxy/package-summary.html">org.hibernate.proxy</a></td>
+ <td class="colFirst"><a href="org/grails/web/xml/package-summary.html">org.grails.web.xml</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/data/mongodb/package-summary.html">org.springframework.data.mongodb</a></td>
+ <td class="colFirst"><a href="org/hibernate/proxy/package-summary.html">org.hibernate.proxy</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/access/package-summary.html">org.springframework.security.access</a></td>
+ <td class="colFirst"><a href="org/springframework/data/mongodb/package-summary.html">org.springframework.data.mongodb</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/security/access/annotation/package-summary.html">org.springframework.security.access.annotation</a></td>
+ <td class="colFirst"><a href="org/springframework/security/access/package-summary.html">org.springframework.security.access</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/access/expression/method/package-summary.html">org.springframework.security.access.expression.method</a></td>
+ <td class="colFirst"><a href="org/springframework/security/access/annotation/package-summary.html">org.springframework.security.access.annotation</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/security/access/intercept/package-summary.html">org.springframework.security.access.intercept</a></td>
+ <td class="colFirst"><a href="org/springframework/security/access/expression/method/package-summary.html">org.springframework.security.access.expression.method</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/access/intercept/aopalliance/package-summary.html">org.springframework.security.access.intercept.aopalliance</a></td>
+ <td class="colFirst"><a href="org/springframework/security/access/intercept/package-summary.html">org.springframework.security.access.intercept</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/security/access/method/package-summary.html">org.springframework.security.access.method</a></td>
+ <td class="colFirst"><a href="org/springframework/security/access/intercept/aopalliance/package-summary.html">org.springframework.security.access.intercept.aopalliance</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/access/prepost/package-summary.html">org.springframework.security.access.prepost</a></td>
+ <td class="colFirst"><a href="org/springframework/security/access/method/package-summary.html">org.springframework.security.access.method</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/security/access/vote/package-summary.html">org.springframework.security.access.vote</a></td>
+ <td class="colFirst"><a href="org/springframework/security/access/prepost/package-summary.html">org.springframework.security.access.prepost</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/acls/package-summary.html">org.springframework.security.acls</a></td>
+ <td class="colFirst"><a href="org/springframework/security/access/vote/package-summary.html">org.springframework.security.access.vote</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/security/acls/afterinvocation/package-summary.html">org.springframework.security.acls.afterinvocation</a></td>
+ <td class="colFirst"><a href="org/springframework/security/acls/package-summary.html">org.springframework.security.acls</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/config/http/package-summary.html">org.springframework.security.config.http</a></td>
+ <td class="colFirst"><a href="org/springframework/security/acls/afterinvocation/package-summary.html">org.springframework.security.acls.afterinvocation</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/security/web/package-summary.html">org.springframework.security.web</a></td>
+ <td class="colFirst"><a href="org/springframework/security/config/http/package-summary.html">org.springframework.security.config.http</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/web/access/package-summary.html">org.springframework.security.web.access</a></td>
+ <td class="colFirst"><a href="org/springframework/security/web/package-summary.html">org.springframework.security.web</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/security/web/access/channel/package-summary.html">org.springframework.security.web.access.channel</a></td>
+ <td class="colFirst"><a href="org/springframework/security/web/access/package-summary.html">org.springframework.security.web.access</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/web/access/expression/package-summary.html">org.springframework.security.web.access.expression</a></td>
+ <td class="colFirst"><a href="org/springframework/security/web/access/channel/package-summary.html">org.springframework.security.web.access.channel</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="org/springframework/security/web/access/intercept/package-summary.html">org.springframework.security.web.access.intercept</a></td>
+ <td class="colFirst"><a href="org/springframework/security/web/access/expression/package-summary.html">org.springframework.security.web.access.expression</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
- <td class="colFirst"><a href="org/springframework/security/web/util/matcher/package-summary.html">org.springframework.security.web.util.matcher</a></td>
+ <td class="colFirst"><a href="org/springframework/security/web/access/intercept/package-summary.html">org.springframework.security.web.access.intercept</a></td>
<td class="colLast"> </td>
</tr>
<tr class="altColor">
- <td class="colFirst"><a href="quartz/package-summary.html">quartz</a></td>
+ <td class="colFirst"><a href="org/springframework/security/web/util/matcher/package-summary.html">org.springframework.security.web.util.matcher</a></td>
<td class="colLast"> </td>
</tr>
<tr class="rowColor">
+ <td class="colFirst"><a href="quartz/package-summary.html">quartz</a></td>
+ <td class="colLast"> </td>
+</tr>
+
+
+<tr class="altColor">
<td class="colFirst"><a href="redis/package-summary.html">redis</a></td>
<td class="colLast"> </td>
</tr>
diff --git a/docs/snapshot/api/package-list b/docs/snapshot/api/package-list
index 1cd4414e01a..a5fc810ad25 100644
--- a/docs/snapshot/api/package-list
+++ b/docs/snapshot/api/package-list
@@ -567,6 +567,7 @@ org.grails.gradle.plugin.model
org.grails.gradle.plugin.profiles
org.grails.gradle.plugin.profiles.tasks
org.grails.gradle.plugin.run
+org.grails.gradle.plugin.scaffolding
org.grails.gradle.plugin.util
org.grails.gradle.plugin.views
org.grails.gradle.plugin.views.gsp
diff --git a/docs/snapshot/grails-data/developer-manual/gettingStarted.html b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
index 252586f1761..f0d22c96661 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 6956fd16b18..68eb2688597 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 90313761be0..f7a4920912d 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 9a2993ebcb4..f43ddeb7eb6 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 c3456e41314..434c0344dd7 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 4737f358992..e7708126e9e 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 46486989604..46d769d996b 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 55670d4d08d..fc98f409ceb 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 093d3b4b2e4..9970b5022db 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 d5a3cc93f49..b42c5e78c7f 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 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 ce9bd9a38b8..4174eda2918 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/mongodb/manual/gettingStarted/embeddedMongo.html b/docs/snapshot/grails-data/mongodb/manual/gettingStarted/embeddedMongo.html
index ecf1ad33688..a245b5f5a5d 100644
--- a/docs/snapshot/grails-data/mongodb/manual/gettingStarted/embeddedMongo.html
+++ b/docs/snapshot/grails-data/mongodb/manual/gettingStarted/embeddedMongo.html
@@ -601,6 +601,11 @@ this; the <code>in-memory</code> backend reports an error rather than discarding
<td class="tableblock halign-left valign-top"><p class="tableblock">The MongoDB version for backends that can choose one, such as <code>V8_0</code> for flapdoodle.</p></td>
</tr>
<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>embedded.mongodb.replica-set</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the replica set to run as, such as <code>rs0</code>. Unset, the server is standalone
+unless <code>grails.mongodb.transactional</code> is <code>true</code>, which asks for one implicitly.</p></td>
+</tr>
+<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>embedded.mongodb.property-names</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Comma separated properties that may name an embedded server. Defaults to
<code>grails.mongodb.url</code>.</p></td>
@@ -609,6 +614,55 @@ this; the <code>in-memory</code> backend reports an error rather than discarding
</table>
</div>
<div class="sect3">
+<h4 id="_transactions">Transactions</h4>
+<div class="paragraph">
+<p>A multi-document transaction, a change stream and a causally consistent read are all refused
+by a standalone MongoDB server: every one of them needs a replica set. An application that
+asks GORM for transactions is therefore given one - a set of a single node, which is what a
+single machine has to offer, and enough for all three:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-yaml" data-lang="yaml">grails:
+ mongodb:
+ url: mongodb://embedded/bookstore
+ transactional: true</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The server runs as the replica set <code>rs0</code> and is handed to the application only once it has
+elected itself primary, so the first query does not race the election. Name the set with
+<code>embedded.mongodb.replica-set</code> to call it something else, or to run one without asking GORM
+for transactions:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="highlight"><code class="language-yaml" data-lang="yaml">embedded:
+ mongodb:
+ replica-set: rs0</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Only the flapdoodle backend can do this, because only a real <code>mongod</code> has replication. The
+<code>in-memory</code> backend reimplements the wire protocol and refuses transactions whatever it is
+configured with.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+A replica set is initiated by a command a driver sends rather than by a setting, so
+<code>org.mongodb:mongodb-driver-sync</code> has to be on the classpath. Any application talking to
+MongoDB already has it; a standalone embedded server does not need it.
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect3">
<h4 id="_production">Production</h4>
<div class="paragraph">
<p>A generated application names a real host in production, so nothing is started there.</p>
@@ -637,7 +691,14 @@ environment’s url and use flapdoodle with a directory, so the data survive
<p>A server started by this module runs until the JVM exits, so a Spring Boot DevTools
restart reuses it instead of starting another. Only a server this module started is
reused: if anything else is already holding the port, startup fails with an error naming
-the port rather than connecting to an unrelated service. To use a MongoDB started by hand,
+the port rather than connecting to an unrelated service.</p>
+</div>
+<div class="paragraph">
+<p>A restart that carries a different setting - a database directory, a version, a replica set,
+or transactions being switched on - is given a server that matches it, which means the
+previous one is replaced and anything it held in memory goes with it. Data in a
+<code>database-dir</code> outlives the replacement, except across a change of <code>version</code>: MongoDB
+refuses to start against a directory written by a different release. To use a MongoDB started by hand,
name its host in <code>grails.mongodb.url</code> as usual.</p>
</div>
</div>
diff --git a/docs/snapshot/grails-data/mongodb/manual/index.html b/docs/snapshot/grails-data/mongodb/manual/index.html
index 2d33342dcc4..ad8318839b5 100644
--- a/docs/snapshot/grails-data/mongodb/manual/index.html
+++ b/docs/snapshot/grails-data/mongodb/manual/index.html
@@ -1499,6 +1499,11 @@ this; the <code>in-memory</code> backend reports an error rather than discarding
<td class="tableblock halign-left valign-top"><p class="tableblock">The MongoDB version for backends that can choose one, such as <code>V8_0</code> for flapdoodle.</p></td>
</tr>
<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>embedded.mongodb.replica-set</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">The name of the replica set to run as, such as <code>rs0</code>. Unset, the server is standalone
+unless <code>grails.mongodb.transactional</code> is <code>true</code>, which asks for one implicitly.</p></td>
+</tr>
+<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>embedded.mongodb.property-names</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">Comma separated properties that may name an embedded server. Defaults to
<code>grails.mongodb.url</code>.</p></td>
@@ -1507,6 +1512,55 @@ this; the <code>in-memory</code> backend reports an error rather than discarding
</table>
</div>
<div class="sect3">
+<h4 id="_transactions">Transactions</h4>
+<div class="paragraph">
+<p>A multi-document transaction, a change stream and a causally consistent read are all refused
+by a standalone MongoDB server: every one of them needs a replica set. An application that
+asks GORM for transactions is therefore given one - a set of a single node, which is what a
+single machine has to offer, and enough for all three:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">grails</span>:
+ <span class="key">mongodb</span>:
+ <span class="key">url</span>: <span class="string"><span class="content">mongodb://embedded/bookstore</span></span>
+ <span class="key">transactional</span>: <span class="string"><span class="content">true</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The server runs as the replica set <code>rs0</code> and is handed to the application only once it has
+elected itself primary, so the first query does not race the election. Name the set with
+<code>embedded.mongodb.replica-set</code> to call it something else, or to run one without asking GORM
+for transactions:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">embedded</span>:
+ <span class="key">mongodb</span>:
+ <span class="key">replica-set</span>: <span class="string"><span class="content">rs0</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Only the flapdoodle backend can do this, because only a real <code>mongod</code> has replication. The
+<code>in-memory</code> backend reimplements the wire protocol and refuses transactions whatever it is
+configured with.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+A replica set is initiated by a command a driver sends rather than by a setting, so
+<code>org.mongodb:mongodb-driver-sync</code> has to be on the classpath. Any application talking to
+MongoDB already has it; a standalone embedded server does not need it.
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect3">
<h4 id="_production">Production</h4>
<div class="paragraph">
<p>A generated application names a real host in production, so nothing is started there.</p>
@@ -1535,7 +1589,14 @@ environment’s url and use flapdoodle with a directory, so the data survive
<p>A server started by this module runs until the JVM exits, so a Spring Boot DevTools
restart reuses it instead of starting another. Only a server this module started is
reused: if anything else is already holding the port, startup fails with an error naming
-the port rather than connecting to an unrelated service. To use a MongoDB started by hand,
+the port rather than connecting to an unrelated service.</p>
+</div>
+<div class="paragraph">
+<p>A restart that carries a different setting - a database directory, a version, a replica set,
+or transactions being switched on - is given a server that matches it, which means the
+previous one is replaced and anything it held in memory goes with it. Data in a
+<code>database-dir</code> outlives the replacement, except across a change of <code>version</code>: MongoDB
+refuses to start against a directory written by a different release. To use a MongoDB started by hand,
name its host in <code>grails.mongodb.url</code> as usual.</p>
</div>
</div>
diff --git a/docs/snapshot/grails-data/whats-new-manual/index.html b/docs/snapshot/grails-data/whats-new-manual/index.html
index 8414ed8c15b..6e426433056 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-08-23 08:04:43 UTC
+Last updated 2026-08-25 07:31:08 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/guide/index.html b/docs/snapshot/guide/index.html
index ed6b4f6eaeb..01bc8de4a9e 100644
--- a/docs/snapshot/guide/index.html
+++ b/docs/snapshot/guide/index.html
@@ -370,31 +370,33 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#viewsAndTemplates"><strong>8.2.3</strong><span>Views and Templates</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#layouts"><strong>8.2.4</strong><span>Layouts</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#gspStaticCompilation"><strong>8.2.4</strong><span>Static Compilation</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#contentBlocks"><strong>8.2.4.1</strong><span>Content Blocks</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#layouts"><strong>8.2.5</strong><span>Layouts</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#resources"><strong>8.2.5</strong><span>Static Resources</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#contentBlocks"><strong>8.2.5.1</strong><span>Content Blocks</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#makingChangesToADeployedApplication"><strong>8.2.6</strong><span>Making Changes to a Deployed Application</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#resources"><strong>8.2.6</strong><span>Static Resources</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#taglibs"><strong>8.2.7</strong><span>Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#makingChangesToADeployedApplication"><strong>8.2.7</strong><span>Making Changes to a Deployed Application</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#taglibVariablesAndScopes"><strong>8.2.7.1</strong><span>Variables and Scopes</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="../guide/theWebLayer.html#taglibs"><strong>8.2.8</strong><span>Tag Libraries</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#simpleTags"><strong>8.2.7.2</strong><span>Simple Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#taglibVariablesAndScopes"><strong>8.2.8.1</strong><span>Variables and Scopes</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#logicalTags"><strong>8.2.7.3</strong><span>Logical Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#simpleTags"><strong>8.2.8.2</strong><span>Simple Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#iterativeTags"><strong>8.2.7.4</strong><span>Iterative Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#logicalTags"><strong>8.2.8.3</strong><span>Logical Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#namespaces"><strong>8.2.7.5</strong><span>Tag Namespaces</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#iterativeTags"><strong>8.2.8.4</strong><span>Iterative Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#compiledTags"><strong>8.2.7.6</strong><span>Compiled Tag Resolution</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#namespaces"><strong>8.2.8.5</strong><span>Tag Namespaces</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#usingJSPTagLibraries"><strong>8.2.7.7</strong><span>Using JSP Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#compiledTags"><strong>8.2.8.6</strong><span>Compiled Tag Resolution</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#tagReturnValue"><strong>8.2.7.8</strong><span>Tag return value</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#usingJSPTagLibraries"><strong>8.2.8.7</strong><span>Using JSP Tag Libraries</span></a></div>
+
+ <div class="toc-item" style="margin-left:30px"><a href="../guide/theWebLayer.html#tagReturnValue"><strong>8.2.8.8</strong><span>Tag return value</span></a></div>
<div class="toc-item" style="margin-left:10px"><a href="../guide/theWebLayer.html#fields"><strong>8.3</strong><span>Fields Plugin</span></a></div>
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index 0f7650148e3..4e5c9dd610a 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -144,7 +144,7 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="project">
<h1>The Grails Framework</h1>
<p><strong>Authors:</strong> The Apache Grails Team</p>
- <p><strong>Version:</strong> <span style='display:inline-block;'><select onChange='window.document.location.href=this.options[this.selectedIndex].value;'><option selected='selected' value='https://grails.apache.org/docs/snapshot/guide/single.html'>SNAPSHOT</option><option value='https://grails.apache.org/docs/8.0.0-M6/guide/single.html'>8.0.0-M6</option><option value='https://grails.apache.org/docs/8.0.0-M5/guide/single.html'>8.0.0-M5</option><option valu [...]
+ <p><strong>Version:</strong> <span style='display:inline-block;'><select onChange='window.document.location.href=this.options[this.selectedIndex].value;'><option selected='selected' value='https://grails.apache.org/docs/snapshot/guide/single.html'>SNAPSHOT</option><option value='https://grails.apache.org/docs/8.0.0-M6/guide/single.html'>8.0.0-M6</option><option value='https://grails.apache.org/docs/8.0.0-M5/guide/single.html'>8.0.0-M5</option><option valu [...]
</div>
@@ -370,31 +370,33 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="toc-item" style="margin-left:20px"><a href="#viewsAndTemplates"><strong>8.2.3</strong><span>Views and Templates</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="#layouts"><strong>8.2.4</strong><span>Layouts</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="#gspStaticCompilation"><strong>8.2.4</strong><span>Static Compilation</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#contentBlocks"><strong>8.2.4.1</strong><span>Content Blocks</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="#layouts"><strong>8.2.5</strong><span>Layouts</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="#resources"><strong>8.2.5</strong><span>Static Resources</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#contentBlocks"><strong>8.2.5.1</strong><span>Content Blocks</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="#makingChangesToADeployedApplication"><strong>8.2.6</strong><span>Making Changes to a Deployed Application</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="#resources"><strong>8.2.6</strong><span>Static Resources</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="#taglibs"><strong>8.2.7</strong><span>Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="#makingChangesToADeployedApplication"><strong>8.2.7</strong><span>Making Changes to a Deployed Application</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#taglibVariablesAndScopes"><strong>8.2.7.1</strong><span>Variables and Scopes</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="#taglibs"><strong>8.2.8</strong><span>Tag Libraries</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#simpleTags"><strong>8.2.7.2</strong><span>Simple Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#taglibVariablesAndScopes"><strong>8.2.8.1</strong><span>Variables and Scopes</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#logicalTags"><strong>8.2.7.3</strong><span>Logical Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#simpleTags"><strong>8.2.8.2</strong><span>Simple Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#iterativeTags"><strong>8.2.7.4</strong><span>Iterative Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#logicalTags"><strong>8.2.8.3</strong><span>Logical Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#namespaces"><strong>8.2.7.5</strong><span>Tag Namespaces</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#iterativeTags"><strong>8.2.8.4</strong><span>Iterative Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#compiledTags"><strong>8.2.7.6</strong><span>Compiled Tag Resolution</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#namespaces"><strong>8.2.8.5</strong><span>Tag Namespaces</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#usingJSPTagLibraries"><strong>8.2.7.7</strong><span>Using JSP Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#compiledTags"><strong>8.2.8.6</strong><span>Compiled Tag Resolution</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="#tagReturnValue"><strong>8.2.7.8</strong><span>Tag return value</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="#usingJSPTagLibraries"><strong>8.2.8.7</strong><span>Using JSP Tag Libraries</span></a></div>
+
+ <div class="toc-item" style="margin-left:30px"><a href="#tagReturnValue"><strong>8.2.8.8</strong><span>Tag return value</span></a></div>
<div class="toc-item" style="margin-left:10px"><a href="#fields"><strong>8.3</strong><span>Fields Plugin</span></a></div>
@@ -22240,8 +22242,332 @@ The section on <a href="#taglibs">Tag Libraries</a> covers how to add your own c
</div>
</div>
+
+<h2 id="gspStaticCompilation">8.2.4 Static Compilation</h2>
+
+<div class='contribute-btn'>
+ <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/gspStaticCompilation.adoc"'>
+ <i class='fa fa-pencil-square-o'></i> Improve this doc
+ </button>
+</div>
+
+
+<div class="paragraph">
+<p>GSP pages are compiled dynamically by default. A page can instead be statically compiled, so that expressions and scriptlets in the page are type checked at compile time and dispatched without dynamic lookup at render time.</p>
+</div>
+<div class="paragraph">
+<p>Static compilation is enabled per page with the <code>compileStatic</code> page directive:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_declaring_the_model">Declaring the Model</h4>
+<div class="paragraph">
+<p>A page can state what it is rendered with, using the <code>model</code> page directive, which names and types each variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page model="Book book" %<span class="error">></span>
+<span class="tag"><h1></span>${book.title}<span class="tag"></h1></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Separate multiple declarations with semicolons, or use a multi-line value:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page model="Book book; List<span class="tag"><Review></span> reviews" %<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Because a declared model is what makes a page type checkable, the <code>model</code> directive enables static compilation on its own — <code>compileStatic="true"</code> is implied and does not need to be given as well.</p>
+</div>
+<div class="paragraph">
+<p>Declaring a model also states that the model is complete, so reading any name outside it is reported rather than left to the render:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>The variable [publisher] is undeclared.</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A page that declares no model has stated nothing, and reads what it is rendered with exactly as a dynamically compiled page does. This is what makes static compilation adoptable for views that were never written with it in mind: what the page does say is checked, and what it does not say still works.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_names_supplied_by_the_framework">Names Supplied by the Framework</h4>
+<div class="paragraph">
+<p>The names bound into every page do not need to be declared. Most carry their real types and are checked like anything else:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span>
+<span class="tag"><g:if</span> <span class="attribute-name">test</span>=<span class="string"><span class="delimiter">"</span><span class="content">${params.id}</span><span class="delimiter">"</span></span><span class="tag">></span>${request.contextPath} for ${controllerName}/${actionName}<span class="tag"></g:if></span></code></pre>
+</div>
+</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">Name</th>
+<th class="tableblock halign-left valign-top">Type</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://grails.apache.org/docs/8.0.0-SNAPSHOT/api/grails/util/TypeConvertingMap.html">TypeConvertingMap</a>, so <code>params.id</code> and <code>params.int('max')</code> both resolve</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>flash</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://grails.apache.org/docs/8.0.0-SNAPSHOT/api/grails/web/mvc/FlashScope.html">FlashScope</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request</code>, <code>response</code>, <code>session</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>HttpServletRequest</code>, <code>HttpServletResponse</code>, <code>HttpSession</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>application</code>, <code>servletContext</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ServletContext</code> — the same object under both names</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>webRequest</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>GrailsWebRequest</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>controllerName</code>, <code>actionName</code>, <code>namespace</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Being typed, they are checked: <code>${request.contextPathTypo}</code> is a compilation error. The typed attribute converters described in <a href="theWebLayer.html#typeConverters">Simple Type Converters</a> resolve on them for the same reason.</p>
+</div>
+<div class="paragraph">
+<p><code>grailsApplication</code> and <code>applicationContext</code> are the exception and are resolved dynamically. What pages read from them is answered at runtime rather than declared — <code>grailsApplication.controllerClasses</code> is matched against the artefact types an application happens to have, which no type can enumerate — so they are read the way a dynamically compiled page reads them.</p>
+</div>
+<div class="paragraph">
+<p>A page may still declare a model variable using one of these names, and the declared type then applies for that page — declaring <code>Map params</code> gives the page a <code>Map</code>, with no other type imposed on it.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_names_a_page_introduces">Names a Page Introduces</h4>
+<div class="paragraph">
+<p>A page introduces names of its own through the <code>var</code> and <code>status</code> attributes of the tags it calls, and those do not need declaring either:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span>
+<span class="tag"><g:set</span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">total</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">${books.size()}</span><span class="delimiter">"</span></span><span class="tag">/></span>
+<span class="tag"><g:each</span> <span class="attribute-name">in</span>=<span class="string"><span class="delimiter">"</span><span class="content">${books}</span><span class="delimiter">"</span></span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">book</span><span class="delimiter">"</span></span> <span class="attribute-name">status</span>=<span class="string"><span class="delimiter">"</span> [...]
+Total: ${total}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>What such a name holds is decided by the tag when the page renders, so it is read dynamically rather than reported. Reading a member from it is fine; applying an operator to it is not, because nothing established what it holds:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml">Total: ${total + 1}</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>The type of [total] is not known here, and an operator cannot be applied to it.</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Giving the name a type answers that, and the value is converted to it:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><g:set</span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">int</span><span class="delimiter">"</span></span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">total</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span cla [...]
+Total: ${total + 1}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><code>type</code> declares a local of that type and still writes the name into the page scope, so anything reading it afterwards is unaffected. It is only meaningful alongside <code>value</code>: a tag given a body or a <code>bean</code> produces its value as it runs, so there is nothing to declare from, and combining them is an error.</p>
+</div>
+<div class="paragraph">
+<p>Where the name is only read by the page itself, <code><g:def></code> declares it without the scope write:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><g:def</span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">int</span><span class="delimiter">"</span></span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">total</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span cla [...]
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_requiring_every_page_to_declare_what_it_reads">Requiring Every Page to Declare What It Reads</h4>
+<div class="paragraph">
+<p>Reporting a name a page never declared can be asked for everywhere, rather than only in the pages that declare a model:</p>
+</div>
+<div class="listingblock">
+<div class="title">grails-app/conf/application.yml</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">grails</span>:
+ <span class="key">views</span>:
+ <span class="key">gsp</span>:
+ <span class="key">compileStatic</span>: <span class="string"><span class="content">true</span></span>
+ <span class="key">compileStaticConfig</span>:
+ <span class="key">strict</span>: <span class="string"><span class="content">true</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or from the build:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ gsp = <span class="predefined-constant">true</span>
+ strictGsp = <span class="predefined-constant">true</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>With this on, every page is held to what it declares, which is the strongest guarantee available and the most work to adopt. Without it, only the pages that declare a model are.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_enabling_static_compilation_for_every_page">Enabling Static Compilation for Every Page</h4>
+<div class="paragraph">
+<p>Rather than adding the directive to each page, static compilation can be made the default for an entire application with the <code>grails.views.gsp.compileStatic</code> setting:</p>
+</div>
+<div class="listingblock">
+<div class="title">grails-app/conf/application.yml</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">grails</span>:
+ <span class="key">views</span>:
+ <span class="key">gsp</span>:
+ <span class="key">compileStatic</span>: <span class="string"><span class="content">true</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The setting applies both to pages precompiled by the build and to pages compiled on the fly while the application runs in development mode, so a page behaves the same way in both.</p>
+</div>
+<div class="paragraph">
+<p>The same thing can be asked for from the build instead, which is useful where a project prefers to keep build options together:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ gsp = <span class="predefined-constant">true</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This states the same <code>grails.views.gsp.compileStatic</code> setting, for both the pages the build compiles ahead of time and the application it runs, so a page compiles the same way in either. Where the build states it, it takes precedence over <code>application.yml</code> — the same order a system property takes over configuration in a running application. Set it in one place or the other rather than both.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<code>gsp</code> is not included in the <code>compileStatic { all = true }</code> shortcut described in <a href="staticTypeCheckingAndCompilation.html#grailsCompileStatic">GrailsCompileStatic</a>. The artefact opt-ins there fail on code that is doubtful anyway, whereas this one reports an operator applied to a value whose type nothing established, which most applications that never declared a page model have somewhere, so it is never enabled as a side effect of asking for everything.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>An individual page always wins over either, and can opt back out:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="false" %<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>Enabling this for an existing application is not entirely transparent. A page that reads a model variable it has not declared still compiles — it reads it the way a dynamically compiled page does — but two things are reported that were not before, and <code>compileStatic="false"</code> turns a page back off while it is dealt with.</p>
+</div>
+<div class="paragraph">
+<p>The first accounts for most of the work: an operator applied to a value whose type nothing established, such as <code>${a + b}</code> or <code>${rows[0]}</code>, is reported whether or not strictness is on. Declare the value in the <code>model</code> directive, or give it a type where the page introduces it.</p>
+</div>
+<div class="paragraph">
+<p>A model variable sharing a name with one the framework supplies — <code>params</code>, <code>request</code>, <code>response</code>, <code>session</code>, <code>application</code>, <code>servletContext</code>, <code>flash</code>, <code>webRequest</code>, <code>controllerName</code>, <code>actionName</code> or <code>namespace</code> — is no longer read as the model supplied it: the page reads it with the type the framework value has. Reading a member [...]
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_tag_libraries">Tag Libraries</h4>
+<div class="paragraph">
+<p>Tags are dispatched dynamically even in a statically compiled page, but only for namespaces the page knows about. The <code>g</code>, <code>tmpl</code>, <code>f</code>, <code>asset</code> and <code>plugin</code> namespaces are allowed by default:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span>
+${g.message(code: 'book.list.title')}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A tag library compiled ahead of the page needs no declaration either: <a href="../guide/theWebLayer.html#compiledTags">the tag library index</a> states which namespaces exist, and every namespace on the compile classpath is allowed from it. What still needs declaring is a namespace filled in while the application runs — one registered at runtime, or contributed by a plugin built before descriptors existed — since nothing describes it when the page i [...]
+</div>
+<div class="paragraph">
+<p>Such a namespace is otherwise treated as an undeclared variable, which is reported in a page held to the names it declares and resolved dynamically in one that is not. Declare the extra namespaces for a single page with the <code>taglibs</code> page directive:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" taglibs="myns, othertags" %<span class="error">></span>
+${myns.formatPrice(value: book.price)}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or for every page with the <code>grails.views.gsp.compileStaticConfig.taglibs</code> setting, given either as a list or as a comma separated string:</p>
+</div>
+<div class="listingblock">
+<div class="title">grails-app/conf/application.yml</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">grails</span>:
+ <span class="key">views</span>:
+ <span class="key">gsp</span>:
+ <span class="key">compileStaticConfig</span>:
+ <span class="key">taglibs</span>:
+ - <span class="string"><span class="content">myns</span></span>
+ - <span class="string"><span class="content">othertags</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The declared namespaces are added to the defaults rather than replacing them.</p>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+The other opt-ins in the <code>grails { compileStatic { } }</code> block described in <a href="staticTypeCheckingAndCompilation.html#grailsCompileStatic">GrailsCompileStatic</a> apply to controllers, services and tag library classes. <code>gsp</code> applies to pages, and is the one opt-in there that <code>all = true</code> does not include.
+</td>
+</tr>
+</table>
+</div>
+</div>
+
<a name="7.2.4 Layouts"><!-- Legacy link --></a>
-<h2 id="layouts">8.2.4 Layouts</h2>
+<h2 id="layouts">8.2.5 Layouts</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/layouts.adoc"'>
@@ -22487,7 +22813,7 @@ The content to apply a layout to
</div>
<a name="7.2.6 Content Blocks"><!-- Legacy link --></a>
-<h2 id="contentBlocks">8.2.4.1 Content Blocks</h2>
+<h2 id="contentBlocks">8.2.5.1 Content Blocks</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/contentBlocks.adoc"'>
@@ -22551,7 +22877,7 @@ The content to apply a layout to
</div>
<a name="7.2.5 Static Resources"><!-- Legacy link --></a>
-<h2 id="resources">8.2.5 Static Resources</h2>
+<h2 id="resources">8.2.6 Static Resources</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/resources.adoc"'>
@@ -22615,7 +22941,7 @@ To have them be cached by the browser, you can set the configuration setting <co
</div>
<a name="7.2.7 Making Changes to a Deployed Application"><!-- Legacy link --></a>
-<h2 id="makingChangesToADeployedApplication">8.2.6 Making Changes to a Deployed Application</h2>
+<h2 id="makingChangesToADeployedApplication">8.2.7 Making Changes to a Deployed Application</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/makingChangesToADeployedApplication.adoc"'>
@@ -22707,7 +23033,7 @@ cp -R grails-app/views/* /var/www/grails/my-app/grails-app/views</pre>
</div>
<a name="7.3 Tag Libraries"><!-- Legacy link --></a>
-<h2 id="taglibs">8.2.7 Tag Libraries</h2>
+<h2 id="taglibs">8.2.8 Tag Libraries</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/taglibs.adoc"'>
@@ -22880,7 +23206,7 @@ To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr<
</div>
<a name="7.3.1 Variables and Scopes"><!-- Legacy link --></a>
-<h2 id="taglibVariablesAndScopes">8.2.7.1 Variables and Scopes</h2>
+<h2 id="taglibVariablesAndScopes">8.2.8.1 Variables and Scopes</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/taglibVariablesAndScopes.adoc"'>
@@ -22934,7 +23260,7 @@ To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr<
</div>
<a name="7.3.2 Simple Tags"><!-- Legacy link --></a>
-<h2 id="simpleTags">8.2.7.2 Simple Tags</h2>
+<h2 id="simpleTags">8.2.8.2 Simple Tags</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/simpleTags.adoc"'>
@@ -23001,7 +23327,7 @@ To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr<
</div>
<a name="7.3.3 Logical Tags"><!-- Legacy link --></a>
-<h2 id="logicalTags">8.2.7.3 Logical Tags</h2>
+<h2 id="logicalTags">8.2.8.3 Logical Tags</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/logicalTags.adoc"'>
@@ -23035,7 +23361,7 @@ To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr<
</div>
<a name="7.3.4 Iterative Tags"><!-- Legacy link --></a>
-<h2 id="iterativeTags">8.2.7.4 Iterative Tags</h2>
+<h2 id="iterativeTags">8.2.8.4 Iterative Tags</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/iterativeTags.adoc"'>
@@ -23122,7 +23448,7 @@ Note the usage of the parenthesis around the variable name. If you omit these Gr
</div>
<a name="7.3.5 Tag Namespaces"><!-- Legacy link --></a>
-<h2 id="namespaces">8.2.7.5 Tag Namespaces</h2>
+<h2 id="namespaces">8.2.8.5 Tag Namespaces</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/namespaces.adoc"'>
@@ -23169,7 +23495,7 @@ Note the usage of the parenthesis around the variable name. If you omit these Gr
</div>
-<h2 id="compiledTags">8.2.7.6 Compiled Tag Resolution</h2>
+<h2 id="compiledTags">8.2.8.6 Compiled Tag Resolution</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/compiledTags.adoc"'>
@@ -23521,7 +23847,7 @@ not have this problem: the task rewrites the index from the sources each time it
</div>
<a name="7.3.6 Using JSP Tag Libraries"><!-- Legacy link --></a>
-<h2 id="usingJSPTagLibraries">8.2.7.7 Using JSP Tag Libraries</h2>
+<h2 id="usingJSPTagLibraries">8.2.8.7 Using JSP Tag Libraries</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/usingJSPTagLibraries.adoc"'>
@@ -23599,7 +23925,7 @@ This is configured with the <code>grails.gsp.tldScanPattern</code> setting. It a
</div>
<a name="7.3.7 Tag return value"><!-- Legacy link --></a>
-<h2 id="tagReturnValue">8.2.7.8 Tag return value</h2>
+<h2 id="tagReturnValue">8.2.8.8 Tag return value</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/tagReturnValue.adoc"'>
@@ -35350,6 +35676,34 @@ If you need to opt a single method out of static compilation, use <code>@GrailsC
</div>
</div>
<div class="paragraph">
+<p><code>all</code> is what an artefact type falls back to where it states nothing of its own. An artefact type that states a value keeps it, so a single type can be held back from the shortcut:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ all = <span class="predefined-constant">true</span>
+ services = <span class="predefined-constant">false</span> <span class="comment">// every artefact type except services</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>GSP pages have an opt-in in the same block, <code>gsp</code>, documented under <a href="theWebLayer.html#gspStaticCompilation">Static Compilation</a> for Groovy Server Pages. It is deliberately not covered by <code>all</code> and has to be asked for on its own:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ all = <span class="predefined-constant">true</span> <span class="comment">// controllers, services and tag libraries</span>
+ gsp = <span class="predefined-constant">true</span> <span class="comment">// and pages, which `all` does not include</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
<p>When an opt-in is enabled, every matching artefact is compiled exactly as if it were annotated with <code>@GrailsCompileStatic</code>, including the Grails-specific dispatch that the annotation already permits — dynamic finders, constraints and mapping DSLs, and tag library calls in both controllers and tag libraries.</p>
</div>
<div class="admonitionblock note">
diff --git a/docs/snapshot/guide/staticTypeCheckingAndCompilation.html b/docs/snapshot/guide/staticTypeCheckingAndCompilation.html
index 587b3275b58..98fd92269c4 100644
--- a/docs/snapshot/guide/staticTypeCheckingAndCompilation.html
+++ b/docs/snapshot/guide/staticTypeCheckingAndCompilation.html
@@ -391,6 +391,34 @@ If you need to opt a single method out of static compilation, use <code>@GrailsC
</div>
</div>
<div class="paragraph">
+<p><code>all</code> is what an artefact type falls back to where it states nothing of its own. An artefact type that states a value keeps it, so a single type can be held back from the shortcut:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ all = <span class="predefined-constant">true</span>
+ services = <span class="predefined-constant">false</span> <span class="comment">// every artefact type except services</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>GSP pages have an opt-in in the same block, <code>gsp</code>, documented under <a href="theWebLayer.html#gspStaticCompilation">Static Compilation</a> for Groovy Server Pages. It is deliberately not covered by <code>all</code> and has to be asked for on its own:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ all = <span class="predefined-constant">true</span> <span class="comment">// controllers, services and tag libraries</span>
+ gsp = <span class="predefined-constant">true</span> <span class="comment">// and pages, which `all` does not include</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
<p>When an opt-in is enabled, every matching artefact is compiled exactly as if it were annotated with <code>@GrailsCompileStatic</code>, including the Grails-specific dispatch that the annotation already permits — dynamic finders, constraints and mapping DSLs, and tag library calls in both controllers and tag libraries.</p>
</div>
<div class="admonitionblock note">
diff --git a/docs/snapshot/guide/theWebLayer.html b/docs/snapshot/guide/theWebLayer.html
index 23fdca9d27e..e32a08b980b 100644
--- a/docs/snapshot/guide/theWebLayer.html
+++ b/docs/snapshot/guide/theWebLayer.html
@@ -272,43 +272,46 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="toc-item" style="margin-left:10px"><a href="#viewsAndTemplates"><strong>8.2.3</strong><span>Views and Templates</span></a>
</div>
- <div class="toc-item" style="margin-left:10px"><a href="#layouts"><strong>8.2.4</strong><span>Layouts</span></a>
+ <div class="toc-item" style="margin-left:10px"><a href="#gspStaticCompilation"><strong>8.2.4</strong><span>Static Compilation</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#contentBlocks"><strong>8.2.4.1</strong><span>Content Blocks</span></a>
+ <div class="toc-item" style="margin-left:10px"><a href="#layouts"><strong>8.2.5</strong><span>Layouts</span></a>
</div>
- <div class="toc-item" style="margin-left:10px"><a href="#resources"><strong>8.2.5</strong><span>Static Resources</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#contentBlocks"><strong>8.2.5.1</strong><span>Content Blocks</span></a>
</div>
- <div class="toc-item" style="margin-left:10px"><a href="#makingChangesToADeployedApplication"><strong>8.2.6</strong><span>Making Changes to a Deployed Application</span></a>
+ <div class="toc-item" style="margin-left:10px"><a href="#resources"><strong>8.2.6</strong><span>Static Resources</span></a>
</div>
- <div class="toc-item" style="margin-left:10px"><a href="#taglibs"><strong>8.2.7</strong><span>Tag Libraries</span></a>
+ <div class="toc-item" style="margin-left:10px"><a href="#makingChangesToADeployedApplication"><strong>8.2.7</strong><span>Making Changes to a Deployed Application</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#taglibVariablesAndScopes"><strong>8.2.7.1</strong><span>Variables and Scopes</span></a>
+ <div class="toc-item" style="margin-left:10px"><a href="#taglibs"><strong>8.2.8</strong><span>Tag Libraries</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#simpleTags"><strong>8.2.7.2</strong><span>Simple Tags</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#taglibVariablesAndScopes"><strong>8.2.8.1</strong><span>Variables and Scopes</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#logicalTags"><strong>8.2.7.3</strong><span>Logical Tags</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#simpleTags"><strong>8.2.8.2</strong><span>Simple Tags</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#iterativeTags"><strong>8.2.7.4</strong><span>Iterative Tags</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#logicalTags"><strong>8.2.8.3</strong><span>Logical Tags</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#namespaces"><strong>8.2.7.5</strong><span>Tag Namespaces</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#iterativeTags"><strong>8.2.8.4</strong><span>Iterative Tags</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#compiledTags"><strong>8.2.7.6</strong><span>Compiled Tag Resolution</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#namespaces"><strong>8.2.8.5</strong><span>Tag Namespaces</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#usingJSPTagLibraries"><strong>8.2.7.7</strong><span>Using JSP Tag Libraries</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#compiledTags"><strong>8.2.8.6</strong><span>Compiled Tag Resolution</span></a>
</div>
- <div class="toc-item" style="margin-left:20px"><a href="#tagReturnValue"><strong>8.2.7.8</strong><span>Tag return value</span></a>
+ <div class="toc-item" style="margin-left:20px"><a href="#usingJSPTagLibraries"><strong>8.2.8.7</strong><span>Using JSP Tag Libraries</span></a>
+ </div>
+
+ <div class="toc-item" style="margin-left:20px"><a href="#tagReturnValue"><strong>8.2.8.8</strong><span>Tag return value</span></a>
</div>
<div class="toc-item" style="margin-left:0px"><a href="#fields"><strong>8.3</strong><span>Fields Plugin</span></a>
@@ -4336,8 +4339,332 @@ The section on <a href="#taglibs">Tag Libraries</a> covers how to add your own c
</div>
</div>
+
+<h2 id="gspStaticCompilation">8.2.4 Static Compilation</h2>
+
+<div class='contribute-btn'>
+ <button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/gspStaticCompilation.adoc"'>
+ <i class='fa fa-pencil-square-o'></i> Improve this doc
+ </button>
+</div>
+
+
+<div class="paragraph">
+<p>GSP pages are compiled dynamically by default. A page can instead be statically compiled, so that expressions and scriptlets in the page are type checked at compile time and dispatched without dynamic lookup at render time.</p>
+</div>
+<div class="paragraph">
+<p>Static compilation is enabled per page with the <code>compileStatic</code> page directive:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_declaring_the_model">Declaring the Model</h4>
+<div class="paragraph">
+<p>A page can state what it is rendered with, using the <code>model</code> page directive, which names and types each variable:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page model="Book book" %<span class="error">></span>
+<span class="tag"><h1></span>${book.title}<span class="tag"></h1></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Separate multiple declarations with semicolons, or use a multi-line value:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page model="Book book; List<span class="tag"><Review></span> reviews" %<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Because a declared model is what makes a page type checkable, the <code>model</code> directive enables static compilation on its own — <code>compileStatic="true"</code> is implied and does not need to be given as well.</p>
+</div>
+<div class="paragraph">
+<p>Declaring a model also states that the model is complete, so reading any name outside it is reported rather than left to the render:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>The variable [publisher] is undeclared.</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A page that declares no model has stated nothing, and reads what it is rendered with exactly as a dynamically compiled page does. This is what makes static compilation adoptable for views that were never written with it in mind: what the page does say is checked, and what it does not say still works.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_names_supplied_by_the_framework">Names Supplied by the Framework</h4>
+<div class="paragraph">
+<p>The names bound into every page do not need to be declared. Most carry their real types and are checked like anything else:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span>
+<span class="tag"><g:if</span> <span class="attribute-name">test</span>=<span class="string"><span class="delimiter">"</span><span class="content">${params.id}</span><span class="delimiter">"</span></span><span class="tag">></span>${request.contextPath} for ${controllerName}/${actionName}<span class="tag"></g:if></span></code></pre>
+</div>
+</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">Name</th>
+<th class="tableblock halign-left valign-top">Type</th>
+</tr>
+</thead>
+<tbody>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>params</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://grails.apache.org/docs/8.0.0-SNAPSHOT/api/grails/util/TypeConvertingMap.html">TypeConvertingMap</a>, so <code>params.id</code> and <code>params.int('max')</code> both resolve</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>flash</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><a href="https://grails.apache.org/docs/8.0.0-SNAPSHOT/api/grails/web/mvc/FlashScope.html">FlashScope</a></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>request</code>, <code>response</code>, <code>session</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>HttpServletRequest</code>, <code>HttpServletResponse</code>, <code>HttpSession</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>application</code>, <code>servletContext</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>ServletContext</code> — the same object under both names</p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>webRequest</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>GrailsWebRequest</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>controllerName</code>, <code>actionName</code>, <code>namespace</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>String</code></p></td>
+</tr>
+</tbody>
+</table>
+<div class="paragraph">
+<p>Being typed, they are checked: <code>${request.contextPathTypo}</code> is a compilation error. The typed attribute converters described in <a href="theWebLayer.html#typeConverters">Simple Type Converters</a> resolve on them for the same reason.</p>
+</div>
+<div class="paragraph">
+<p><code>grailsApplication</code> and <code>applicationContext</code> are the exception and are resolved dynamically. What pages read from them is answered at runtime rather than declared — <code>grailsApplication.controllerClasses</code> is matched against the artefact types an application happens to have, which no type can enumerate — so they are read the way a dynamically compiled page reads them.</p>
+</div>
+<div class="paragraph">
+<p>A page may still declare a model variable using one of these names, and the declared type then applies for that page — declaring <code>Map params</code> gives the page a <code>Map</code>, with no other type imposed on it.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_names_a_page_introduces">Names a Page Introduces</h4>
+<div class="paragraph">
+<p>A page introduces names of its own through the <code>var</code> and <code>status</code> attributes of the tags it calls, and those do not need declaring either:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span>
+<span class="tag"><g:set</span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">total</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span class="string"><span class="delimiter">"</span><span class="content">${books.size()}</span><span class="delimiter">"</span></span><span class="tag">/></span>
+<span class="tag"><g:each</span> <span class="attribute-name">in</span>=<span class="string"><span class="delimiter">"</span><span class="content">${books}</span><span class="delimiter">"</span></span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">book</span><span class="delimiter">"</span></span> <span class="attribute-name">status</span>=<span class="string"><span class="delimiter">"</span> [...]
+Total: ${total}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>What such a name holds is decided by the tag when the page renders, so it is read dynamically rather than reported. Reading a member from it is fine; applying an operator to it is not, because nothing established what it holds:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml">Total: ${total + 1}</code></pre>
+</div>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre>The type of [total] is not known here, and an operator cannot be applied to it.</pre>
+</div>
+</div>
+<div class="paragraph">
+<p>Giving the name a type answers that, and the value is converted to it:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><g:set</span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">int</span><span class="delimiter">"</span></span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">total</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span cla [...]
+Total: ${total + 1}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p><code>type</code> declares a local of that type and still writes the name into the page scope, so anything reading it afterwards is unaffected. It is only meaningful alongside <code>value</code>: a tag given a body or a <code>bean</code> produces its value as it runs, so there is nothing to declare from, and combining them is an error.</p>
+</div>
+<div class="paragraph">
+<p>Where the name is only read by the page itself, <code><g:def></code> declares it without the scope write:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><g:def</span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">int</span><span class="delimiter">"</span></span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">total</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span cla [...]
+</div>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_requiring_every_page_to_declare_what_it_reads">Requiring Every Page to Declare What It Reads</h4>
+<div class="paragraph">
+<p>Reporting a name a page never declared can be asked for everywhere, rather than only in the pages that declare a model:</p>
+</div>
+<div class="listingblock">
+<div class="title">grails-app/conf/application.yml</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">grails</span>:
+ <span class="key">views</span>:
+ <span class="key">gsp</span>:
+ <span class="key">compileStatic</span>: <span class="string"><span class="content">true</span></span>
+ <span class="key">compileStaticConfig</span>:
+ <span class="key">strict</span>: <span class="string"><span class="content">true</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or from the build:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ gsp = <span class="predefined-constant">true</span>
+ strictGsp = <span class="predefined-constant">true</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>With this on, every page is held to what it declares, which is the strongest guarantee available and the most work to adopt. Without it, only the pages that declare a model are.</p>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_enabling_static_compilation_for_every_page">Enabling Static Compilation for Every Page</h4>
+<div class="paragraph">
+<p>Rather than adding the directive to each page, static compilation can be made the default for an entire application with the <code>grails.views.gsp.compileStatic</code> setting:</p>
+</div>
+<div class="listingblock">
+<div class="title">grails-app/conf/application.yml</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">grails</span>:
+ <span class="key">views</span>:
+ <span class="key">gsp</span>:
+ <span class="key">compileStatic</span>: <span class="string"><span class="content">true</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The setting applies both to pages precompiled by the build and to pages compiled on the fly while the application runs in development mode, so a page behaves the same way in both.</p>
+</div>
+<div class="paragraph">
+<p>The same thing can be asked for from the build instead, which is useful where a project prefers to keep build options together:</p>
+</div>
+<div class="listingblock">
+<div class="title">build.gradle</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="groovy">grails {
+ compileStatic {
+ gsp = <span class="predefined-constant">true</span>
+ }
+}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>This states the same <code>grails.views.gsp.compileStatic</code> setting, for both the pages the build compiles ahead of time and the application it runs, so a page compiles the same way in either. Where the build states it, it takes precedence over <code>application.yml</code> — the same order a system property takes over configuration in a running application. Set it in one place or the other rather than both.</p>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<code>gsp</code> is not included in the <code>compileStatic { all = true }</code> shortcut described in <a href="staticTypeCheckingAndCompilation.html#grailsCompileStatic">GrailsCompileStatic</a>. The artefact opt-ins there fail on code that is doubtful anyway, whereas this one reports an operator applied to a value whose type nothing established, which most applications that never declared a page model have somewhere, so it is never enabled as a side effect of asking for everything.
+</td>
+</tr>
+</table>
+</div>
+<div class="paragraph">
+<p>An individual page always wins over either, and can opt back out:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="false" %<span class="error">></span></code></pre>
+</div>
+</div>
+<div class="admonitionblock note">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-note" title="Note"></i>
+</td>
+<td class="content">
+<div class="paragraph">
+<p>Enabling this for an existing application is not entirely transparent. A page that reads a model variable it has not declared still compiles — it reads it the way a dynamically compiled page does — but two things are reported that were not before, and <code>compileStatic="false"</code> turns a page back off while it is dealt with.</p>
+</div>
+<div class="paragraph">
+<p>The first accounts for most of the work: an operator applied to a value whose type nothing established, such as <code>${a + b}</code> or <code>${rows[0]}</code>, is reported whether or not strictness is on. Declare the value in the <code>model</code> directive, or give it a type where the page introduces it.</p>
+</div>
+<div class="paragraph">
+<p>A model variable sharing a name with one the framework supplies — <code>params</code>, <code>request</code>, <code>response</code>, <code>session</code>, <code>application</code>, <code>servletContext</code>, <code>flash</code>, <code>webRequest</code>, <code>controllerName</code>, <code>actionName</code> or <code>namespace</code> — is no longer read as the model supplied it: the page reads it with the type the framework value has. Reading a member [...]
+</div>
+</td>
+</tr>
+</table>
+</div>
+</div>
+<div class="sect3">
+<h4 id="_tag_libraries">Tag Libraries</h4>
+<div class="paragraph">
+<p>Tags are dispatched dynamically even in a statically compiled page, but only for namespaces the page knows about. The <code>g</code>, <code>tmpl</code>, <code>f</code>, <code>asset</code> and <code>plugin</code> namespaces are allowed by default:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" %<span class="error">></span>
+${g.message(code: 'book.list.title')}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>A tag library compiled ahead of the page needs no declaration either: <a href="../guide/theWebLayer.html#compiledTags">the tag library index</a> states which namespaces exist, and every namespace on the compile classpath is allowed from it. What still needs declaring is a namespace filled in while the application runs — one registered at runtime, or contributed by a plugin built before descriptors existed — since nothing describes it when the page i [...]
+</div>
+<div class="paragraph">
+<p>Such a namespace is otherwise treated as an undeclared variable, which is reported in a page held to the names it declares and resolved dynamically in one that is not. Declare the extra namespaces for a single page with the <code>taglibs</code> page directive:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="error"><</span>%@ page compileStatic="true" taglibs="myns, othertags" %<span class="error">></span>
+${myns.formatPrice(value: book.price)}</code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>or for every page with the <code>grails.views.gsp.compileStaticConfig.taglibs</code> setting, given either as a list or as a comma separated string:</p>
+</div>
+<div class="listingblock">
+<div class="title">grails-app/conf/application.yml</div>
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="yaml"><span class="key">grails</span>:
+ <span class="key">views</span>:
+ <span class="key">gsp</span>:
+ <span class="key">compileStaticConfig</span>:
+ <span class="key">taglibs</span>:
+ - <span class="string"><span class="content">myns</span></span>
+ - <span class="string"><span class="content">othertags</span></span></code></pre>
+</div>
+</div>
+<div class="paragraph">
+<p>The declared namespaces are added to the defaults rather than replacing them.</p>
+</div>
+<div class="admonitionblock tip">
+<table>
+<tr>
+<td class="icon">
+<i class="fa icon-tip" title="Tip"></i>
+</td>
+<td class="content">
+The other opt-ins in the <code>grails { compileStatic { } }</code> block described in <a href="staticTypeCheckingAndCompilation.html#grailsCompileStatic">GrailsCompileStatic</a> apply to controllers, services and tag library classes. <code>gsp</code> applies to pages, and is the one opt-in there that <code>all = true</code> does not include.
+</td>
+</tr>
+</table>
+</div>
+</div>
+
<a name="7.2.4 Layouts"><!-- Legacy link --></a>
-<h2 id="layouts">8.2.4 Layouts</h2>
+<h2 id="layouts">8.2.5 Layouts</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/layouts.adoc"'>
@@ -4583,7 +4910,7 @@ The content to apply a layout to
</div>
<a name="7.2.6 Content Blocks"><!-- Legacy link --></a>
-<h2 id="contentBlocks">8.2.4.1 Content Blocks</h2>
+<h2 id="contentBlocks">8.2.5.1 Content Blocks</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/contentBlocks.adoc"'>
@@ -4647,7 +4974,7 @@ The content to apply a layout to
</div>
<a name="7.2.5 Static Resources"><!-- Legacy link --></a>
-<h2 id="resources">8.2.5 Static Resources</h2>
+<h2 id="resources">8.2.6 Static Resources</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/resources.adoc"'>
@@ -4711,7 +5038,7 @@ To have them be cached by the browser, you can set the configuration setting <co
</div>
<a name="7.2.7 Making Changes to a Deployed Application"><!-- Legacy link --></a>
-<h2 id="makingChangesToADeployedApplication">8.2.6 Making Changes to a Deployed Application</h2>
+<h2 id="makingChangesToADeployedApplication">8.2.7 Making Changes to a Deployed Application</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/makingChangesToADeployedApplication.adoc"'>
@@ -4803,7 +5130,7 @@ cp -R grails-app/views/* /var/www/grails/my-app/grails-app/views</pre>
</div>
<a name="7.3 Tag Libraries"><!-- Legacy link --></a>
-<h2 id="taglibs">8.2.7 Tag Libraries</h2>
+<h2 id="taglibs">8.2.8 Tag Libraries</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/taglibs.adoc"'>
@@ -4976,7 +5303,7 @@ To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr<
</div>
<a name="7.3.1 Variables and Scopes"><!-- Legacy link --></a>
-<h2 id="taglibVariablesAndScopes">8.2.7.1 Variables and Scopes</h2>
+<h2 id="taglibVariablesAndScopes">8.2.8.1 Variables and Scopes</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/taglibVariablesAndScopes.adoc"'>
@@ -5030,7 +5357,7 @@ To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr<
</div>
<a name="7.3.2 Simple Tags"><!-- Legacy link --></a>
-<h2 id="simpleTags">8.2.7.2 Simple Tags</h2>
+<h2 id="simpleTags">8.2.8.2 Simple Tags</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/simpleTags.adoc"'>
@@ -5097,7 +5424,7 @@ To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr<
</div>
<a name="7.3.3 Logical Tags"><!-- Legacy link --></a>
-<h2 id="logicalTags">8.2.7.3 Logical Tags</h2>
+<h2 id="logicalTags">8.2.8.3 Logical Tags</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/logicalTags.adoc"'>
@@ -5131,7 +5458,7 @@ To help IDEs autocomplete tag attributes, add Javadoc comments with <code>@attr<
</div>
<a name="7.3.4 Iterative Tags"><!-- Legacy link --></a>
-<h2 id="iterativeTags">8.2.7.4 Iterative Tags</h2>
+<h2 id="iterativeTags">8.2.8.4 Iterative Tags</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/iterativeTags.adoc"'>
@@ -5218,7 +5545,7 @@ Note the usage of the parenthesis around the variable name. If you omit these Gr
</div>
<a name="7.3.5 Tag Namespaces"><!-- Legacy link --></a>
-<h2 id="namespaces">8.2.7.5 Tag Namespaces</h2>
+<h2 id="namespaces">8.2.8.5 Tag Namespaces</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/namespaces.adoc"'>
@@ -5265,7 +5592,7 @@ Note the usage of the parenthesis around the variable name. If you omit these Gr
</div>
-<h2 id="compiledTags">8.2.7.6 Compiled Tag Resolution</h2>
+<h2 id="compiledTags">8.2.8.6 Compiled Tag Resolution</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/compiledTags.adoc"'>
@@ -5617,7 +5944,7 @@ not have this problem: the task rewrites the index from the sources each time it
</div>
<a name="7.3.6 Using JSP Tag Libraries"><!-- Legacy link --></a>
-<h2 id="usingJSPTagLibraries">8.2.7.7 Using JSP Tag Libraries</h2>
+<h2 id="usingJSPTagLibraries">8.2.8.7 Using JSP Tag Libraries</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/usingJSPTagLibraries.adoc"'>
@@ -5695,7 +6022,7 @@ This is configured with the <code>grails.gsp.tldScanPattern</code> setting. It a
</div>
<a name="7.3.7 Tag return value"><!-- Legacy link --></a>
-<h2 id="tagReturnValue">8.2.7.8 Tag return value</h2>
+<h2 id="tagReturnValue">8.2.8.8 Tag return value</h2>
<div class='contribute-btn'>
<button type='button' class='btn btn-default' onclick='window.location.href="https://github.com/apache/grails-core/edit/8.0.x/grails-doc/src/en/guide/theWebLayer/gsp/taglibs/tagReturnValue.adoc"'>
diff --git a/docs/snapshot/index.html b/docs/snapshot/index.html
index 7cefbd8d614..59a581b554b 100644
--- a/docs/snapshot/index.html
+++ b/docs/snapshot/index.html
@@ -144,7 +144,7 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="project">
<h1>The Grails Framework</h1>
<p><strong>Authors:</strong> The Apache Grails Team</p>
- <p><strong>Version:</strong> <span style='display:inline-block;'><select onChange='window.document.location.href=this.options[this.selectedIndex].value;'><option selected='selected' value='https://grails.apache.org/docs/snapshot/index.html'>SNAPSHOT</option><option value='https://grails.apache.org/docs/8.0.0-M6/index.html'>8.0.0-M6</option><option value='https://grails.apache.org/docs/8.0.0-M5/index.html'>8.0.0-M5</option><option value='https://grails.apa [...]
+ <p><strong>Version:</strong> <span style='display:inline-block;'><select onChange='window.document.location.href=this.options[this.selectedIndex].value;'><option selected='selected' value='https://grails.apache.org/docs/snapshot/index.html'>SNAPSHOT</option><option value='https://grails.apache.org/docs/8.0.0-M6/index.html'>8.0.0-M6</option><option value='https://grails.apache.org/docs/8.0.0-M5/index.html'>8.0.0-M5</option><option value='https://grails.apa [...]
</div>
@@ -370,31 +370,33 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#viewsAndTemplates"><strong>8.2.3</strong><span>Views and Templates</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#layouts"><strong>8.2.4</strong><span>Layouts</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#gspStaticCompilation"><strong>8.2.4</strong><span>Static Compilation</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#contentBlocks"><strong>8.2.4.1</strong><span>Content Blocks</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#layouts"><strong>8.2.5</strong><span>Layouts</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#resources"><strong>8.2.5</strong><span>Static Resources</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#contentBlocks"><strong>8.2.5.1</strong><span>Content Blocks</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#makingChangesToADeployedApplication"><strong>8.2.6</strong><span>Making Changes to a Deployed Application</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#resources"><strong>8.2.6</strong><span>Static Resources</span></a></div>
- <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#taglibs"><strong>8.2.7</strong><span>Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#makingChangesToADeployedApplication"><strong>8.2.7</strong><span>Making Changes to a Deployed Application</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#taglibVariablesAndScopes"><strong>8.2.7.1</strong><span>Variables and Scopes</span></a></div>
+ <div class="toc-item" style="margin-left:20px"><a href="./guide/theWebLayer.html#taglibs"><strong>8.2.8</strong><span>Tag Libraries</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#simpleTags"><strong>8.2.7.2</strong><span>Simple Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#taglibVariablesAndScopes"><strong>8.2.8.1</strong><span>Variables and Scopes</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#logicalTags"><strong>8.2.7.3</strong><span>Logical Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#simpleTags"><strong>8.2.8.2</strong><span>Simple Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#iterativeTags"><strong>8.2.7.4</strong><span>Iterative Tags</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#logicalTags"><strong>8.2.8.3</strong><span>Logical Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#namespaces"><strong>8.2.7.5</strong><span>Tag Namespaces</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#iterativeTags"><strong>8.2.8.4</strong><span>Iterative Tags</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#compiledTags"><strong>8.2.7.6</strong><span>Compiled Tag Resolution</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#namespaces"><strong>8.2.8.5</strong><span>Tag Namespaces</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#usingJSPTagLibraries"><strong>8.2.7.7</strong><span>Using JSP Tag Libraries</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#compiledTags"><strong>8.2.8.6</strong><span>Compiled Tag Resolution</span></a></div>
- <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#tagReturnValue"><strong>8.2.7.8</strong><span>Tag return value</span></a></div>
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#usingJSPTagLibraries"><strong>8.2.8.7</strong><span>Using JSP Tag Libraries</span></a></div>
+
+ <div class="toc-item" style="margin-left:30px"><a href="./guide/theWebLayer.html#tagReturnValue"><strong>8.2.8.8</strong><span>Tag return value</span></a></div>
<div class="toc-item" style="margin-left:10px"><a href="./guide/theWebLayer.html#fields"><strong>8.3</strong><span>Fields Plugin</span></a></div>
diff --git a/docs/snapshot/ref/Configuration/Application Properties.html b/docs/snapshot/ref/Configuration/Application Properties.html
index 031b138db12..2e76fa1a78b 100644
--- a/docs/snapshot/ref/Configuration/Application Properties.html
+++ b/docs/snapshot/ref/Configuration/Application Properties.html
@@ -525,6 +525,21 @@ environments {
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>none</code></p></td>
</tr>
<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.views.gsp.compileStatic</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Whether every GSP is compiled statically, without each page declaring a compileStatic directive.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.views.gsp.compileStaticConfig.strict</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Whether a statically compiled page is held to the names it declares, rather than only pages that declare a model.</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>false</code></p></td>
+</tr>
+<tr>
+<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.views.gsp.compileStaticConfig.taglibs</code></p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">Tag library namespaces a statically compiled page may call, beyond those the framework supplies. A comma separated string or a list.</p></td>
+<td class="tableblock halign-left valign-top"></td>
+</tr>
+<tr>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>grails.views.gsp.encoding</code></p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock">The file encoding for GSP source files.</p></td>
<td class="tableblock halign-left valign-top"><p class="tableblock"><code>UTF-8</code></p></td>
diff --git a/docs/snapshot/ref/Tags - GSP/set.html b/docs/snapshot/ref/Tags - GSP/set.html
index 85884bf4a44..d24c760571f 100644
--- a/docs/snapshot/ref/Tags - GSP/set.html
+++ b/docs/snapshot/ref/Tags - GSP/set.html
@@ -238,6 +238,15 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<span class="tag"><g:set</span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">messageSource</span><span class="delimiter">"</span></span> <span class="attribute-name">bean</span>=<span class="string"><span class="delimiter">"</span><span class="content">${MessageSource}</span><span class="delimiter">"</span></span><span class="tag">/></span></code></pre>
</div>
</div>
+<div class="paragraph">
+<p>Give the variable a type, so that a statically compiled page knows what it holds:</p>
+</div>
+<div class="listingblock">
+<div class="content">
+<pre class="CodeRay highlight"><code data-lang="xml"><span class="tag"><g:set</span> <span class="attribute-name">type</span>=<span class="string"><span class="delimiter">"</span><span class="content">int</span><span class="delimiter">"</span></span> <span class="attribute-name">var</span>=<span class="string"><span class="delimiter">"</span><span class="content">counter</span><span class="delimiter">"</span></span> <span class="attribute-name">value</span>=<span c [...]
+${counter + 1}</code></pre>
+</div>
+</div>
</div>
<div class="sect2">
<h3 id="_description">Description</h3>
@@ -258,6 +267,9 @@ Companies deploy assistants like this [](https://kapa.ai) on docs via [website w
<li>
<p><code>scope</code> - Scope to set variable in, one of <code>request</code>, <code>page</code>, <code>flash</code> or <code>session</code>. Defaults to <code>page</code>.</p>
</li>
+<li>
+<p><code>type</code> - The type to declare the variable as, so that a page compiled statically can apply an operator to it. The value is converted to the type. Only valid alongside <code>value</code>, since a body or a <code>bean</code> produces its value as the tag runs.</p>
+</li>
</ul>
</div>
</div>