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 49c2cd04684 Deploying to documentation branch - 13:53:52
49c2cd04684 is described below
commit 49c2cd04684703e0423861dea72f2cb492035e80
Author: codeconsole <[email protected]>
AuthorDate: Fri Aug 21 13:53:55 2026 +0000
Deploying to documentation branch - 13:53:52
---
docs/snapshot/api/index-all.html | 25 ++--
.../api/org/grails/gsp/GroovyPageMetaInfo.html | 130 +++++++++---------
.../org/grails/gsp/compiler/GroovyPageParser.html | 145 ++++++++++++---------
.../developer-manual/gettingStarted.html | 2 +-
.../grails-data/developer-manual/introduction.html | 2 +-
.../grails-data/developer-manual/stepByStep.html | 2 +-
.../grails-data/developer-manual/testing.html | 2 +-
.../developer-manual/understandingApi.html | 2 +-
.../understandingApi/datastoreBasics.html | 2 +-
.../understandingApi/gormApis.html | 2 +-
.../understandingApi/gormEnhancer.html | 2 +-
.../understandingApi/implementingCrud.html | 2 +-
.../understandingApi/implementingQueries.html | 2 +-
.../understandingApi/secondaryIndexes.html | 2 +-
.../grails-data/whats-new-manual/index.html | 2 +-
docs/snapshot/guide/single.html | 51 +++++++-
docs/snapshot/guide/theWebLayer.html | 10 +-
docs/snapshot/guide/upgrading.html | 41 ++++++
18 files changed, 260 insertions(+), 166 deletions(-)
diff --git a/docs/snapshot/api/index-all.html b/docs/snapshot/api/index-all.html
index 5db4662f2ab..2107968a45e 100644
--- a/docs/snapshot/api/index-all.html
+++ b/docs/snapshot/api/index-all.html
@@ -2503,8 +2503,6 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/cli/compiler/autoconfigure/TransactionManagementCompilerAutoConfiguration.html#applyImports(org.codehaus.groovy.control.customizers.ImportCustomizer)"
title="Method in
TransactionManagementCompilerAutoConfiguration">applyImports(org.codehaus.groovy.control.customizers.ImportCustomizer)</a></span>
- Method in <a
href="org/grails/cli/compiler/autoconfigure/TransactionManagementCompilerAutoConfiguration.html">TransactionManagementCompilerAutoConf
[...]
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a
href="org/grails/gsp/GroovyPageMetaInfo.html#applyLastModifiedFromResource(org.springframework.core.io.Resource)"
title="Method in
GroovyPageMetaInfo">applyLastModifiedFromResource(org.springframework.core.io.Resource)</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/plugins/web/taglib/RenderGrailsLayoutTagLib.html#applyLayout"
title="Property in RenderGrailsLayoutTagLib">applyLayout</a></span> - Property
in <a
href="org/grails/plugins/web/taglib/RenderGrailsLayoutTagLib.html">RenderGrailsLayoutTagLib</a>
</dt><dd> <div class="block">Apply a layout to a particular block of text or
to the given view or template.</div></dd>
<dt><span class="strong"><a
href="org/grails/plugins/web/taglib/RenderSitemeshTagLib.html#applyLayout(java.util.Map,
groovy.lang.Closure)" title="Method in
RenderSitemeshTagLib">applyLayout(java.util.Map,
groovy.lang.Closure)</a></span> - Method in <a
href="org/grails/plugins/web/taglib/RenderSitemeshTagLib.html">RenderSitemeshTagLib</a>
@@ -5862,6 +5860,8 @@ if (location.href.indexOf('is-external=true') == -1) {
<dt><span class="strong"><a
href="org/apache/grails/buildsrc/GrailsCodeStyleExtension.html#checkstyleDirectory"
title="Property in GrailsCodeStyleExtension">checkstyleDirectory</a></span> -
Property in <a
href="org/apache/grails/buildsrc/GrailsCodeStyleExtension.html">GrailsCodeStyleExtension</a>
</dt><dd> <div class="block">Defaults to
rootProject.layout.buildDirectory/code-style/checkstyle.
</div></dd>
+<dt><span class="strong"><a
href="org/grails/gsp/compiler/GroovyPageParser.html#checksumOf(byte[])"
title="Method in GroovyPageParser">checksumOf(byte[])</a></span> - Method in <a
href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
+</dt><dd> <div class="block">Computes the checksum recorded in the
<CODE>SOURCE_CHECKSUM</CODE> constant of a generated page.</div></dd>
<dt><span class="strong"><a
href="org/grails/plugins/databasemigration/liquibase/GroovyChange.html#checksumString"
title="Property in GroovyChange">checksumString</a></span> - Property 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/apache/grails/data/testing/tck/domains/Child.html" title="Class in
org.apache.grails.data.testing.tck.domains">Child</a></span> - Class in <a
href="./org/apache/grails/data/testing/tck/domains/package-summary.html">org.apache.grails.data.testing.tck.domains</a>
@@ -7884,12 +7884,12 @@ 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#CONSTANT_NAME_JSP_TAGS"
title="Field in GroovyPageParser">CONSTANT_NAME_JSP_TAGS</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#CONSTANT_NAME_LAST_MODIFIED"
title="Field in GroovyPageParser">CONSTANT_NAME_LAST_MODIFIED</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#CONSTANT_NAME_MODEL_FIELDS_MODE"
title="Field in GroovyPageParser">CONSTANT_NAME_MODEL_FIELDS_MODE</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#CONSTANT_NAME_OUT_CODEC"
title="Field in GroovyPageParser">CONSTANT_NAME_OUT_CODEC</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#CONSTANT_NAME_SOURCE_CHECKSUM"
title="Field in GroovyPageParser">CONSTANT_NAME_SOURCE_CHECKSUM</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#CONSTANT_NAME_STATIC_CODEC"
title="Field in GroovyPageParser">CONSTANT_NAME_STATIC_CODEC</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#CONSTANT_NAME_TAGLIB_CODEC"
title="Field in GroovyPageParser">CONSTANT_NAME_TAGLIB_CODEC</a></span> - Field
in <a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
@@ -22331,10 +22331,6 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="grails/plugin/springsecurity/SpringSecurityUtils.html#getLastException(jakarta.servlet.http.HttpSession)"
title="Method in
SpringSecurityUtils">getLastException(jakarta.servlet.http.HttpSession)</a></span>
- Method in <a
href="grails/plugin/springsecurity/SpringSecurityUtils.html">SpringSecurityUtils</a>
</dt><dd> <div class="block">Get the last auth exception.</div></dd>
-<dt><span class="strong"><a
href="org/grails/gsp/GroovyPageMetaInfo.html#getLastModified()" title="Method
in GroovyPageMetaInfo">getLastModified()</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#getLastModified()"
title="Method in GroovyPageParser">getLastModified()</a></span> - Method 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/plugin/json/view/api/internal/DefaultJsonViewHelper.html#getLastOffset(java.lang.Integer,
java.lang.Integer)" title="Method in
DefaultJsonViewHelper">getLastOffset(java.lang.Integer,
java.lang.Integer)</a></span> - Method in <a
href="grails/plugin/json/view/api/internal/DefaultJsonViewHelper.html">DefaultJsonViewHelper</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/core/util/StopWatch.html#getLastTaskInfo()" title="Method in
StopWatch">getLastTaskInfo()</a></span> - Method in <a
href="org/grails/core/util/StopWatch.html">StopWatch</a>
@@ -25759,6 +25755,10 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/events/spring/SpringEventBusEvent.html#getSource()"
title="Method in SpringEventBusEvent">getSource()</a></span> - Method in <a
href="org/grails/events/spring/SpringEventBusEvent.html">SpringEventBusEvent</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a
href="org/grails/gsp/GroovyPageMetaInfo.html#getSourceChecksum()" title="Method
in GroovyPageMetaInfo">getSourceChecksum()</a></span> - Method in <a
href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>the checksum of
the GSP source this page was compiled from, or <CODE>null</CODE> if none was
recorded</DD></DL></div></dd>
+<dt><span class="strong"><a
href="org/grails/gsp/compiler/GroovyPageParser.html#getSourceChecksum()"
title="Method in GroovyPageParser">getSourceChecksum()</a></span> - Method in
<a href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
+</dt><dd> <div class="block"> <DL><DT><B>Returns:</B></DT><DD>a checksum of
the GSP source this page was generated from, or <CODE>null</CODE> if none was
recorded</DD></DL></div></dd>
<dt><span class="strong"><a
href="grails/views/WritableScript.html#getSourceFile()" title="Method in
WritableScript">getSourceFile()</a></span> - Method in <a
href="grails/views/WritableScript.html">WritableScript</a>
</dt><dd> <div class="block">Obtains the source file</div></dd>
<dt><span class="strong"><a
href="org/grails/gradle/plugin/core/TestPhase.html#getSourceFolderName()"
title="Method in TestPhase">getSourceFolderName()</a></span> - Method in <a
href="org/grails/gradle/plugin/core/TestPhase.html">TestPhase</a>
@@ -49401,10 +49401,6 @@ if (location.href.indexOf('is-external=true') == -1) {
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/orm/hibernate/cfg/JoinTable.html#setKeys(List<ColumnConfig>)"
title="Method in JoinTable">setKeys(List<ColumnConfig>)</a></span> -
Method in <a href="org/grails/orm/hibernate/cfg/JoinTable.html">JoinTable</a>
</dt><dd> <div class="block"></div></dd>
-<dt><span class="strong"><a
href="org/grails/gsp/GroovyPageMetaInfo.html#setLastModified(long)"
title="Method in GroovyPageMetaInfo">setLastModified(long)</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#setLastModified(long)"
title="Method in GroovyPageParser">setLastModified(long)</a></span> - Method 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/plugins/sitemesh3/Sitemesh3LayoutFinder.html#setLayoutCacheExpirationMillis(long)"
title="Method in
Sitemesh3LayoutFinder">setLayoutCacheExpirationMillis(long)</a></span> - Method
in <a
href="org/grails/plugins/sitemesh3/Sitemesh3LayoutFinder.html">Sitemesh3LayoutFinder</a>
</dt><dd> <div class="block"></div></dd>
<dt><span class="strong"><a
href="org/grails/datastore/mapping/config/Property.html#setLazy(java.lang.Boolean)"
title="Method in Property">setLazy(java.lang.Boolean)</a></span> - Method in
<a href="org/grails/datastore/mapping/config/Property.html">Property</a>
@@ -50297,6 +50293,11 @@ 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/GroovyPageForkCompileTask.html#setSource(java.lang.Object)"
title="Method in
GroovyPageForkCompileTask">setSource(java.lang.Object)</a></span> - Method in
<a
href="org/grails/gradle/plugin/views/gsp/GroovyPageForkCompileTask.html">GroovyPageForkCompileTask</a>
</dt><dd> <div class="block"></div></dd>
+<dt><span class="strong"><a
href="org/grails/gsp/GroovyPageMetaInfo.html#setSourceChecksum(java.lang.String)"
title="Method in
GroovyPageMetaInfo">setSourceChecksum(java.lang.String)</a></span> - Method in
<a href="org/grails/gsp/GroovyPageMetaInfo.html">GroovyPageMetaInfo</a>
+</dt><dd> <div class="block">
<DL><DT><B>Parameters:</B></DT><DD><code>sourceChecksum</code> - the checksum
of the GSP source this page was compiled from</DD></DL></div></dd>
+<dt><span class="strong"><a
href="org/grails/gsp/compiler/GroovyPageParser.html#setSourceChecksum(java.lang.String)"
title="Method in
GroovyPageParser">setSourceChecksum(java.lang.String)</a></span> - Method in <a
href="org/grails/gsp/compiler/GroovyPageParser.html">GroovyPageParser</a>
+</dt><dd> <div class="block">Records a checksum of the GSP source, emitted as
the <CODE>SOURCE_CHECKSUM</CODE> constant so that the
+ runtime can detect an edited source without depending on its modification
time.</div></dd>
<dt><span class="strong"><a
href="grails/views/WritableScript.html#setSourceFile(java.io.File)"
title="Method in WritableScript">setSourceFile(java.io.File)</a></span> -
Method in <a href="grails/views/WritableScript.html">WritableScript</a>
</dt><dd> <div class="block">
<DL><DT><B>Parameters:</B></DT><DD><code>file</code> - Sets the source
file</DD></DL></div></dd>
<dt><span class="strong"><a
href="grails/spring/BeanBuilder.html#setSpringConfig(org.grails.spring.RuntimeSpringConfiguration)"
title="Method in
BeanBuilder">setSpringConfig(org.grails.spring.RuntimeSpringConfiguration)</a></span>
- Method in <a href="grails/spring/BeanBuilder.html">BeanBuilder</a>
diff --git a/docs/snapshot/api/org/grails/gsp/GroovyPageMetaInfo.html
b/docs/snapshot/api/org/grails/gsp/GroovyPageMetaInfo.html
index b4550059a08..e04f3bba192 100644
--- a/docs/snapshot/api/org/grails/gsp/GroovyPageMetaInfo.html
+++ b/docs/snapshot/api/org/grails/gsp/GroovyPageMetaInfo.html
@@ -220,77 +220,65 @@ implements <a
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
</tr>
<tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#applyLastModifiedFromResource(org.springframework.core.io.Resource)">applyLastModifiedFromResource</a></strong>(<a
href='../../../org.springframework.core.io.Resource.html'>Resource</a>
resource)</code><br></td>
- </tr>
-
- <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../org.springframework.core.io.Resource.html'>Resource</a></code></td>
<td class="colLast"><code><strong><a
href="#call()">call</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../org.springframework.core.io.Resource.html'>Resource</a></code></td>
<td class="colLast"><code><strong><a
href="#checkIfReloadableResourceHasChanged(PrivilegedAction)">checkIfReloadableResourceHasChanged</a></strong>(java.security.PrivilegedAction<Resource>
resourceCallable)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../org/grails/gsp/GroovyPagesException.html'>GroovyPagesException</a></code></td>
<td class="colLast"><code><strong><a
href="#getCompilationException()">getCompilationException</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String</code></td>
<td class="colLast"><code><strong><a
href="#getContentType()">getContentType</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../org/grails/encoder/Encoder.html'>Encoder</a></code></td>
<td class="colLast"><code><strong><a
href="#getExpressionEncoder()">getExpressionEncoder</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../grails/core/GrailsApplication.html'>GrailsApplication</a></code></td>
<td class="colLast"><code><strong><a
href="#getGrailsApplication()">getGrailsApplication</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.io.InputStream</code></td>
<td class="colLast"><code><strong><a
href="#getGroovySource()">getGroovySource</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String[]</code></td>
<td class="colLast"><code><strong><a
href="#getHtmlParts()">getHtmlParts</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../org/grails/gsp/jsp/TagLibraryResolver.html'>TagLibraryResolver</a></code></td>
<td class="colLast"><code><strong><a
href="#getJspTagLibraryResolver()">getJspTagLibraryResolver</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.util.Map</code></td>
<td class="colLast"><code><strong><a
href="#getJspTags()">getJspTags</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td
class="colLast"><code>public long</code></td>
- <td class="colLast"><code><strong><a
href="#getLastModified()">getLastModified</a></strong>()</code><br></td>
- </tr>
-
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public int[]</code></td>
@@ -334,111 +322,111 @@ implements <a
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
</tr>
<tr class="rowColor">
+ <td class="colFirst"><code></code></td>
+ <td
class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a
href="#getSourceChecksum()">getSourceChecksum</a></strong>()</code><br>
<DL><DT><B>Returns:</B></DT><DD>the checksum of the GSP source this page was
compiled from, or <CODE>null</CODE> if none was recorded</DD></DL></td>
+ </tr>
+
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../org/grails/encoder/Encoder.html'>Encoder</a></code></td>
<td class="colLast"><code><strong><a
href="#getStaticEncoder()">getStaticEncoder</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a></code></td>
<td class="colLast"><code><strong><a
href="#getTagLibraryLookup()">getTagLibraryLookup</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td class="colLast"><code>public <a
href='../../../org/grails/encoder/Encoder.html'>Encoder</a></code></td>
<td class="colLast"><code><strong><a
href="#getTaglibEncoder()">getTaglibEncoder</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a
href="#initialize()">initialize</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="#isCompileStaticMode()">isCompileStaticMode</a></strong>()</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="#isModelFieldsMode()">isModelFieldsMode</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="#isPrecompiledMode()">isPrecompiledMode</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
- <td class="colFirst"><code></code></td>
- <td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#removePageMetaClass()">removePageMetaClass</a></strong>()</code><br></td>
- </tr>
-
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setCompilationException(org.grails.gsp.GroovyPagesException)">setCompilationException</a></strong>(<a
href='../../../org/grails/gsp/GroovyPagesException.html'>GroovyPagesException</a>
e)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#removePageMetaClass()">removePageMetaClass</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setCompileStaticMode(boolean)">setCompileStaticMode</a></strong>(boolean
compileStaticMode)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setCompilationException(org.grails.gsp.GroovyPagesException)">setCompilationException</a></strong>(<a
href='../../../org/grails/gsp/GroovyPagesException.html'>GroovyPagesException</a>
e)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setContentType(java.lang.String)">setContentType</a></strong>(java.lang.String
contentType)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setCompileStaticMode(boolean)">setCompileStaticMode</a></strong>(boolean
compileStaticMode)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setExpressionCodecName(java.lang.String)">setExpressionCodecName</a></strong>(java.lang.String
expressionCodecName)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setContentType(java.lang.String)">setContentType</a></strong>(java.lang.String
contentType)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setGrailsApplication(grails.core.GrailsApplication)">setGrailsApplication</a></strong>(<a
href='../../../grails/core/GrailsApplication.html'>GrailsApplication</a>
grailsApplication)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setExpressionCodecName(java.lang.String)">setExpressionCodecName</a></strong>(java.lang.String
expressionCodecName)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setGroovySource(java.io.InputStream)">setGroovySource</a></strong>(java.io.InputStream
groovySource)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setGrailsApplication(grails.core.GrailsApplication)">setGrailsApplication</a></strong>(<a
href='../../../grails/core/GrailsApplication.html'>GrailsApplication</a>
grailsApplication)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setHtmlParts(java.lang.String)">setHtmlParts</a></strong>(java.lang.String[]
htmlParts)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setGroovySource(java.io.InputStream)">setGroovySource</a></strong>(java.io.InputStream
groovySource)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setJspTagLibraryResolver(org.grails.gsp.jsp.TagLibraryResolver)">setJspTagLibraryResolver</a></strong>(<a
href='../../../org/grails/gsp/jsp/TagLibraryResolver.html'>TagLibraryResolver</a>
jspTagLibraryResolver)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setHtmlParts(java.lang.String)">setHtmlParts</a></strong>(java.lang.String[]
htmlParts)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setJspTags(java.util.Map)">setJspTags</a></strong>(java.util.Map
jspTags)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setJspTagLibraryResolver(org.grails.gsp.jsp.TagLibraryResolver)">setJspTagLibraryResolver</a></strong>(<a
href='../../../org/grails/gsp/jsp/TagLibraryResolver.html'>TagLibraryResolver</a>
jspTagLibraryResolver)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setLastModified(long)">setLastModified</a></strong>(long
lastModified)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setJspTags(java.util.Map)">setJspTags</a></strong>(java.util.Map
jspTags)</code><br></td>
</tr>
<tr class="rowColor">
@@ -468,29 +456,35 @@ implements <a
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setStaticCodecName(java.lang.String)">setStaticCodecName</a></strong>(java.lang.String
staticCodecName)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setSourceChecksum(java.lang.String)">setSourceChecksum</a></strong>(java.lang.String
sourceChecksum)</code><br>
<DL><DT><B>Parameters:</B></DT><DD><code>sourceChecksum</code> - the checksum
of the GSP source this page was compiled from</DD></DL></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setTagLibraryLookup(org.grails.taglib.TagLibraryLookup)">setTagLibraryLookup</a></strong>(<a
href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a>
tagLibraryLookup)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setStaticCodecName(java.lang.String)">setStaticCodecName</a></strong>(java.lang.String
staticCodecName)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setTaglibCodecName(java.lang.String)">setTaglibCodecName</a></strong>(java.lang.String
taglibCodecName)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setTagLibraryLookup(org.grails.taglib.TagLibraryLookup)">setTagLibraryLookup</a></strong>(<a
href='../../../org/grails/taglib/TagLibraryLookup.html'>TagLibraryLookup</a>
tagLibraryLookup)</code><br></td>
</tr>
<tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td
class="colLast"><code>public void</code></td>
+ <td class="colLast"><code><strong><a
href="#setTaglibCodecName(java.lang.String)">setTaglibCodecName</a></strong>(java.lang.String
taglibCodecName)</code><br></td>
+ </tr>
+
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public boolean</code></td>
<td class="colLast"><code><strong><a
href="#shouldReload(PrivilegedAction)">shouldReload</a></strong>(java.security.PrivilegedAction<Resource>
resourceCallable)</code><br>Checks if this GSP has expired and should be
reloaded (there is a newer source gsp available)
PrivilegedAction is used so that locating the Resource is lazily
evaluated.</td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a
href="#writeToFinished(java.io.Writer)">writeToFinished</a></strong>(java.io.Writer
out)</code><br></td>
@@ -614,14 +608,6 @@ implements <a
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
</a>
<h3>Method Detail</h3>
- <a
name="applyLastModifiedFromResource(org.springframework.core.io.Resource)"><!--
--></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public void
<strong>applyLastModifiedFromResource</strong>(<a
href='../../../org.springframework.core.io.Resource.html'>Resource</a>
resource)</h4>
- <p></p>
- </li>
- </ul>
-
<a name="call()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -702,14 +688,6 @@ implements <a
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
</li>
</ul>
- <a name="getLastModified()"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public long
<strong>getLastModified</strong>()</h4>
- <p></p>
- </li>
- </ul>
-
<a name="getLineNumbers()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -766,6 +744,15 @@ implements <a
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
</li>
</ul>
+ <a name="getSourceChecksum()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.lang.String
<strong>getSourceChecksum</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>the checksum of the GSP source this page
was compiled from, or <CODE>null</CODE> if none was
recorded</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+ </li>
+ </ul>
+
<a name="getStaticEncoder()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -902,14 +889,6 @@ implements <a
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
</li>
</ul>
- <a name="setLastModified(long)"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public void
<strong>setLastModified</strong>(long lastModified)</h4>
- <p></p>
- </li>
- </ul>
-
<a name="setLineNumbers(int[])"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -942,6 +921,15 @@ implements <a
href='../../../grails/core/support/GrailsApplicationAware.html'>Gr
</li>
</ul>
+ <a name="setSourceChecksum(java.lang.String)"><!--
--></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public void
<strong>setSourceChecksum</strong>(java.lang.String sourceChecksum)</h4>
+ <p>
+ <DL><DT><B>Parameters:</B></DT><DD><code>sourceChecksum</code> - the
checksum of the GSP source this page was compiled
from</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+ </li>
+ </ul>
+
<a name="setStaticCodecName(java.lang.String)"><!--
--></a>
<ul class="blockListLast">
<li class="blockList">
diff --git a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
b/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
index 0b49a6b434c..52d543e0ab9 100644
--- a/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
+++ b/docs/snapshot/api/org/grails/gsp/compiler/GroovyPageParser.html
@@ -224,19 +224,19 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
<tr class="rowColor">
<td
class="colFirst"><code><strong>static java.lang.String</strong></code> </td>
- <td class="colLast"><code><a
href="#CONSTANT_NAME_LAST_MODIFIED">CONSTANT_NAME_LAST_MODIFIED</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="altColor">
<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_OUT_CODEC">CONSTANT_NAME_OUT_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_OUT_CODEC">CONSTANT_NAME_OUT_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>
@@ -355,89 +355,89 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
</tr>
<tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td
class="colLast"><code>public static java.lang.String</code></td>
+ <td class="colLast"><code><strong><a
href="#checksumOf(byte[])">checksumOf</a></strong>(byte[]
source)</code><br>Computes the checksum recorded in the
<CODE>SOURCE_CHECKSUM</CODE> constant of a generated page.</td>
+ </tr>
+
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a
href="#flushTagBuffering()">flushTagBuffering</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a
href="#generateGsp(java.io.Writer)">generateGsp</a></strong>(java.io.Writer
target)</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a
href="#generateGsp(java.io.Writer,
boolean)">generateGsp</a></strong>(java.io.Writer target, boolean
precompileMode)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String</code></td>
<td class="colLast"><code><strong><a
href="#getClassName()">getClassName</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String</code></td>
<td class="colLast"><code><strong><a
href="#getContentType()">getContentType</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public int</code></td>
<td class="colLast"><code><strong><a
href="#getCurrentOutputLineNumber()">getCurrentOutputLineNumber</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String</code></td>
<td class="colLast"><code><strong><a
href="#getExpressionCodecDirectiveValue()">getExpressionCodecDirectiveValue</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String</code></td>
<td class="colLast"><code><strong><a
href="#getExpressionText(java.lang.String)">getExpressionText</a></strong>(java.lang.String
text)</code><br>Returns an expression text for the given expression</td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String</code></td>
<td class="colLast"><code><strong><a
href="#getExpressionText(java.lang.String,
boolean)">getExpressionText</a></strong>(java.lang.String text, boolean
_safeDereference)</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public static java.lang.String</code></td>
<td class="colLast"><code><strong><a
href="#getGspEncoding()">getGspEncoding</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.util.List<java.lang.String></code></td>
<td class="colLast"><code><strong><a
href="#getHtmlParts()">getHtmlParts</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
+ <tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String[]</code></td>
<td class="colLast"><code><strong><a
href="#getHtmlPartsArray()">getHtmlPartsArray</a></strong>()</code><br></td>
</tr>
- <tr class="altColor">
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.util.Map<java.lang.String,
java.lang.String></code></td>
<td class="colLast"><code><strong><a
href="#getJspTags()">getJspTags</a></strong>()</code><br></td>
</tr>
- <tr class="rowColor">
- <td class="colFirst"><code></code></td>
- <td
class="colLast"><code>public long</code></td>
- <td class="colLast"><code><strong><a
href="#getLastModified()">getLastModified</a></strong>()</code><br></td>
- </tr>
-
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public int[]</code></td>
@@ -465,67 +465,67 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String</code></td>
- <td class="colLast"><code><strong><a
href="#getStaticCodecDirectiveValue()">getStaticCodecDirectiveValue</a></strong>()</code><br></td>
+ <td class="colLast"><code><strong><a
href="#getSourceChecksum()">getSourceChecksum</a></strong>()</code><br>
<DL><DT><B>Returns:</B></DT><DD>a checksum of the GSP source this page was
generated from, or <CODE>null</CODE> if none was recorded</DD></DL></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public java.lang.String</code></td>
- <td class="colLast"><code><strong><a
href="#getTaglibCodecDirectiveValue()">getTaglibCodecDirectiveValue</a></strong>()</code><br></td>
+ <td class="colLast"><code><strong><a
href="#getStaticCodecDirectiveValue()">getStaticCodecDirectiveValue</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td
class="colLast"><code>public boolean</code></td>
- <td class="colLast"><code><strong><a
href="#isCompileStaticMode()">isCompileStaticMode</a></strong>()</code><br></td>
+ <td
class="colLast"><code>public java.lang.String</code></td>
+ <td class="colLast"><code><strong><a
href="#getTaglibCodecDirectiveValue()">getTaglibCodecDirectiveValue</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public boolean</code></td>
- <td class="colLast"><code><strong><a
href="#isInClosure()">isInClosure</a></strong>()</code><br></td>
+ <td class="colLast"><code><strong><a
href="#isCompileStaticMode()">isCompileStaticMode</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public boolean</code></td>
- <td class="colLast"><code><strong><a
href="#isModelFieldsMode()">isModelFieldsMode</a></strong>()</code><br></td>
+ <td class="colLast"><code><strong><a
href="#isInClosure()">isInClosure</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
- <td
class="colLast"><code>public java.io.InputStream</code></td>
- <td class="colLast"><code><strong><a
href="#parse()">parse</a></strong>()</code><br></td>
+ <td
class="colLast"><code>public boolean</code></td>
+ <td class="colLast"><code><strong><a
href="#isModelFieldsMode()">isModelFieldsMode</a></strong>()</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
- <td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setClassName(java.lang.String)">setClassName</a></strong>(java.lang.String
className)</code><br></td>
+ <td
class="colLast"><code>public java.io.InputStream</code></td>
+ <td class="colLast"><code><strong><a
href="#parse()">parse</a></strong>()</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setEnableGrailsLayoutProcessing(boolean)">setEnableGrailsLayoutProcessing</a></strong>(boolean
enableGrailsLayoutProcessing)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setClassName(java.lang.String)">setClassName</a></strong>(java.lang.String
className)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setExpressionCodecDirectiveValue(java.lang.String)">setExpressionCodecDirectiveValue</a></strong>(java.lang.String
expressionCodecDirectiveValue)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setEnableGrailsLayoutProcessing(boolean)">setEnableGrailsLayoutProcessing</a></strong>(boolean
enableGrailsLayoutProcessing)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setKeepGeneratedDirectory(java.io.File)">setKeepGeneratedDirectory</a></strong>(java.io.File
keepGeneratedDirectory)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setExpressionCodecDirectiveValue(java.lang.String)">setExpressionCodecDirectiveValue</a></strong>(java.lang.String
expressionCodecDirectiveValue)</code><br></td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setLastModified(long)">setLastModified</a></strong>(long
lastModified)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setKeepGeneratedDirectory(java.io.File)">setKeepGeneratedDirectory</a></strong>(java.io.File
keepGeneratedDirectory)</code><br></td>
</tr>
<tr class="rowColor">
@@ -543,22 +543,29 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setStaticCodecDirectiveValue(java.lang.String)">setStaticCodecDirectiveValue</a></strong>(java.lang.String
staticCodecDirectiveValue)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setSourceChecksum(java.lang.String)">setSourceChecksum</a></strong>(java.lang.String
sourceChecksum)</code><br>Records a checksum of the GSP source, emitted as the
<CODE>SOURCE_CHECKSUM</CODE> constant so that the
+ runtime can detect an edited source without depending on its modification
time.</td>
</tr>
<tr class="altColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#setTaglibCodecDirectiveValue(java.lang.String)">setTaglibCodecDirectiveValue</a></strong>(java.lang.String
taglibCodecDirectiveValue)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setStaticCodecDirectiveValue(java.lang.String)">setStaticCodecDirectiveValue</a></strong>(java.lang.String
staticCodecDirectiveValue)</code><br></td>
</tr>
<tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
- <td class="colLast"><code><strong><a
href="#writeHtmlParts(java.io.File)">writeHtmlParts</a></strong>(java.io.File
filename)</code><br></td>
+ <td class="colLast"><code><strong><a
href="#setTaglibCodecDirectiveValue(java.lang.String)">setTaglibCodecDirectiveValue</a></strong>(java.lang.String
taglibCodecDirectiveValue)</code><br></td>
</tr>
<tr class="altColor">
+ <td class="colFirst"><code></code></td>
+ <td
class="colLast"><code>public void</code></td>
+ <td class="colLast"><code><strong><a
href="#writeHtmlParts(java.io.File)">writeHtmlParts</a></strong>(java.io.File
filename)</code><br></td>
+ </tr>
+
+ <tr class="rowColor">
<td class="colFirst"><code></code></td>
<td
class="colLast"><code>public void</code></td>
<td class="colLast"><code><strong><a
href="#writeLineNumbers(java.io.File)">writeLineNumbers</a></strong>(java.io.File
filename)</code><br></td>
@@ -709,26 +716,26 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
</li>
</ul>
- <a name="CONSTANT_NAME_LAST_MODIFIED"><!-- --></a>
+ <a name="CONSTANT_NAME_MODEL_FIELDS_MODE"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
-
<h4>public static final java.lang.String
<strong>CONSTANT_NAME_LAST_MODIFIED</strong></h4>
+
<h4>public static final java.lang.String
<strong>CONSTANT_NAME_MODEL_FIELDS_MODE</strong></h4>
<p></p>
</li>
</ul>
- <a name="CONSTANT_NAME_MODEL_FIELDS_MODE"><!-- --></a>
+ <a name="CONSTANT_NAME_OUT_CODEC"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
-
<h4>public static final java.lang.String
<strong>CONSTANT_NAME_MODEL_FIELDS_MODE</strong></h4>
+
<h4>public static final java.lang.String
<strong>CONSTANT_NAME_OUT_CODEC</strong></h4>
<p></p>
</li>
</ul>
- <a name="CONSTANT_NAME_OUT_CODEC"><!-- --></a>
+ <a name="CONSTANT_NAME_SOURCE_CHECKSUM"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
-
<h4>public static final java.lang.String
<strong>CONSTANT_NAME_OUT_CODEC</strong></h4>
+
<h4>public static final java.lang.String
<strong>CONSTANT_NAME_SOURCE_CHECKSUM</strong></h4>
<p></p>
</li>
</ul>
@@ -858,6 +865,23 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
</a>
<h3>Method Detail</h3>
+ <a name="checksumOf(byte[])"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public static java.lang.String
<strong>checksumOf</strong>(byte[] source)</h4>
+ <p> Computes the checksum recorded in the
<CODE>SOURCE_CHECKSUM</CODE> constant of a generated page.
+ <p>
+ Both the compiler that writes the constant and the runtime that compares
against it use this method, so
+ that the two can never disagree on how a GSP source is digested.
+ <p>
+ The argument must be the <strong>raw stored bytes</strong> of the page,
exactly as they sit on disk or in
+ the jar entry — not the decoded, re-encoded or otherwise decorated source the
runtime parse path works
+ with. That is the invariant that lets a checksum taken at compile time be
compared against one taken by
+ re-reading the resource at reload time.
+ <DL><DT><B>Parameters:</B></DT><DD><code>source</code> - the raw bytes
of the GSP source</DD></DL><DL><DT><B>Returns:</B></DT><DD>the checksum as a
lower-case hex string</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+ </li>
+ </ul>
+
<a name="flushTagBuffering()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -963,14 +987,6 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
</li>
</ul>
- <a name="getLastModified()"><!-- --></a>
- <ul class="blockListLast">
- <li class="blockList">
- <h4>public long
<strong>getLastModified</strong>()</h4>
- <p></p>
- </li>
- </ul>
-
<a name="getLineNumberMatrix()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -1003,6 +1019,15 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
</li>
</ul>
+ <a name="getSourceChecksum()"><!-- --></a>
+ <ul class="blockListLast">
+ <li class="blockList">
+ <h4>public java.lang.String
<strong>getSourceChecksum</strong>()</h4>
+ <p>
+ <DL><DT><B>Returns:</B></DT><DD>a checksum of the GSP source this page
was generated from, or <CODE>null</CODE> if none was
recorded</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
+ </li>
+ </ul>
+
<a name="getStaticCodecDirectiveValue()"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
@@ -1083,27 +1108,29 @@ implements <a
href='../../../../org/grails/gsp/compiler/Tokens.html'>Tokens</a><
</li>
</ul>
- <a name="setLastModified(long)"><!-- --></a>
+ <a
name="setOutCodecDirectiveValue(java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public void
<strong>setLastModified</strong>(long lastModified)</h4>
+ <h4>public void
<strong>setOutCodecDirectiveValue</strong>(java.lang.String
outCodecDirectiveValue)</h4>
<p></p>
</li>
</ul>
- <a
name="setOutCodecDirectiveValue(java.lang.String)"><!-- --></a>
+ <a name="setPackageName(java.lang.String)"><!-- --></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public void
<strong>setOutCodecDirectiveValue</strong>(java.lang.String
outCodecDirectiveValue)</h4>
+ <h4>public void
<strong>setPackageName</strong>(java.lang.String packageName)</h4>
<p></p>
</li>
</ul>
- <a name="setPackageName(java.lang.String)"><!-- --></a>
+ <a name="setSourceChecksum(java.lang.String)"><!--
--></a>
<ul class="blockListLast">
<li class="blockList">
- <h4>public void
<strong>setPackageName</strong>(java.lang.String packageName)</h4>
- <p></p>
+ <h4>public void
<strong>setSourceChecksum</strong>(java.lang.String sourceChecksum)</h4>
+ <p> Records a checksum of the GSP source,
emitted as the <CODE>SOURCE_CHECKSUM</CODE> constant so that the
+ runtime can detect an edited source without depending on its modification
time.
+ <DL><DT><B>Parameters:</B></DT><DD><code>sourceChecksum</code> - the
checksum, or <CODE>null</CODE> to record
none</DD></DL><DL><DT><B>Since:</B></DT><DD>8.0.0</DD></DL></p>
</li>
</ul>
diff --git a/docs/snapshot/grails-data/developer-manual/gettingStarted.html
b/docs/snapshot/grails-data/developer-manual/gettingStarted.html
index f89c0c36566..6c50c9e2710 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 a636b8edfdc..c346e9e346e 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 e6d7c1367aa..d39184b76eb 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 2cadd3c507d..bafbfbdaded 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 1b79c48ddcd..3a8e21e732c 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 6fbba3d92f5..b8163c1a8ef 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 352b68cef15..c1e1eaddd15 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 d27e1f5bd48..fffaeef1cd1 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 a07e0f8fac8..ffe5f5c6ca8 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 58f2b5d7c25..c336273f3ad 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 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 6e5b17cba65..73028c30daf 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/grails-data/whats-new-manual/index.html
b/docs/snapshot/grails-data/whats-new-manual/index.html
index 6e132f65d92..c10acf605c3 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-21 11:01:52 UTC
+Last updated 2026-08-21 13:34:32 UTC
</div>
</div>
</body>
diff --git a/docs/snapshot/guide/single.html b/docs/snapshot/guide/single.html
index c3c74d15710..936dc54ef84 100644
--- a/docs/snapshot/guide/single.html
+++ b/docs/snapshot/guide/single.html
@@ -6512,6 +6512,47 @@ from the CAS plugin, so enabling
<code>cas.useSingleSignout</code> now has the d
<p>The Spring Security CAS configuration reference in this guide documents the
setting in full.</p>
</div>
</div>
+<div class="sect3">
+<h4 id="_49_gsps_record_a_source_checksum_instead_of_a_modification_time">49.
GSPs Record a Source Checksum Instead of a Modification Time</h4>
+<div class="paragraph">
+<p>A GSP used to carry the modification time of its <code>.gsp</code> source,
precompiled pages baking it into the
+generated class as a <code>LAST_MODIFIED</code> constant. Git stores no
modification times, so every fresh clone or CI
+checkout gave each source a new one, and the generated classes differed on
every checkout even when the
+sources were byte-for-byte identical. Because <code>LAST_MODIFIED</code> was a
compile-time constant it was part of the
+class’s ABI, so the difference survived even Gradle’s
compile-classpath normalization and every task
+downstream of a jar containing precompiled GSPs missed the build cache.</p>
+</div>
+<div class="paragraph">
+<p>Grails 8 records a <code>SOURCE_CHECKSUM</code> of the page source instead,
for pages compiled at build time and at
+runtime alike. Identical sources now compile to identical bytes on every
machine.</p>
+</div>
+<div class="paragraph">
+<p>Runtime reloading, described in
+<a href="#makingChangesToADeployedApplication">Making Changes to a Deployed
Application</a>, is unaffected: a page is
+reloaded when its source no longer matches the recorded checksum. Detection is
more accurate than it was.
+An edit is caught whenever the source’s modification time or length
moves, which any ordinary save does;
+previously a save landing within the old granularity window went unnoticed
until a later edit moved it
+clear. In the other direction, a page whose modification time moves without
its content changing is no
+longer recompiled, so touching a file — or a build step copying views into
place — no longer reloads pages
+that did not actually change. If you were using <code>touch</code> to force a
page to recompile, edit the page instead.</p>
+</div>
+<div class="paragraph">
+<p><strong>Removed API.</strong>
<code>GroovyPageMetaInfo.getLastModified()</code>,
<code>setLastModified(long)</code> and
+<code>applyLastModifiedFromResource(Resource)</code> are gone, as are
<code>GroovyPageParser.getLastModified()</code> and
+<code>setLastModified(long)</code>. Use
<code>GroovyPageMetaInfo.getSourceChecksum()</code> to identify the source a
page was
+compiled from. Generated page classes no longer declare a
<code>LAST_MODIFIED</code> constant.</p>
+</div>
+<div class="paragraph">
+<p><strong>Removed setting.</strong>
<code>grails.gsp.reload.granularity</code> is gone. It existed to absorb
rounding differences
+between modification times, which comparing content does not need; setting it
now has no effect.
+<code>grails.gsp.reload.interval</code> is unchanged.</p>
+</div>
+<div class="paragraph">
+<p>A GSP precompiled by Grails 7 and shipped inside a binary plugin carries no
checksum. Such a page is served
+normally; it is simply never reload-checked, which was already the case for
views resolved out of a plugin
+jar.</p>
+</div>
+</div>
</div>
@@ -22097,19 +22138,17 @@ cp -R grails-app/views/*
/var/www/grails/my-app/grails-app/views</pre>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">grails.gsp.reload.interval</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">interval
between checking the lastmodified time of the gsp source file, unit is
milliseconds</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">interval
between checks of the gsp source file, unit is milliseconds</p></td>
<td class="tableblock halign-left valign-top"><p
class="tableblock">5000</p></td>
</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">grails.gsp.reload.granularity</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">the number
of milliseconds leeway to give before deciding a file is out of date. this is
needed because different roundings usually cause a 1000ms difference in
lastmodified times</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">1000</p></td>
-</tr>
</tbody>
</table>
<div class="paragraph">
<p>GSP reloading is supported for precompiled GSPs since Grails 1.3.5.</p>
</div>
+<div class="paragraph">
+<p>A GSP records a checksum of the page it was compiled from, and is reloaded
when the source no longer matches that checksum. Comparing content rather than
modification times means a page that was copied or checked out afresh — and so
carries a new modification time but the same content — is not needlessly
recompiled, and an edit is detected however close together two writes fall.
Precompiled and runtime-compiled pages are compared the same way.</p>
+</div>
<a name="7.3 Tag Libraries"><!-- Legacy link --></a>
<h2 id="taglibs">8.2.7 Tag Libraries</h2>
diff --git a/docs/snapshot/guide/theWebLayer.html
b/docs/snapshot/guide/theWebLayer.html
index d2cb914242a..390cd2e30e6 100644
--- a/docs/snapshot/guide/theWebLayer.html
+++ b/docs/snapshot/guide/theWebLayer.html
@@ -4784,19 +4784,17 @@ cp -R grails-app/views/*
/var/www/grails/my-app/grails-app/views</pre>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><p
class="tableblock">grails.gsp.reload.interval</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">interval
between checking the lastmodified time of the gsp source file, unit is
milliseconds</p></td>
+<td class="tableblock halign-left valign-top"><p class="tableblock">interval
between checks of the gsp source file, unit is milliseconds</p></td>
<td class="tableblock halign-left valign-top"><p
class="tableblock">5000</p></td>
</tr>
-<tr>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">grails.gsp.reload.granularity</p></td>
-<td class="tableblock halign-left valign-top"><p class="tableblock">the number
of milliseconds leeway to give before deciding a file is out of date. this is
needed because different roundings usually cause a 1000ms difference in
lastmodified times</p></td>
-<td class="tableblock halign-left valign-top"><p
class="tableblock">1000</p></td>
-</tr>
</tbody>
</table>
<div class="paragraph">
<p>GSP reloading is supported for precompiled GSPs since Grails 1.3.5.</p>
</div>
+<div class="paragraph">
+<p>A GSP records a checksum of the page it was compiled from, and is reloaded
when the source no longer matches that checksum. Comparing content rather than
modification times means a page that was copied or checked out afresh — and so
carries a new modification time but the same content — is not needlessly
recompiled, and an edit is detected however close together two writes fall.
Precompiled and runtime-compiled pages are compared the same way.</p>
+</div>
<a name="7.3 Tag Libraries"><!-- Legacy link --></a>
<h2 id="taglibs">8.2.7 Tag Libraries</h2>
diff --git a/docs/snapshot/guide/upgrading.html
b/docs/snapshot/guide/upgrading.html
index 7e8dd7f5fbf..b73ef5a3564 100644
--- a/docs/snapshot/guide/upgrading.html
+++ b/docs/snapshot/guide/upgrading.html
@@ -3999,6 +3999,47 @@ from the CAS plugin, so enabling
<code>cas.useSingleSignout</code> now has the d
<p>The Spring Security CAS configuration reference in this guide documents the
setting in full.</p>
</div>
</div>
+<div class="sect3">
+<h4 id="_49_gsps_record_a_source_checksum_instead_of_a_modification_time">49.
GSPs Record a Source Checksum Instead of a Modification Time</h4>
+<div class="paragraph">
+<p>A GSP used to carry the modification time of its <code>.gsp</code> source,
precompiled pages baking it into the
+generated class as a <code>LAST_MODIFIED</code> constant. Git stores no
modification times, so every fresh clone or CI
+checkout gave each source a new one, and the generated classes differed on
every checkout even when the
+sources were byte-for-byte identical. Because <code>LAST_MODIFIED</code> was a
compile-time constant it was part of the
+class’s ABI, so the difference survived even Gradle’s
compile-classpath normalization and every task
+downstream of a jar containing precompiled GSPs missed the build cache.</p>
+</div>
+<div class="paragraph">
+<p>Grails 8 records a <code>SOURCE_CHECKSUM</code> of the page source instead,
for pages compiled at build time and at
+runtime alike. Identical sources now compile to identical bytes on every
machine.</p>
+</div>
+<div class="paragraph">
+<p>Runtime reloading, described in
+<a href="#makingChangesToADeployedApplication">Making Changes to a Deployed
Application</a>, is unaffected: a page is
+reloaded when its source no longer matches the recorded checksum. Detection is
more accurate than it was.
+An edit is caught whenever the source’s modification time or length
moves, which any ordinary save does;
+previously a save landing within the old granularity window went unnoticed
until a later edit moved it
+clear. In the other direction, a page whose modification time moves without
its content changing is no
+longer recompiled, so touching a file — or a build step copying views into
place — no longer reloads pages
+that did not actually change. If you were using <code>touch</code> to force a
page to recompile, edit the page instead.</p>
+</div>
+<div class="paragraph">
+<p><strong>Removed API.</strong>
<code>GroovyPageMetaInfo.getLastModified()</code>,
<code>setLastModified(long)</code> and
+<code>applyLastModifiedFromResource(Resource)</code> are gone, as are
<code>GroovyPageParser.getLastModified()</code> and
+<code>setLastModified(long)</code>. Use
<code>GroovyPageMetaInfo.getSourceChecksum()</code> to identify the source a
page was
+compiled from. Generated page classes no longer declare a
<code>LAST_MODIFIED</code> constant.</p>
+</div>
+<div class="paragraph">
+<p><strong>Removed setting.</strong>
<code>grails.gsp.reload.granularity</code> is gone. It existed to absorb
rounding differences
+between modification times, which comparing content does not need; setting it
now has no effect.
+<code>grails.gsp.reload.interval</code> is unchanged.</p>
+</div>
+<div class="paragraph">
+<p>A GSP precompiled by Grails 7 and shipped inside a binary plugin carries no
checksum. Such a page is served
+normally; it is simply never reload-checked, which was already the case for
views resolved out of a plugin
+jar.</p>
+</div>
+</div>
</div>