Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
eb9930e
build: add Checkstyle and Codenarc support
matrei Jul 21, 2025
e421851
style: enforce newline at end of file
matrei Jul 22, 2025
d3676cc
style: enforce no tab characters
matrei Jul 22, 2025
6bd30bd
style: add Checkstyle `@SuppressWarnings` support
matrei Jul 22, 2025
a0ae4ad
style: enforce no unused imports
matrei Jul 22, 2025
2846ab6
style: enforce no wildcard imports
matrei Jul 23, 2025
375f7c3
style: enforce no redundant imports
matrei Jul 23, 2025
3fbd36a
style: enforce import ordering and grouping
matrei Jul 24, 2025
b85315b
Merge branch 'refs/heads/7.0.x' into code-style
matrei Jul 24, 2025
b1a400e
style: whitespace missed previously
matrei Jul 24, 2025
17ca192
style(groovy): enforce no unnecessary semicolons
matrei Jul 26, 2025
0ecf315
style(groovy): enforce no unnecessary `public` keyword
matrei Jul 27, 2025
6854a37
style(groovy): enforce no unnecessary `GString`
matrei Aug 8, 2025
08f7041
Merge branch '7.0.x' into fork/matrei/code-style
matrei Aug 8, 2025
b0edc2d
fix: add ast util imports
matrei Aug 8, 2025
f105d7d
style(groovy): update ast sources for `UnnecessaryGString`
matrei Aug 8, 2025
2f5d4b1
style(groovy): update testFixtures sources for `UnnecessaryGString`
matrei Aug 8, 2025
7de01cd
style(groovy): update e2eTest sources for `UnnecessaryGString`
matrei Aug 10, 2025
aba2fb8
style: enforce indentation
matrei Aug 10, 2025
130ea93
style: disable style check on integrationTest
matrei Aug 10, 2025
4fdebe8
style(groovy): enforce misc whitespace rules
matrei Aug 12, 2025
e161861
Merge branch '7.0.x' into fork/matrei/code-style
matrei Aug 12, 2025
4724a79
style: add `io.spring` to spring import group
matrei Aug 12, 2025
37d0f51
chore: remove unused imports after merge
matrei Aug 12, 2025
b5c071c
fix: restore accidentally renamed parameter
matrei Aug 12, 2025
d91503c
style: update code style in geb testFixtures
matrei Aug 12, 2025
0aae645
style: move spring-related imports
matrei Aug 12, 2025
d8eaaa3
Merge branch '7.0.x' into code-style
matrei Aug 13, 2025
2c450db
Merge branch '7.0.x' into code-style
matrei Aug 14, 2025
a0630e2
style(java): enforce misc whitespace rules
matrei Aug 14, 2025
0318b38
fix(deps): update Checkstyle and CodeNarc
matrei Aug 18, 2025
bfc0912
style(groovy): enforce rule `UnnecessaryConstructor`
matrei Aug 18, 2025
d928e02
style(groovy): enforce rule `UnnecessaryDotClass`
matrei Aug 18, 2025
6ebe8df
style(groovy): enforce rule `UnnecessaryOverridingMethod`
matrei Aug 18, 2025
66aaa60
style(groovy): enforce rule `UnnecessarySafeNavigationOperator`
matrei Aug 18, 2025
5afed72
style: cleanup generics to use diamond
matrei Aug 19, 2025
1c7653a
style: fix indentation issue
matrei Aug 19, 2025
4f4717c
Merge branch '7.0.x' into fork/matrei/code-style
matrei Aug 19, 2025
7380db9
style(groovy): use parentheses in method calls
matrei Aug 20, 2025
625277f
style(groovy): add space after type casts
matrei Aug 20, 2025
2a82334
Merge branch '7.0.x' into code-style
matrei Aug 20, 2025
124133f
refactor(logging): use lazy-evaluated log messages
matrei Aug 20, 2025
a922455
Merge branch '7.0.x' into code-style
jamesfredley Aug 20, 2025
031e221
back to single quotes on documentation links
jamesfredley Aug 20, 2025
405544b
Merge branch '7.0.x' into code-style
jamesfredley Aug 22, 2025
20036f9
Merge branch '7.0.x' into code-style
matrei Aug 26, 2025
dd05b01
chore: remove code style enforcement
matrei Aug 26, 2025
1b9b121
style: optimize imports
matrei Aug 26, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,8 @@ import org.codehaus.groovy.transform.GroovyASTTransformationClass
@Documented
@Retention(RetentionPolicy.SOURCE)
@Target([ElementType.TYPE, ElementType.FIELD])
@GroovyASTTransformationClass("org.grails.async.transform.internal.DelegateAsyncTransformation")
@GroovyASTTransformationClass('org.grails.async.transform.internal.DelegateAsyncTransformation')
@interface DelegateAsync {

Class value() default DelegateAsync
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
*/
package grails.async

import java.util.concurrent.TimeUnit

import grails.async.decorator.PromiseDecorator
import grails.async.decorator.PromiseDecoratorLookupStrategy

import java.util.concurrent.TimeUnit

/**
* An interface capable of creating {@link Promise} instances. The {@link Promises} static methods use this
* interface to create promises. The default Promise creation mechanism can be overridden by setting {@link Promises#setPromiseFactory(PromiseFactory)}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
*/
package grails.async

import java.util.concurrent.TimeUnit

import groovy.transform.AutoFinal
import groovy.transform.CompileStatic

import java.util.concurrent.TimeUnit

/**
* A list of promises
*
Expand Down Expand Up @@ -138,7 +138,7 @@ class PromiseList<T> implements Promise<List<T>> {

@Override
boolean isDone() {
return promises.every {promise -> promise.isDone() }
return promises.every { promise -> promise.isDone() }
}

@Override
Expand Down
12 changes: 6 additions & 6 deletions grails-async/core/src/main/groovy/grails/async/PromiseMap.groovy
Original file line number Diff line number Diff line change
Expand Up @@ -18,11 +18,11 @@
*/
package grails.async

import java.util.concurrent.TimeUnit

import groovy.transform.AutoFinal
import groovy.transform.CompileStatic

import java.util.concurrent.TimeUnit

/**
* A map-like structure for promises that allows waiting for all values in the map to be populated before
* executing a callback
Expand Down Expand Up @@ -55,7 +55,7 @@ class PromiseMap<K,V> implements Promise<Map<K,V>> {

@Override
boolean isDone() {
return promisesKeys.keySet().every {it.isDone() }
return promisesKeys.keySet().every { it.isDone() }
}

@Override
Expand Down Expand Up @@ -213,7 +213,7 @@ class PromiseMap<K,V> implements Promise<Map<K,V>> {
Map<K,V> get() throws Throwable {
def promises = promises.values()
Map<K,V> resultMap = [:]
for(Promise<V> promise : promises) {
for (Promise<V> promise : promises) {
V value = promise.get()
resultMap.put(promisesKeys.get(promise), value)
}
Expand All @@ -232,7 +232,7 @@ class PromiseMap<K,V> implements Promise<Map<K,V>> {
List<Promise<V>> promises = new ArrayList<Promise<V>>(promises.values())
Promises.waitAll(promises, timeout, units)
Map<K,V> resultMap = [:]
for(Promise<V> promise : promises) {
for (Promise<V> promise : promises) {
V value = promise.get()
resultMap.put(promisesKeys.get(promise), value)
}
Expand All @@ -245,7 +245,7 @@ class PromiseMap<K,V> implements Promise<Map<K,V>> {
Promises.onComplete(promises) { List<V> values ->
Map<K,V> resultMap = [:]
int i = 0
for(V value in values) {
for (V value in values) {
Promise<V> promise = promises[i]
K key = promisesKeys.get(promise)
resultMap.put(key, value)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,12 +18,13 @@
*/
package grails.async

import grails.async.decorator.PromiseDecorator
import java.util.concurrent.TimeUnit

import groovy.transform.AutoFinal
import groovy.transform.CompileStatic
import org.grails.async.factory.PromiseFactoryBuilder

import java.util.concurrent.TimeUnit
import grails.async.decorator.PromiseDecorator
import org.grails.async.factory.PromiseFactoryBuilder

/**
* Factory class for working with {@link Promise} instances
Expand Down Expand Up @@ -164,6 +165,6 @@ class Promises {
* @see PromiseFactory#createBoundPromise(java.lang.Object)
*/
static<T> Promise<T> createBoundPromise(T value) {
return getPromiseFactory().createBoundPromise(value)
return getPromiseFactory().createBoundPromise(value)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,18 +18,19 @@
*/
package grails.async.factory

import java.util.concurrent.ConcurrentLinkedQueue

import groovy.transform.AutoFinal
import groovy.transform.CompileStatic

import grails.async.Promise
import grails.async.PromiseFactory
import grails.async.PromiseList
import grails.async.PromiseMap
import grails.async.decorator.PromiseDecorator
import grails.async.decorator.PromiseDecoratorLookupStrategy
import groovy.transform.AutoFinal
import groovy.transform.CompileStatic
import org.grails.async.factory.BoundPromise

import java.util.concurrent.ConcurrentLinkedQueue

/**
* Abstract implementation of the {@link grails.async.PromiseFactory} interface, subclasses should extend
* this class to obtain common generic functionality
Expand Down Expand Up @@ -59,13 +60,13 @@ abstract class AbstractPromiseFactory implements PromiseFactory {
}

<T> Closure<T> applyDecorators(Closure<T> closure, List<PromiseDecorator> decorators) {
List<PromiseDecorator> allDecorators = decorators != null ? new ArrayList<PromiseDecorator>(decorators): new ArrayList<PromiseDecorator>()
List<PromiseDecorator> allDecorators = decorators != null ? new ArrayList<PromiseDecorator>(decorators) : new ArrayList<PromiseDecorator>()
for (PromiseDecoratorLookupStrategy lookupStrategy : lookupStrategies) {
allDecorators.addAll(lookupStrategy.findDecorators())
}
def decoratedClosure = closure
if (!allDecorators.empty) {
for(PromiseDecorator decorator : allDecorators) {
for (PromiseDecorator decorator : allDecorators) {
decoratedClosure = decorator.decorate(decoratedClosure)
}
}
Expand All @@ -76,7 +77,7 @@ abstract class AbstractPromiseFactory implements PromiseFactory {
* @see PromiseFactory#createPromise(java.util.List)
*/
<T> Promise<List<T>> createPromise(List<Closure<T>> closures) {
return createPromise(closures,null)
return createPromise(closures, null)
}

/**
Expand All @@ -99,7 +100,7 @@ abstract class AbstractPromiseFactory implements PromiseFactory {
*/
<T> Promise<List<T>> createPromise(Promise<T>... promises) {
PromiseList<T> promiseList = new PromiseList<>()
for(Promise<T> promise : promises) {
for (Promise<T> promise : promises) {
promiseList.add(promise)
}
return promiseList
Expand Down Expand Up @@ -133,7 +134,7 @@ abstract class AbstractPromiseFactory implements PromiseFactory {
}

protected <T> Promise<T> createPromiseInternal(Closure<T> closure) {
return createPromise(closure)
return createPromise(closure)
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@
*/
package org.grails.async.factory

import grails.async.Promise
import java.util.concurrent.TimeUnit

import groovy.transform.CompileStatic

import java.util.concurrent.TimeUnit
import grails.async.Promise

/**
* A bound promise is a promise which is already resolved and doesn't require any asynchronous processing to calculate the value
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
package org.grails.async.factory

import grails.async.PromiseFactory
import grails.async.Promises
import groovy.transform.CompileStatic
import groovy.util.logging.Slf4j
import org.grails.async.factory.future.CachedThreadPoolPromiseFactory
Expand All @@ -43,13 +42,13 @@ class PromiseFactoryBuilder {
List<PromiseFactory> promiseFactories = ServiceLoader.load(PromiseFactory).toList()

PromiseFactory promiseFactory
if(promiseFactories.isEmpty()) {
log.debug 'No PromiseFactory implementation found. Using default ExecutorService promise factory.'
if (promiseFactories.isEmpty()) {
log.debug('No PromiseFactory implementation found. Using default ExecutorService promise factory.')
promiseFactory = new CachedThreadPoolPromiseFactory()
}
else {
promiseFactory = promiseFactories.first()
log.debug 'Found PromiseFactory implementation to use [{}]', promiseFactory
log.debug('Found PromiseFactory implementation to use [{}]', promiseFactory)
}

return promiseFactory
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,10 +18,11 @@
*/
package org.grails.async.factory

import grails.async.Promise
import java.util.concurrent.TimeUnit

import groovy.transform.CompileStatic

import java.util.concurrent.TimeUnit
import grails.async.Promise

/**
* A promise that executes synchronously, in the same thread as the creator
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,14 @@
*/
package org.grails.async.factory

import grails.async.Promise
import grails.async.PromiseList
import grails.async.factory.AbstractPromiseFactory
import java.util.concurrent.TimeUnit

import groovy.transform.AutoFinal
import groovy.transform.CompileStatic

import java.util.concurrent.TimeUnit
import grails.async.Promise
import grails.async.PromiseList
import grails.async.factory.AbstractPromiseFactory

/**
* A {@link grails.async.PromiseFactory} implementation that constructors promises that execute synchronously.
Expand Down Expand Up @@ -54,7 +55,7 @@ class SynchronousPromiseFactory extends AbstractPromiseFactory {
promise = new SynchronousPromise<T>(closures[0])
} else {
def promiseList = new PromiseList()
for(p in closures) {
for (p in closures) {
promiseList << p
}
promise = promiseList
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,22 @@

package org.grails.async.factory.future

import grails.async.Promise
import grails.async.PromiseList
import grails.async.factory.AbstractPromiseFactory
import java.util.concurrent.Callable
import java.util.concurrent.ExecutorService
import java.util.concurrent.RunnableFuture
import java.util.concurrent.SynchronousQueue
import java.util.concurrent.ThreadPoolExecutor
import java.util.concurrent.TimeUnit

import groovy.transform.AutoFinal
import groovy.transform.CompileStatic
import org.grails.async.factory.BoundPromise

import jakarta.annotation.PreDestroy
import java.util.concurrent.*

import grails.async.Promise
import grails.async.PromiseList
import grails.async.factory.AbstractPromiseFactory
import org.grails.async.factory.BoundPromise

/**
* A promise factory that uses an ExecutorService by default
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,14 +19,14 @@

package org.grails.async.factory.future

import grails.async.PromiseFactory

import java.util.concurrent.ExecutorService

import grails.async.PromiseFactory

/**
* Interface for classes that are both a PromiseFactory and an ExecutorService
*
* @author Graeme Rocher
* @since 3.3
*/
interface ExecutorPromiseFactory extends PromiseFactory, ExecutorService {}
interface ExecutorPromiseFactory extends PromiseFactory, ExecutorService {}
Original file line number Diff line number Diff line change
Expand Up @@ -19,18 +19,18 @@

package org.grails.async.factory.future

import grails.async.Promise
import grails.async.PromiseFactory
import groovy.transform.AutoFinal
import groovy.transform.CompileStatic
import groovy.transform.PackageScope
import org.grails.async.factory.BoundPromise

import java.util.concurrent.ConcurrentLinkedQueue
import java.util.concurrent.ExecutionException
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException
import java.util.concurrent.locks.ReentrantLock

import groovy.transform.AutoFinal
import groovy.transform.CompileStatic
import groovy.transform.PackageScope

import grails.async.Promise
import grails.async.PromiseFactory
import org.grails.async.factory.BoundPromise

/**
* A child promise of a {@link FutureTaskPromise}
Expand All @@ -54,7 +54,7 @@ class FutureTaskChildPromise<T> implements Promise<T> {

FutureTaskChildPromise(PromiseFactory promiseFactory, Promise<T> parent, Closure<T> callable) {
this.parent = parent
this.callable = promiseFactory.applyDecorators(callable,null)
this.callable = promiseFactory.applyDecorators(callable, null)
this.promiseFactory = promiseFactory
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,19 +19,20 @@

package org.grails.async.factory.future

import grails.async.Promise
import grails.async.PromiseFactory
import groovy.transform.AutoFinal
import groovy.transform.CompileStatic
import org.grails.async.factory.BoundPromise

import java.util.concurrent.Callable
import java.util.concurrent.ConcurrentLinkedQueue
import java.util.concurrent.ExecutionException
import java.util.concurrent.FutureTask
import java.util.concurrent.TimeUnit
import java.util.concurrent.TimeoutException

import groovy.transform.AutoFinal
import groovy.transform.CompileStatic

import grails.async.Promise
import grails.async.PromiseFactory
import org.grails.async.factory.BoundPromise

/**
* A Promise that is a {@link FutureTask}
*
Expand Down
Loading
Loading