codeconsole opened a new pull request, #16410: URL: https://github.com/apache/grails-core/pull/16410
Bumps `spring-boot-starter-sitemesh` / `spring-webmvc-sitemesh` from `3.3.0-RC1` to `3.3.0-RC2`. ### Why **RC2 makes decorated output cheaper to write.** `SiteMeshView` writes the decorated page chunk by chunk, and each chunk went through `Writer.append(CharSequence)`, which copies it into a `String` first (Tomcat's `CoyoteWriter` and Jetty's `ResponseWriter` both inherit that). RC2 writes the chunks straight from their backing arrays. On a 50 KB page (JMH, JDK 17) the write step is 3.7× faster and allocation per decorated request drops 34% for ASCII and 47% for non-Latin-1 text. This is the path GSP layouts take in the view-resolver integration. **RC2 binds the starter's mode properties as enums.** `sitemesh.view-resolver.wrap-mode` (the kebab-case key IDEs suggest) and upper-case values such as `BEAN_INSTANCE` were ignored by the starter's conditions, silently registering the wrong resolver or none; an unknown `sitemesh.integration` value switched SiteMesh off without a word. Both now bind like `SiteMeshProperties`, and an invalid value fails startup. Grails' own view-resolver post-processors still take priority through the starter's extension contract, as before. ### Also in RC2 - Content written through the output stream (filter integration, static files) is decoded as UTF-8 when it declares no charset and written back in that same charset; on Tomcat it had been re-encoded as ISO-8859-1, turning non-Latin-1 text into `?`. It is also decoded once instead of twice, and buffered with bulk copies (write plus decode of a 16 KB page −87%). - `setTagRuleBundles(...)` now replaces the default bundles, as documented (Grails does not call it). - Configuration fixes across XML, init-params and the Spring Boot properties; see the [release notes](https://github.com/sitemesh/sitemesh3/releases/tag/3.3.0-RC2). ### Follow-up, not in this PR `Sitemesh3GrailsPlugin` is gated by `@ConditionalOnProperty(name = 'sitemesh.integration', havingValue = 'view-resolver', matchIfMissing = true)`, a string comparison. Since RC2 binds `sitemesh.integration` as an enum, a non-canonical spelling such as `VIEW_RESOLVER` or `viewResolver` now enables the starter's view-resolver integration but not the plugin's configuration. The canonical `view-resolver`, and leaving it unset, behave exactly as before. ### Verification (against the released Central artifact) - `validateDependencyVersions` across all modules: green, with 3.3.0-RC2 resolved from Maven Central through the BOM constraint - `:grails-sitemesh3:test`: 86 tests green (forced rerun) - `:grails-test-examples-gsp-sitemesh3:check`: 21 integration tests green (forced rerun), covering forced layouts, decorator chaining, JSP, plain text, and error-page decoration -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
