You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@grails.apache.org by bo...@apache.org on 2026/10/20 00:46:53 UTC

(grails-core) branch groovyism/runtime-small created (now d79d893557)

This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a change to branch groovyism/runtime-small
in repository https://gitbox.apache.org/repos/asf/grails-core.git


      at d79d893557 Merge branch 'refactor/java-to-groovy-runtime-small' into groovyism/runtime-small

This branch includes the following new commits:

     new f8c8d3a27e refactor(runtime-small): make the datasource/logging/quartz/startup-progress conversion idiomatic
     new 1224c762d7 Merge branch 'refactor/java-to-groovy-runtime-small' into groovyism/runtime-small
     new d79d893557 Merge branch 'refactor/java-to-groovy-runtime-small' into groovyism/runtime-small

The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(grails-core) 01/03: refactor(runtime-small): make the datasource/logging/quartz/startup-progress conversion idiomatic

Posted by bo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch groovyism/runtime-small
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit f8c8d3a27e989d0a389bc3f5eb853a622d2af426
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Fri Oct 16 19:26:13 2026 -0500

    refactor(runtime-small): make the datasource/logging/quartz/startup-progress conversion idiomatic
    
    Idiomatic-Groovy pass over the Java-to-Groovy conversion output for
    grails-datasource, grails-logging, grails-quartz and grails-startup-progress.
    Behaviour-preserving only: no public API, no test-visible behaviour change
    except where noted.
    
    Applied:
    - Property syntax for getters/setters without an isX/getX collision: ~90 sites
      (Connection.readOnly, Trigger.jobKey/startTime, JobDetail.key, GrailsJobClass
      group/concurrent/durability/requestsRecovery/description/fullName, Method
      parameterTypes/name, HttpServletRequest/Response, HttpExchange, FilterRegistrationBean,
      ConfigurableApplicationContext/WebServerApplicationContext/ConfigurableListableBeanFactory,
      StartupProgress phase/reporting, StartupStep name/id/parentId/tags, BeanDefinition
      singleton/abstract/lazyInit, InetAddress anyLocalAddress/hostAddress, Throwable
      cause/message, Class name).
    - String `.equals(` -> `==`: ~20 sites (job group/description defaults via Groovy
      truth, request methods, tag-key comparisons, status/report path comparisons).
    - `==`-equality for reference checks and `in` for `Collection`/array membership:
      a handful of sites (StartupProgress bean-name tracking, StartupProgressPage's
      format=json query check).
    - Null-check -> truthy where the type is a non-falsy bean/closure/object
      (JobDetail, Closure, JobExecutionException, PersistenceContextInterceptor,
      BeanCreationStep/TaskStep `enclosing`), never where the type is a falsy
      String/Collection/Number/Boolean.
    - Flow-typed instanceof narrowing to drop a redundant cast (ConfigurableApplicationContext
      in StartupProgressRunListener.ready(), InvocationTargetException's targetException
      in GrailsJobFactory).
    - Collection literals and `<<` for statement-position adds (`List<String> kept = []`,
      `names << name`, `commandLine << address.toString()`, `kept << parameter`).
    - GString instead of `+` concatenation into a String-typed log message slot
      (ExceptionPrinterJobListener, SessionBinderJobListener).
    - `value?.toString()` for the null-collapsing ternary in Quartz's StringEditor.
    
    Deliberately left (Tier B exclusions / out of scope):
    - LoggingTransformer.groovy: kept `classNode.getNodeMetaData(Slf4j) != null` and
      `logField != null` as explicit null checks rather than Groovy truth, per the
      file's own caution about AST-node comparisons; `getField`/`getNodeMetaData`/
      `putNodeMetaData` kept as calls (parameterized, not simple accessors).
    - DefaultGrailsJobClass.execute()/execute(JobExecutionContext): left the
      `getMetaClass().invokeMethod(getReferenceInstance(), ...)` dynamic dispatch
      untouched; it is the documented, intentional reason the class is `@POJO`.
    - DefaultGrailsJobClass.isConcurrent/isSessionRequired/isDurability/
      isRequestsRecovery/isEnabled and JobDetailFactoryBean's `name`/`group` null
      checks: kept the explicit `== null` ternary/ifs, since the value is a Boolean
      or String where Elvis/truthy would also treat a legitimate `false`/`""` as
      "absent".
    - CustomTriggerFactoryBean/JobDetailFactoryBean/SessionBinderJobListener's
      private-field setters (`setJobDetail`, `setTriggerClass`, `setJobClass`,
      `setApplicationName`, `setPersistenceInterceptor`/`getPersistenceInterceptor`):
      left as explicit methods rather than bare properties, since converting would
      add a public getter that was not there before (API-surface change), or (for
      the Javadoc'd session-binder pair) drop the method-level Javadoc.
    - StartupProgressProperties.groovy: left every getX/setX pair untouched; each
      carries explanatory Javadoc, and the class is bound by Spring Boot
      `@ConfigurationProperties` reflection, where touching the accessors is not
      worth the risk for a style-only pass.
    - Files already idiomatic, so unchanged: ReadOnlyDriverManagerDataSourceSpec,
      LoggingTransformerSkipSpec, GrailsJobClass, GrailsJobClassConstants,
      GrailsJobClassConstantsSpec, ExceptionPrinterJobListenerSpec,
      SessionBinderJobListenerSpec, StartupProgressLifecycle,
      StartupProgressProperties, StartupProgressSpec.
    
    Tests: added one gap-filling case to DefaultGrailsJobClassEdgeCasesSpec
    ("a missing or blank group falls back to the default"), mirroring the
    existing blank-description case, since the `!group` Groovy-truth rewrite
    needed coverage for the blank-string branch that the out-of-scope
    DefaultGrailsJobClassSpec does not exercise. No other test changed.
    
    Verification: compileGroovy/compileTestGroovy and full `test` green for all
    four modules (grails-datasource, grails-logging, grails-quartz,
    grails-startup-progress), StartupProgressSpec run twice with zero failures
    both times; codeStyle (checkstyle + CodeNarc) clean for all four modules;
    javap dynamic-dispatch audit clean on every changed class, including the
    `@POJO` DefaultGrailsJobClass (no `implements GroovyObject`, no
    setGroovyObjectProperty/getGroovyObjectProperty/invokeMethodN introduced; the
    one pre-existing invokeMethod call is the untouched execute() dispatch).
    
    Co-Authored-By: Claude Sonnet 5 <no...@anthropic.com>
---
 .../ReadOnlyDriverManagerDataSource.groovy         |  2 +-
 .../compiler/logging/LoggingTransformer.groovy     | 12 +++----
 .../plugins/quartz/CustomTriggerFactoryBean.groovy | 10 +++---
 .../plugins/quartz/DefaultGrailsJobClass.groovy    | 14 ++++----
 .../grails/plugins/quartz/GrailsJobFactory.groovy  | 22 ++++++------
 .../plugins/quartz/JobDetailFactoryBean.groovy     | 12 +++----
 .../listeners/ExceptionPrinterJobListener.groovy   |  4 +--
 .../listeners/SessionBinderJobListener.groovy      |  8 ++---
 .../DefaultGrailsJobClassEdgeCasesSpec.groovy      | 22 ++++++++++++
 .../org/apache/grails/startup/StartupAccess.groovy |  4 +--
 .../apache/grails/startup/StartupBrowser.groovy    |  2 +-
 .../apache/grails/startup/StartupProgress.groovy   | 10 +++---
 .../StartupProgressApplicationStartup.groovy       | 28 +++++++--------
 .../grails/startup/StartupProgressFilter.groovy    | 20 +++++------
 .../grails/startup/StartupProgressPage.groovy      |  8 ++---
 .../grails/startup/StartupProgressResponder.groovy | 16 ++++-----
 .../startup/StartupProgressRunListener.groovy      | 42 +++++++++++-----------
 .../grails/startup/StartupProgressServer.groovy    | 22 ++++++------
 18 files changed, 139 insertions(+), 119 deletions(-)

diff --git a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/ReadOnlyDriverManagerDataSource.groovy b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/ReadOnlyDriverManagerDataSource.groovy
index 9398392bee..ec500ced6b 100644
--- a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/ReadOnlyDriverManagerDataSource.groovy
+++ b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/ReadOnlyDriverManagerDataSource.groovy
@@ -35,7 +35,7 @@ class ReadOnlyDriverManagerDataSource extends DriverManagerDataSource {
     @Override
     protected Connection getConnectionFromDriverManager(final String url, final Properties props) throws SQLException {
         Connection connection = super.getConnectionFromDriverManager(url, props)
-        connection.setReadOnly(true)
+        connection.readOnly = true
         return connection
     }
 
diff --git a/grails-logging/src/main/groovy/org/grails/compiler/logging/LoggingTransformer.groovy b/grails-logging/src/main/groovy/org/grails/compiler/logging/LoggingTransformer.groovy
index e756871ca9..8b0840a36e 100644
--- a/grails-logging/src/main/groovy/org/grails/compiler/logging/LoggingTransformer.groovy
+++ b/grails-logging/src/main/groovy/org/grails/compiler/logging/LoggingTransformer.groovy
@@ -58,29 +58,29 @@ class LoggingTransformer implements AllArtefactClassInjector {
     @Override
     void performInjectionOnAnnotatedClass(SourceUnit source, ClassNode classNode) {
         if (classNode.getNodeMetaData(Slf4j) != null) return
-        String packageName = Slf4j.getPackage().getName()
+        String packageName = Slf4j.package.name
 
         // if already annotated skip
-        for (AnnotationNode annotationNode in classNode.getAnnotations()) {
-            if (annotationNode.getClassNode().getPackageName().equals(packageName)) {
+        for (AnnotationNode annotationNode in classNode.annotations) {
+            if (annotationNode.classNode.packageName == packageName) {
                 return
             }
         }
 
         FieldNode logField = classNode.getField('log')
         if (logField != null) {
-            if (!Modifier.isPrivate(logField.getModifiers())) {
+            if (!Modifier.isPrivate(logField.modifiers)) {
                 return
             }
         }
 
-        if (classNode.getSuperClass().getName().equals('grails.boot.config.GrailsAutoConfiguration')) {
+        if (classNode.superClass.name == 'grails.boot.config.GrailsAutoConfiguration') {
             return
         }
 
         AnnotationNode annotationNode = new AnnotationNode(ClassHelper.make(Slf4j))
         LogASTTransformation logASTTransformation = new LogASTTransformation()
-        logASTTransformation.setCompilationUnit(new CompilationUnit(new GroovyClassLoader(getClass().getClassLoader())))
+        logASTTransformation.compilationUnit = new CompilationUnit(new GroovyClassLoader(getClass().classLoader))
         logASTTransformation.visit([annotationNode, classNode] as ASTNode[], source)
         classNode.putNodeMetaData(Slf4j, annotationNode)
     }
diff --git a/grails-quartz/src/main/groovy/grails/plugins/quartz/CustomTriggerFactoryBean.groovy b/grails-quartz/src/main/groovy/grails/plugins/quartz/CustomTriggerFactoryBean.groovy
index 7c2b33cf2f..a5af828b70 100644
--- a/grails-quartz/src/main/groovy/grails/plugins/quartz/CustomTriggerFactoryBean.groovy
+++ b/grails-quartz/src/main/groovy/grails/plugins/quartz/CustomTriggerFactoryBean.groovy
@@ -52,16 +52,16 @@ class CustomTriggerFactoryBean implements FactoryBean<Trigger>, InitializingBean
             AbstractTrigger at = (AbstractTrigger) customTrigger
 
             // Set job details
-            if (jobDetail != null) {
-                at.setJobKey(jobDetail.getKey())
+            if (jobDetail) {
+                at.jobKey = jobDetail.key
             }
 
             // Set start delay
             if (triggerAttributes.containsKey(GrailsJobClassConstants.START_DELAY)) {
                 Number startDelay = (Number) triggerAttributes.remove(GrailsJobClassConstants.START_DELAY)
-                at.setStartTime(new Date(System.currentTimeMillis() + startDelay.longValue()))
+                at.startTime = new Date(System.currentTimeMillis() + startDelay.longValue())
             } else {
-                at.setStartTime(new Date())
+                at.startTime = new Date()
             }
         }
 
@@ -117,7 +117,7 @@ class StringEditor extends PropertyEditorSupport {
 
     @Override
     void setValue(Object value) {
-        super.setValue(value == null ? null : value.toString())
+        super.setValue(value?.toString())
     }
 
     @Override
diff --git a/grails-quartz/src/main/groovy/grails/plugins/quartz/DefaultGrailsJobClass.groovy b/grails-quartz/src/main/groovy/grails/plugins/quartz/DefaultGrailsJobClass.groovy
index 0d0de48058..e04d39ef4c 100644
--- a/grails-quartz/src/main/groovy/grails/plugins/quartz/DefaultGrailsJobClass.groovy
+++ b/grails-quartz/src/main/groovy/grails/plugins/quartz/DefaultGrailsJobClass.groovy
@@ -66,13 +66,13 @@ class DefaultGrailsJobClass extends AbstractGrailsClass implements GrailsJobClas
 
     private void evaluateTriggers() {
         // registering additional triggersClosure from 'triggersClosure' closure if present
-        Closure triggersClosure = (Closure) GrailsClassUtils.getStaticPropertyValue(getClazz(), 'triggers')
+        Closure triggersClosure = (Closure) GrailsClassUtils.getStaticPropertyValue(clazz, 'triggers')
 
-        TriggersConfigBuilder builder = new TriggersConfigBuilder(getFullName(), grailsApplication)
+        TriggersConfigBuilder builder = new TriggersConfigBuilder(fullName, grailsApplication)
 
-        if (triggersClosure != null) {
+        if (triggersClosure) {
             builder.build(triggersClosure)
-            triggers = (Map) builder.getTriggers()
+            triggers = (Map) builder.triggers
         }
         triggersEvaluated = true
     }
@@ -87,7 +87,7 @@ class DefaultGrailsJobClass extends AbstractGrailsClass implements GrailsJobClas
 
     String getGroup() {
         String group = getStaticPropertyValue(GROUP, String)
-        if (group == null || ''.equals(group)) return DEFAULT_GROUP
+        if (!group) return DEFAULT_GROUP
         return group
     }
 
@@ -118,12 +118,12 @@ class DefaultGrailsJobClass extends AbstractGrailsClass implements GrailsJobClas
 
     String getDescription() {
         String description = (String) getPropertyOrStaticPropertyOrFieldValue(DESCRIPTION, String)
-        if (description == null || ''.equals(description)) return DEFAULT_DESCRIPTION
+        if (!description) return DEFAULT_DESCRIPTION
         return description
     }
 
     Map getTriggers() {
-        if (triggersEvaluated == false) {
+        if (!triggersEvaluated) {
             evaluateTriggers()
         }
         return triggers
diff --git a/grails-quartz/src/main/groovy/grails/plugins/quartz/GrailsJobFactory.groovy b/grails-quartz/src/main/groovy/grails/plugins/quartz/GrailsJobFactory.groovy
index 0897a43921..efe6aad6df 100644
--- a/grails-quartz/src/main/groovy/grails/plugins/quartz/GrailsJobFactory.groovy
+++ b/grails-quartz/src/main/groovy/grails/plugins/quartz/GrailsJobFactory.groovy
@@ -49,9 +49,7 @@ class GrailsJobFactory extends AdaptableJobFactory implements ApplicationContext
 
     @Override
     protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
-        String grailsJobName = (String) bundle.getJobDetail().getJobDataMap().get(
-                JobDetailFactoryBean.JOB_NAME_PARAMETER
-        )
+        String grailsJobName = (String) bundle.jobDetail.jobDataMap[JobDetailFactoryBean.JOB_NAME_PARAMETER]
         if (grailsJobName != null) {
             return new GrailsJob(applicationContext.getBean(grailsJobName))
         } else {
@@ -72,18 +70,18 @@ class GrailsJobFactory extends AdaptableJobFactory implements ApplicationContext
             this.job = job
 
             // Finds an execute method with zero or one parameter.
-            this.executeMethod = ReflectionUtils.findMethod(
+            executeMethod = ReflectionUtils.findMethod(
                     job.getClass(), GrailsJobClassConstants.EXECUTE, (Class<?>[]) null
             )
             if (executeMethod == null) {
                 throw new IllegalArgumentException(
                         MessageFormat.format(
                                 '{0} should declare #{1}() method',
-                                job.getClass().getName(), GrailsJobClassConstants.EXECUTE
+                                job.getClass().name, GrailsJobClassConstants.EXECUTE
                         )
                 )
             }
-            switch (executeMethod.getParameterTypes().length) {
+            switch (executeMethod.parameterTypes.length) {
                 case 0:
                     passExecutionContext = false
                     break
@@ -94,13 +92,13 @@ class GrailsJobFactory extends AdaptableJobFactory implements ApplicationContext
                     throw new IllegalArgumentException(
                             MessageFormat.format(
                                     '{0}#{1}() method should take either no arguments or one argument of type JobExecutionContext',
-                                    job.getClass().getName(), GrailsJobClassConstants.EXECUTE
+                                    job.getClass().name, GrailsJobClassConstants.EXECUTE
                             )
                     )
             }
 
             // Find interrupt method
-            this.interruptMethod = ReflectionUtils.findMethod(job.getClass(), GrailsJobClassConstants.INTERRUPT)
+            interruptMethod = ReflectionUtils.findMethod(job.getClass(), GrailsJobClassConstants.INTERRUPT)
         }
 
         // Execute Job
@@ -112,9 +110,9 @@ class GrailsJobFactory extends AdaptableJobFactory implements ApplicationContext
                     executeMethod.invoke(job)
                 }
             } catch (InvocationTargetException ite) {
-                Throwable targetException = ite.getTargetException()
+                Throwable targetException = ite.targetException
                 if (targetException instanceof JobExecutionException) {
-                    throw (JobExecutionException) targetException
+                    throw targetException
                 } else {
                     throw new JobExecutionException(targetException)
                 }
@@ -122,7 +120,7 @@ class GrailsJobFactory extends AdaptableJobFactory implements ApplicationContext
                 JobExecutionException criticalError = new JobExecutionException(
                         MessageFormat.format(
                                 'Cannot invoke {0}#{1}() method',
-                                job.getClass().getName(), executeMethod.getName()
+                                job.getClass().name, executeMethod.name
                         ),
                         iae
                 )
@@ -143,7 +141,7 @@ class GrailsJobFactory extends AdaptableJobFactory implements ApplicationContext
                 throw new UnableToInterruptJobException(
                         MessageFormat.format(
                                 '{0} does not declare an {1}() method, so it cannot be interrupted',
-                                job.getClass().getName(), GrailsJobClassConstants.INTERRUPT
+                                job.getClass().name, GrailsJobClassConstants.INTERRUPT
                         )
                 )
             }
diff --git a/grails-quartz/src/main/groovy/grails/plugins/quartz/JobDetailFactoryBean.groovy b/grails-quartz/src/main/groovy/grails/plugins/quartz/JobDetailFactoryBean.groovy
index 6cf7bf7053..861e25766e 100644
--- a/grails-quartz/src/main/groovy/grails/plugins/quartz/JobDetailFactoryBean.groovy
+++ b/grails-quartz/src/main/groovy/grails/plugins/quartz/JobDetailFactoryBean.groovy
@@ -70,28 +70,28 @@ class JobDetailFactoryBean implements FactoryBean<JobDetail>, InitializingBean {
      * @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
      */
     void afterPropertiesSet() {
-        String name = jobClass.getFullName()
+        String name = jobClass.fullName
         if (name == null) {
             throw new IllegalStateException('name is required')
         }
 
-        String group = jobClass.getGroup()
+        String group = jobClass.group
         if (group == null) {
             throw new IllegalStateException('group is required')
         }
 
         // Consider the concurrent flag to choose between stateful and stateless job.
         Class<? extends GrailsJobFactory.GrailsJob> clazz =
-                jobClass.isConcurrent() ? GrailsJobFactory.GrailsJob : GrailsJobFactory.StatefulGrailsJob
+                jobClass.concurrent ? GrailsJobFactory.GrailsJob : GrailsJobFactory.StatefulGrailsJob
 
         // Build JobDetail instance.
         JobBuilder builder =
                 newJob(clazz)
                         .withIdentity(name, group)
-                        .storeDurably(jobClass.isDurability())
-                        .requestRecovery(jobClass.isRequestsRecovery())
+                        .storeDurably(jobClass.durability)
+                        .requestRecovery(jobClass.requestsRecovery)
                         .usingJobData(JOB_NAME_PARAMETER, name)
-                        .withDescription(jobClass.getDescription())
+                        .withDescription(jobClass.description)
 
         if (applicationName != null) {
             builder.usingJobData(APPLICATION_NAME_PARAMETER, applicationName)
diff --git a/grails-quartz/src/main/groovy/grails/plugins/quartz/listeners/ExceptionPrinterJobListener.groovy b/grails-quartz/src/main/groovy/grails/plugins/quartz/listeners/ExceptionPrinterJobListener.groovy
index efade05687..2d95d95bcb 100644
--- a/grails-quartz/src/main/groovy/grails/plugins/quartz/listeners/ExceptionPrinterJobListener.groovy
+++ b/grails-quartz/src/main/groovy/grails/plugins/quartz/listeners/ExceptionPrinterJobListener.groovy
@@ -41,8 +41,8 @@ class ExceptionPrinterJobListener extends JobListenerSupport {
     }
 
     void jobWasExecuted(JobExecutionContext context, JobExecutionException exception) {
-        if (exception != null) {
-            LOG.error('Exception occurred in job: ' + context.getJobDetail().getDescription(), exception)
+        if (exception) {
+            LOG.error("Exception occurred in job: ${context.jobDetail.description}", exception)
         }
     }
 
diff --git a/grails-quartz/src/main/groovy/grails/plugins/quartz/listeners/SessionBinderJobListener.groovy b/grails-quartz/src/main/groovy/grails/plugins/quartz/listeners/SessionBinderJobListener.groovy
index 0f3e974116..7977e64dff 100644
--- a/grails-quartz/src/main/groovy/grails/plugins/quartz/listeners/SessionBinderJobListener.groovy
+++ b/grails-quartz/src/main/groovy/grails/plugins/quartz/listeners/SessionBinderJobListener.groovy
@@ -67,7 +67,7 @@ class SessionBinderJobListener extends JobListenerSupport {
      * Before job executing. Init persistence context.
      */
     void jobToBeExecuted(JobExecutionContext context) {
-        if (persistenceInterceptor != null) {
+        if (persistenceInterceptor) {
             persistenceInterceptor.init()
             LOG.debug('Persistence session is opened.')
         }
@@ -77,18 +77,18 @@ class SessionBinderJobListener extends JobListenerSupport {
      * After job executing. Flush and destroy persistence context.
      */
     void jobWasExecuted(JobExecutionContext context, JobExecutionException exception) {
-        if (persistenceInterceptor != null) {
+        if (persistenceInterceptor) {
             try {
                 persistenceInterceptor.flush()
                 persistenceInterceptor.clear()
                 LOG.debug('Persistence session is flushed.')
             } catch (Exception e) {
-                LOG.error('Failed to flush session after job: ' + context.getJobDetail().getDescription(), e)
+                LOG.error("Failed to flush session after job: ${context.jobDetail.description}", e)
             } finally {
                 try {
                     persistenceInterceptor.destroy()
                 } catch (Exception e) {
-                    LOG.error('Failed to finalize session after job: ' + context.getJobDetail().getDescription(), e)
+                    LOG.error("Failed to finalize session after job: ${context.jobDetail.description}", e)
                 }
             }
         }
diff --git a/grails-quartz/src/test/groovy/grails/plugins/quartz/DefaultGrailsJobClassEdgeCasesSpec.groovy b/grails-quartz/src/test/groovy/grails/plugins/quartz/DefaultGrailsJobClassEdgeCasesSpec.groovy
index 720b2974f3..e09e4fb7be 100644
--- a/grails-quartz/src/test/groovy/grails/plugins/quartz/DefaultGrailsJobClassEdgeCasesSpec.groovy
+++ b/grails-quartz/src/test/groovy/grails/plugins/quartz/DefaultGrailsJobClassEdgeCasesSpec.groovy
@@ -68,6 +68,28 @@ class DefaultGrailsJobClassEdgeCasesSpec extends Specification {
         !new DefaultGrailsJobClass(overriddenJob).enabled
     }
 
+    void 'a missing or blank group falls back to the default'() {
+        given:
+        Class missing = gcl.parseClass('class DgcMissingGroupJob { def execute(){} }')
+        Class blank = gcl.parseClass('''
+            class DgcBlankGroupJob {
+                static group = ''
+                def execute(){}
+            }
+        ''')
+        Class present = gcl.parseClass('''
+            class DgcPresentGroupJob {
+                static group = 'myGroup'
+                def execute(){}
+            }
+        ''')
+
+        expect:
+        new DefaultGrailsJobClass(missing).group == 'GRAILS_JOBS'
+        new DefaultGrailsJobClass(blank).group == 'GRAILS_JOBS'
+        new DefaultGrailsJobClass(present).group == 'myGroup'
+    }
+
     void 'a missing or blank description falls back to the default'() {
         given:
         Class missing = gcl.parseClass('class DgcMissingDescJob { def execute(){} }')
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupAccess.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupAccess.groovy
index fb70b0fe16..e0f2a038bf 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupAccess.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupAccess.groovy
@@ -95,13 +95,13 @@ final class StartupAccess {
             return null
         }
         boolean signedIn = false
-        List<String> kept = new ArrayList<>()
+        List<String> kept = []
         for (String parameter : rawQuery.split('&')) {
             if (parameter.startsWith(TOKEN_PARAMETER + '=')) {
                 signedIn |= matches(parameter.substring(TOKEN_PARAMETER.length() + 1))
             }
             else if (!parameter.isEmpty()) {
-                kept.add(parameter)
+                kept << parameter
             }
         }
         if (!signedIn) {
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupBrowser.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupBrowser.groovy
index 52a542fd06..c8cc9834ac 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupBrowser.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupBrowser.groovy
@@ -56,7 +56,7 @@ final class StartupBrowser {
             return
         }
         List<String> commandLine = new ArrayList<>(command.isEmpty() ? systemCommand() : command)
-        commandLine.add(address.toString())
+        commandLine << address.toString()
         try {
             new ProcessBuilder(commandLine)
                     .redirectOutput(ProcessBuilder.Redirect.DISCARD)
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgress.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgress.groovy
index cb8698002a..7e79a09b41 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgress.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgress.groovy
@@ -139,7 +139,7 @@ final class StartupProgress {
     void creatingBeans(Set<String> expected) {
         int created = 0
         for (String name : createdBeans) {
-            if (expected.contains(name)) {
+            if (name in expected) {
                 created++
             }
         }
@@ -159,12 +159,12 @@ final class StartupProgress {
     @PackageScope
     void beanCreated(String beanName, long durationNanos) {
         Set<String> expected = expectedBeans
-        if (createdBeans.add(beanName) && expected != null && expected.contains(beanName)) {
+        if (createdBeans.add(beanName) && expected != null && beanName in expected) {
             createdExpectedBeans.incrementAndGet()
         }
         synchronized (slowestBeans) {
             if (slowestBeans.size() < SLOWEST_BEAN_LIMIT || durationNanos > slowestBeans.get(slowestBeans.size() - 1).nanos()) {
-                slowestBeans.removeIf((BeanTiming timing) -> timing.name().equals(beanName))
+                slowestBeans.removeIf((BeanTiming timing) -> timing.name() == beanName)
                 slowestBeans.add(new BeanTiming(beanName, durationNanos))
                 Comparator<BeanTiming> slowestFirst = (BeanTiming first, BeanTiming second) -> Long.compare(second.nanos(), first.nanos())
                 slowestBeans.sort(slowestFirst)
@@ -218,8 +218,8 @@ final class StartupProgress {
             return
         }
         failedPhase = phase
-        failureType = exception.getClass().getName()
-        failureMessage = exception.getMessage()
+        failureType = exception.getClass().name
+        failureMessage = exception.message
         failureStackTrace = stackTrace(exception)
         phaseStarts.set(Phase.FAILED.ordinal(), System.nanoTime())
         phase = Phase.FAILED
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressApplicationStartup.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressApplicationStartup.groovy
index 4f68aaa587..dd726cf103 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressApplicationStartup.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressApplicationStartup.groovy
@@ -84,7 +84,7 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
     @Override
     StartupStep start(String name) {
         StartupStep step = delegate.start(name)
-        if (!progress.isReporting()) {
+        if (!progress.reporting) {
             return step
         }
         switch (name) {
@@ -108,10 +108,10 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
      */
     private Set<String> eagerSingletons() {
         Set<String> names = new HashSet<>()
-        for (String name : beanFactory.getBeanDefinitionNames()) {
+        for (String name : beanFactory.beanDefinitionNames) {
             BeanDefinition definition = beanFactory.getBeanDefinition(name)
-            if (definition.isSingleton() && !definition.isAbstract() && !definition.isLazyInit()) {
-                names.add(name)
+            if (definition.singleton && !definition.abstract && !definition.lazyInit) {
+                names << name
             }
         }
         return names
@@ -179,17 +179,17 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
 
         @Override
         String getName() {
-            return step.getName()
+            return step.name
         }
 
         @Override
         long getId() {
-            return step.getId()
+            return step.id
         }
 
         @Override
         Long getParentId() {
-            return step.getParentId()
+            return step.parentId
         }
 
         @Override
@@ -206,7 +206,7 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
 
         @Override
         StartupStep.Tags getTags() {
-            return step.getTags()
+            return step.tags
         }
 
         @Override
@@ -246,7 +246,7 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
 
         @Override
         StartupStep tag(String key, String value) {
-            if (BEAN_NAME_TAG.equals(key) && value != null) {
+            if (key == BEAN_NAME_TAG && value != null) {
                 beanName = StartupProgressApplicationStartup.this.definedName(value)
                 StartupProgressApplicationStartup.this.progress.beanCreationStarted(beanName)
             }
@@ -260,7 +260,7 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
             if (beanName != null && StartupProgressApplicationStartup.this.beanFactory.containsBeanDefinition(beanName)) {
                 StartupProgressApplicationStartup.this.progress.beanCreated(beanName, elapsedNanos - nestedNanos)
             }
-            if (enclosing != null) {
+            if (enclosing) {
                 enclosing.@nestedNanos = enclosing.@nestedNanos + elapsedNanos
                 StartupProgressApplicationStartup.this.creating.set(enclosing)
                 // the bean this one was created for is being created again, not the one that has just finished
@@ -289,10 +289,10 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
 
         @Override
         StartupStep tag(String key, String value) {
-            if (StartupTask.DESCRIPTION_TAG.equals(key)) {
+            if (key == StartupTask.DESCRIPTION_TAG) {
                 task.described(value)
             }
-            else if (StartupTask.TOTAL_TAG.equals(key)) {
+            else if (key == StartupTask.TOTAL_TAG) {
                 task.totalled(value)
             }
             return super.tag(key, value)
@@ -302,7 +302,7 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
         void end() {
             super.end()
             task.ended()
-            if (enclosing != null) {
+            if (enclosing) {
                 StartupProgressApplicationStartup.this.running.set(enclosing)
             }
             else {
@@ -322,7 +322,7 @@ final class StartupProgressApplicationStartup implements ApplicationStartup {
 
         @Override
         StartupStep tag(String key, String value) {
-            if (StartupTask.ITEM_TAG.equals(key)) {
+            if (key == StartupTask.ITEM_TAG) {
                 task.itemStarted(value)
             }
             return super.tag(key, value)
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressFilter.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressFilter.groovy
index 2941a79c62..fd5870e940 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressFilter.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressFilter.groovy
@@ -66,7 +66,7 @@ final class StartupProgressFilter implements Filter {
      */
     @PackageScope
     static boolean startsEmbeddedServer(ConfigurableApplicationContext context) {
-        return context instanceof ConfigurableWebApplicationContext && ((ConfigurableWebApplicationContext) context).getServletContext() == null
+        return context instanceof ConfigurableWebApplicationContext && context.servletContext == null
     }
 
     /**
@@ -76,10 +76,10 @@ final class StartupProgressFilter implements Filter {
     static FilterRegistrationBean<Filter> registration(StartupProgressResponder responder, boolean servesProgressPage) {
         StartupProgressResponder.Takes takes = servesProgressPage ? StartupProgressResponder.Takes.PAGE_LOADS : StartupProgressResponder.Takes.OWN_PATHS_ONLY
         FilterRegistrationBean<Filter> registration = new FilterRegistrationBean<Filter>(new StartupProgressFilter(responder, takes))
-        registration.setName('grailsStartupProgressFilter')
+        registration.name = 'grailsStartupProgressFilter'
         registration.addUrlPatterns('/*')
         registration.setDispatcherTypes(DispatcherType.REQUEST)
-        registration.setOrder(Ordered.HIGHEST_PRECEDENCE)
+        registration.order = Ordered.HIGHEST_PRECEDENCE
         return registration
     }
 
@@ -97,17 +97,17 @@ final class StartupProgressFilter implements Filter {
 
         @Override
         String method() {
-            return request.getMethod()
+            return request.method
         }
 
         @Override
         String path() {
-            return request.getRequestURI()
+            return request.requestURI
         }
 
         @Override
         String query() {
-            return request.getQueryString()
+            return request.queryString
         }
 
         @Override
@@ -127,13 +127,13 @@ final class StartupProgressFilter implements Filter {
 
         @Override
         void send(int status, String contentType, byte[] body) throws IOException {
-            response.setStatus(status)
+            response.status = status
             if (contentType != null) {
-                response.setContentType(contentType)
+                response.contentType = contentType
             }
-            response.setContentLength(body.length)
+            response.contentLength = body.length
             if (body.length > 0) {
-                response.getOutputStream().write(body)
+                response.outputStream.write(body)
             }
             response.flushBuffer()
         }
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressPage.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressPage.groovy
index 1e93756b7e..abd2fe738f 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressPage.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressPage.groovy
@@ -75,7 +75,7 @@ final class StartupProgressPage {
      */
     @PackageScope
     String render(String method, boolean showDetails, boolean signInForDetails) {
-        boolean reload = 'GET'.equals(method) || 'HEAD'.equals(method)
+        boolean reload = method == 'GET' || method == 'HEAD'
         return render(showDetails, signInForDetails, ',"reload":' + reload)
     }
 
@@ -98,10 +98,10 @@ final class StartupProgressPage {
                 'CONFIG', config)
         // the details are left out of the page, not hidden in it, for a browser that may not see them
         String sections = SECTION.matcher(Template.TEXT).replaceAll(match -> {
-            boolean include = 'DETAILS'.equals(match.group(1)) ? showDetails : signInForDetails
+            boolean include = match.group(1) == 'DETAILS' ? showDetails : signInForDetails
             return include ? Matcher.quoteReplacement(match.group(2)) : ''
         })
-        return PLACEHOLDER.matcher(sections).replaceAll(match -> Matcher.quoteReplacement(values.get(match.group(1))))
+        return PLACEHOLDER.matcher(sections).replaceAll(match -> Matcher.quoteReplacement(values[match.group(1)]))
     }
 
     /**
@@ -110,7 +110,7 @@ final class StartupProgressPage {
      */
     @PackageScope
     static boolean wantsJson(String accept, String rawQuery) {
-        if (rawQuery != null && Arrays.asList(rawQuery.split('&')).contains('format=json')) {
+        if (rawQuery != null && 'format=json' in rawQuery.split('&').toList()) {
             return true
         }
         return accept != null && accept.contains('application/json') && !accept.contains('text/html')
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressResponder.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressResponder.groovy
index bd31799e37..13b40c62c9 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressResponder.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressResponder.groovy
@@ -119,9 +119,9 @@ final class StartupProgressResponder {
     @PackageScope
     boolean respond(Exchange exchange, Takes takes) throws IOException {
         String path = exchange.path()
-        boolean starting = progress.isReporting()
-        boolean status = path.equals(statusPath)
-        boolean report = path.equals(reportPath)
+        boolean starting = progress.reporting
+        boolean status = path == statusPath
+        boolean report = path == reportPath
         if (status && !starting) {
             // a page still polling once the application is ready is told so, rather than the poll reaching an
             // application that has no such path and logs every request it cannot map
@@ -137,7 +137,7 @@ final class StartupProgressResponder {
             return false
         }
         boolean showDetails = access.showsDetails(exchange.headers('Cookie'))
-        boolean signInForDetails = access.isSignInRequired() && !showDetails
+        boolean signInForDetails = access.signInRequired && !showDetails
         if (status) {
             StartupProgress.Status current = progress.report(showDetails, signInForDetails)
             exchange.setHeader(StartupProgress.PHASE_HEADER, current.phase().name())
@@ -167,15 +167,15 @@ final class StartupProgressResponder {
     private static boolean isPageLoad(Exchange exchange) {
         String mode = exchange.header('Sec-Fetch-Mode')
         if (mode != null) {
-            return 'navigate'.equals(mode) && 'document'.equals(exchange.header('Sec-Fetch-Dest'))
+            return mode == 'navigate' && exchange.header('Sec-Fetch-Dest') == 'document'
         }
-        return '1'.equals(exchange.header('Upgrade-Insecure-Requests'))
+        return exchange.header('Upgrade-Insecure-Requests') == '1'
     }
 
     /** Signs a browser in when its request carries the token from the log, and says whether it did. */
     private boolean signIn(Exchange exchange) throws IOException {
         String method = exchange.method()
-        String signedIn = 'GET'.equals(method) || 'HEAD'.equals(method) ? access.signInRedirect(exchange.path(), exchange.query()) : null
+        String signedIn = method == 'GET' || method == 'HEAD' ? access.signInRedirect(exchange.path(), exchange.query()) : null
         if (signedIn == null) {
             return false
         }
@@ -197,7 +197,7 @@ final class StartupProgressResponder {
      * address once the application is ready, and anything else a plain answer to try again.
      */
     private void sendStarting(Exchange exchange, boolean pageLoad, boolean showDetails, boolean signInForDetails) throws IOException {
-        exchange.setHeader(StartupProgress.PHASE_HEADER, progress.getPhase().name())
+        exchange.setHeader(StartupProgress.PHASE_HEADER, progress.phase.name())
         exchange.setHeader('Retry-After', StartupProgressPage.RETRY_AFTER_SECONDS)
         String accept = exchange.header('Accept')
         if (pageLoad || accept != null && accept.contains('text/html')) {
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressRunListener.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressRunListener.groovy
index bb3a161144..8e2a9dcf86 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressRunListener.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressRunListener.groovy
@@ -109,19 +109,19 @@ class StartupProgressRunListener implements SpringApplicationRunListener {
 
     @Override
     void contextPrepared(ConfigurableApplicationContext context) {
-        if (application.getWebApplicationType() != WebApplicationType.SERVLET ||
+        if (application.webApplicationType != WebApplicationType.SERVLET ||
                 !(context instanceof WebServerApplicationContext) ||
                 !StartupProgressFilter.startsEmbeddedServer(context)) {
             return
         }
-        Binder binder = Binder.get(context.getEnvironment())
+        Binder binder = Binder.get(context.environment)
         StartupProgressProperties properties
         try {
             properties = binder.bindOrCreate(PROPERTIES_PREFIX, StartupProgressProperties)
         }
         catch (RuntimeException ex) {
             // nothing else reads these settings, so a mistake in them is said here or not at all
-            LOG.warn('Not serving startup progress: the {} settings could not be read: {}', PROPERTIES_PREFIX, ex.getMessage())
+            LOG.warn('Not serving startup progress: the {} settings could not be read: {}', PROPERTIES_PREFIX, ex.message)
             return
         }
         int port
@@ -136,22 +136,22 @@ class StartupProgressRunListener implements SpringApplicationRunListener {
             LOG.debug('Not serving startup progress: the server settings could not be read', ex)
             return
         }
-        if (properties.isOpenBrowser()) {
-            browserCommand = properties.getBrowserCommand()
+        if (properties.openBrowser) {
+            browserCommand = properties.browserCommand
         }
-        boolean pageEnabled = properties.isEnabledOrDefault()
-        boolean reportEnabled = properties.getEndpoint().isEnabledOrDefault()
+        boolean pageEnabled = properties.enabledOrDefault
+        boolean reportEnabled = properties.endpoint.enabledOrDefault
         if (!pageEnabled && !reportEnabled) {
             return
         }
 
         String name = applicationName(binder)
         StartupProgress startupProgress = new StartupProgress(name, Environment.getGrailsVersion(), runStartNanos)
-        StartupAccess startupAccess = new StartupAccess(properties.isShowDetailsOrDefault(), port)
-        String statusPath = path(properties.getStatusPath(), StartupProgressProperties.DEFAULT_STATUS_PATH, 'startup progress status')
+        StartupAccess startupAccess = new StartupAccess(properties.showDetailsOrDefault, port)
+        String statusPath = path(properties.statusPath, StartupProgressProperties.DEFAULT_STATUS_PATH, 'startup progress status')
         StartupProgressPage page = new StartupProgressPage(name, statusPath, Environment.getGrailsVersion())
-        reportPath = reportEnabled ? path(properties.getEndpoint().getPath(), StartupProgressProperties.Endpoint.DEFAULT_PATH, 'startup report') : null
-        if (statusPath.equals(reportPath)) {
+        reportPath = reportEnabled ? path(properties.endpoint.path, StartupProgressProperties.Endpoint.DEFAULT_PATH, 'startup report') : null
+        if (statusPath == reportPath) {
             // a page polling there would take the report for the application answering, and reload without end
             LOG.warn('Not serving the startup report at {}: it is the path the startup progress page polls', reportPath)
             reportPath = null
@@ -166,8 +166,8 @@ class StartupProgressRunListener implements SpringApplicationRunListener {
         progress = startupProgress
         access = startupAccess
 
-        context.setApplicationStartup(StartupProgressApplicationStartup.create(context.getApplicationStartup(), startupProgress, context.getBeanFactory()))
-        ConfigurableListableBeanFactory beanFactory = context.getBeanFactory()
+        context.setApplicationStartup(StartupProgressApplicationStartup.create(context.applicationStartup, startupProgress, context.beanFactory))
+        ConfigurableListableBeanFactory beanFactory = context.beanFactory
         // the lifecycle beans live as long as the context, so they hold what they act on rather than this listener
         StartupProgressServer pageServer = server
         WebServerApplicationContext webContext = (WebServerApplicationContext) context
@@ -179,9 +179,9 @@ class StartupProgressRunListener implements SpringApplicationRunListener {
         }))
         beanFactory.registerSingleton('grailsStartupProgressInitializing', StartupProgressLifecycle.afterWebServer(() -> {
             startupProgress.initializing()
-            if (webContext.getWebServer() != null) {
+            if (webContext.webServer != null) {
                 // a random port is only known now, and names the cookie that signs a browser in to the report
-                startupAccess.usePort(webContext.getWebServer().getPort())
+                startupAccess.usePort(webContext.webServer.port)
             }
         }))
         beanFactory.registerSingleton('grailsStartupProgressFilter',
@@ -236,10 +236,10 @@ class StartupProgressRunListener implements SpringApplicationRunListener {
             progress.ready()
         }
         stopServer()
-        if (context instanceof WebServerApplicationContext && ((WebServerApplicationContext) context).getWebServer() != null) {
+        if (context instanceof WebServerApplicationContext && context.webServer != null) {
             WebServerApplicationContext webContext = (WebServerApplicationContext) context
             String scheme = ssl ? 'https' : 'http'
-            int port = webContext.getWebServer().getPort()
+            int port = webContext.webServer.port
             if (reportPath != null) {
                 // the details of the start are for whoever can read this log, so the address carries the token that shows them
                 LOG.info('Startup report is at {}', uri(scheme, port, reportPath.substring(contextPath.length()), signInQuery()))
@@ -254,13 +254,13 @@ class StartupProgressRunListener implements SpringApplicationRunListener {
         if (progress == null) {
             return
         }
-        StartupProgress.Phase reached = progress.getPhase()
+        StartupProgress.Phase reached = progress.phase
         progress.failed(exception)
         if (server == null) {
             // only the report was served, which nobody watches while the application starts
             return
         }
-        boolean answering = server.isRunning()
+        boolean answering = server.running
         if (!answering && (reached == StartupProgress.Phase.STARTING_WEB_SERVER || reached == StartupProgress.Phase.INITIALIZING)) {
             // a refresh that fails as the web server starts, or once it is up, stops the web server before run
             // listeners hear of it, so take the port back to say why; if the port is still held once the web server
@@ -298,11 +298,11 @@ class StartupProgressRunListener implements SpringApplicationRunListener {
 
     /** The query that signs a browser in from the log, when there are details it would see by signing in. */
     private String signInQuery() {
-        return access.isSignInRequired() ? access.signInQuery() : null
+        return access.signInRequired ? access.signInQuery() : null
     }
 
     private URI uri(String scheme, int port, String path, String query) {
-        String host = address == null || address.isAnyLocalAddress() ? 'localhost' : address.getHostAddress()
+        String host = address == null || address.anyLocalAddress ? 'localhost' : address.hostAddress
         try {
             return new URI(scheme, null, host, port, contextPath + path, query, null)
         }
diff --git a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressServer.groovy b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressServer.groovy
index f1eaa1a6ef..3e9b1e7aef 100644
--- a/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressServer.groovy
+++ b/grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressServer.groovy
@@ -74,7 +74,7 @@ final class StartupProgressServer {
             return thread
         })
         httpServer.createContext('/', (HttpExchange request) -> handle(request))
-        httpServer.setExecutor(pool)
+        httpServer.executor = pool
         startFromDaemonThread(httpServer)
         server = httpServer
         executor = pool
@@ -102,7 +102,7 @@ final class StartupProgressServer {
                     interrupted = true
                 }
                 catch (ExecutionException ex) {
-                    throw new IOException('The startup progress server could not be started', ex.getCause())
+                    throw new IOException('The startup progress server could not be started', ex.cause)
                 }
             }
         }
@@ -143,46 +143,46 @@ final class StartupProgressServer {
 
         @Override
         String method() {
-            return exchange.getRequestMethod()
+            return exchange.requestMethod
         }
 
         @Override
         String path() {
-            return exchange.getRequestURI().getRawPath()
+            return exchange.requestURI.rawPath
         }
 
         @Override
         String query() {
-            return exchange.getRequestURI().getRawQuery()
+            return exchange.requestURI.rawQuery
         }
 
         @Override
         String header(String name) {
-            return exchange.getRequestHeaders().getFirst(name)
+            return exchange.requestHeaders.getFirst(name)
         }
 
         @Override
         List<String> headers(String name) {
-            List<String> values = exchange.getRequestHeaders().get(name)
+            List<String> values = exchange.requestHeaders[name]
             return values != null ? values : List.of()
         }
 
         @Override
         void setHeader(String name, String value) {
-            exchange.getResponseHeaders().set(name, value)
+            exchange.responseHeaders.set(name, value)
         }
 
         @Override
         void send(int status, String contentType, byte[] body) throws IOException {
             if (contentType != null) {
-                exchange.getResponseHeaders().set('Content-Type', contentType)
+                exchange.responseHeaders.set('Content-Type', contentType)
             }
-            if (body.length == 0 || 'HEAD'.equals(exchange.getRequestMethod())) {
+            if (body.length == 0 || exchange.requestMethod == 'HEAD') {
                 exchange.sendResponseHeaders(status, -1)
                 return
             }
             exchange.sendResponseHeaders(status, body.length)
-            try (OutputStream out = exchange.getResponseBody()) {
+            try (OutputStream out = exchange.responseBody) {
                 out.write(body)
             }
         }


(grails-core) 03/03: Merge branch 'refactor/java-to-groovy-runtime-small' into groovyism/runtime-small

Posted by bo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch groovyism/runtime-small
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit d79d89355740af7081b5cfa82a45e47dbf895f34
Merge: 1224c762d7 e9ec3f8561
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Sun Oct 18 10:34:15 2026 -0400

    Merge branch 'refactor/java-to-groovy-runtime-small' into groovyism/runtime-small

 .agents/skills/gradle-developer/SKILL.md           |   8 +
 .github/workflows/gradle.yml                       |   2 +-
 AGENTS.md                                          |   1 +
 THREAT_MODEL.md                                    |   2 +-
 .../apache/grails/buildsrc/CompilePlugin.groovy    |  56 +-
 .../grails/buildsrc/CompilePluginSpec.groovy       |  58 ++
 dependencies.gradle                                |   2 +-
 gradle.properties                                  |   8 +-
 gradle/grails-extension-gradle-config.gradle       |   4 +-
 .../org/grails/io/support/AntPathMatcher.groovy    |  36 +-
 .../grails/io/support/AntPathMatcherSpec.groovy    | 347 ++++++++++
 .../grails/io/support/ByteArrayResourceSpec.groovy |  97 +++
 grails-common/build.gradle                         |   4 -
 grails-converters/build.gradle                     |   3 +-
 .../src/main/groovy/grails/converters/JSON.java    |  75 ++-
 .../converters/ConvertersGrailsPlugin.groovy       |  20 +
 .../ConvertersConfigurationHolder.java             |  44 ++
 .../ConvertersConfigurationInitializer.java        | 161 ++++-
 .../jackson/DomainClassJacksonModule.java          | 119 ++++
 .../converters/jackson/DomainClassRendering.java   | 256 ++++++++
 .../converters/jackson/DomainClassSerializer.java  | 481 ++++++++++++++
 .../marshaller/json/ByteArrayMarshaller.java       |   4 +
 .../marshaller/json/CalendarMarshaller.java        |   4 +
 .../converters/marshaller/json/DateMarshaller.java |   4 +
 .../marshaller/json/DomainClassMarshaller.java     | 104 ++-
 .../marshaller/json/InstantMarshaller.java         |   4 +
 .../marshaller/json/JsonMapperValueMarshaller.java |  88 +++
 .../marshaller/json/LocalDateMarshaller.java       |   4 +
 .../marshaller/json/LocalDateTimeMarshaller.java   |   4 +
 .../converters/marshaller/json/MapMarshaller.java  |   3 +-
 .../marshaller/json/OffsetDateTimeMarshaller.java  |   4 +
 ...rrayMarshaller.java => OptionalMarshaller.java} |  15 +-
 ...alDateMarshaller.java => RecordMarshaller.java} |  30 +-
 .../marshaller/json/SimpleEnumMarshaller.java      |  17 +-
 .../marshaller/json/ToStringBeanMarshaller.java    |   4 +
 .../marshaller/json/ZonedDateTimeMarshaller.java   |   4 +
 .../converters/ConvertersGrailsPluginSpec.groovy   | 104 +++
 .../ConvertersConfigurationInitializerSpec.groovy  |  77 +++
 .../jackson/DomainClassJacksonModuleSpec.groovy    | 524 +++++++++++++++
 .../converters/json/JsonMapperRenderingSpec.groovy | 719 +++++++++++++++++++++
 .../web/converters/json/JsonParsingSpec.groovy     |  99 +++
 .../json/legacy/Grails8DomainRendering.groovy      | 213 ++++++
 .../json/legacy/Grails8JsonRenderingSpec.groovy    | 397 ++++++++++++
 .../commands/io/FileSystemInteractionImpl.groovy   |   9 +-
 .../io/FileSystemInteractionImplSpec.groovy        |  75 +++
 .../core/cli/io/FileSystemInteractionImpl.groovy   |   9 +-
 .../grails/core/ArtefactHandlerAdapter.groovy      |   3 +
 .../src/main/groovy/grails/util/Holders.groovy     |   3 +
 .../org/grails/config/CompositeConfig.groovy       |   5 +
 .../groovy/org/grails/config/PrefixedConfig.groovy |   5 +
 .../grails/core/AbstractGrailsApplication.groovy   |   3 +
 .../org/grails/core/io/SpringResource.groovy       |   2 +
 .../util/BeanCreationProfilingPostProcessor.groovy |   3 +
 .../transaction/GrailsTransactionAttribute.groovy  |   3 +
 .../additional-spring-configuration-metadata.json  |  12 +
 .../cli/io/FileSystemInteractionImplSpec.groovy    |  75 +++
 .../beans/util/LazyMetaPropertyMapSpec.groovy      | 145 ++---
 .../groovy/grails/util/GrailsClassUtilsSpec.groovy | 211 ++++--
 .../test/groovy/grails/util/GrailsUtilTests.groovy |   2 +-
 .../org/grails/config/CompositeConfigSpec.groovy   | 285 ++++----
 .../org/grails/config/PrefixedConfigSpec.groovy    | 196 +++---
 .../org/grails/core/util/StopWatchSpec.groovy      | 143 ++--
 grails-data-hibernate5/core/build.gradle           |   4 +
 .../proxy/ByteBuddyGroovyInterceptor.java          |  23 +
 .../proxy/ByteBuddyGroovyProxyFactory.java         |  30 +-
 .../hibernate/proxy/GroovyProxyClassBuilder.java   | 115 ++++
 .../proxy/GroovyProxyMetaClassDispatcher.java      |  57 ++
 .../hibernate/proxy/SerializableGroovyProxy.java   | 126 ++++
 .../TraitInitializerProxySpec.groovy               | 232 +++++++
 .../proxy/ByteBuddyGroovyProxyFactorySpec.groovy   | 175 +++++
 .../proxy/GroovyProxyClassBuilderSpec.groovy       | 109 ++++
 .../GroovyProxyMetaClassDispatcherSpec.groovy      |  47 ++
 .../proxy/SerializableGroovyProxySpec.groovy       | 111 ++++
 grails-data-hibernate7/core/build.gradle           |   2 +
 .../generator/GrailsNativeGenerator.java           |  64 +-
 .../generator/GrailsSequenceGeneratorEnum.groovy   |   4 +-
 .../proxy/ByteBuddyGroovyInterceptor.java          |  24 +
 .../proxy/ByteBuddyGroovyProxyFactory.java         |  44 +-
 .../hibernate/proxy/GrailsBytecodeProvider.java    |  10 +-
 .../hibernate/proxy/GrailsProxyFactoryFactory.java |   2 +-
 .../hibernate/proxy/GroovyProxyClassBuilder.java   |  93 +++
 .../proxy/GroovyProxyMetaClassDispatcher.java      |  56 ++
 .../hibernate/proxy/SerializableGroovyProxy.java   | 146 +++++
 .../tests/NativeIdGeneratorHibernate7Spec.groovy   | 135 ++++
 .../TraitInitializerProxySpec.groovy               | 232 +++++++
 .../domainbinding/GrailsNativeGeneratorSpec.groovy | 137 ++--
 .../GrailsSequenceGeneratorEnumSpec.groovy         |   8 +-
 .../proxy/ByteBuddyGroovyInterceptorSpec.groovy    |  28 +
 .../proxy/ByteBuddyGroovyProxyFactorySpec.groovy   | 152 ++++-
 .../proxy/GrailsBytecodeProviderSpec.groovy        |  47 ++
 .../proxy/GroovyProxyClassBuilderSpec.groovy       | 107 +++
 .../GroovyProxyMetaClassDispatcherSpec.groovy      |  47 ++
 .../proxy/SerializableGroovyProxySpec.groovy       | 112 ++++
 .../dbmigration-core/build.gradle                  |   2 +
 grails-data-hibernate7/dbmigration/build.gradle    |   2 +
 .../GormIdentifierSnapshot16497Spec.groovy         |   6 +-
 grails-data-mongodb/core/build.gradle              |   2 +
 .../Jsr310ConvertersConfiguration.groovy           |   6 +-
 .../mapping/collection/PersistentList.groovy       |   2 +-
 .../datastore/mapping/core/AbstractSession.groovy  |   2 +-
 .../mapping/config/KeyValueMappingFactory.groovy   |  16 +-
 .../grails/datastore/mapping/query/Query.groovy    |   2 +-
 .../en/guide/REST/renderers/defaultRenderers.adoc  | 108 +++-
 .../src/en/guide/deployment/deploymentAot.adoc     |   6 +
 grails-doc/src/en/guide/introduction/whatsNew.adoc |  31 +
 .../springSecurity/core/filters.adoc               |   2 +
 .../src/en/guide/upgrading/upgrading80x.adoc       |  79 ++-
 .../src/en/guide/upgrading/upgrading90x.adoc       | 259 ++++++++
 .../gradle/classic-framework.init.gradle           |  34 +-
 grails-forge/gradle/test-config.gradle             |  10 +
 grails-forge/grails-forge-cli/build.gradle         |   4 -
 .../groovy/org/grails/forge/cli/CommandSpec.groovy |  16 +-
 .../org/grails/forge/cli/GeneratedBuildSpec.groovy |  34 +-
 .../forge/cli/command/CreateAppCommandSpec.groovy  |  21 +
 .../org/grails/forge/cli/GeneratedBuild.groovy     |  48 ++
 .../feature/database/GrailsDataHibernate5.groovy   |   7 +-
 .../feature/database/GrailsDataHibernate7.groovy   |   7 +-
 .../database/GrailsDataHibernate5Spec.groovy       |  12 +-
 .../database/GrailsDataHibernate7Spec.groovy       |  10 +-
 .../org/grails/forge/utils/CommandSpec.groovy      |   7 +-
 .../grails/build/parsing/DefaultCommandLine.groovy |  12 +-
 .../grails/io/support/GrailsResourceUtils.groovy   |   4 +-
 .../grails/io/support/ClassPathResourceSpec.groovy | 186 +++---
 .../io/support/FileSystemResourceSpec.groovy       | 162 ++---
 .../io/support/GrailsResourceUtilsSpec.groovy      | 520 ++++++---------
 .../grails/io/support/MainClassFinderSpec.groovy   | 171 ++++-
 .../org/grails/io/support/UrlResourceSpec.groovy   | 167 +++--
 .../gradle/plugin/core/GrailsExtension.groovy      |  12 +-
 .../gradle/plugin/core/GrailsGradlePlugin.groovy   |  61 +-
 .../gradle/plugin/core/GrailsExtensionSpec.groovy  |  23 +
 .../gradle/plugin/core/GrailsIndySpec.groovy       |  75 +++
 .../core/GrailsNativeImageDefaultsSpec.groovy      |  53 +-
 .../test-projects/indy-settings/build.gradle       |  40 ++
 .../test-projects/indy-settings/gradle.properties  |   1 +
 .../indy-settings/grails-app/conf/application.yml  |   0
 .../test-projects/indy-settings/settings.gradle    |   1 +
 .../src/main/groovy/demo/Dynamic.groovy            |   5 +
 .../test-projects/native-defaults-off/build.gradle |   7 +-
 .../test-projects/native-defaults-on/build.gradle  |  47 +-
 .../src/main/groovy/demo/Dynamic.groovy            |   5 +
 .../web/layout/TokenizedHTMLPage2Content.java      |   2 +-
 .../web/layout/GSPGrailsLayoutPageSpec.groovy      | 155 +++++
 .../web/layout/GrailsHTMLPageParserSpec.groovy     |  82 +++
 .../web/layout/GrailsLayoutTagLibSpec.groovy       | 112 ++++
 .../layout/GrailsPageResponseWrapperSpec.groovy    | 223 +++++++
 .../layout/GrailsViewBufferingResponseSpec.groovy  | 165 +++++
 .../grails/web/layout/LayoutDecoratorSpec.groovy   | 125 ++++
 .../web/layout/RenderGrailsLayoutTagLibSpec.groovy | 102 +++
 .../web/rest/render/atom/AtomRendererSpec.groovy   | 261 ++++++++
 .../web/rest/render/hal/HalXmlRendererSpec.groovy  | 290 +++++++++
 grails-shell-cli/build.gradle                      |   2 +
 .../commands/io/FileSystemInteractionImpl.groovy   |   9 +-
 .../grails/cli/command/CommandExceptionSpec.groovy |  73 +++
 .../grails/cli/command/CommandRunnerSpec.groovy    | 269 ++++++++
 .../org/grails/cli/command/HelpExampleSpec.groovy  |  33 +-
 .../cli/command/OptionParsingCommandSpec.groovy    |  84 +++
 .../io/FileSystemInteractionImplSpec.groovy        | 151 +++++
 .../templates/TemplateRendererImplSpec.groovy      | 151 +++++
 .../developer/skills/grails-developer/SKILL.md     |  30 +
 .../intercept/FilterSecurityInterceptor.groovy     |   4 +
 .../intercept/FilterSecurityInterceptorSpec.groovy | 141 +++-
 .../grails/spring/DefaultBeanConfiguration.groovy  |  14 +-
 .../DefaultRuntimeSpringConfiguration.groovy       |   3 +
 .../grails-hibernate-groovy-proxy/build.gradle     |   1 +
 .../grails-app/conf/application.yml                |   4 +
 .../grails-app/domain/example/Book.groovy          |  27 +-
 .../grails-app/domain/example/Loan.groovy          |  28 +-
 .../example/TraitDefaultValuesProxySpec.groovy     | 189 ++++++
 .../src/main/groovy/example/Auditable.groovy       |  28 +-
 .../hibernate5/grails-hibernate/build.gradle       |   1 +
 .../grails-app/conf/application.yml                |  11 +-
 .../functional/tests/ShipmentController.groovy     |  24 +-
 .../domain/functional/tests/Carrier.groovy         |  24 +-
 .../domain/functional/tests/Shipment.groovy        |  25 +-
 .../tests/JsonMapperConverterSpec.groovy           |  86 +++
 .../grails-hibernate-groovy-proxy/build.gradle     |   1 +
 .../grails-app/conf/application.yml                |   5 +-
 .../grails-app/domain/example/Book.groovy          |  27 +-
 .../grails-app/domain/example/Loan.groovy          |  28 +-
 .../example/TraitDefaultValuesProxySpec.groovy     | 189 ++++++
 .../src/main/groovy/example/Auditable.groovy       |  28 +-
 .../grails-app/conf/application.groovy             |  13 +
 .../groovy/specs/NoAnonymousFilterSpec.groovy      | 105 +++
 .../spring-security/ui/common/build.gradle         |   2 +
 .../binding/DateTimeRoundTripBindingSpec.groovy    |  10 +-
 .../web/converters/JSONConverterTests.groovy       |   9 +-
 .../org/grails/web/json/JSONWriterSpec.groovy      |  62 --
 grails-web-common/build.gradle                     |   1 +
 .../org/grails/web/json/GrailsPrettyPrinter.java   | 116 ++++
 .../org/grails/web/json/HtmlSafeJsonWriter.java    | 102 +++
 .../groovy/org/grails/web/json/JSONTokener.java    |   2 +-
 .../groovy/org/grails/web/json/JSONWriter.java     | 367 ++++++++---
 .../org/grails/web/json/JsonMapperSupport.java     | 244 +++++++
 .../org/grails/web/json/JsonMapperValue.java       |  86 +++
 .../org/grails/web/json/NestedValueSerializer.java | 215 ++++++
 .../web/json/PathCapturingJSONWriterWrapper.java   | 136 +++-
 .../org/grails/web/json/PrettyPrintJSONWriter.java | 138 +---
 .../org/grails/web/json/parser/JSONParser.java     |   7 +
 .../grails/web/json/HtmlSafeJsonWriterSpec.groovy  |  50 ++
 .../org/grails/web/json/JSONArrayApiSpec.groovy    | 322 +++++++++
 .../org/grails/web/json/JSONObjectApiSpec.groovy   | 345 ++++++++++
 .../org/grails/web/json/JSONTokenerApiSpec.groovy  | 245 +++++++
 .../org/grails/web/json/JSONWriterApiSpec.groovy   | 135 ++++
 .../org/grails/web/json/JSONWriterSpec.groovy      | 332 ++++++++++
 .../PathCapturingJSONWriterWrapperApiSpec.groovy   | 159 +++++
 .../web/json/PrettyPrintJSONWriterApiSpec.groovy   |  92 +++
 .../BoundedCharsAsEncodedBytesCounterSpec.groovy   | 167 +++++
 .../web/util/IncludeResponseWrapperSpec.groovy     | 181 ++++++
 .../org/grails/web/util/IncludedContentSpec.groovy |  88 +++
 .../groovy/org/grails/web/util/WebUtilsSpec.groovy | 269 +++++++-
 .../web/xml/PrettyPrintXMLStreamWriterSpec.groovy  | 112 ++++
 .../web/xml/StreamingMarkupWriterSpec.groovy       |  76 +++
 threat-model.yaml                                  |   2 +-
 213 files changed, 15570 insertions(+), 1992 deletions(-)


(grails-core) 02/03: Merge branch 'refactor/java-to-groovy-runtime-small' into groovyism/runtime-small

Posted by bo...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

borinquenkid pushed a commit to branch groovyism/runtime-small
in repository https://gitbox.apache.org/repos/asf/grails-core.git

commit 1224c762d74526e55c848247959dabc3cecf33cc
Merge: f8c8d3a27e 1af3354613
Author: Walter Duque de Estrada <wb...@mac.com>
AuthorDate: Sat Oct 17 09:17:29 2026 -0400

    Merge branch 'refactor/java-to-groovy-runtime-small' into groovyism/runtime-small
    
    # Conflicts:
    #       grails-logging/src/main/groovy/org/grails/compiler/logging/LoggingTransformer.groovy
    #       grails-startup-progress/src/main/groovy/org/apache/grails/startup/StartupProgressApplicationStartup.groovy

 .../grails/beans/util/LazyMetaPropertyMap.groovy   |  134 +--
 .../grails/core/ArtefactHandlerAdapter.groovy      |  125 +-
 .../plugins/DefaultGrailsPluginManager.groovy      |  179 +--
 .../src/main/groovy/grails/util/Holders.groovy     |  160 +--
 .../core/internal/util/TypeConverters.groovy       |  153 +--
 .../compiler/injection/PluginAstReader.groovy      |  131 +--
 .../org/grails/config/CompositeConfig.groovy       |  186 +--
 .../groovy/org/grails/config/PrefixedConfig.groovy |  146 ++-
 .../org/grails/config/PropertySourcesConfig.groovy |  147 +--
 .../grails/core/AbstractGrailsApplication.groovy   |  103 +-
 .../core/DefaultGrailsControllerClass.groovy       |  170 +--
 .../artefact/DomainClassArtefactHandler.groovy     |  115 +-
 .../org/grails/core/io/SpringResource.groovy       |   43 +-
 .../util/BeanCreationProfilingPostProcessor.groovy |   42 +-
 .../org/grails/plugins/AbstractGrailsPlugin.groovy |  191 ++--
 .../plugins/AbstractGrailsPluginManager.groovy     |  471 ++++----
 .../org/grails/plugins/DefaultGrailsPlugin.groovy  |  596 +++++-----
 .../plugins/ProfilingGrailsPluginManager.groovy    |  175 +--
 .../transaction/GrailsTransactionAttribute.groovy  |  118 +-
 .../ChainedTransactionManagerTests.groovy          |  503 ++++----
 .../main/groovy/grails/gorm/CriteriaBuilder.groovy |  120 +-
 .../main/groovy/grails/gorm/PagedResultList.groovy |  113 +-
 .../gorm/events/DomainEventListener.groovy         |  258 ++---
 .../gorm/finders/DynamicFinderInvocation.groovy    |   50 +-
 .../datastore/gorm/finders/ListResultFinder.groovy |   73 +-
 .../datastore/gorm/finders/MethodExpression.groovy |  265 ++---
 .../datastore/gorm/jdbc/DataSourceBuilder.groovy   |  160 +--
 .../datastore/gorm/query/AbstractResultList.groovy |  142 +--
 ...ctDatastorePersistenceContextInterceptor.groovy |   80 +-
 .../validation/constraints/MaxConstraint.groovy    |   45 +-
 .../validation/constraints/MinConstraint.groovy    |   46 +-
 .../collection/AbstractPersistentCollection.groovy |  248 ++--
 .../mapping/collection/PersistentList.groovy       |  112 +-
 .../mapping/collection/PersistentSet.groovy        |   19 +-
 .../mapping/collection/PersistentSortedSet.groovy  |   33 +-
 .../mapping/core/AbstractDatastore.groovy          |  197 ++--
 .../datastore/mapping/core/AbstractSession.groovy  |  812 +++++++------
 .../mapping/core/impl/PendingInsertAdapter.groovy  |   27 +-
 .../core/impl/PendingOperationAdapter.groovy       |   51 +-
 .../mapping/core/impl/PendingUpdateAdapter.groovy  |   27 +-
 .../config/DocumentPersistentEntity.groovy         |   38 +-
 .../mapping/engine/BeanEntityAccess.groovy         |  118 +-
 .../mapping/engine/EntityPersister.groovy          |  218 ++--
 .../engine/event/AbstractPersistenceEvent.groovy   |   93 +-
 .../mapping/engine/event/PostDeleteEvent.groovy    |   17 +-
 .../mapping/engine/event/PostInsertEvent.groovy    |   19 +-
 .../mapping/engine/event/PostLoadEvent.groovy      |   19 +-
 .../mapping/engine/event/PostUpdateEvent.groovy    |   17 +-
 .../mapping/engine/event/PreDeleteEvent.groovy     |   17 +-
 .../mapping/engine/event/PreInsertEvent.groovy     |   19 +-
 .../mapping/engine/event/PreLoadEvent.groovy       |   19 +-
 .../mapping/engine/event/PreUpdateEvent.groovy     |   17 +-
 .../mapping/engine/event/ValidationEvent.groovy    |   23 +-
 ...AbstractMappingAwareCustomTypeMarshaller.groovy |   45 +-
 .../mapping/config/KeyValueMappingContext.groovy   |   56 +-
 .../mapping/config/KeyValueMappingFactory.groovy   |   20 +-
 .../mapping/config/KeyValuePersistentEntity.groovy |   44 +-
 .../mapping/model/AbstractMappingContext.groovy    |  383 +++----
 .../mapping/model/AbstractPersistentEntity.groovy  |  338 +++---
 .../model/AbstractPersistentProperty.groovy        |   80 +-
 .../mapping/model/config/GormProperties.groovy     |    5 +-
 .../mapping/model/types/Association.groovy         |  198 ++--
 .../datastore/mapping/model/types/Basic.groovy     |   84 +-
 .../datastore/mapping/model/types/Embedded.groovy  |   17 +-
 .../mapping/model/types/ManyToMany.groovy          |   23 +-
 .../datastore/mapping/model/types/ToOne.groovy     |   23 +-
 .../conversion/DefaultConversionService.groovy     |   56 +-
 .../model/types/mapping/BasicWithMapping.groovy    |   23 +-
 .../model/types/mapping/CustomWithMapping.groovy   |   23 +-
 .../mapping/EmbeddedCollectionWithMapping.groovy   |   25 +-
 .../model/types/mapping/EmbeddedWithMapping.groovy |   25 +-
 .../model/types/mapping/IdentityWithMapping.groovy |   25 +-
 .../types/mapping/ManyToManyWithMapping.groovy     |   21 +-
 .../types/mapping/ManyToOneWithMapping.groovy      |   25 +-
 .../types/mapping/OneToManyWithMapping.groovy      |   25 +-
 .../model/types/mapping/OneToOneWithMapping.groovy |   25 +-
 .../model/types/mapping/PropertyWithMapping.groovy |    9 +-
 .../model/types/mapping/SimpleWithMapping.groovy   |   23 +-
 .../model/types/mapping/TenantIdWithMapping.groovy |   23 +-
 .../grails/datastore/mapping/query/Query.groovy    |  910 ++++++++-------
 .../query/criteria/FunctionCallingCriterion.groovy |   44 +-
 .../mapping/query/jpa/JpaQueryBuilder.groovy       | 1205 ++++++++++----------
 .../query/order/ManualEntityOrdering.groovy        |  172 ++-
 .../mapping/reflect/FieldEntityAccess.groovy       |  459 ++++----
 .../datastore/mapping/reflect/NameUtils.groovy     |  150 +--
 ...CustomizableRollbackTransactionAttribute.groovy |  105 +-
 .../validation/BeanFactoryValidatorRegistry.groovy |   22 +-
 .../mapping/validation/ValidationException.groovy  |   59 +-
 .../org/grails/buffer/CodecPrintWriter.groovy      |   55 +-
 .../org/grails/buffer/GrailsPrintWriter.groovy     |  432 +++----
 .../grails/buffer/GrailsPrintWriterAdapter.groovy  |  157 +--
 .../grails/buffer/GrailsRoutablePrintWriter.groovy |  223 ++--
 .../org/grails/buffer/StreamByteBuffer.groovy      |  329 +++---
 .../org/grails/buffer/StreamCharBufferTests.groovy |  655 +++++------
 .../grails/build/parsing/DefaultCommandLine.groovy |  154 +--
 .../plugins/quartz/GrailsJobClassConstants.groovy  |   64 +-
 ...ailsApplicationCompilerAutoConfiguration.groovy |  160 +--
 .../cli/command/archive/ResourceMatcher.groovy     |  152 +--
 .../command/options/CompilerOptionHandler.groovy   |   37 +-
 .../org/grails/cli/command/run/RunCommand.groovy   |   79 +-
 .../GrailsCompilerAutoConfiguration.groovy         |   34 +-
 ...GroovyTemplatesCompilerAutoConfiguration.groovy |   30 +-
 .../JdbcCompilerAutoConfiguration.groovy           |   24 +-
 .../JmsCompilerAutoConfiguration.groovy            |   24 +-
 .../RabbitCompilerAutoConfiguration.groovy         |   24 +-
 .../SpringBatchCompilerAutoConfiguration.groovy    |   48 +-
 .../SpringBootCompilerAutoConfiguration.groovy     |   82 +-
 ...ringIntegrationCompilerAutoConfiguration.groovy |   44 +-
 .../SpringMvcCompilerAutoConfiguration.groovy      |   28 +-
 .../SpringSecurityCompilerAutoConfiguration.groovy |   22 +-
 .../SpringTestCompilerAutoConfiguration.groovy     |   42 +-
 ...SpringWebsocketCompilerAutoConfiguration.groovy |   22 +-
 ...ctionManagementCompilerAutoConfiguration.groovy |   24 +-
 .../compiler/grape/MavenResolverGrapeEngine.groovy |  274 ++---
 .../gradle/FetchAllTaskSelectorsBuildAction.groovy |   78 +-
 .../interactive/completers/StringsCompleter.groovy |   41 +-
 .../grails/spring/DefaultBeanConfiguration.groovy  |  254 ++---
 .../DefaultRuntimeSpringConfiguration.groovy       |  278 ++---
 .../grails/spring/GrailsApplicationContext.groovy  |  127 ++-
 119 files changed, 8161 insertions(+), 8006 deletions(-)