diff --git a/grails-async/core/src/main/groovy/grails/async/DelegateAsync.groovy b/grails-async/core/src/main/groovy/grails/async/DelegateAsync.groovy index 7fb5615fbea..7dccd68d53b 100644 --- a/grails-async/core/src/main/groovy/grails/async/DelegateAsync.groovy +++ b/grails-async/core/src/main/groovy/grails/async/DelegateAsync.groovy @@ -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 } diff --git a/grails-async/core/src/main/groovy/grails/async/PromiseFactory.groovy b/grails-async/core/src/main/groovy/grails/async/PromiseFactory.groovy index c6691ef95c7..e1fa55b363a 100644 --- a/grails-async/core/src/main/groovy/grails/async/PromiseFactory.groovy +++ b/grails-async/core/src/main/groovy/grails/async/PromiseFactory.groovy @@ -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)} diff --git a/grails-async/core/src/main/groovy/grails/async/PromiseList.groovy b/grails-async/core/src/main/groovy/grails/async/PromiseList.groovy index b19b1b2f8f0..fcdffb9da9e 100644 --- a/grails-async/core/src/main/groovy/grails/async/PromiseList.groovy +++ b/grails-async/core/src/main/groovy/grails/async/PromiseList.groovy @@ -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 * @@ -138,7 +138,7 @@ class PromiseList implements Promise> { @Override boolean isDone() { - return promises.every {promise -> promise.isDone() } + return promises.every { promise -> promise.isDone() } } @Override diff --git a/grails-async/core/src/main/groovy/grails/async/PromiseMap.groovy b/grails-async/core/src/main/groovy/grails/async/PromiseMap.groovy index f367d961289..537e9d272eb 100644 --- a/grails-async/core/src/main/groovy/grails/async/PromiseMap.groovy +++ b/grails-async/core/src/main/groovy/grails/async/PromiseMap.groovy @@ -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 @@ -55,7 +55,7 @@ class PromiseMap implements Promise> { @Override boolean isDone() { - return promisesKeys.keySet().every {it.isDone() } + return promisesKeys.keySet().every { it.isDone() } } @Override @@ -213,7 +213,7 @@ class PromiseMap implements Promise> { Map get() throws Throwable { def promises = promises.values() Map resultMap = [:] - for(Promise promise : promises) { + for (Promise promise : promises) { V value = promise.get() resultMap.put(promisesKeys.get(promise), value) } @@ -232,7 +232,7 @@ class PromiseMap implements Promise> { List> promises = new ArrayList>(promises.values()) Promises.waitAll(promises, timeout, units) Map resultMap = [:] - for(Promise promise : promises) { + for (Promise promise : promises) { V value = promise.get() resultMap.put(promisesKeys.get(promise), value) } @@ -245,7 +245,7 @@ class PromiseMap implements Promise> { Promises.onComplete(promises) { List values -> Map resultMap = [:] int i = 0 - for(V value in values) { + for (V value in values) { Promise promise = promises[i] K key = promisesKeys.get(promise) resultMap.put(key, value) diff --git a/grails-async/core/src/main/groovy/grails/async/Promises.groovy b/grails-async/core/src/main/groovy/grails/async/Promises.groovy index 6b3c209bf85..676f9e2c4d7 100644 --- a/grails-async/core/src/main/groovy/grails/async/Promises.groovy +++ b/grails-async/core/src/main/groovy/grails/async/Promises.groovy @@ -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 @@ -164,6 +165,6 @@ class Promises { * @see PromiseFactory#createBoundPromise(java.lang.Object) */ static Promise createBoundPromise(T value) { - return getPromiseFactory().createBoundPromise(value) + return getPromiseFactory().createBoundPromise(value) } } diff --git a/grails-async/core/src/main/groovy/grails/async/factory/AbstractPromiseFactory.groovy b/grails-async/core/src/main/groovy/grails/async/factory/AbstractPromiseFactory.groovy index bbd488348cd..caf480a3d22 100644 --- a/grails-async/core/src/main/groovy/grails/async/factory/AbstractPromiseFactory.groovy +++ b/grails-async/core/src/main/groovy/grails/async/factory/AbstractPromiseFactory.groovy @@ -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 @@ -59,13 +60,13 @@ abstract class AbstractPromiseFactory implements PromiseFactory { } Closure applyDecorators(Closure closure, List decorators) { - List allDecorators = decorators != null ? new ArrayList(decorators): new ArrayList() + List allDecorators = decorators != null ? new ArrayList(decorators) : new ArrayList() 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) } } @@ -76,7 +77,7 @@ abstract class AbstractPromiseFactory implements PromiseFactory { * @see PromiseFactory#createPromise(java.util.List) */ Promise> createPromise(List> closures) { - return createPromise(closures,null) + return createPromise(closures, null) } /** @@ -99,7 +100,7 @@ abstract class AbstractPromiseFactory implements PromiseFactory { */ Promise> createPromise(Promise... promises) { PromiseList promiseList = new PromiseList<>() - for(Promise promise : promises) { + for (Promise promise : promises) { promiseList.add(promise) } return promiseList @@ -133,7 +134,7 @@ abstract class AbstractPromiseFactory implements PromiseFactory { } protected Promise createPromiseInternal(Closure closure) { - return createPromise(closure) + return createPromise(closure) } /** diff --git a/grails-async/core/src/main/groovy/org/grails/async/factory/BoundPromise.groovy b/grails-async/core/src/main/groovy/org/grails/async/factory/BoundPromise.groovy index e693655567f..fb57d78d352 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/factory/BoundPromise.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/factory/BoundPromise.groovy @@ -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 diff --git a/grails-async/core/src/main/groovy/org/grails/async/factory/PromiseFactoryBuilder.groovy b/grails-async/core/src/main/groovy/org/grails/async/factory/PromiseFactoryBuilder.groovy index 3ca1066012a..6960d24b165 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/factory/PromiseFactoryBuilder.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/factory/PromiseFactoryBuilder.groovy @@ -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 @@ -43,13 +42,13 @@ class PromiseFactoryBuilder { List 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 diff --git a/grails-async/core/src/main/groovy/org/grails/async/factory/SynchronousPromise.groovy b/grails-async/core/src/main/groovy/org/grails/async/factory/SynchronousPromise.groovy index fe1dd1a989f..7b71c03e194 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/factory/SynchronousPromise.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/factory/SynchronousPromise.groovy @@ -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 diff --git a/grails-async/core/src/main/groovy/org/grails/async/factory/SynchronousPromiseFactory.groovy b/grails-async/core/src/main/groovy/org/grails/async/factory/SynchronousPromiseFactory.groovy index fe4d94e9ab4..c619fb9e5f2 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/factory/SynchronousPromiseFactory.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/factory/SynchronousPromiseFactory.groovy @@ -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. @@ -54,7 +55,7 @@ class SynchronousPromiseFactory extends AbstractPromiseFactory { promise = new SynchronousPromise(closures[0]) } else { def promiseList = new PromiseList() - for(p in closures) { + for (p in closures) { promiseList << p } promise = promiseList diff --git a/grails-async/core/src/main/groovy/org/grails/async/factory/future/CachedThreadPoolPromiseFactory.groovy b/grails-async/core/src/main/groovy/org/grails/async/factory/future/CachedThreadPoolPromiseFactory.groovy index affba64fb2f..b3bab8302ca 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/factory/future/CachedThreadPoolPromiseFactory.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/factory/future/CachedThreadPoolPromiseFactory.groovy @@ -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 diff --git a/grails-async/core/src/main/groovy/org/grails/async/factory/future/ExecutorPromiseFactory.groovy b/grails-async/core/src/main/groovy/org/grails/async/factory/future/ExecutorPromiseFactory.groovy index 7167d9e4eae..c265022ab30 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/factory/future/ExecutorPromiseFactory.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/factory/future/ExecutorPromiseFactory.groovy @@ -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 {} \ No newline at end of file +interface ExecutorPromiseFactory extends PromiseFactory, ExecutorService {} diff --git a/grails-async/core/src/main/groovy/org/grails/async/factory/future/FutureTaskChildPromise.groovy b/grails-async/core/src/main/groovy/org/grails/async/factory/future/FutureTaskChildPromise.groovy index d0ce580e97f..3662fdbc6ed 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/factory/future/FutureTaskChildPromise.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/factory/future/FutureTaskChildPromise.groovy @@ -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} @@ -54,7 +54,7 @@ class FutureTaskChildPromise implements Promise { FutureTaskChildPromise(PromiseFactory promiseFactory, Promise parent, Closure callable) { this.parent = parent - this.callable = promiseFactory.applyDecorators(callable,null) + this.callable = promiseFactory.applyDecorators(callable, null) this.promiseFactory = promiseFactory } diff --git a/grails-async/core/src/main/groovy/org/grails/async/factory/future/FutureTaskPromise.groovy b/grails-async/core/src/main/groovy/org/grails/async/factory/future/FutureTaskPromise.groovy index 90cde682026..66f72568710 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/factory/future/FutureTaskPromise.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/factory/future/FutureTaskPromise.groovy @@ -19,12 +19,6 @@ 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 @@ -32,6 +26,13 @@ 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} * diff --git a/grails-async/core/src/main/groovy/org/grails/async/transform/internal/DelegateAsyncTransformation.java b/grails-async/core/src/main/groovy/org/grails/async/transform/internal/DelegateAsyncTransformation.java index 74fd98d37d4..1b286533e71 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/transform/internal/DelegateAsyncTransformation.java +++ b/grails-async/core/src/main/groovy/org/grails/async/transform/internal/DelegateAsyncTransformation.java @@ -18,11 +18,6 @@ */ package org.grails.async.transform.internal; -import grails.async.Promise; -import grails.async.Promises; -import groovy.lang.Closure; -import groovy.lang.GroovyObjectSupport; - import java.beans.Introspector; import java.lang.reflect.Modifier; import java.util.ArrayList; @@ -30,7 +25,8 @@ import java.util.Collections; import java.util.List; -import org.apache.grails.common.compiler.GroovyTransformOrder; +import groovy.lang.Closure; +import groovy.lang.GroovyObjectSupport; import org.codehaus.groovy.GroovyBugError; import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.AnnotatedNode; @@ -59,6 +55,10 @@ import org.codehaus.groovy.transform.TransformWithPriority; import org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport; +import grails.async.Promise; +import grails.async.Promises; +import org.apache.grails.common.compiler.GroovyTransformOrder; + /** * Implementation of {@link grails.async.DelegateAsync} transformation * @@ -84,7 +84,7 @@ public void visit(ASTNode[] nodes, SourceUnit source) { Expression value = annotationNode.getMember("value"); if (value instanceof ClassExpression) { ClassNode targetApi = value.getType().getPlainNodeReference(); - ClassNode classNode = (ClassNode)parent; + ClassNode classNode = (ClassNode) parent; final String fieldName = '$' + Introspector.decapitalize(targetApi.getNameWithoutPackage()); FieldNode fieldNode = classNode.getField(fieldName); @@ -96,8 +96,8 @@ public void visit(ASTNode[] nodes, SourceUnit source) { applyDelegateAsyncTransform(classNode, targetApi, fieldName); } } - else if(parent instanceof FieldNode) { - FieldNode fieldNode = (FieldNode)parent; + else if (parent instanceof FieldNode) { + FieldNode fieldNode = (FieldNode) parent; ClassNode targetApi = fieldNode.getType().getPlainNodeReference(); ClassNode classNode = fieldNode.getOwner(); applyDelegateAsyncTransform(classNode, targetApi, fieldNode.getName()); @@ -112,27 +112,26 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp MethodNode createPromiseMethodTargetWithDecorators = promisesClass.getDeclaredMethod("createPromise", new Parameter[]{new Parameter(new ClassNode(Closure.class), "c"), new Parameter(new ClassNode(List.class), "c")}); DelegateAsyncTransactionalMethodTransformer delegateAsyncTransactionalMethodTransformer = lookupAsyncTransactionalMethodTransformer(); - for(MethodNode m : methods) { + for (MethodNode m : methods) { if (isCandidateMethod(m)) { MethodNode existingMethod = classNode.getMethod(m.getName(), m.getParameters()); if (existingMethod == null) { ClassNode promiseNode = ClassHelper.make(Promise.class).getPlainNodeReference(); ClassNode originalReturnType = m.getReturnType(); - if(!originalReturnType.getNameWithoutPackage().equals(VOID)) { + if (!originalReturnType.getNameWithoutPackage().equals(VOID)) { ClassNode returnType; - if(ClassHelper.isPrimitiveType(originalReturnType.redirect())) { + if (ClassHelper.isPrimitiveType(originalReturnType.redirect())) { returnType = ClassHelper.getWrapper(originalReturnType.redirect()); } else { returnType = alignReturnType(classNode, originalReturnType); } - if(!OBJECT_CLASS_NODE.equals(returnType)) { + if (!OBJECT_CLASS_NODE.equals(returnType)) { promiseNode.setGenericsTypes(new GenericsType[]{new GenericsType(returnType)}); } } final BlockStatement methodBody = new BlockStatement(); final BlockStatement promiseBody = new BlockStatement(); - final ClosureExpression closureExpression = new ClosureExpression(new Parameter[0], promiseBody); VariableScope variableScope = new VariableScope(); closureExpression.setVariableScope(variableScope); @@ -147,8 +146,8 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp MethodCallExpression getDecoratorsMethodCall = new MethodCallExpression(new ClassExpression(delegateAsyncUtilsClassNode), "getPromiseDecorators", getPromiseDecoratorsArguments); getDecoratorsMethodCall.setMethodTarget(getPromiseDecoratorsMethodNode); - MethodCallExpression createPromiseWithDecorators = new MethodCallExpression(new ClassExpression(promisesClass), "createPromise",new ArgumentListExpression( closureExpression, getDecoratorsMethodCall)); - if(createPromiseMethodTargetWithDecorators != null) { + MethodCallExpression createPromiseWithDecorators = new MethodCallExpression(new ClassExpression(promisesClass), "createPromise", new ArgumentListExpression(closureExpression, getDecoratorsMethodCall)); + if (createPromiseMethodTargetWithDecorators != null) { createPromiseWithDecorators.setMethodTarget(createPromiseMethodTargetWithDecorators); } methodBody.addStatement(new ExpressionStatement(createPromiseWithDecorators)); @@ -156,7 +155,7 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp final ArgumentListExpression arguments = new ArgumentListExpression(); Parameter[] parameters = copyParameters(StaticTypeCheckingSupport.parameterizeArguments(classNode, m)); - for(Parameter p : parameters) { + for (Parameter p : parameters) { p.setClosureSharedVariable(true); variableScope.putReferencedLocalVariable(p); VariableExpression ve = new VariableExpression(p); @@ -165,7 +164,7 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp } MethodCallExpression delegateMethodCall = new MethodCallExpression(new VariableExpression(fieldName), m.getName(), arguments); promiseBody.addStatement(new ExpressionStatement(delegateMethodCall)); - MethodNode newMethodNode = new MethodNode(m.getName(), Modifier.PUBLIC,promiseNode, parameters,null, methodBody); + MethodNode newMethodNode = new MethodNode(m.getName(), Modifier.PUBLIC, promiseNode, parameters, null, methodBody); classNode.addMethod(newMethodNode); } } @@ -183,7 +182,7 @@ private static ClassNode alignReturnType(final ClassNode receiver, final ClassNo GenericsType[] redirectReceiverTypes = redirectTypes.toArray(new GenericsType[0]); GenericsType[] receiverParameterizedTypes = receiver.getGenericsTypes(); - if (receiverParameterizedTypes==null) { + if (receiverParameterizedTypes == null) { receiverParameterizedTypes = redirectReceiverTypes; } @@ -221,7 +220,7 @@ private static Parameter[] copyParameters(Parameter[] parameterTypes) { Parameter parameterType = parameterTypes[i]; ClassNode parameterTypeCN = parameterType.getType(); ClassNode newParameterTypeCN = parameterTypeCN.getPlainNodeReference(); - if(parameterTypeCN.isUsingGenerics() && !parameterTypeCN.isGenericsPlaceHolder()) { + if (parameterTypeCN.isUsingGenerics() && !parameterTypeCN.isGenericsPlaceHolder()) { newParameterTypeCN.setGenericsTypes(parameterTypeCN.getGenericsTypes()); } Parameter newParameter = new Parameter(newParameterTypeCN, parameterType.getName(), parameterType.getInitialExpression()); @@ -237,7 +236,7 @@ public int priority() { } private static class NoopDelegateAsyncTransactionalMethodTransformer implements DelegateAsyncTransactionalMethodTransformer { - public void transformTransactionalMethod(ClassNode classNode,ClassNode delegateClassNode, MethodNode methodNode, ListExpression promiseDecoratorLookupArguments) { + public void transformTransactionalMethod(ClassNode classNode, ClassNode delegateClassNode, MethodNode methodNode, ListExpression promiseDecoratorLookupArguments) { // noop } } diff --git a/grails-async/core/src/main/groovy/org/grails/async/transform/internal/DelegateAsyncUtils.groovy b/grails-async/core/src/main/groovy/org/grails/async/transform/internal/DelegateAsyncUtils.groovy index 7041c066f12..93755278eda 100644 --- a/grails-async/core/src/main/groovy/org/grails/async/transform/internal/DelegateAsyncUtils.groovy +++ b/grails-async/core/src/main/groovy/org/grails/async/transform/internal/DelegateAsyncUtils.groovy @@ -30,6 +30,7 @@ import grails.async.decorator.PromiseDecoratorProvider */ @CompileStatic class DelegateAsyncUtils { + /** * Obtains all {@link PromiseDecorator} instances for the target and additional decorators supplied * @@ -37,10 +38,10 @@ class DelegateAsyncUtils { * @param additional The additional * @return The additional promise decorators */ - static Collection getPromiseDecorators(Object target, Collection additional ) { + static Collection getPromiseDecorators(Object target, Collection additional) { Collection decorators = [] if (target instanceof PromiseDecoratorProvider) { - decorators.addAll(((PromiseDecoratorProvider)target).getDecorators()) + decorators.addAll(((PromiseDecoratorProvider) target).getDecorators()) } if (additional) { decorators.addAll(additional) diff --git a/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/GparsPromise.groovy b/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/GparsPromise.groovy index ed1731ea112..943a2e05abf 100644 --- a/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/GparsPromise.groovy +++ b/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/GparsPromise.groovy @@ -51,7 +51,7 @@ class GparsPromise implements Promise { @Override boolean cancel(boolean mayInterruptIfRunning) { - if(isDone()) return false + if (isDone()) return false throw new UnsupportedOperationException('Cancellation not supported') } @@ -77,7 +77,7 @@ class GparsPromise implements Promise { @Override Promise accept(T value) { - internalPromise = Dataflow.task({value}) + internalPromise = Dataflow.task({ value }) return this } @@ -87,7 +87,7 @@ class GparsPromise implements Promise { @Override Promise onComplete(Closure callable) { - def decoratedCallable= promiseFactory.applyDecorators(callable, null) + def decoratedCallable = promiseFactory.applyDecorators(callable, null) internalPromise.whenBound { T value -> if (!(value instanceof Throwable)) { return decoratedCallable.call(value) @@ -114,4 +114,4 @@ class GparsPromise implements Promise { def decoratedCallable = promiseFactory.applyDecorators(callable, null) return new GparsPromise(promiseFactory, internalPromise.then(decoratedCallable)) } -} \ No newline at end of file +} diff --git a/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/GparsPromiseFactory.groovy b/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/GparsPromiseFactory.groovy index 1782c75948f..acb48f31482 100644 --- a/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/GparsPromiseFactory.groovy +++ b/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/GparsPromiseFactory.groovy @@ -18,18 +18,19 @@ */ package org.grails.async.factory.gpars -import grails.async.Promise -import grails.async.PromiseList +import java.util.concurrent.TimeUnit + import groovy.transform.AutoFinal import groovy.transform.CompileStatic + import groovyx.gpars.GParsConfig import groovyx.gpars.dataflow.Dataflow import groovyx.gpars.dataflow.DataflowVariable +import grails.async.Promise +import grails.async.PromiseList import grails.async.factory.AbstractPromiseFactory -import java.util.concurrent.TimeUnit - /** * GPars implementation of the {@link grails.async.PromiseFactory} interface * @@ -75,7 +76,7 @@ class GparsPromiseFactory extends AbstractPromiseFactory { Promise createPromise(Closure... closures) { if (closures.length == 1) { def callable = closures[0] - return new GparsPromise(this, applyDecorators(callable,null)) + return new GparsPromise(this, applyDecorators(callable, null)) } PromiseList promiseList = new PromiseList<>() for (c in closures) { diff --git a/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/LoggingPoolFactory.groovy b/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/LoggingPoolFactory.groovy index c97b8cdc559..3709b412697 100644 --- a/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/LoggingPoolFactory.groovy +++ b/grails-async/gpars/src/main/groovy/org/grails/async/factory/gpars/LoggingPoolFactory.groovy @@ -18,8 +18,16 @@ */ package org.grails.async.factory.gpars +import java.lang.reflect.Method +import java.util.concurrent.RejectedExecutionHandler +import java.util.concurrent.SynchronousQueue +import java.util.concurrent.ThreadFactory +import java.util.concurrent.ThreadPoolExecutor +import java.util.concurrent.TimeUnit + import groovy.transform.AutoFinal import groovy.transform.CompileStatic + import groovyx.gpars.scheduler.DefaultPool import groovyx.gpars.scheduler.Pool import groovyx.gpars.util.PoolFactory @@ -27,9 +35,6 @@ import groovyx.gpars.util.PoolUtils import org.slf4j.Logger import org.slf4j.LoggerFactory -import java.lang.reflect.Method -import java.util.concurrent.* - /** * A pool factory that logs error instead of printing them to standard err as is the default in GPars * @@ -40,7 +45,7 @@ import java.util.concurrent.* @CompileStatic class LoggingPoolFactory implements PoolFactory { - private static final long KEEP_ALIVE_TIME = 10L; + private static final long KEEP_ALIVE_TIME = 10L public static final Logger LOG = LoggerFactory.getLogger(LoggingPoolFactory) public static Method createThreadNameMethod @@ -79,7 +84,7 @@ class LoggingPoolFactory implements PoolFactory { * @return The newly created thread pool */ private static ThreadPoolExecutor createResizeablePool(boolean daemon, int poolSize) { - assert poolSize > 0; + assert poolSize > 0 return new ThreadPoolExecutor(poolSize, 1000, KEEP_ALIVE_TIME, TimeUnit.SECONDS, new SynchronousQueue(), new ThreadFactory() { @Override Thread newThread(Runnable r) { @@ -96,8 +101,8 @@ class LoggingPoolFactory implements PoolFactory { }, new RejectedExecutionHandler() { @Override void rejectedExecution(Runnable r, ThreadPoolExecutor executor) { - throw new IllegalStateException("The thread pool executor cannot run the task. " + - "The upper limit of the thread pool size has probably been reached. " + + throw new IllegalStateException('The thread pool executor cannot run the task. ' + + 'The upper limit of the thread pool size has probably been reached. ' + "Current pool size: $executor.poolSize Maximum pool size: $executor.maximumPoolSize") } }) diff --git a/grails-async/plugin/src/main/groovy/grails/async/services/PersistenceContextPromiseDecorator.groovy b/grails-async/plugin/src/main/groovy/grails/async/services/PersistenceContextPromiseDecorator.groovy index abbc3a8e65b..bc5b924a850 100644 --- a/grails-async/plugin/src/main/groovy/grails/async/services/PersistenceContextPromiseDecorator.groovy +++ b/grails-async/plugin/src/main/groovy/grails/async/services/PersistenceContextPromiseDecorator.groovy @@ -19,6 +19,7 @@ package grails.async.services import groovy.transform.CompileStatic + import grails.persistence.support.PersistenceContextInterceptorExecutor import grails.async.decorator.PromiseDecorator @@ -29,7 +30,8 @@ import grails.async.decorator.PromiseDecorator * @since 2.3 */ @CompileStatic -class PersistenceContextPromiseDecorator implements PromiseDecorator{ +class PersistenceContextPromiseDecorator implements PromiseDecorator { + PersistenceContextInterceptorExecutor persistenceContextInterceptorExecutor PersistenceContextPromiseDecorator(PersistenceContextInterceptorExecutor persistenceContextInterceptorExecutor) { diff --git a/grails-async/plugin/src/main/groovy/grails/async/services/TransactionalPromiseDecorator.groovy b/grails-async/plugin/src/main/groovy/grails/async/services/TransactionalPromiseDecorator.groovy index 7032c4a247f..a0406fdd7dd 100644 --- a/grails-async/plugin/src/main/groovy/grails/async/services/TransactionalPromiseDecorator.groovy +++ b/grails-async/plugin/src/main/groovy/grails/async/services/TransactionalPromiseDecorator.groovy @@ -18,9 +18,12 @@ */ package grails.async.services +import java.lang.annotation.Annotation +import java.lang.reflect.Method + import groovy.transform.AutoFinal import groovy.transform.CompileStatic -import grails.async.decorator.PromiseDecorator + import org.springframework.beans.BeanWrapper import org.springframework.beans.PropertyAccessorFactory import org.springframework.transaction.PlatformTransactionManager @@ -31,8 +34,7 @@ import org.springframework.transaction.support.TransactionCallback import org.springframework.transaction.support.TransactionTemplate import org.springframework.util.ReflectionUtils -import java.lang.annotation.Annotation -import java.lang.reflect.Method +import grails.async.decorator.PromiseDecorator /** * A {@link PromiseDecorator} that wraps a {@link grails.async.Promise} in a transaction @@ -78,7 +80,7 @@ class TransactionalPromiseDecorator implements PromiseDecorator, TransactionDefi @Override Closure decorate(Closure original) { if (transactionManager != null) { - return (Closure){ args -> + return (Closure) { args -> def transactionTemplate = transactionDefinition != null ? new TransactionTemplate(transactionManager, transactionDefinition) : new TransactionTemplate(transactionManager) transactionTemplate.execute({ original.call(args) diff --git a/grails-async/plugin/src/main/groovy/grails/async/web/AsyncController.groovy b/grails-async/plugin/src/main/groovy/grails/async/web/AsyncController.groovy index be3bbe2b0b4..71d4892d526 100644 --- a/grails-async/plugin/src/main/groovy/grails/async/web/AsyncController.groovy +++ b/grails-async/plugin/src/main/groovy/grails/async/web/AsyncController.groovy @@ -20,16 +20,18 @@ package grails.async.web import groovy.transform.CompileStatic -import org.grails.plugins.web.async.GrailsAsyncContext -import org.grails.web.servlet.mvc.GrailsWebRequest -import org.grails.web.util.GrailsApplicationAttributes + +import jakarta.servlet.AsyncContext +import jakarta.servlet.http.HttpServletRequest + import org.springframework.web.context.request.RequestContextHolder import org.springframework.web.context.request.async.AsyncWebRequest import org.springframework.web.context.request.async.WebAsyncManager import org.springframework.web.context.request.async.WebAsyncUtils -import jakarta.servlet.AsyncContext -import jakarta.servlet.http.HttpServletRequest +import org.grails.plugins.web.async.GrailsAsyncContext +import org.grails.web.servlet.mvc.GrailsWebRequest +import org.grails.web.util.GrailsApplicationAttributes /** * Exposes a startAsync() method for access to the Servlet 3.x API @@ -39,13 +41,14 @@ import jakarta.servlet.http.HttpServletRequest */ @CompileStatic trait AsyncController { + /** * Raw access to the Servlet 3.0 startAsync method * * @return a new {@link javax.servlet.AsyncContext} */ AsyncContext startAsync() { - GrailsWebRequest webRequest = (GrailsWebRequest)RequestContextHolder.currentRequestAttributes() + GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes() HttpServletRequest request = webRequest.currentRequest WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request) diff --git a/grails-async/plugin/src/main/groovy/grails/async/web/AsyncGrailsWebRequest.groovy b/grails-async/plugin/src/main/groovy/grails/async/web/AsyncGrailsWebRequest.groovy index 7266d214039..66387a99818 100644 --- a/grails-async/plugin/src/main/groovy/grails/async/web/AsyncGrailsWebRequest.groovy +++ b/grails-async/plugin/src/main/groovy/grails/async/web/AsyncGrailsWebRequest.groovy @@ -26,14 +26,15 @@ import org.springframework.context.ApplicationContext import org.springframework.util.Assert import org.springframework.web.context.request.async.AsyncWebRequest +import java.util.concurrent.atomic.AtomicBoolean +import java.util.function.Consumer + import jakarta.servlet.AsyncContext import jakarta.servlet.AsyncEvent import jakarta.servlet.AsyncListener import jakarta.servlet.ServletContext import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse -import java.util.concurrent.atomic.AtomicBoolean -import java.util.function.Consumer /** * Implementation of Spring 4.0 {@link AsyncWebRequest} interface for Grails @@ -42,8 +43,9 @@ import java.util.function.Consumer * @since 3.0 */ @CompileStatic -class AsyncGrailsWebRequest extends GrailsWebRequest implements AsyncWebRequest, AsyncListener{ - static final String WEB_REQUEST = "org.grails.ASYNC_WEB_REQUEST" +class AsyncGrailsWebRequest extends GrailsWebRequest implements AsyncWebRequest, AsyncListener { + + static final String WEB_REQUEST = 'org.grails.ASYNC_WEB_REQUEST' Long timeout AsyncContext asyncContext @@ -75,7 +77,7 @@ class AsyncGrailsWebRequest extends GrailsWebRequest implements AsyncWebRequest, * @return The GrailsWebRequest */ static AsyncGrailsWebRequest lookup(HttpServletRequest request) { - AsyncGrailsWebRequest webRequest = (AsyncGrailsWebRequest) request.getAttribute(WEB_REQUEST); + AsyncGrailsWebRequest webRequest = (AsyncGrailsWebRequest) request.getAttribute(WEB_REQUEST) return webRequest } @@ -96,8 +98,8 @@ class AsyncGrailsWebRequest extends GrailsWebRequest implements AsyncWebRequest, @Override void startAsync() { - Assert.state(request.asyncSupported, "The current request does not support Async processing") - if(!isAsyncStarted()) { + Assert.state(request.asyncSupported, 'The current request does not support Async processing') + if (!isAsyncStarted()) { asyncContext = request.startAsync(request, response) asyncContext.addListener(this) } @@ -110,8 +112,8 @@ class AsyncGrailsWebRequest extends GrailsWebRequest implements AsyncWebRequest, @Override void dispatch() { - Assert.notNull this.asyncContext, "Cannot dispatch without an AsyncContext" - asyncContext.dispatch() + Assert.notNull(this.asyncContext, 'Cannot dispatch without an AsyncContext') + asyncContext.dispatch() } @Override @@ -121,16 +123,16 @@ class AsyncGrailsWebRequest extends GrailsWebRequest implements AsyncWebRequest, @Override void onComplete(AsyncEvent event) throws IOException { - for(handler in completionHandlers) { + for (handler in completionHandlers) { handler.run() } asyncContext = null - asyncCompleted.set true + asyncCompleted.set(true) } @Override void onTimeout(AsyncEvent event) throws IOException { - for(handler in timeoutHandlers) { + for (handler in timeoutHandlers) { handler.run() } } diff --git a/grails-async/plugin/src/main/groovy/grails/async/web/WebPromises.groovy b/grails-async/plugin/src/main/groovy/grails/async/web/WebPromises.groovy index 7a923d03d1b..425f583dc00 100644 --- a/grails-async/plugin/src/main/groovy/grails/async/web/WebPromises.groovy +++ b/grails-async/plugin/src/main/groovy/grails/async/web/WebPromises.groovy @@ -19,15 +19,16 @@ package grails.async.web +import java.util.concurrent.TimeUnit + +import groovy.transform.CompileStatic + import grails.async.Promise import grails.async.PromiseFactory import grails.async.decorator.PromiseDecorator -import groovy.transform.CompileStatic import org.grails.async.factory.PromiseFactoryBuilder import org.grails.plugins.web.async.AsyncWebRequestPromiseDecoratorLookupStrategy -import java.util.concurrent.TimeUnit - /** * A specific promises factory class designed for use in controllers and other web contexts * diff --git a/grails-async/plugin/src/main/groovy/org/grails/async/transform/internal/DefaultDelegateAsyncTransactionalMethodTransformer.groovy b/grails-async/plugin/src/main/groovy/org/grails/async/transform/internal/DefaultDelegateAsyncTransactionalMethodTransformer.groovy index 2630bc9599b..bc2df334006 100644 --- a/grails-async/plugin/src/main/groovy/org/grails/async/transform/internal/DefaultDelegateAsyncTransactionalMethodTransformer.groovy +++ b/grails-async/plugin/src/main/groovy/org/grails/async/transform/internal/DefaultDelegateAsyncTransactionalMethodTransformer.groovy @@ -18,6 +18,8 @@ */ package org.grails.async.transform.internal +import java.lang.reflect.Modifier + import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode @@ -36,15 +38,15 @@ import org.codehaus.groovy.ast.expr.PropertyExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.ExpressionStatement -import org.grails.compiler.injection.GrailsASTUtils -import org.grails.compiler.web.async.TransactionalAsyncTransformUtils -import grails.transaction.TransactionManagerAware import org.codehaus.groovy.syntax.Token import org.codehaus.groovy.syntax.Types + import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.annotation.Transactional -import java.lang.reflect.Modifier +import org.grails.compiler.injection.GrailsASTUtils +import org.grails.compiler.web.async.TransactionalAsyncTransformUtils +import grails.transaction.TransactionManagerAware /** * Modifies the @DelegateAsync transform to take into account transactional services. New instance should be created per class transform, as state is held. @@ -55,32 +57,32 @@ import java.lang.reflect.Modifier @CompileStatic class DefaultDelegateAsyncTransactionalMethodTransformer implements DelegateAsyncTransactionalMethodTransformer { - private static final String TRANSACTIONAL_FIELD = "transactional" + private static final String TRANSACTIONAL_FIELD = 'transactional' private static final ClassNode TRANSACTIONAL_CLASS_NODE = new ClassNode(Transactional) private static final ClassNode INTERFACE_TRANSACTION_MANAGER = new ClassNode(PlatformTransactionManager).getPlainNodeReference() private static final ClassNode INTERFACE_TRANSACTION_MANAGER_AWARE = new ClassNode(TransactionManagerAware).getPlainNodeReference() - private static final Parameter[] SET_TRANSACTION_MANAGER_METHOD_PARAMETERS = [new Parameter(INTERFACE_TRANSACTION_MANAGER, "transactionManager")] as Parameter[] + private static final Parameter[] SET_TRANSACTION_MANAGER_METHOD_PARAMETERS = [new Parameter(INTERFACE_TRANSACTION_MANAGER, 'transactionManager')] as Parameter[] private static final String FIELD_NAME_TRANSACTION_MANAGER = '$transactionManager' private static final String FIELD_NAME_PROMISE_DECORATORS = '$promiseDecorators' - private static final ClassNode CLASS_NODE_MAP = new ClassNode(Map.class).getPlainNodeReference() - private static final String METHOD_NAME_SET_TRANSACTION_MANAGER = "setTransactionManager" - private static final VariableExpression EXPRESSION_THIS = new VariableExpression("this") - private static final Token OPERATOR_ASSIGNMENT = new Token(Types.EQUAL,"=", -1,-1) - private static final String VARIABLE_TRANSACTION_MANAGER = "txMgr" + private static final ClassNode CLASS_NODE_MAP = new ClassNode(Map).getPlainNodeReference() + private static final String METHOD_NAME_SET_TRANSACTION_MANAGER = 'setTransactionManager' + private static final VariableExpression EXPRESSION_THIS = new VariableExpression('this') + private static final Token OPERATOR_ASSIGNMENT = new Token(Types.EQUAL, '=', -1, -1) + private static final String VARIABLE_TRANSACTION_MANAGER = 'txMgr' private FieldNode transactionalField private boolean isTransactional = false private int promiseDecoratorCount = 0 @Override - void transformTransactionalMethod(ClassNode classNode,ClassNode delegateClassNode, MethodNode methodNode, ListExpression promiseDecorators) { + void transformTransactionalMethod(ClassNode classNode, ClassNode delegateClassNode, MethodNode methodNode, ListExpression promiseDecorators) { if (transactionalField == null) { transactionalField = delegateClassNode.getField(TRANSACTIONAL_FIELD) isTransactional = false - if(transactionalField) { + if (transactionalField) { def ie = transactionalField.getInitialExpression() - if(ie instanceof ConstantExpression) { + if (ie instanceof ConstantExpression) { isTransactional = ie.isTrueExpression() } } @@ -92,9 +94,8 @@ class DefaultDelegateAsyncTransactionalMethodTransformer implements DelegateAsyn int currentIndex = promiseDecoratorCount++ - final methodLookupArguments = new ArgumentListExpression(new ConstantExpression(methodNode.getName())) - for(Parameter p in methodNode.getParameters()) { + for (Parameter p in methodNode.getParameters()) { methodLookupArguments.addExpression(new ClassExpression(p.getType().getPlainNodeReference())) } final promiseLookupExpression = new BinaryExpression(new PropertyExpression(EXPRESSION_THIS, FIELD_NAME_PROMISE_DECORATORS), Token.newSymbol(Types.LEFT_SQUARE_BRACKET, -1, -1), new ConstantExpression(currentIndex)) @@ -105,11 +106,11 @@ class DefaultDelegateAsyncTransactionalMethodTransformer implements DelegateAsyn OPERATOR_ASSIGNMENT, new MethodCallExpression( new ClassExpression(new ClassNode(TransactionalAsyncTransformUtils).getPlainNodeReference()), - "createTransactionalPromiseDecorator", + 'createTransactionalPromiseDecorator', new ArgumentListExpression(new VariableExpression(VARIABLE_TRANSACTION_MANAGER), new MethodCallExpression( new ClassExpression(delegateClassNode), - "getDeclaredMethod", methodLookupArguments + 'getDeclaredMethod', methodLookupArguments ) ) ) @@ -137,12 +138,12 @@ class DefaultDelegateAsyncTransactionalMethodTransformer implements DelegateAsyn classNode.addField(new FieldNode(FIELD_NAME_TRANSACTION_MANAGER, Modifier.PRIVATE, INTERFACE_TRANSACTION_MANAGER, classNode, GrailsASTUtils.NULL_EXPRESSION)) } final promiseDecoratorsField = classNode.getField(FIELD_NAME_PROMISE_DECORATORS) - if(promiseDecoratorsField == null) { + if (promiseDecoratorsField == null) { classNode.addField(new FieldNode(FIELD_NAME_PROMISE_DECORATORS, Modifier.PRIVATE, CLASS_NODE_MAP, classNode, new MapExpression())) } final methodBody = new BlockStatement() - final transactionManagerParameter = new Parameter(INTERFACE_TRANSACTION_MANAGER, "transactionManager") + final transactionManagerParameter = new Parameter(INTERFACE_TRANSACTION_MANAGER, 'transactionManager') def parameters = [transactionManagerParameter] as Parameter[] final txMgrParam = new VariableExpression(transactionManagerParameter) methodBody.addStatement( @@ -168,6 +169,6 @@ class DefaultDelegateAsyncTransactionalMethodTransformer implements DelegateAsyn } - return (BlockStatement)method.getCode() + return (BlockStatement) method.getCode() } } diff --git a/grails-async/plugin/src/main/groovy/org/grails/compiler/web/async/TransactionalAsyncTransformUtils.groovy b/grails-async/plugin/src/main/groovy/org/grails/compiler/web/async/TransactionalAsyncTransformUtils.groovy index 7b2a25157ef..1c0c1d64d2e 100644 --- a/grails-async/plugin/src/main/groovy/org/grails/compiler/web/async/TransactionalAsyncTransformUtils.groovy +++ b/grails-async/plugin/src/main/groovy/org/grails/compiler/web/async/TransactionalAsyncTransformUtils.groovy @@ -18,12 +18,14 @@ */ package org.grails.compiler.web.async -import grails.async.services.TransactionalPromiseDecorator +import java.lang.reflect.Method + import groovy.transform.CompileStatic + import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.annotation.Transactional -import java.lang.reflect.Method +import grails.async.services.TransactionalPromiseDecorator /** * Utility methods for use by Async transformations @@ -34,7 +36,6 @@ import java.lang.reflect.Method @CompileStatic class TransactionalAsyncTransformUtils { - /** * Creates a {@link TransactionalPromiseDecorator} for the given transactionManager and method to be invoked * diff --git a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecorator.groovy b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecorator.groovy index c63d86fd148..5303f5fd649 100644 --- a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecorator.groovy +++ b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecorator.groovy @@ -19,20 +19,23 @@ package org.grails.plugins.web.async -import grails.async.web.AsyncGrailsWebRequest +import java.util.concurrent.TimeoutException + import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode -import org.grails.web.servlet.mvc.GrailsWebRequest -import org.grails.web.util.WebUtils -import grails.async.decorator.PromiseDecorator -import org.springframework.web.context.request.RequestContextHolder -import org.springframework.web.context.request.async.WebAsyncManager -import org.springframework.web.context.request.async.WebAsyncUtils import jakarta.servlet.AsyncContext import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse -import java.util.concurrent.TimeoutException + +import org.springframework.web.context.request.RequestContextHolder +import org.springframework.web.context.request.async.WebAsyncManager +import org.springframework.web.context.request.async.WebAsyncUtils + +import grails.async.web.AsyncGrailsWebRequest +import org.grails.web.servlet.mvc.GrailsWebRequest +import org.grails.web.util.WebUtils +import grails.async.decorator.PromiseDecorator /** * A promise decorated lookup strategy that binds a WebRequest to the promise thread @@ -42,6 +45,7 @@ import java.util.concurrent.TimeoutException */ @CompileStatic class AsyncWebRequestPromiseDecorator implements PromiseDecorator { + GrailsWebRequest webRequest final AsyncGrailsWebRequest asyncRequest final AsyncContext asyncContext @@ -52,15 +56,15 @@ class AsyncWebRequestPromiseDecorator implements PromiseDecorator { HttpServletRequest currentServletRequest = webRequest.currentRequest WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(currentServletRequest) AsyncGrailsWebRequest newWebRequest - if(asyncManager.isConcurrentHandlingStarted()) { + if (asyncManager.isConcurrentHandlingStarted()) { newWebRequest = AsyncGrailsWebRequest.lookup(currentServletRequest) asyncContext = newWebRequest.asyncContext - if( newWebRequest == null || newWebRequest.isAsyncComplete() ) { - throw new IllegalStateException("Cannot start a task once asynchronous request processing has completed") + if (newWebRequest == null || newWebRequest.isAsyncComplete()) { + throw new IllegalStateException('Cannot start a task once asynchronous request processing has completed') } } else { - newWebRequest = new AsyncGrailsWebRequest(currentServletRequest, webRequest.currentResponse, webRequest.servletContext,webRequest.applicationContext) + newWebRequest = new AsyncGrailsWebRequest(currentServletRequest, webRequest.currentResponse, webRequest.servletContext, webRequest.applicationContext) asyncManager.setAsyncWebRequest(newWebRequest) newWebRequest.startAsync() asyncContext = newWebRequest.asyncContext @@ -75,11 +79,11 @@ class AsyncWebRequestPromiseDecorator implements PromiseDecorator { @Override def Closure decorate(Closure c) { return (Closure) { args -> - if(timeoutReached) { - throw new TimeoutException("Asynchronous request processing timeout reached") + if (timeoutReached) { + throw new TimeoutException('Asynchronous request processing timeout reached') } HttpServletRequest request = (HttpServletRequest) asyncContext.request - if(request.isAsyncStarted()) { + if (request.isAsyncStarted()) { WebUtils.storeGrailsWebRequest(new GrailsWebRequest(request, (HttpServletResponse)asyncContext.response, webRequest.attributes)) try { @@ -90,7 +94,7 @@ class AsyncWebRequestPromiseDecorator implements PromiseDecorator { } } else { - throw new IllegalStateException("Asynchronous request already terminated. Likely timeout reached") + throw new IllegalStateException('Asynchronous request already terminated. Likely timeout reached') } } } @@ -100,7 +104,7 @@ class AsyncWebRequestPromiseDecorator implements PromiseDecorator { if (args == null) { c.call(null) } - else if(args && args.getClass().isArray()) { + else if (args && args.getClass().isArray()) { c.call(*args) } else if (args instanceof List) { diff --git a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.groovy b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.groovy index f43bc1ab065..549ef40fd97 100644 --- a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.groovy +++ b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/AsyncWebRequestPromiseDecoratorLookupStrategy.groovy @@ -19,9 +19,10 @@ package org.grails.plugins.web.async import groovy.transform.CompileStatic -import org.grails.web.servlet.mvc.GrailsWebRequest + import grails.async.decorator.PromiseDecorator import grails.async.decorator.PromiseDecoratorLookupStrategy +import org.grails.web.servlet.mvc.GrailsWebRequest /** * A promise decorated lookup strategy that binds a WebRequest to the promise thread @@ -31,6 +32,7 @@ import grails.async.decorator.PromiseDecoratorLookupStrategy */ @CompileStatic class AsyncWebRequestPromiseDecoratorLookupStrategy implements PromiseDecoratorLookupStrategy { + @Override List findDecorators() { final webRequest = GrailsWebRequest.lookup() diff --git a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/ControllersAsyncGrailsPlugin.groovy b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/ControllersAsyncGrailsPlugin.groovy index f6b20c98502..1e6edee50bb 100644 --- a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/ControllersAsyncGrailsPlugin.groovy +++ b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/ControllersAsyncGrailsPlugin.groovy @@ -30,10 +30,13 @@ import org.grails.plugins.web.async.spring.PromiseFactoryBean * @since 2.0 */ class ControllersAsyncGrailsPlugin extends Plugin { - def grailsVersion = "7.0.0 > *" + + def grailsVersion = '7.0.0 > *' def loadAfter = ['controllers'] - Closure doWithSpring() {{-> - asyncPromiseResponseActionResultTransformer(AsyncActionResultTransformer) - grailsPromiseFactory(PromiseFactoryBean) - }} + Closure doWithSpring() { + { -> + asyncPromiseResponseActionResultTransformer(AsyncActionResultTransformer) + grailsPromiseFactory(PromiseFactoryBean) + } + } } diff --git a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/GrailsAsyncContext.groovy b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/GrailsAsyncContext.groovy index ebba8346d96..5f6a0edaa11 100644 --- a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/GrailsAsyncContext.groovy +++ b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/GrailsAsyncContext.groovy @@ -18,12 +18,13 @@ */ package org.grails.plugins.web.async -import grails.async.web.AsyncGrailsWebRequest -import grails.persistence.support.PersistenceContextInterceptor import jakarta.servlet.AsyncContext import jakarta.servlet.AsyncListener import jakarta.servlet.http.HttpServletRequest import jakarta.servlet.http.HttpServletResponse + +import grails.async.web.AsyncGrailsWebRequest +import grails.persistence.support.PersistenceContextInterceptor import org.grails.web.servlet.mvc.GrailsWebRequest import org.grails.web.util.WebUtils @@ -53,7 +54,7 @@ class GrailsAsyncContext implements AsyncContext { void start(Runnable runnable) { delegate.start { - GrailsWebRequest webRequest = asyncGrailsWebRequest ?: new GrailsWebRequest((HttpServletRequest)request, (HttpServletResponse)response, request.getServletContext()) + GrailsWebRequest webRequest = asyncGrailsWebRequest ?: new GrailsWebRequest((HttpServletRequest) request, (HttpServletResponse) response, request.getServletContext()) WebUtils.storeGrailsWebRequest(webRequest) def interceptors = getPersistenceInterceptors(webRequest) @@ -78,7 +79,7 @@ class GrailsAsyncContext implements AsyncContext { protected Collection getPersistenceInterceptors(GrailsWebRequest webRequest) { def servletContext = webRequest.servletContext - Collection interceptors = (Collection)servletContext?.getAttribute(PERSISTENCE_INTERCEPTORS) + Collection interceptors = (Collection) servletContext?.getAttribute(PERSISTENCE_INTERCEPTORS) if (interceptors == null) { interceptors = webRequest.applicationContext?.getBeansOfType(PersistenceContextInterceptor)?.values() ?: [] servletContext.setAttribute(PERSISTENCE_INTERCEPTORS, interceptors) diff --git a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy index df069f4285b..bfbb5eda24c 100644 --- a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy +++ b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/mvc/AsyncActionResultTransformer.groovy @@ -18,22 +18,24 @@ */ package org.grails.plugins.web.async.mvc +import groovy.transform.CompileStatic + +import jakarta.servlet.AsyncContext +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse + +import org.springframework.web.context.request.async.WebAsyncManager +import org.springframework.web.context.request.async.WebAsyncUtils +import org.springframework.web.servlet.ModelAndView + import grails.async.Promise import grails.async.PromiseList import grails.async.web.AsyncGrailsWebRequest -import groovy.transform.CompileStatic import org.grails.plugins.web.async.GrailsAsyncContext import org.grails.web.errors.GrailsExceptionResolver -import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.servlet.mvc.ActionResultTransformer import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.web.context.request.async.WebAsyncManager -import org.springframework.web.context.request.async.WebAsyncUtils -import org.springframework.web.servlet.ModelAndView - -import jakarta.servlet.AsyncContext -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse +import org.grails.web.util.GrailsApplicationAttributes /** * Handles an Async response from a controller @@ -55,10 +57,10 @@ class AsyncActionResultTransformer implements ActionResultTransformer { final response = webRequest.getResponse() AsyncGrailsWebRequest asyncWebRequest - if(asyncManager.isConcurrentHandlingStarted()) { + if (asyncManager.isConcurrentHandlingStarted()) { asyncWebRequest = AsyncGrailsWebRequest.lookup(request) - if(asyncWebRequest == null) { - throw new IllegalStateException("Concurrency handling already started by another process") + if (asyncWebRequest == null) { + throw new IllegalStateException('Concurrency handling already started by another process') } } else { diff --git a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/spring/PromiseFactoryBean.groovy b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/spring/PromiseFactoryBean.groovy index 6bce2a57883..7adc2eb6684 100644 --- a/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/spring/PromiseFactoryBean.groovy +++ b/grails-async/plugin/src/main/groovy/org/grails/plugins/web/async/spring/PromiseFactoryBean.groovy @@ -19,11 +19,13 @@ package org.grails.plugins.web.async.spring +import groovy.transform.CompileStatic + +import org.springframework.beans.factory.FactoryBean + import grails.async.PromiseFactory import grails.async.Promises -import groovy.transform.CompileStatic import org.grails.async.factory.PromiseFactoryBuilder -import org.springframework.beans.factory.FactoryBean /** * Factory bean for Spring integration @@ -33,6 +35,7 @@ import org.springframework.beans.factory.FactoryBean */ @CompileStatic class PromiseFactoryBean extends PromiseFactoryBuilder implements FactoryBean { + @Override PromiseFactory getObject() throws Exception { PromiseFactory promiseFactory = build() diff --git a/grails-async/rxjava/src/main/groovy/org/grails/async/factory/rxjava/RxPromise.groovy b/grails-async/rxjava/src/main/groovy/org/grails/async/factory/rxjava/RxPromise.groovy index f44de3fab5e..ae88fcee847 100644 --- a/grails-async/rxjava/src/main/groovy/org/grails/async/factory/rxjava/RxPromise.groovy +++ b/grails-async/rxjava/src/main/groovy/org/grails/async/factory/rxjava/RxPromise.groovy @@ -19,11 +19,14 @@ package org.grails.async.factory.rxjava -import grails.async.Promise +import java.util.concurrent.ExecutionException +import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException + import groovy.transform.AutoFinal import groovy.transform.CompileStatic import groovy.transform.PackageScope -import org.grails.async.factory.BoundPromise + import rx.Observable import rx.Scheduler import rx.Single @@ -34,9 +37,8 @@ import rx.functions.Func1 import rx.subjects.ReplaySubject import rx.subjects.Subject -import java.util.concurrent.ExecutionException -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeoutException +import grails.async.Promise +import org.grails.async.factory.BoundPromise /** * Promise based on RxJava 1.x @@ -54,9 +56,9 @@ class RxPromise implements Promise { protected Subscription subscription RxPromise(RxPromiseFactory promiseFactory, Closure callable, Scheduler scheduler) { - this(promiseFactory, Single.create( { SingleSubscriber singleSubscriber -> + this(promiseFactory, Single.create({ SingleSubscriber singleSubscriber -> try { - singleSubscriber.onSuccess((T)callable.call()) + singleSubscriber.onSuccess((T) callable.call()) } catch (Throwable t) { singleSubscriber.onError(t) } @@ -78,7 +80,7 @@ class RxPromise implements Promise { this.subject = subject } - RxPromise(RxPromiseFactory promiseFactory,Observable observable, Subject subject) { + RxPromise(RxPromiseFactory promiseFactory, Observable observable, Subject subject) { this.promiseFactory = promiseFactory this.subscription = observable.subscribe(subject) this.subject = subject @@ -92,13 +94,13 @@ class RxPromise implements Promise { @Override Promise onComplete(Closure callable) { def decoratedCallable = promiseFactory.applyDecorators(callable, null) - return new RxPromise(promiseFactory,subject.map(decoratedCallable as Func1)) + return new RxPromise(promiseFactory, subject.map(decoratedCallable as Func1)) } @Override Promise onError(Closure callable) { def decoratedCallable = promiseFactory.applyDecorators(callable, null) - return new RxPromise(promiseFactory,subject.doOnError(decoratedCallable as Action1)) + return new RxPromise(promiseFactory, subject.doOnError(decoratedCallable as Action1)) } @Override @@ -108,7 +110,7 @@ class RxPromise implements Promise { @Override boolean cancel(boolean mayInterruptIfRunning) { - if(subscription != null) { + if (subscription != null) { subscription.unsubscribe() return subscription.isUnsubscribed() } @@ -117,7 +119,7 @@ class RxPromise implements Promise { @Override boolean isCancelled() { - if(subscription == null) { + if (subscription == null) { return false } else { @@ -140,7 +142,7 @@ class RxPromise implements Promise { try { return subject.timeout(timeout, unit).toBlocking().first() } catch (Throwable e) { - if(e.cause instanceof TimeoutException) { + if (e.cause instanceof TimeoutException) { throw e.cause } else { diff --git a/grails-async/rxjava/src/main/groovy/org/grails/async/factory/rxjava/RxPromiseFactory.groovy b/grails-async/rxjava/src/main/groovy/org/grails/async/factory/rxjava/RxPromiseFactory.groovy index 6248acc299f..13caefe1c44 100644 --- a/grails-async/rxjava/src/main/groovy/org/grails/async/factory/rxjava/RxPromiseFactory.groovy +++ b/grails-async/rxjava/src/main/groovy/org/grails/async/factory/rxjava/RxPromiseFactory.groovy @@ -19,17 +19,19 @@ package org.grails.async.factory.rxjava -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 org.grails.async.factory.BoundPromise + import rx.Observable import rx.Single import rx.schedulers.Schedulers -import java.util.concurrent.TimeUnit +import grails.async.Promise +import grails.async.PromiseList +import grails.async.factory.AbstractPromiseFactory +import org.grails.async.factory.BoundPromise /** * An RxJava {@link grails.async.PromiseFactory} implementation @@ -53,8 +55,8 @@ class RxPromiseFactory extends AbstractPromiseFactory { @Override Promise createPromise(Closure[] closures) { - if(closures.length == 1) { - return new RxPromise(this,closures[0], Schedulers.io()) + if (closures.length == 1) { + return new RxPromise(this, closures[0], Schedulers.io()) } else { def promiseList = new PromiseList() @@ -79,11 +81,11 @@ class RxPromiseFactory extends AbstractPromiseFactory { Promise onComplete(List> promises, Closure callable) { new RxPromise(this, Observable.concat( promises.collect() { Promise p -> - if(p instanceof BoundPromise) { - return Observable.just(((BoundPromise)p).value) + if (p instanceof BoundPromise) { + return Observable.just(((BoundPromise) p).value) } else { - return ((RxPromise)p).subject as Observable + return ((RxPromise) p).subject as Observable } } ).toList()) @@ -93,7 +95,7 @@ class RxPromiseFactory extends AbstractPromiseFactory { @Override Promise onError(List> promises, Closure callable) { new RxPromise(this, Observable.concat( - promises.collect() { Promise p -> ((RxPromise)p).subject as Observable } + promises.collect() { Promise p -> ((RxPromise) p).subject as Observable } ).toList()) .onError(callable) } diff --git a/grails-async/rxjava2/src/main/groovy/org/grails/async/factory/rxjava2/RxPromise.groovy b/grails-async/rxjava2/src/main/groovy/org/grails/async/factory/rxjava2/RxPromise.groovy index a0f1bdf3242..e55374e830c 100644 --- a/grails-async/rxjava2/src/main/groovy/org/grails/async/factory/rxjava2/RxPromise.groovy +++ b/grails-async/rxjava2/src/main/groovy/org/grails/async/factory/rxjava2/RxPromise.groovy @@ -19,27 +19,28 @@ package org.grails.async.factory.rxjava2 -import grails.async.Promise +import java.util.concurrent.ExecutionException +import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException + import groovy.transform.AutoFinal import groovy.transform.CompileStatic import groovy.transform.PackageScope + import io.reactivex.Observable import io.reactivex.Observer import io.reactivex.Scheduler import io.reactivex.Single import io.reactivex.SingleEmitter -import io.reactivex.SingleObserver import io.reactivex.SingleOnSubscribe import io.reactivex.disposables.Disposable import io.reactivex.functions.Consumer import io.reactivex.functions.Function import io.reactivex.subjects.ReplaySubject import io.reactivex.subjects.Subject -import org.grails.async.factory.BoundPromise -import java.util.concurrent.ExecutionException -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeoutException +import grails.async.Promise +import org.grails.async.factory.BoundPromise /** * Promise based on RxJava 2.x @@ -61,9 +62,9 @@ class RxPromise implements Promise { RxPromise(RxPromiseFactory promiseFactory, Closure callable, Scheduler scheduler) { - this(promiseFactory, Single.create( { SingleEmitter singleSubscriber -> + this(promiseFactory, Single.create({ SingleEmitter singleSubscriber -> try { - singleSubscriber.onSuccess((T)runCallable(callable)) + singleSubscriber.onSuccess((T) runCallable(callable)) } catch (Throwable t) { singleSubscriber.onError(t) } @@ -138,7 +139,7 @@ class RxPromise implements Promise { @Override boolean cancel(boolean mayInterruptIfRunning) { - if(subscription != null) { + if (subscription != null) { subscription.dispose() return subscription.isDisposed() } @@ -147,7 +148,7 @@ class RxPromise implements Promise { @Override boolean isCancelled() { - if(subscription == null) { + if (subscription == null) { return false } else { @@ -170,7 +171,7 @@ class RxPromise implements Promise { try { return subject.timeout(timeout, unit).blockingFirst() } catch (Throwable e) { - if(e.cause instanceof TimeoutException) { + if (e.cause instanceof TimeoutException) { throw e.cause } else { @@ -181,7 +182,7 @@ class RxPromise implements Promise { static Object runCallable(Closure callable) { Object rtn = callable.call() - if(rtn == null) { + if (rtn == null) { return Void } else { return rtn diff --git a/grails-async/rxjava2/src/main/groovy/org/grails/async/factory/rxjava2/RxPromiseFactory.groovy b/grails-async/rxjava2/src/main/groovy/org/grails/async/factory/rxjava2/RxPromiseFactory.groovy index c527d26d2b8..1e608f9b877 100644 --- a/grails-async/rxjava2/src/main/groovy/org/grails/async/factory/rxjava2/RxPromiseFactory.groovy +++ b/grails-async/rxjava2/src/main/groovy/org/grails/async/factory/rxjava2/RxPromiseFactory.groovy @@ -19,17 +19,19 @@ package org.grails.async.factory.rxjava2 -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 io.reactivex.Observable import io.reactivex.Single import io.reactivex.schedulers.Schedulers -import org.grails.async.factory.BoundPromise -import java.util.concurrent.TimeUnit +import grails.async.Promise +import grails.async.PromiseList +import grails.async.factory.AbstractPromiseFactory +import org.grails.async.factory.BoundPromise /** * An RxJava {@link grails.async.PromiseFactory} implementation @@ -53,7 +55,7 @@ class RxPromiseFactory extends AbstractPromiseFactory { @Override Promise createPromise(Closure[] closures) { - if(closures.length == 1) { + if (closures.length == 1) { return new RxPromise(this, closures[0], Schedulers.io()) } else { @@ -79,11 +81,11 @@ class RxPromiseFactory extends AbstractPromiseFactory { Promise onComplete(List> promises, Closure callable) { new RxPromise(this, Observable.concat( promises.collect { Promise p -> - if(p instanceof BoundPromise) { - return Observable.just(((BoundPromise)p).value) as Observable + if (p instanceof BoundPromise) { + return Observable.just(((BoundPromise) p).value) as Observable } else { - return ((RxPromise)p).toObservable() as Observable + return ((RxPromise) p).toObservable() as Observable } } ).toList()) @@ -93,7 +95,7 @@ class RxPromiseFactory extends AbstractPromiseFactory { @Override Promise> onError(List> promises, Closure callable) { new RxPromise(this, Observable.concat( - promises.collect { ((RxPromise)it).toObservable() } + promises.collect { ((RxPromise) it).toObservable() } ).toList()) .onError(callable) as Promise> } diff --git a/grails-async/rxjava3/src/main/groovy/org/grails/async/factory/rxjava3/RxPromise.groovy b/grails-async/rxjava3/src/main/groovy/org/grails/async/factory/rxjava3/RxPromise.groovy index 187da074108..162f97c7bcb 100644 --- a/grails-async/rxjava3/src/main/groovy/org/grails/async/factory/rxjava3/RxPromise.groovy +++ b/grails-async/rxjava3/src/main/groovy/org/grails/async/factory/rxjava3/RxPromise.groovy @@ -19,10 +19,14 @@ package org.grails.async.factory.rxjava3 -import grails.async.Promise +import java.util.concurrent.ExecutionException +import java.util.concurrent.TimeUnit +import java.util.concurrent.TimeoutException + import groovy.transform.AutoFinal import groovy.transform.CompileStatic import groovy.transform.PackageScope + import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Observer import io.reactivex.rxjava3.core.Scheduler @@ -34,11 +38,9 @@ import io.reactivex.rxjava3.functions.Consumer import io.reactivex.rxjava3.functions.Function import io.reactivex.rxjava3.subjects.ReplaySubject import io.reactivex.rxjava3.subjects.Subject -import org.grails.async.factory.BoundPromise -import java.util.concurrent.ExecutionException -import java.util.concurrent.TimeUnit -import java.util.concurrent.TimeoutException +import grails.async.Promise +import org.grails.async.factory.BoundPromise /** * Promise based on RxJava 3.x @@ -58,9 +60,9 @@ class RxPromise implements Promise { protected boolean finished = false RxPromise(RxPromiseFactory promiseFactory, Closure callable, Scheduler scheduler) { - this(promiseFactory, Single.create( { SingleEmitter singleSubscriber -> + this(promiseFactory, Single.create({ SingleEmitter singleSubscriber -> try { - singleSubscriber.onSuccess((T)runCallable(callable)) + singleSubscriber.onSuccess((T) runCallable(callable)) } catch (Throwable t) { singleSubscriber.onError(t) } @@ -135,7 +137,7 @@ class RxPromise implements Promise { @Override boolean cancel(boolean mayInterruptIfRunning) { - if(subscription != null) { + if (subscription != null) { subscription.dispose() return subscription.isDisposed() } @@ -144,7 +146,7 @@ class RxPromise implements Promise { @Override boolean isCancelled() { - if(subscription == null) { + if (subscription == null) { return false } else { @@ -167,7 +169,7 @@ class RxPromise implements Promise { try { return subject.timeout(timeout, unit).blockingFirst() } catch (Throwable e) { - if(e.cause instanceof TimeoutException) { + if (e.cause instanceof TimeoutException) { throw e.cause } else { @@ -178,7 +180,7 @@ class RxPromise implements Promise { static Object runCallable(Closure callable) { Object rtn = callable.call() - if(rtn == null) { + if (rtn == null) { return Void } else { return rtn diff --git a/grails-async/rxjava3/src/main/groovy/org/grails/async/factory/rxjava3/RxPromiseFactory.groovy b/grails-async/rxjava3/src/main/groovy/org/grails/async/factory/rxjava3/RxPromiseFactory.groovy index f93dab19255..950779b8d90 100644 --- a/grails-async/rxjava3/src/main/groovy/org/grails/async/factory/rxjava3/RxPromiseFactory.groovy +++ b/grails-async/rxjava3/src/main/groovy/org/grails/async/factory/rxjava3/RxPromiseFactory.groovy @@ -19,17 +19,19 @@ package org.grails.async.factory.rxjava3 -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 io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers -import org.grails.async.factory.BoundPromise -import java.util.concurrent.TimeUnit +import grails.async.Promise +import grails.async.PromiseList +import grails.async.factory.AbstractPromiseFactory +import org.grails.async.factory.BoundPromise /** * An RxJava {@link grails.async.PromiseFactory} implementation @@ -50,7 +52,7 @@ class RxPromiseFactory extends AbstractPromiseFactory { @Override Promise createPromise(Closure[] closures) { - if(closures.length == 1) { + if (closures.length == 1) { return new RxPromise(this, closures[0], Schedulers.io()) } else { @@ -76,11 +78,11 @@ class RxPromiseFactory extends AbstractPromiseFactory { Promise onComplete(List> promises, Closure callable) { new RxPromise(this, Observable.concat( promises.collect { Promise p -> - if(p instanceof BoundPromise) { - return Observable.just(((BoundPromise)p).value) as Observable + if (p instanceof BoundPromise) { + return Observable.just(((BoundPromise) p).value) as Observable } else { - return ((RxPromise)p).toObservable() as Observable + return ((RxPromise) p).toObservable() as Observable } } ).toList()) @@ -90,7 +92,7 @@ class RxPromiseFactory extends AbstractPromiseFactory { @Override Promise> onError(List> promises, Closure callable) { new RxPromise(this, Observable.concat( - promises.collect { ((RxPromise)it).toObservable() } + promises.collect { ((RxPromise) it).toObservable() } ).toList()) .onError(callable) as Promise> } diff --git a/grails-bootstrap/src/main/groovy/grails/build/logging/ConsoleLogger.java b/grails-bootstrap/src/main/groovy/grails/build/logging/ConsoleLogger.java index b83f5b95406..e18bab702a3 100644 --- a/grails-bootstrap/src/main/groovy/grails/build/logging/ConsoleLogger.java +++ b/grails-bootstrap/src/main/groovy/grails/build/logging/ConsoleLogger.java @@ -130,6 +130,4 @@ public interface ConsoleLogger { * @param msg The message */ void verbose(String msg); - - } diff --git a/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java b/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java index fe3de1607e3..986bf640830 100644 --- a/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java +++ b/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsConsole.java @@ -18,7 +18,22 @@ */ package grails.build.logging; -import grails.util.Environment; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.Flushable; +import java.io.IOException; +import java.io.InputStream; +import java.io.PrintStream; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.Collection; +import java.util.List; +import java.util.Stack; + +import org.codehaus.groovy.runtime.DefaultGroovyMethods; +import org.codehaus.groovy.runtime.StackTraceUtils; +import org.codehaus.groovy.runtime.typehandling.NumberMath; + import jline.Terminal; import jline.TerminalFactory; import jline.UnixTerminal; @@ -30,22 +45,18 @@ import jline.internal.ShutdownHooks; import jline.internal.TerminalLineSettings; import org.apache.tools.ant.BuildException; -import org.codehaus.groovy.runtime.DefaultGroovyMethods; -import org.codehaus.groovy.runtime.StackTraceUtils; -import org.codehaus.groovy.runtime.typehandling.NumberMath; import org.fusesource.jansi.Ansi; import org.fusesource.jansi.Ansi.Color; import org.fusesource.jansi.AnsiConsole; + +import grails.util.Environment; import org.grails.build.interactive.CandidateListCompletionHandler; import org.grails.build.logging.GrailsConsoleErrorPrintStream; import org.grails.build.logging.GrailsConsolePrintStream; -import java.io.*; -import java.util.Collection; -import java.util.List; -import java.util.Stack; - -import static org.fusesource.jansi.Ansi.Color.*; +import static org.fusesource.jansi.Ansi.Color.DEFAULT; +import static org.fusesource.jansi.Ansi.Color.RED; +import static org.fusesource.jansi.Ansi.Color.YELLOW; import static org.fusesource.jansi.Ansi.Erase.FORWARD; import static org.fusesource.jansi.Ansi.ansi; @@ -116,7 +127,7 @@ public class GrailsConsole implements ConsoleLogger { * The category of the current output */ @SuppressWarnings("serial") - Stack category = new Stack() { + Stack category = new Stack<>() { @Override public String toString() { if (size() == 1) return peek() + CATEGORY_SEPARATOR; @@ -152,7 +163,6 @@ public void removeShutdownHook() { } } - protected GrailsConsole() throws IOException { cursorMove = 1; diff --git a/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsEclipseConsole.java b/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsEclipseConsole.java index 72153378aed..a9142afb552 100644 --- a/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsEclipseConsole.java +++ b/grails-bootstrap/src/main/groovy/grails/build/logging/GrailsEclipseConsole.java @@ -18,11 +18,11 @@ */ package grails.build.logging; +import java.io.IOException; + import jline.Terminal; import jline.UnsupportedTerminal; -import java.io.IOException; - /** * This class is meant to keep changes made in support of Eclipse separate from * the standard GrailsConsole implementation. @@ -65,7 +65,7 @@ private boolean eclipseSupportsAnsi() { private static Boolean boolProp(String propName) { try { - String prop = System.getProperty(propName); + String prop = System.getProperty(propName); return prop != null && Boolean.valueOf(prop); } catch (Exception e) { return false; diff --git a/grails-bootstrap/src/main/groovy/grails/build/proxy/SystemPropertiesAuthenticator.groovy b/grails-bootstrap/src/main/groovy/grails/build/proxy/SystemPropertiesAuthenticator.groovy index 9fac0165c1f..0ceefca0aaf 100644 --- a/grails-bootstrap/src/main/groovy/grails/build/proxy/SystemPropertiesAuthenticator.groovy +++ b/grails-bootstrap/src/main/groovy/grails/build/proxy/SystemPropertiesAuthenticator.groovy @@ -19,9 +19,10 @@ package grails.build.proxy -import grails.util.BuildSettings import groovy.transform.CompileStatic +import grails.util.BuildSettings + /** * An Authenticator that authenticates via System properties * @@ -33,10 +34,10 @@ class SystemPropertiesAuthenticator extends Authenticator { @Override protected PasswordAuthentication getPasswordAuthentication() { - if(getRequestorType() == RequestorType.PROXY) { + if (getRequestorType() == RequestorType.PROXY) { return new PasswordAuthentication( - System.getProperty(BuildSettings.PROXY_HTTP_USER, ""), - System.getProperty(BuildSettings.PROXY_HTTP_PASSWORD, "").toCharArray()); + System.getProperty(BuildSettings.PROXY_HTTP_USER, ''), + System.getProperty(BuildSettings.PROXY_HTTP_PASSWORD, '').toCharArray()) } return null } diff --git a/grails-bootstrap/src/main/groovy/grails/build/support/MetaClassRegistryCleaner.java b/grails-bootstrap/src/main/groovy/grails/build/support/MetaClassRegistryCleaner.java index bedb6357264..b16a69fea92 100644 --- a/grails-bootstrap/src/main/groovy/grails/build/support/MetaClassRegistryCleaner.java +++ b/grails-bootstrap/src/main/groovy/grails/build/support/MetaClassRegistryCleaner.java @@ -18,13 +18,22 @@ */ package grails.build.support; -import groovy.lang.*; -import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl; - import java.lang.ref.WeakReference; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; +import groovy.lang.ExpandoMetaClass; +import groovy.lang.GroovySystem; +import groovy.lang.MetaClass; +import groovy.lang.MetaClassRegistry; +import groovy.lang.MetaClassRegistryChangeEvent; +import groovy.lang.MetaClassRegistryChangeEventListener; +import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl; + /** * Allows clean-up of changes made to the MetaClassRegistry. * @@ -34,8 +43,8 @@ @SuppressWarnings("rawtypes") public class MetaClassRegistryCleaner implements MetaClassRegistryChangeEventListener { - private Map alteredClasses = new ConcurrentHashMap (); - private Map alteredInstances = new ConcurrentHashMap(); + private Map alteredClasses = new ConcurrentHashMap<>(); + private Map alteredInstances = new ConcurrentHashMap<>(); private static final Object NO_CUSTOM_METACLASS = new Object(); private static boolean cleaning; private static final MetaClassRegistryCleaner INSTANCE = new MetaClassRegistryCleaner(); @@ -50,7 +59,7 @@ public static MetaClassRegistryCleaner createAndRegister() { boolean registered = false; for (MetaClassRegistryChangeEventListener listener : listeners) { if (listener == INSTANCE) { - registered = true;break; + registered = true; break; } } if (!registered) { @@ -96,7 +105,7 @@ private void updateMetaClassOfInstance(MetaClass oldMetaClass, Object instanceTo private void updateMetaClassOfClass(MetaClass oldMetaClass, Class classToUpdate) { if (oldMetaClass != null && !(oldMetaClass.getClass().getName().equals("groovy.mock.interceptor.MockProxyMetaClass"))) { Object current = alteredClasses.get(classToUpdate); - if (current == null ) { + if (current == null) { alteredClasses.put(classToUpdate, oldMetaClass); } } @@ -117,7 +126,7 @@ public synchronized void clean() { } private void cleanMetaClassOfInstance(MetaClassRegistryImpl registry) { - List keys = new ArrayList(alteredInstances.keySet()); + List keys = new ArrayList<>(alteredInstances.keySet()); for (IdentityWeakReference key : keys) { Object instance = key.get(); if (instance != null) { @@ -132,7 +141,7 @@ private void cleanMetaClassOfInstance(MetaClassRegistryImpl registry) { } private void cleanMetaClassOfClass(MetaClassRegistryImpl registry) { - Set classes = new HashSet(alteredClasses.keySet()); + Set classes = new HashSet<>(alteredClasses.keySet()); for (Class aClass : classes) { Object alteredMetaClass = alteredClasses.get(aClass); if (alteredMetaClass == NO_CUSTOM_METACLASS) { @@ -164,7 +173,7 @@ public boolean equals(Object obj) { if (this == obj) { return true; } - return get() == ((IdentityWeakReference)obj).get(); + return get() == ((IdentityWeakReference) obj).get(); } } } diff --git a/grails-bootstrap/src/main/groovy/grails/codegen/model/Model.groovy b/grails-bootstrap/src/main/groovy/grails/codegen/model/Model.groovy index 7f68ac8a883..e3c6a8346c4 100644 --- a/grails-bootstrap/src/main/groovy/grails/codegen/model/Model.groovy +++ b/grails-bootstrap/src/main/groovy/grails/codegen/model/Model.groovy @@ -58,7 +58,6 @@ interface Model { */ String getPropertyName() - /** * A property name version of the class name. For example 'FooBar' becomes 'fooBar' * @@ -84,4 +83,4 @@ interface Model { * @return The model as a map */ Map asMap() -} \ No newline at end of file +} diff --git a/grails-bootstrap/src/main/groovy/grails/codegen/model/ModelBuilder.groovy b/grails-bootstrap/src/main/groovy/grails/codegen/model/ModelBuilder.groovy index 31c023aac21..1c715339e9d 100644 --- a/grails-bootstrap/src/main/groovy/grails/codegen/model/ModelBuilder.groovy +++ b/grails-bootstrap/src/main/groovy/grails/codegen/model/ModelBuilder.groovy @@ -18,9 +18,10 @@ */ package grails.codegen.model -import grails.util.GrailsNameUtils import groovy.transform.CompileStatic import org.apache.groovy.util.BeanUtils + +import grails.util.GrailsNameUtils import org.grails.io.support.FileSystemResource import org.grails.io.support.GrailsResourceUtils import org.grails.io.support.Resource @@ -52,7 +53,7 @@ trait ModelBuilder { * @return The {@link Model} instance */ Model model(String className) { - if(defaultPackage && !className.contains('.')) { + if (defaultPackage && !className.contains('.')) { return new ModelImpl("${defaultPackage}.$className") } else { diff --git a/grails-bootstrap/src/main/groovy/grails/config/ConfigMap.groovy b/grails-bootstrap/src/main/groovy/grails/config/ConfigMap.groovy index 7c90ded4019..ff80a14dc0e 100644 --- a/grails-bootstrap/src/main/groovy/grails/config/ConfigMap.groovy +++ b/grails-bootstrap/src/main/groovy/grails/config/ConfigMap.groovy @@ -73,4 +73,4 @@ interface ConfigMap extends Iterable>, Map getProjectPackageNames(File baseDir) { - File rootDir = baseDir ? new File(baseDir, "grails-app") : null + File rootDir = baseDir ? new File(baseDir, 'grails-app') : null Set packageNames = [] if (rootDir?.exists()) { File[] allFiles = rootDir.listFiles() @@ -52,7 +52,7 @@ class ResourceUtils extends GrailsResourceUtils { def dirName = dir.name if (!dir.hidden && !dirName.startsWith('.') && !['conf', 'i18n', 'assets', 'views', 'migrations'].contains(dirName)) { File[] files = dir.listFiles() - populatePackages(dir,files, packageNames, "") + populatePackages(dir, files, packageNames, '') } } } @@ -62,17 +62,17 @@ class ResourceUtils extends GrailsResourceUtils { protected static populatePackages(File rootDir, File[] files, Collection packageNames, String prefix) { - if(files != null) { - for(dir in files ) { - if(dir.isDirectory()) { + if (files != null) { + for (dir in files) { + if (dir.isDirectory()) { String dirName = dir.name if (!dir.hidden && !dirName.startsWith('.')) { def dirFiles = dir.listFiles() - if(dirFiles != null) { + if (dirFiles != null) { boolean hasGroovySources = dirFiles?.find() { File f -> f.name.endsWith('.groovy') } - if(hasGroovySources) { + if (hasGroovySources) { // if there are Groovy sources stop here, no need to add child packages - packageNames.add "${prefix}${dirName}".toString() + packageNames.add("${prefix}${dirName}".toString()) } else { // otherwise recurse into a child package @@ -83,8 +83,8 @@ class ResourceUtils extends GrailsResourceUtils { } } else { - if(dir.name.endsWith('.groovy') && prefix == "") { - packageNames.add("") + if (dir.name.endsWith('.groovy') && prefix == '') { + packageNames.add('') } } } diff --git a/grails-bootstrap/src/main/groovy/grails/io/support/SystemOutErrCapturer.groovy b/grails-bootstrap/src/main/groovy/grails/io/support/SystemOutErrCapturer.groovy index 4cec2bb5643..ebe8fe43527 100644 --- a/grails-bootstrap/src/main/groovy/grails/io/support/SystemOutErrCapturer.groovy +++ b/grails-bootstrap/src/main/groovy/grails/io/support/SystemOutErrCapturer.groovy @@ -25,17 +25,18 @@ import groovy.transform.CompileStatic */ @CompileStatic class SystemOutErrCapturer { + ByteArrayOutputStream out ByteArrayOutputStream err SystemStreamsRedirector previousState - + SystemOutErrCapturer capture() { out = new ByteArrayOutputStream() err = new ByteArrayOutputStream() previousState = SystemStreamsRedirector.create(null, new PrintStream(out, true), new PrintStream(err, true)).redirect() this } - + SystemOutErrCapturer redirectToNull() { out = null err = null @@ -43,15 +44,15 @@ class SystemOutErrCapturer { previousState = SystemStreamsRedirector.create(null, new PrintStream(nullStream, true), new PrintStream(nullStream, true)).redirect() this } - + void close() { - if(previousState != null) { + if (previousState != null) { previousState.redirect() previousState = null } } - - public static T withCapturedOutput(Closure closure) { + + static T withCapturedOutput(Closure closure) { SystemOutErrCapturer capturer = new SystemOutErrCapturer().capture() try { return closure.call(capturer) @@ -59,8 +60,8 @@ class SystemOutErrCapturer { capturer.close() } } - - public static T withNullOutput(Closure closure) { + + static T withNullOutput(Closure closure) { SystemOutErrCapturer capturer = new SystemOutErrCapturer().redirectToNull() try { return closure.call(capturer) @@ -68,22 +69,22 @@ class SystemOutErrCapturer { capturer.close() } } - + @CompileStatic - public static class NullOutputStream extends OutputStream { + static class NullOutputStream extends OutputStream { @Override - public void write(byte[] b) throws IOException { - - } - + void write(byte[] b) throws IOException { + + } + @Override - public void write(int b) throws IOException { - + void write(int b) throws IOException { + } - + @Override - public void write(byte[] b, int off, int len) throws IOException { - + void write(byte[] b, int off, int len) throws IOException { + } } } diff --git a/grails-bootstrap/src/main/groovy/grails/io/support/SystemStreamsRedirector.groovy b/grails-bootstrap/src/main/groovy/grails/io/support/SystemStreamsRedirector.groovy index 6bdbd8b7a39..1533e997acc 100644 --- a/grails-bootstrap/src/main/groovy/grails/io/support/SystemStreamsRedirector.groovy +++ b/grails-bootstrap/src/main/groovy/grails/io/support/SystemStreamsRedirector.groovy @@ -25,34 +25,35 @@ import groovy.transform.ToString @ToString @CompileStatic class SystemStreamsRedirector { + private static final SystemStreamsRedirector original = current() final InputStream input final PrintStream out final PrintStream err - + private SystemStreamsRedirector(InputStream input, PrintStream out, PrintStream err) { this.input = input this.out = out this.err = err } - + static SystemStreamsRedirector create(InputStream input, PrintStream out, PrintStream err) { new SystemStreamsRedirector(input, out, err) } - + static SystemStreamsRedirector current() { create(System.in, System.out, System.err) } - + static SystemStreamsRedirector original() { original } - + static T withOriginalIO(Closure closure) { original().withRedirectedIO(closure) } - - public T withRedirectedIO(Closure closure) { + + T withRedirectedIO(Closure closure) { SystemStreamsRedirector previous = redirect() try { return closure.call() @@ -60,27 +61,26 @@ class SystemStreamsRedirector { previous.redirect() } } - - + SystemStreamsRedirector redirect() { InputStream prevInput = null PrintStream prevOut = null PrintStream prevErr = null - if(input != null) { + if (input != null) { prevInput = System.in - if(!(prevInput.is(input))) { + if (!(prevInput.is(input))) { System.setIn(input) } } - if(out != null) { + if (out != null) { prevOut = System.out - if(!(prevOut.is(out))) { + if (!(prevOut.is(out))) { System.setOut(out) } } - if(err != null) { + if (err != null) { prevErr = System.err - if(!(prevErr.is(err))) { + if (!(prevErr.is(err))) { System.setErr(err) } } diff --git a/grails-bootstrap/src/main/groovy/grails/plugins/GrailsVersionUtils.groovy b/grails-bootstrap/src/main/groovy/grails/plugins/GrailsVersionUtils.groovy index f09d6616f86..dbf0c70a6a6 100644 --- a/grails-bootstrap/src/main/groovy/grails/plugins/GrailsVersionUtils.groovy +++ b/grails-bootstrap/src/main/groovy/grails/plugins/GrailsVersionUtils.groovy @@ -18,12 +18,17 @@ */ package grails.plugins +import java.util.regex.Pattern + import groovy.transform.CompileStatic + import grails.plugins.metadata.GrailsPlugin @CompileStatic class GrailsVersionUtils { + private static final Pattern DIGITS_PATTERN = ~/\d+/ + /** * Get the name of the a plugin for a particular class. */ @@ -53,8 +58,8 @@ class GrailsVersionUtils { def vc = new VersionComparator() pluginVersion = trimTag(pluginVersion) - if (requiredVersion.indexOf('>') >- 1) { - def tokens = requiredVersion.split(">")*.trim() + if (requiredVersion.indexOf('>') > -1) { + def tokens = requiredVersion.split('>')*.trim() tokens = tokens.stream().collect({ String it -> trimTag(it) }) tokens << pluginVersion tokens.sort(true, vc) @@ -103,7 +108,7 @@ class GrailsVersionUtils { private static getPluginVersionInternal(String pluginVersion, Integer index) { if (pluginVersion.indexOf('>') > -1) { - def tokens = pluginVersion.split(">")*.trim() + def tokens = pluginVersion.split('>')*.trim() return tokens[index].trim() } @@ -112,13 +117,11 @@ class GrailsVersionUtils { private static String trimTag(String pluginVersion) { def i = pluginVersion.indexOf('-') - if (i >- 1) { - pluginVersion = pluginVersion[0..i-1] + if (i > -1) { + pluginVersion = pluginVersion[0..i - 1] } def tokens = pluginVersion.split(/\./) - return tokens.findAll { String it -> it ==~ /\d+/ || it =='*'}.join(".") + return tokens.findAll { String it -> DIGITS_PATTERN.matcher(it).matches() || it == '*' }.join('.') } } - - diff --git a/grails-bootstrap/src/main/groovy/grails/plugins/VersionComparator.groovy b/grails-bootstrap/src/main/groovy/grails/plugins/VersionComparator.groovy index fcec1cc82a0..ca8e8533979 100644 --- a/grails-bootstrap/src/main/groovy/grails/plugins/VersionComparator.groovy +++ b/grails-bootstrap/src/main/groovy/grails/plugins/VersionComparator.groovy @@ -26,7 +26,7 @@ import groovy.transform.CompileStatic @CompileStatic class VersionComparator implements Comparator { - static private final List SNAPSHOT_SUFFIXES = ["-SNAPSHOT", ".BUILD-SNAPSHOT"].asImmutable() + static private final List SNAPSHOT_SUFFIXES = ['-SNAPSHOT', '.BUILD-SNAPSHOT'].asImmutable() int compare(String o1, String o2) { int result = 0 @@ -63,14 +63,16 @@ class VersionComparator implements Comparator { if (result != 0) { break } - if (i == (nums1.size()-1) && bigRight) { - if (nums2[i+1] != 0) - result = -1; break + if (i == (nums1.size() - 1) && bigRight) { + if (nums2[i + 1] != 0) + result = -1 + break } } else if (bigLeft) { if (nums1[i] != 0) - result = 1; break + result = 1 + break } } } @@ -110,4 +112,4 @@ class VersionComparator implements Comparator { protected boolean isSnapshot(String version) { SNAPSHOT_SUFFIXES.any { String it -> version?.endsWith(it) } } -} \ No newline at end of file +} diff --git a/grails-bootstrap/src/main/groovy/grails/plugins/metadata/GrailsPlugin.java b/grails-bootstrap/src/main/groovy/grails/plugins/metadata/GrailsPlugin.java index c5b0258c0ed..80187e95e5f 100644 --- a/grails-bootstrap/src/main/groovy/grails/plugins/metadata/GrailsPlugin.java +++ b/grails-bootstrap/src/main/groovy/grails/plugins/metadata/GrailsPlugin.java @@ -18,10 +18,10 @@ */ package grails.plugins.metadata; +import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; -import java.lang.annotation.ElementType; /** * Annotation that appears on classes of a particular plugin. diff --git a/grails-bootstrap/src/main/groovy/grails/util/CosineSimilarity.groovy b/grails-bootstrap/src/main/groovy/grails/util/CosineSimilarity.groovy index 96721ebf5bd..21c24de685e 100644 --- a/grails-bootstrap/src/main/groovy/grails/util/CosineSimilarity.groovy +++ b/grails-bootstrap/src/main/groovy/grails/util/CosineSimilarity.groovy @@ -45,7 +45,7 @@ class CosineSimilarity { } private static double stringSimilarity(String s1, String s2, int degree = 2) { - similarity s1.toLowerCase().toCharArray(), s2.toLowerCase().toCharArray(), degree + similarity(s1.toLowerCase().toCharArray(), s2.toLowerCase().toCharArray(), degree) } private static double similarity(sequence1, sequence2, int degree = 2) { diff --git a/grails-bootstrap/src/main/groovy/grails/util/Described.groovy b/grails-bootstrap/src/main/groovy/grails/util/Described.groovy index d7febf70d25..2079d99eb32 100644 --- a/grails-bootstrap/src/main/groovy/grails/util/Described.groovy +++ b/grails-bootstrap/src/main/groovy/grails/util/Described.groovy @@ -19,7 +19,6 @@ package grails.util - /** * Interface for classes that are described * @@ -33,4 +32,4 @@ interface Described { */ String getDescription() -} \ No newline at end of file +} diff --git a/grails-bootstrap/src/main/groovy/grails/util/Named.groovy b/grails-bootstrap/src/main/groovy/grails/util/Named.groovy index 99a5968b154..3e1fb5de6ed 100644 --- a/grails-bootstrap/src/main/groovy/grails/util/Named.groovy +++ b/grails-bootstrap/src/main/groovy/grails/util/Named.groovy @@ -25,6 +25,7 @@ package grails.util * @since 3.0 */ interface Named { + /** * @return The name of the object */ diff --git a/grails-bootstrap/src/main/groovy/org/grails/build/interactive/CandidateListCompletionHandler.java b/grails-bootstrap/src/main/groovy/org/grails/build/interactive/CandidateListCompletionHandler.java index e09740b679e..2b9ff8abb4a 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/build/interactive/CandidateListCompletionHandler.java +++ b/grails-bootstrap/src/main/groovy/org/grails/build/interactive/CandidateListCompletionHandler.java @@ -18,14 +18,13 @@ */ package org.grails.build.interactive; +import java.io.IOException; +import java.util.List; import jline.console.ConsoleReader; import jline.console.CursorBuffer; import jline.console.completer.CompletionHandler; -import java.io.IOException; -import java.util.List; - /** * Fixes issues with the default CandidateListCompletionHandler such as clearing out the whole buffer when * a completion matches a list of candidates diff --git a/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleAntBuilder.java b/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleAntBuilder.java index 63d4f70c3b9..42eea04d067 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleAntBuilder.java +++ b/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleAntBuilder.java @@ -18,12 +18,19 @@ */ package org.grails.build.logging; -import grails.build.logging.GrailsConsole; import groovy.ant.AntBuilder; -import org.apache.tools.ant.*; + +import org.apache.tools.ant.BuildEvent; +import org.apache.tools.ant.BuildLogger; +import org.apache.tools.ant.DefaultLogger; +import org.apache.tools.ant.MagicNames; +import org.apache.tools.ant.Project; +import org.apache.tools.ant.ProjectHelper; import org.apache.tools.ant.types.LogLevel; import org.apache.tools.ant.util.StringUtils; +import grails.build.logging.GrailsConsole; + /** * Silences ant builder output. * @@ -73,7 +80,7 @@ public static void addGrailsConsoleBuildListener(Project project) { if (!instance.isVerbose()) { for (Object buildListener : project.getBuildListeners()) { if (buildListener instanceof BuildLogger) { - ((BuildLogger)buildListener).setMessageOutputLevel(LogLevel.ERR.getLevel()); + ((BuildLogger) buildListener).setMessageOutputLevel(LogLevel.ERR.getLevel()); } } } diff --git a/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleBuildListener.java b/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleBuildListener.java index f5075391011..a123d583e0a 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleBuildListener.java +++ b/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleBuildListener.java @@ -18,10 +18,11 @@ */ package org.grails.build.logging; -import grails.build.logging.GrailsConsole; import org.apache.tools.ant.BuildEvent; import org.apache.tools.ant.BuildListener; +import grails.build.logging.GrailsConsole; + /** * Mainly silences a lot of redundant Ant output. */ diff --git a/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleErrorPrintStream.java b/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleErrorPrintStream.java index 20400d3986d..eefe3463ffb 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleErrorPrintStream.java +++ b/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsoleErrorPrintStream.java @@ -18,10 +18,10 @@ */ package org.grails.build.logging; -import grails.build.logging.GrailsConsole; - import java.io.PrintStream; +import grails.build.logging.GrailsConsole; + /** * Used to replace default System.err with one that routes calls through GrailsConsole. * @@ -35,7 +35,7 @@ public GrailsConsoleErrorPrintStream(PrintStream out) { } public PrintStream getTargetOut() { - return (PrintStream)out; + return (PrintStream) out; } @Override diff --git a/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsolePrintStream.java b/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsolePrintStream.java index 69ab0972aff..17e4cec3442 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsolePrintStream.java +++ b/grails-bootstrap/src/main/groovy/org/grails/build/logging/GrailsConsolePrintStream.java @@ -18,10 +18,10 @@ */ package org.grails.build.logging; -import grails.build.logging.GrailsConsole; - import java.io.PrintStream; +import grails.build.logging.GrailsConsole; + /** * Used to replace default System.out with one that routes calls through GrailsConsole. * @@ -35,7 +35,7 @@ public GrailsConsolePrintStream(PrintStream out) { } public PrintStream getTargetOut() { - return (PrintStream)out; + return (PrintStream) out; } @Override diff --git a/grails-bootstrap/src/main/groovy/org/grails/build/parsing/ScriptNameResolver.groovy b/grails-bootstrap/src/main/groovy/org/grails/build/parsing/ScriptNameResolver.groovy index 872e3452c2e..e4b1c5df085 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/build/parsing/ScriptNameResolver.groovy +++ b/grails-bootstrap/src/main/groovy/org/grails/build/parsing/ScriptNameResolver.groovy @@ -18,9 +18,10 @@ */ package org.grails.build.parsing -import grails.util.GrailsNameUtils import groovy.transform.CompileStatic +import grails.util.GrailsNameUtils + /** * @author Andres Almiray * @author Dierk Koenig @@ -28,12 +29,13 @@ import groovy.transform.CompileStatic */ @CompileStatic class ScriptNameResolver { + /** * Matches a camelCase scriptName to a potential scriptFileName in canonical form.

* The following scriptNames match FooBar: FB, FoB, FBa */ static boolean resolvesTo(String scriptName, String scriptFileName) { - def scriptFileNameTokens = GrailsNameUtils.getNameFromScript( scriptFileName ).findAll(/[A-Z][a-z]+/) + def scriptFileNameTokens = GrailsNameUtils.getNameFromScript(scriptFileName).findAll(/[A-Z][a-z]+/) def scriptNameTokens = GrailsNameUtils.getNameFromScript(scriptName).findAll(/[A-Z][a-z]*/) if (scriptFileNameTokens.size() != scriptNameTokens.size()) return false diff --git a/grails-bootstrap/src/main/groovy/org/grails/config/CodeGenConfig.groovy b/grails-bootstrap/src/main/groovy/org/grails/config/CodeGenConfig.groovy index 232717bf778..9d4b6d4d6f7 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/config/CodeGenConfig.groovy +++ b/grails-bootstrap/src/main/groovy/org/grails/config/CodeGenConfig.groovy @@ -18,17 +18,19 @@ */ package org.grails.config -import grails.config.ConfigMap -import grails.util.Environment import groovy.transform.Canonical import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import org.codehaus.groovy.runtime.DefaultGroovyMethods import org.codehaus.groovy.runtime.typehandling.GroovyCastException + import org.yaml.snakeyaml.LoaderOptions import org.yaml.snakeyaml.Yaml import org.yaml.snakeyaml.constructor.SafeConstructor +import grails.config.ConfigMap +import grails.util.Environment + /** * A {@link ConfigMap} implementation used at codegen time * @@ -40,6 +42,7 @@ import org.yaml.snakeyaml.constructor.SafeConstructor @CompileStatic @Canonical class CodeGenConfig implements Cloneable, ConfigMap { + final NavigableMap configMap GroovyClassLoader groovyClassLoader = new GroovyClassLoader(CodeGenConfig.getClassLoader()) @@ -94,17 +97,17 @@ class CodeGenConfig implements Cloneable, ConfigMap { @Override Object remove(Object key) { - throw new UnsupportedOperationException("Config cannot be mutated") + throw new UnsupportedOperationException('Config cannot be mutated') } @Override void putAll(Map m) { - throw new UnsupportedOperationException("Config cannot be mutated") + throw new UnsupportedOperationException('Config cannot be mutated') } @Override void clear() { - throw new UnsupportedOperationException("Config cannot be mutated") + throw new UnsupportedOperationException('Config cannot be mutated') } @Override @@ -125,7 +128,7 @@ class CodeGenConfig implements Cloneable, ConfigMap { @Override def T getRequiredProperty(String key, Class targetType) throws IllegalStateException { def value = getProperty(key, targetType) - if(value == null) { + if (value == null) { throw new IllegalStateException("Property [$key] not found") } return value @@ -137,16 +140,16 @@ class CodeGenConfig implements Cloneable, ConfigMap { } def envName = Environment.current.name - def environmentSpecific = getProperty("environments.${envName}", Map.class) - if(environmentSpecific != null) { - if(!environmentSpecific.isEmpty()) { + def environmentSpecific = getProperty("environments.${envName}", Map) + if (environmentSpecific != null) { + if (!environmentSpecific.isEmpty()) { mergeMap(environmentSpecific, false) } } } void loadGroovy(File groovyConfig) { - if(groovyConfig.exists()) { + if (groovyConfig.exists()) { def envName = Environment.current.name def configSlurper = new ConfigSlurper(envName) configSlurper.classLoader = groovyClassLoader @@ -158,148 +161,147 @@ class CodeGenConfig implements Cloneable, ConfigMap { @CompileDynamic // fails with CompileStatic! void loadYml(InputStream input) { Yaml yaml = new Yaml(new SafeConstructor(new LoaderOptions())) - for(Object yamlObject : yaml.loadAll(input)) { - if(yamlObject instanceof Map) { // problem here with CompileStatic - mergeMap((Map)yamlObject) + for (Object yamlObject : yaml.loadAll(input)) { + if (yamlObject instanceof Map) { // problem here with CompileStatic + mergeMap((Map) yamlObject) } } } - - void mergeMap(Map sourceMap, boolean parseFlatKeys =false) { + + void mergeMap(Map sourceMap, boolean parseFlatKeys = false) { configMap.merge(sourceMap, parseFlatKeys) } - - public T navigate(Class requiredType, String... path) { + + T navigate(Class requiredType, String... path) { Object result = configMap.navigate(path) - if(result == null) { + if (result == null) { return null } return convertToType(result, requiredType) } - + protected T convertToType(Object value, Class requiredType) { - if(value == null || value instanceof NavigableMap.NullSafeNavigator) { + if (value == null || value instanceof NavigableMap.NullSafeNavigator) { return null } - else if(requiredType.isInstance(value)) { - return (T)value + else if (requiredType.isInstance(value)) { + return (T) value } - if(requiredType==String.class) { + if (requiredType == String) { return String.valueOf(value) - } else if(requiredType==Boolean.class) { + } else if (requiredType == Boolean) { Boolean booleanObject = toBooleanObject(String.valueOf(value)) return booleanObject != null ? booleanObject : Boolean.FALSE - } else if (requiredType==boolean) { + } else if (requiredType == boolean) { Boolean booleanObject = toBooleanObject(String.valueOf(value)) return booleanObject != null ? booleanObject.booleanValue() : Boolean.FALSE.booleanValue() - } else if(requiredType==Integer.class) { - if(value instanceof Number) { - return Integer.valueOf(((Number)value).intValue()) + } else if (requiredType == Integer) { + if (value instanceof Number) { + return Integer.valueOf(((Number) value).intValue()) } else { return Integer.valueOf(String.valueOf(value)) } - } else if(requiredType==Long.class) { - if(value instanceof Number) { - return Long.valueOf(((Number)value).longValue()) + } else if (requiredType == Long) { + if (value instanceof Number) { + return Long.valueOf(((Number) value).longValue()) } else { return Long.valueOf(String.valueOf(value)) } - } else if(requiredType==Double.class) { - if(value instanceof Number) { - return Double.valueOf(((Number)value).doubleValue()) + } else if (requiredType == Double) { + if (value instanceof Number) { + return Double.valueOf(((Number) value).doubleValue()) } else { return Double.valueOf(String.valueOf(value)) } - } else if(requiredType==BigDecimal.class) { + } else if (requiredType == BigDecimal) { return new BigDecimal(String.valueOf(value)) } else { return convertToOtherTypes(value, requiredType) } } - + protected T convertToOtherTypes(Object value, Class requiredType) { throw new RuntimeException("conversion of $value to $requiredType.name not implemented") } - public Object navigate(String... path) { + Object navigate(String... path) { return navigate(Object, path) } - - public boolean asBoolean() { + + boolean asBoolean() { return !configMap.isEmpty() } - public Object asType(Class type) { - if(type==Boolean || type==boolean) { + Object asType(Class type) { + if (type == Boolean || type == boolean) { return asBoolean() - } else if (type==String) { + } else if (type == String) { return toString() - } else if (type==Map) { + } else if (type == Map) { return this - } else if (type==CodeGenConfig) { + } else if (type == CodeGenConfig) { return new CodeGenConfig(this) } else { throw new GroovyCastException(this, type) } } - - public Object getAt(Object key) { + + Object getAt(Object key) { getProperty(String.valueOf(key)) } - - public void setAt(Object key, Object value) { + + void setAt(Object key, Object value) { setProperty(String.valueOf(key), value) } - - public Object getProperty(String name) { - if ("configMap".equals(name)) + + Object getProperty(String name) { + if ('configMap'.equals(name)) return this.configMap return configMap.get(name) } - public Object get(String name) { - if ("configMap".equals(name)) + Object get(String name) { + if ('configMap'.equals(name)) return this.configMap return configMap.get(name) } @Override - public Iterator> iterator() { - return DefaultGroovyMethods.iterator(configMap); + Iterator> iterator() { + return DefaultGroovyMethods.iterator(configMap) } - public T getProperty(String name, Class requiredType) { - return convertToType( configMap.get(name), requiredType ) + T getProperty(String name, Class requiredType) { + return convertToType(configMap.get(name), requiredType) } @Override def T getProperty(String key, Class targetType, T defaultValue) { def v = getProperty(key, targetType) - if(v == null) { + if (v == null) { return defaultValue } return v } - public void setProperty(String name, Object value) { + void setProperty(String name, Object value) { configMap.setProperty(name, value) } - - + /** * toBooleanObject method ported from org.apache.commons.lang.BooleanUtils.toBooleanObject to Groovy code * @param str * @return */ private static Boolean toBooleanObject(String str) { - if (str.is("true")) { + if (str.is('true')) { return Boolean.TRUE } if (str == null) { return null } int strlen = str.length() - if (strlen==0) { + if (strlen == 0) { return null } else if (strlen == 1) { char ch0 = str.charAt(0) @@ -315,11 +317,11 @@ class CodeGenConfig implements Cloneable, ConfigMap { char ch0 = str.charAt(0) char ch1 = str.charAt(1) if ((ch0 == 'o' || ch0 == 'O') && - (ch1 == 'n' || ch1 == 'N') ) { + (ch1 == 'n' || ch1 == 'N')) { return Boolean.TRUE } if ((ch0 == 'n' || ch0 == 'N') && - (ch1 == 'o' || ch1 == 'O') ) { + (ch1 == 'o' || ch1 == 'O')) { return Boolean.FALSE } } else if (strlen == 3) { @@ -328,12 +330,12 @@ class CodeGenConfig implements Cloneable, ConfigMap { char ch2 = str.charAt(2) if ((ch0 == 'y' || ch0 == 'Y') && (ch1 == 'e' || ch1 == 'E') && - (ch2 == 's' || ch2 == 'S') ) { + (ch2 == 's' || ch2 == 'S')) { return Boolean.TRUE } if ((ch0 == 'o' || ch0 == 'O') && (ch1 == 'f' || ch1 == 'F') && - (ch2 == 'f' || ch2 == 'F') ) { + (ch2 == 'f' || ch2 == 'F')) { return Boolean.FALSE } } else if (strlen == 4) { @@ -344,7 +346,7 @@ class CodeGenConfig implements Cloneable, ConfigMap { if ((ch0 == 't' || ch0 == 'T') && (ch1 == 'r' || ch1 == 'R') && (ch2 == 'u' || ch2 == 'U') && - (ch3 == 'e' || ch3 == 'E') ) { + (ch3 == 'e' || ch3 == 'E')) { return Boolean.TRUE } } else if (strlen == 5) { @@ -357,7 +359,7 @@ class CodeGenConfig implements Cloneable, ConfigMap { (ch1 == 'a' || ch1 == 'A') && (ch2 == 'l' || ch2 == 'L') && (ch3 == 's' || ch3 == 'S') && - (ch4 == 'e' || ch4 == 'E') ) { + (ch4 == 'e' || ch4 == 'E')) { return Boolean.FALSE } } diff --git a/grails-bootstrap/src/main/groovy/org/grails/config/NavigableMap.groovy b/grails-bootstrap/src/main/groovy/org/grails/config/NavigableMap.groovy index 94a2a9c3521..15fddd7c39e 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/config/NavigableMap.groovy +++ b/grails-bootstrap/src/main/groovy/org/grails/config/NavigableMap.groovy @@ -18,15 +18,16 @@ */ package org.grails.config +import java.util.regex.Pattern + import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.transform.EqualsAndHashCode import org.codehaus.groovy.runtime.DefaultGroovyMethods + import org.slf4j.Logger import org.slf4j.LoggerFactory -import java.util.regex.Pattern - /** * @deprecated This class is deprecated to reduce complexity, improve performance, and increase maintainability. Use {@code config.getProperty(String key, Class targetType)} instead. */ @@ -35,7 +36,7 @@ import java.util.regex.Pattern @CompileStatic class NavigableMap implements Map, Cloneable { - private static final Logger LOG = LoggerFactory.getLogger(NavigableMap.class); + private static final Logger LOG = LoggerFactory.getLogger(NavigableMap) private static final Pattern SPLIT_PATTERN = ~/\./ private static final String SPRING_PROFILES = 'spring.profiles.active' @@ -54,7 +55,7 @@ class NavigableMap implements Map, Cloneable { NavigableMap() { rootConfig = this path = [] - dottedPath = "" + dottedPath = '' delegateMap = new LinkedHashMap<>() } @@ -70,7 +71,7 @@ class NavigableMap implements Map, Cloneable { this.rootConfig = rootConfig this.path = path dottedPath = path.join('.') - this.delegateMap= delegateMap + this.delegateMap = delegateMap } @Override @@ -95,12 +96,12 @@ class NavigableMap implements Map, Cloneable { @Override boolean containsKey(Object key) { - delegateMap.containsKey key + delegateMap.containsKey(key) } @Override boolean containsValue(Object value) { - delegateMap.containsValue value + delegateMap.containsValue(value) } @CompileDynamic @@ -120,12 +121,12 @@ class NavigableMap implements Map, Cloneable { @Override Object remove(Object key) { - delegateMap.remove key + delegateMap.remove(key) } @Override void putAll(Map m) { - delegateMap.putAll m + delegateMap.putAll(m) } @Override @@ -148,8 +149,8 @@ class NavigableMap implements Map, Cloneable { delegateMap.entrySet() } - void merge(Map sourceMap, boolean parseFlatKeys=false) { - mergeMaps(this, "", this, sourceMap, parseFlatKeys) + void merge(Map sourceMap, boolean parseFlatKeys = false) { + mergeMaps(this, '', this, sourceMap, parseFlatKeys) } private void mergeMaps(NavigableMap rootMap, @@ -158,7 +159,7 @@ class NavigableMap implements Map, Cloneable { Map sourceMap, boolean parseFlatKeys) { - if(springProfileExclude(sourceMap, path)) { + if (springProfileExclude(sourceMap, path)) { return } @@ -189,7 +190,7 @@ class NavigableMap implements Map, Cloneable { def activeSpringProfile = System.getProperty(SPRING_PROFILES) // Is there a 'spring.config.activate.on-profile' property defined in the source map? - def sourceMapProfile1 = ((Map)((Map)((Map)sourceMap?.get(SPRING))?.get(CONFIG))?.get(ACTIVATE))?.get(ON_PROFILE) + def sourceMapProfile1 = ((Map) ((Map)((Map)sourceMap?.get(SPRING))?.get(CONFIG))?.get(ACTIVATE))?.get(ON_PROFILE) if (!sourceMapProfile1 && path == "$SPRING.$CONFIG.$ACTIVATE") { sourceMapProfile1 = sourceMap?.get(ON_PROFILE) } @@ -206,7 +207,7 @@ class NavigableMap implements Map, Cloneable { } // Is there a 'spring.profiles' property defined in the source map? (Old way of Spring profiles activation) - def sourceMapProfile2 = ((Map)sourceMap?.get(SPRING))?.get(PROFILES) + def sourceMapProfile2 = ((Map) sourceMap?.get(SPRING))?.get(PROFILES) if (!sourceMapProfile2 && path == SPRING) { sourceMapProfile2 = sourceMap?.get(PROFILES) } @@ -235,106 +236,106 @@ class NavigableMap implements Map, Cloneable { int subscriptStart = sourceKey.indexOf('[') int subscriptEnd = sourceKey.indexOf(']') if (subscriptEnd > subscriptStart) { - if(subscriptStart > -1) { - String k = sourceKey[0.. i) { - def v = list.get(i) - if (v instanceof Map) { - ((Map)v).put(remainder, sourceValue) - } else { - Map newMap = [:] - newMap.put(remainder, sourceValue) - fill(list, i, null) - list.set(i, newMap) - } - } else { - Map newMap = [:] - newMap.put(remainder, sourceValue) - fill(list, i, null) - list.set(i, newMap) - } - targetMap.put(k, list) - } else { - def currentValue = targetMap.get(k) - Map nestedMap = currentValue instanceof Map ? currentValue : [:] - targetMap.put(k, nestedMap) - - def v = nestedMap.get(index) - if (v instanceof Map) { - ((Map)v).put(remainder, sourceValue) - } else { - Map newMap = [:] - newMap.put(remainder, sourceValue) - nestedMap.put(index, newMap) - } - } - } else { - def currentValue = targetMap.get(k) - if (index.isNumber()) { - List list = currentValue instanceof List ? currentValue : [] - int i = index.toInteger() - fill(list, i, null) - list.set(i, sourceValue) - targetMap.put(k, list) - } else { - Map nestedMap = currentValue instanceof Map ? currentValue : [:] - targetMap.put(k, nestedMap) - nestedMap.put(index, sourceValue) - } - targetMap.put(sourceKey, sourceValue) - } - - } + if (subscriptStart > -1) { + String k = sourceKey[0.. i) { + def v = list.get(i) + if (v instanceof Map) { + ((Map) v).put(remainder, sourceValue) + } else { + Map newMap = [:] + newMap.put(remainder, sourceValue) + fill(list, i, null) + list.set(i, newMap) + } + } else { + Map newMap = [:] + newMap.put(remainder, sourceValue) + fill(list, i, null) + list.set(i, newMap) + } + targetMap.put(k, list) + } else { + def currentValue = targetMap.get(k) + Map nestedMap = currentValue instanceof Map ? currentValue : [:] + targetMap.put(k, nestedMap) + + def v = nestedMap.get(index) + if (v instanceof Map) { + ((Map) v).put(remainder, sourceValue) + } else { + Map newMap = [:] + newMap.put(remainder, sourceValue) + nestedMap.put(index, newMap) + } + } + } else { + def currentValue = targetMap.get(k) + if (index.isNumber()) { + List list = currentValue instanceof List ? currentValue : [] + int i = index.toInteger() + fill(list, i, null) + list.set(i, sourceValue) + targetMap.put(k, list) + } else { + Map nestedMap = currentValue instanceof Map ? currentValue : [:] + targetMap.put(k, nestedMap) + nestedMap.put(index, sourceValue) + } + targetMap.put(sourceKey, sourceValue) + } + + } } else { Object currentValue = targetMap.containsKey(sourceKey) ? targetMap.get(sourceKey) : null Object newValue - if(sourceValue instanceof Map) { + if (sourceValue instanceof Map) { List newPathList = [] - newPathList.addAll( targetMap.getPath() ) + newPathList.addAll(targetMap.getPath()) newPathList.add(sourceKey) NavigableMap subMap - if(currentValue instanceof NavigableMap) { - subMap = (NavigableMap)currentValue + if (currentValue instanceof NavigableMap) { + subMap = (NavigableMap) currentValue } else { subMap = new NavigableMap(targetMap.getRootConfig(), newPathList.asImmutable()) - if(currentValue instanceof Map) { - subMap.putAll((Map)currentValue) + if (currentValue instanceof Map) { + subMap.putAll((Map) currentValue) } } String newPath = path ? "${path}.${sourceKey}" : sourceKey - mergeMaps(rootMap, newPath , subMap, (Map)sourceValue, parseFlatKeys) + mergeMaps(rootMap, newPath , subMap, (Map) sourceValue, parseFlatKeys) newValue = subMap } else { newValue = sourceValue } if (isNestedSet && newValue == null) { - if(path) { + if (path) { def subMap = rootMap.get(path) - if(subMap instanceof Map) { + if (subMap instanceof Map) { subMap.remove(sourceKey) } def keysToRemove = rootMap.keySet().findAll() { String key -> key.startsWith("${path}.") } - for(key in keysToRemove) { + for (key in keysToRemove) { rootMap.remove(key) } } targetMap.remove(sourceKey) } else { - if(path) { - rootMap.put( "${path}.${sourceKey}".toString(), newValue ) + if (path) { + rootMap.put("${path}.${sourceKey}".toString(), newValue) } mergeMapEntry(targetMap, sourceKey, newValue) } @@ -373,16 +374,16 @@ class NavigableMap implements Map, Cloneable { Object navigate(String... path) { return navigateMap(this, path) } - + private Object navigateMap(Map map, String... path) { - if(map==null || path == null) return null - if(path.length == 0) { + if (map == null || path == null) return null + if (path.length == 0) { return map } else if (path.length == 1) { return map.get(path[0]) } else { def submap = map.get(path[0]) - if(submap instanceof Map) { + if (submap instanceof Map) { return navigateMap((Map) submap, path.tail()) } return submap @@ -402,28 +403,28 @@ class NavigableMap implements Map, Cloneable { NavigableMap currentMap = this StringBuilder accumulatedPath = new StringBuilder() boolean isFirst = true - for(String pathElement : path) { - if(!isFirst) { - accumulatedPath.append(".").append(pathElement) + for (String pathElement : path) { + if (!isFirst) { + accumulatedPath.append('.').append(pathElement) } else { isFirst = false accumulatedPath.append(pathElement) } - Object currentItem = currentMap.get(pathElement) - if(currentItem instanceof NavigableMap) { - currentMap = (NavigableMap)currentItem + Object currentItem = currentMap.get(pathElement) + if (currentItem instanceof NavigableMap) { + currentMap = (NavigableMap) currentItem } else if (createMissing) { List newPathList = [] - newPathList.addAll( currentMap.getPath() ) + newPathList.addAll(currentMap.getPath()) newPathList.add(pathElement) Map newMap = new NavigableMap(currentMap.getRootConfig(), newPathList.asImmutable()) currentMap.put(pathElement, newMap) def fullPath = accumulatedPath.toString() - if(!rootMap.containsKey(fullPath)) { + if (!rootMap.containsKey(fullPath)) { rootMap.put(fullPath, newMap) } currentMap = newMap @@ -433,44 +434,44 @@ class NavigableMap implements Map, Cloneable { } currentMap } - + Map toFlatConfig() { Map flatConfig = [:] flattenKeys(flatConfig, this, [], false) flatConfig } - + Properties toProperties() { Properties properties = new Properties() flattenKeys((Map) properties, this, [], true) properties } - + private void flattenKeys(Map flatConfig, Map currentMap, List path, boolean forceStrings) { currentMap.each { key, value -> String stringKey = String.valueOf(key) - if(value != null) { - if(value instanceof Map) { + if (value != null) { + if (value instanceof Map) { List newPathList = [] - newPathList.addAll( path ) - newPathList.add( stringKey ) + newPathList.addAll(path) + newPathList.add(stringKey) - flattenKeys(flatConfig, (Map)value, newPathList.asImmutable(), forceStrings) + flattenKeys(flatConfig, (Map) value, newPathList.asImmutable(), forceStrings) } else { String fullKey - if(path) { + if (path) { fullKey = path.join('.') + '.' + stringKey } else { fullKey = stringKey } - if(value instanceof Collection) { - if(forceStrings) { - flatConfig.put(fullKey, ((Collection)value).join(",")) + if (value instanceof Collection) { + if (forceStrings) { + flatConfig.put(fullKey, ((Collection) value).join(',')) } else { flatConfig.put(fullKey, value) } int index = 0 - for(Object item: (Collection)value) { + for (Object item: (Collection) value) { String collectionKey = "${fullKey}[${index}]".toString() flatConfig.put(collectionKey, forceStrings ? String.valueOf(item) : item) index++ @@ -480,7 +481,7 @@ class NavigableMap implements Map, Cloneable { } } } - } + } } @Override @@ -498,7 +499,7 @@ class NavigableMap implements Map, Cloneable { */ @Deprecated @CompileStatic - static class NullSafeNavigator implements Map{ + static class NullSafeNavigator implements Map { final NavigableMap parent final List path @@ -521,7 +522,7 @@ class NavigableMap implements Map, Cloneable { @Override int size() { NavigableMap parentMap = parent.navigateSubMap(path, false) - if(parentMap != null) { + if (parentMap != null) { return parentMap.size() } return 0 @@ -530,7 +531,7 @@ class NavigableMap implements Map, Cloneable { @Override boolean isEmpty() { NavigableMap parentMap = parent.navigateSubMap(path, false) - if(parentMap != null) { + if (parentMap != null) { return parentMap.isEmpty() } return true @@ -538,7 +539,7 @@ class NavigableMap implements Map, Cloneable { boolean containsKey(Object key) { NavigableMap parentMap = parent.navigateSubMap(path, false) - if(parentMap == null) return false + if (parentMap == null) return false else { return parentMap.containsKey(key) } @@ -547,7 +548,7 @@ class NavigableMap implements Map, Cloneable { @Override boolean containsValue(Object value) { NavigableMap parentMap = parent.navigateSubMap(path, false) - if(parentMap != null) { + if (parentMap != null) { return parentMap.containsValue(value) } return false @@ -560,28 +561,28 @@ class NavigableMap implements Map, Cloneable { @Override Object put(String key, Object value) { - throw new UnsupportedOperationException("Configuration cannot be modified"); + throw new UnsupportedOperationException('Configuration cannot be modified') } @Override Object remove(Object key) { - throw new UnsupportedOperationException("Configuration cannot be modified"); + throw new UnsupportedOperationException('Configuration cannot be modified') } @Override void putAll(Map m) { - throw new UnsupportedOperationException("Configuration cannot be modified"); + throw new UnsupportedOperationException('Configuration cannot be modified') } @Override void clear() { - throw new UnsupportedOperationException("Configuration cannot be modified"); + throw new UnsupportedOperationException('Configuration cannot be modified') } @Override Set keySet() { NavigableMap parentMap = parent.navigateSubMap(path, false) - if(parentMap != null) { + if (parentMap != null) { return parentMap.keySet() } return Collections.emptySet() @@ -590,7 +591,7 @@ class NavigableMap implements Map, Cloneable { @Override Collection values() { NavigableMap parentMap = parent.navigateSubMap(path, false) - if(parentMap != null) { + if (parentMap != null) { return parentMap.values() } return Collections.emptySet() @@ -599,7 +600,7 @@ class NavigableMap implements Map, Cloneable { @Override Set> entrySet() { NavigableMap parentMap = parent.navigateSubMap(path, false) - if(parentMap != null) { + if (parentMap != null) { return parentMap.entrySet() } return Collections.emptySet() @@ -607,7 +608,7 @@ class NavigableMap implements Map, Cloneable { Object getProperty(String name) { NavigableMap parentMap = parent.navigateSubMap(path, false) - if(parentMap == null) { + if (parentMap == null) { return new NullSafeNavigator(parent, ((path + [name]) as List).asImmutable()) } else { return parentMap.get(name) @@ -624,7 +625,7 @@ class NavigableMap implements Map, Cloneable { } Object invokeMethod(String name, Object args) { - throw new NullPointerException("Cannot invoke method " + name + "() on NullSafeNavigator"); + throw new NullPointerException('Cannot invoke method ' + name + '() on NullSafeNavigator') } boolean equals(Object to) { @@ -640,7 +641,7 @@ class NavigableMap implements Map, Cloneable { } Object plus(Object o) { - throw new NullPointerException("Cannot invoke method plus on NullSafeNavigator") + throw new NullPointerException('Cannot invoke method plus on NullSafeNavigator') } boolean is(Object other) { @@ -648,7 +649,7 @@ class NavigableMap implements Map, Cloneable { } Object asType(Class c) { - if(c==Boolean || c==boolean) return false + if (c == Boolean || c == boolean) return false return null } @@ -657,7 +658,7 @@ class NavigableMap implements Map, Cloneable { } // public int hashCode() { -// throw new NullPointerException("Cannot invoke method hashCode() on NullSafeNavigator"); +// throw new NullPointerException('Cannot invoke method hashCode() on NullSafeNavigator') // } } } diff --git a/grails-bootstrap/src/main/groovy/org/grails/exceptions/ExceptionUtils.groovy b/grails-bootstrap/src/main/groovy/org/grails/exceptions/ExceptionUtils.groovy index 6e733ffd518..6e1bba80f09 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/exceptions/ExceptionUtils.groovy +++ b/grails-bootstrap/src/main/groovy/org/grails/exceptions/ExceptionUtils.groovy @@ -33,8 +33,7 @@ import org.codehaus.groovy.control.messages.SyntaxErrorMessage @CompileStatic class ExceptionUtils { - public static final String EXCEPTION_ATTRIBUTE = "exception"; - + public static final String EXCEPTION_ATTRIBUTE = 'exception' static RuntimeException getFirstRuntimeException(Throwable e) { if (e instanceof RuntimeException) return (RuntimeException) e @@ -61,10 +60,10 @@ class ExceptionUtils { static int extractLineNumber(CompilationFailedException e) { int lineNumber = -1 if (e instanceof MultipleCompilationErrorsException) { - MultipleCompilationErrorsException mcee = (MultipleCompilationErrorsException)e + MultipleCompilationErrorsException mcee = (MultipleCompilationErrorsException) e Object message = mcee.errorCollector.errors.iterator().next() if (message instanceof SyntaxErrorMessage) { - SyntaxErrorMessage sem = (SyntaxErrorMessage)message + SyntaxErrorMessage sem = (SyntaxErrorMessage) message lineNumber = sem.cause.line } } diff --git a/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/CodeSnippetPrinter.groovy b/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/CodeSnippetPrinter.groovy index cc08a8ee6cd..58c39810e46 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/CodeSnippetPrinter.groovy +++ b/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/CodeSnippetPrinter.groovy @@ -37,4 +37,4 @@ interface CodeSnippetPrinter { @Deprecated String prettyPrintCodeSnippet(Throwable exception) -} \ No newline at end of file +} diff --git a/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTraceFilterer.java b/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTraceFilterer.java index 95215b5e829..38c0235706b 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTraceFilterer.java +++ b/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTraceFilterer.java @@ -18,13 +18,13 @@ */ package org.grails.exceptions.reporting; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; - import java.util.ArrayList; import java.util.Arrays; import java.util.List; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + /** * Default implementation of StackTraceFilterer. * @@ -55,7 +55,7 @@ public class DefaultStackTraceFilterer implements StackTraceFilterer { "jakarta.servlet." }; - private List packagesToFilter = new ArrayList(); + private List packagesToFilter = new ArrayList<>(); private boolean shouldFilter; private String cutOffPackage = null; @@ -112,7 +112,7 @@ public Throwable filter(Throwable source) { } private List filterTraceWithCutOff(StackTraceElement[] trace, String endPackage) { - List newTrace = new ArrayList(); + List newTrace = new ArrayList<>(); boolean foundGroovy = false; for (StackTraceElement stackTraceElement : trace) { String className = stackTraceElement.getClassName(); diff --git a/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTracePrinter.groovy b/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTracePrinter.groovy index 1673bc7d60d..84f927db7bf 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTracePrinter.groovy +++ b/grails-bootstrap/src/main/groovy/org/grails/exceptions/reporting/DefaultStackTracePrinter.groovy @@ -41,7 +41,7 @@ class DefaultStackTracePrinter implements StackTracePrinter { def lineNumWidth = mln.toString().size() def methodNameBaseWidth = t.stackTrace.methodName*.size().max() + 1 - def lh = "Line".padLeft(lineNumWidth + 4) + def lh = 'Line'.padLeft(lineNumWidth + 4) String header = "$lh | Method" printHeader(sb, header) @@ -62,7 +62,7 @@ class DefaultStackTracePrinter implements StackTracePrinter { printCausedByMessage(sb, e) } if (e instanceof MultipleCompilationErrorsException) break - if(last > 0) { + if (last > 0) { stackTrace[0..-1].eachWithIndex { te, idx -> def fileName = getFileName(te) def lineNumber @@ -122,7 +122,7 @@ class DefaultStackTracePrinter implements StackTracePrinter { } static String makeRelativeIfPossible(String fileName) { - final base = System.getProperty("base.dir") + final base = System.getProperty('base.dir') if (base) { fileName = fileName - base } @@ -135,24 +135,24 @@ class DefaultStackTracePrinter implements StackTracePrinter { protected void printCausedByMessage(PrintWriter sb, Throwable e) { sb.println() - sb.println "Caused by ${e.class.simpleName}: ${e.message}" + sb.println("Caused by ${e.class.simpleName}: ${e.message}") } protected void printHeader(PrintWriter sb, String header) { - sb.println header + sb.println(header) } protected void printLastEntry(PrintWriter sb, String lineNumber, String methodName, String fileName) { - sb.println "^ $lineNumber | $methodName in $fileName" + sb.println("^ $lineNumber | $methodName in $fileName") } protected void printStackLine(PrintWriter sb, String lineNumber, String methodName, String fileName) { - sb.println "| $lineNumber | $methodName in $fileName" + sb.println("| $lineNumber | $methodName in $fileName") } protected void printFailureLocation(PrintWriter sb, String lineNumber, String methodName, String fileName) { - sb.println "->> $lineNumber | $methodName in $fileName" - sb << "- " * 36 + sb.println("->> $lineNumber | $methodName in $fileName") + sb << '- ' * 36 sb.println() } diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/support/AntPathMatcher.java b/grails-bootstrap/src/main/groovy/org/grails/io/support/AntPathMatcher.java index d92fcccb0f7..78dbf8d42f4 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/support/AntPathMatcher.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/support/AntPathMatcher.java @@ -212,7 +212,7 @@ else if (!fullMatch && "**".equals(pattDirs[pattIdxStart])) { } private String[] tokenize(String pattern) { - List list = StringGroovyMethods.tokenize((CharSequence)pattern, (CharSequence)pathSeparator); + List list = StringGroovyMethods.tokenize((CharSequence) pattern, (CharSequence) pathSeparator); return list.toArray(new String[list.size()]); } @@ -272,7 +272,7 @@ public String extractPathWithinPattern(String pattern, String path) { } public Map extractUriTemplateVariables(String pattern, String path) { - Map variables = new LinkedHashMap(); + Map variables = new LinkedHashMap<>(); /*boolean result =*/ doMatch(pattern, path, true, variables); return variables; } @@ -353,7 +353,7 @@ public String combine(String pattern1, String pattern2) { } private boolean hasText(String txt) { - return txt != null && txt.length()>0; + return txt != null && txt.length() > 0; } /** @@ -465,7 +465,7 @@ private int getPatternLength(String pattern) { * @author Rossen Stoyanchev * @since 3.0 */ - static class AntPathStringMatcher { + static class AntPathStringMatcher { private static final Pattern GLOB_PATTERN = Pattern.compile("\\?|\\*|\\{((?:\\{[^/]+?\\}|[^/{}]|\\\\[{}])+?)\\}"); @@ -475,7 +475,7 @@ static class AntPathStringMatcher { private String str; - private final List variableNames = new LinkedList(); + private final List variableNames = new LinkedList<>(); private final Map uriTemplateVariables; diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/support/ByteArrayResource.groovy b/grails-bootstrap/src/main/groovy/org/grails/io/support/ByteArrayResource.groovy index ba7f0c22e0e..c3a2b2c2453 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/support/ByteArrayResource.groovy +++ b/grails-bootstrap/src/main/groovy/org/grails/io/support/ByteArrayResource.groovy @@ -27,7 +27,7 @@ import groovy.transform.CompileStatic class ByteArrayResource implements Resource { byte[] bytes - String description = "resource loaded from byte array" + String description = 'resource loaded from byte array' ByteArrayResource(byte[] bytes) { this.bytes = bytes @@ -47,15 +47,15 @@ class ByteArrayResource implements Resource { boolean isReadable() { true } URL getURL() { - throw new UnsupportedOperationException("Method getURL not supported") + throw new UnsupportedOperationException('Method getURL not supported') } URI getURI() { - throw new UnsupportedOperationException("Method getURI not supported") + throw new UnsupportedOperationException('Method getURI not supported') } File getFile() { - throw new UnsupportedOperationException("Method getFile not supported") + throw new UnsupportedOperationException('Method getFile not supported') } long contentLength() { bytes.length } @@ -66,6 +66,6 @@ class ByteArrayResource implements Resource { //Fully qualified name to work around Groovy bug org.grails.io.support.Resource createRelative(String relativePath) { - throw new UnsupportedOperationException("Method createRelative not supported") + throw new UnsupportedOperationException('Method createRelative not supported') } } diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/support/PathMatchingResourcePatternResolver.java b/grails-bootstrap/src/main/groovy/org/grails/io/support/PathMatchingResourcePatternResolver.java index 7205754f750..2c124cac3bd 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/support/PathMatchingResourcePatternResolver.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/support/PathMatchingResourcePatternResolver.java @@ -31,7 +31,6 @@ import java.util.jar.JarEntry; import java.util.jar.JarFile; - /** * A ResourcePatternResolver implementation that is able to resolve a * specified resource location path into one or more matching Resources. @@ -149,7 +148,6 @@ public class PathMatchingResourcePatternResolver { private static final String CLASSPATH_ALL_URL_PREFIX = "classpath*:"; - private final ResourceLoader resourceLoader; private AntPathMatcher pathMatcher = new AntPathMatcher(); @@ -251,7 +249,7 @@ protected Resource[] findAllClassPathResources(String location) throws IOExcepti path = path.substring(1); } Enumeration resourceUrls = getClassLoader().getResources(path); - Set result = new LinkedHashSet(16); + Set result = new LinkedHashSet<>(16); while (resourceUrls.hasMoreElements()) { URL url = resourceUrls.nextElement(); result.add(convertClassLoaderURL(url)); @@ -284,7 +282,7 @@ protected Resource[] findPathMatchingResources(String locationPattern) throws IO String rootDirPath = determineRootDir(locationPattern); String subPattern = locationPattern.substring(rootDirPath.length()); Resource[] rootDirResources = getResources(rootDirPath); - Set result = new LinkedHashSet(16); + Set result = new LinkedHashSet<>(16); for (Resource rootDirResource : rootDirResources) { rootDirResource = resolveRootDirResource(rootDirResource); if (isJarResource(rootDirResource)) { @@ -401,7 +399,7 @@ protected Set doFindPathMatchingJarResources(Resource rootDirResource, // The Sun JRE does not return a slash here, but BEA JRockit does. rootEntryPath = rootEntryPath + "/"; } - Set result = new LinkedHashSet(8); + Set result = new LinkedHashSet<>(8); for (Enumeration entries = jarFile.entries(); entries.hasMoreElements();) { JarEntry entry = entries.nextElement(); String entryPath = entry.getName(); @@ -472,7 +470,7 @@ protected Set doFindPathMatchingFileResources(Resource rootDirResource */ protected Set doFindMatchingFileSystemResources(File rootDir, String subPattern) throws IOException { Set matchingFiles = retrieveMatchingFiles(rootDir, subPattern); - Set result = new LinkedHashSet(matchingFiles.size()); + Set result = new LinkedHashSet<>(matchingFiles.size()); for (File file : matchingFiles) { result.add(new FileSystemResource(file)); } @@ -500,12 +498,12 @@ protected Set retrieveMatchingFiles(File rootDir, String pattern) throws I if (!rootDir.canRead()) { return Collections.emptySet(); } - String fullPattern = rootDir.getAbsolutePath().replace( File.separator, "/"); + String fullPattern = rootDir.getAbsolutePath().replace(File.separator, "/"); if (!pattern.startsWith("/")) { fullPattern += "/"; } fullPattern = fullPattern + pattern.replace(File.separator, "/"); - Set result = new LinkedHashSet(8); + Set result = new LinkedHashSet<>(8); doRetrieveMatchingFiles(fullPattern, rootDir, result); return result; } @@ -525,7 +523,7 @@ protected void doRetrieveMatchingFiles(String fullPattern, File dir, Set r return; } for (File content : dirContents) { - String currPath = content.getAbsolutePath().replace( File.separator, "/"); + String currPath = content.getAbsolutePath().replace(File.separator, "/"); if (content.isDirectory() && getPathMatcher().matchStart(fullPattern, currPath + "/")) { if (content.canRead()) { doRetrieveMatchingFiles(fullPattern, content, result); diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/support/ResourceLocator.java b/grails-bootstrap/src/main/groovy/org/grails/io/support/ResourceLocator.java index cc753ad6581..018dec1c018 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/support/ResourceLocator.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/support/ResourceLocator.java @@ -18,8 +18,6 @@ */ package org.grails.io.support; -import grails.util.Environment; - import java.io.File; import java.io.FileFilter; import java.io.IOException; @@ -29,6 +27,8 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import grails.util.Environment; + /** * Used to locate resources at build / development time * @@ -44,11 +44,11 @@ public class ResourceLocator { protected static final Resource NULL_RESOURCE = new ByteArrayResource("null".getBytes()); protected PathMatchingResourcePatternResolver patchMatchingResolver; - protected List classSearchDirectories = new ArrayList(); - protected List resourceSearchDirectories = new ArrayList(); - protected Map classNameToResourceCache = new ConcurrentHashMap(); - protected Map uriToResourceCache = new ConcurrentHashMap(); - protected ResourceLoader defaultResourceLoader = new FileSystemResourceLoader(); + protected List classSearchDirectories = new ArrayList<>(); + protected List resourceSearchDirectories = new ArrayList<>(); + protected Map classNameToResourceCache = new ConcurrentHashMap<>(); + protected Map uriToResourceCache = new ConcurrentHashMap<>(); + protected ResourceLoader defaultResourceLoader = new FileSystemResourceLoader(); protected boolean warDeployed = Environment.isWarDeployed(); public void setSearchLocation(String searchLocation) { @@ -124,7 +124,6 @@ else if (!warDeployed) { } } - if (resource == null || !resource.exists()) { Resource tmp = defaultResourceLoader != null ? defaultResourceLoader.getResource(uri) : null; if (tmp != null && tmp.exists()) { @@ -142,7 +141,6 @@ else if (warDeployed) { return resource == NULL_RESOURCE ? null : resource; } - private PluginResourceInfo inferPluginNameFromURI(String uri) { if (uri.startsWith("/plugins/")) { String withoutPluginsPath = uri.substring("/plugins/".length(), uri.length()); @@ -173,7 +171,7 @@ public Resource findResourceForClassName(String className) { } } if (resource == null || !resource.exists()) { - for(String ext : new String[]{".groovy", ".java"}) { + for (String ext : new String[]{".groovy", ".java"}) { resource = resolveExceptionSafe(GrailsResourceUtils.DOMAIN_DIR_PATH + "**/" + className + ext); if (resource != null && resource.exists()) { classNameToResourceCache.put(className, resource); @@ -187,7 +185,7 @@ public Resource findResourceForClassName(String className) { private List getSearchPatternForExtension(String classNameWithPathSeparator, String... extensions) { - List searchPatterns = new ArrayList(); + List searchPatterns = new ArrayList<>(); for (String extension : extensions) { String filename = classNameWithPathSeparator + extension; for (String classSearchDirectory : classSearchDirectories) { @@ -214,7 +212,6 @@ public void setResourceLoader(ResourceLoader resourceLoader) { defaultResourceLoader = resourceLoader; } - class PluginResourceInfo { String pluginName; String uri; diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/support/StaticResourceLoader.java b/grails-bootstrap/src/main/groovy/org/grails/io/support/StaticResourceLoader.java index 08630df9357..39f9e19ae3f 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/support/StaticResourceLoader.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/support/StaticResourceLoader.java @@ -18,7 +18,6 @@ */ package org.grails.io.support; - /** * Loads relative to a static base resource * diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/watch/AbstractDirectoryWatcher.java b/grails-bootstrap/src/main/groovy/org/grails/io/watch/AbstractDirectoryWatcher.java index 83ff54b689d..eabf182fc40 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/watch/AbstractDirectoryWatcher.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/watch/AbstractDirectoryWatcher.java @@ -24,7 +24,6 @@ import java.util.Collection; import java.util.List; - /** * Backend for {@link DirectoryWatcher} * @author Craig Andrews @@ -34,7 +33,7 @@ * @see DirectoryWatcher */ abstract class AbstractDirectoryWatcher implements Runnable { - private List listeners = new ArrayList(); + private List listeners = new ArrayList<>(); volatile protected boolean active = true; //must be volatile as it's read by multiple threads and the value should be reflected in all of them protected long sleepTime = 1000; @@ -44,7 +43,7 @@ abstract class AbstractDirectoryWatcher implements Runnable { * @param active False if you want to stop watching */ public void setActive(boolean active) { - this.active = active; + this.active = active; } /** @@ -102,8 +101,8 @@ protected void fireOnNew(File file) { } } - protected boolean isValidDirectoryToMonitor(File file){ - return file.isDirectory() && ! file.isHidden() && !file.getName().startsWith("."); + protected boolean isValidDirectoryToMonitor(File file) { + return file.isDirectory() && !file.isHidden() && !file.getName().startsWith("."); } protected boolean isValidFileToMonitor(File file, Collection fileExtensions) { @@ -111,7 +110,7 @@ protected boolean isValidFileToMonitor(File file, Collection fileExtensi String path = file.getAbsolutePath(); boolean isSvnFile = path.indexOf(File.separator + DirectoryWatcher.SVN_DIR_NAME + File.separator) > 0; return !isSvnFile && - !file.isDirectory() && + !file.isDirectory() && !file.isHidden() && !file.getName().startsWith(".") && (fileExtensions.contains("*") || fileExtensions.contains(getFilenameExtension(name))); diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/watch/DirectoryWatcher.java b/grails-bootstrap/src/main/groovy/org/grails/io/watch/DirectoryWatcher.java index 52a56dfd8d3..0f1593806cb 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/watch/DirectoryWatcher.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/watch/DirectoryWatcher.java @@ -19,13 +19,13 @@ package org.grails.io.watch; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.io.File; import java.util.ArrayList; import java.util.List; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * Utility class to watch directories for changes. * @@ -34,9 +34,9 @@ */ public class DirectoryWatcher extends Thread { - private static final Logger LOG = LoggerFactory.getLogger(DirectoryWatcher.class); + private static final Logger LOG = LoggerFactory.getLogger(DirectoryWatcher.class); - private final AbstractDirectoryWatcher directoryWatcherDelegate; + private final AbstractDirectoryWatcher directoryWatcherDelegate; public static final String SVN_DIR_NAME = ".svn"; @@ -47,29 +47,29 @@ public DirectoryWatcher() { setDaemon(true); AbstractDirectoryWatcher directoryWatcherDelegate; try { - if(System.getProperty("os.name").equals("Mac OS X")) { + if (System.getProperty("os.name").equals("Mac OS X")) { Boolean jnaAvailable = false; try { - Class.forName( "com.sun.jna.Pointer" ); + Class.forName("com.sun.jna.Pointer"); jnaAvailable = true; - } catch( ClassNotFoundException e ) { - if(LOG.isWarnEnabled()) { - LOG.warn("Error Initializing Native OS X File Event Watcher. Add JNA to classpath for Faster File Watching performance."); + } catch (ClassNotFoundException e) { + if (LOG.isWarnEnabled()) { + LOG.warn("Error Initializing Native OS X File Event Watcher. Add JNA to classpath for Faster File Watching performance."); } - + } - if(jnaAvailable) { + if (jnaAvailable) { directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.MacOsWatchServiceDirectoryWatcher").newInstance(); } else { - directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.WatchServiceDirectoryWatcher").newInstance(); + directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.WatchServiceDirectoryWatcher").newInstance(); } } else { - directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.WatchServiceDirectoryWatcher").newInstance(); + directoryWatcherDelegate = (AbstractDirectoryWatcher) Class.forName("org.grails.io.watch.WatchServiceDirectoryWatcher").newInstance(); } - } catch (Throwable e) { - LOG.info("Exception while trying to load WatchServiceDirectoryWatcher (this is probably Java 6 and WatchService isn't available). Falling back to PollingDirectoryWatcher.", e); - directoryWatcherDelegate = new PollingDirectoryWatcher(); - } + } catch (Throwable e) { + LOG.info("Exception while trying to load WatchServiceDirectoryWatcher (this is probably Java 6 and WatchService isn't available). Falling back to PollingDirectoryWatcher.", e); + directoryWatcherDelegate = new PollingDirectoryWatcher(); + } this.directoryWatcherDelegate = directoryWatcherDelegate; } @@ -79,7 +79,7 @@ public DirectoryWatcher() { * @param active False if you want to stop watching */ public void setActive(boolean active) { - directoryWatcherDelegate.setActive(active); + directoryWatcherDelegate.setActive(active); } /** @@ -88,7 +88,7 @@ public void setActive(boolean active) { * @param sleepTime The sleep time */ public void setSleepTime(long sleepTime) { - directoryWatcherDelegate.setSleepTime(sleepTime); + directoryWatcherDelegate.setSleepTime(sleepTime); } /** @@ -97,7 +97,7 @@ public void setSleepTime(long sleepTime) { * @param listener The file listener */ public void addListener(FileChangeListener listener) { - directoryWatcherDelegate.addListener(listener); + directoryWatcherDelegate.addListener(listener); } /** @@ -115,7 +115,7 @@ public void removeListener(FileChangeListener listener) { * @param fileToWatch The file to watch */ public void addWatchFile(File fileToWatch) { - directoryWatcherDelegate.addWatchFile(fileToWatch); + directoryWatcherDelegate.addWatchFile(fileToWatch); } /** @@ -125,20 +125,20 @@ public void addWatchFile(File fileToWatch) { * @param fileExtensions The extensions */ public void addWatchDirectory(File dir, List fileExtensions) { - List fileExtensionsWithoutDot = new ArrayList(fileExtensions.size()); - for(String fileExtension : fileExtensions){ - fileExtensionsWithoutDot.add(removeStartingDotIfPresent(fileExtension)); - } - directoryWatcherDelegate.addWatchDirectory(dir, fileExtensions); + List fileExtensionsWithoutDot = new ArrayList<>(fileExtensions.size()); + for (String fileExtension : fileExtensions) { + fileExtensionsWithoutDot.add(removeStartingDotIfPresent(fileExtension)); + } + directoryWatcherDelegate.addWatchDirectory(dir, fileExtensions); } /** - * Adds a directory to watch for the given file. All files and subdirectories in the directory will be watched. + * Adds a directory to watch for the given file. All files and subdirectories in the directory will be watched. * * @param dir The directory */ public void addWatchDirectory(File dir) { - addWatchDirectory(dir, "*"); + addWatchDirectory(dir, "*"); } /** @@ -149,10 +149,10 @@ public void addWatchDirectory(File dir) { */ public void addWatchDirectory(File dir, String extension) { extension = removeStartingDotIfPresent(extension); - List fileExtensions = new ArrayList(); + List fileExtensions = new ArrayList<>(); if (extension != null && extension.length() > 0) { int i = extension.lastIndexOf('.'); - if(i > -1) { + if (i > -1) { extension = extension.substring(i + 1); } fileExtensions.add(extension); diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/watch/FileExtensionFileChangeListener.groovy b/grails-bootstrap/src/main/groovy/org/grails/io/watch/FileExtensionFileChangeListener.groovy index 8e38c2cadf9..a9d032e42d7 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/watch/FileExtensionFileChangeListener.groovy +++ b/grails-bootstrap/src/main/groovy/org/grails/io/watch/FileExtensionFileChangeListener.groovy @@ -38,7 +38,7 @@ abstract class FileExtensionFileChangeListener implements DirectoryWatcher.FileC @Override final void onChange(File file) { - if(file && extensions.any() { String ext -> file.name.endsWith( ext ) } ) { + if (file && extensions.any() { String ext -> file.name.endsWith(ext) }) { onChange(file, extensions) } } @@ -47,7 +47,7 @@ abstract class FileExtensionFileChangeListener implements DirectoryWatcher.FileC @Override final void onNew(File file) { - if(file && extensions.any() { String ext -> file.name.endsWith( ext ) } ) { + if (file && extensions.any() { String ext -> file.name.endsWith(ext) }) { onNew(file, extensions) } } diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/watch/MacOsWatchServiceDirectoryWatcher.java b/grails-bootstrap/src/main/groovy/org/grails/io/watch/MacOsWatchServiceDirectoryWatcher.java index 9120c534c54..1a5732fd61c 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/watch/MacOsWatchServiceDirectoryWatcher.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/watch/MacOsWatchServiceDirectoryWatcher.java @@ -19,18 +19,31 @@ package org.grails.io.watch; +import java.io.File; +import java.io.IOException; +import java.nio.file.FileVisitResult; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.SimpleFileVisitor; +import java.nio.file.StandardWatchEventKinds; +import java.nio.file.WatchEvent; import java.nio.file.WatchEvent.Kind; +import java.nio.file.WatchKey; +import java.nio.file.WatchService; +import java.nio.file.attribute.BasicFileAttributes; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; + import io.methvin.watchservice.MacOSXListeningWatchService; import io.methvin.watchservice.WatchablePath; -import static io.methvin.watcher.DirectoryChangeEvent.EventType.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.File; -import java.io.IOException; -import java.nio.file.*; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; /** * Implementation of a {@link AbstractDirectoryWatcher} that uses {@link java.nio.WatchService}. @@ -42,29 +55,29 @@ */ class MacOsWatchServiceDirectoryWatcher extends AbstractDirectoryWatcher { - private static final Logger LOG = LoggerFactory.getLogger(MacOsWatchServiceDirectoryWatcher.class); - private Map> watchKeyToExtensionsMap = new ConcurrentHashMap>(); - private Set individualWatchedFiles = new HashSet(); + private static final Logger LOG = LoggerFactory.getLogger(MacOsWatchServiceDirectoryWatcher.class); + private Map> watchKeyToExtensionsMap = new ConcurrentHashMap<>(); + private Set individualWatchedFiles = new HashSet<>(); - private final WatchService watchService; + private final WatchService watchService; @SuppressWarnings("unchecked") private static WatchEvent cast(WatchEvent event) { - return (WatchEvent)event; + return (WatchEvent) event; } - public MacOsWatchServiceDirectoryWatcher(){ - try { - watchService = new MacOSXListeningWatchService(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } + public MacOsWatchServiceDirectoryWatcher() { + try { + watchService = new MacOSXListeningWatchService(); + } catch (Exception e) { + throw new RuntimeException(e); + } + } - @Override - public void run() { + @Override + public void run() { while (active) { - try { + try { WatchKey watchKey; try { watchKey = watchService.take(); @@ -81,17 +94,17 @@ public void run() { WatchEvent pathWatchEvent = cast(watchEvent); Path child = pathWatchEvent.context(); File childFile = child.toFile(); - if(individualWatchedFiles.contains(child) || individualWatchedFiles.contains(child.normalize())){ - if(kind == StandardWatchEventKinds.ENTRY_CREATE){ + if (individualWatchedFiles.contains(child) || individualWatchedFiles.contains(child.normalize())) { + if (kind == StandardWatchEventKinds.ENTRY_CREATE) { fireOnNew(childFile); - }else if(kind == StandardWatchEventKinds.ENTRY_MODIFY){ + } else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) { fireOnChange(childFile); - }else if(kind == StandardWatchEventKinds.ENTRY_DELETE){ + } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) { // do nothing... there's no way to communicate deletions } - }else{ + } else { List fileExtensions = watchKeyToExtensionsMap.get(watchKey); - if(fileExtensions==null){ + if (fileExtensions == null) { // this event didn't match a file in individualWatchedFiles so it's a not an individual file we're interested in // this event also didn't match a directory that we're interested in (if it did, fileExtentions wouldn't be null) // so it must be event for a file we're not interested in. An example of how this can happen is: @@ -102,27 +115,27 @@ public void run() { // Now, /images/b.png is changed. Because java.nio.file.WatchService watches directories, it gets a WatchEvent // for /images/b.png. But we aren't interested in that. LOG.debug("WatchService received an event for a file/directory that it's not interested in."); - }else{ - if(kind==StandardWatchEventKinds.ENTRY_CREATE){ + } else { + if (kind == StandardWatchEventKinds.ENTRY_CREATE) { // new directory created, so watch its contents - addWatchDirectory(child,fileExtensions); - if(childFile.isDirectory() && childFile.exists()) { + addWatchDirectory(child, fileExtensions); + if (childFile.isDirectory() && childFile.exists()) { final File[] files = childFile.listFiles(); - if(files != null) { + if (files != null) { for (File newFile : files) { - if(isValidFileToMonitor(newFile, fileExtensions)) { + if (isValidFileToMonitor(newFile, fileExtensions)) { fireOnNew(newFile); } } } } } - if(isValidFileToMonitor(childFile,fileExtensions)){ - if(kind == StandardWatchEventKinds.ENTRY_CREATE){ + if (isValidFileToMonitor(childFile, fileExtensions)) { + if (kind == StandardWatchEventKinds.ENTRY_CREATE) { fireOnNew(childFile); - }else if(kind == StandardWatchEventKinds.ENTRY_MODIFY){ + } else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) { fireOnChange(childFile); - }else if(kind == StandardWatchEventKinds.ENTRY_DELETE){ + } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) { // do nothing... there's no way to communicate deletions } } @@ -130,70 +143,69 @@ public void run() { } } watchKey.reset(); - } catch (Exception e) { + } catch (Exception e) { LOG.error(e.toString()); // ignore - } + } } try { - watchService.close(); - } catch (IOException e) { - LOG.debug("Exception while closing watchService", e); - } - } + watchService.close(); + } catch (IOException e) { + LOG.debug("Exception while closing watchService", e); + } + } - @Override - public void addWatchFile(File fileToWatch) { - if(!isValidFileToMonitor(fileToWatch, Arrays.asList("*"))) return; - try { - if(!fileToWatch.exists()) return; - Path pathToWatch = fileToWatch.toPath().toAbsolutePath(); - individualWatchedFiles.add(pathToWatch); + @Override + public void addWatchFile(File fileToWatch) { + if (!isValidFileToMonitor(fileToWatch, Arrays.asList("*"))) return; + try { + if (!fileToWatch.exists()) return; + Path pathToWatch = fileToWatch.toPath().toAbsolutePath(); + individualWatchedFiles.add(pathToWatch); WatchablePath watchPath = new WatchablePath(pathToWatch); - Kind[] events = new Kind[] { StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY }; - watchPath.register(watchService, events); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + Kind[] events = new Kind[] { StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY }; + watchPath.register(watchService, events); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - @Override - public void addWatchDirectory(File dir, final List fileExtensions) { - Path dirPath = dir.toPath(); - addWatchDirectory(dirPath, fileExtensions); - } + @Override + public void addWatchDirectory(File dir, final List fileExtensions) { + Path dirPath = dir.toPath(); + addWatchDirectory(dirPath, fileExtensions); + } - private void addWatchDirectory(Path dir, final List fileExtensions) { - if(!isValidDirectoryToMonitor(dir.toFile())){ - return; - } - try { - //add the subdirectories too - Files.walkFileTree(dir, new SimpleFileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException - { - if(!isValidDirectoryToMonitor(dir.toFile())){ - return FileVisitResult.SKIP_SUBTREE; - } + private void addWatchDirectory(Path dir, final List fileExtensions) { + if (!isValidDirectoryToMonitor(dir.toFile())) { + return; + } + try { + //add the subdirectories too + Files.walkFileTree(dir, new SimpleFileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { + if (!isValidDirectoryToMonitor(dir.toFile())) { + return FileVisitResult.SKIP_SUBTREE; + } WatchablePath watchPath = new WatchablePath(dir); - Kind[] events = new Kind[] { StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY }; - WatchKey watchKey = watchPath.register(watchService, events); - final List originalFileExtensions = watchKeyToExtensionsMap.get(watchKey); - if(originalFileExtensions==null){ - watchKeyToExtensionsMap.put(watchKey, fileExtensions); - }else{ - final HashSet newFileExtensions = new HashSet(originalFileExtensions); - newFileExtensions.addAll(fileExtensions); - watchKeyToExtensionsMap.put(watchKey, Collections.unmodifiableList(new ArrayList(newFileExtensions))); - } - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + Kind[] events = new Kind[]{StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY}; + WatchKey watchKey = watchPath.register(watchService, events); + final List originalFileExtensions = watchKeyToExtensionsMap.get(watchKey); + if (originalFileExtensions == null) { + watchKeyToExtensionsMap.put(watchKey, fileExtensions); + } else { + final HashSet newFileExtensions = new HashSet<>(originalFileExtensions); + newFileExtensions.addAll(fileExtensions); + watchKeyToExtensionsMap.put(watchKey, Collections.unmodifiableList(new ArrayList(newFileExtensions))); + } + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/watch/PollingDirectoryWatcher.java b/grails-bootstrap/src/main/groovy/org/grails/io/watch/PollingDirectoryWatcher.java index 94090900f8c..a583673b988 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/watch/PollingDirectoryWatcher.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/watch/PollingDirectoryWatcher.java @@ -38,14 +38,14 @@ */ class PollingDirectoryWatcher extends AbstractDirectoryWatcher { - private Collection extensions = new ConcurrentLinkedQueue(); + private Collection extensions = new ConcurrentLinkedQueue<>(); - private Map lastModifiedMap = new ConcurrentHashMap(); - private Map> directoryToExtensionsMap = new ConcurrentHashMap>(); - private Map directoryWatch = new ConcurrentHashMap(); + private Map lastModifiedMap = new ConcurrentHashMap<>(); + private Map> directoryToExtensionsMap = new ConcurrentHashMap<>(); + private Map directoryWatch = new ConcurrentHashMap<>(); - @Override - public void run() { + @Override + public void run() { int count = 0; while (active) { Set files = lastModifiedMap.keySet(); @@ -68,26 +68,26 @@ public void run() { // ignore } } - } + } - @Override - public void addWatchFile(File fileToWatch) { + @Override + public void addWatchFile(File fileToWatch) { lastModifiedMap.put(fileToWatch, fileToWatch.lastModified()); - } + } - @Override - public void addWatchDirectory(File dir, List fileExtensions) { - if(!isValidDirectoryToMonitor(dir)){ - return; - } + @Override + public void addWatchDirectory(File dir, List fileExtensions) { + if (!isValidDirectoryToMonitor(dir)) { + return; + } trackDirectoryExtensions(dir, fileExtensions); cacheFilesForDirectory(dir, fileExtensions, false); - } + } private void trackDirectoryExtensions(File dir, List fileExtensions) { Collection existingExtensions = directoryToExtensionsMap.get(dir); - if(existingExtensions == null) { - directoryToExtensionsMap.put(dir, new ArrayList(fileExtensions)); + if (existingExtensions == null) { + directoryToExtensionsMap.put(dir, new ArrayList<>(fileExtensions)); } else { existingExtensions.addAll(fileExtensions); @@ -100,7 +100,7 @@ private void checkForNewFiles() { if (currentTimestamp < directory.lastModified()) { Collection extensions = directoryToExtensionsMap.get(directory); - if(extensions == null) { + if (extensions == null) { extensions = this.extensions; } cacheFilesForDirectory(directory, extensions, true); @@ -118,9 +118,9 @@ private void cacheFilesForDirectory(File directory, Collection fileExten } for (File file : files) { - if(isValidDirectoryToMonitor(file)) { + if (isValidDirectoryToMonitor(file)) { cacheFilesForDirectory(file, fileExtensions, fireEvent); - } + } else if (isValidFileToMonitor(file, fileExtensions)) { if (!lastModifiedMap.containsKey(file) && fireEvent) { fireOnNew(file); diff --git a/grails-bootstrap/src/main/groovy/org/grails/io/watch/WatchServiceDirectoryWatcher.java b/grails-bootstrap/src/main/groovy/org/grails/io/watch/WatchServiceDirectoryWatcher.java index 60dc0bb8b99..dfb7e3ef39c 100644 --- a/grails-bootstrap/src/main/groovy/org/grails/io/watch/WatchServiceDirectoryWatcher.java +++ b/grails-bootstrap/src/main/groovy/org/grails/io/watch/WatchServiceDirectoryWatcher.java @@ -31,8 +31,8 @@ import java.nio.file.WatchKey; import java.nio.file.WatchService; import java.nio.file.attribute.BasicFileAttributes; -import java.util.Arrays; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.HashSet; import java.util.List; @@ -54,153 +54,152 @@ */ class WatchServiceDirectoryWatcher extends AbstractDirectoryWatcher { - private static final Logger LOG = LoggerFactory.getLogger(WatchServiceDirectoryWatcher.class); - private Map> watchKeyToExtensionsMap = new ConcurrentHashMap>(); - private Set individualWatchedFiles = new HashSet(); + private static final Logger LOG = LoggerFactory.getLogger(WatchServiceDirectoryWatcher.class); + private Map> watchKeyToExtensionsMap = new ConcurrentHashMap<>(); + private Set individualWatchedFiles = new HashSet<>(); - private final WatchService watchService; + private final WatchService watchService; @SuppressWarnings("unchecked") private static WatchEvent cast(WatchEvent event) { - return (WatchEvent)event; + return (WatchEvent) event; } - public WatchServiceDirectoryWatcher(){ - try { - watchService = FileSystems.getDefault().newWatchService(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + public WatchServiceDirectoryWatcher() { + try { + watchService = FileSystems.getDefault().newWatchService(); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - @Override - public void run() { + @Override + public void run() { while (active) { - try { - WatchKey watchKey = watchService.poll(sleepTime, TimeUnit.MILLISECONDS); - if(watchKey!=null){ - List> watchEvents = watchKey.pollEvents(); - for(WatchEvent watchEvent : watchEvents){ - WatchEvent.Kind kind = watchEvent.kind(); - if (kind == StandardWatchEventKinds.OVERFLOW) { - // TODO how is this supposed to be handled? I think the best thing to do is ignore it, but I'm not positive - LOG.warn("WatchService Overflow occurred"); - continue; - } - WatchEvent pathWatchEvent = cast(watchEvent); - Path name = pathWatchEvent.context(); - Path dir = (Path) watchKey.watchable(); - Path child = dir.resolve(name).toAbsolutePath(); - File childFile = child.toFile(); - if(individualWatchedFiles.contains(child) || individualWatchedFiles.contains(child.normalize())){ - if(kind == StandardWatchEventKinds.ENTRY_CREATE){ - fireOnNew(childFile); - }else if(kind == StandardWatchEventKinds.ENTRY_MODIFY){ - fireOnChange(childFile); - }else if(kind == StandardWatchEventKinds.ENTRY_DELETE){ - // do nothing... there's no way to communicate deletions - } - }else{ - List fileExtensions = watchKeyToExtensionsMap.get(watchKey); - if(fileExtensions==null){ - // this event didn't match a file in individualWatchedFiles so it's a not an individual file we're interested in - // this event also didn't match a directory that we're interested in (if it did, fileExtentions wouldn't be null) - // so it must be event for a file we're not interested in. An example of how this can happen is: - // there's a directory with files in it like this: - // /images/a.png - // /images/b.png - // by using the addWatchFile method, /images/a.png is watched. - // Now, /images/b.png is changed. Because java.nio.file.WatchService watches directories, it gets a WatchEvent - // for /images/b.png. But we aren't interested in that. - LOG.debug("WatchService received an event for a file/directory that it's not interested in."); - }else{ - if(kind==StandardWatchEventKinds.ENTRY_CREATE){ - // new directory created, so watch its contents - addWatchDirectory(child,fileExtensions); - if(childFile.isDirectory() && childFile.exists()) { - final File[] files = childFile.listFiles(); - if(files != null) { - for (File newFile : files) { - if(isValidFileToMonitor(newFile, fileExtensions)) { - fireOnNew(newFile); - } - } - } - } - } - if(isValidFileToMonitor(childFile,fileExtensions)){ - if(kind == StandardWatchEventKinds.ENTRY_CREATE){ - fireOnNew(childFile); - }else if(kind == StandardWatchEventKinds.ENTRY_MODIFY){ - fireOnChange(childFile); - }else if(kind == StandardWatchEventKinds.ENTRY_DELETE){ - // do nothing... there's no way to communicate deletions - } - } - } - } - } - watchKey.reset(); - } - } catch (InterruptedException e) { - // ignore - } + try { + WatchKey watchKey = watchService.poll(sleepTime, TimeUnit.MILLISECONDS); + if (watchKey != null) { + List> watchEvents = watchKey.pollEvents(); + for (WatchEvent watchEvent : watchEvents) { + WatchEvent.Kind kind = watchEvent.kind(); + if (kind == StandardWatchEventKinds.OVERFLOW) { + // TODO how is this supposed to be handled? I think the best thing to do is ignore it, but I'm not positive + LOG.warn("WatchService Overflow occurred"); + continue; + } + WatchEvent pathWatchEvent = cast(watchEvent); + Path name = pathWatchEvent.context(); + Path dir = (Path) watchKey.watchable(); + Path child = dir.resolve(name).toAbsolutePath(); + File childFile = child.toFile(); + if (individualWatchedFiles.contains(child) || individualWatchedFiles.contains(child.normalize())) { + if (kind == StandardWatchEventKinds.ENTRY_CREATE) { + fireOnNew(childFile); + } else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) { + fireOnChange(childFile); + } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) { + // do nothing... there's no way to communicate deletions + } + } else { + List fileExtensions = watchKeyToExtensionsMap.get(watchKey); + if (fileExtensions == null) { + // this event didn't match a file in individualWatchedFiles so it's a not an individual file we're interested in + // this event also didn't match a directory that we're interested in (if it did, fileExtentions wouldn't be null) + // so it must be event for a file we're not interested in. An example of how this can happen is: + // there's a directory with files in it like this: + // /images/a.png + // /images/b.png + // by using the addWatchFile method, /images/a.png is watched. + // Now, /images/b.png is changed. Because java.nio.file.WatchService watches directories, it gets a WatchEvent + // for /images/b.png. But we aren't interested in that. + LOG.debug("WatchService received an event for a file/directory that it's not interested in."); + } else { + if (kind == StandardWatchEventKinds.ENTRY_CREATE) { + // new directory created, so watch its contents + addWatchDirectory(child, fileExtensions); + if (childFile.isDirectory() && childFile.exists()) { + final File[] files = childFile.listFiles(); + if (files != null) { + for (File newFile : files) { + if (isValidFileToMonitor(newFile, fileExtensions)) { + fireOnNew(newFile); + } + } + } + } + } + if (isValidFileToMonitor(childFile, fileExtensions)) { + if (kind == StandardWatchEventKinds.ENTRY_CREATE) { + fireOnNew(childFile); + } else if (kind == StandardWatchEventKinds.ENTRY_MODIFY) { + fireOnChange(childFile); + } else if (kind == StandardWatchEventKinds.ENTRY_DELETE) { + // do nothing... there's no way to communicate deletions + } + } + } + } + } + watchKey.reset(); + } + } catch (InterruptedException e) { + // ignore + } } try { - watchService.close(); - } catch (IOException e) { - LOG.debug("Exception while closing watchService", e); - } - } + watchService.close(); + } catch (IOException e) { + LOG.debug("Exception while closing watchService", e); + } + } - @Override - public void addWatchFile(File fileToWatch) { - if(!isValidFileToMonitor(fileToWatch, Arrays.asList("*"))) return; - try { - if(!fileToWatch.exists()) return; - Path pathToWatch = fileToWatch.toPath().toAbsolutePath(); - individualWatchedFiles.add(pathToWatch); - pathToWatch.getParent().register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + @Override + public void addWatchFile(File fileToWatch) { + if (!isValidFileToMonitor(fileToWatch, Arrays.asList("*"))) return; + try { + if (!fileToWatch.exists()) return; + Path pathToWatch = fileToWatch.toPath().toAbsolutePath(); + individualWatchedFiles.add(pathToWatch); + pathToWatch.getParent().register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); + } catch (IOException e) { + throw new RuntimeException(e); + } + } - @Override - public void addWatchDirectory(File dir, final List fileExtensions) { - Path dirPath = dir.toPath(); - addWatchDirectory(dirPath, fileExtensions); - } + @Override + public void addWatchDirectory(File dir, final List fileExtensions) { + Path dirPath = dir.toPath(); + addWatchDirectory(dirPath, fileExtensions); + } - private void addWatchDirectory(Path dir, final List fileExtensions) { - if(!isValidDirectoryToMonitor(dir.toFile())){ - return; - } - try { - //add the subdirectories too - Files.walkFileTree(dir, new SimpleFileVisitor() { - @Override - public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) - throws IOException - { - if(!isValidDirectoryToMonitor(dir.toFile())){ - return FileVisitResult.SKIP_SUBTREE; - } - WatchKey watchKey = dir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); - final List originalFileExtensions = watchKeyToExtensionsMap.get(watchKey); - if(originalFileExtensions==null){ - watchKeyToExtensionsMap.put(watchKey, fileExtensions); - }else{ - final HashSet newFileExtensions = new HashSet(originalFileExtensions); - newFileExtensions.addAll(fileExtensions); - watchKeyToExtensionsMap.put(watchKey, Collections.unmodifiableList(new ArrayList(newFileExtensions))); - } - return FileVisitResult.CONTINUE; - } - }); - } catch (IOException e) { - throw new RuntimeException(e); - } - } + private void addWatchDirectory(Path dir, final List fileExtensions) { + if (!isValidDirectoryToMonitor(dir.toFile())) { + return; + } + try { + //add the subdirectories too + Files.walkFileTree(dir, new SimpleFileVisitor<>() { + @Override + public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) + throws IOException { + if (!isValidDirectoryToMonitor(dir.toFile())) { + return FileVisitResult.SKIP_SUBTREE; + } + WatchKey watchKey = dir.register(watchService, StandardWatchEventKinds.ENTRY_CREATE, StandardWatchEventKinds.ENTRY_DELETE, StandardWatchEventKinds.ENTRY_MODIFY); + final List originalFileExtensions = watchKeyToExtensionsMap.get(watchKey); + if (originalFileExtensions == null) { + watchKeyToExtensionsMap.put(watchKey, fileExtensions); + } else { + final HashSet newFileExtensions = new HashSet<>(originalFileExtensions); + newFileExtensions.addAll(fileExtensions); + watchKeyToExtensionsMap.put(watchKey, Collections.unmodifiableList(new ArrayList(newFileExtensions))); + } + return FileVisitResult.CONTINUE; + } + }); + } catch (IOException e) { + throw new RuntimeException(e); + } + } } diff --git a/grails-cache/grails-app/taglib/grails/plugin/cache/CacheTagLib.groovy b/grails-cache/grails-app/taglib/grails/plugin/cache/CacheTagLib.groovy index 6d57ea3b3d4..81b4faddea6 100644 --- a/grails-cache/grails-app/taglib/grails/plugin/cache/CacheTagLib.groovy +++ b/grails-cache/grails-app/taglib/grails/plugin/cache/CacheTagLib.groovy @@ -18,174 +18,175 @@ */ package grails.plugin.cache -import grails.plugin.cache.util.ClassUtils import groovy.transform.Memoized import groovy.util.logging.Slf4j + +import org.springframework.web.context.request.RequestContextHolder + +import grails.plugin.cache.util.ClassUtils import org.grails.buffer.StreamCharBuffer import org.grails.gsp.GroovyPageTemplate import org.grails.plugin.cache.GrailsCacheManager import org.grails.web.gsp.GroovyPagesTemplateRenderer import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.web.context.request.RequestContextHolder @Slf4j class CacheTagLib { - - static namespace = 'cache' - - GrailsCacheManager grailsCacheManager - GroovyPagesTemplateRenderer groovyPagesTemplateRenderer - - /** - * Renders a block of markup and caches the result so the next time the same block - * is rendered, it does not need to be evaluated again. - * - * @attr key An optional cache key allowing the same block to be cached with different content - * @attr cache Cache name ("grailsBlocksCache" is used if not specified) - */ - def block = { attrs, body -> - if (!grailsCacheManager) { - out << body() - return - } - - try { - def cache = grailsCacheManager.getCache(attrs.cache ?: 'grailsBlocksCache') - def bodyClosure = ClassUtils.getPropertyOrFieldValue(body, 'bodyClosure') - def closureClass = bodyClosure.getClass() - def key = closureClass.getName() - def expired = false - - if (attrs.key) { - key += ':' + attrs.key - } - - if (attrs.ttl) { - expired = honorTTL(key, attrs.ttl.toLong()) - } - - def content = cache.get(key) - if (content == null || expired) { - content = cloneIfNecessary(body()) - cache.put(key, content) - } else { - content = content.get() - } - - out << content - } catch (RuntimeException e) { - log.error("Cache block experienced an error, ignoring cache and outputting the body content instead.", e) - out << body() - } - } - - /** - * Renders a GSP template and caches the result so the next time the same template - * is rendered, it does not need to be evaluated again. - * - * @attr template REQUIRED The name of the template to apply - * @attr key An optional cache key allowing the same template to be cached with different content - * @attr contextPath the context path to use (relative to the application context path). Defaults to "" or path to the plugin for a plugin view or template. - * @attr bean The bean to apply the template against - * @attr model The model to apply the template against as a java.util.Map - * @attr collection A collection of model objects to apply the template to - * @attr var The variable name of the bean to be referenced in the template - * @attr plugin The plugin to look for the template in - * @attr cache Cache name ("grailsTemplatesCache" is used if not specified) - */ - def render = { attrs -> - if (!grailsCacheManager) { - out << g.render(attrs) - return - } - - try { - //Make this empty string to save error later in grails gsp core - attrs.plugin = attrs.plugin ?: '' - - def cache = grailsCacheManager.getCache(attrs.cache ?: 'grailsTemplatesCache') - def key = calculateFullKey(attrs.template, attrs.contextPath, attrs.plugin) - def expired = false - - if (attrs.key) { - key += ':' + attrs.key - } - - if (attrs.ttl) { - expired = honorTTL(key, attrs.ttl.toLong()) - } - - def content = cache.get(key) - if (content == null || expired) { - content = cloneIfNecessary(g.render(attrs)) - cache.put(key, content) - } else { - content = content.get() - } - out << content - } catch (RuntimeException e) { - log.error("Cache render experienced an error, ignoring cache and outputting the template un-cached.", e) - out << cloneIfNecessary(g.render(attrs)) - } - } - - @Memoized(maxCacheSize = 100) - protected String calculateFullKey(String templateName, String contextPath, String pluginName) { - GrailsWebRequest webRequest = RequestContextHolder.currentRequestAttributes() - String uri = webRequest.attributes.getTemplateUri(templateName, webRequest.request) - def artefact = grailsApplication.getArtefactByLogicalPropertyName("Controller", controllerName) - def controller = grailsApplication.mainContext.getBean(artefact?.clazz?.name) - - GroovyPageTemplate t = groovyPagesTemplateRenderer.findAndCacheTemplate( - controller, webRequest, pageScope, templateName, contextPath, pluginName, uri) - if (!t) { - throwTagError("Template not found for name [$templateName] and path [$uri]") - } - - return t.metaInfo.pageClass.name - } - - protected static cloneIfNecessary(content) { - if (content instanceof StreamCharBuffer) { - if (content instanceof Cloneable) { - content = content.clone() - } else { - // pre Grails 2.3 - content = content.toString() - } - } - content - } - - /** - * updates the ttl and returns whether the content is expired - * @param key - * @param ttl in seconds comes form the view - * @return boolean whether we wrote the a new ttl in or not - */ - protected Boolean honorTTL(String key, Long ttl) { - def cache = grailsCacheManager.getCache("TagLibTTLCache") - String ttlKey = key + ":ttl" - Long ttlInMilliseconds = ttl * 1000 - Long currentTime = System.currentTimeMillis() - Boolean expired - def valueInCache - Long cacheInsertionTime - - try { - valueInCache = cache.get(ttlKey) - cacheInsertionTime = valueInCache ? valueInCache.get().toLong() : 0 - expired = valueInCache && ((currentTime - cacheInsertionTime) > ttlInMilliseconds) - } catch (Exception e) { - cache.put(ttlKey, currentTime) - return true // we overwrote the cache key - } - - if (expired || !valueInCache) { - cache.put(ttlKey, currentTime) - } - - return expired - } + static namespace = 'cache' + + GrailsCacheManager grailsCacheManager + GroovyPagesTemplateRenderer groovyPagesTemplateRenderer + + /** + * Renders a block of markup and caches the result so the next time the same block + * is rendered, it does not need to be evaluated again. + * + * @attr key An optional cache key allowing the same block to be cached with different content + * @attr cache Cache name ("grailsBlocksCache" is used if not specified) + */ + def block = { attrs, body -> + if (!grailsCacheManager) { + out << body() + return + } + + try { + def cache = grailsCacheManager.getCache(attrs.cache ?: 'grailsBlocksCache') + def bodyClosure = ClassUtils.getPropertyOrFieldValue(body, 'bodyClosure') + def closureClass = bodyClosure.getClass() + def key = closureClass.getName() + def expired = false + + if (attrs.key) { + key += ':' + attrs.key + } + + if (attrs.ttl) { + expired = honorTTL(key, attrs.ttl.toLong()) + } + + def content = cache.get(key) + if (content == null || expired) { + content = cloneIfNecessary(body()) + cache.put(key, content) + } else { + content = content.get() + } + + out << content + } catch (RuntimeException e) { + log.error('Cache block experienced an error, ignoring cache and outputting the body content instead.', e) + out << body() + } + } + + /** + * Renders a GSP template and caches the result so the next time the same template + * is rendered, it does not need to be evaluated again. + * + * @attr template REQUIRED The name of the template to apply + * @attr key An optional cache key allowing the same template to be cached with different content + * @attr contextPath the context path to use (relative to the application context path). Defaults to "" or path to the plugin for a plugin view or template. + * @attr bean The bean to apply the template against + * @attr model The model to apply the template against as a java.util.Map + * @attr collection A collection of model objects to apply the template to + * @attr var The variable name of the bean to be referenced in the template + * @attr plugin The plugin to look for the template in + * @attr cache Cache name ("grailsTemplatesCache" is used if not specified) + */ + def render = { attrs -> + if (!grailsCacheManager) { + out << g.render(attrs) + return + } + + try { + //Make this empty string to save error later in grails gsp core + attrs.plugin = attrs.plugin ?: '' + + def cache = grailsCacheManager.getCache(attrs.cache ?: 'grailsTemplatesCache') + def key = calculateFullKey(attrs.template, attrs.contextPath, attrs.plugin) + def expired = false + + if (attrs.key) { + key += ':' + attrs.key + } + + if (attrs.ttl) { + expired = honorTTL(key, attrs.ttl.toLong()) + } + + def content = cache.get(key) + if (content == null || expired) { + content = cloneIfNecessary(g.render(attrs)) + cache.put(key, content) + } else { + content = content.get() + } + out << content + } catch (RuntimeException e) { + log.error('Cache render experienced an error, ignoring cache and outputting the template un-cached.', e) + out << cloneIfNecessary(g.render(attrs)) + } + } + + @Memoized(maxCacheSize = 100) + protected String calculateFullKey(String templateName, String contextPath, String pluginName) { + GrailsWebRequest webRequest = RequestContextHolder.currentRequestAttributes() + String uri = webRequest.attributes.getTemplateUri(templateName, webRequest.request) + def artefact = grailsApplication.getArtefactByLogicalPropertyName('Controller', controllerName) + def controller = grailsApplication.mainContext.getBean(artefact?.clazz?.name) + + GroovyPageTemplate t = groovyPagesTemplateRenderer.findAndCacheTemplate( + controller, webRequest, pageScope, templateName, contextPath, pluginName, uri) + if (!t) { + throwTagError("Template not found for name [$templateName] and path [$uri]") + } + + return t.metaInfo.pageClass.name + } + + protected static cloneIfNecessary(content) { + if (content instanceof StreamCharBuffer) { + if (content instanceof Cloneable) { + content = content.clone() + } else { + // pre Grails 2.3 + content = content.toString() + } + } + content + } + + /** + * updates the ttl and returns whether the content is expired + * @param key + * @param ttl in seconds comes form the view + * @return boolean whether we wrote the a new ttl in or not + */ + protected Boolean honorTTL(String key, Long ttl) { + def cache = grailsCacheManager.getCache('TagLibTTLCache') + String ttlKey = key + ':ttl' + Long ttlInMilliseconds = ttl * 1000 + Long currentTime = System.currentTimeMillis() + Boolean expired + def valueInCache + Long cacheInsertionTime + + try { + valueInCache = cache.get(ttlKey) + cacheInsertionTime = valueInCache ? valueInCache.get().toLong() : 0 + expired = valueInCache && ((currentTime - cacheInsertionTime) > ttlInMilliseconds) + } catch (Exception e) { + cache.put(ttlKey, currentTime) + return true // we overwrote the cache key + } + + if (expired || !valueInCache) { + cache.put(ttlKey, currentTime) + } + + return expired + } } diff --git a/grails-cache/src/ast/groovy/grails/plugin/cache/CacheEvict.java b/grails-cache/src/ast/groovy/grails/plugin/cache/CacheEvict.java index 4d289f41fe5..06ec6c641cc 100644 --- a/grails-cache/src/ast/groovy/grails/plugin/cache/CacheEvict.java +++ b/grails-cache/src/ast/groovy/grails/plugin/cache/CacheEvict.java @@ -18,9 +18,14 @@ */ package grails.plugin.cache; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; -import java.lang.annotation.*; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; /** * Indicates that a method (or all methods on a class) trigger(s) @@ -36,30 +41,30 @@ @GroovyASTTransformationClass("org.grails.plugin.cache.compiler.CacheEvictTransformation") public @interface CacheEvict { - /** - * Qualifier value for the specified cached operation. - *

May be used to determine the target cache (or caches), matching the qualifier - * value. - */ - String[] value(); + /** + * Qualifier value for the specified cached operation. + *

May be used to determine the target cache (or caches), matching the qualifier + * value. + */ + String[] value(); - /** - * A closure for computing the key dynamically. - *

Default is null, meaning all method parameters are considered as a key. - */ - Class[] key() default {}; + /** + * A closure for computing the key dynamically. + *

Default is null, meaning all method parameters are considered as a key. + */ + Class[] key() default {}; - /** - * A closure used for conditioning the method caching. - *

Default is null, meaning the method is always cached. - */ - Class[] condition() default {}; + /** + * A closure used for conditioning the method caching. + *

Default is null, meaning the method is always cached. + */ + Class[] condition() default {}; - /** - * Whether or not all the entries inside the cache(s) are removed or not. By - * default, only the value under the associated key is removed. - *

Note that specifying setting this parameter to true and specifying a - * CacheKey is not allowed. - */ - boolean allEntries() default false; + /** + * Whether or not all the entries inside the cache(s) are removed or not. By + * default, only the value under the associated key is removed. + *

Note that specifying setting this parameter to true and specifying a + * CacheKey is not allowed. + */ + boolean allEntries() default false; } diff --git a/grails-cache/src/ast/groovy/grails/plugin/cache/CachePut.java b/grails-cache/src/ast/groovy/grails/plugin/cache/CachePut.java index 4be40c52739..7e4d4bc1b4d 100644 --- a/grails-cache/src/ast/groovy/grails/plugin/cache/CachePut.java +++ b/grails-cache/src/ast/groovy/grails/plugin/cache/CachePut.java @@ -18,9 +18,14 @@ */ package grails.plugin.cache; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; -import java.lang.annotation.*; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; /** * Indicates that a method (or all methods on a class) trigger(s) @@ -38,16 +43,16 @@ @GroovyASTTransformationClass("org.grails.plugin.cache.compiler.CachePutTransformation") public @interface CachePut { - /** - * Name of the caches in which the update takes place. - *

May be used to determine the target cache (or caches), matching the - * qualifier value. - */ - String[] value(); + /** + * Name of the caches in which the update takes place. + *

May be used to determine the target cache (or caches), matching the + * qualifier value. + */ + String[] value(); - /** - * A closure for computing the key dynamically. - *

Default is null, meaning all method parameters are considered as a key. - */ - Class[] key() default {}; + /** + * A closure for computing the key dynamically. + *

Default is null, meaning all method parameters are considered as a key. + */ + Class[] key() default {}; } diff --git a/grails-cache/src/ast/groovy/grails/plugin/cache/CustomCacheKeyGenerator.groovy b/grails-cache/src/ast/groovy/grails/plugin/cache/CustomCacheKeyGenerator.groovy index e67226f8b35..5d5e190326e 100644 --- a/grails-cache/src/ast/groovy/grails/plugin/cache/CustomCacheKeyGenerator.groovy +++ b/grails-cache/src/ast/groovy/grails/plugin/cache/CustomCacheKeyGenerator.groovy @@ -18,175 +18,173 @@ */ package grails.plugin.cache +import java.lang.reflect.Method + import groovy.transform.CompileStatic + import org.springframework.aop.framework.AopProxyUtils import org.springframework.cache.interceptor.KeyGenerator import org.springframework.cache.interceptor.SimpleKeyGenerator -import java.lang.reflect.Method - /** * Includes the hashcode, method signature, and class name of the target (caller) in the cache key */ @CompileStatic class CustomCacheKeyGenerator implements KeyGenerator, GrailsCacheKeyGenerator { - - private final KeyGenerator innerKeyGenerator - - CustomCacheKeyGenerator(KeyGenerator innerKeyGenerator){ - this.innerKeyGenerator = innerKeyGenerator - } - - CustomCacheKeyGenerator(){ - this.innerKeyGenerator = new SimpleKeyGenerator() - } - - @SuppressWarnings("serial") - private static final class CacheKey implements Serializable { - final String targetClassName - final String targetMethodName - final int targetObjectHashCode - final Object simpleKey - - CacheKey(String targetClassName, String targetMethodName, - int targetObjectHashCode, Object simpleKey) { - this.targetClassName = targetClassName - this.targetMethodName = targetMethodName - this.targetObjectHashCode = targetObjectHashCode - this.simpleKey = simpleKey - } - @Override - int hashCode() { - final int prime = 31 - int result = 1 - result = prime * result - + ((simpleKey == null) ? 0 : simpleKey.hashCode()) - result = prime * result - + ((targetClassName == null) ? 0 : targetClassName - .hashCode()) - result = prime * result - + ((targetMethodName == null) ? 0 : targetMethodName - .hashCode()) - result = prime * result + targetObjectHashCode - return result - } - @Override - boolean equals(Object obj) { - if (this.is(obj)) - return true - if (obj == null) - return false - if (getClass() != obj.getClass()) - return false - CacheKey other = (CacheKey) obj - if (simpleKey == null) { - if (other.simpleKey != null) - return false - } else if (!simpleKey.equals(other.simpleKey)) - return false - else if ( simpleKey.equals(other.simpleKey) && !(simpleKey instanceof Map && ((Map)simpleKey).size() == 0 ) ) { - return true // equal if simpleKey is identical but not an empty map - } - - if (targetClassName == null) { - if (other.targetClassName != null) - return false - } else if (!targetClassName.equals(other.targetClassName)) - return false - if (targetMethodName == null) { - if (other.targetMethodName != null) - return false - } else if (!targetMethodName.equals(other.targetMethodName)) - return false - if (targetObjectHashCode != other.targetObjectHashCode) - return false - return true - } - } - - Object generate(Object target, Method method, Object... params) { - Class objClass = AopProxyUtils.ultimateTargetClass(target) - - return new CacheKey( - objClass.getName().intern(), - method.toString().intern(), - target.hashCode(), innerKeyGenerator.generate(target, method, params)) - } - - @Override - Serializable generate(String className, String methodName, int objHashCode, Closure keyGenerator) { - final Object simpleKey = keyGenerator.call() - return new TemporaryGrailsCacheKey(className, methodName, objHashCode, simpleKey) - } - - @Override - Serializable generate(String className, String methodName, int objHashCode, Map methodParams) { - final Object simpleKey = methodParams - return new TemporaryGrailsCacheKey(className, methodName, objHashCode, simpleKey) - } - - - @CompileStatic - private static class TemporaryGrailsCacheKey implements Serializable { - final String targetClassName - final String targetMethodName - final int targetObjectHashCode - final Object simpleKey - - TemporaryGrailsCacheKey(String targetClassName, String targetMethodName, - int targetObjectHashCode, Object simpleKey) { - this.targetClassName = targetClassName - this.targetMethodName = targetMethodName - this.targetObjectHashCode = targetObjectHashCode - this.simpleKey = simpleKey - } - @Override - int hashCode() { - final int prime = 31 - int result = 1 - result = prime * result - + ((simpleKey == null) ? 0 : simpleKey.hashCode()) - result = prime * result - + ((targetClassName == null) ? 0 : targetClassName - .hashCode()) - result = prime * result - + ((targetMethodName == null) ? 0 : targetMethodName - .hashCode()) - result = prime * result + targetObjectHashCode - return result - } - @Override - boolean equals(Object obj) { - if (this.is(obj)) - return true - if (obj == null) - return false - if (getClass() != obj.getClass()) - return false - TemporaryGrailsCacheKey other = (TemporaryGrailsCacheKey) obj - if (simpleKey == null) { - if (other.simpleKey != null) - return false - } else if (!simpleKey.equals(other.simpleKey)) - return false - else if ( simpleKey.equals(other.simpleKey) && !(simpleKey instanceof Map && ((Map)simpleKey).size() == 0 ) ) { - return true // equal if simpleKey is identical but not an empty map - } - - if (targetClassName == null) { - if (other.targetClassName != null) - return false - } else if (!targetClassName.equals(other.targetClassName)) - return false - if (targetMethodName == null) { - if (other.targetMethodName != null) - return false - } else if (!targetMethodName.equals(other.targetMethodName)) - return false - if (targetObjectHashCode != other.targetObjectHashCode) - return false - return true - } - } + + private final KeyGenerator innerKeyGenerator + + CustomCacheKeyGenerator(KeyGenerator innerKeyGenerator) { + this.innerKeyGenerator = innerKeyGenerator + } + + CustomCacheKeyGenerator() { + this.innerKeyGenerator = new SimpleKeyGenerator() + } + + @SuppressWarnings('serial') + private static final class CacheKey implements Serializable { + final String targetClassName + final String targetMethodName + final int targetObjectHashCode + final Object simpleKey + + CacheKey(String targetClassName, String targetMethodName, + int targetObjectHashCode, Object simpleKey) { + this.targetClassName = targetClassName + this.targetMethodName = targetMethodName + this.targetObjectHashCode = targetObjectHashCode + this.simpleKey = simpleKey + } + @Override + int hashCode() { + final int prime = 31 + int result = 1 + result = prime * result + + ((simpleKey == null) ? 0 : simpleKey.hashCode()) + result = prime * result + + ((targetClassName == null) ? 0 : targetClassName.hashCode()) + result = prime * result + + ((targetMethodName == null) ? 0 : targetMethodName.hashCode()) + result = prime * result + targetObjectHashCode + return result + } + @Override + boolean equals(Object obj) { + if (this.is(obj)) + return true + if (obj == null) + return false + if (getClass() != obj.getClass()) + return false + CacheKey other = (CacheKey) obj + if (simpleKey == null) { + if (other.simpleKey != null) + return false + } else if (!simpleKey.equals(other.simpleKey)) + return false + else if (simpleKey.equals(other.simpleKey) && !(simpleKey instanceof Map && ((Map) simpleKey).size() == 0)) { + return true // equal if simpleKey is identical but not an empty map + } + + if (targetClassName == null) { + if (other.targetClassName != null) + return false + } else if (!targetClassName.equals(other.targetClassName)) + return false + if (targetMethodName == null) { + if (other.targetMethodName != null) + return false + } else if (!targetMethodName.equals(other.targetMethodName)) + return false + if (targetObjectHashCode != other.targetObjectHashCode) + return false + return true + } + } + + Object generate(Object target, Method method, Object... params) { + Class objClass = AopProxyUtils.ultimateTargetClass(target) + + return new CacheKey( + objClass.getName().intern(), + method.toString().intern(), + target.hashCode(), innerKeyGenerator.generate(target, method, params)) + } + + @Override + Serializable generate(String className, String methodName, int objHashCode, Closure keyGenerator) { + final Object simpleKey = keyGenerator.call() + return new TemporaryGrailsCacheKey(className, methodName, objHashCode, simpleKey) + } + + @Override + Serializable generate(String className, String methodName, int objHashCode, Map methodParams) { + final Object simpleKey = methodParams + return new TemporaryGrailsCacheKey(className, methodName, objHashCode, simpleKey) + } + + @CompileStatic + private static class TemporaryGrailsCacheKey implements Serializable { + final String targetClassName + final String targetMethodName + final int targetObjectHashCode + final Object simpleKey + + TemporaryGrailsCacheKey(String targetClassName, String targetMethodName, + int targetObjectHashCode, Object simpleKey) { + this.targetClassName = targetClassName + this.targetMethodName = targetMethodName + this.targetObjectHashCode = targetObjectHashCode + this.simpleKey = simpleKey + } + @Override + int hashCode() { + final int prime = 31 + int result = 1 + result = prime * result + + ((simpleKey == null) ? 0 : simpleKey.hashCode()) + result = prime * result + + ((targetClassName == null) ? 0 : targetClassName + .hashCode()) + result = prime * result + + ((targetMethodName == null) ? 0 : targetMethodName + .hashCode()) + result = prime * result + targetObjectHashCode + return result + } + @Override + boolean equals(Object obj) { + if (this.is(obj)) + return true + if (obj == null) + return false + if (getClass() != obj.getClass()) + return false + TemporaryGrailsCacheKey other = (TemporaryGrailsCacheKey) obj + if (simpleKey == null) { + if (other.simpleKey != null) + return false + } else if (!simpleKey.equals(other.simpleKey)) + return false + else if (simpleKey.equals(other.simpleKey) && !(simpleKey instanceof Map && ((Map) simpleKey).size() == 0)) { + return true // equal if simpleKey is identical but not an empty map + } + + if (targetClassName == null) { + if (other.targetClassName != null) + return false + } else if (!targetClassName.equals(other.targetClassName)) + return false + if (targetMethodName == null) { + if (other.targetMethodName != null) + return false + } else if (!targetMethodName.equals(other.targetMethodName)) + return false + if (targetObjectHashCode != other.targetObjectHashCode) + return false + return true + } + } } diff --git a/grails-cache/src/ast/groovy/grails/plugin/cache/GrailsCacheKeyGenerator.groovy b/grails-cache/src/ast/groovy/grails/plugin/cache/GrailsCacheKeyGenerator.groovy index e24be111dff..39e32830509 100644 --- a/grails-cache/src/ast/groovy/grails/plugin/cache/GrailsCacheKeyGenerator.groovy +++ b/grails-cache/src/ast/groovy/grails/plugin/cache/GrailsCacheKeyGenerator.groovy @@ -26,6 +26,7 @@ package grails.plugin.cache * @author Graeme Rocher */ interface GrailsCacheKeyGenerator { + /** * * @param className The name of the class diff --git a/grails-cache/src/ast/groovy/org/grails/plugin/cache/GrailsCacheManager.java b/grails-cache/src/ast/groovy/org/grails/plugin/cache/GrailsCacheManager.java index 0b5a4fa0007..0cfd68f5afa 100644 --- a/grails-cache/src/ast/groovy/org/grails/plugin/cache/GrailsCacheManager.java +++ b/grails-cache/src/ast/groovy/org/grails/plugin/cache/GrailsCacheManager.java @@ -25,18 +25,18 @@ */ public interface GrailsCacheManager extends CacheManager { - /** - * Whether the cache for the given name exits - * - * @param name The name of the cache - * @return True if it does - */ - boolean cacheExists(String name); + /** + * Whether the cache for the given name exits + * + * @param name The name of the cache + * @return True if it does + */ + boolean cacheExists(String name); - /** - * Destroys the given named cache - * @param name The name of the cache - * @return True if it was destroyed - */ - boolean destroyCache(String name); + /** + * Destroys the given named cache + * @param name The name of the cache + * @return True if it was destroyed + */ + boolean destroyCache(String name); } diff --git a/grails-cache/src/ast/groovy/org/grails/plugin/cache/GrailsCacheManagerAware.groovy b/grails-cache/src/ast/groovy/org/grails/plugin/cache/GrailsCacheManagerAware.groovy index c476fb5f803..932c5f093f4 100644 --- a/grails-cache/src/ast/groovy/org/grails/plugin/cache/GrailsCacheManagerAware.groovy +++ b/grails-cache/src/ast/groovy/org/grails/plugin/cache/GrailsCacheManagerAware.groovy @@ -19,12 +19,14 @@ package org.grails.plugin.cache -import grails.plugin.cache.CustomCacheKeyGenerator -import grails.plugin.cache.GrailsCacheKeyGenerator import groovy.transform.CompileStatic + import org.springframework.beans.factory.annotation.Autowired import org.springframework.cache.CacheManager +import grails.plugin.cache.CustomCacheKeyGenerator +import grails.plugin.cache.GrailsCacheKeyGenerator + /** * A trait for classes that are cache aware * @@ -53,4 +55,4 @@ trait GrailsCacheManagerAware { GrailsCacheKeyGenerator getCustomCacheKeyGenerator() { return customCacheKeyGenerator } -} \ No newline at end of file +} diff --git a/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/AbstractCacheTransformation.groovy b/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/AbstractCacheTransformation.groovy index 09fd88b450f..a4087dcab04 100644 --- a/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/AbstractCacheTransformation.groovy +++ b/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/AbstractCacheTransformation.groovy @@ -19,27 +19,57 @@ package org.grails.plugin.cache.compiler -import grails.gorm.multitenancy.Tenants -import grails.plugin.cache.GrailsCacheKeyGenerator import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.* -import org.codehaus.groovy.ast.expr.* +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassCodeExpressionTransformer +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.DynamicVariable +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.Parameter +import org.codehaus.groovy.ast.Variable +import org.codehaus.groovy.ast.VariableScope +import org.codehaus.groovy.ast.expr.ArgumentListExpression +import org.codehaus.groovy.ast.expr.ClosureExpression +import org.codehaus.groovy.ast.expr.ConstantExpression +import org.codehaus.groovy.ast.expr.Expression +import org.codehaus.groovy.ast.expr.MapExpression +import org.codehaus.groovy.ast.expr.MethodCallExpression +import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.ExpressionStatement import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.trait.TraitComposer + +import org.springframework.cache.Cache +import org.springframework.cache.CacheManager + +import grails.gorm.multitenancy.Tenants +import grails.plugin.cache.GrailsCacheKeyGenerator import org.grails.datastore.gorm.multitenancy.transform.TenantTransform import org.grails.datastore.gorm.transform.AbstractMethodDecoratingTransformation import org.grails.datastore.gorm.transform.AbstractTraitApplyingGormASTTransformation import org.grails.datastore.mapping.model.config.GormProperties import org.grails.plugin.cache.GrailsCacheManagerAware -import org.springframework.cache.Cache -import org.springframework.cache.CacheManager -import static org.codehaus.groovy.ast.ClassHelper.* -import static org.codehaus.groovy.ast.tools.GeneralUtils.* -import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.* +import static org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE +import static org.codehaus.groovy.ast.ClassHelper.MAP_TYPE +import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE +import static org.codehaus.groovy.ast.ClassHelper.STRING_TYPE +import static org.codehaus.groovy.ast.ClassHelper.int_TYPE +import static org.codehaus.groovy.ast.ClassHelper.make +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.notX +import static org.codehaus.groovy.ast.tools.GeneralUtils.param +import static org.codehaus.groovy.ast.tools.GeneralUtils.params +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callD /** * Abstract implementation for implementers of cache annotations @@ -82,7 +112,7 @@ abstract class AbstractCacheTransformation extends AbstractMethodDecoratingTrans @Override protected void enhanceClassNode(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode) { - if(!classNode.getAllInterfaces().contains(make(GrailsCacheManagerAware))) { + if (!classNode.getAllInterfaces().contains(make(GrailsCacheManagerAware))) { AbstractTraitApplyingGormASTTransformation.weaveTraitWithGenerics(classNode, GrailsCacheManagerAware) if (compilationUnit != null) { TraitComposer.doExtendTraits(classNode, sourceUnit, compilationUnit) @@ -91,7 +121,7 @@ abstract class AbstractCacheTransformation extends AbstractMethodDecoratingTrans } protected VariableExpression declareAndInitializeParameterValueMap(AnnotationNode annotationNode, MethodNode methodToCache, BlockStatement codeBlock) { - if(annotationNode.getMember("key") instanceof ClosureExpression) { + if (annotationNode.getMember('key') instanceof ClosureExpression) { // if a key generator is specified don't do anything return null } @@ -115,10 +145,10 @@ abstract class AbstractCacheTransformation extends AbstractMethodDecoratingTrans codeBlock.addStatement(new ExpressionStatement(mce)) } - if(TenantTransform.hasTenantAnnotation(methodToCache)) { + if (TenantTransform.hasTenantAnnotation(methodToCache)) { ArgumentListExpression putArgs = args( constX(GormProperties.TENANT_IDENTITY), - callD(classX(Tenants), "currentId") + callD(classX(Tenants), 'currentId') ) MethodCallExpression mce = callX(parameterMapVar, 'put', putArgs) mce.methodTarget = mapPutMethod @@ -175,7 +205,6 @@ abstract class AbstractCacheTransformation extends AbstractMethodDecoratingTrans return cacheKeyVariableExpression } - @Override protected Object getAppliedMarker() { return APPLIED_MARKER @@ -227,7 +256,7 @@ abstract class AbstractCacheTransformation extends AbstractMethodDecoratingTrans // return originalMethodCall.call() Statement ifShouldCacheMethodCallStatement = ifS( - notX(callX(conditionMember, "call")), + notX(callX(conditionMember, 'call')), returnS(originalMethodCallExpr) ) newMethodBody.addStatement(ifShouldCacheMethodCallStatement) diff --git a/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CacheEvictTransformation.groovy b/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CacheEvictTransformation.groovy index 98260cffab7..8dd0d6fa427 100644 --- a/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CacheEvictTransformation.groovy +++ b/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CacheEvictTransformation.groovy @@ -18,9 +18,7 @@ */ package org.grails.plugin.cache.compiler -import grails.plugin.cache.CacheEvict import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode @@ -34,6 +32,9 @@ import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.GroovyASTTransformation +import grails.plugin.cache.CacheEvict +import org.apache.grails.common.compiler.GroovyTransformOrder + import static org.codehaus.groovy.ast.ClassHelper.make import static org.codehaus.groovy.ast.tools.GeneralUtils.block import static org.codehaus.groovy.ast.tools.GeneralUtils.callX @@ -72,7 +73,7 @@ class CacheEvictTransformation extends AbstractCacheTransformation { Expression allEntries = annotationNode.getMember('allEntries') if (allEntries instanceof ConstantExpression) { - clearAllEntries = ((ConstantExpression)allEntries).isTrueExpression() + clearAllEntries = ((ConstantExpression) allEntries).isTrueExpression() annotationNode.members.remove('allEntries') } diff --git a/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CachePutTransformation.groovy b/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CachePutTransformation.groovy index 40aa18c3ac9..1cfaa52b5f0 100644 --- a/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CachePutTransformation.groovy +++ b/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CachePutTransformation.groovy @@ -18,9 +18,7 @@ */ package org.grails.plugin.cache.compiler -import grails.plugin.cache.CachePut import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode @@ -32,8 +30,18 @@ import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.GroovyASTTransformation +import grails.plugin.cache.CachePut +import org.apache.grails.common.compiler.GroovyTransformOrder + import static org.codehaus.groovy.ast.ClassHelper.make -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callD /** @@ -54,7 +62,6 @@ class CachePutTransformation extends AbstractCacheTransformation { VariableExpression cacheManagerVariableExpression = varX(GRAILS_CACHE_MANAGER_PROPERTY_NAME) BlockStatement cachingBlock = block() - // Cache $_cache_cacheVariable = this.grailsCacheManager.getCache("..."); VariableExpression cacheDeclaration = declareCache(annotationNode, cacheManagerVariableExpression, cachingBlock) @@ -68,7 +75,7 @@ class CachePutTransformation extends AbstractCacheTransformation { cachingBlock.addStatement( block( declS(originalValueExpr, originalMethodCallExpr), - stmt(callD(cacheDeclaration,"put", args(cacheKeyDeclaration, originalValueExpr))), + stmt(callD(cacheDeclaration, 'put', args(cacheKeyDeclaration, originalValueExpr))), returnS(originalValueExpr) ) ) diff --git a/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CacheableTransformation.groovy b/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CacheableTransformation.groovy index 9f98c7c2a09..2e1ef8ca04f 100644 --- a/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CacheableTransformation.groovy +++ b/grails-cache/src/ast/groovy/org/grails/plugin/cache/compiler/CacheableTransformation.groovy @@ -18,10 +18,8 @@ */ package org.grails.plugin.cache.compiler -import grails.plugin.cache.Cacheable import groovy.transform.CompileStatic import groovy.util.logging.Slf4j -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode @@ -32,11 +30,24 @@ import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.GroovyASTTransformation -import org.grails.core.artefact.ControllerArtefactHandler + import org.springframework.cache.Cache -import static org.codehaus.groovy.ast.ClassHelper.* -import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.* +import grails.plugin.cache.Cacheable +import org.apache.grails.common.compiler.GroovyTransformOrder +import org.grails.core.artefact.ControllerArtefactHandler + +import static org.codehaus.groovy.ast.ClassHelper.make +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifElseS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callD /** * @since 4.0.0 @@ -60,8 +71,8 @@ class CacheableTransformation extends AbstractCacheTransformation { @Override protected Expression buildDelegatingMethodCall(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, MethodCallExpression originalMethodCallExpr, BlockStatement newMethodBody) { boolean isControllerClass = classNode.name.endsWith(ControllerArtefactHandler.TYPE) - if(isControllerClass) { - log.warn("@Cacheable is not supported on controller methods. Ignoring method: ${methodNode.name}") + if (isControllerClass) { + log.warn('@Cacheable is not supported on controller methods. Ignoring method: {}', methodNode.name) return originalMethodCallExpr } @@ -81,11 +92,10 @@ class CacheableTransformation extends AbstractCacheTransformation { // def $_cache_cacheKey = customCacheKeyGenerator.generate(className, methodName, hashCode, $_method_parameter_map) VariableExpression cacheKeyDeclaration = declareCacheKey(sourceUnit, annotationNode, classNode, methodNode , cachingBlock) - // ValueWrapper $_cache_valueWrapper = $_cache_cacheVariable.get($_cache_cacheKey); VariableExpression cacheValueWrapper = varX(CACHE_VALUE_WRAPPER_LOCAL_VARIABLE_NAME, make(Cache.ValueWrapper)) cachingBlock.addStatement( - declS(cacheValueWrapper, callD(cacheDeclaration, "get", cacheKeyDeclaration)) + declS(cacheValueWrapper, callD(cacheDeclaration, 'get', cacheKeyDeclaration)) ) // if($_cache_valueWrapper != null) { @@ -98,10 +108,10 @@ class CacheableTransformation extends AbstractCacheTransformation { VariableExpression originalValueExpr = varX(CACHE_ORIGINAL_METHOD_RETURN_VALUE_LOCAL_VARIABLE_NAME) cachingBlock.addStatement( ifElseS(notNullX(cacheValueWrapper), - returnS( callD(cacheValueWrapper, "get")), + returnS(callD(cacheValueWrapper, 'get')), block( declS(originalValueExpr, originalMethodCallExpr), - stmt(callD(cacheDeclaration,"put", args(cacheKeyDeclaration, originalValueExpr))), + stmt(callD(cacheDeclaration, 'put', args(cacheKeyDeclaration, originalValueExpr))), returnS(originalValueExpr) ) ) diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/CacheException.groovy b/grails-cache/src/main/groovy/grails/plugin/cache/CacheException.groovy index b17b721b55f..c6750021b7e 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/CacheException.groovy +++ b/grails-cache/src/main/groovy/grails/plugin/cache/CacheException.groovy @@ -81,4 +81,4 @@ class CacheException extends RuntimeException { CacheException(Throwable cause) { super(cause) } -} \ No newline at end of file +} diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/CacheGrailsPlugin.groovy b/grails-cache/src/main/groovy/grails/plugin/cache/CacheGrailsPlugin.groovy index 86d57e20291..70bd287ece8 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/CacheGrailsPlugin.groovy +++ b/grails-cache/src/main/groovy/grails/plugin/cache/CacheGrailsPlugin.groovy @@ -19,16 +19,18 @@ package grails.plugin.cache -import grails.plugins.Plugin import groovy.transform.CompileStatic import groovy.util.logging.Slf4j -import org.grails.plugin.cache.GrailsCacheManager + import org.springframework.cache.Cache +import grails.plugins.Plugin +import org.grails.plugin.cache.GrailsCacheManager + @Slf4j class CacheGrailsPlugin extends Plugin { - def grailsVersion = "7.0.0 > *" + def grailsVersion = '7.0.0 > *' def observe = ['controllers', 'services'] def loadAfter = ['controllers', 'services'] def authorEmail = 'brownj@objectcomputing.com' @@ -47,16 +49,15 @@ class CacheGrailsPlugin extends Plugin { Closure doWithSpring() { { -> if (!cachingEnabled) { - log.warn 'Cache plugin is disabled' + log.warn('Cache plugin is disabled') return } customCacheKeyGenerator(CustomCacheKeyGenerator) - Class cacheClazz = GrailsConcurrentMapCacheManager // Selects cache manager from config - if (config.getProperty("grails.cache.cacheManager", String, null) == "GrailsConcurrentLinkedMapCacheManager") { + if (config.getProperty('grails.cache.cacheManager', String, null) == 'GrailsConcurrentLinkedMapCacheManager') { cacheClazz = GrailsConcurrentLinkedMapCacheManager } @@ -76,14 +77,14 @@ class CacheGrailsPlugin extends Plugin { if (pluginConfiguration.clearAtStartup) { for (String cacheName in grailsCacheManager.cacheNames) { - log.info "Clearing cache $cacheName" + log.info('Clearing cache {}', cacheName) Cache cache = grailsCacheManager.getCache(cacheName) cache.clear() } } List defaultCaches = ['grailsBlocksCache', 'grailsTemplatesCache'] - for(name in defaultCaches) { + for (name in defaultCaches) { if (!grailsCacheManager.cacheExists(name)) { grailsCacheManager.getCache(name) } diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/CachePluginConfiguration.groovy b/grails-cache/src/main/groovy/grails/plugin/cache/CachePluginConfiguration.groovy index 87e800d16d3..894ae44867c 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/CachePluginConfiguration.groovy +++ b/grails-cache/src/main/groovy/grails/plugin/cache/CachePluginConfiguration.groovy @@ -20,6 +20,7 @@ package grails.plugin.cache import groovy.transform.CompileStatic + import org.springframework.boot.context.properties.ConfigurationProperties /** diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsCache.java b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsCache.java index da62b521c75..ca2e048b26c 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsCache.java +++ b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsCache.java @@ -28,5 +28,5 @@ */ public interface GrailsCache extends Cache { - Collection getAllKeys(); + Collection getAllKeys(); } diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsCacheAdminService.groovy b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsCacheAdminService.groovy index e0cb95104b2..bb277efa895 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsCacheAdminService.groovy +++ b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsCacheAdminService.groovy @@ -19,25 +19,26 @@ package grails.plugin.cache import groovy.transform.CompileStatic + import org.grails.plugin.cache.GrailsCacheManagerAware @CompileStatic class GrailsCacheAdminService implements GrailsCacheManagerAware { - @CacheEvict(value="grailsBlocksCache", allEntries = true) + @CacheEvict(value='grailsBlocksCache', allEntries = true) void clearBlocksCache() {} - @CacheEvict(value="grailsTemplatesCache", allEntries = true) + @CacheEvict(value='grailsTemplatesCache', allEntries = true) void clearTemplatesCache() {} void clearCache(CharSequence cacheName) { - if(cacheName) { + if (cacheName) { grailsCacheManager.getCache(cacheName.toString())?.clear() } } void clearAllCaches() { - for(CharSequence cacheName in grailsCacheManager.cacheNames) { + for (CharSequence cacheName in grailsCacheManager.cacheNames) { clearCache(cacheName) } } diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentLinkedMapCache.java b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentLinkedMapCache.java index f7530e86f01..efa156ab10c 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentLinkedMapCache.java +++ b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentLinkedMapCache.java @@ -18,89 +18,90 @@ */ package grails.plugin.cache; -import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; -import org.springframework.cache.support.SimpleValueWrapper; - import java.io.Serializable; import java.util.Collection; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentMap; +import com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap; + +import org.springframework.cache.support.SimpleValueWrapper; + /** * @author Jakob Drangmeister */ public class GrailsConcurrentLinkedMapCache implements GrailsCache { - private static final Object NULL_HOLDER = new NullHolder(); - private String name; - private long capacity; - private final ConcurrentLinkedHashMap store; - private final boolean allowNullValues; + private static final Object NULL_HOLDER = new NullHolder(); + private String name; + private long capacity; + private final ConcurrentLinkedHashMap store; + private final boolean allowNullValues; - /** - * Create a new GrailsConcurrentLinkedMapCache with the specified name + /** + * Create a new GrailsConcurrentLinkedMapCache with the specified name * and capacity * @param name the name of the cache * @param capacity of the map * @param allowNullValues null values (default is true) */ - public GrailsConcurrentLinkedMapCache(String name, long capacity, boolean allowNullValues) { - this.name = name; - this.capacity = capacity; - this.allowNullValues = allowNullValues; - // Workaround: using explicit type arguments to prevent groovydoc error (#53) - // Replace with diamond operator once a fix for GROOVY-8628 is included in groovy dependency - this.store = new ConcurrentLinkedHashMap.Builder() - .maximumWeightedCapacity(capacity) - .build(); - } - - /** - * Create a new GrailsConcurrentLinkedMapCache with the specified name + public GrailsConcurrentLinkedMapCache(String name, long capacity, boolean allowNullValues) { + this.name = name; + this.capacity = capacity; + this.allowNullValues = allowNullValues; + // Workaround: using explicit type arguments to prevent groovydoc error (#53) + // Replace with diamond operator once a fix for GROOVY-8628 is included in groovy dependency + this.store = new ConcurrentLinkedHashMap.Builder<>() + .maximumWeightedCapacity(capacity) + .build(); + } + + /** + * Create a new GrailsConcurrentLinkedMapCache with the specified name * and capacity * @param name the name of the cache * @param capacity of the map */ - public GrailsConcurrentLinkedMapCache(String name, long capacity) { - this(name, capacity, true); - } - - public final long getCapacity() { - return this.store.capacity(); - } - - @Override - public final String getName() { - return this.name; - } - - @Override - public final ConcurrentMap getNativeCache() { - return this.store; - } - - public final int getSize() { - return this.store.size(); - } - - public final boolean isAllowNullValues() { - return this.allowNullValues; - } - - @Override - public GrailsValueWrapper get(Object key) { - Object value = getNativeCache().get(key); - return value == null ? null : new GrailsValueWrapper(fromStoreValue(value), null); - } - - @Override - public T get(Object key, Class type) { - Object value = getNativeCache().get(key); - if (value != null && type != null && !type.isInstance(value)) { - throw new IllegalStateException("Cached value is not of required type [" + type.getName() + "]: " + value); - } - return (T) value; - } + public GrailsConcurrentLinkedMapCache(String name, long capacity) { + this(name, capacity, true); + } + + public final long getCapacity() { + return this.store.capacity(); + } + + @Override + public final String getName() { + return this.name; + } + + @Override + public final ConcurrentMap getNativeCache() { + return this.store; + } + + public final int getSize() { + return this.store.size(); + } + + public final boolean isAllowNullValues() { + return this.allowNullValues; + } + + @Override + public GrailsValueWrapper get(Object key) { + Object value = getNativeCache().get(key); + return value == null ? null : new GrailsValueWrapper(fromStoreValue(value), null); + } + + @Override + public T get(Object key, Class type) { + Object value = getNativeCache().get(key); + if (value != null && type != null && !type.isInstance(value)) { + throw new IllegalStateException("Cached value is not of required type [" + type.getName() + "]: " + value); + } + return (T) value; + } @Override public T get(Object key, Callable valueLoader) { @@ -108,66 +109,66 @@ public T get(Object key, Callable valueLoader) { } @SuppressWarnings("unchecked") - public Collection getAllKeys() { - return getNativeCache().keySet(); - } - - public Collection getHottestKeys() { - return this.store.descendingKeySet(); - } - - @Override - public void put(Object key, Object value) { - this.store.put(key, toStoreValue(value)); - } - - public ValueWrapper putIfAbsent(Object key, Object value) { - Object existing = this.store.putIfAbsent(key, value); - return toWrapper(existing); - } - - @Override - public void evict(Object key) { - this.store.remove(key); - } - - @Override - public void clear() { - this.store.clear(); - } - - /** + public Collection getAllKeys() { + return getNativeCache().keySet(); + } + + public Collection getHottestKeys() { + return this.store.descendingKeySet(); + } + + @Override + public void put(Object key, Object value) { + this.store.put(key, toStoreValue(value)); + } + + public ValueWrapper putIfAbsent(Object key, Object value) { + Object existing = this.store.putIfAbsent(key, value); + return toWrapper(existing); + } + + @Override + public void evict(Object key) { + this.store.remove(key); + } + + @Override + public void clear() { + this.store.clear(); + } + + /** * Convert the given value from the internal store to a user value * returned from the get method (adapting {@code null}). * @param storeValue the store value * @return the value to return to the user */ - protected Object fromStoreValue(Object storeValue) { - if (this.allowNullValues && storeValue == NULL_HOLDER) { - return null; - } - return storeValue; - } - - /** + protected Object fromStoreValue(Object storeValue) { + if (this.allowNullValues && storeValue == NULL_HOLDER) { + return null; + } + return storeValue; + } + + /** * Convert the given user value, as passed into the put method, * to a value in the internal store (adapting {@code null}). * @param userValue the given user value * @return the value to store */ - protected Object toStoreValue(Object userValue) { - if (this.allowNullValues && userValue == null) { - return NULL_HOLDER; - } - return userValue; - } - - private ValueWrapper toWrapper(Object value) { - return (value != null ? new SimpleValueWrapper(fromStoreValue(value)) : null); - } - - @SuppressWarnings("serial") - - private static class NullHolder implements Serializable { - } + protected Object toStoreValue(Object userValue) { + if (this.allowNullValues && userValue == null) { + return NULL_HOLDER; + } + return userValue; + } + + private ValueWrapper toWrapper(Object value) { + return (value != null ? new SimpleValueWrapper(fromStoreValue(value)) : null); + } + + @SuppressWarnings("serial") + + private static class NullHolder implements Serializable { + } } diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentLinkedMapCacheManager.groovy b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentLinkedMapCacheManager.groovy index ab7cc818bf5..2a73bf73a75 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentLinkedMapCacheManager.groovy +++ b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentLinkedMapCacheManager.groovy @@ -18,12 +18,14 @@ */ package grails.plugin.cache +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.ConcurrentMap + import groovy.transform.CompileStatic -import org.grails.plugin.cache.GrailsCacheManager + import org.springframework.cache.Cache -import java.util.concurrent.ConcurrentHashMap -import java.util.concurrent.ConcurrentMap +import org.grails.plugin.cache.GrailsCacheManager /** * Based on com.googlecode.concurrentlinkedhashmap.ConcurrentLinkedHashMap. @@ -33,43 +35,43 @@ import java.util.concurrent.ConcurrentMap @CompileStatic class GrailsConcurrentLinkedMapCacheManager implements GrailsCacheManager { - protected final ConcurrentMap cacheMap = new ConcurrentHashMap() + protected final ConcurrentMap cacheMap = new ConcurrentHashMap() - Collection getCacheNames() { - return Collections.unmodifiableSet(cacheMap.keySet()) - } + Collection getCacheNames() { + return Collections.unmodifiableSet(cacheMap.keySet()) + } - Cache getCache(String name) { - return getCache(name, 10000) - } + Cache getCache(String name) { + return getCache(name, 10000) + } - Cache getCache(String name, int capacity) { - Cache cache = cacheMap.get(name) - if (cache == null) { - cache = createConcurrentLinkedMapCache(name, capacity) - Cache existing = cacheMap.putIfAbsent(name, cache) - if (existing != null) { - cache = existing - } - } - return cache - } + Cache getCache(String name, int capacity) { + Cache cache = cacheMap.get(name) + if (cache == null) { + cache = createConcurrentLinkedMapCache(name, capacity) + Cache existing = cacheMap.putIfAbsent(name, cache) + if (existing != null) { + cache = existing + } + } + return cache + } - boolean cacheExists(String name) { - getCacheNames().contains(name) - } + boolean cacheExists(String name) { + getCacheNames().contains(name) + } - boolean destroyCache(String name) { - cacheMap.remove(name) != null - } + boolean destroyCache(String name) { + cacheMap.remove(name) != null + } - protected GrailsConcurrentLinkedMapCache createConcurrentLinkedMapCache(String name, long capacity) { - return new GrailsConcurrentLinkedMapCache(name, capacity) - } + protected GrailsConcurrentLinkedMapCache createConcurrentLinkedMapCache(String name, long capacity) { + return new GrailsConcurrentLinkedMapCache(name, capacity) + } - void setConfiguration(CachePluginConfiguration configuration) { - configuration.caches.each { String key, CachePluginConfiguration.CacheConfig value -> - getCache(key, value.maxCapacity) - } - } + void setConfiguration(CachePluginConfiguration configuration) { + configuration.caches.each { String key, CachePluginConfiguration.CacheConfig value -> + getCache(key, value.maxCapacity) + } + } } diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentMapCache.java b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentMapCache.java index 67421ec98fe..981290983f9 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentMapCache.java +++ b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentMapCache.java @@ -34,26 +34,26 @@ */ public class GrailsConcurrentMapCache extends ConcurrentMapCache implements GrailsCache { - public GrailsConcurrentMapCache(String name) { - super(name); - } - - public GrailsConcurrentMapCache(String name, boolean allowNullValues) { - super(name, allowNullValues); - } - - public GrailsConcurrentMapCache(String name, ConcurrentMap store, boolean allowNullValues) { - super(name, store, allowNullValues); - } - - @Override - public GrailsValueWrapper get(Object key) { - Object value = getNativeCache().get(key); - return value == null ? null : new GrailsValueWrapper(fromStoreValue(value), null); - } - - @SuppressWarnings("unchecked") - public Collection getAllKeys() { - return getNativeCache().keySet(); - } + public GrailsConcurrentMapCache(String name) { + super(name); + } + + public GrailsConcurrentMapCache(String name, boolean allowNullValues) { + super(name, allowNullValues); + } + + public GrailsConcurrentMapCache(String name, ConcurrentMap store, boolean allowNullValues) { + super(name, store, allowNullValues); + } + + @Override + public GrailsValueWrapper get(Object key) { + Object value = getNativeCache().get(key); + return value == null ? null : new GrailsValueWrapper(fromStoreValue(value), null); + } + + @SuppressWarnings("unchecked") + public Collection getAllKeys() { + return getNativeCache().keySet(); + } } diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentMapCacheManager.groovy b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentMapCacheManager.groovy index 6a6d7a5ab92..19812fbafe9 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentMapCacheManager.groovy +++ b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsConcurrentMapCacheManager.groovy @@ -18,13 +18,15 @@ */ package grails.plugin.cache -import groovy.transform.CompileStatic -import org.grails.plugin.cache.GrailsCacheManager; - import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentMap + +import groovy.transform.CompileStatic + import org.springframework.cache.Cache +import org.grails.plugin.cache.GrailsCacheManager + /** * Based on org.springframework.cache.concurrent.ConcurrentMapCacheManager. * @@ -34,39 +36,39 @@ import org.springframework.cache.Cache @CompileStatic class GrailsConcurrentMapCacheManager implements GrailsCacheManager { - protected final ConcurrentMap cacheMap = new ConcurrentHashMap() + protected final ConcurrentMap cacheMap = new ConcurrentHashMap() - Collection getCacheNames() { - Collections.unmodifiableSet(cacheMap.keySet()) - } + Collection getCacheNames() { + Collections.unmodifiableSet(cacheMap.keySet()) + } - Cache getCache(String name) { - Cache cache = cacheMap.get(name) - if (cache == null) { - cache = createConcurrentMapCache(name) - Cache existing = cacheMap.putIfAbsent(name, cache) - if (existing != null) { - cache = existing - } - } - cache - } + Cache getCache(String name) { + Cache cache = cacheMap.get(name) + if (cache == null) { + cache = createConcurrentMapCache(name) + Cache existing = cacheMap.putIfAbsent(name, cache) + if (existing != null) { + cache = existing + } + } + cache + } - boolean cacheExists(String name) { - getCacheNames().contains(name) - } + boolean cacheExists(String name) { + getCacheNames().contains(name) + } - boolean destroyCache(String name) { - cacheMap.remove(name) != null - } + boolean destroyCache(String name) { + cacheMap.remove(name) != null + } - protected GrailsConcurrentMapCache createConcurrentMapCache(String name) { - new GrailsConcurrentMapCache(name) - } + protected GrailsConcurrentMapCache createConcurrentMapCache(String name) { + new GrailsConcurrentMapCache(name) + } - void setConfiguration(CachePluginConfiguration configuration) { - configuration.caches.each { String key, CachePluginConfiguration.CacheConfig value -> - getCache(key) - } - } + void setConfiguration(CachePluginConfiguration configuration) { + configuration.caches.each { String key, CachePluginConfiguration.CacheConfig value -> + getCache(key) + } + } } diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsValueWrapper.java b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsValueWrapper.java index 6b74a361e67..8ff0708b918 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/GrailsValueWrapper.java +++ b/grails-cache/src/main/groovy/grails/plugin/cache/GrailsValueWrapper.java @@ -27,14 +27,14 @@ */ public class GrailsValueWrapper extends SimpleValueWrapper { - protected Object nativeWrapper; + protected Object nativeWrapper; - public GrailsValueWrapper(Object value, Object nativeWrapper) { - super(value); - this.nativeWrapper = nativeWrapper; - } + public GrailsValueWrapper(Object value, Object nativeWrapper) { + super(value); + this.nativeWrapper = nativeWrapper; + } - public Object getNativeWrapper() { - return nativeWrapper; - } + public Object getNativeWrapper() { + return nativeWrapper; + } } diff --git a/grails-cache/src/main/groovy/grails/plugin/cache/util/ClassUtils.java b/grails-cache/src/main/groovy/grails/plugin/cache/util/ClassUtils.java index 5a6df4b1854..332b20183b4 100644 --- a/grails-cache/src/main/groovy/grails/plugin/cache/util/ClassUtils.java +++ b/grails-cache/src/main/groovy/grails/plugin/cache/util/ClassUtils.java @@ -18,13 +18,13 @@ */ package grails.plugin.cache.util; -import grails.util.GrailsNameUtils; - import java.lang.reflect.Field; import java.lang.reflect.Method; import org.springframework.util.ReflectionUtils; +import grails.util.GrailsNameUtils; + /** * @author Jeff Brown */ diff --git a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/Base64CodecExtensionMethods.groovy b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/Base64CodecExtensionMethods.groovy index 6a56864c534..91e7b8a1a69 100644 --- a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/Base64CodecExtensionMethods.groovy +++ b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/Base64CodecExtensionMethods.groovy @@ -18,10 +18,11 @@ */ package org.grails.plugins.codecs -import org.apache.commons.codec.binary.Base64 +import java.nio.charset.StandardCharsets + import org.codehaus.groovy.runtime.NullObject -import java.nio.charset.StandardCharsets +import org.apache.commons.codec.binary.Base64 /** * A codec that encodes and decodes Objects using Base64 encoding. diff --git a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/HexCodecExtensionMethods.groovy b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/HexCodecExtensionMethods.groovy index 7dda93f99a2..97af8be4fdc 100644 --- a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/HexCodecExtensionMethods.groovy +++ b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/HexCodecExtensionMethods.groovy @@ -18,10 +18,10 @@ */ package org.grails.plugins.codecs -import org.codehaus.groovy.runtime.NullObject - import java.nio.charset.StandardCharsets +import org.codehaus.groovy.runtime.NullObject + class HexCodecExtensionMethods { static HEXDIGITS = '0123456789abcdef' @@ -50,7 +50,7 @@ class HexCodecExtensionMethods { def str = theTarget.toString().toLowerCase() if (str.size() % 2) { - throw new UnsupportedOperationException("Decode of hex strings requires strings of even length") + throw new UnsupportedOperationException('Decode of hex strings requires strings of even length') } def currentByte diff --git a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/MD5BytesCodecExtensionMethods.groovy b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/MD5BytesCodecExtensionMethods.groovy index 4b5fdeccc6a..f6d601f208d 100644 --- a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/MD5BytesCodecExtensionMethods.groovy +++ b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/MD5BytesCodecExtensionMethods.groovy @@ -21,16 +21,17 @@ package org.grails.plugins.codecs import org.codehaus.groovy.runtime.NullObject class MD5BytesCodecExtensionMethods { + // Returns the byte[] of the digest, taken from UTF-8 of the string representation // or the raw data coerced to bytes static encodeAsMD5Bytes(theTarget) { - if(theTarget == null || theTarget instanceof NullObject) { + if (theTarget == null || theTarget instanceof NullObject) { return null } - DigestUtils.digest("MD5", theTarget) + DigestUtils.digest('MD5', theTarget) } static decodeMD5Bytes(theTarget) { - throw new UnsupportedOperationException("Cannot decode MD5 hashes") + throw new UnsupportedOperationException('Cannot decode MD5 hashes') } } diff --git a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/MD5CodecExtensionMethods.groovy b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/MD5CodecExtensionMethods.groovy index d54a0e81da3..06b503bc130 100644 --- a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/MD5CodecExtensionMethods.groovy +++ b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/MD5CodecExtensionMethods.groovy @@ -19,6 +19,7 @@ package org.grails.plugins.codecs class MD5CodecExtensionMethods { + // Returns the byte[] of the digest, taken from UTF-8 of the string representation // or the raw data coerced to bytes static encodeAsMD5(theTarget) { @@ -26,6 +27,6 @@ class MD5CodecExtensionMethods { } static decodeMD5(theTarget) { - throw new UnsupportedOperationException("Cannot decode MD5 hashes") + throw new UnsupportedOperationException('Cannot decode MD5 hashes') } } diff --git a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA1BytesCodecExtensionMethods.groovy b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA1BytesCodecExtensionMethods.groovy index 398dac6c9f5..3f5e79d8d51 100644 --- a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA1BytesCodecExtensionMethods.groovy +++ b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA1BytesCodecExtensionMethods.groovy @@ -21,15 +21,16 @@ package org.grails.plugins.codecs import org.codehaus.groovy.runtime.NullObject class SHA1BytesCodecExtensionMethods { + // Returns the byte[] of the digest static encodeAsSHA1Bytes(theTarget) { - if(theTarget == null || theTarget instanceof NullObject) { + if (theTarget == null || theTarget instanceof NullObject) { return null } - DigestUtils.digest("SHA-1", theTarget) + DigestUtils.digest('SHA-1', theTarget) } static decodeSHA1Bytes(theTarget) { - throw new UnsupportedOperationException("Cannot decode SHA-1 hashes") + throw new UnsupportedOperationException('Cannot decode SHA-1 hashes') } } diff --git a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA1CodecExtensionMethods.groovy b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA1CodecExtensionMethods.groovy index f952e003250..177e030256b 100644 --- a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA1CodecExtensionMethods.groovy +++ b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA1CodecExtensionMethods.groovy @@ -21,15 +21,16 @@ package org.grails.plugins.codecs import org.codehaus.groovy.runtime.NullObject class SHA1CodecExtensionMethods { + // Returns the byte[] of the digest static encodeAsSHA1(theTarget) { - if(theTarget == null || theTarget instanceof NullObject) { + if (theTarget == null || theTarget instanceof NullObject) { return null } theTarget.encodeAsSHA1Bytes().encodeAsHex() } static decodeSHA1(theTarget) { - throw new UnsupportedOperationException("Cannot decode SHA-1 hashes") + throw new UnsupportedOperationException('Cannot decode SHA-1 hashes') } } diff --git a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA256BytesCodecExtensionMethods.groovy b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA256BytesCodecExtensionMethods.groovy index d3aab53f5cd..335ca50df8a 100644 --- a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA256BytesCodecExtensionMethods.groovy +++ b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA256BytesCodecExtensionMethods.groovy @@ -21,15 +21,16 @@ package org.grails.plugins.codecs import org.codehaus.groovy.runtime.NullObject class SHA256BytesCodecExtensionMethods { + // Returns the byte[] of the digest static encodeAsSHA256Bytes(theTarget) { - if(theTarget == null || theTarget instanceof NullObject) { + if (theTarget == null || theTarget instanceof NullObject) { return null } - DigestUtils.digest("SHA-256", theTarget) + DigestUtils.digest('SHA-256', theTarget) } static decodeSHA256Bytes(theTarget) { - throw new UnsupportedOperationException("Cannot decode SHA-256 hashes") + throw new UnsupportedOperationException('Cannot decode SHA-256 hashes') } } diff --git a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA256CodecExtensionMethods.groovy b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA256CodecExtensionMethods.groovy index a34298e1a9c..ce231e0ce50 100644 --- a/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA256CodecExtensionMethods.groovy +++ b/grails-codecs-core/src/main/groovy/org/grails/plugins/codecs/SHA256CodecExtensionMethods.groovy @@ -21,15 +21,16 @@ package org.grails.plugins.codecs import org.codehaus.groovy.runtime.NullObject class SHA256CodecExtensionMethods extends DigestUtils { + // Returns the byte[] of the digest static encodeAsSHA256(theTarget) { - if(theTarget == null || theTarget instanceof NullObject) { + if (theTarget == null || theTarget instanceof NullObject) { return null } theTarget.encodeAsSHA256Bytes()?.encodeAsHex() } static decodeSHA256(theTarget) { - throw new UnsupportedOperationException("Cannot decode SHA-256 hashes") + throw new UnsupportedOperationException('Cannot decode SHA-256 hashes') } } diff --git a/grails-codecs/src/main/groovy/org/grails/commons/DefaultGrailsCodecClass.java b/grails-codecs/src/main/groovy/org/grails/commons/DefaultGrailsCodecClass.java index 1e815ae11eb..99039fb64bc 100644 --- a/grails-codecs/src/main/groovy/org/grails/commons/DefaultGrailsCodecClass.java +++ b/grails-codecs/src/main/groovy/org/grails/commons/DefaultGrailsCodecClass.java @@ -18,13 +18,18 @@ */ package org.grails.commons; -import org.grails.core.AbstractInjectableGrailsClass; -import groovy.lang.Closure; - import java.io.IOException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import groovy.lang.Closure; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.core.Ordered; +import org.springframework.util.ReflectionUtils; + +import org.grails.core.AbstractInjectableGrailsClass; import org.grails.encoder.CodecFactory; import org.grails.encoder.CodecIdentifier; import org.grails.encoder.CodecMetaClassSupport; @@ -38,10 +43,6 @@ import org.grails.encoder.EncodingStateRegistryLookup; import org.grails.encoder.EncodingStateRegistryLookupHolder; import org.grails.encoder.StreamingEncoder; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.Ordered; -import org.springframework.util.ReflectionUtils; /** * @author Jeff Brown @@ -51,7 +52,7 @@ public class DefaultGrailsCodecClass extends AbstractInjectableGrailsClass imple public static final String CODEC = CodecArtefactHandler.TYPE; private Encoder encoder; private Decoder decoder; - private static int instantionCounter=0; + private static int instantionCounter = 0; private int order = 100 + instantionCounter++; private boolean initialized = false; @@ -73,42 +74,42 @@ private void initializeCodec() { Object instance = getReferenceInstance(); if (Encoder.class.isAssignableFrom(getClazz())) { encoder = (Encoder) instance; - encoder = (Encoder)autowireCodecBean(encoder); + encoder = (Encoder) autowireCodecBean(encoder); if (encoder instanceof Ordered) { - order = ((Ordered)encoder).getOrder(); + order = ((Ordered) encoder).getOrder(); } } if (Decoder.class.isAssignableFrom(getClazz())) { decoder = (Decoder) instance; - decoder = (Decoder)autowireCodecBean(decoder); + decoder = (Decoder) autowireCodecBean(decoder); if (decoder instanceof Ordered) { - order = ((Ordered)decoder).getOrder(); + order = ((Ordered) decoder).getOrder(); } } - if (encoder==null && decoder==null) { - CodecFactory codecFactory=null; + if (encoder == null && decoder == null) { + CodecFactory codecFactory = null; if (CodecFactory.class.isAssignableFrom(getClazz())) { - codecFactory=(CodecFactory) instance; - codecFactory=(CodecFactory)autowireCodecBean(codecFactory); + codecFactory = (CodecFactory) instance; + codecFactory = (CodecFactory) autowireCodecBean(codecFactory); } - if (codecFactory==null) { - codecFactory=getStaticPropertyValue("codecFactory", CodecFactory.class); - codecFactory=(CodecFactory)autowireCodecBean(codecFactory); + if (codecFactory == null) { + codecFactory = getStaticPropertyValue("codecFactory", CodecFactory.class); + codecFactory = (CodecFactory) autowireCodecBean(codecFactory); } - if (codecFactory==null) { - codecFactory=new ClosureCodecFactory(instance); + if (codecFactory == null) { + codecFactory = new ClosureCodecFactory(instance); } - encoder=codecFactory.getEncoder(); - decoder=codecFactory.getDecoder(); + encoder = codecFactory.getEncoder(); + decoder = codecFactory.getDecoder(); if (codecFactory instanceof Ordered) { - order = ((Ordered)codecFactory).getOrder(); + order = ((Ordered) codecFactory).getOrder(); } } if (encoder != null) { if (encoder instanceof StreamingEncoder) { - encoder=new StreamingStateAwareEncoderWrapper((StreamingEncoder)encoder); + encoder = new StreamingStateAwareEncoderWrapper((StreamingEncoder) encoder); } else { - encoder=new StateAwareEncoderWrapper(encoder); + encoder = new StateAwareEncoderWrapper(encoder); } } } @@ -132,11 +133,11 @@ private class ClosureCodecFactory implements CodecFactory { this.codecInstance = codecInstance; Closure encoderClosure = getMethodOrClosureMethod(getClazz(), "encode"); if (encoderClosure != null) { - encoder=new ClosureEncoder(getName(), encoderClosure); + encoder = new ClosureEncoder(getName(), encoderClosure); } Closure decoderClosure = getMethodOrClosureMethod(getClazz(), "decode"); if (decoderClosure != null) { - decoder=new ClosureDecoder(getName(), decoderClosure); + decoder = new ClosureDecoder(getName(), decoderClosure); } } @@ -152,13 +153,13 @@ private Closure getMethodOrClosureMethod(Class clazz, String methodNa @SuppressWarnings("unchecked") Closure closure = getStaticPropertyValue(methodName, Closure.class); if (closure == null) { - Method method = ReflectionUtils.findMethod(clazz, methodName, (Class[])null); + Method method = ReflectionUtils.findMethod(clazz, methodName, (Class[]) null); if (method != null) { Object owner; if (Modifier.isStatic(method.getModifiers())) { - owner=clazz; + owner = clazz; } else { - owner=codecInstance; + owner = codecInstance; } return new MethodCallingClosure(owner, method); } @@ -174,8 +175,8 @@ private static class ClosureDecoder implements Decoder { private Closure closure; public ClosureDecoder(String codecName, Closure closure) { - this.codecIdentifier=new DefaultCodecIdentifier(codecName); - this.closure=closure; + this.codecIdentifier = new DefaultCodecIdentifier(codecName); + this.closure = closure; } public CodecIdentifier getCodecIdentifier() { @@ -191,7 +192,7 @@ private static class StateAwareEncoderWrapper implements Encoder { private Encoder delegate; public StateAwareEncoderWrapper(Encoder delegate) { - this.delegate=delegate; + this.delegate = delegate; } public CodecIdentifier getCodecIdentifier() { @@ -200,18 +201,18 @@ public CodecIdentifier getCodecIdentifier() { public Object encode(Object target) { if (target instanceof Encodeable) { - return ((Encodeable)target).encode(this); + return ((Encodeable) target).encode(this); } - EncodingStateRegistry encodingState=lookupEncodingState(); + EncodingStateRegistry encodingState = lookupEncodingState(); if (encodingState != null && target instanceof CharSequence) { - if (!encodingState.shouldEncodeWith(this, (CharSequence)target)) { + if (!encodingState.shouldEncodeWith(this, (CharSequence) target)) { return target; } } Object encoded = delegate.encode(target); if (encodingState != null && encoded instanceof CharSequence) - encodingState.registerEncodedWith(this, (CharSequence)encoded); + encodingState.registerEncodedWith(this, (CharSequence) encoded); return encoded; } @@ -221,7 +222,7 @@ protected EncodingStateRegistry lookupEncodingState() { } public void markEncoded(CharSequence string) { - EncodingStateRegistry encodingState=lookupEncodingState(); + EncodingStateRegistry encodingState = lookupEncodingState(); if (encodingState != null) { encodingState.registerEncodedWith(this, string); } @@ -238,10 +239,12 @@ public boolean isApplyToSafelyEncoded() { private static class StreamingStateAwareEncoderWrapper extends StateAwareEncoderWrapper implements StreamingEncoder { private StreamingEncoder delegate; + public StreamingStateAwareEncoderWrapper(StreamingEncoder delegate) { super(delegate); - this.delegate=delegate; + this.delegate = delegate; } + public void encodeToStream(Encoder thisInstance, CharSequence source, int offset, int len, EncodedAppender appender, EncodingState encodingState) throws IOException { delegate.encodeToStream(this, source, offset, len, appender, encodingState); @@ -253,8 +256,8 @@ private static class ClosureEncoder implements Encoder { private Closure closure; public ClosureEncoder(String codecName, Closure closure) { - this.codecIdentifier=new DefaultCodecIdentifier(codecName); - this.closure=closure; + this.codecIdentifier = new DefaultCodecIdentifier(codecName); + this.closure = closure; } public CodecIdentifier getCodecIdentifier() { @@ -262,7 +265,7 @@ public CodecIdentifier getCodecIdentifier() { } public Object encode(Object target) { - if (target==null) return null; + if (target == null) return null; return closure.call(target); } @@ -287,7 +290,7 @@ public MethodCallingClosure(Object owner, Method method) { super(owner); maximumNumberOfParameters = 1; parameterTypes = new Class[]{Object.class}; - this.method=method; + this.method = method; } protected Object callMethod(Object argument) { @@ -300,10 +303,10 @@ public Object call(Object... args) { } protected Object doCall(Object[] args) { - Object target=null; + Object target = null; if (args != null && args.length > 0) - target=args[0]; - if (target==null) { + target = args[0]; + if (target == null) { return null; } return callMethod(target); diff --git a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/CodecsConfiguration.java b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/CodecsConfiguration.java index 2d1183bbd96..41eafef9713 100644 --- a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/CodecsConfiguration.java +++ b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/CodecsConfiguration.java @@ -18,12 +18,13 @@ */ package org.grails.plugins.codecs; -import grails.core.GrailsApplication; -import org.grails.encoder.CodecLookup; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; +import grails.core.GrailsApplication; +import org.grails.encoder.CodecLookup; + /** * Beans for Codecs * diff --git a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/CodecsGrailsPlugin.groovy b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/CodecsGrailsPlugin.groovy index 403897ba7f8..13d3ac4c70e 100644 --- a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/CodecsGrailsPlugin.groovy +++ b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/CodecsGrailsPlugin.groovy @@ -32,9 +32,10 @@ import org.grails.encoder.impl.RawCodec * @since 0.4 */ class CodecsGrailsPlugin extends Plugin { + def version = GrailsUtil.getGrailsVersion() def dependsOn = [core: version] - def watchedResources = "file:./grails-app/utils/**/*Codec.groovy" + def watchedResources = 'file:./grails-app/utils/**/*Codec.groovy' def providedArtefacts = [ HTMLCodec, HTML4Codec, @@ -49,4 +50,4 @@ class CodecsGrailsPlugin extends Plugin { codecLookup(DefaultCodecLookup) } } -} \ No newline at end of file +} diff --git a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/DefaultCodecLookup.java b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/DefaultCodecLookup.java index 519ba504e2a..090ffbb673f 100644 --- a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/DefaultCodecLookup.java +++ b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/DefaultCodecLookup.java @@ -23,14 +23,15 @@ import java.util.List; import java.util.Objects; -import org.grails.commons.CodecArtefactHandler; +import org.springframework.context.ApplicationContext; +import org.springframework.core.OrderComparator; + import grails.core.GrailsApplication; import grails.core.GrailsClass; -import org.grails.commons.GrailsCodecClass; import grails.core.support.GrailsApplicationAware; +import org.grails.commons.CodecArtefactHandler; +import org.grails.commons.GrailsCodecClass; import org.grails.encoder.impl.BasicCodecLookup; -import org.springframework.context.ApplicationContext; -import org.springframework.core.OrderComparator; /** * @author Lari Hotari @@ -54,7 +55,7 @@ protected void registerCodecs() { Collections.sort(codecs, OrderComparator.INSTANCE); Collections.reverse(codecs); for (GrailsClass grailsClass : codecs) { - registerCodec((GrailsCodecClass)grailsClass); + registerCodec((GrailsCodecClass) grailsClass); } } diff --git a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/HTMLCodec.java b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/HTMLCodec.java index dc1366099f9..c87aca08ce5 100644 --- a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/HTMLCodec.java +++ b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/HTMLCodec.java @@ -18,6 +18,8 @@ */ package org.grails.plugins.codecs; +import org.springframework.beans.factory.InitializingBean; + import grails.core.GrailsApplication; import grails.core.support.GrailsApplicationAware; import org.grails.encoder.CodecFactory; @@ -28,8 +30,6 @@ import org.grails.encoder.impl.HTML4Encoder; import org.grails.encoder.impl.HTMLEncoder; -import org.springframework.beans.factory.InitializingBean; - /** * Encodes and decodes strings to and from HTML. * diff --git a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/URLCodec.groovy b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/URLCodec.groovy index c25d3efd88f..8a353ff96c3 100644 --- a/grails-codecs/src/main/groovy/org/grails/plugins/codecs/URLCodec.groovy +++ b/grails-codecs/src/main/groovy/org/grails/plugins/codecs/URLCodec.groovy @@ -18,9 +18,10 @@ */ package org.grails.plugins.codecs -import org.grails.encoder.impl.URLCodecFactory import org.springframework.web.context.request.RequestContextHolder +import org.grails.encoder.impl.URLCodecFactory + /** * A codec that encodes and decodes Objects to and from URL encoded strings. * @@ -28,7 +29,9 @@ import org.springframework.web.context.request.RequestContextHolder * @since 0.5 */ class URLCodec extends URLCodecFactory { + protected String resolveEncoding() { RequestContextHolder.getRequestAttributes()?.request?.characterEncoding ?: 'UTF-8' } + } diff --git a/grails-common/src/main/groovy/org/apache/grails/common/compiler/GroovyTransformOrder.groovy b/grails-common/src/main/groovy/org/apache/grails/common/compiler/GroovyTransformOrder.groovy index 88804912f30..6b6cddc7aaa 100644 --- a/grails-common/src/main/groovy/org/apache/grails/common/compiler/GroovyTransformOrder.groovy +++ b/grails-common/src/main/groovy/org/apache/grails/common/compiler/GroovyTransformOrder.groovy @@ -23,6 +23,7 @@ import groovy.transform.CompileStatic */ @CompileStatic interface GroovyTransformOrder { + static final int HIGHEST_PRIORITY = Integer.MAX_VALUE static final int HIGHEST_STARTING_PRIORITY = HIGHEST_PRIORITY - 1000000 static final int DECREMENT_PRIORITY = -5 @@ -214,4 +215,4 @@ interface GroovyTransformOrder { * Transforms a method to non-block IO */ static final int RX_SCHEDULER_ORDER = LINK_ORDER + DECREMENT_PRIORITY -} \ No newline at end of file +} diff --git a/grails-console/src/main/groovy/grails/ui/command/GrailsApplicationContextCommandRunner.groovy b/grails-console/src/main/groovy/grails/ui/command/GrailsApplicationContextCommandRunner.groovy index 7f28f5024af..afd4561f31d 100644 --- a/grails-console/src/main/groovy/grails/ui/command/GrailsApplicationContextCommandRunner.groovy +++ b/grails-console/src/main/groovy/grails/ui/command/GrailsApplicationContextCommandRunner.groovy @@ -16,16 +16,17 @@ */ package grails.ui.command +import groovy.transform.CompileStatic + +import org.springframework.beans.factory.config.AutowireCapableBeanFactory +import org.springframework.context.ConfigurableApplicationContext + import grails.config.Settings import grails.dev.commands.ApplicationContextCommandRegistry import grails.dev.commands.ExecutionContext import grails.ui.support.DevelopmentGrailsApplication -import groovy.transform.CompileStatic import org.grails.build.parsing.CommandLine import org.grails.build.parsing.CommandLineParser -import org.springframework.beans.factory.config.AutowireCapableBeanFactory -import org.springframework.context.ConfigurableApplicationContext - /** * @author Graeme Rocher @@ -44,9 +45,9 @@ class GrailsApplicationContextCommandRunner extends DevelopmentGrailsApplication @Override ConfigurableApplicationContext run(String... args) { def command = ApplicationContextCommandRegistry.instance.findCommand(commandName) - if(command) { + if (command) { - Object skipBootstrap = command.hasProperty("skipBootstrap")?.getProperty(command) + Object skipBootstrap = command.hasProperty('skipBootstrap')?.getProperty(command) if (skipBootstrap instanceof Boolean && !System.getProperty(Settings.SETTING_SKIP_BOOTSTRAP)) { System.setProperty(Settings.SETTING_SKIP_BOOTSTRAP, skipBootstrap.toString()) } @@ -89,8 +90,8 @@ class GrailsApplicationContextCommandRunner extends DevelopmentGrailsApplication * * @param args The first argument is the Command name, the last argument is the Application class name */ - public static void main(String[] args) { - if(args.size() > 1) { + static void main(String[] args) { + if (args.size() > 1) { Class applicationClass = null String className = args.last() try { @@ -104,7 +105,7 @@ class GrailsApplicationContextCommandRunner extends DevelopmentGrailsApplication runner.run(args.init() as String[]) } else { - System.err.println("Missing application class name and script name arguments") + System.err.println('Missing application class name and script name arguments') System.exit(1) } } diff --git a/grails-console/src/main/groovy/grails/ui/console/GrailsSwingConsole.groovy b/grails-console/src/main/groovy/grails/ui/console/GrailsSwingConsole.groovy index 6846ee5e2f0..5df7499f53f 100644 --- a/grails-console/src/main/groovy/grails/ui/console/GrailsSwingConsole.groovy +++ b/grails-console/src/main/groovy/grails/ui/console/GrailsSwingConsole.groovy @@ -18,15 +18,16 @@ */ package grails.ui.console -import grails.boot.GrailsApp -import grails.ui.console.support.GroovyConsoleApplicationContext -import grails.ui.console.support.GroovyConsoleWebApplicationContext import groovy.transform.CompileStatic + import org.springframework.boot.ApplicationContextFactory import org.springframework.context.ConfigurableApplicationContext import org.springframework.core.io.ResourceLoader import org.springframework.util.ClassUtils +import grails.boot.GrailsApp +import grails.ui.console.support.GroovyConsoleApplicationContext +import grails.ui.console.support.GroovyConsoleWebApplicationContext /** * The Grails console runs Grails embedded within a Swing console instead of within a container like Tomcat @@ -38,7 +39,7 @@ import org.springframework.util.ClassUtils class GrailsSwingConsole extends GrailsApp { static { - System.setProperty("java.awt.headless", "false"); + System.setProperty('java.awt.headless', 'false') } GrailsSwingConsole(Class... sources) { @@ -52,14 +53,13 @@ class GrailsSwingConsole extends GrailsApp { } void configureApplicationContextClass() { - if (ClassUtils.isPresent("jakarta.servlet.ServletContext", Thread.currentThread().contextClassLoader)) { + if (ClassUtils.isPresent('jakarta.servlet.ServletContext', Thread.currentThread().contextClassLoader)) { setApplicationContextFactory(ApplicationContextFactory.ofContextClass(GroovyConsoleWebApplicationContext)) } else { setApplicationContextFactory(ApplicationContextFactory.ofContextClass(GroovyConsoleApplicationContext)) } } - /** * Static helper that can be used to run a {@link GrailsApp} from the * specified source using default settings. @@ -67,8 +67,8 @@ class GrailsSwingConsole extends GrailsApp { * @param args the application arguments (usually passed from a Java main method) * @return the running {@link org.springframework.context.ApplicationContext} */ - public static ConfigurableApplicationContext run(Class source, String... args) { - return run([ source ] as Class[], args); + static ConfigurableApplicationContext run(Class source, String... args) { + return run([ source ] as Class[], args) } /** @@ -78,8 +78,8 @@ class GrailsSwingConsole extends GrailsApp { * @param args the application arguments (usually passed from a Java main method) * @return the running {@link org.springframework.context.ApplicationContext} */ - public static ConfigurableApplicationContext run(Class[] sources, String[] args) { - return new GrailsSwingConsole(sources).run(args); + static ConfigurableApplicationContext run(Class[] sources, String[] args) { + return new GrailsSwingConsole(sources).run(args) } /** @@ -87,13 +87,13 @@ class GrailsSwingConsole extends GrailsApp { * * @param args The first argument is the Application class name */ - public static void main(String[] args) { - if(args) { + static void main(String[] args) { + if (args) { def applicationClass = Thread.currentThread().contextClassLoader.loadClass(args[0]) new GrailsSwingConsole(applicationClass).run(args) } else { - System.err.println("Missing application class name argument") + System.err.println('Missing application class name argument') } } } diff --git a/grails-console/src/main/groovy/grails/ui/console/support/GroovyConsoleApplicationContext.groovy b/grails-console/src/main/groovy/grails/ui/console/support/GroovyConsoleApplicationContext.groovy index b0a2b05e62c..9fbc483f77b 100644 --- a/grails-console/src/main/groovy/grails/ui/console/support/GroovyConsoleApplicationContext.groovy +++ b/grails-console/src/main/groovy/grails/ui/console/support/GroovyConsoleApplicationContext.groovy @@ -19,11 +19,13 @@ package grails.ui.console.support -import grails.core.GrailsApplication import groovy.transform.CompileStatic import groovy.transform.InheritConstructors + import org.springframework.context.support.GenericApplicationContext +import grails.core.GrailsApplication + /** * An {@link org.springframework.context.ApplicationContext} that loads the GroovyConsole and makes the ApplicationContext and Grails environment available to the console * @@ -42,8 +44,8 @@ class GroovyConsoleApplicationContext extends GenericApplicationContext { protected void startConsole() { Binding binding = new Binding() - binding.setVariable("ctx", this) - binding.setVariable(GrailsApplication.APPLICATION_ID, getBean(GrailsApplication.class)) + binding.setVariable('ctx', this) + binding.setVariable(GrailsApplication.APPLICATION_ID, getBean(GrailsApplication)) final GroovyConsoleApplicationContext self = this groovy.console.ui.Console groovyConsole = new groovy.console.ui.Console(binding) { diff --git a/grails-console/src/main/groovy/grails/ui/console/support/GroovyConsoleWebApplicationContext.groovy b/grails-console/src/main/groovy/grails/ui/console/support/GroovyConsoleWebApplicationContext.groovy index 5910d1b36ac..d8817a21f8e 100644 --- a/grails-console/src/main/groovy/grails/ui/console/support/GroovyConsoleWebApplicationContext.groovy +++ b/grails-console/src/main/groovy/grails/ui/console/support/GroovyConsoleWebApplicationContext.groovy @@ -19,15 +19,12 @@ package grails.ui.console.support +import groovy.transform.CompileStatic +import groovy.transform.InheritConstructors + import grails.core.GrailsApplication import grails.persistence.support.PersistenceContextInterceptor import grails.ui.support.DevelopmentWebApplicationContext -import grails.util.BuildSettings -import groovy.transform.CompileStatic -import groovy.transform.InheritConstructors -import org.springframework.mock.web.MockServletConfig -import org.springframework.mock.web.MockServletContext -import org.springframework.web.context.support.GenericWebApplicationContext /** * A {@org.springframework.web.context.WebApplicationContext} for use in the embedded Grails console @@ -47,8 +44,8 @@ class GroovyConsoleWebApplicationContext extends DevelopmentWebApplicationContex protected void startConsole() { Binding binding = new Binding() - binding.setVariable("ctx", this) - binding.setVariable(GrailsApplication.APPLICATION_ID, getBean(GrailsApplication.class)) + binding.setVariable('ctx', this) + binding.setVariable(GrailsApplication.APPLICATION_ID, getBean(GrailsApplication)) final GroovyConsoleWebApplicationContext self = this groovy.console.ui.Console groovyConsole = new groovy.console.ui.Console(binding) { @@ -63,13 +60,13 @@ class GroovyConsoleWebApplicationContext extends DevelopmentWebApplicationContex def interceptors = getBeansOfType(PersistenceContextInterceptor).values() groovyConsole.beforeExecution = { - for(i in interceptors) { + for (i in interceptors) { i.init() } } groovyConsole.afterExecution = { - for(i in interceptors) { + for (i in interceptors) { i.destroy() } } diff --git a/grails-console/src/main/groovy/grails/ui/script/GrailsApplicationScriptRunner.groovy b/grails-console/src/main/groovy/grails/ui/script/GrailsApplicationScriptRunner.groovy index 7cb9467c5ba..2585b2de58e 100644 --- a/grails-console/src/main/groovy/grails/ui/script/GrailsApplicationScriptRunner.groovy +++ b/grails-console/src/main/groovy/grails/ui/script/GrailsApplicationScriptRunner.groovy @@ -18,14 +18,17 @@ */ package grails.ui.script -import grails.config.Config -import grails.core.GrailsApplication -import grails.persistence.support.PersistenceContextInterceptor -import grails.ui.support.DevelopmentGrailsApplication import groovy.transform.CompileStatic import org.codehaus.groovy.control.CompilerConfiguration import org.codehaus.groovy.control.customizers.ImportCustomizer + import org.springframework.context.ConfigurableApplicationContext + +import grails.config.Config +import grails.core.GrailsApplication +import grails.persistence.support.PersistenceContextInterceptor +import grails.ui.support.DevelopmentGrailsApplication + /** * Used to run Grails scripts within the context of a Grails application * @@ -34,6 +37,7 @@ import org.springframework.context.ConfigurableApplicationContext */ @CompileStatic class GrailsApplicationScriptRunner extends DevelopmentGrailsApplication { + List scripts private GrailsApplicationScriptRunner(List scripts, Class... sources) { @@ -52,7 +56,7 @@ class GrailsApplicationScriptRunner extends DevelopmentGrailsApplication { } def binding = new Binding() - binding.setVariable("ctx", ctx) + binding.setVariable('ctx', ctx) Config config = ctx.getBean('grailsApplication', GrailsApplication).config String defaultPackageKey = 'grails.codegen.defaultPackage' @@ -60,7 +64,7 @@ class GrailsApplicationScriptRunner extends DevelopmentGrailsApplication { CompilerConfiguration configuration = CompilerConfiguration.DEFAULT if (config.containsProperty(defaultPackageKey)) { ImportCustomizer importCustomizer = new ImportCustomizer() - importCustomizer.addStarImports config.getProperty(defaultPackageKey, String) + importCustomizer.addStarImports(config.getProperty(defaultPackageKey, String)) configuration.addCompilationCustomizers(importCustomizer) } sh = new GroovyShell(binding, configuration) @@ -70,11 +74,11 @@ class GrailsApplicationScriptRunner extends DevelopmentGrailsApplication { try { scripts.each { try { - for(i in interceptors) { + for (i in interceptors) { i.init() } sh.evaluate(it) - for(i in interceptors) { + for (i in interceptors) { i.destroy() } } catch (Throwable e) { @@ -84,7 +88,7 @@ class GrailsApplicationScriptRunner extends DevelopmentGrailsApplication { } } finally { try { - for(i in interceptors) { + for (i in interceptors) { i.destroy() } ctx?.close() @@ -93,7 +97,6 @@ class GrailsApplicationScriptRunner extends DevelopmentGrailsApplication { } } - return ctx } /** @@ -101,8 +104,8 @@ class GrailsApplicationScriptRunner extends DevelopmentGrailsApplication { * * @param args The last argument is the Application class name. All other args are script names */ - public static void main(String[] args) { - if(args.size() > 1) { + static void main(String[] args) { + if (args.size() > 1) { Class applicationClass = null String className = args.last() try { @@ -125,7 +128,7 @@ class GrailsApplicationScriptRunner extends DevelopmentGrailsApplication { new GrailsApplicationScriptRunner(scripts, applicationClass).run(args) } else { - System.err.println("Missing application class name and script name arguments") + System.err.println('Missing application class name and script name arguments') System.exit(1) } } diff --git a/grails-console/src/main/groovy/grails/ui/shell/GrailsShell.groovy b/grails-console/src/main/groovy/grails/ui/shell/GrailsShell.groovy index d41ab4a8581..bb508fee88e 100644 --- a/grails-console/src/main/groovy/grails/ui/shell/GrailsShell.groovy +++ b/grails-console/src/main/groovy/grails/ui/shell/GrailsShell.groovy @@ -17,15 +17,19 @@ * under the License. */ package grails.ui.shell -import grails.boot.GrailsApp -import grails.ui.shell.support.GroovyshApplicationContext -import grails.ui.shell.support.GroovyshWebApplicationContext + import groovy.transform.CompileStatic import groovy.transform.InheritConstructors + import org.springframework.boot.ApplicationContextFactory import org.springframework.context.ConfigurableApplicationContext import org.springframework.core.io.ResourceLoader import org.springframework.util.ClassUtils + +import grails.boot.GrailsApp +import grails.ui.shell.support.GroovyshApplicationContext +import grails.ui.shell.support.GroovyshWebApplicationContext + /** * A Shell * @@ -46,15 +50,14 @@ class GrailsShell extends GrailsApp { configureApplicationContextClass() } - public configureApplicationContextClass() { - if (ClassUtils.isPresent("jakarta.servlet.ServletContext", Thread.currentThread().contextClassLoader)) { + void configureApplicationContextClass() { + if (ClassUtils.isPresent('jakarta.servlet.ServletContext', Thread.currentThread().contextClassLoader)) { setApplicationContextFactory(ApplicationContextFactory.ofContextClass(GroovyshWebApplicationContext)) } else { setApplicationContextFactory(ApplicationContextFactory.ofContextClass(GroovyshApplicationContext)) } } - /** * Static helper that can be used to run a {@link GrailsApp} from the * specified source using default settings. @@ -62,8 +65,8 @@ class GrailsShell extends GrailsApp { * @param args the application arguments (usually passed from a Java main method) * @return the running {@link org.springframework.context.ApplicationContext} */ - public static ConfigurableApplicationContext run(Class source, String... args) { - return run([ source ] as Class[], args); + static ConfigurableApplicationContext run(Class source, String... args) { + return run([ source ] as Class[], args) } /** @@ -73,8 +76,8 @@ class GrailsShell extends GrailsApp { * @param args the application arguments (usually passed from a Java main method) * @return the running {@link org.springframework.context.ApplicationContext} */ - public static ConfigurableApplicationContext run(Class[] sources, String[] args) { - return new GrailsShell(sources).run(args); + static ConfigurableApplicationContext run(Class[] sources, String[] args) { + return new GrailsShell(sources).run(args) } /** @@ -82,13 +85,13 @@ class GrailsShell extends GrailsApp { * * @param args The first argument is the Application class name */ - public static void main(String[] args) { - if(args) { + static void main(String[] args) { + if (args) { def applicationClass = Thread.currentThread().contextClassLoader.loadClass(args[0]) new GrailsShell(applicationClass).run(args) } else { - System.err.println("Missing application class name argument") + System.err.println('Missing application class name argument') } } } diff --git a/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshApplicationContext.groovy b/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshApplicationContext.groovy index 9b44bec9ca2..2d85914d830 100644 --- a/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshApplicationContext.groovy +++ b/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshApplicationContext.groovy @@ -18,11 +18,13 @@ */ package grails.ui.shell.support -import grails.core.GrailsApplication import org.apache.groovy.groovysh.Groovysh import org.codehaus.groovy.tools.shell.IO + import org.springframework.context.support.GenericApplicationContext +import grails.core.GrailsApplication + /** * @author Graeme Rocher * @since 3.0 @@ -37,11 +39,11 @@ class GroovyshApplicationContext extends GenericApplicationContext { protected void startConsole() { Binding binding = new Binding() - binding.setVariable("ctx", this) - binding.setVariable(GrailsApplication.APPLICATION_ID, getBean(GrailsApplication.class)) + binding.setVariable('ctx', this) + binding.setVariable(GrailsApplication.APPLICATION_ID, getBean(GrailsApplication)) final GroovyshWebApplicationContext self = this - new Groovysh(binding, new IO()).run("") + new Groovysh(binding, new IO()).run('') } -} \ No newline at end of file +} diff --git a/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshWebApplicationContext.groovy b/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshWebApplicationContext.groovy index 2511416a4b0..0edae28c935 100644 --- a/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshWebApplicationContext.groovy +++ b/grails-console/src/main/groovy/grails/ui/shell/support/GroovyshWebApplicationContext.groovy @@ -18,13 +18,14 @@ */ package grails.ui.shell.support -import grails.core.GrailsApplication -import grails.ui.support.DevelopmentWebApplicationContext import groovy.transform.CompileStatic import groovy.transform.InheritConstructors import org.apache.groovy.groovysh.Groovysh import org.codehaus.groovy.tools.shell.IO +import grails.core.GrailsApplication +import grails.ui.support.DevelopmentWebApplicationContext + /** * @author Graeme Rocher * @since 3.0 @@ -41,11 +42,11 @@ class GroovyshWebApplicationContext extends DevelopmentWebApplicationContext { protected void startConsole() { Binding binding = new Binding() - binding.setVariable("ctx", this) - binding.setVariable(GrailsApplication.APPLICATION_ID, getBean(GrailsApplication.class)) + binding.setVariable('ctx', this) + binding.setVariable(GrailsApplication.APPLICATION_ID, getBean(GrailsApplication)) final GroovyshWebApplicationContext self = this - new Groovysh(binding, new IO()).run("") + new Groovysh(binding, new IO()).run('') } } diff --git a/grails-console/src/main/groovy/grails/ui/support/DevelopmentGrailsApplication.groovy b/grails-console/src/main/groovy/grails/ui/support/DevelopmentGrailsApplication.groovy index bf59f109429..fd537394bd8 100644 --- a/grails-console/src/main/groovy/grails/ui/support/DevelopmentGrailsApplication.groovy +++ b/grails-console/src/main/groovy/grails/ui/support/DevelopmentGrailsApplication.groovy @@ -18,12 +18,13 @@ */ package grails.ui.support -import grails.boot.GrailsApp import groovy.transform.CompileStatic + import org.springframework.boot.ApplicationContextFactory import org.springframework.util.ClassUtils import org.springframework.web.context.support.GenericWebApplicationContext +import grails.boot.GrailsApp /** * @author Graeme Rocher @@ -38,7 +39,7 @@ class DevelopmentGrailsApplication extends GrailsApp { } protected configureApplicationContextClass() { - if (ClassUtils.isPresent("jakarta.servlet.ServletContext", Thread.currentThread().contextClassLoader)) { + if (ClassUtils.isPresent('jakarta.servlet.ServletContext', Thread.currentThread().contextClassLoader)) { setApplicationContextFactory(ApplicationContextFactory.ofContextClass(DevelopmentWebApplicationContext)) } else { setApplicationContextFactory(ApplicationContextFactory.ofContextClass(GenericWebApplicationContext)) diff --git a/grails-console/src/main/groovy/grails/ui/support/DevelopmentWebApplicationContext.groovy b/grails-console/src/main/groovy/grails/ui/support/DevelopmentWebApplicationContext.groovy index 402c3d31ed1..0d5f5be528c 100644 --- a/grails-console/src/main/groovy/grails/ui/support/DevelopmentWebApplicationContext.groovy +++ b/grails-console/src/main/groovy/grails/ui/support/DevelopmentWebApplicationContext.groovy @@ -18,12 +18,13 @@ */ package grails.ui.support -import grails.util.BuildSettings import groovy.transform.InheritConstructors + import org.springframework.mock.web.MockServletConfig import org.springframework.mock.web.MockServletContext import org.springframework.web.context.support.GenericWebApplicationContext +import grails.util.BuildSettings /** * A {@link org.springframework.web.context.WebApplicationContext} used during development diff --git a/grails-controllers/src/main/groovy/grails/artefact/Controller.groovy b/grails-controllers/src/main/groovy/grails/artefact/Controller.groovy index ee32c1c1782..707ac284e93 100644 --- a/grails-controllers/src/main/groovy/grails/artefact/Controller.groovy +++ b/grails-controllers/src/main/groovy/grails/artefact/Controller.groovy @@ -18,6 +18,27 @@ */ package grails.artefact +import java.lang.reflect.Method + +import groovy.transform.CompileStatic +import groovy.transform.Generated +import org.codehaus.groovy.runtime.InvokerHelper + +import jakarta.servlet.ServletRequest +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse + +import org.springframework.beans.factory.config.AutowireCapableBeanFactory +import org.springframework.context.ApplicationContext +import org.springframework.http.HttpMethod +import org.springframework.validation.BindingResult +import org.springframework.validation.Errors +import org.springframework.validation.ObjectError +import org.springframework.web.context.ContextLoader +import org.springframework.web.context.request.RequestAttributes +import org.springframework.web.context.request.RequestContextHolder +import org.springframework.web.servlet.ModelAndView + import grails.artefact.controller.support.RequestForwarder import grails.artefact.controller.support.ResponseRedirector import grails.artefact.controller.support.ResponseRenderer @@ -30,9 +51,6 @@ import grails.web.api.ServletAttributes import grails.web.api.WebAttributes import grails.web.databinding.DataBinder import grails.web.databinding.DataBindingUtils -import groovy.transform.CompileStatic -import groovy.transform.Generated -import org.codehaus.groovy.runtime.InvokerHelper import org.grails.compiler.web.ControllerActionTransformer import org.grails.core.artefact.DomainClassArtefactHandler import org.grails.datastore.mapping.model.config.GormProperties @@ -44,21 +62,6 @@ import org.grails.web.servlet.mvc.GrailsWebRequest import org.grails.web.servlet.mvc.SynchronizerTokensHolder import org.grails.web.servlet.mvc.TokenResponseHandler import org.grails.web.util.GrailsApplicationAttributes -import org.springframework.beans.factory.config.AutowireCapableBeanFactory -import org.springframework.context.ApplicationContext -import org.springframework.http.HttpMethod -import org.springframework.validation.BindingResult -import org.springframework.validation.Errors -import org.springframework.validation.ObjectError -import org.springframework.web.context.ContextLoader -import org.springframework.web.context.request.RequestAttributes -import org.springframework.web.context.request.RequestContextHolder -import org.springframework.web.servlet.ModelAndView - -import jakarta.servlet.ServletRequest -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse -import java.lang.reflect.Method /** * Classes that implement the {@link Controller} trait are automatically treated as web controllers in a Grails application @@ -74,7 +77,6 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward private MimeTypesApiSupport mimeTypesSupport = new MimeTypesApiSupport() - /** *

The withFormat method is used to allow controllers to handle different types of * request formats such as HTML, XML and so on. Example usage:

@@ -94,7 +96,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward @Generated def withFormat(Closure callable) { HttpServletResponse response = GrailsWebRequest.lookup().currentResponse - mimeTypesSupport.withFormat((HttpServletResponse)response, callable) + mimeTypesSupport.withFormat((HttpServletResponse) response, callable) } /** @@ -107,7 +109,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward void header(String headerName, headerValue) { if (headerValue != null) { final HttpServletResponse response = getResponse() - response?.setHeader headerName, headerValue.toString() + response?.setHeader(headerName, headerValue.toString()) } } @@ -120,7 +122,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward */ @Generated void bindData(Class targetType, Collection collectionToPopulate, ServletRequest request) { - DataBindingUtils.bindToCollection targetType, collectionToPopulate, request + DataBindingUtils.bindToCollection(targetType, collectionToPopulate, request) } /** @@ -143,7 +145,6 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward setErrorsInternal(webRequest, errors) } - /** * Obtains the errors instance for the current controller * @@ -155,7 +156,6 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward getErrorsInternal(webRequest) } - /** * Obtains the ModelAndView for the currently executing controller * @@ -163,7 +163,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward */ @Generated ModelAndView getModelAndView() { - (ModelAndView)currentRequestAttributes().getAttribute(GrailsApplicationAttributes.MODEL_AND_VIEW, 0) + (ModelAndView) currentRequestAttributes().getAttribute(GrailsApplicationAttributes.MODEL_AND_VIEW, 0) } /** @@ -230,19 +230,19 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward throw new IllegalArgumentException("Invalid arguments to method 'redirect': $argMap") } - GrailsWebRequest webRequest = (GrailsWebRequest)RequestContextHolder.currentRequestAttributes() + GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes() - if(this instanceof GroovyObject) { - GroovyObject controller = (GroovyObject)this + if (this instanceof GroovyObject) { + GroovyObject controller = (GroovyObject) this // if there are errors add it to the list of errors Errors controllerErrors = getErrorsInternal(webRequest) - Errors errors = (Errors)argMap.get(GormProperties.ERRORS) + Errors errors = (Errors) argMap.get(GormProperties.ERRORS) if (controllerErrors != null && errors != null) { - controllerErrors.addAllErrors errors + controllerErrors.addAllErrors(errors) } else { - setErrorsInternal webRequest, errors + setErrorsInternal(webRequest, errors) } def action = argMap.get(GrailsControllerClass.ACTION) if (action != null) { @@ -251,7 +251,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward if (!argMap.containsKey(GrailsControllerClass.NAMESPACE_PROPERTY)) { // this could be made more efficient if we had a reference to the GrailsControllerClass object, which // has the namespace property accessible without needing reflection - argMap.put GrailsControllerClass.NAMESPACE_PROPERTY, GrailsClassUtils.getStaticFieldValue(controller.getClass(), GrailsControllerClass.NAMESPACE_PROPERTY) + argMap.put(GrailsControllerClass.NAMESPACE_PROPERTY, GrailsClassUtils.getStaticFieldValue(controller.getClass(), GrailsControllerClass.NAMESPACE_PROPERTY)) } } @@ -265,7 +265,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward */ @Generated TokenResponseHandler withForm(Closure callable) { - withForm getWebRequest(), callable + withForm(getWebRequest(), callable) } /** @@ -305,7 +305,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward */ private synchronized boolean isTokenValid(GrailsWebRequest webRequest) { final request = webRequest.getCurrentRequest() - SynchronizerTokensHolder tokensHolderInSession = (SynchronizerTokensHolder)request.getSession(false)?.getAttribute(SynchronizerTokensHolder.HOLDER) + SynchronizerTokensHolder tokensHolderInSession = (SynchronizerTokensHolder) request.getSession(false)?.getAttribute(SynchronizerTokensHolder.HOLDER) if (!tokensHolderInSession) return false String tokenInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_KEY] @@ -327,7 +327,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward */ private synchronized resetToken(GrailsWebRequest webRequest) { final request = webRequest.getCurrentRequest() - SynchronizerTokensHolder tokensHolderInSession = (SynchronizerTokensHolder)request.getSession(false)?.getAttribute(SynchronizerTokensHolder.HOLDER) + SynchronizerTokensHolder tokensHolderInSession = (SynchronizerTokensHolder) request.getSession(false)?.getAttribute(SynchronizerTokensHolder.HOLDER) String urlInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_URI] String tokenInRequest = webRequest.params[SynchronizerTokensHolder.TOKEN_KEY] @@ -338,15 +338,14 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward } @Generated - public static ApplicationContext getStaticApplicationContext() { - RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes() - if (!(requestAttributes instanceof GrailsWebRequest)) { - return ContextLoader.getCurrentWebApplicationContext() - } - ((GrailsWebRequest)requestAttributes).getApplicationContext() + static ApplicationContext getStaticApplicationContext() { + RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes() + if (!(requestAttributes instanceof GrailsWebRequest)) { + return ContextLoader.getCurrentWebApplicationContext() + } + ((GrailsWebRequest) requestAttributes).getApplicationContext() } - /** * Initializes a command object. * @@ -375,7 +374,7 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward commandObjectParameterName, dataBindingSource) def entityIdentifierValue = null final boolean isDomainClass - if(GroovyObject.isAssignableFrom(type)) { + if (GroovyObject.isAssignableFrom(type)) { isDomainClass = DomainClass.isAssignableFrom(type) } else { isDomainClass = DomainClassArtefactHandler @@ -392,8 +391,8 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward } if (entityIdentifierValue instanceof String) { entityIdentifierValue = ((String) entityIdentifierValue).trim() - if ("".equals(entityIdentifierValue) - || "null".equals(entityIdentifierValue)) { + if (''.equals(entityIdentifierValue) + || 'null'.equals(entityIdentifierValue)) { entityIdentifierValue = null } } @@ -402,13 +401,13 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward if (entityIdentifierValue != null) { try { - commandObjectInstance = InvokerHelper.invokeStaticMethod(type, "get", entityIdentifierValue) + commandObjectInstance = InvokerHelper.invokeStaticMethod(type, 'get', entityIdentifierValue) } catch (Exception e) { final Errors errors = getErrors() if (errors != null) { errors.reject(getClass().getName() - + ".commandObject." - + commandObjectParameterName + ".error", + + '.commandObject.' + + commandObjectParameterName + '.error', e.getMessage()) } } @@ -440,20 +439,20 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward } } catch (Exception e) { final exceptionHandlerMethodFor = getExceptionHandlerMethodFor(e.getClass()) - if(exceptionHandlerMethodFor != null) { + if (exceptionHandlerMethodFor != null) { throw e } commandObjectInstance = type.getDeclaredConstructor().newInstance() - final o = GrailsMetaClassUtils.invokeMethodIfExists(commandObjectInstance, "getErrors") - if(o instanceof BindingResult) { - final BindingResult errors = (BindingResult)o - String msg = "Error occurred initializing command object [" + commandObjectParameterName + "]. " + e.getMessage() + final o = GrailsMetaClassUtils.invokeMethodIfExists(commandObjectInstance, 'getErrors') + if (o instanceof BindingResult) { + final BindingResult errors = (BindingResult) o + String msg = 'Error occurred initializing command object [' + commandObjectParameterName + ']. ' + e.getMessage() ObjectError error = new ObjectError(commandObjectParameterName, msg) errors.addError(error) } } - if(commandObjectInstance != null) { + if (commandObjectInstance != null) { final ApplicationContext applicationContext = getApplicationContext() final AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory() autowireCapableBeanFactory.autowireBeanProperties(commandObjectInstance, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false) @@ -475,9 +474,9 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward DataBindingSource commandParams = params if (params != null && prefix != null) { def innerValue = params[prefix] - if(innerValue instanceof DataBindingSource) { - commandParams = (DataBindingSource)innerValue - } else if(innerValue instanceof Map) { + if (innerValue instanceof DataBindingSource) { + commandParams = (DataBindingSource) innerValue + } else if (innerValue instanceof Map) { commandParams = new SimpleMapDataBindingSource(innerValue) } } @@ -485,28 +484,28 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward } @Generated - @SuppressWarnings("unchecked") + @SuppressWarnings('unchecked') Method getExceptionHandlerMethodFor(final Class exceptionType) throws Exception { - if(!Exception.class.isAssignableFrom(exceptionType)) { + if (!Exception.isAssignableFrom(exceptionType)) { throw new IllegalArgumentException("exceptionType [${exceptionType.getName()}] argument must be Exception or a subclass of Exception") } Method handlerMethod - final List exceptionHandlerMetaDataInstances = (List)GrailsClassUtils.getStaticFieldValue(this.getClass(), ControllerActionTransformer.EXCEPTION_HANDLER_META_DATA_FIELD_NAME) - if(exceptionHandlerMetaDataInstances) { + final List exceptionHandlerMetaDataInstances = (List) GrailsClassUtils.getStaticFieldValue(this.getClass(), ControllerActionTransformer.EXCEPTION_HANDLER_META_DATA_FIELD_NAME) + if (exceptionHandlerMetaDataInstances) { // find all of the handler methods which could accept this exception type - final List matches = (List)exceptionHandlerMetaDataInstances.findAll { ControllerExceptionHandlerMetaData cemd -> + final List matches = (List) exceptionHandlerMetaDataInstances.findAll { ControllerExceptionHandlerMetaData cemd -> cemd.exceptionType.isAssignableFrom(exceptionType) } - if(matches.size() > 0) { + if (matches.size() > 0) { ControllerExceptionHandlerMetaData theOne = matches.get(0) // if there are more than 1, find the one that is farthest down the inheritance hierarchy - for(int i = 1; i < matches.size(); i++) { + for (int i = 1; i < matches.size(); i++) { final ControllerExceptionHandlerMetaData nextMatch = matches.get(i) - if(theOne.getExceptionType().isAssignableFrom(nextMatch.getExceptionType())) { + if (theOne.getExceptionType().isAssignableFrom(nextMatch.getExceptionType())) { theOne = nextMatch } } @@ -517,8 +516,6 @@ trait Controller implements ResponseRenderer, ResponseRedirector, RequestForward handlerMethod } - - private Errors getErrorsInternal(GrailsWebRequest webRequest) { (Errors) webRequest.getAttribute(GrailsApplicationAttributes.ERRORS, 0) } diff --git a/grails-controllers/src/main/groovy/grails/artefact/controller/support/AllowedMethodsHelper.groovy b/grails-controllers/src/main/groovy/grails/artefact/controller/support/AllowedMethodsHelper.groovy index fcd7df92271..2222fbdba36 100644 --- a/grails-controllers/src/main/groovy/grails/artefact/controller/support/AllowedMethodsHelper.groovy +++ b/grails-controllers/src/main/groovy/grails/artefact/controller/support/AllowedMethodsHelper.groovy @@ -24,7 +24,7 @@ import jakarta.servlet.http.HttpServletRequest /** * A helper class for interrogating the allowedMethods property. - * + * * @author Jeff Brown * @since 3.0 * @@ -34,10 +34,10 @@ class AllowedMethodsHelper { static boolean isAllowed(final String actionName, final HttpServletRequest request, final Map allowedMethods) { boolean isAllowed = true - if(allowedMethods?.containsKey(actionName)) { + if (allowedMethods?.containsKey(actionName)) { def method = request.method def value = allowedMethods[actionName] - if(value instanceof String) { + if (value instanceof String) { isAllowed = method.equalsIgnoreCase(value) } else if (value instanceof List) { isAllowed = value.find { s -> method.equalsIgnoreCase((String) s) } diff --git a/grails-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy b/grails-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy index 365215dccfd..1dcbde36b61 100644 --- a/grails-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy +++ b/grails-controllers/src/main/groovy/grails/artefact/controller/support/RequestForwarder.groovy @@ -18,23 +18,25 @@ */ package grails.artefact.controller.support +import groovy.transform.CompileStatic +import groovy.transform.Generated + +import jakarta.servlet.RequestDispatcher +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.web.context.request.WebRequest +import org.springframework.web.filter.OncePerRequestFilter + import grails.web.UrlConverter import grails.web.api.WebAttributes import grails.web.mapping.LinkGenerator -import groovy.transform.CompileStatic -import groovy.transform.Generated import org.grails.web.mapping.UrlMappingUtils import org.grails.web.mapping.mvc.UrlMappingsHandlerMapping import org.grails.web.servlet.mvc.GrailsWebRequest import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.util.WebUtils -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.web.context.request.WebRequest -import org.springframework.web.filter.OncePerRequestFilter - -import jakarta.servlet.RequestDispatcher -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse /** * A Trait for classes that forward the request @@ -44,6 +46,7 @@ import jakarta.servlet.http.HttpServletResponse */ @CompileStatic trait RequestForwarder implements WebAttributes { + private UrlConverter urlConverter private LinkGenerator linkGenerator @@ -54,7 +57,7 @@ trait RequestForwarder implements WebAttributes { } private LinkGenerator lookupLinkGenerator() { - if(this.linkGenerator == null) { + if (this.linkGenerator == null) { this.linkGenerator = webRequest.getApplicationContext().getBean(LinkGenerator) } return this.linkGenerator @@ -73,31 +76,31 @@ trait RequestForwarder implements WebAttributes { if (webRequest) { def controllerName - if(params.controller) { + if (params.controller) { controllerName = params.controller } else { controllerName = webRequest.controllerName } - if(controllerName) { + if (controllerName) { def convertedControllerName = convert(controllerName.toString()) webRequest.controllerName = convertedControllerName } params.controller = webRequest.controllerName - if(params.action) { + if (params.action) { params.action = convert(params.action.toString()) } - if(params.namespace) { + if (params.namespace) { params.namespace = params.namespace } - if(params.plugin) { + if (params.plugin) { params.plugin = params.plugin } - if ( !params.params ) { + if (!params.params) { params.params = UrlMappingUtils.findAllParamsNotInKeys( UrlMappingUtils.findAllParamsNotInUrlMappingKeywords(webRequest.params), webRequest.originalParams.keySet() @@ -105,7 +108,7 @@ trait RequestForwarder implements WebAttributes { } } - Map model = params.model instanceof Map ? (Map)params.model : Collections.EMPTY_MAP + Map model = params.model instanceof Map ? (Map) params.model : Collections.EMPTY_MAP HttpServletRequest request = webRequest.currentRequest HttpServletResponse response = webRequest.currentResponse @@ -118,7 +121,6 @@ trait RequestForwarder implements WebAttributes { params.includeContext = false String fowardURI = lookupLinkGenerator().link(params) - RequestDispatcher dispatcher = request.getRequestDispatcher(fowardURI) int requestScope = WebRequest.SCOPE_REQUEST @@ -126,7 +128,7 @@ trait RequestForwarder implements WebAttributes { webRequest.removeAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, requestScope) webRequest.removeAttribute(UrlMappingsHandlerMapping.MATCHED_REQUEST, requestScope) webRequest.removeAttribute(WebUtils.ERROR_STATUS_CODE_ATTRIBUTE, requestScope) - webRequest.removeAttribute("grailsWebRequestFilter" + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, requestScope) + webRequest.removeAttribute('grailsWebRequestFilter' + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, requestScope) try { dispatcher.forward(request, response) request.setAttribute(GrailsApplicationAttributes.FORWARD_ISSUED, true) @@ -136,13 +138,12 @@ trait RequestForwarder implements WebAttributes { webRequest.removeAttribute(GrailsApplicationAttributes.GRAILS_CONTROLLER_CLASS_AVAILABLE, requestScope) webRequest.removeAttribute(UrlMappingsHandlerMapping.MATCHED_REQUEST, requestScope) webRequest.removeAttribute(WebUtils.ERROR_STATUS_CODE_ATTRIBUTE, requestScope) - webRequest.removeAttribute("grailsWebRequestFilter" + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, requestScope) + webRequest.removeAttribute('grailsWebRequestFilter' + OncePerRequestFilter.ALREADY_FILTERED_SUFFIX, requestScope) } return fowardURI } - private String convert(String value) { (urlConverter) ? urlConverter.toUrlElement(value) : value } -} \ No newline at end of file +} diff --git a/grails-controllers/src/main/groovy/grails/artefact/controller/support/ResponseRedirector.groovy b/grails-controllers/src/main/groovy/grails/artefact/controller/support/ResponseRedirector.groovy index 49913dcdfec..a55bf903419 100644 --- a/grails-controllers/src/main/groovy/grails/artefact/controller/support/ResponseRedirector.groovy +++ b/grails-controllers/src/main/groovy/grails/artefact/controller/support/ResponseRedirector.groovy @@ -18,6 +18,15 @@ */ package grails.artefact.controller.support +import groovy.transform.CompileStatic +import groovy.transform.Generated + +import jakarta.servlet.http.HttpServletRequest + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.http.HttpMethod +import org.springframework.web.servlet.support.RequestDataValueProcessor + import grails.util.CollectionUtils import grails.util.GrailsNameUtils import grails.web.api.WebAttributes @@ -28,16 +37,9 @@ import grails.web.mapping.UrlMappingsHolder import grails.web.mapping.mvc.RedirectEventListener import grails.web.mapping.mvc.exceptions.CannotRedirectException import grails.web.mvc.FlashScope -import groovy.transform.CompileStatic -import groovy.transform.Generated import org.grails.core.artefact.ControllerArtefactHandler import org.grails.core.artefact.DomainClassArtefactHandler import org.grails.datastore.mapping.model.config.GormProperties -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.http.HttpMethod -import org.springframework.web.servlet.support.RequestDataValueProcessor - -import jakarta.servlet.http.HttpServletRequest /** * A trait for objects that redirect the response @@ -48,7 +50,6 @@ import jakarta.servlet.http.HttpServletRequest @CompileStatic trait ResponseRedirector implements WebAttributes { - private LinkGenerator linkGenerator private boolean useJsessionId = false @@ -76,7 +77,7 @@ trait ResponseRedirector implements WebAttributes { @Generated LinkGenerator getGrailsLinkGenerator() { - if(this.linkGenerator == null) { + if (this.linkGenerator == null) { this.linkGenerator = webRequest.getApplicationContext().getBean(LinkGenerator) } return this.linkGenerator @@ -90,16 +91,16 @@ trait ResponseRedirector implements WebAttributes { */ @Generated void redirect(object) { - if(object) { + if (object) { Class objectClass = object.getClass() boolean isDomain = DomainClassArtefactHandler.isDomainClass(objectClass) && object instanceof GroovyObject - if(isDomain) { - def id = ((GroovyObject)object).getProperty(GormProperties.IDENTITY) - if(id != null) { + if (isDomain) { + def id = ((GroovyObject) object).getProperty(GormProperties.IDENTITY) + if (id != null) { def args = [:] - args.put LinkGenerator.ATTRIBUTE_RESOURCE, object - args.put LinkGenerator.ATTRIBUTE_METHOD, HttpMethod.GET.toString() + args.put(LinkGenerator.ATTRIBUTE_RESOURCE, object) + args.put(LinkGenerator.ATTRIBUTE_METHOD, HttpMethod.GET.toString()) redirect(args) return } @@ -122,12 +123,12 @@ trait ResponseRedirector implements WebAttributes { } grails.web.mapping.ResponseRedirector redirector = new grails.web.mapping.ResponseRedirector(grailsLinkGenerator) - redirector.setRedirectListeners redirectListeners - redirector.setRequestDataValueProcessor requestDataValueProcessor - redirector.setUseJessionId useJsessionId + redirector.setRedirectListeners(redirectListeners) + redirector.setRequestDataValueProcessor(requestDataValueProcessor) + redirector.setUseJessionId(useJsessionId) def webRequest = webRequest - redirector.redirect webRequest.getRequest(), webRequest.getResponse(), argMap + redirector.redirect(webRequest.getRequest(), webRequest.getResponse(), argMap) } /** @@ -136,10 +137,9 @@ trait ResponseRedirector implements WebAttributes { */ @Generated Map getChainModel() { - (Map)getFlash().get(FlashScope.CHAIN_MODEL) + (Map) getFlash().get(FlashScope.CHAIN_MODEL) } - /** * Chains from one action to another via an HTTP redirect. The model is retained in the following request in the 'chainModel' property within flash scope. * @@ -149,18 +149,17 @@ trait ResponseRedirector implements WebAttributes { */ @Generated void chain(Map args) { - String controller = (args.controller ?: GrailsNameUtils.getLogicalPropertyName( getClass().name, ControllerArtefactHandler.TYPE)).toString() + String controller = (args.controller ?: GrailsNameUtils.getLogicalPropertyName(getClass().name, ControllerArtefactHandler.TYPE)).toString() String action = args.action?.toString() String namespace = args.remove('namespace') String plugin = args.remove('plugin')?.toString() def id = args.id - def params = CollectionUtils.getOrCreateChildMap(args, "params") - def model = CollectionUtils.getOrCreateChildMap(args, "model") + def params = CollectionUtils.getOrCreateChildMap(args, 'params') + def model = CollectionUtils.getOrCreateChildMap(args, 'model') def actionParams = params.findAll { Map.Entry it -> it.key?.toString()?.startsWith('_action_') } actionParams.each { Map.Entry it -> params.remove(it.key) } - def currentWebRequest = webRequest def currentFlash = currentWebRequest.flashScope def chainModel = currentFlash.chainModel @@ -170,7 +169,6 @@ trait ResponseRedirector implements WebAttributes { } currentFlash.chainModel = model - def appCtx = currentWebRequest.applicationContext UrlMappings mappings = appCtx.getBean(UrlMappingsHolder.BEAN_ID, UrlMappings) @@ -190,7 +188,7 @@ trait ResponseRedirector implements WebAttributes { } else { url = response.encodeRedirectURL(url) } - response.sendRedirect url + response.sendRedirect(url) } @Generated @@ -202,4 +200,4 @@ trait ResponseRedirector implements WebAttributes { void setUseJsessionId(boolean useJsessionId) { this.useJsessionId = useJsessionId } -} \ No newline at end of file +} diff --git a/grails-controllers/src/main/groovy/grails/artefact/controller/support/ResponseRenderer.groovy b/grails-controllers/src/main/groovy/grails/artefact/controller/support/ResponseRenderer.groovy index 016cdc2ab59..620413dc524 100644 --- a/grails-controllers/src/main/groovy/grails/artefact/controller/support/ResponseRenderer.groovy +++ b/grails-controllers/src/main/groovy/grails/artefact/controller/support/ResponseRenderer.groovy @@ -18,6 +18,23 @@ */ package grails.artefact.controller.support +import groovy.json.StreamingJsonBuilder +import groovy.transform.CompileStatic +import groovy.transform.Generated +import groovy.xml.StreamingMarkupBuilder +import groovy.xml.slurpersupport.GPathResult + +import jakarta.servlet.http.HttpServletRequest +import jakarta.servlet.http.HttpServletResponse + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.annotation.Qualifier +import org.springframework.http.HttpStatus +import org.springframework.web.context.request.RequestAttributes +import org.springframework.web.context.request.RequestContextHolder +import org.springframework.web.servlet.ModelAndView +import org.springframework.web.servlet.View + import grails.io.IOUtils import grails.plugins.GrailsPlugin import grails.plugins.GrailsPluginManager @@ -29,11 +46,6 @@ import grails.web.mime.MimeType import grails.web.mime.MimeUtility import grails.web.pages.GrailsLayoutSelector import grails.web.pages.GrailsRenderViewMutator -import groovy.json.StreamingJsonBuilder -import groovy.transform.CompileStatic -import groovy.transform.Generated -import groovy.xml.slurpersupport.GPathResult -import groovy.xml.StreamingMarkupBuilder import org.grails.gsp.GroovyPageTemplate import org.grails.io.support.SpringIOUtils import org.grails.web.json.JSONElement @@ -44,18 +56,29 @@ import org.grails.web.servlet.view.CompositeViewResolver import org.grails.web.servlet.view.GroovyPageView import org.grails.web.util.GrailsApplicationAttributes import org.grails.web.util.WebUtils -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Qualifier -import org.springframework.http.HttpStatus -import org.springframework.web.context.request.RequestAttributes -import org.springframework.web.context.request.RequestContextHolder -import org.springframework.web.servlet.ModelAndView -import org.springframework.web.servlet.View - -import jakarta.servlet.http.HttpServletRequest -import jakarta.servlet.http.HttpServletResponse -import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.* +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.APPLICATION_XML +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_BEAN +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_BUILDER +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_COLLECTION +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_CONTENT_TYPE +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_CONTEXTPATH +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_ENCODING +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_FILE +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_FILE_NAME +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_LAYOUT +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_MODEL +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_PLUGIN +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_STATUS +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_TEMPLATE +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_TEXT +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_VAR +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.ARGUMENT_VIEW +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.BUILDER_TYPE_JSON +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.DEFAULT_ARGUMENT +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.DEFAULT_ENCODING +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.DISPOSITION_HEADER_PREFIX +import static org.grails.plugins.web.controllers.metaclass.RenderDynamicMethod.TEXT_HTML /** * @@ -90,7 +113,7 @@ trait ResponseRenderer extends WebAttributes { @Generated @Autowired(required = false) - @Qualifier("grailsMimeUtility") + @Qualifier('grailsMimeUtility') void setMimeUtility(MimeUtility mimeUtility) { this.mimeUtility = mimeUtility } @@ -114,10 +137,10 @@ trait ResponseRenderer extends WebAttributes { applyContentType(response, null, object) try { - response.writer.write object.inspect() + response.writer.write(object.inspect()) } catch (IOException e) { - throw new ControllerExecutionException("I/O error obtaining response writer: " + e.getMessage(), e) + throw new ControllerExecutionException('I/O error obtaining response writer: ' + e.getMessage(), e) } } @@ -133,7 +156,7 @@ trait ResponseRenderer extends WebAttributes { setContentType(response, TEXT_HTML, DEFAULT_ENCODING, true) - renderMarkupInternal webRequest, closure, response + renderMarkupInternal(webRequest, closure, response) } /** @@ -148,8 +171,8 @@ trait ResponseRenderer extends WebAttributes { HttpServletResponse response = webRequest.currentResponse String layoutArg = argMap[ARGUMENT_LAYOUT]?.toString() ?: null - applyContentType response, argMap, closure - handleStatusArgument argMap, webRequest, response + applyContentType(response, argMap, closure) + handleStatusArgument(argMap, webRequest, response) if (BUILDER_TYPE_JSON.equals(argMap.get(ARGUMENT_BUILDER)) || isJSONResponse(response)) { renderJsonInternal(response, closure) @@ -160,10 +183,10 @@ trait ResponseRenderer extends WebAttributes { setLayout(webRequest.currentRequest, false, layoutArg) } - private void renderJsonInternal(HttpServletResponse response, @DelegatesTo(value = StreamingJsonBuilder.StreamingJsonDelegate.class, strategy = Closure.DELEGATE_FIRST) Closure callable) { - response.setContentType(GrailsWebUtil.getContentType(MimeType.JSON.getName(), response.getCharacterEncoding() ?: "UTF-8")) + private void renderJsonInternal(HttpServletResponse response, @DelegatesTo(value = StreamingJsonBuilder.StreamingJsonDelegate, strategy = Closure.DELEGATE_FIRST) Closure callable) { + response.setContentType(GrailsWebUtil.getContentType(MimeType.JSON.getName(), response.getCharacterEncoding() ?: 'UTF-8')) def jsonBuilder = new StreamingJsonBuilder(response.writer) - jsonBuilder.call callable + jsonBuilder.call(callable) } /** @@ -178,9 +201,9 @@ trait ResponseRenderer extends WebAttributes { HttpServletResponse response = webRequest.currentResponse String layoutArg = argMap[ARGUMENT_LAYOUT]?.toString() ?: null - applyContentType response, argMap, body - handleStatusArgument argMap, webRequest, response - render body + applyContentType(response, argMap, body) + handleStatusArgument(argMap, webRequest, response) + render(body) setLayout(webRequest.currentRequest, false, layoutArg) } @@ -240,17 +263,16 @@ trait ResponseRenderer extends WebAttributes { String layoutArg = argMap[ARGUMENT_LAYOUT]?.toString() ?: null boolean statusSet = handleStatusArgument(argMap, webRequest, response) - def applicationAttributes = webRequest.attributes if (argMap.containsKey(ARGUMENT_TEXT)) { def textArg = argMap[ARGUMENT_TEXT] - applyContentType response, argMap, textArg + applyContentType(response, argMap, textArg) if (textArg instanceof Writable) { renderWritable((Writable) textArg, response) webRequest.renderView = false } else { CharSequence text = (textArg instanceof CharSequence) ? ((CharSequence) textArg) : textArg.toString() - render text + render(text) } setLayout(webRequest.currentRequest, false, layoutArg) } else if (argMap.containsKey(ARGUMENT_VIEW)) { @@ -264,11 +286,11 @@ trait ResponseRenderer extends WebAttributes { if (modelObject) { Collection resultTransformers = actionResultTransformers for (ActionResultTransformer resultTransformer : resultTransformers) { - modelObject = resultTransformer.transformActionResult webRequest, viewUri, modelObject + modelObject = resultTransformer.transformActionResult(webRequest, viewUri, modelObject) } } - applyContentType webRequest.currentResponse, argMap, null, false + applyContentType(webRequest.currentResponse, argMap, null, false) Map model if (modelObject instanceof Map) { @@ -277,10 +299,10 @@ trait ResponseRenderer extends WebAttributes { model = [:] } - ((GroovyObject) this).setProperty "modelAndView", new ModelAndView(viewUri, model) + ((GroovyObject) this).setProperty('modelAndView', new ModelAndView(viewUri, model)) setLayout(webRequest.currentRequest, true, layoutArg) } else if (argMap.containsKey(ARGUMENT_TEMPLATE)) { - applyContentType response, argMap, null, false + applyContentType(response, argMap, null, false) webRequest.renderView = false boolean hasModel = argMap.containsKey(ARGUMENT_MODEL) def modelObject @@ -344,7 +366,7 @@ trait ResponseRenderer extends WebAttributes { renderTemplateForCollection(webRequest, view, binding, colObject, var) } else if (hasModel) { if (modelObject instanceof Map) { - setTemplateModel webRequest, binding, (Map) modelObject + setTemplateModel(webRequest, binding, (Map) modelObject) } renderViewForTemplate(webRequest, view, binding) } else { @@ -375,7 +397,7 @@ trait ResponseRenderer extends WebAttributes { } if (!hasContentType) { throw new ControllerExecutionException( - "Argument [file] of render method specified without valid [contentType] argument") + 'Argument [file] of render method specified without valid [contentType] argument') } InputStream input @@ -389,7 +411,7 @@ trait ResponseRenderer extends WebAttributes { } else { input = IOUtils.openStream(new File(o.toString())) } - SpringIOUtils.copy input, response.getOutputStream() + SpringIOUtils.copy(input, response.getOutputStream()) } catch (IOException e) { throw new ControllerExecutionException( "I/O error copying file to response: ${e.message}", e) @@ -438,7 +460,6 @@ trait ResponseRenderer extends WebAttributes { } } - private boolean handleStatusArgument(Map argMap, GrailsWebRequest webRequest, HttpServletResponse response) { boolean statusSet if (argMap.containsKey(ARGUMENT_STATUS)) { @@ -456,7 +477,7 @@ trait ResponseRenderer extends WebAttributes { } catch (NumberFormatException e) { throw new ControllerExecutionException( - "Argument [status] of method [render] must be a valid integer.") + 'Argument [status] of method [render] must be a valid integer.') } } } @@ -472,21 +493,21 @@ trait ResponseRenderer extends WebAttributes { b.encoding = response.characterEncoding Writable markup = (Writable) b.bind(closure) - renderWritable markup, response + renderWritable(markup, response) webRequest.setRenderView(false) } private boolean isJSONResponse(HttpServletResponse response) { String contentType = response.getContentType() - return contentType != null && (contentType.indexOf("application/json") > -1 || - contentType.indexOf("text/json") > -1) + return contentType != null && (contentType.indexOf('application/json') > -1 || + contentType.indexOf('text/json') > -1) } private void renderWritable(Writable writable, HttpServletResponse response) { try { PrintWriter writer = response.getWriter() - writable.writeTo writer + writable.writeTo(writer) writer.flush() } catch (IOException e) { @@ -495,7 +516,7 @@ trait ResponseRenderer extends WebAttributes { } private boolean applyContentType(HttpServletResponse response, Map argMap, Object renderArgument) { - applyContentType response, argMap, renderArgument, true + applyContentType(response, argMap, renderArgument, true) } private boolean applyContentType(HttpServletResponse response, Map argMap, Object renderArgument, boolean useDefault) { @@ -547,7 +568,7 @@ trait ResponseRenderer extends WebAttributes { private String getContextPath(GrailsWebRequest webRequest, Map argMap) { def cp = argMap.get(ARGUMENT_CONTEXTPATH) - String contextPath = (cp != null ? cp.toString() : "") + String contextPath = (cp != null ? cp.toString() : '') Object pluginName = argMap.get(ARGUMENT_PLUGIN) if (pluginName != null) { @@ -584,9 +605,9 @@ trait ResponseRenderer extends WebAttributes { } } else { if (GrailsStringUtils.isBlank(var)) { - binding.put DEFAULT_ARGUMENT, colObject + binding.put(DEFAULT_ARGUMENT, colObject) } else { - binding.put var, colObject + binding.put(var, colObject) } renderViewForTemplate(webRequest, view, binding) diff --git a/grails-controllers/src/main/groovy/grails/compiler/traits/ControllerTraitInjector.groovy b/grails-controllers/src/main/groovy/grails/compiler/traits/ControllerTraitInjector.groovy index b259cf4b1f1..84fbbd0e0ab 100644 --- a/grails-controllers/src/main/groovy/grails/compiler/traits/ControllerTraitInjector.groovy +++ b/grails-controllers/src/main/groovy/grails/compiler/traits/ControllerTraitInjector.groovy @@ -18,9 +18,10 @@ */ package grails.compiler.traits -import grails.artefact.Controller import groovy.transform.CompileStatic +import grails.artefact.Controller + /** * * A {@link TraitInjector} that injects controllers with the {@link Controller} trait @@ -33,7 +34,7 @@ import groovy.transform.CompileStatic */ @CompileStatic class ControllerTraitInjector implements TraitInjector { - + @Override Class getTrait() { Controller diff --git a/grails-controllers/src/main/groovy/grails/web/Controller.groovy b/grails-controllers/src/main/groovy/grails/web/Controller.groovy index 03c7a37bae3..9ba72b907f6 100644 --- a/grails-controllers/src/main/groovy/grails/web/Controller.groovy +++ b/grails-controllers/src/main/groovy/grails/web/Controller.groovy @@ -19,18 +19,17 @@ package grails.web -import org.codehaus.groovy.transform.GroovyASTTransformationClass - import java.lang.annotation.ElementType import java.lang.annotation.Retention import java.lang.annotation.RetentionPolicy import java.lang.annotation.Target +import org.codehaus.groovy.transform.GroovyASTTransformationClass + /** * Created by graemerocher on 28/05/14. */ @Retention(RetentionPolicy.RUNTIME) -@Target( [ ElementType.TYPE ] ) -@GroovyASTTransformationClass("org.grails.compiler.web.ControllerArtefactTypeTransformation") -public @interface Controller { -} \ No newline at end of file +@Target([ElementType.TYPE]) +@GroovyASTTransformationClass('org.grails.compiler.web.ControllerArtefactTypeTransformation') +@interface Controller {} diff --git a/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerActionTransformer.java b/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerActionTransformer.java index 602f11cbe42..fa03fc2f79b 100644 --- a/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerActionTransformer.java +++ b/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerActionTransformer.java @@ -18,18 +18,17 @@ */ package org.grails.compiler.web; -import grails.artefact.Artefact; -import grails.artefact.controller.support.AllowedMethodsHelper; -import grails.compiler.DelegatingMethod; -import grails.compiler.ast.AnnotatedClassInjector; -import grails.compiler.ast.AstTransformer; -import grails.compiler.ast.GrailsArtefactClassInjector; -import grails.util.CollectionUtils; -import grails.util.TypeConvertingMap; -import grails.validation.Validateable; -import grails.web.Action; -import grails.web.RequestParameter; -import grails.web.controllers.ControllerMethod; +import java.io.File; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + import groovy.lang.Closure; import groovy.transform.CompilationUnitAware; import org.apache.groovy.ast.tools.ClassNodeUtils; @@ -78,6 +77,22 @@ import org.codehaus.groovy.syntax.Token; import org.codehaus.groovy.syntax.Types; import org.codehaus.groovy.transform.trait.Traits; + +import org.springframework.validation.Errors; +import org.springframework.validation.MapBindingResult; + +import grails.artefact.Artefact; +import grails.artefact.controller.support.AllowedMethodsHelper; +import grails.compiler.DelegatingMethod; +import grails.compiler.ast.AnnotatedClassInjector; +import grails.compiler.ast.AstTransformer; +import grails.compiler.ast.GrailsArtefactClassInjector; +import grails.util.CollectionUtils; +import grails.util.TypeConvertingMap; +import grails.validation.Validateable; +import grails.web.Action; +import grails.web.RequestParameter; +import grails.web.controllers.ControllerMethod; import org.grails.compiler.injection.GrailsASTUtils; import org.grails.compiler.injection.TraitInjectionUtils; import org.grails.core.DefaultGrailsControllerClass; @@ -86,21 +101,21 @@ import org.grails.plugins.web.controllers.DefaultControllerExceptionHandlerMetaData; import org.grails.web.databinding.DefaultASTDatabindingHelper; import org.grails.web.util.WebUtils; -import org.springframework.validation.Errors; -import org.springframework.validation.MapBindingResult; - -import java.io.File; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.net.URL; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; -import static org.codehaus.groovy.ast.tools.GeneralUtils.*; +import static org.codehaus.groovy.ast.tools.GeneralUtils.args; +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.boolX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.callThisX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.declX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS; +import static org.codehaus.groovy.ast.tools.GeneralUtils.localVarX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.nullX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt; +import static org.codehaus.groovy.ast.tools.GeneralUtils.ternaryX; +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX; import static org.grails.compiler.injection.GrailsASTUtils.applyDefaultMethodTarget; import static org.grails.compiler.injection.GrailsASTUtils.applyMethodTarget; import static org.grails.compiler.injection.GrailsASTUtils.buildGetMapExpression; @@ -212,7 +227,7 @@ public String[] getArtefactTypes() { public void performInjection(SourceUnit source, GeneratorContext context, ClassNode classNode) { // don't inject if already an @Artefact annotation is applied - if(!classNode.getAnnotations(new ClassNode(Artefact.class)).isEmpty()) return; + if (!classNode.getAnnotations(new ClassNode(Artefact.class)).isEmpty()) return; performInjectionOnAnnotatedClass(source, context, classNode); @@ -229,14 +244,14 @@ public void performInjectionOnAnnotatedClass(SourceUnit source, GeneratorContext @Override public void performInjectionOnAnnotatedClass(SourceUnit source, ClassNode classNode) { - performInjectionOnAnnotatedClass(source,null, classNode); + performInjectionOnAnnotatedClass(source, null, classNode); } private boolean isExceptionHandlingMethod(MethodNode methodNode) { boolean isExceptionHandler = false; - if(!methodNode.isPrivate() && methodNode.getName().indexOf("$") == -1) { + if (!methodNode.isPrivate() && methodNode.getName().indexOf("$") == -1) { Parameter[] parameters = methodNode.getParameters(); - if(parameters.length == 1) { + if (parameters.length == 1) { ClassNode parameterTypeClassNode = parameters[0].getType(); isExceptionHandler = parameterTypeClassNode.isDerivedFrom(new ClassNode(Exception.class)); } @@ -244,17 +259,15 @@ private boolean isExceptionHandlingMethod(MethodNode methodNode) { return isExceptionHandler; } - - private void processMethods(ClassNode classNode, SourceUnit source, GeneratorContext context) { - List deferredNewMethods = new ArrayList(); + List deferredNewMethods = new ArrayList<>(); for (MethodNode method : classNode.getMethods()) { if (methodShouldBeConfiguredAsControllerAction(method)) { final List declaredMethodsWithThisName = classNode.getDeclaredMethods(method.getName()); - if(declaredMethodsWithThisName != null) { - final int numberOfNonExceptionHandlerMethodsWithThisName = DefaultGroovyMethods.count((Iterable)declaredMethodsWithThisName, new Closure(this) { + if (declaredMethodsWithThisName != null) { + final int numberOfNonExceptionHandlerMethodsWithThisName = DefaultGroovyMethods.count((Iterable) declaredMethodsWithThisName, new Closure(this) { @Override public Object call(Object object) { return !isExceptionHandlingMethod((MethodNode) object); @@ -278,9 +291,9 @@ public Object call(Object object) { Collection exceptionHandlerMethods = getExceptionHandlerMethods(classNode, source); final FieldNode exceptionHandlerMetaDataField = classNode.getField(EXCEPTION_HANDLER_META_DATA_FIELD_NAME); - if(exceptionHandlerMetaDataField == null || !exceptionHandlerMetaDataField.getDeclaringClass().equals(classNode)) { + if (exceptionHandlerMetaDataField == null || !exceptionHandlerMetaDataField.getDeclaringClass().equals(classNode)) { final ListExpression listOfExceptionHandlerMetaData = new ListExpression(); - for(final MethodNode exceptionHandlerMethod : exceptionHandlerMethods) { + for (final MethodNode exceptionHandlerMethod : exceptionHandlerMethods) { final Parameter[] parameters = exceptionHandlerMethod.getParameters(); final Parameter firstParameter = parameters[0]; final ClassNode firstParameterTypeClassNode = firstParameter.getType(); @@ -295,14 +308,13 @@ public Object call(Object object) { listOfExceptionHandlerMetaData); } - for (MethodNode newMethod : deferredNewMethods) { ClassNodeUtils.addGeneratedMethod(classNode, newMethod); } } /** - * + * * @param method a potential controller action method * @return true if the method should be configured as a controller action, false otherwise */ @@ -313,8 +325,8 @@ protected boolean methodShouldBeConfiguredAsControllerAction(final MethodNode me //Trait methods have a line number of -1 --minLineNumber; } - return !method.isStatic() && - method.isPublic() && + return !method.isStatic() && + method.isPublic() && !method.isAbstract() && method.getAnnotations(ACTION_ANNOTATION_NODE.getClassNode()).isEmpty() && method.getAnnotations(new ClassNode(ControllerMethod.class)).isEmpty() && @@ -325,13 +337,13 @@ protected boolean methodShouldBeConfiguredAsControllerAction(final MethodNode me } protected Collection getExceptionHandlerMethods(final ClassNode classNode, SourceUnit sourceUnit) { - final Map exceptionTypeToHandlerMethodMap = new HashMap(); + final Map exceptionTypeToHandlerMethodMap = new HashMap<>(); final List methods = classNode.getMethods(); - for(MethodNode methodNode : methods) { - if(isExceptionHandlingMethod(methodNode)) { + for (MethodNode methodNode : methods) { + if (isExceptionHandlingMethod(methodNode)) { final Parameter exceptionParameter = methodNode.getParameters()[0]; final ClassNode exceptionType = exceptionParameter.getType(); - if(!exceptionTypeToHandlerMethodMap.containsKey(exceptionType)) { + if (!exceptionTypeToHandlerMethodMap.containsKey(exceptionType)) { exceptionTypeToHandlerMethodMap.put(exceptionType, methodNode); } else { final MethodNode otherHandlerMethod = exceptionTypeToHandlerMethodMap.get(exceptionType); @@ -342,14 +354,14 @@ protected Collection getExceptionHandlerMethods(final ClassNode clas } } final ClassNode superClass = classNode.getSuperClass(); - if(!superClass.equals(OBJECT_CLASS)) { + if (!superClass.equals(OBJECT_CLASS)) { final Collection superClassMethods = getExceptionHandlerMethods(superClass, sourceUnit); - for(MethodNode superClassMethod : superClassMethods) { + for (MethodNode superClassMethod : superClassMethods) { final Parameter exceptionParameter = superClassMethod.getParameters()[0]; final ClassNode exceptionType = exceptionParameter.getType(); // only add this super class handler if we don't already have // a handler for this exception type in this class - if(!exceptionTypeToHandlerMethodMap.containsKey(exceptionType)) { + if (!exceptionTypeToHandlerMethodMap.containsKey(exceptionType)) { exceptionTypeToHandlerMethodMap.put(exceptionType, superClassMethod); } } @@ -388,22 +400,21 @@ private MethodNode convertToMethodAction(ClassNode classNode, MethodNode methodN MethodNode method = null; if (methodNode.getParameters().length > 0) { final BlockStatement methodCode = new BlockStatement(); - + final BlockStatement codeToHandleAllowedMethods = getCodeToHandleAllowedMethods(classNode, methodNode.getName()); final Statement codeToCallOriginalMethod = addOriginalMethodCall(methodNode, initializeActionParameters( classNode, methodNode, methodNode.getName(), parameters, source, context)); - + methodCode.addStatement(codeToHandleAllowedMethods); methodCode.addStatement(codeToCallOriginalMethod); - method = new MethodNode( methodNode.getName(), Modifier.PUBLIC, returnType, ZERO_PARAMETERS, EMPTY_CLASS_ARRAY, methodCode); - + GrailsASTUtils.copyAnnotations(methodNode, method); methodNode.addAnnotation(DELEGATING_METHOD_ANNOATION); @@ -412,7 +423,7 @@ private MethodNode convertToMethodAction(ClassNode classNode, MethodNode methodN } else { annotateActionMethod(classNode, parameters, methodNode); } - + wrapMethodBodyWithExceptionHandling(classNode, methodNode); return method; @@ -440,14 +451,14 @@ private Statement addOriginalMethodCall(MethodNode methodNode, BlockStatement bl } private boolean isCommandObjectAction(Parameter[] params) { - return params != null && params.length > 0 - && params[0].getType() != new ClassNode(Object[].class) - && params[0].getType() != new ClassNode(Object.class); + return params != null && params.length > 0 && + params[0].getType() != new ClassNode(Object[].class) && + params[0].getType() != new ClassNode(Object.class); } private void processClosures(ClassNode classNode, SourceUnit source, GeneratorContext context) { - List propertyNodes = new ArrayList(classNode.getProperties()); + List propertyNodes = new ArrayList<>(classNode.getProperties()); Expression initialExpression; ClosureExpression closureAction; @@ -515,31 +526,31 @@ protected void annotateActionMethod(ClassNode controllerClassNode, final Paramet protected BlockStatement getCodeToHandleAllowedMethods(ClassNode controllerClass, String methodName) { GrailsASTUtils.addEnhancedAnnotation(controllerClass, DefaultGrailsControllerClass.ALLOWED_HTTP_METHODS_PROPERTY); final BlockStatement checkAllowedMethodsBlock = new BlockStatement(); - + final PropertyExpression requestPropertyExpression = new PropertyExpression(new VariableExpression("this"), "request"); - + final FieldNode allowedMethodsField = controllerClass.getField(DefaultGrailsControllerClass.ALLOWED_HTTP_METHODS_PROPERTY); - - if(allowedMethodsField != null) { + + if (allowedMethodsField != null) { final Expression initialAllowedMethodsExpression = allowedMethodsField.getInitialExpression(); - if(initialAllowedMethodsExpression instanceof MapExpression) { + if (initialAllowedMethodsExpression instanceof MapExpression) { boolean actionIsRestricted = false; final MapExpression allowedMethodsMapExpression = (MapExpression) initialAllowedMethodsExpression; final List allowedMethodsMapEntryExpressions = allowedMethodsMapExpression.getMapEntryExpressions(); - for(MapEntryExpression allowedMethodsMapEntryExpression : allowedMethodsMapEntryExpressions) { + for (MapEntryExpression allowedMethodsMapEntryExpression : allowedMethodsMapEntryExpressions) { final Expression allowedMethodsMapEntryKeyExpression = allowedMethodsMapEntryExpression.getKeyExpression(); - if(allowedMethodsMapEntryKeyExpression instanceof ConstantExpression) { + if (allowedMethodsMapEntryKeyExpression instanceof ConstantExpression) { final ConstantExpression allowedMethodsMapKeyConstantExpression = (ConstantExpression) allowedMethodsMapEntryKeyExpression; final Object allowedMethodsMapKeyValue = allowedMethodsMapKeyConstantExpression.getValue(); - if(methodName.equals(allowedMethodsMapKeyValue)) { + if (methodName.equals(allowedMethodsMapKeyValue)) { actionIsRestricted = true; break; } } } - if(actionIsRestricted) { + if (actionIsRestricted) { final PropertyExpression responsePropertyExpression = new PropertyExpression(new VariableExpression("this"), "response"); - + final ArgumentListExpression isAllowedArgumentList = new ArgumentListExpression(); isAllowedArgumentList.addExpression(new ConstantExpression(methodName)); isAllowedArgumentList.addExpression(new PropertyExpression(new VariableExpression("this"), "request")); @@ -552,30 +563,31 @@ protected BlockStatement getCodeToHandleAllowedMethods(ClassNode controllerClass blockToSendError.addStatement(new ExpressionStatement(sendErrorMethodCall)); blockToSendError.addStatement(returnStatement); final IfStatement ifIsValidRequestMethodStatement = new IfStatement(isValidRequestMethod, new ExpressionStatement(new EmptyExpression()), blockToSendError); - + checkAllowedMethodsBlock.addStatement(ifIsValidRequestMethodStatement); } } } - + final ArgumentListExpression argumentListExpression = new ArgumentListExpression(); argumentListExpression.addExpression(new ConstantExpression(ALLOWED_METHODS_HANDLED_ATTRIBUTE_NAME)); argumentListExpression.addExpression(new ConstantExpression(methodName)); - + final Expression setAttributeMethodCall = new MethodCallExpression(requestPropertyExpression, "setAttribute", argumentListExpression); - + final BlockStatement codeToExecuteIfAttributeIsNotSet = new BlockStatement(); codeToExecuteIfAttributeIsNotSet.addStatement(new ExpressionStatement(setAttributeMethodCall)); codeToExecuteIfAttributeIsNotSet.addStatement(checkAllowedMethodsBlock); final BooleanExpression attributeIsSetBooleanExpression = new BooleanExpression(new MethodCallExpression(requestPropertyExpression, "getAttribute", new ArgumentListExpression(new ConstantExpression(ALLOWED_METHODS_HANDLED_ATTRIBUTE_NAME)))); final Statement ifAttributeIsAlreadySetStatement = new IfStatement(attributeIsSetBooleanExpression, new EmptyStatement(), codeToExecuteIfAttributeIsNotSet); - + final BlockStatement code = new BlockStatement(); code.addStatement(ifAttributeIsAlreadySetStatement); return code; } + /** * This will wrap the method body in a try catch block which does something * like this: @@ -612,7 +624,7 @@ protected void wrapMethodBodyWithExceptionHandling(final ClassNode controllerCla invokeArguments.addExpression(caughtExceptionVariableExpression); final MethodCallExpression invokeExceptionHandlerMethodExpression = new MethodCallExpression(new VariableExpression(exceptionHandlerMethodVariableName), "invoke", invokeArguments); applyDefaultMethodTarget(invokeExceptionHandlerMethodExpression, reflectMethodClassNode); - + final Statement returnStatement = new ReturnStatement(invokeExceptionHandlerMethodExpression); final Statement throwCaughtExceptionStatement = new ThrowStatement(caughtExceptionVariableExpression); final Statement ifExceptionHandlerMethodExistsStatement = new IfStatement(new BooleanExpression(exceptionHandlerMethodExpression), returnStatement, throwCaughtExceptionStatement); @@ -632,25 +644,25 @@ protected void wrapMethodBodyWithExceptionHandling(final ClassNode controllerCla final ArgumentListExpression argumentListExpression = new ArgumentListExpression(); argumentListExpression.addExpression(new ConstantExpression(ALLOWED_METHODS_HANDLED_ATTRIBUTE_NAME)); - + final PropertyExpression requestPropertyExpression = new PropertyExpression(new VariableExpression("this"), "request"); final Expression removeAttributeMethodCall = new MethodCallExpression(requestPropertyExpression, "removeAttribute", argumentListExpression); - + final Expression getAttributeMethodCall = new MethodCallExpression(requestPropertyExpression, "getAttribute", new ArgumentListExpression(new ConstantExpression(ALLOWED_METHODS_HANDLED_ATTRIBUTE_NAME))); final VariableExpression attributeValueExpression = new VariableExpression("$allowed_methods_attribute_value", ClassHelper.make(Object.class)); final Expression initializeAttributeValue = new DeclarationExpression( attributeValueExpression, Token.newSymbol(Types.EQUALS, 0, 0), getAttributeMethodCall); - final Expression attributeValueMatchesMethodNameExpression = new BinaryExpression(new ConstantExpression(methodNode.getName()), - Token.newSymbol(Types.COMPARE_EQUAL, 0, 0), + final Expression attributeValueMatchesMethodNameExpression = new BinaryExpression(new ConstantExpression(methodNode.getName()), + Token.newSymbol(Types.COMPARE_EQUAL, 0, 0), attributeValueExpression); - final Statement ifAttributeValueMatchesMethodName = - new IfStatement(new BooleanExpression(attributeValueMatchesMethodNameExpression), + final Statement ifAttributeValueMatchesMethodName = + new IfStatement(new BooleanExpression(attributeValueMatchesMethodNameExpression), new ExpressionStatement(removeAttributeMethodCall), new EmptyStatement()); final BlockStatement blockToRemoveAttribute = new BlockStatement(); blockToRemoveAttribute.addStatement(new ExpressionStatement(initializeAttributeValue)); blockToRemoveAttribute.addStatement(ifAttributeValueMatchesMethodName); - + final TryCatchStatement tryCatchToRemoveAttribute = new TryCatchStatement(blockToRemoveAttribute, new EmptyStatement()); tryCatchToRemoveAttribute.addCatch(new CatchStatement(new Parameter(ClassHelper.make(Exception.class), "$exceptionRemovingAttribute"), new EmptyStatement())); @@ -759,7 +771,7 @@ protected void initializeAndValidateCommandObjectParameter(final BlockStatement final DeclarationExpression declareCoExpression = declX(localVarX(paramName, commandObjectNode), new EmptyExpression()); wrapper.addStatement(stmt(declareCoExpression)); - if(commandObjectNode.isInterface() || Modifier.isAbstract(commandObjectNode.getModifiers())) { + if (commandObjectNode.isInterface() || Modifier.isAbstract(commandObjectNode.getModifiers())) { final String warningMessage = "The [" + actionName + "] action in [" + controllerNode.getName() + "] accepts a parameter of type [" + commandObjectNode.getName() + @@ -786,7 +798,7 @@ protected void initializeAndValidateCommandObjectParameter(final BlockStatement List declaredConstructors = commandObjectNode.getDeclaredConstructors(); List objectInitializerStatements = commandObjectNode.getObjectInitializerStatements(); - if(declaredConstructors.isEmpty() && !objectInitializerStatements.isEmpty()) { + if (declaredConstructors.isEmpty() && !objectInitializerStatements.isEmpty()) { BlockStatement constructorLogic = new BlockStatement(); ConstructorNode constructorNode = new ConstructorNode(Modifier.PUBLIC, constructorLogic); ClassNodeUtils.addGeneratedConstructor(commandObjectNode, constructorNode); @@ -799,7 +811,7 @@ protected void initializeAndValidateCommandObjectParameter(final BlockStatement } } } - + if (argumentIsValidateable) { final MethodCallExpression validateMethodCallExpression = callX(localVarX(paramName, commandObjectNode), "validate"); final MethodNode validateMethod = commandObjectNode.getMethod("validate", new Parameter[0]); @@ -821,19 +833,19 @@ protected void initializeAndValidateCommandObjectParameter(final BlockStatement new ExpressionStatement(new EmptyExpression())); final Statement ifCommandObjectIsNotNullThenValidate = new IfStatement(new BooleanExpression(new VariableExpression(paramName)), ifRespondsToValidateThenValidateStatement, new ExpressionStatement(new EmptyExpression())); wrapper.addStatement(ifCommandObjectIsNotNullThenValidate); - + final String warningMessage = "The [" + actionName + "] action accepts a parameter of type [" + commandObjectNode.getName() + "] which does not implement grails.validation.Validateable. Data binding will still be applied " + "to this command object but the instance will not be validateable."; GrailsASTUtils.warning(source, actionNode, warningMessage); } - if(GrailsASTUtils.isInnerClassNode(commandObjectNode)) { + if (GrailsASTUtils.isInnerClassNode(commandObjectNode)) { final String warningMessage = "The [" + actionName + "] action accepts a parameter of type [" + commandObjectNode.getName() + "] which is an inner class. Command object classes should not be inner classes."; GrailsASTUtils.warning(source, actionNode, warningMessage); - + } else { new DefaultASTDatabindingHelper().injectDatabindingCode(source, context, commandObjectNode); @@ -910,7 +922,7 @@ protected void initializePrimitiveOrTypeWrapperParameter(final ClassNode classNo final MethodCallExpression retrieveConvertedValueExpression = new MethodCallExpression( getParamsExpression, conversionMethodName, paramsTypeConversionMethodArguments); Class defaultValueClass = null; // choose any - if("char".equals(conversionMethodName)) { + if ("char".equals(conversionMethodName)) { // TypeConvertingMap.'char' method has 2 different signatures, choose the one with "Character 'char'(String name, Integer defaultValue)" signature defaultValueClass = Integer.class; } @@ -977,7 +989,6 @@ public void performInjection(SourceUnit source, ClassNode classNode) { performInjection(source, null, classNode); } - public boolean shouldInject(URL url) { return url != null && CONTROLLER_PATTERN.matcher(url.getFile()).find(); } diff --git a/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerArtefactTypeTransformation.java b/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerArtefactTypeTransformation.java index a1ed8b5c353..0d4b85bb69e 100644 --- a/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerArtefactTypeTransformation.java +++ b/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerArtefactTypeTransformation.java @@ -19,15 +19,16 @@ package org.grails.compiler.web; -import grails.web.Controller; import org.codehaus.groovy.ast.AnnotationNode; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; -import org.grails.core.artefact.ControllerArtefactHandler; -import org.grails.compiler.injection.ArtefactTypeAstTransformation; import org.codehaus.groovy.transform.GroovyASTTransformation; +import grails.web.Controller; +import org.grails.compiler.injection.ArtefactTypeAstTransformation; +import org.grails.core.artefact.ControllerArtefactHandler; + /** * A transformation that makes an Artefact a controller * diff --git a/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerDomainTransformer.java b/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerDomainTransformer.java index 519b4cbf7de..af958d38941 100644 --- a/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerDomainTransformer.java +++ b/grails-controllers/src/main/groovy/org/grails/compiler/web/ControllerDomainTransformer.java @@ -18,19 +18,20 @@ */ package org.grails.compiler.web; -import grails.compiler.ast.AstTransformer; +import java.net.URL; + import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.MethodNode; import org.codehaus.groovy.classgen.GeneratorContext; import org.codehaus.groovy.control.SourceUnit; + +import grails.compiler.ast.AstTransformer; import org.grails.compiler.injection.AbstractGrailsArtefactTransformer; import org.grails.core.artefact.DomainClassArtefactHandler; import org.grails.io.support.GrailsResourceUtils; import org.grails.plugins.web.controllers.api.ControllersDomainBindingApi; import org.grails.web.databinding.DefaultASTDatabindingHelper; -import java.net.URL; - /** * Adds binding methods to domain classes. * @@ -71,7 +72,7 @@ public boolean shouldInject(URL url) { @Override public void performInjection(final SourceUnit source, final GeneratorContext context, final ClassNode classNode) { - super.performInjection(source, context, classNode); + super.performInjection(source, context, classNode); new DefaultASTDatabindingHelper().injectDatabindingCode(source, context, classNode); } } diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllerExceptionHandlerMetaData.java b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllerExceptionHandlerMetaData.java index 857df8f6539..e4b36281cf6 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllerExceptionHandlerMetaData.java +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllerExceptionHandlerMetaData.java @@ -25,6 +25,8 @@ * */ public interface ControllerExceptionHandlerMetaData { + Class getExceptionType(); + String getMethodName(); } diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersAutoConfiguration.java b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersAutoConfiguration.java index 3cde4bc4aa9..d1804887b06 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersAutoConfiguration.java +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersAutoConfiguration.java @@ -19,15 +19,12 @@ package org.grails.plugins.web.controllers; -import grails.config.Settings; -import grails.core.GrailsApplication; +import java.util.EnumSet; + import jakarta.servlet.DispatcherType; import jakarta.servlet.Filter; import jakarta.servlet.MultipartConfigElement; -import org.grails.web.config.http.GrailsFilters; -import org.grails.web.filters.HiddenHttpMethodFilter; -import org.grails.web.servlet.mvc.GrailsDispatcherServlet; -import org.grails.web.servlet.mvc.GrailsWebRequestFilter; + import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; @@ -45,7 +42,12 @@ import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; -import java.util.EnumSet; +import grails.config.Settings; +import grails.core.GrailsApplication; +import org.grails.web.config.http.GrailsFilters; +import org.grails.web.filters.HiddenHttpMethodFilter; +import org.grails.web.servlet.mvc.GrailsDispatcherServlet; +import org.grails.web.servlet.mvc.GrailsWebRequestFilter; @AutoConfiguration(before = { HttpEncodingAutoConfiguration.class, WebMvcAutoConfiguration.class }) @ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET) @@ -155,15 +157,15 @@ static class GrailsWebMvcConfigurer implements WebMvcConfigurer { private static final String[] SERVLET_RESOURCE_LOCATIONS = new String[] { "/" }; private static final String[] CLASSPATH_RESOURCE_LOCATIONS = new String[] { - "classpath:/META-INF/resources/", "classpath:/resources/", - "classpath:/static/", "classpath:/public/" + "classpath:/META-INF/resources/", "classpath:/resources/", + "classpath:/static/", "classpath:/public/" }; private static final String[] RESOURCE_LOCATIONS; static { - RESOURCE_LOCATIONS = new String[CLASSPATH_RESOURCE_LOCATIONS.length - + SERVLET_RESOURCE_LOCATIONS.length]; + RESOURCE_LOCATIONS = new String[CLASSPATH_RESOURCE_LOCATIONS.length + + SERVLET_RESOURCE_LOCATIONS.length]; System.arraycopy(SERVLET_RESOURCE_LOCATIONS, 0, RESOURCE_LOCATIONS, 0, SERVLET_RESOURCE_LOCATIONS.length); System.arraycopy(CLASSPATH_RESOURCE_LOCATIONS, 0, RESOURCE_LOCATIONS, diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersGrailsPlugin.groovy b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersGrailsPlugin.groovy index 61d12d9581c..f4e3ba512b0 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersGrailsPlugin.groovy +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/ControllersGrailsPlugin.groovy @@ -18,20 +18,22 @@ */ package org.grails.plugins.web.controllers +import groovy.util.logging.Slf4j + +import org.springframework.beans.factory.support.AbstractBeanDefinition +import org.springframework.context.ApplicationContext +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter +import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping + import grails.config.Settings import grails.core.GrailsControllerClass import grails.plugins.Plugin import grails.util.GrailsUtil -import groovy.util.logging.Slf4j import org.grails.core.artefact.ControllerArtefactHandler import org.grails.plugins.web.servlet.context.BootStrapClassRunner import org.grails.web.errors.GrailsExceptionResolver import org.grails.web.servlet.mvc.TokenResponseActionResultTransformer import org.grails.web.servlet.view.CompositeViewResolver -import org.springframework.beans.factory.support.AbstractBeanDefinition -import org.springframework.context.ApplicationContext -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter -import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping /** * Handles the configuration of controllers for Grails. @@ -43,85 +45,85 @@ import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandl class ControllersGrailsPlugin extends Plugin { def watchedResources = [ - "file:./grails-app/controllers/**/*Controller.groovy", - "file:./plugins/*/grails-app/controllers/**/*Controller.groovy"] + 'file:./grails-app/controllers/**/*Controller.groovy', + 'file:./plugins/*/grails-app/controllers/**/*Controller.groovy'] def version = GrailsUtil.getGrailsVersion() def observe = ['domainClass'] def dependsOn = [core: version, i18n: version, urlMappings: version] @Override - Closure doWithSpring(){ { -> - def application = grailsApplication - def config = application.config + Closure doWithSpring() { + { -> + def application = grailsApplication + def config = application.config - boolean useJsessionId = config.getProperty(Settings.GRAILS_VIEWS_ENABLE_JSESSIONID, Boolean, false) + boolean useJsessionId = config.getProperty(Settings.GRAILS_VIEWS_ENABLE_JSESSIONID, Boolean, false) - if (!Boolean.parseBoolean(System.getProperty(Settings.SETTING_SKIP_BOOTSTRAP))) { - bootStrapClassRunner(BootStrapClassRunner) - } + if (!Boolean.parseBoolean(System.getProperty(Settings.SETTING_SKIP_BOOTSTRAP))) { + bootStrapClassRunner(BootStrapClassRunner) + } - tokenResponseActionResultTransformer(TokenResponseActionResultTransformer) + tokenResponseActionResultTransformer(TokenResponseActionResultTransformer) - exceptionHandler(GrailsExceptionResolver) { - exceptionMappings = ['java.lang.Exception': '/error'] - } + exceptionHandler(GrailsExceptionResolver) { + exceptionMappings = ['java.lang.Exception': '/error'] + } - "${CompositeViewResolver.BEAN_NAME}"(CompositeViewResolver) + "${CompositeViewResolver.BEAN_NAME}"(CompositeViewResolver) - def handlerInterceptors = springConfig.containsBean("localeChangeInterceptor") ? [ref("localeChangeInterceptor")] : [] - def interceptorsClosure = { - interceptors = handlerInterceptors - } - // allow @Controller annotated beans - annotationHandlerMapping(RequestMappingHandlerMapping, interceptorsClosure) - annotationHandlerAdapter(RequestMappingHandlerAdapter) - - for (controller in application.getArtefacts(ControllerArtefactHandler.TYPE)) { - log.debug "Configuring controller $controller.fullName" - if (controller.available) { - def lazyInit = controller.hasProperty("lazyInit") ? controller.getPropertyValue("lazyInit") : true - "${controller.fullName}"(controller.clazz) { bean -> - bean.lazyInit = lazyInit - def beanScope = controller.getScope() - bean.scope = beanScope - bean.autowire = "byName" - if (beanScope == 'prototype') { - bean.beanDefinition.dependencyCheck = AbstractBeanDefinition.DEPENDENCY_CHECK_NONE - } - if (useJsessionId) { - useJessionId = useJsessionId + def handlerInterceptors = springConfig.containsBean('localeChangeInterceptor') ? [ref('localeChangeInterceptor')] : [] + def interceptorsClosure = { + interceptors = handlerInterceptors + } + // allow @Controller annotated beans + annotationHandlerMapping(RequestMappingHandlerMapping, interceptorsClosure) + annotationHandlerAdapter(RequestMappingHandlerAdapter) + + for (controller in application.getArtefacts(ControllerArtefactHandler.TYPE)) { + log.debug('Configuring controller {}', controller.fullName) + if (controller.available) { + def lazyInit = controller.hasProperty('lazyInit') ? controller.getPropertyValue('lazyInit') : true + "${controller.fullName}"(controller.clazz) { bean -> + bean.lazyInit = lazyInit + def beanScope = controller.getScope() + bean.scope = beanScope + bean.autowire = 'byName' + if (beanScope == 'prototype') { + bean.beanDefinition.dependencyCheck = AbstractBeanDefinition.DEPENDENCY_CHECK_NONE + } + if (useJsessionId) { + useJessionId = useJsessionId + } } } } - } - if (config.getProperty(Settings.SETTING_LEGACY_JSON_BUILDER, Boolean.class, false)) { - log.warn("'grails.json.legacy.builder' is set to TRUE but is NOT supported in this version of Grails.") + if (config.getProperty(Settings.SETTING_LEGACY_JSON_BUILDER, Boolean, false)) { + log.warn("'grails.json.legacy.builder' is set to TRUE but is NOT supported in this version of Grails.") + } } - } } + } @Override - void onChange( Map event) { + void onChange(Map event) { if (!(event.source instanceof Class)) { return } def application = grailsApplication - if (application.isArtefactOfType(ControllerArtefactHandler.TYPE, (Class)event.source)) { + if (application.isArtefactOfType(ControllerArtefactHandler.TYPE, (Class) event.source)) { ApplicationContext context = applicationContext if (!context) { - if (log.isDebugEnabled()) { - log.debug("Application context not found. Can't reload") - } + log.debug("Application context not found. Can't reload") return } - GrailsControllerClass controllerClass = (GrailsControllerClass)application.addArtefact(ControllerArtefactHandler.TYPE, (Class)event.source) + GrailsControllerClass controllerClass = (GrailsControllerClass) application.addArtefact(ControllerArtefactHandler.TYPE, (Class)event.source) beans { "${controllerClass.fullName}"(controllerClass.clazz) { bean -> def beanScope = controllerClass.getScope() bean.scope = beanScope - bean.autowire = "byName" + bean.autowire = 'byName' if (beanScope == 'prototype') { bean.beanDefinition.dependencyCheck = AbstractBeanDefinition.DEPENDENCY_CHECK_NONE } diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/DefaultControllerExceptionHandlerMetaData.groovy b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/DefaultControllerExceptionHandlerMetaData.groovy index 05a86ae91c8..e86f8caa8bb 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/DefaultControllerExceptionHandlerMetaData.groovy +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/DefaultControllerExceptionHandlerMetaData.groovy @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.grails.plugins.web.controllers; +package org.grails.plugins.web.controllers import groovy.transform.Immutable @@ -28,6 +28,7 @@ import groovy.transform.Immutable */ @Immutable(knownImmutableClasses = [Class]) class DefaultControllerExceptionHandlerMetaData implements ControllerExceptionHandlerMetaData { + String methodName Class exceptionType } diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/api/ControllersDomainBindingApi.java b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/api/ControllersDomainBindingApi.java index b60cd2d3d1a..9aad4693e15 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/api/ControllersDomainBindingApi.java +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/api/ControllersDomainBindingApi.java @@ -18,16 +18,17 @@ */ package org.grails.plugins.web.controllers.api; +import java.util.Map; + +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.ApplicationContext; + import grails.core.GrailsApplication; import grails.util.Environment; import grails.util.Holders; import grails.web.databinding.DataBindingUtils; import org.grails.core.exceptions.GrailsConfigurationException; import org.grails.datastore.mapping.model.PersistentEntity; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.context.ApplicationContext; - -import java.util.Map; /** * Enhancements made to domain classes for data binding. @@ -40,7 +41,6 @@ public class ControllersDomainBindingApi { public static final String AUTOWIRE_DOMAIN_METHOD = "autowireDomain"; - /** * Autowires the instance * @@ -70,7 +70,7 @@ public static void initialize(Object instance, Map namedArgs) { private static PersistentEntity getDomainClass(Object instance) { PersistentEntity domainClass = null; - if(!Environment.isInitializing()) { + if (!Environment.isInitializing()) { final GrailsApplication grailsApplication = Holders.findApplication(); if (grailsApplication != null) { try { @@ -85,14 +85,14 @@ private static PersistentEntity getDomainClass(Object instance) { } private static void autowire(Object instance) { - if(!Environment.isInitializing()) { + if (!Environment.isInitializing()) { GrailsApplication application = Holders.findApplication(); - if(application != null) { + if (application != null) { try { PersistentEntity domainClass = application.getMappingContext().getPersistentEntity(instance.getClass().getName()); - if(domainClass != null) { + if (domainClass != null) { if (domainClass.getMapping().getMappedForm().isAutowire()) { final ApplicationContext applicationContext = Holders.findApplicationContext(); diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/RenderDynamicMethod.java b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/RenderDynamicMethod.java index d974706c559..c286fcfdb4b 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/RenderDynamicMethod.java +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/controllers/metaclass/RenderDynamicMethod.java @@ -24,7 +24,7 @@ * @author Graeme Rocher * @since 0.2 */ -@SuppressWarnings({"unchecked","rawtypes"}) +@SuppressWarnings({"unchecked", "rawtypes"}) public class RenderDynamicMethod { public static final String METHOD_SIGNATURE = "render"; public static final String ARGUMENT_TEXT = "text"; diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/context/BootStrapClassRunner.groovy b/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/context/BootStrapClassRunner.groovy index 87ba7989838..e1d640b9cee 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/context/BootStrapClassRunner.groovy +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/context/BootStrapClassRunner.groovy @@ -18,6 +18,16 @@ */ package org.grails.plugins.web.servlet.context +import groovy.transform.CompileStatic +import groovy.util.logging.Slf4j + +import jakarta.servlet.ServletContext + +import org.springframework.context.ApplicationContext +import org.springframework.context.ApplicationContextAware +import org.springframework.web.context.ServletContextAware +import org.springframework.web.context.WebApplicationContext + import grails.core.GrailsApplication import grails.core.GrailsApplicationLifeCycleAdapter import grails.core.GrailsClass @@ -25,18 +35,8 @@ import grails.core.support.GrailsApplicationAware import grails.plugins.GrailsPluginManager import grails.plugins.PluginManagerAware import grails.web.servlet.bootstrap.GrailsBootstrapClass -import groovy.transform.CompileStatic -import groovy.util.logging.Commons import org.grails.web.servlet.boostrap.BootstrapArtefactHandler import org.grails.web.servlet.context.GrailsConfigUtils -import org.springframework.context.ApplicationContext -import org.springframework.context.ApplicationContextAware -import org.springframework.web.context.ServletContextAware -import org.springframework.web.context.WebApplicationContext - -import jakarta.servlet.ServletContext - - /** * Runs the BootStrap classes on startup @@ -45,7 +45,7 @@ import jakarta.servlet.ServletContext * @since 3.0 */ @CompileStatic -@Commons +@Slf4j class BootStrapClassRunner extends GrailsApplicationLifeCycleAdapter implements GrailsApplicationAware, ServletContextAware, ApplicationContextAware, PluginManagerAware { GrailsApplication grailsApplication @@ -55,19 +55,19 @@ class BootStrapClassRunner extends GrailsApplicationLifeCycleAdapter implements @Override void onStartup(Map event) { - if(grailsApplication && applicationContext && servletContext) { - GrailsConfigUtils.executeGrailsBootstraps(grailsApplication, (WebApplicationContext)applicationContext, servletContext, pluginManager ) + if (grailsApplication && applicationContext && servletContext) { + GrailsConfigUtils.executeGrailsBootstraps(grailsApplication, (WebApplicationContext) applicationContext, servletContext, pluginManager) } } @Override void onShutdown(Map event) { - if(grailsApplication && applicationContext) { - for(GrailsClass cls in grailsApplication.getArtefacts(BootstrapArtefactHandler.TYPE)) { + if (grailsApplication && applicationContext) { + for (GrailsClass cls in grailsApplication.getArtefacts(BootstrapArtefactHandler.TYPE)) { try { - ((GrailsBootstrapClass)cls).callDestroy() + ((GrailsBootstrapClass) cls).callDestroy() } catch (Throwable e) { - log.error("Error occurred running Bootstrap destroy method: " + e.getMessage(), e) + log.error('Error occurred running Bootstrap destroy method: ' + e.getMessage(), e) } } } diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/InvalidResponseHandler.groovy b/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/InvalidResponseHandler.groovy index 7909be12116..ee97adbd4ca 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/InvalidResponseHandler.groovy +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/InvalidResponseHandler.groovy @@ -20,6 +20,7 @@ package org.grails.plugins.web.servlet.mvc import groovy.transform.CompileStatic + import org.grails.web.servlet.mvc.AbstractTokenResponseHandler /** diff --git a/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/ValidResponseHandler.groovy b/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/ValidResponseHandler.groovy index f211faae7a5..74dcf7032c5 100644 --- a/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/ValidResponseHandler.groovy +++ b/grails-controllers/src/main/groovy/org/grails/plugins/web/servlet/mvc/ValidResponseHandler.groovy @@ -19,8 +19,8 @@ package org.grails.plugins.web.servlet.mvc import groovy.transform.CompileStatic -import org.grails.web.servlet.mvc.AbstractTokenResponseHandler +import org.grails.web.servlet.mvc.AbstractTokenResponseHandler /** * Handles a valid token response. See {@link org.grails.web.servlet.mvc.TokenResponseHandler} diff --git a/grails-converters/src/main/groovy/grails/converters/JSON.java b/grails-converters/src/main/groovy/grails/converters/JSON.java index 5dee9f7ea30..ae978190b44 100644 --- a/grails-converters/src/main/groovy/grails/converters/JSON.java +++ b/grails-converters/src/main/groovy/grails/converters/JSON.java @@ -18,13 +18,29 @@ */ package grails.converters; -import grails.io.IOUtils; -import grails.util.GrailsWebUtil; -import grails.web.mime.MimeType; +import java.io.IOException; +import java.io.InputStream; +import java.io.PushbackInputStream; +import java.io.Reader; +import java.io.Writer; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Stack; + import groovy.lang.Closure; import groovy.util.BuilderSupport; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + +import grails.io.IOUtils; +import grails.util.GrailsWebUtil; +import grails.web.mime.MimeType; import org.grails.web.converters.AbstractConverter; import org.grails.web.converters.Converter; import org.grails.web.converters.ConverterUtil; @@ -35,12 +51,14 @@ import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ClosureObjectMarshaller; import org.grails.web.converters.marshaller.ObjectMarshaller; -import org.grails.web.json.*; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; -import java.io.*; -import java.util.*; +import org.grails.web.json.JSONArray; +import org.grails.web.json.JSONElement; +import org.grails.web.json.JSONException; +import org.grails.web.json.JSONObject; +import org.grails.web.json.JSONTokener; +import org.grails.web.json.JSONWriter; +import org.grails.web.json.PathCapturingJSONWriterWrapper; +import org.grails.web.json.PrettyPrintJSONWriter; /** * A converter that converts domain classes, Maps, Lists, Arrays, POJOs and POGOs to JSON. @@ -165,12 +183,12 @@ else if (o instanceof CharSequence) { writer.value(o); } else if (o instanceof Class) { - writer.value(((Class)o).getName()); + writer.value(((Class) o).getName()); } else if (o instanceof Number) { - writer.value((Number)o); + writer.value((Number) o); } else if (o instanceof Boolean) { - writer.value((Boolean)o); + writer.value((Boolean) o); } else if (o.getClass().isPrimitive() && !o.getClass().equals(byte[].class)) { writer.value(o); } @@ -273,7 +291,7 @@ public static JSONElement parse(String source) throws ConverterException { * @throws ConverterException when the JSON content is not valid */ public static JSONElement parse(InputStream is, String encoding) throws ConverterException { - return parse(IOUtils.toString(is, encoding)); + return parse(IOUtils.toString(is, encoding)); } /** @@ -334,7 +352,7 @@ protected void handleCircularRelationship(Object o) throws ConverterException { final boolean isCollection = Collection.class.isAssignableFrom(o.getClass()); final boolean isMap = Map.class.isAssignableFrom(o.getClass()); if (!(isMap || isCollection)) { - Map props = new HashMap(); + Map props = new HashMap<>(); props.put("class", o.getClass()); StringBuilder ref = new StringBuilder(); int idx = referenceStack.indexOf(o); @@ -345,7 +363,7 @@ protected void handleCircularRelationship(Object o) throws ConverterException { value(props); } else { - if(isMap) { + if (isMap) { writer.object(); writer.endObject(); } else { @@ -359,7 +377,7 @@ protected void handleCircularRelationship(Object o) throws ConverterException { value(null); break; case PATH: - Map props = new HashMap(); + Map props = new HashMap<>(); props.put("class", o.getClass()); int idx = referenceStack.indexOf(o); PathCapturingJSONWriterWrapper pcWriter = (PathCapturingJSONWriterWrapper) writer; @@ -401,11 +419,11 @@ public static void use(String cfgName) throws ConverterException { } public static void registerObjectMarshaller(Class clazz, Closure callable) throws ConverterException { - registerObjectMarshaller(new ClosureObjectMarshaller(clazz, callable)); + registerObjectMarshaller(new ClosureObjectMarshaller<>(clazz, callable)); } public static void registerObjectMarshaller(Class clazz, int priority, Closure callable) throws ConverterException { - registerObjectMarshaller(new ClosureObjectMarshaller(clazz, callable), priority); + registerObjectMarshaller(new ClosureObjectMarshaller<>(clazz, callable), priority); } public static void registerObjectMarshaller(ObjectMarshaller om) throws ConverterException { @@ -414,7 +432,7 @@ public static void registerObjectMarshaller(ObjectMarshaller om) throws Co throw new ConverterException("Default Configuration not found for class " + JSON.class.getName()); } if (!(cfg instanceof DefaultConverterConfiguration)) { - cfg = new DefaultConverterConfiguration(cfg); + cfg = new DefaultConverterConfiguration<>(cfg); ConvertersConfigurationHolder.setDefaultConfiguration(JSON.class, cfg); } ((DefaultConverterConfiguration) cfg).registerObjectMarshaller(om); @@ -426,14 +444,14 @@ public static void registerObjectMarshaller(ObjectMarshaller om, int prior throw new ConverterException("Default Configuration not found for class " + JSON.class.getName()); } if (!(cfg instanceof DefaultConverterConfiguration)) { - cfg = new DefaultConverterConfiguration(cfg); + cfg = new DefaultConverterConfiguration<>(cfg); ConvertersConfigurationHolder.setDefaultConfiguration(JSON.class, cfg); } ((DefaultConverterConfiguration) cfg).registerObjectMarshaller(om, priority); } public static void createNamedConfig(String name, Closure callable) throws ConverterException { - DefaultConverterConfiguration cfg = new DefaultConverterConfiguration(ConvertersConfigurationHolder.getConverterConfiguration(JSON.class)); + DefaultConverterConfiguration cfg = new DefaultConverterConfiguration<>(ConvertersConfigurationHolder.getConverterConfiguration(JSON.class)); try { callable.call(cfg); ConvertersConfigurationHolder.setNamedConverterConfiguration(JSON.class, name, cfg); @@ -446,7 +464,7 @@ public static void createNamedConfig(String name, Closure callable) throws Co public static void withDefaultConfiguration(Closure callable) throws ConverterException { ConverterConfiguration cfg = ConvertersConfigurationHolder.getConverterConfiguration(JSON.class); if (!(cfg instanceof DefaultConverterConfiguration)) { - cfg = new DefaultConverterConfiguration(cfg); + cfg = new DefaultConverterConfiguration<>(cfg); } try { callable.call(cfg); @@ -479,11 +497,11 @@ public Builder(JSON json) { public void execute(Closure callable) { callable.setDelegate(this); -// callable.setDelegate(Closure.DELEGATE_FIRST); + // callable.setDelegate(Closure.DELEGATE_FIRST); invokeMethod("json", new Object[] { callable }); } - private Stack stack = new Stack(); + private Stack stack = new Stack<>(); private boolean start = true; private JSONWriter writer; @@ -524,7 +542,7 @@ protected Object createNode(Object key, Map valueMap) { writer.object(); for (Object o : valueMap.entrySet()) { Map.Entry element = (Map.Entry) o; - writer.key(String.valueOf(element.getKey()));//.value(element.getValue()); + writer.key(String.valueOf(element.getKey())); //.value(element.getValue()); json.convertAnother(element.getValue()); } writer.endObject(); @@ -544,7 +562,7 @@ protected Object createNode(Object arg0, Map arg1, Object arg2) { @SuppressWarnings("rawtypes") @Override protected Object createNode(Object key, Object value) { - if (getCurrent() == null && stack.peek()== BuilderMode.OBJECT) { + if (getCurrent() == null && stack.peek() == BuilderMode.OBJECT) { throw new IllegalArgumentException("only call to [element { }] is allowed when creating array"); } @@ -555,7 +573,7 @@ protected Object createNode(Object key, Object value) { retVal = 1; } if (value instanceof Collection) { - Collection c = (Collection)value; + Collection c = (Collection) value; writer.key(String.valueOf(key)); handleCollectionRecurse(c); } @@ -593,7 +611,7 @@ protected void nodeCompleted(Object parent, Object node) { } try { - int i = ((Integer)node); + int i = ((Integer) node); while (i-- > 0) { last = stack.pop(); if (BuilderMode.ARRAY == last) { diff --git a/grails-converters/src/main/groovy/grails/converters/XML.java b/grails-converters/src/main/groovy/grails/converters/XML.java index 1a024e518e6..5679d4212eb 100644 --- a/grails-converters/src/main/groovy/grails/converters/XML.java +++ b/grails-converters/src/main/groovy/grails/converters/XML.java @@ -18,18 +18,31 @@ */ package grails.converters; -import grails.util.GrailsNameUtils; -import grails.util.GrailsWebUtil; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Writer; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Stack; + import groovy.lang.Closure; import groovy.util.BuilderSupport; +import jakarta.servlet.http.HttpServletRequest; +import jakarta.servlet.http.HttpServletResponse; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.springframework.util.Assert; + import grails.core.support.proxy.EntityProxyHandler; import grails.core.support.proxy.ProxyHandler; +import grails.util.GrailsNameUtils; +import grails.util.GrailsWebUtil; import grails.web.mime.MimeType; - import org.grails.buffer.FastStringWriter; import org.grails.web.converters.AbstractConverter; import org.grails.web.converters.Converter; @@ -45,19 +58,6 @@ import org.grails.web.xml.PrettyPrintXMLStreamWriter; import org.grails.web.xml.StreamingMarkupWriter; import org.grails.web.xml.XMLStreamWriter; -import org.springframework.util.Assert; - -import jakarta.servlet.http.HttpServletRequest; -import jakarta.servlet.http.HttpServletResponse; - -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Writer; -import java.util.List; -import java.util.Map; -import java.util.Optional; -import java.util.Stack; import static org.grails.io.support.SpringIOUtils.createXmlSlurper; @@ -123,7 +123,7 @@ private void finalizeRender(Writer out) { public void render(Writer out) throws ConverterException { stream = new StreamingMarkupWriter(out, encoding); - writer = config.isPrettyPrint() ? new PrettyPrintXMLStreamWriter(stream): new XMLStreamWriter(stream); + writer = config.isPrettyPrint() ? new PrettyPrintXMLStreamWriter(stream) : new XMLStreamWriter(stream); try { isRendering = true; @@ -169,7 +169,7 @@ public void convertAnother(Object o) throws ConverterException { writer.characters(o.toString()); } else if (o instanceof Class) { - writer.characters(((Class)o).getName()); + writer.characters(((Class) o).getName()); } else if ((o.getClass().isPrimitive() && !o.getClass().equals(byte[].class)) || o instanceof Number || o instanceof Boolean) { diff --git a/grails-converters/src/main/groovy/grails/encoders/JSONEncoder.java b/grails-converters/src/main/groovy/grails/encoders/JSONEncoder.java index bb3b3f33bdf..f0061742285 100644 --- a/grails-converters/src/main/groovy/grails/encoders/JSONEncoder.java +++ b/grails-converters/src/main/groovy/grails/encoders/JSONEncoder.java @@ -25,7 +25,7 @@ public class JSONEncoder extends BasicJSONEncoder { @Override protected Object encodeAsJsonObject(Object o) { - if(o instanceof JSON) { + if (o instanceof JSON) { return o; } else { return new JSON(o); diff --git a/grails-converters/src/main/groovy/grails/encoders/XMLEncoder.java b/grails-converters/src/main/groovy/grails/encoders/XMLEncoder.java index b3cb78a750a..d35c2286c80 100644 --- a/grails-converters/src/main/groovy/grails/encoders/XMLEncoder.java +++ b/grails-converters/src/main/groovy/grails/encoders/XMLEncoder.java @@ -25,7 +25,7 @@ public class XMLEncoder extends BasicXMLEncoder { @Override protected Object encodeAsXmlObject(Object o) { - if(o instanceof XML) { + if (o instanceof XML) { return o; } else { return new XML(o); diff --git a/grails-converters/src/main/groovy/grails/web/JSONBuilder.groovy b/grails-converters/src/main/groovy/grails/web/JSONBuilder.groovy index 7ff517a8ec0..96b14d4ea57 100644 --- a/grails-converters/src/main/groovy/grails/web/JSONBuilder.groovy +++ b/grails-converters/src/main/groovy/grails/web/JSONBuilder.groovy @@ -32,7 +32,7 @@ import grails.converters.JSON @Deprecated class JSONBuilder { - static NODE_ELEMENT = "element" + static NODE_ELEMENT = 'element' def root diff --git a/grails-converters/src/main/groovy/org/grails/compiler/web/converters/ConvertersDomainTransformer.java b/grails-converters/src/main/groovy/org/grails/compiler/web/converters/ConvertersDomainTransformer.java index c49f938979d..d8604613b50 100644 --- a/grails-converters/src/main/groovy/org/grails/compiler/web/converters/ConvertersDomainTransformer.java +++ b/grails-converters/src/main/groovy/org/grails/compiler/web/converters/ConvertersDomainTransformer.java @@ -18,14 +18,14 @@ */ package org.grails.compiler.web.converters; +import java.net.URL; + import grails.compiler.ast.AstTransformer; import org.grails.compiler.injection.AbstractGrailsArtefactTransformer; import org.grails.core.artefact.DomainClassArtefactHandler; import org.grails.io.support.GrailsResourceUtils; import org.grails.plugins.converters.api.ConvertersApi; -import java.net.URL; - /** * Adds the asType method to domain classes. * @@ -33,7 +33,7 @@ * @since 2.0 */ @AstTransformer -public class ConvertersDomainTransformer extends AbstractGrailsArtefactTransformer{ +public class ConvertersDomainTransformer extends AbstractGrailsArtefactTransformer { @Override public String getArtefactType() { diff --git a/grails-converters/src/main/groovy/org/grails/compiler/web/converters/RenderConverterTrait.groovy b/grails-converters/src/main/groovy/org/grails/compiler/web/converters/RenderConverterTrait.groovy index d75a6533361..de02ad7f52d 100644 --- a/grails-converters/src/main/groovy/org/grails/compiler/web/converters/RenderConverterTrait.groovy +++ b/grails-converters/src/main/groovy/org/grails/compiler/web/converters/RenderConverterTrait.groovy @@ -19,15 +19,17 @@ package org.grails.compiler.web.converters -import grails.artefact.Enhances import groovy.transform.Generated -import org.grails.web.converters.Converter -import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.web.context.request.RequestContextHolder import jakarta.servlet.http.HttpServletResponse -@Enhances(["Controller", "Interceptor"]) +import org.springframework.web.context.request.RequestContextHolder + +import grails.artefact.Enhances +import org.grails.web.converters.Converter +import org.grails.web.servlet.mvc.GrailsWebRequest + +@Enhances(['Controller', 'Interceptor']) trait RenderConverterTrait { /** @@ -37,9 +39,9 @@ trait RenderConverterTrait { */ @Generated void render(Converter converter) { - GrailsWebRequest webRequest = (GrailsWebRequest)RequestContextHolder.currentRequestAttributes() + GrailsWebRequest webRequest = (GrailsWebRequest) RequestContextHolder.currentRequestAttributes() HttpServletResponse response = webRequest.currentResponse webRequest.renderView = false - converter.render response + converter.render(response) } } diff --git a/grails-converters/src/main/groovy/org/grails/plugins/codecs/JSONCodec.java b/grails-converters/src/main/groovy/org/grails/plugins/codecs/JSONCodec.java index e63ecbb4a98..8f8fb8007ba 100644 --- a/grails-converters/src/main/groovy/org/grails/plugins/codecs/JSONCodec.java +++ b/grails-converters/src/main/groovy/org/grails/plugins/codecs/JSONCodec.java @@ -19,8 +19,8 @@ package org.grails.plugins.codecs; -import org.grails.encoder.impl.JSONCodecFactory; import grails.encoders.JSONEncoder; +import org.grails.encoder.impl.JSONCodecFactory; /** * A codec that encodes strings to JSON diff --git a/grails-converters/src/main/groovy/org/grails/plugins/codecs/XMLCodec.java b/grails-converters/src/main/groovy/org/grails/plugins/codecs/XMLCodec.java index aef0d81bb23..8f797390a2c 100644 --- a/grails-converters/src/main/groovy/org/grails/plugins/codecs/XMLCodec.java +++ b/grails-converters/src/main/groovy/org/grails/plugins/codecs/XMLCodec.java @@ -19,8 +19,8 @@ package org.grails.plugins.codecs; -import org.grails.encoder.impl.XMLCodecFactory; import grails.encoders.XMLEncoder; +import org.grails.encoder.impl.XMLCodecFactory; /** * Escapes some characters for inclusion in XML documents. The decoder part can diff --git a/grails-converters/src/main/groovy/org/grails/plugins/converters/ConvertersGrailsPlugin.groovy b/grails-converters/src/main/groovy/org/grails/plugins/converters/ConvertersGrailsPlugin.groovy index a84d32348d4..89a3a7cfa4a 100644 --- a/grails-converters/src/main/groovy/org/grails/plugins/converters/ConvertersGrailsPlugin.groovy +++ b/grails-converters/src/main/groovy/org/grails/plugins/converters/ConvertersGrailsPlugin.groovy @@ -20,8 +20,6 @@ package org.grails.plugins.converters import grails.converters.JSON import grails.converters.XML -import grails.core.GrailsApplication -import grails.core.support.GrailsApplicationAware import grails.plugins.Plugin import grails.util.GrailsUtil import org.grails.plugins.codecs.JSONCodec @@ -42,7 +40,7 @@ import org.grails.web.converters.marshaller.xml.ValidationErrorsMarshaller as Xm class ConvertersGrailsPlugin extends Plugin { def version = GrailsUtil.getGrailsVersion() - def observe = ["controllers"] + def observe = ['controllers'] def dependsOn = [controllers: version, domainClass: version] def providedArtefacts = [ JSONCodec, @@ -50,21 +48,23 @@ class ConvertersGrailsPlugin extends Plugin { ] @Override - Closure doWithSpring() {{-> - jsonErrorsMarshaller(JsonErrorsMarshaller) + Closure doWithSpring() { + { -> + jsonErrorsMarshaller(JsonErrorsMarshaller) - xmlErrorsMarshaller(XmlErrorsMarshaller) + xmlErrorsMarshaller(XmlErrorsMarshaller) - convertersConfigurationInitializer(ConvertersConfigurationInitializer) + convertersConfigurationInitializer(ConvertersConfigurationInitializer) - errorsXmlMarshallerRegisterer(ObjectMarshallerRegisterer) { - marshaller = { XmlErrorsMarshaller om -> } - converterClass = XML - } + errorsXmlMarshallerRegisterer(ObjectMarshallerRegisterer) { + marshaller = { XmlErrorsMarshaller om -> } + converterClass = XML + } - errorsJsonMarshallerRegisterer(ObjectMarshallerRegisterer) { - marshaller = { JsonErrorsMarshaller om -> } - converterClass = JSON + errorsJsonMarshallerRegisterer(ObjectMarshallerRegisterer) { + marshaller = { JsonErrorsMarshaller om -> } + converterClass = JSON + } } - }} + } } diff --git a/grails-converters/src/main/groovy/org/grails/plugins/converters/api/ConvertersApi.java b/grails-converters/src/main/groovy/org/grails/plugins/converters/api/ConvertersApi.java index 0954b7c9dbe..05d32d837c2 100644 --- a/grails-converters/src/main/groovy/org/grails/plugins/converters/api/ConvertersApi.java +++ b/grails-converters/src/main/groovy/org/grails/plugins/converters/api/ConvertersApi.java @@ -18,12 +18,13 @@ */ package org.grails.plugins.converters.api; -import org.grails.web.converters.ConverterUtil; -import org.grails.web.servlet.mvc.GrailsWebRequest; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.grails.web.converters.ConverterUtil; +import org.grails.web.servlet.mvc.GrailsWebRequest; + /** * The API for converting objects to target types such as XML. * @@ -59,6 +60,6 @@ public ApplicationContext getApplicationContext() { } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext =applicationContext; + this.applicationContext = applicationContext; } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/AbstractConverter.java b/grails-converters/src/main/groovy/org/grails/web/converters/AbstractConverter.java index 42f69dea681..2edd7e70a2b 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/AbstractConverter.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/AbstractConverter.java @@ -18,17 +18,19 @@ */ package org.grails.web.converters; -import groovy.lang.Writable; -import org.grails.buffer.FastStringWriter; -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; - import java.io.IOException; import java.io.Writer; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import groovy.lang.Writable; + +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; + +import org.grails.buffer.FastStringWriter; + /** * Abstract base implementation of the Converter interface that provides a default toString() implementation. * @@ -39,8 +41,8 @@ public abstract class AbstractConverter implements ConfigurableConverter, protected String contentType; protected String encoding = "UTF-8"; - protected Map> includes = new LinkedHashMap>(); - protected Map> excludes = new LinkedHashMap>(); + protected Map> includes = new LinkedHashMap<>(); + protected Map> excludes = new LinkedHashMap<>(); public abstract void setTarget(Object target); diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/AbstractParsingParameterCreationListener.groovy b/grails-converters/src/main/groovy/org/grails/web/converters/AbstractParsingParameterCreationListener.groovy index 4a5ddc14074..90ff4df0411 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/AbstractParsingParameterCreationListener.groovy +++ b/grails-converters/src/main/groovy/org/grails/web/converters/AbstractParsingParameterCreationListener.groovy @@ -32,13 +32,13 @@ abstract class AbstractParsingParameterCreationListener implements ParameterCrea * Populates the target map with current map using the root map to form a nested prefix * so that a hierarchy of maps is flattened. */ - protected createFlattenedKeys(Map root, Map current, Map target, prefix ='', Map previousParent = null) { + protected createFlattenedKeys(Map root, Map current, Map target, prefix = '', Map previousParent = null) { for (entry in current) { if (entry.value instanceof Map) { def childEntry = entry.key def targetParent = previousParent != null ? previousParent : target targetParent[childEntry] = [:] - createFlattenedKeys(root,entry.value, target, "$prefix${childEntry}.",targetParent[childEntry]) + createFlattenedKeys(root, entry.value, target, "$prefix${childEntry}.", targetParent[childEntry]) } else if (prefix) { if (entry.value instanceof Collection) { diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/ConfigurableConverter.groovy b/grails-converters/src/main/groovy/org/grails/web/converters/ConfigurableConverter.groovy index 70ac8040652..4431c2bfb62 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/ConfigurableConverter.groovy +++ b/grails-converters/src/main/groovy/org/grails/web/converters/ConfigurableConverter.groovy @@ -24,7 +24,8 @@ package org.grails.web.converters * @author Graeme Rocher * @since 2.3 */ -public interface ConfigurableConverter extends Converter{ +interface ConfigurableConverter extends Converter { + /** * Sets the content type of the converter * @param contentType The content type @@ -64,4 +65,4 @@ public interface ConfigurableConverter extends Converter{ * @return The includes */ List getIncludes(Class type) -} \ No newline at end of file +} diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/Converter.java b/grails-converters/src/main/groovy/org/grails/web/converters/Converter.java index c58bbc7b2eb..95560b328a6 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/Converter.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/Converter.java @@ -18,12 +18,12 @@ */ package org.grails.web.converters; -import groovy.lang.Closure; - import java.io.Writer; import java.util.ArrayList; import java.util.List; +import groovy.lang.Closure; + import jakarta.servlet.http.HttpServletResponse; import org.grails.web.converters.exceptions.ConverterException; @@ -73,7 +73,7 @@ enum CircularReferenceBehaviour { PATH; public static List allowedValues() { - List v = new ArrayList(); + List v = new ArrayList<>(); for (CircularReferenceBehaviour crb : values()) { v.add(crb.name()); } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/ConverterUtil.java b/grails-converters/src/main/groovy/org/grails/web/converters/ConverterUtil.java index 1f9e8a2e23a..c12ed7842d3 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/ConverterUtil.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/ConverterUtil.java @@ -18,25 +18,26 @@ */ package org.grails.web.converters; -import groovy.lang.Closure; - import java.io.File; import java.lang.reflect.Array; import java.lang.reflect.Constructor; import java.util.Collection; import java.util.Map; +import groovy.lang.Closure; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.codehaus.groovy.runtime.NullObject; import org.codehaus.groovy.runtime.ResourceGroovyMethods; import org.codehaus.groovy.runtime.StringGroovyMethods; import org.codehaus.groovy.runtime.typehandling.DefaultTypeTransformation; -import org.grails.web.converters.exceptions.ConverterException; + import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; +import org.grails.web.converters.exceptions.ConverterException; + /** * A utility class for creating and dealing with Converter objects. * @@ -58,7 +59,7 @@ public static BeanWrapper createBeanWrapper(Object o) { try { Class c = Class.forName(PERSISTENCE_BEAN_WRAPPER_CLASS, true, Thread.currentThread().getContextClassLoader()); Constructor init = c.getConstructor(new Class[]{Object.class}); - beanWrapper = (BeanWrapper)init.newInstance(new Object[]{o}); + beanWrapper = (BeanWrapper) init.newInstance(new Object[]{o}); } catch (Exception e) { beanWrapper = new BeanWrapperImpl(o); @@ -70,13 +71,13 @@ public static Object createConverter(Class converterClass, Object target) thr return createConverter(converterClass, target, null); } - public static T createConverter(Class converterClass, Object target, ApplicationContext applicationContext) throws ConverterException{ + public static T createConverter(Class converterClass, Object target, ApplicationContext applicationContext) throws ConverterException { try { T converter = converterClass.newInstance(); if (converter instanceof ApplicationContextAware && applicationContext != null) { - ((ApplicationContextAware)converter).setApplicationContext(applicationContext); + ((ApplicationContextAware) converter).setApplicationContext(applicationContext); } - ((AbstractConverter)converter).setTarget(target); + ((AbstractConverter) converter).setTarget(target); return converter; } catch (Exception e) { @@ -107,15 +108,15 @@ public static Object invokeOriginalAsTypeMethod(Object delegate, Class clazz) } if (delegate instanceof NullObject) { - return ((NullObject)delegate).asType(clazz); + return ((NullObject) delegate).asType(clazz); } if (delegate instanceof Collection && clazz.isArray()) { - int size = ((Collection)delegate).size(); + int size = ((Collection) delegate).size(); if (clazz.getComponentType() == Object.class) { if (size == 0) { return EMPTY_OBJECT_ARRAY; } - return ((Collection)delegate).toArray((Object[])Array.newInstance(clazz.getComponentType(), size)); + return ((Collection) delegate).toArray((Object[]) Array.newInstance(clazz.getComponentType(), size)); } if (size == 0) { return Array.newInstance(clazz.getComponentType(), 0); diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/ConvertersExtension.groovy b/grails-converters/src/main/groovy/org/grails/web/converters/ConvertersExtension.groovy index 7ff9b33d5a1..2217b762ff3 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/ConvertersExtension.groovy +++ b/grails-converters/src/main/groovy/org/grails/web/converters/ConvertersExtension.groovy @@ -18,15 +18,13 @@ */ package org.grails.web.converters -import grails.converters.JSON -import grails.converters.XML import groovy.transform.CompileStatic import jakarta.servlet.http.HttpServletRequest +import grails.converters.JSON +import grails.converters.XML import org.grails.web.servlet.mvc.GrailsWebRequest -import org.springframework.context.ApplicationContext - /** * @@ -40,7 +38,7 @@ import org.springframework.context.ApplicationContext */ @CompileStatic class ConvertersExtension { - + static getJSON(HttpServletRequest request) { JSON.parse(request) } @@ -48,19 +46,19 @@ class ConvertersExtension { static getXML(HttpServletRequest request) { XML.parse(request) } - + static T asType(instance, Class clazz) { if (ConverterUtil.isConverterClass(clazz)) { - return ConverterUtil.createConverter(clazz, - instance, + return ConverterUtil.createConverter(clazz, + instance, GrailsWebRequest.lookup()?.applicationContext) } else { - return (T)ConverterUtil.invokeOriginalAsTypeMethod(instance, clazz) + return (T) ConverterUtil.invokeOriginalAsTypeMethod(instance, clazz) } } - + static T asType(Object[] array, Class clazz) { - asType((Object)array, clazz) + asType((Object) array, clazz) } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/IncludeExcludeConverter.groovy b/grails-converters/src/main/groovy/org/grails/web/converters/IncludeExcludeConverter.groovy index b599d90872a..8a28dc87e89 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/IncludeExcludeConverter.groovy +++ b/grails-converters/src/main/groovy/org/grails/web/converters/IncludeExcludeConverter.groovy @@ -24,10 +24,10 @@ package org.grails.web.converters * @author Graeme Rocher * @since 2.3 */ -public interface IncludeExcludeConverter extends ConfigurableConverter { +interface IncludeExcludeConverter extends ConfigurableConverter { void setIncludes(List includes) void setExcludes(List excludes) -} \ No newline at end of file +} diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ChainedConverterConfiguration.java b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ChainedConverterConfiguration.java index 97e50f50a82..ac9bd04b692 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ChainedConverterConfiguration.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ChainedConverterConfiguration.java @@ -18,8 +18,6 @@ */ package org.grails.web.converters.configuration; -import grails.util.Environment; - import java.util.ArrayList; import java.util.Collections; import java.util.List; @@ -28,7 +26,7 @@ import grails.core.support.proxy.DefaultProxyHandler; import grails.core.support.proxy.ProxyHandler; - +import grails.util.Environment; import org.grails.web.converters.Converter; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; @@ -54,10 +52,11 @@ public class ChainedConverterConfiguration implements Conve private final boolean cacheObjectMarshallerByClass; private Map> objectMarshallerForClassCache; private final boolean developmentMode = Environment.isDevelopmentMode(); - private final ObjectMarshaller NULL_HOLDER=new ObjectMarshaller() { + private final ObjectMarshaller NULL_HOLDER = new ObjectMarshaller<>() { public boolean supports(Object object) { return false; } + public void marshalObject(Object object, C converter) throws ConverterException { } }; @@ -74,15 +73,15 @@ public ChainedConverterConfiguration(ConverterConfiguration cfg, ProxyHandler prettyPrint = cfg.isPrettyPrint(); cacheObjectMarshallerByClass = cfg.isCacheObjectMarshallerByClass(); if (cacheObjectMarshallerByClass) { - objectMarshallerForClassCache = new ConcurrentHashMap>(); + objectMarshallerForClassCache = new ConcurrentHashMap<>(); } circularReferenceBehaviour = cfg.getCircularReferenceBehaviour(); - List> oms = new ArrayList>(marshallerList); + List> oms = new ArrayList<>(marshallerList); Collections.reverse(oms); ChainedObjectMarshaller prev = null; for (ObjectMarshaller om : oms) { - prev = new ChainedObjectMarshaller(om, prev); + prev = new ChainedObjectMarshaller<>(om, prev); } root = prev; } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConverterConfiguration.java b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConverterConfiguration.java index 090c10e7f90..cf575e36988 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConverterConfiguration.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConverterConfiguration.java @@ -21,7 +21,6 @@ import java.util.List; import grails.core.support.proxy.ProxyHandler; - import org.grails.web.converters.Converter; import org.grails.web.converters.marshaller.ObjectMarshaller; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConvertersConfigurationHolder.java b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConvertersConfigurationHolder.java index 9861be904dd..6987ab2f12f 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConvertersConfigurationHolder.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConvertersConfigurationHolder.java @@ -35,7 +35,7 @@ * @author Siegfried Puchbauer * @since 1.1 */ -@SuppressWarnings({"unchecked","rawtypes"}) +@SuppressWarnings({"unchecked", "rawtypes"}) public class ConvertersConfigurationHolder { public static final String CONVERTERS_DEFAULT_ENCODING = "UTF-8"; @@ -51,18 +51,18 @@ public void run() { private static ConvertersConfigurationHolder INSTANCE = new ConvertersConfigurationHolder(); private final ConcurrentMap, ConverterConfiguration> defaultConfiguration = - new ConcurrentHashMap, ConverterConfiguration>(); + new ConcurrentHashMap<>(); private final ConcurrentMap, Map> namedConfigurations = - new ConcurrentHashMap, Map>(); + new ConcurrentHashMap<>(); private ThreadLocal, ConverterConfiguration>> threadLocalConfiguration = createThreadLocalConfiguration(); protected static ThreadLocal, ConverterConfiguration>> createThreadLocalConfiguration() { - return new ThreadLocal, ConverterConfiguration>>() { + return new ThreadLocal<>() { protected Map, ConverterConfiguration> initialValue() { - return new HashMap, ConverterConfiguration>(); - }; + return new HashMap<>(); + } }; } @@ -82,10 +82,10 @@ public static void setDefaultConfiguration(Class c, Con } public static void setDefaultConfiguration(Class c, List> om) { - getInstance().defaultConfiguration.put(c, new DefaultConverterConfiguration(om)); + getInstance().defaultConfiguration.put(c, new DefaultConverterConfiguration<>(om)); } - private static ConvertersConfigurationHolder getInstance() throws ConverterException{ + private static ConvertersConfigurationHolder getInstance() throws ConverterException { return INSTANCE; } @@ -96,7 +96,7 @@ public static ConverterConfiguration getConverterConfig if (cfg == null) { cfg = new DefaultConverterConfiguration(); ConverterConfiguration existing = getInstance().defaultConfiguration.putIfAbsent(converterClass, cfg); - if(existing != null) { + if (existing != null) { cfg = existing; } } @@ -124,13 +124,13 @@ public static void setNamedConverterConfiguration(Class private static Map getNamedConfigMapForConverter(Class clazz, boolean create) { Map namedConfigs = getInstance().namedConfigurations.get(clazz); if (namedConfigs == null && create) { - namedConfigs = new HashMap(); + namedConfigs = new HashMap<>(); getInstance().namedConfigurations.put(clazz, namedConfigs); } return namedConfigs; } public static void setNamedConverterConfiguration(Class converterClass, String name, List> om) throws ConverterException { - getNamedConfigMapForConverter(converterClass, true).put(name, new DefaultConverterConfiguration(om)); + getNamedConfigMapForConverter(converterClass, true).put(name, new DefaultConverterConfiguration<>(om)); } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConvertersConfigurationInitializer.java b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConvertersConfigurationInitializer.java index 43bb47951bd..a6c0051fb73 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConvertersConfigurationInitializer.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ConvertersConfigurationInitializer.java @@ -18,27 +18,28 @@ */ package org.grails.web.converters.configuration; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; + import grails.config.Config; -import org.grails.config.PropertySourcesConfig; import grails.converters.JSON; import grails.converters.XML; import grails.core.GrailsApplication; import grails.core.support.GrailsApplicationAware; import grails.core.support.proxy.DefaultProxyHandler; import grails.core.support.proxy.ProxyHandler; - -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; - -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import org.grails.config.PropertySourcesConfig; import org.grails.web.converters.Converter; import org.grails.web.converters.marshaller.ObjectMarshaller; import org.grails.web.converters.marshaller.ProxyUnwrappingMarshaller; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; /** * @author Siegfried Puchbauer @@ -56,7 +57,6 @@ public class ConvertersConfigurationInitializer implements ApplicationContextAwa public static final String SETTING_CONVERTERS_JSON_CACHE_OBJECTS = "grails.converters.json.cacheObjectMarshallerSelectionByClass"; public static final String SETTING_CONVERTERS_XML_DEEP = "grails.converters.xml.default.deep"; - private ApplicationContext applicationContext; private GrailsApplication grailsApplication; @@ -73,9 +73,9 @@ public void setApplicationContext(ApplicationContext applicationContext) { public void afterPropertiesSet() { initialize(); } - + public void initialize() { - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("Initializing Converters Default Configurations..."); } initJSONConfiguration(); @@ -85,37 +85,37 @@ public void initialize() { } private void initJSONConfiguration() { - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("Initializing default JSON Converters Configuration..."); } - List> marshallers = new ArrayList>(); + List> marshallers = new ArrayList<>(); marshallers.addAll(getPreviouslyConfiguredMarshallers(JSON.class)); marshallers.add(new org.grails.web.converters.marshaller.json.ArrayMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.json.ByteArrayMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.json.CollectionMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.json.MapMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.json.EnumMarshaller()); - marshallers.add(new org.grails.web.converters.marshaller.ProxyUnwrappingMarshaller()); + marshallers.add(new org.grails.web.converters.marshaller.ProxyUnwrappingMarshaller<>()); Config grailsConfig = getGrailsConfig(); - if ("javascript".equals(grailsConfig.getProperty(SETTING_CONVERTERS_JSON_DATE, String.class, "default",Arrays.asList("javascript", "default")))) { - if(LOG.isDebugEnabled()) { + if ("javascript".equals(grailsConfig.getProperty(SETTING_CONVERTERS_JSON_DATE, String.class, "default", Arrays.asList("javascript", "default")))) { + if (LOG.isDebugEnabled()) { LOG.debug("Using Javascript JSON Date Marshaller."); } marshallers.add(new org.grails.web.converters.marshaller.json.JavascriptDateMarshaller()); } else { - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("Using default JSON Date Marshaller"); } marshallers.add(new org.grails.web.converters.marshaller.json.DateMarshaller()); } marshallers.add(new org.grails.web.converters.marshaller.json.ToStringBeanMarshaller()); - boolean includeDomainVersion = includeDomainVersionProperty(grailsConfig,"json"); - boolean includeDomainClassName = includeDomainClassProperty(grailsConfig,"json"); + boolean includeDomainVersion = includeDomainVersionProperty(grailsConfig, "json"); + boolean includeDomainClassName = includeDomainClassProperty(grailsConfig, "json"); ProxyHandler proxyHandler = getProxyHandler(); if (grailsConfig.getProperty(SETTING_CONVERTERS_JSON_DEFAULT_DEEP, Boolean.class, false)) { LOG.debug("Using DeepDomainClassMarshaller as default."); @@ -127,11 +127,11 @@ private void initJSONConfiguration() { marshallers.add(new org.grails.web.converters.marshaller.json.GroovyBeanMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.json.GenericJavaBeanMarshaller()); - DefaultConverterConfiguration cfg = new DefaultConverterConfiguration(marshallers, proxyHandler); + DefaultConverterConfiguration cfg = new DefaultConverterConfiguration<>(marshallers, proxyHandler); cfg.setEncoding(grailsConfig.getProperty(SETTING_CONVERTERS_ENCODING, "UTF-8")); String defaultCirRefBehaviour = grailsConfig.getProperty(SETTING_CONVERTERS_CIRCULAR_REFERENCE_BEHAVIOUR, "DEFAULT"); cfg.setCircularReferenceBehaviour(Converter.CircularReferenceBehaviour.valueOf( - grailsConfig.getProperty(SETTING_CONVERTERS_JSON_CIRCULAR_REFERENCE_BEHAVIOUR,String.class, + grailsConfig.getProperty(SETTING_CONVERTERS_JSON_CIRCULAR_REFERENCE_BEHAVIOUR, String.class, defaultCirRefBehaviour, Converter.CircularReferenceBehaviour.allowedValues()))); Boolean defaultPrettyPrint = grailsConfig.getProperty(SETTING_CONVERTERS_PRETTY_PRINT, Boolean.class, false); @@ -141,12 +141,12 @@ private void initJSONConfiguration() { registerObjectMarshallersFromApplicationContext(cfg, JSON.class); - ConvertersConfigurationHolder.setDefaultConfiguration(JSON.class, new ChainedConverterConfiguration(cfg, proxyHandler)); + ConvertersConfigurationHolder.setDefaultConfiguration(JSON.class, new ChainedConverterConfiguration<>(cfg, proxyHandler)); } private Config getGrailsConfig() { Config grailsConfig; - if(grailsApplication != null) { + if (grailsApplication != null) { grailsConfig = grailsApplication.getConfig(); } else { @@ -157,15 +157,15 @@ private Config getGrailsConfig() { } private void initDeepJSONConfiguration() { - DefaultConverterConfiguration deepConfig = new DefaultConverterConfiguration(ConvertersConfigurationHolder.getConverterConfiguration(JSON.class), getProxyHandler()); - deepConfig.registerObjectMarshaller(new org.grails.web.converters.marshaller.json.DeepDomainClassMarshaller(includeDomainVersionProperty(getGrailsConfig(),"json"), includeDomainClassProperty(getGrailsConfig(), "json"), getProxyHandler(), grailsApplication)); + DefaultConverterConfiguration deepConfig = new DefaultConverterConfiguration<>(ConvertersConfigurationHolder.getConverterConfiguration(JSON.class), getProxyHandler()); + deepConfig.registerObjectMarshaller(new org.grails.web.converters.marshaller.json.DeepDomainClassMarshaller(includeDomainVersionProperty(getGrailsConfig(), "json"), includeDomainClassProperty(getGrailsConfig(), "json"), getProxyHandler(), grailsApplication)); ConvertersConfigurationHolder.setNamedConverterConfiguration(JSON.class, "deep", deepConfig); } private void initXMLConfiguration() { LOG.debug("Initializing default XML Converters Configuration..."); - List> marshallers = new ArrayList>(); + List> marshallers = new ArrayList<>(); marshallers.addAll(getPreviouslyConfiguredMarshallers(XML.class)); marshallers.add(new org.grails.web.converters.marshaller.xml.Base64ByteArrayMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.xml.ArrayMarshaller()); @@ -173,7 +173,7 @@ private void initXMLConfiguration() { marshallers.add(new org.grails.web.converters.marshaller.xml.MapMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.xml.EnumMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.xml.DateMarshaller()); - marshallers.add(new ProxyUnwrappingMarshaller()); + marshallers.add(new ProxyUnwrappingMarshaller<>()); marshallers.add(new org.grails.web.converters.marshaller.xml.ToStringBeanMarshaller()); ProxyHandler proxyHandler = getProxyHandler(); @@ -189,11 +189,11 @@ private void initXMLConfiguration() { marshallers.add(new org.grails.web.converters.marshaller.xml.GroovyBeanMarshaller()); marshallers.add(new org.grails.web.converters.marshaller.xml.GenericJavaBeanMarshaller()); - DefaultConverterConfiguration cfg = new DefaultConverterConfiguration(marshallers,proxyHandler); + DefaultConverterConfiguration cfg = new DefaultConverterConfiguration<>(marshallers, proxyHandler); cfg.setEncoding(grailsConfig.getProperty(SETTING_CONVERTERS_ENCODING, "UTF-8")); String defaultCirRefBehaviour = grailsConfig.getProperty(SETTING_CONVERTERS_CIRCULAR_REFERENCE_BEHAVIOUR, "DEFAULT"); cfg.setCircularReferenceBehaviour(Converter.CircularReferenceBehaviour.valueOf( - grailsConfig.getProperty("grails.converters.xml.circular.reference.behaviour",String.class, + grailsConfig.getProperty("grails.converters.xml.circular.reference.behaviour", String.class, defaultCirRefBehaviour, Converter.CircularReferenceBehaviour.allowedValues()))); Boolean defaultPrettyPrint = grailsConfig.getProperty(SETTING_CONVERTERS_PRETTY_PRINT, Boolean.class, false); @@ -201,7 +201,7 @@ private void initXMLConfiguration() { cfg.setPrettyPrint(prettyPrint); cfg.setCacheObjectMarshallerByClass(grailsConfig.getProperty("grails.converters.xml.cacheObjectMarshallerSelectionByClass", Boolean.class, true)); registerObjectMarshallersFromApplicationContext(cfg, XML.class); - ConvertersConfigurationHolder.setDefaultConfiguration(XML.class, new ChainedConverterConfiguration(cfg,proxyHandler)); + ConvertersConfigurationHolder.setDefaultConfiguration(XML.class, new ChainedConverterConfiguration<>(cfg, proxyHandler)); } private ProxyHandler getProxyHandler() { @@ -216,7 +216,7 @@ private ProxyHandler getProxyHandler() { } private void initDeepXMLConfiguration() { - DefaultConverterConfiguration deepConfig = new DefaultConverterConfiguration(ConvertersConfigurationHolder.getConverterConfiguration(XML.class), getProxyHandler()); + DefaultConverterConfiguration deepConfig = new DefaultConverterConfiguration<>(ConvertersConfigurationHolder.getConverterConfiguration(XML.class), getProxyHandler()); deepConfig.registerObjectMarshaller(new org.grails.web.converters.marshaller.xml.DeepDomainClassMarshaller(includeDomainVersionProperty(getGrailsConfig(), "xml"), includeDomainClassProperty(getGrailsConfig(), "xml"), getProxyHandler(), grailsApplication)); ConvertersConfigurationHolder.setNamedConverterConfiguration(XML.class, "deep", deepConfig); } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/DefaultConverterConfiguration.java b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/DefaultConverterConfiguration.java index b23ee230b75..482f202979d 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/DefaultConverterConfiguration.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/DefaultConverterConfiguration.java @@ -18,17 +18,16 @@ */ package org.grails.web.converters.configuration; -import groovy.lang.Closure; - import java.util.ArrayList; import java.util.List; import java.util.SortedSet; import java.util.TreeSet; import java.util.concurrent.atomic.AtomicInteger; +import groovy.lang.Closure; + import grails.core.support.proxy.DefaultProxyHandler; import grails.core.support.proxy.ProxyHandler; - import org.grails.web.converters.Converter; import org.grails.web.converters.marshaller.ClosureObjectMarshaller; import org.grails.web.converters.marshaller.ObjectMarshaller; @@ -49,7 +48,7 @@ public class DefaultConverterConfiguration implements Conve private ConverterConfiguration delegate; private String encoding; private boolean prettyPrint = false; - private final SortedSet objectMarshallers = new TreeSet(); + private final SortedSet objectMarshallers = new TreeSet<>(); private Converter.CircularReferenceBehaviour circularReferenceBehaviour; private ProxyHandler proxyHandler; private boolean cacheObjectMarshallerByClass = true; @@ -63,7 +62,7 @@ public void setEncoding(String encoding) { } public Converter.CircularReferenceBehaviour getCircularReferenceBehaviour() { - return circularReferenceBehaviour != null ? circularReferenceBehaviour : (delegate != null ? delegate.getCircularReferenceBehaviour(): null); + return circularReferenceBehaviour != null ? circularReferenceBehaviour : (delegate != null ? delegate.getCircularReferenceBehaviour() : null); } public boolean isPrettyPrint() { @@ -75,7 +74,7 @@ public void setPrettyPrint(boolean prettyPrint) { } public List> getOrderedObjectMarshallers() { - List> list = new ArrayList>(); + List> list = new ArrayList<>(); for (Entry entry : objectMarshallers) { list.add(entry.marshaller); } @@ -137,11 +136,11 @@ public void registerObjectMarshaller(ObjectMarshaller marshaller, int priorit } public void registerObjectMarshaller(Class c, int priority, Closure callable) { - registerObjectMarshaller(new ClosureObjectMarshaller(c, callable), priority); + registerObjectMarshaller(new ClosureObjectMarshaller<>(c, callable), priority); } public void registerObjectMarshaller(Class c, Closure callable) { - registerObjectMarshaller(new ClosureObjectMarshaller(c, callable)); + registerObjectMarshaller(new ClosureObjectMarshaller<>(c, callable)); } public ObjectMarshaller getMarshaller(Object o) { diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ImmutableConverterConfiguration.java b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ImmutableConverterConfiguration.java index 0f65ba087b4..f86eaecfcd2 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ImmutableConverterConfiguration.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/ImmutableConverterConfiguration.java @@ -23,7 +23,6 @@ import grails.core.support.proxy.DefaultProxyHandler; import grails.core.support.proxy.ProxyHandler; - import org.grails.web.converters.Converter; import org.grails.web.converters.marshaller.ObjectMarshaller; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/configtest.groovy b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/configtest.groovy index d6c705d030d..a5d1927a739 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/configuration/configtest.groovy +++ b/grails-converters/src/main/groovy/org/grails/web/converters/configuration/configtest.groovy @@ -48,27 +48,27 @@ catch (e) { def map = [ immutable: 0, chained: 0, default: 0 ] def test = { label, jsonConfig -> -def start = System.currentTimeMillis() -30000.times { - assert jsonConfig.getMarshaller(new Object()) -} -def time = System.currentTimeMillis()-start -println "$label --> ${time}ms" -map[label] = map[label] + time + def start = System.currentTimeMillis() + 30000.times { + assert jsonConfig.getMarshaller(new Object()) + } + def time = System.currentTimeMillis() - start + println "$label --> ${time}ms" + map[label] = map[label] + time } -test("default", defcfg) -test("chained", chcfg) -test("immutable", imcfg) +test('default', defcfg) +test('chained', chcfg) +test('immutable', imcfg) map = [ immutable: 0, chained: 0, default: 0 ] 100.times { - test("chained", chcfg) - test("immutable", imcfg) - test("default", defcfg) + test('chained', chcfg) + test('immutable', imcfg) + test('default', defcfg) } -println "======" +println '======' println map diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ByDatasourceDomainClassFetcher.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ByDatasourceDomainClassFetcher.java index 486f03e54d0..15e044099b5 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ByDatasourceDomainClassFetcher.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ByDatasourceDomainClassFetcher.java @@ -23,7 +23,6 @@ import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.web.converters.marshaller.DomainClassFetcher; public class ByDatasourceDomainClassFetcher implements DomainClassFetcher { @@ -31,9 +30,9 @@ public class ByDatasourceDomainClassFetcher implements DomainClassFetcher { public PersistentEntity findDomainClass(Object instance) { Class clazz = instance.getClass(); Datastore datastore = GormEnhancer.findDatastore(clazz); - if ( datastore != null) { + if (datastore != null) { MappingContext mappingContext = datastore.getMappingContext(); - if ( mappingContext != null ) { + if (mappingContext != null) { return mappingContext.getPersistentEntity(clazz.getName()); } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ByGrailsApplicationDomainClassFetcher.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ByGrailsApplicationDomainClassFetcher.java index 2e8f485ee04..9cfe129175c 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ByGrailsApplicationDomainClassFetcher.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ByGrailsApplicationDomainClassFetcher.java @@ -21,7 +21,6 @@ import grails.core.GrailsApplication; import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.web.converters.marshaller.DomainClassFetcher; public class ByGrailsApplicationDomainClassFetcher implements DomainClassFetcher { GrailsApplication grailsApplication; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/DomainClassFetcher.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/DomainClassFetcher.java index 25e4f4ae636..13b74403e51 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/DomainClassFetcher.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/DomainClassFetcher.java @@ -19,7 +19,6 @@ package org.grails.web.converters.marshaller; -import grails.core.GrailsApplication; import org.grails.datastore.mapping.model.PersistentEntity; public interface DomainClassFetcher { diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ProxyUnwrappingMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ProxyUnwrappingMarshaller.java index c95425a79f5..5fafddec9f1 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ProxyUnwrappingMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/ProxyUnwrappingMarshaller.java @@ -18,11 +18,11 @@ */ package org.grails.web.converters.marshaller; -import grails.util.GrailsNameUtils; import groovy.lang.GroovySystem; import groovy.lang.MetaClass; import groovy.lang.MetaClassRegistry; +import grails.util.GrailsNameUtils; import org.grails.web.converters.Converter; import org.grails.web.converters.exceptions.ConverterException; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ArrayMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ArrayMarshaller.java index a70d93e807b..373817b21eb 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ArrayMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ArrayMarshaller.java @@ -18,13 +18,12 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.lang.reflect.Array; -import org.grails.web.json.JSONWriter; +import grails.converters.JSON; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; +import org.grails.web.json.JSONWriter; /** * @author Siegfried Puchbauer diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ByteArrayMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ByteArrayMarshaller.java index 94914191c3f..0958869736c 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ByteArrayMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ByteArrayMarshaller.java @@ -19,7 +19,6 @@ package org.grails.web.converters.marshaller.json; import grails.converters.JSON; - import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/CollectionMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/CollectionMarshaller.java index b17871130d9..5577703d563 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/CollectionMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/CollectionMarshaller.java @@ -18,13 +18,12 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.util.Collection; -import org.grails.web.json.JSONWriter; +import grails.converters.JSON; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; +import org.grails.web.json.JSONWriter; /** * @author Siegfried Puchbauer diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/DateMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/DateMarshaller.java index 91e345630f5..beedb48a017 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/DateMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/DateMarshaller.java @@ -18,17 +18,17 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.text.Format; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import org.apache.commons.lang3.time.FastDateFormat; -import org.grails.web.json.JSONException; + +import grails.converters.JSON; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; +import org.grails.web.json.JSONException; /** * JSON ObjectMarshaller which converts a Date Object, conforming to the ECMA-Script-Specification diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/DomainClassMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/DomainClassMarshaller.java index a04f62ce6d1..0fe500897a6 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/DomainClassMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/DomainClassMarshaller.java @@ -18,14 +18,29 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; -import groovy.lang.GroovyObject; +import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; -import java.util.*; +import groovy.lang.GroovyObject; -import org.grails.core.artefact.DomainClassArtefactHandler; +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; +import grails.converters.JSON; import grails.core.GrailsApplication; +import grails.core.support.proxy.DefaultProxyHandler; +import grails.core.support.proxy.EntityProxyHandler; +import grails.core.support.proxy.ProxyHandler; +import org.grails.core.artefact.DomainClassArtefactHandler; import org.grails.core.exceptions.GrailsConfigurationException; import org.grails.core.util.IncludeExcludeSupport; import org.grails.datastore.mapping.model.PersistentEntity; @@ -41,14 +56,7 @@ import org.grails.web.converters.marshaller.ByGrailsApplicationDomainClassFetcher; import org.grails.web.converters.marshaller.DomainClassFetcher; import org.grails.web.converters.marshaller.IncludeExcludePropertyMarshaller; - -import grails.core.support.proxy.DefaultProxyHandler; -import grails.core.support.proxy.EntityProxyHandler; -import grails.core.support.proxy.ProxyHandler; - import org.grails.web.json.JSONWriter; -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; /** * @@ -87,10 +95,11 @@ public DomainClassMarshaller(boolean includeVersion, boolean includeClass, Proxy } private void initializeDomainClassFetchers() { - this.domainClassFetchers = new ArrayList() {{ - add(new ByGrailsApplicationDomainClassFetcher(application)); - add(new ByDatasourceDomainClassFetcher()); - }}; + this.domainClassFetchers = new ArrayList<>() {{ + add(new ByGrailsApplicationDomainClassFetcher(application)); + add(new ByDatasourceDomainClassFetcher()); + } + }; } public boolean isIncludeVersion() { @@ -122,40 +131,38 @@ public void marshalObject(Object value, JSON json) throws ConverterException { List excludes = json.getExcludes(clazz); List includes = json.getIncludes(clazz); - IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport(); - + IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport<>(); BeanWrapper beanWrapper = new BeanWrapperImpl(value); writer.object(); - if(includeClass && shouldInclude(includeExcludeSupport, includes, excludes, value, "class")) { + if (includeClass && shouldInclude(includeExcludeSupport, includes, excludes, value, "class")) { writer.key("class").value(clazz.getName()); } PersistentEntity domainClass = findDomainClass(value); - if ( domainClass == null ) { + if (domainClass == null) { throw new GrailsConfigurationException("Could not retrieve the respective entity for domain " + value.getClass().getName() + " in the mapping context API"); } PersistentProperty id = domainClass.getIdentity(); - if(id != null) { - //Composite keys dont return an identity. They also do not render in the JSON. + if (id != null) { + //Composite keys dont return an identity. They also do not render in the JSON. //If using Composite keys, it may be advisable to use a customer Marshaller. - if(shouldInclude(includeExcludeSupport, includes, excludes, value, id.getName())) { + if (shouldInclude(includeExcludeSupport, includes, excludes, value, id.getName())) { Object idValue = extractValue(value, id); - if(idValue != null) { + if (idValue != null) { json.property(id.getName(), idValue); } - } + } } - if (shouldInclude(includeExcludeSupport, includes, excludes, value, GormProperties.VERSION) && isIncludeVersion()) { PersistentProperty versionProperty = domainClass.getVersion(); Object version = extractValue(value, versionProperty); - if(version != null) { + if (version != null) { json.property(GormProperties.VERSION, version); } } @@ -167,10 +174,10 @@ public void marshalObject(Object value, JSON json) throws ConverterException { continue; } - if(!shouldInclude(includeExcludeSupport, includes, excludes, value, property.getName())) continue; + if (!shouldInclude(includeExcludeSupport, includes, excludes, value, property.getName())) continue; writer.key(property.getName()); - if ( !(property instanceof Association) ) { + if (!(property instanceof Association)) { // Write non-relation property Object val = beanWrapper.getPropertyValue(property.getName()); json.convertAnother(val); @@ -210,10 +217,10 @@ else if (referenceObject instanceof Collection) { PersistentEntity referencedDomainClass = ((Association) property).getAssociatedEntity(); // Embedded are now always fully rendered - if (referencedDomainClass == null || ((Association)property).isEmbedded() || property.getType().isEnum()) { + if (referencedDomainClass == null || ((Association) property).isEmbedded() || property.getType().isEnum()) { json.convertAnother(referenceObject); } - else if ( (property instanceof OneToOne) || (property instanceof ManyToOne)|| ((Association)property).isEmbedded()) { + else if ((property instanceof OneToOne) || (property instanceof ManyToOne) || ((Association) property).isEmbedded()) { asShortObject(referenceObject, json, referencedDomainClass.getIdentity(), referencedDomainClass); } else { @@ -248,9 +255,9 @@ else if (referenceObject instanceof Map) { } private PersistentEntity findDomainClass(Object value) { - for ( DomainClassFetcher fetcher : domainClassFetchers) { + for (DomainClassFetcher fetcher : domainClassFetchers) { PersistentEntity domain = fetcher.findDomainClass(value); - if ( domain != null ) { + if (domain != null) { return domain; } } @@ -258,7 +265,7 @@ private PersistentEntity findDomainClass(Object value) { } private boolean shouldInclude(IncludeExcludeSupport includeExcludeSupport, List includes, List excludes, Object object, String propertyName) { - return includeExcludeSupport.shouldInclude(includes,excludes,propertyName) && shouldInclude(object,propertyName); + return includeExcludeSupport.shouldInclude(includes, excludes, propertyName) && shouldInclude(object, propertyName); } protected void asShortObject(Object refObj, JSON json, PersistentProperty idProperty, PersistentEntity referencedDomainClass) throws ConverterException { @@ -276,21 +283,21 @@ protected void asShortObject(Object refObj, JSON json, PersistentProperty idProp } JSONWriter writer = json.getWriter(); writer.object(); - if(isIncludeClass()) { + if (isIncludeClass()) { writer.key("class").value(referencedDomainClass.getName()); } - if(idValue != null) { + if (idValue != null) { writer.key("id").value(idValue); } writer.endObject(); } protected Object extractValue(Object domainObject, PersistentProperty property) { - if(property == null) { + if (property == null) { return null; } - if(domainObject instanceof GroovyObject) { - return ((GroovyObject)domainObject).getProperty(property.getName()); + if (domainObject instanceof GroovyObject) { + return ((GroovyObject) domainObject).getProperty(property.getName()); } else { ClassPropertyFetcher propertyFetcher = ClassPropertyFetcher.forClass(domainObject.getClass()); diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/EnumMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/EnumMarshaller.java index 6e37c7a6914..0b91101cdbd 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/EnumMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/EnumMarshaller.java @@ -18,14 +18,14 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.lang.reflect.Method; -import org.grails.web.json.JSONWriter; +import org.springframework.beans.BeanUtils; + +import grails.converters.JSON; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; -import org.springframework.beans.BeanUtils; +import org.grails.web.json.JSONWriter; /** * @author Siegfried Puchbauer @@ -43,9 +43,9 @@ public void marshalObject(Object en, JSON json) throws ConverterException { writer.object(); Class enumClass = en.getClass(); json.property("enumType", enumClass.getName()); - Method nameMethod = BeanUtils.findDeclaredMethod(enumClass, "name" ); + Method nameMethod = BeanUtils.findDeclaredMethod(enumClass, "name"); try { - json.property("name",nameMethod.invoke(en)); + json.property("name", nameMethod.invoke(en)); } catch (Exception e) { json.property("name", ""); diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/GenericJavaBeanMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/GenericJavaBeanMarshaller.java index b4b6fd77a27..424aed49ee1 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/GenericJavaBeanMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/GenericJavaBeanMarshaller.java @@ -18,22 +18,21 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.List; +import org.springframework.beans.BeanUtils; + +import grails.converters.JSON; import grails.persistence.PersistenceMethod; import grails.web.controllers.ControllerMethod; import org.grails.core.util.IncludeExcludeSupport; +import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.IncludeExcludePropertyMarshaller; import org.grails.web.json.JSONWriter; -import org.grails.web.converters.exceptions.ConverterException; -import org.grails.web.converters.marshaller.ObjectMarshaller; -import org.springframework.beans.BeanUtils; /** * @author Siegfried Puchbauer @@ -51,7 +50,7 @@ public void marshalObject(Object o, JSON json) throws ConverterException { Class clazz = o.getClass(); List excludes = json.getExcludes(clazz); List includes = json.getIncludes(clazz); - IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport(); + IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport<>(); try { writer.object(); @@ -59,11 +58,11 @@ public void marshalObject(Object o, JSON json) throws ConverterException { String name = property.getName(); Method readMethod = property.getReadMethod(); - if(!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; + if (!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; - if (readMethod != null && !(name.equals("metaClass"))&& !(name.equals("class"))) { - if(readMethod.getAnnotation(PersistenceMethod.class) != null) continue; - if(readMethod.getAnnotation(ControllerMethod.class) != null) continue; + if (readMethod != null && !(name.equals("metaClass")) && !(name.equals("class"))) { + if (readMethod.getAnnotation(PersistenceMethod.class) != null) continue; + if (readMethod.getAnnotation(ControllerMethod.class) != null) continue; Object value = readMethod.invoke(o, (Object[]) null); writer.key(name); json.convertAnother(value); @@ -73,7 +72,7 @@ public void marshalObject(Object o, JSON json) throws ConverterException { int modifiers = field.getModifiers(); if (field.isAccessible() && Modifier.isPublic(modifiers) && !(Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers))) { String name = field.getName(); - if(!shouldInclude(includeExcludeSupport,includes,excludes,o,name)) continue; + if (!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; writer.key(field.getName()); json.convertAnother(field.get(o)); } @@ -89,6 +88,6 @@ public void marshalObject(Object o, JSON json) throws ConverterException { } private boolean shouldInclude(IncludeExcludeSupport includeExcludeSupport, List includes, List excludes, Object o, String name) { - return includeExcludeSupport.shouldInclude(includes,excludes, name) && shouldInclude(o,name); + return includeExcludeSupport.shouldInclude(includes, excludes, name) && shouldInclude(o, name); } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/GroovyBeanMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/GroovyBeanMarshaller.java index 796b63a2668..70249bcd28a 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/GroovyBeanMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/GroovyBeanMarshaller.java @@ -18,22 +18,23 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; -import grails.persistence.PersistenceMethod; -import grails.web.controllers.ControllerMethod; -import groovy.lang.GroovyObject; - import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.List; +import groovy.lang.GroovyObject; + +import org.springframework.beans.BeanUtils; + +import grails.converters.JSON; +import grails.persistence.PersistenceMethod; +import grails.web.controllers.ControllerMethod; import org.grails.core.util.IncludeExcludeSupport; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.IncludeExcludePropertyMarshaller; import org.grails.web.json.JSONWriter; -import org.springframework.beans.BeanUtils; /** * @author Siegfried Puchbauer @@ -48,11 +49,10 @@ public boolean supports(Object object) { public void marshalObject(Object o, JSON json) throws ConverterException { JSONWriter writer = json.getWriter(); - Class clazz = o.getClass(); List excludes = json.getExcludes(clazz); List includes = json.getIncludes(clazz); - IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport(); + IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport<>(); try { writer.object(); for (PropertyDescriptor property : BeanUtils.getPropertyDescriptors(clazz)) { @@ -60,11 +60,11 @@ public void marshalObject(Object o, JSON json) throws ConverterException { Method readMethod = property.getReadMethod(); String name = property.getName(); - if(!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; + if (!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; - if (readMethod != null && !(name.equals("metaClass"))&& !(name.equals("class"))) { - if(readMethod.getAnnotation(PersistenceMethod.class) != null) continue; - if(readMethod.getAnnotation(ControllerMethod.class) != null) continue; + if (readMethod != null && !(name.equals("metaClass")) && !(name.equals("class"))) { + if (readMethod.getAnnotation(PersistenceMethod.class) != null) continue; + if (readMethod.getAnnotation(ControllerMethod.class) != null) continue; Object value = readMethod.invoke(o, (Object[]) null); writer.key(name); json.convertAnother(value); @@ -74,7 +74,7 @@ public void marshalObject(Object o, JSON json) throws ConverterException { int modifiers = field.getModifiers(); if (Modifier.isPublic(modifiers) && !(Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers))) { String name = field.getName(); - if(!shouldInclude(includeExcludeSupport,includes,excludes,o,name)) continue; + if (!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; writer.key(name); json.convertAnother(field.get(o)); } @@ -90,7 +90,7 @@ public void marshalObject(Object o, JSON json) throws ConverterException { } private boolean shouldInclude(IncludeExcludeSupport includeExcludeSupport, List includes, List excludes, Object o, String name) { - return includeExcludeSupport.shouldInclude(includes,excludes, name) && shouldInclude(o,name); + return includeExcludeSupport.shouldInclude(includes, excludes, name) && shouldInclude(o, name); } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/InstanceMethodBasedMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/InstanceMethodBasedMarshaller.java index 2a284bdc0ff..2b79b6c57d4 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/InstanceMethodBasedMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/InstanceMethodBasedMarshaller.java @@ -18,14 +18,14 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; import groovy.lang.GroovySystem; import groovy.lang.MetaClass; import groovy.lang.MetaMethod; -import org.grails.web.json.JSONWriter; +import grails.converters.JSON; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; +import org.grails.web.json.JSONWriter; /** * @author Siegfried Puchbauer @@ -45,9 +45,9 @@ public void marshalObject(Object object, JSON converter) throws ConverterExcepti converter.convertAnother(result); } } - catch(Throwable e) { - throw e instanceof ConverterException ? (ConverterException)e : - new ConverterException("Error invoking toJSON method of object with class " + object.getClass().getName(),e); + catch (Throwable e) { + throw e instanceof ConverterException ? (ConverterException) e : + new ConverterException("Error invoking toJSON method of object with class " + object.getClass().getName(), e); } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/JavascriptDateMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/JavascriptDateMarshaller.java index 616e10990af..e0c46666331 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/JavascriptDateMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/JavascriptDateMarshaller.java @@ -18,13 +18,12 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.util.Date; -import org.grails.web.json.JSONException; +import grails.converters.JSON; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; +import org.grails.web.json.JSONException; /** * @author Siegfried Puchbauer diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/MapMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/MapMarshaller.java index d68ade1dd83..fac5befcda0 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/MapMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/MapMarshaller.java @@ -18,13 +18,12 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.util.Map; -import org.grails.web.json.JSONWriter; +import grails.converters.JSON; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; +import org.grails.web.json.JSONWriter; /** * @author Siegfried Puchbauer @@ -40,8 +39,8 @@ public boolean supports(Object object) { public void marshalObject(Object o, JSON converter) throws ConverterException { JSONWriter writer = converter.getWriter(); writer.object(); - Map map = (Map) o; - for (Map.Entry entry : map.entrySet()) { + Map map = (Map) o; + for (Map.Entry entry : map.entrySet()) { Object key = entry.getKey(); if (key != null) { writer.key(key.toString()); diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ToStringBeanMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ToStringBeanMarshaller.java index e3231df33d2..23bfbbbc745 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ToStringBeanMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ToStringBeanMarshaller.java @@ -18,8 +18,6 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.net.URL; import java.util.Arrays; import java.util.Collections; @@ -29,6 +27,7 @@ import java.util.Set; import java.util.TimeZone; +import grails.converters.JSON; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ValidationErrorsMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ValidationErrorsMarshaller.java index c182e193fb6..8599d6daa17 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ValidationErrorsMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/json/ValidationErrorsMarshaller.java @@ -18,13 +18,8 @@ */ package org.grails.web.converters.marshaller.json; -import grails.converters.JSON; - import java.util.Locale; -import org.grails.web.json.JSONWriter; -import org.grails.web.converters.exceptions.ConverterException; -import org.grails.web.converters.marshaller.ObjectMarshaller; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.context.i18n.LocaleContextHolder; @@ -32,6 +27,11 @@ import org.springframework.validation.FieldError; import org.springframework.validation.ObjectError; +import grails.converters.JSON; +import org.grails.web.converters.exceptions.ConverterException; +import org.grails.web.converters.marshaller.ObjectMarshaller; +import org.grails.web.json.JSONWriter; + /** * @author Siegfried Puchbauer * @since 1.1 diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ArrayMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ArrayMarshaller.java index 2088b13b8ab..c0782146950 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ArrayMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ArrayMarshaller.java @@ -18,14 +18,13 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; +import java.lang.reflect.Array; +import grails.converters.XML; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.NameAwareMarshaller; import org.grails.web.converters.marshaller.ObjectMarshaller; -import java.lang.reflect.Array; - /** * @author Siegfried Puchbauer * @since 1.1 @@ -55,4 +54,4 @@ public void marshalObject(Object o, XML xml) throws ConverterException { public String getElementName(Object o) { return "array"; } -} \ No newline at end of file +} diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/Base64ByteArrayMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/Base64ByteArrayMarshaller.java index 7ef5ff9c586..21a85d25d67 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/Base64ByteArrayMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/Base64ByteArrayMarshaller.java @@ -18,12 +18,12 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; -import groovy.lang.Writable; - import java.io.IOException; +import groovy.lang.Writable; import org.codehaus.groovy.runtime.EncodingGroovyMethods; + +import grails.converters.XML; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; @@ -43,10 +43,10 @@ public void marshalObject(Object object, XML xml) throws ConverterException { Writable w; if (object instanceof byte[]) { - w = EncodingGroovyMethods.encodeBase64((byte[])object); + w = EncodingGroovyMethods.encodeBase64((byte[]) object); } else { - w = EncodingGroovyMethods.encodeBase64((Byte[])object); + w = EncodingGroovyMethods.encodeBase64((Byte[]) object); } try { diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/CollectionMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/CollectionMarshaller.java index 6e57538cf74..b8532ce3fda 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/CollectionMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/CollectionMarshaller.java @@ -18,11 +18,10 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; - import java.util.Collection; import java.util.Set; +import grails.converters.XML; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.NameAwareMarshaller; import org.grails.web.converters.marshaller.ObjectMarshaller; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/DateMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/DateMarshaller.java index 6c3c946d58a..15801041b07 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/DateMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/DateMarshaller.java @@ -18,12 +18,12 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; - import java.text.Format; import java.util.Date; import org.apache.commons.lang3.time.FastDateFormat; + +import grails.converters.XML; import org.grails.web.converters.ConverterUtil; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/DomainClassMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/DomainClassMarshaller.java index 3a352bb72a5..ef2e3c53430 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/DomainClassMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/DomainClassMarshaller.java @@ -18,19 +18,30 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedMap; +import java.util.SortedSet; +import java.util.TreeMap; +import java.util.TreeSet; -import java.util.*; +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; +import org.springframework.util.StringUtils; +import grails.converters.XML; import grails.core.GrailsApplication; - -import org.grails.core.exceptions.GrailsConfigurationException; -import org.grails.core.util.IncludeExcludeSupport; - import grails.core.support.proxy.EntityProxyHandler; import grails.core.support.proxy.ProxyHandler; - import org.grails.core.artefact.DomainClassArtefactHandler; +import org.grails.core.exceptions.GrailsConfigurationException; +import org.grails.core.util.IncludeExcludeSupport; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.config.GormProperties; @@ -44,9 +55,6 @@ import org.grails.web.converters.marshaller.ByGrailsApplicationDomainClassFetcher; import org.grails.web.converters.marshaller.DomainClassFetcher; import org.grails.web.converters.marshaller.IncludeExcludePropertyMarshaller; -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; -import org.springframework.util.StringUtils; /** * @@ -98,17 +106,17 @@ public void marshalObject(Object value, XML xml) throws ConverterException { List excludes = xml.getExcludes(clazz); List includes = xml.getIncludes(clazz); - IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport(); + IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport<>(); PersistentEntity domainClass = findDomainClass(value); - if ( domainClass == null ) { + if (domainClass == null) { throw new GrailsConfigurationException("Could not retrieve the respective entity for domain " + value.getClass().getName() + " in the mapping context API"); } BeanWrapper beanWrapper = new BeanWrapperImpl(value); PersistentProperty id = domainClass.getIdentity(); - if(shouldInclude(includeExcludeSupport, includes, excludes,value, id.getName())) { + if (shouldInclude(includeExcludeSupport, includes, excludes, value, id.getName())) { Object idValue = beanWrapper.getPropertyValue(id.getName()); if (idValue != null) xml.attribute("id", String.valueOf(idValue)); @@ -123,8 +131,8 @@ public void marshalObject(Object value, XML xml) throws ConverterException { } } } - if(includeClass && shouldInclude(includeExcludeSupport, includes, excludes, value, "class")) { - xml.attribute("class",domainClass.getJavaClass().getName()); + if (includeClass && shouldInclude(includeExcludeSupport, includes, excludes, value, "class")) { + xml.attribute("class", domainClass.getJavaClass().getName()); } List properties = domainClass.getPersistentProperties(); @@ -135,7 +143,7 @@ public void marshalObject(Object value, XML xml) throws ConverterException { continue; } - if(!shouldInclude(includeExcludeSupport, includes, excludes, value, property.getName())) continue; + if (!shouldInclude(includeExcludeSupport, includes, excludes, value, property.getName())) continue; xml.startNode(propertyName); if (!(property instanceof Association)) { @@ -172,10 +180,10 @@ else if (referenceObject instanceof Collection) { PersistentEntity referencedDomainClass = ((Association) property).getAssociatedEntity(); // Embedded are now always fully rendered - if (referencedDomainClass == null || ((Association)property).isEmbedded() || property.getType().isEnum()) { + if (referencedDomainClass == null || ((Association) property).isEmbedded() || property.getType().isEnum()) { xml.convertAnother(referenceObject); } - else if ((property instanceof OneToOne) || (property instanceof ManyToOne)|| ((Association)property).isEmbedded()) { + else if ((property instanceof OneToOne) || (property instanceof ManyToOne) || ((Association) property).isEmbedded()) { asShortObject(referenceObject, xml, referencedDomainClass.getIdentity(), referencedDomainClass); } else { @@ -209,7 +217,7 @@ else if (referenceObject instanceof Map) { } private boolean shouldInclude(IncludeExcludeSupport includeExcludeSupport, List includes, List excludes, Object object, String name) { - return includeExcludeSupport.shouldInclude(includes, excludes, name) && shouldInclude(object,name); + return includeExcludeSupport.shouldInclude(includes, excludes, name) && shouldInclude(object, name); } private boolean shouldInitializeProxy(Object object) { @@ -220,7 +228,6 @@ protected boolean shouldInitializeProxies() { return true; } - protected void asShortObject(Object refObj, XML xml, PersistentProperty idProperty, PersistentEntity referencedDomainClass) throws ConverterException { Object idValue; if (proxyHandler instanceof EntityProxyHandler) { @@ -234,7 +241,7 @@ protected void asShortObject(Object refObj, XML xml, PersistentProperty idProper ClassPropertyFetcher propertyFetcher = ClassPropertyFetcher.forClass(refObj.getClass()); idValue = propertyFetcher.getPropertyValue(refObj, idProperty.getName()); } - xml.attribute(GormProperties.IDENTITY,String.valueOf(idValue)); + xml.attribute(GormProperties.IDENTITY, String.valueOf(idValue)); } protected boolean isRenderDomainClassRelations() { @@ -242,9 +249,9 @@ protected boolean isRenderDomainClassRelations() { } private PersistentEntity findDomainClass(Object value) { - for ( DomainClassFetcher fetcher : domainClassFetchers) { + for (DomainClassFetcher fetcher : domainClassFetchers) { PersistentEntity domain = fetcher.findDomainClass(value); - if ( domain != null ) { + if (domain != null) { return domain; } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/EnumMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/EnumMarshaller.java index 539d93541a7..9251b283c8a 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/EnumMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/EnumMarshaller.java @@ -18,13 +18,13 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; - import java.lang.reflect.Method; +import org.springframework.beans.BeanUtils; + +import grails.converters.XML; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; -import org.springframework.beans.BeanUtils; /** * @author Siegfried Puchbauer diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/GenericJavaBeanMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/GenericJavaBeanMarshaller.java index da289b2d881..34fd3d2338c 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/GenericJavaBeanMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/GenericJavaBeanMarshaller.java @@ -18,16 +18,16 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; - import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import org.springframework.beans.BeanUtils; + +import grails.converters.XML; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; -import org.springframework.beans.BeanUtils; /** * @author Siegfried Puchbauer diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/GroovyBeanMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/GroovyBeanMarshaller.java index 12b25b17cdf..4ab7915b137 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/GroovyBeanMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/GroovyBeanMarshaller.java @@ -18,23 +18,24 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; -import grails.persistence.Entity; -import grails.persistence.PersistenceMethod; -import grails.web.controllers.ControllerMethod; -import groovy.lang.GroovyObject; - import java.beans.PropertyDescriptor; import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.List; +import groovy.lang.GroovyObject; + +import org.springframework.beans.BeanUtils; + +import grails.converters.XML; +import grails.persistence.Entity; +import grails.persistence.PersistenceMethod; +import grails.web.controllers.ControllerMethod; import org.grails.core.util.IncludeExcludeSupport; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.IncludeExcludePropertyMarshaller; -import org.springframework.beans.BeanUtils; /** * @author Siegfried Puchbauer @@ -51,19 +52,19 @@ public void marshalObject(Object o, XML xml) throws ConverterException { Class clazz = o.getClass(); List excludes = xml.getExcludes(clazz); List includes = xml.getIncludes(clazz); - IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport(); + IncludeExcludeSupport includeExcludeSupport = new IncludeExcludeSupport<>(); - boolean isEntity = o.getClass().getAnnotation(Entity.class)!=null; + boolean isEntity = o.getClass().getAnnotation(Entity.class) != null; for (PropertyDescriptor property : BeanUtils.getPropertyDescriptors(o.getClass())) { String name = property.getName(); - if(!shouldInclude(includeExcludeSupport,includes,excludes,o, name)) continue; + if (!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; - if(isEntity && (name.equals(GormProperties.ATTACHED) || name.equals(GormProperties.ERRORS))) continue; + if (isEntity && (name.equals(GormProperties.ATTACHED) || name.equals(GormProperties.ERRORS))) continue; Method readMethod = property.getReadMethod(); - if (readMethod != null && !(name.equals("metaClass"))&& !(name.equals("class"))) { - if(readMethod.getAnnotation(PersistenceMethod.class) != null) continue; - if(readMethod.getAnnotation(ControllerMethod.class) != null) continue; + if (readMethod != null && !(name.equals("metaClass")) && !(name.equals("class"))) { + if (readMethod.getAnnotation(PersistenceMethod.class) != null) continue; + if (readMethod.getAnnotation(ControllerMethod.class) != null) continue; Object value = readMethod.invoke(o, (Object[]) null); xml.startNode(name); xml.convertAnother(value); @@ -74,8 +75,8 @@ public void marshalObject(Object o, XML xml) throws ConverterException { int modifiers = field.getModifiers(); if (Modifier.isPublic(modifiers) && !(Modifier.isStatic(modifiers) || Modifier.isTransient(modifiers))) { String name = field.getName(); - if(!shouldInclude(includeExcludeSupport,includes,excludes,o, name)) continue; - if(isEntity && (name.equals(GormProperties.ATTACHED) || name.equals(GormProperties.ERRORS))) continue; + if (!shouldInclude(includeExcludeSupport, includes, excludes, o, name)) continue; + if (isEntity && (name.equals(GormProperties.ATTACHED) || name.equals(GormProperties.ERRORS))) continue; xml.startNode(name); xml.convertAnother(field.get(o)); xml.end(); @@ -91,6 +92,6 @@ public void marshalObject(Object o, XML xml) throws ConverterException { } private boolean shouldInclude(IncludeExcludeSupport includeExcludeSupport, List includes, List excludes, Object o, String name) { - return includeExcludeSupport.shouldInclude(includes,excludes, name) && shouldInclude(o,name); + return includeExcludeSupport.shouldInclude(includes, excludes, name) && shouldInclude(o, name); } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/InstanceMethodBasedMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/InstanceMethodBasedMarshaller.java index ce1ed7c16f4..d325c4e34d9 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/InstanceMethodBasedMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/InstanceMethodBasedMarshaller.java @@ -18,11 +18,11 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; import groovy.lang.GroovySystem; import groovy.lang.MetaClass; import groovy.lang.MetaMethod; +import grails.converters.XML; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; @@ -44,9 +44,9 @@ public void marshalObject(Object object, XML converter) throws ConverterExceptio converter.convertAnother(result); } } - catch(Throwable e) { - throw e instanceof ConverterException ? (ConverterException)e : - new ConverterException("Error invoking toXML method of object with class " + object.getClass().getName(),e); + catch (Throwable e) { + throw e instanceof ConverterException ? (ConverterException) e : + new ConverterException("Error invoking toXML method of object with class " + object.getClass().getName(), e); } } diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/MapMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/MapMarshaller.java index 399eca2708b..c3c988030ed 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/MapMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/MapMarshaller.java @@ -18,10 +18,9 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; - import java.util.Map; +import grails.converters.XML; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.NameAwareMarshaller; import org.grails.web.converters.marshaller.ObjectMarshaller; @@ -39,8 +38,8 @@ public boolean supports(Object object) { @SuppressWarnings("unchecked") public void marshalObject(Object o, XML xml) throws ConverterException { - Map map = (Map) o; - for (Map.Entry entry : map.entrySet()) { + Map map = (Map) o; + for (Map.Entry entry : map.entrySet()) { xml.startNode("entry").attribute("key", entry.getKey().toString()); xml.convertAnother(entry.getValue()); xml.end(); diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ToStringBeanMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ToStringBeanMarshaller.java index 399edf83318..57df3382c1e 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ToStringBeanMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ToStringBeanMarshaller.java @@ -18,8 +18,6 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; - import java.net.URL; import java.util.Arrays; import java.util.Collections; @@ -29,6 +27,7 @@ import java.util.Set; import java.util.TimeZone; +import grails.converters.XML; import org.grails.web.converters.exceptions.ConverterException; import org.grails.web.converters.marshaller.ObjectMarshaller; diff --git a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ValidationErrorsMarshaller.java b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ValidationErrorsMarshaller.java index 6d3955e9c3c..b3d964ab9a5 100644 --- a/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ValidationErrorsMarshaller.java +++ b/grails-converters/src/main/groovy/org/grails/web/converters/marshaller/xml/ValidationErrorsMarshaller.java @@ -18,13 +18,8 @@ */ package org.grails.web.converters.marshaller.xml; -import grails.converters.XML; - import java.util.Locale; -import org.grails.web.converters.exceptions.ConverterException; -import org.grails.web.converters.marshaller.NameAwareMarshaller; -import org.grails.web.converters.marshaller.ObjectMarshaller; import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -32,6 +27,11 @@ import org.springframework.validation.Errors; import org.springframework.validation.FieldError; +import grails.converters.XML; +import org.grails.web.converters.exceptions.ConverterException; +import org.grails.web.converters.marshaller.NameAwareMarshaller; +import org.grails.web.converters.marshaller.ObjectMarshaller; + /** * @author Siegfried Puchbauer * @since 1.1 @@ -62,7 +62,7 @@ public void marshalObject(Object object, XML xml) throws ConverterException { } else { String defaultMessage = fe.getDefaultMessage(); - if(defaultMessage != null) + if (defaultMessage != null) xml.startNode("message").chars(defaultMessage).end(); } xml.end(); diff --git a/grails-core/src/main/groovy/grails/artefact/ApiDelegate.java b/grails-core/src/main/groovy/grails/artefact/ApiDelegate.java index df05af222cf..712d1df79ee 100644 --- a/grails-core/src/main/groovy/grails/artefact/ApiDelegate.java +++ b/grails-core/src/main/groovy/grails/artefact/ApiDelegate.java @@ -18,13 +18,13 @@ */ package grails.artefact; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; + /** * Similar to Groovy's @Delegate AST transform but instead assumes the first * argument to every method is 'this'. diff --git a/grails-core/src/main/groovy/grails/artefact/Artefact.java b/grails-core/src/main/groovy/grails/artefact/Artefact.java index f2ba25da8c8..4c2bfdfeba6 100644 --- a/grails-core/src/main/groovy/grails/artefact/Artefact.java +++ b/grails-core/src/main/groovy/grails/artefact/Artefact.java @@ -18,13 +18,13 @@ */ package grails.artefact; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; + /** * Used to define the artefact type for classes declared outside of Grails' usual conventions. * diff --git a/grails-core/src/main/groovy/grails/artefact/Enhances.java b/grails-core/src/main/groovy/grails/artefact/Enhances.java index 445b35ec999..2fe2cfaaf42 100644 --- a/grails-core/src/main/groovy/grails/artefact/Enhances.java +++ b/grails-core/src/main/groovy/grails/artefact/Enhances.java @@ -18,13 +18,13 @@ */ package grails.artefact; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; + /** * Can be applied to any Trait to indicate to Grails that the trait should be automatically added to the given artefact types * diff --git a/grails-core/src/main/groovy/grails/beans/util/LazyMetaPropertyMap.java b/grails-core/src/main/groovy/grails/beans/util/LazyMetaPropertyMap.java index 9d3aaaea0d8..7fef5c26eb1 100644 --- a/grails-core/src/main/groovy/grails/beans/util/LazyMetaPropertyMap.java +++ b/grails-core/src/main/groovy/grails/beans/util/LazyMetaPropertyMap.java @@ -18,25 +18,34 @@ */ package grails.beans.util; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import groovy.lang.GroovySystem; import groovy.lang.MetaBeanProperty; import groovy.lang.MetaClass; import groovy.lang.MetaProperty; import groovy.transform.CompileStatic; import groovy.util.MapEntry; -import org.grails.datastore.mapping.model.config.GormProperties; -import org.grails.datastore.mapping.reflect.NameUtils; + import org.springframework.util.Assert; -import java.lang.reflect.Modifier; -import java.util.*; +import org.grails.datastore.mapping.model.config.GormProperties; +import org.grails.datastore.mapping.reflect.NameUtils; /** * A map implementation that reads an objects properties lazily using Groovy's MetaClass. * * @author Graeme Rocher */ -@SuppressWarnings({"unchecked","rawtypes"}) +@SuppressWarnings({"unchecked", "rawtypes"}) @CompileStatic public class LazyMetaPropertyMap implements Map { @@ -107,7 +116,7 @@ public Object get(Object propertyName) { if (propertyName instanceof List) { Map submap = new HashMap(); - List propertyNames = (List)propertyName; + List propertyNames = (List) propertyName; for (Object currentName : propertyNames) { if (currentName != null) { currentName = currentName.toString(); @@ -137,11 +146,11 @@ public Object put(Object propertyName, Object propertyValue) { } Object old = null; - MetaProperty mp = metaClass.getMetaProperty((String)propertyName); + MetaProperty mp = metaClass.getMetaProperty((String) propertyName); if (mp != null && !isExcluded(mp)) { old = mp.getProperty(instance); if (propertyValue instanceof Map) { - propertyValue = ((Map)propertyValue).get(propertyName); + propertyValue = ((Map) propertyValue).get(propertyName); } mp.setProperty(instance, propertyValue); } @@ -194,7 +203,7 @@ public int hashCode() { @Override public boolean equals(Object o) { if (o instanceof LazyMetaPropertyMap) { - LazyMetaPropertyMap other = (LazyMetaPropertyMap)o; + LazyMetaPropertyMap other = (LazyMetaPropertyMap) o; return instance.equals(other.getInstance()); } return false; diff --git a/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy b/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy index e219f3b27f6..a4ab18592e1 100644 --- a/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy +++ b/grails-core/src/main/groovy/grails/boot/GrailsApp.groovy @@ -19,6 +19,23 @@ package grails.boot +import java.util.concurrent.ConcurrentLinkedQueue + +import groovy.transform.CompileDynamic +import groovy.transform.CompileStatic +import groovy.util.logging.Slf4j +import org.codehaus.groovy.control.CompilationFailedException +import org.codehaus.groovy.control.CompilationUnit +import org.codehaus.groovy.control.CompilerConfiguration + +import org.springframework.boot.ResourceBanner +import org.springframework.boot.SpringApplication +import org.springframework.boot.web.context.WebServerApplicationContext +import org.springframework.context.ConfigurableApplicationContext +import org.springframework.core.env.ConfigurableEnvironment +import org.springframework.core.io.ClassPathResource +import org.springframework.core.io.ResourceLoader + import grails.compiler.ast.ClassInjector import grails.core.GrailsApplication import grails.io.IOUtils @@ -26,12 +43,6 @@ import grails.plugins.GrailsPlugin import grails.plugins.GrailsPluginManager import grails.util.BuildSettings import grails.util.Environment -import groovy.transform.CompileDynamic -import groovy.transform.CompileStatic -import groovy.util.logging.Slf4j -import org.codehaus.groovy.control.CompilationFailedException -import org.codehaus.groovy.control.CompilationUnit -import org.codehaus.groovy.control.CompilerConfiguration import org.grails.boot.internal.JavaCompiler import org.grails.compiler.injection.AbstractGrailsArtefactTransformer import org.grails.compiler.injection.GrailsAwareInjectionOperation @@ -40,15 +51,6 @@ import org.grails.io.watch.DirectoryWatcher import org.grails.io.watch.FileExtensionFileChangeListener import org.grails.plugins.BinaryGrailsPlugin import org.grails.plugins.support.WatchPattern -import org.springframework.boot.ResourceBanner -import org.springframework.boot.SpringApplication -import org.springframework.boot.web.context.WebServerApplicationContext -import org.springframework.context.ConfigurableApplicationContext -import org.springframework.core.env.ConfigurableEnvironment -import org.springframework.core.io.ClassPathResource -import org.springframework.core.io.ResourceLoader - -import java.util.concurrent.ConcurrentLinkedQueue /** * Extends the {@link SpringApplication} with reloading behavior and other Grails features @@ -101,12 +103,12 @@ class GrailsApp extends SpringApplication { ConfigurableApplicationContext applicationContext = super.run(args) Environment environment = Environment.getCurrent() - log.info("Application starting in environment: {}", environment.getName()) - log.debug("Application directory discovered as: {}", IOUtils.findApplicationDirectory()) - log.debug("Current base directory is [{}]. Reloading base directory is [{}]", new File("."), BuildSettings.BASE_DIR) + log.info('Application starting in environment: {}', environment.getName()) + log.debug('Application directory discovered as: {}', IOUtils.findApplicationDirectory()) + log.debug('Current base directory is [{}]. Reloading base directory is [{}]', new File('.'), BuildSettings.BASE_DIR) if (environment.isReloadEnabled()) { - log.debug("Reloading status: {}", environment.isReloadEnabled()) + log.debug('Reloading status: {}', environment.isReloadEnabled()) enableDevelopmentModeWatch(environment, applicationContext) environment.isDevtoolsRestart() } @@ -164,7 +166,7 @@ class GrailsApp extends SpringApplication { changedFiles << file.canonicalFile // For some bizarre reason Windows fires onNew events even for files that have // just been modified and not created - if (System.getProperty("os.name").toLowerCase().indexOf("windows") != -1) { + if (System.getProperty('os.name').toLowerCase().indexOf('windows') != -1) { return } newFiles << file.canonicalFile @@ -227,7 +229,6 @@ class GrailsApp extends SpringApplication { } } - developmentModeActive = true Thread.start { CompilerConfiguration compilerConfig = new CompilerConfiguration() @@ -237,7 +238,6 @@ class GrailsApp extends SpringApplication { // Workaround for some IDE / OS combos - 2 events (new + update) for the same file def uniqueChangedFiles = changedFiles as Set - def i = uniqueChangedFiles.size() try { if (i > 1) { @@ -248,7 +248,7 @@ class GrailsApp extends SpringApplication { newFiles.remove(f) } pluginManager.informOfFileChange(f) - sleep 1000 + sleep(1000) } } else if (i == 1) { changedFiles.clear() @@ -305,12 +305,12 @@ class GrailsApp extends SpringApplication { } def baseFileLocation = appDir?.absolutePath ?: location compilerConfig.setTargetDirectory(new File(baseFileLocation, BuildSettings.BUILD_CLASSES_PATH)) - println "File $changedFile changed, recompiling..." + println("File $changedFile changed, recompiling...") if (changedFile.name.endsWith('.java')) { if (JavaCompiler.isAvailable()) { JavaCompiler.recompile(compilerConfig, changedFile) } else { - log.error("Cannot recompile [$changedFile.name], the current JVM is not a JDK (recompilation will not work on a JRE missing the compiler APIs).") + log.error('Cannot recompile [{}], the current JVM is not a JDK (recompilation will not work on a JRE missing the compiler APIs).', changedFile.name) } } else { compileGroovyFile(compilerConfig, changedFile) @@ -355,9 +355,9 @@ class GrailsApp extends SpringApplication { } protected void configureDirectoryWatcher(DirectoryWatcher directoryWatcher, String location) { - directoryWatcher.addWatchDirectory(new File(location, "grails-app"), ['groovy', 'java']) - directoryWatcher.addWatchDirectory(new File(location, "src/main/groovy"), ['groovy', 'java']) - directoryWatcher.addWatchDirectory(new File(location, "src/main/java"), ['groovy', 'java']) + directoryWatcher.addWatchDirectory(new File(location, 'grails-app'), ['groovy', 'java']) + directoryWatcher.addWatchDirectory(new File(location, 'src/main/groovy'), ['groovy', 'java']) + directoryWatcher.addWatchDirectory(new File(location, 'src/main/java'), ['groovy', 'java']) } protected printRunStatus(ConfigurableApplicationContext applicationContext) { diff --git a/grails-core/src/main/groovy/grails/boot/GrailsAppBuilder.groovy b/grails-core/src/main/groovy/grails/boot/GrailsAppBuilder.groovy index c053cfd731e..a7ba4ea28e1 100644 --- a/grails-core/src/main/groovy/grails/boot/GrailsAppBuilder.groovy +++ b/grails-core/src/main/groovy/grails/boot/GrailsAppBuilder.groovy @@ -21,6 +21,7 @@ package grails.boot import groovy.transform.CompileStatic import groovy.transform.InheritConstructors + import org.springframework.boot.SpringApplication import org.springframework.boot.builder.SpringApplicationBuilder import org.springframework.core.io.ResourceLoader diff --git a/grails-core/src/main/groovy/grails/boot/GrailsPluginApplication.groovy b/grails-core/src/main/groovy/grails/boot/GrailsPluginApplication.groovy index 9796880c683..144b2252d36 100644 --- a/grails-core/src/main/groovy/grails/boot/GrailsPluginApplication.groovy +++ b/grails-core/src/main/groovy/grails/boot/GrailsPluginApplication.groovy @@ -26,4 +26,4 @@ package grails.boot */ interface GrailsPluginApplication { -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/boot/config/GrailsApplicationPostProcessor.groovy b/grails-core/src/main/groovy/grails/boot/config/GrailsApplicationPostProcessor.groovy index 91bdd5d0d75..7a761d90d33 100644 --- a/grails-core/src/main/groovy/grails/boot/config/GrailsApplicationPostProcessor.groovy +++ b/grails-core/src/main/groovy/grails/boot/config/GrailsApplicationPostProcessor.groovy @@ -19,28 +19,9 @@ package grails.boot.config -import grails.boot.GrailsApp -import grails.config.Settings -import grails.core.DefaultGrailsApplication -import grails.core.GrailsApplication -import grails.core.GrailsApplicationClass -import grails.core.GrailsApplicationLifeCycle -import grails.plugins.DefaultGrailsPluginManager -import grails.plugins.GrailsPlugin -import grails.plugins.GrailsPluginManager -import grails.spring.BeanBuilder -import grails.util.Environment -import grails.util.Holders import groovy.transform.CompileStatic import groovy.util.logging.Slf4j -import org.grails.config.NavigableMap -import org.grails.config.PrefixedMapPropertySource -import org.grails.config.PropertySourcesConfig -import org.grails.core.exceptions.GrailsConfigurationException -import org.grails.core.lifecycle.ShutdownOperations -import org.grails.datastore.mapping.model.MappingContext -import org.grails.spring.DefaultRuntimeSpringConfiguration -import org.grails.spring.RuntimeSpringConfigUtilities + import org.springframework.beans.BeansException import org.springframework.beans.factory.BeanFactory import org.springframework.beans.factory.config.ConfigurableBeanFactory @@ -61,6 +42,27 @@ import org.springframework.core.env.ConfigurableEnvironment import org.springframework.core.env.EnumerablePropertySource import org.springframework.core.io.Resource +import grails.boot.GrailsApp +import grails.config.Settings +import grails.core.DefaultGrailsApplication +import grails.core.GrailsApplication +import grails.core.GrailsApplicationClass +import grails.core.GrailsApplicationLifeCycle +import grails.plugins.DefaultGrailsPluginManager +import grails.plugins.GrailsPlugin +import grails.plugins.GrailsPluginManager +import grails.spring.BeanBuilder +import grails.util.Environment +import grails.util.Holders +import org.grails.config.NavigableMap +import org.grails.config.PrefixedMapPropertySource +import org.grails.config.PropertySourcesConfig +import org.grails.core.exceptions.GrailsConfigurationException +import org.grails.core.lifecycle.ShutdownOperations +import org.grails.datastore.mapping.model.MappingContext +import org.grails.spring.DefaultRuntimeSpringConfiguration +import org.grails.spring.RuntimeSpringConfigUtilities + /** * A {@link BeanDefinitionRegistryPostProcessor} that enhances any ApplicationContext with plugin manager capabilities * @@ -70,6 +72,7 @@ import org.springframework.core.io.Resource @CompileStatic @Slf4j class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProcessor, ApplicationContextAware, ApplicationListener { + static final boolean RELOADING_ENABLED = Environment.isReloadingAgentEnabled() final GrailsApplication grailsApplication @@ -83,8 +86,8 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces GrailsApplicationPostProcessor(GrailsApplicationLifeCycle lifeCycle, ApplicationContext applicationContext, Class...classes) { this.lifeCycle = lifeCycle - if(lifeCycle instanceof GrailsApplicationClass) { - this.applicationClass = (GrailsApplicationClass)lifeCycle + if (lifeCycle instanceof GrailsApplicationClass) { + this.applicationClass = (GrailsApplicationClass) lifeCycle } else { this.applicationClass = null @@ -92,14 +95,14 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces this.classes = classes != null ? classes : [] as Class[] grailsApplication = applicationClass != null ? new DefaultGrailsApplication(applicationClass) : new DefaultGrailsApplication() pluginManager = applicationContext?.getBeanNamesForType(GrailsPluginManager) ? applicationContext.getBean(GrailsPluginManager) : new DefaultGrailsPluginManager(grailsApplication) - if(applicationContext != null) { + if (applicationContext != null) { setApplicationContext(applicationContext) } } protected final void initializeGrailsApplication(ApplicationContext applicationContext) { - if(applicationContext == null) { - throw new IllegalStateException("ApplicationContext should not be null") + if (applicationContext == null) { + throw new IllegalStateException('ApplicationContext should not be null') } Environment.setInitializing(true) grailsApplication.applicationContext = applicationContext @@ -126,7 +129,7 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces // register plugin provided classes first, this gives the oppurtunity // for application classes to override those provided by a plugin pluginManager.registerProvidedArtefacts(grailsApplication) - for(cls in classes) { + for (cls in classes) { grailsApplication.addArtefact(cls) } } @@ -134,46 +137,46 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces protected void loadApplicationConfig() { org.springframework.core.env.Environment environment = applicationContext.getEnvironment() ConfigurableConversionService conversionService = null - if(environment instanceof ConfigurableEnvironment) { - if(environment instanceof AbstractEnvironment) { + if (environment instanceof ConfigurableEnvironment) { + if (environment instanceof AbstractEnvironment) { conversionService = environment.getConversionService() conversionService.addConverter(new Converter() { @Override - public Resource convert(String source) { - return applicationContext.getResource(source); + Resource convert(String source) { + return applicationContext.getResource(source) } - }); + }) conversionService.addConverter(new Converter() { @Override - public String convert(NavigableMap.NullSafeNavigator source) { - return null; + String convert(NavigableMap.NullSafeNavigator source) { + return null } - }); + }) conversionService.addConverter(new Converter() { @Override - public Object convert(NavigableMap.NullSafeNavigator source) { - return null; + Object convert(NavigableMap.NullSafeNavigator source) { + return null } - }); + }) } def propertySources = environment.getPropertySources() def plugins = pluginManager.allPlugins - if(plugins) { - for(GrailsPlugin plugin in plugins.reverse()) { + if (plugins) { + for (GrailsPlugin plugin in plugins.reverse()) { def pluginPropertySource = plugin.propertySource - if(pluginPropertySource) { - if(pluginPropertySource instanceof EnumerablePropertySource) { - propertySources.addLast( new PrefixedMapPropertySource( "grails.plugins.$plugin.name", (EnumerablePropertySource)pluginPropertySource ) ) + if (pluginPropertySource) { + if (pluginPropertySource instanceof EnumerablePropertySource) { + propertySources.addLast(new PrefixedMapPropertySource("grails.plugins.$plugin.name", (EnumerablePropertySource) pluginPropertySource)) } - propertySources.addLast pluginPropertySource + propertySources.addLast(pluginPropertySource) } } } def config = new PropertySourcesConfig(propertySources) - if(conversionService != null) { - config.setConversionService( conversionService ) + if (conversionService != null) { + config.setConversionService(conversionService) } - ((DefaultGrailsApplication)grailsApplication).config = config + ((DefaultGrailsApplication) grailsApplication).config = config } } @@ -186,7 +189,7 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces // first register plugin beans pluginManager.doRuntimeConfiguration(springConfig) - if(loadExternalBeans) { + if (loadExternalBeans) { // now allow overriding via application def context = application.mainContext @@ -213,11 +216,11 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces } } - if(lifeCycle) { + if (lifeCycle) { def withSpring = lifeCycle.doWithSpring() - if(withSpring) { + if (withSpring) { def bb = new BeanBuilder(null, springConfig, application.classLoader) - bb.beans withSpring + bb.beans(withSpring) } } @@ -239,13 +242,13 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces @Override void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if(this.applicationContext != applicationContext && applicationContext != null) { + if (this.applicationContext != applicationContext && applicationContext != null) { this.applicationContext = applicationContext initializeGrailsApplication(applicationContext) - if(applicationContext instanceof ConfigurableApplicationContext) { + if (applicationContext instanceof ConfigurableApplicationContext) { def configurable = (ConfigurableApplicationContext) applicationContext configurable.addApplicationListener(this) - configurable.environment.addActiveProfile( grailsApplication.getConfig().getProperty(Settings.PROFILE, String, "web")) + configurable.environment.addActiveProfile(grailsApplication.getConfig().getProperty(Settings.PROFILE, String, 'web')) } } } @@ -258,9 +261,9 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces // Only act if the event is for our context Collection lifeCycleBeans = context.getBeansOfType(GrailsApplicationLifeCycle).values() if (event instanceof ContextRefreshedEvent) { - if (context.containsBean("grailsDomainClassMappingContext")) { + if (context.containsBean('grailsDomainClassMappingContext')) { grailsApplication.setMappingContext( - context.getBean("grailsDomainClassMappingContext", MappingContext) + context.getBean('grailsDomainClassMappingContext', MappingContext) ) } Environment.setInitializing(false) @@ -282,7 +285,7 @@ class GrailsApplicationPostProcessor implements BeanDefinitionRegistryPostProces lifeCycle.onStartup(eventMap) } } - else if(event instanceof ContextClosedEvent) { + else if (event instanceof ContextClosedEvent) { Map eventMap = [:] eventMap.put('source', pluginManager) for (GrailsApplicationLifeCycle lifeCycle in lifeCycleBeans.asList().reverse()) { diff --git a/grails-core/src/main/groovy/grails/boot/config/GrailsAutoConfiguration.groovy b/grails-core/src/main/groovy/grails/boot/config/GrailsAutoConfiguration.groovy index 23bcd7ec482..7fe5f55b1e3 100644 --- a/grails-core/src/main/groovy/grails/boot/config/GrailsAutoConfiguration.groovy +++ b/grails-core/src/main/groovy/grails/boot/config/GrailsAutoConfiguration.groovy @@ -18,21 +18,23 @@ */ package grails.boot.config -import grails.config.Config -import grails.core.GrailsApplication -import grails.boot.config.tools.ClassPathScanner -import grails.core.GrailsApplicationClass +import java.lang.reflect.Field + import groovy.transform.CompileStatic -import org.grails.compiler.injection.AbstractGrailsArtefactTransformer -import org.grails.spring.aop.autoproxy.GroovyAwareAspectJAwareAdvisorAutoProxyCreator -import org.grails.spring.aop.autoproxy.GroovyAwareInfrastructureAdvisorAutoProxyCreator + import org.springframework.aop.config.AopConfigUtils import org.springframework.context.ApplicationContext import org.springframework.context.ApplicationContextAware import org.springframework.context.annotation.Bean import org.springframework.core.io.support.PathMatchingResourcePatternResolver -import java.lang.reflect.Field +import grails.boot.config.tools.ClassPathScanner +import grails.config.Config +import grails.core.GrailsApplication +import grails.core.GrailsApplicationClass +import org.grails.compiler.injection.AbstractGrailsArtefactTransformer +import org.grails.spring.aop.autoproxy.GroovyAwareAspectJAwareAdvisorAutoProxyCreator +import org.grails.spring.aop.autoproxy.GroovyAwareInfrastructureAdvisorAutoProxyCreator /** * A base class for configurations that bootstrap a Grails application @@ -45,18 +47,18 @@ import java.lang.reflect.Field // WARNING: Never add logging to the source of this class, early initialization causes problems class GrailsAutoConfiguration implements GrailsApplicationClass, ApplicationContextAware { - private static final String APC_PRIORITY_LIST_FIELD = "APC_PRIORITY_LIST" + private static final String APC_PRIORITY_LIST_FIELD = 'APC_PRIORITY_LIST' static { try { // patch AopConfigUtils if possible - Field field = AopConfigUtils.class.getDeclaredField(APC_PRIORITY_LIST_FIELD) - if(field != null) { + Field field = AopConfigUtils.getDeclaredField(APC_PRIORITY_LIST_FIELD) + if (field != null) { field.setAccessible(true) Object obj = field.get(null) List> list = (List>) obj - list.add(GroovyAwareInfrastructureAdvisorAutoProxyCreator.class) - list.add(GroovyAwareAspectJAwareAdvisorAutoProxyCreator.class) + list.add(GroovyAwareInfrastructureAdvisorAutoProxyCreator) + list.add(GroovyAwareAspectJAwareAdvisorAutoProxyCreator) } } catch (Throwable e) { // ignore @@ -70,7 +72,7 @@ class GrailsAutoConfiguration implements GrailsApplicationClass, ApplicationCont */ @Bean GrailsApplicationPostProcessor grailsApplicationPostProcessor() { - return new GrailsApplicationPostProcessor( this, applicationContext, classes() as Class[]) + return new GrailsApplicationPostProcessor(this, applicationContext, classes() as Class[]) } /** @@ -80,15 +82,15 @@ class GrailsAutoConfiguration implements GrailsApplicationClass, ApplicationCont Collection classes = new HashSet() ClassPathScanner scanner = new ClassPathScanner() - if(limitScanningToApplication()) { - classes.addAll scanner.scan(getClass(), packageNames()) + if (limitScanningToApplication()) { + classes.addAll(scanner.scan(getClass(), packageNames())) } else { - classes.addAll scanner.scan(new PathMatchingResourcePatternResolver(applicationContext), packageNames()) + classes.addAll(scanner.scan(new PathMatchingResourcePatternResolver(applicationContext), packageNames())) } ClassLoader classLoader = getClass().getClassLoader() - for(cls in AbstractGrailsArtefactTransformer.transformedClassNames) { + for (cls in AbstractGrailsArtefactTransformer.transformedClassNames) { try { classes << classLoader.loadClass(cls) } catch (ClassNotFoundException cnfe) { @@ -99,7 +101,6 @@ class GrailsAutoConfiguration implements GrailsApplicationClass, ApplicationCont return classes } - /** * Whether classpath scanning should be limited to the application and not dependent JAR files. Users can override this method to enable more broad scanning * at the cost of startup time. @@ -125,7 +126,6 @@ class GrailsAutoConfiguration implements GrailsApplicationClass, ApplicationCont packages().collect { Package p -> p.name } } - @Override Closure doWithSpring() { null } diff --git a/grails-core/src/main/groovy/grails/boot/config/tools/ClassPathScanner.groovy b/grails-core/src/main/groovy/grails/boot/config/tools/ClassPathScanner.groovy index 8691eaf698c..c04af0f3e06 100644 --- a/grails-core/src/main/groovy/grails/boot/config/tools/ClassPathScanner.groovy +++ b/grails-core/src/main/groovy/grails/boot/config/tools/ClassPathScanner.groovy @@ -16,12 +16,13 @@ */ package grails.boot.config.tools -import grails.config.Settings -import grails.io.IOUtils +import java.lang.annotation.Annotation + import groovy.transform.CompileStatic import groovy.transform.InheritConstructors import groovy.transform.Memoized import groovy.util.logging.Slf4j + import org.springframework.core.io.DefaultResourceLoader import org.springframework.core.io.Resource import org.springframework.core.io.support.PathMatchingResourcePatternResolver @@ -29,7 +30,8 @@ import org.springframework.core.io.support.ResourcePatternResolver import org.springframework.core.type.classreading.SimpleMetadataReaderFactory import org.springframework.util.ClassUtils -import java.lang.annotation.Annotation +import grails.config.Settings +import grails.io.IOUtils /** * Used to scan for classes on the classpath in the most efficient manner possible. @@ -42,8 +44,8 @@ import java.lang.annotation.Annotation @Slf4j @CompileStatic class ClassPathScanner { - private static final List DEFAULT_IGNORED_ROOT_PACKAGES = ['com', 'org', 'net', 'co', 'java', 'javax', 'jakarta', 'groovy'] + private static final List DEFAULT_IGNORED_ROOT_PACKAGES = ['com', 'org', 'net', 'co', 'java', 'javax', 'jakarta', 'groovy'] /** * Scans for classes relative to the given class @@ -53,7 +55,7 @@ class ClassPathScanner { * @return A set of classes */ Set scan(Class applicationClass) { - return scan(applicationClass,[applicationClass.package.name]) + return scan(applicationClass, [applicationClass.package.name]) } /** @@ -65,7 +67,7 @@ class ClassPathScanner { * @return A set of classes */ Set scan(Class applicationClass, Class annotationFilter) { - return scan(applicationClass,[applicationClass.package.name], annotationFilter) + return scan(applicationClass, [applicationClass.package.name], annotationFilter) } /** @@ -76,8 +78,8 @@ class ClassPathScanner { * * @return A set of classes */ - Set scan(Class applicationClass, Closure annotationFilter ) { - return scan(applicationClass,[applicationClass.package.name], annotationFilter) + Set scan(Class applicationClass, Closure annotationFilter) { + return scan(applicationClass, [applicationClass.package.name], annotationFilter) } /** * Scans for classes relative to the given class @@ -105,7 +107,7 @@ class ClassPathScanner { */ Set scan(Class applicationClass, Collection packageNames, Closure annotationFilter = { String annotation -> annotation.startsWith('grails.') }) { ResourcePatternResolver resourcePatternResolver = new GrailsClasspathIgnoringResourceResolver(applicationClass) - return scan(applicationClass.getClassLoader(), resourcePatternResolver,packageNames, annotationFilter) + return scan(applicationClass.getClassLoader(), resourcePatternResolver, packageNames, annotationFilter) } /** @@ -137,15 +139,15 @@ class ClassPathScanner { continue } - if(pkg == "") { + if (pkg == '') { // try the default package in case of a script without recursing into subpackages - log.warn("The application defines a Groovy source using the default package. Please move all Groovy sources into a package.") - String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "*.class" + log.warn('The application defines a Groovy source using the default package. Please move all Groovy sources into a package.') + String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + '*.class' scanUsingPattern(resourcePatternResolver, pattern, classLoader, annotationFilter, classes) } else { String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + - ClassUtils.convertClassNameToResourcePath(pkg) + Settings.CLASS_RESOURCE_PATTERN; + ClassUtils.convertClassNameToResourcePath(pkg) + Settings.CLASS_RESOURCE_PATTERN scanUsingPattern(resourcePatternResolver, pattern, classLoader, annotationFilter, classes) } @@ -161,7 +163,7 @@ class ClassPathScanner { */ protected boolean isExcluded(Resource res) { String filename = res.filename - return filename.contains('$') || filename.startsWith("gsp_") || filename.endsWith("_gson.class") + return filename.contains('$') || filename.startsWith('gsp_') || filename.endsWith('_gson.class') } /** @@ -187,7 +189,6 @@ class ClassPathScanner { } } - @CompileStatic @InheritConstructors @Slf4j @@ -206,7 +207,7 @@ class ClassPathScanner { URL url = resourceUrls.nextElement() // if the path is from a JAR file ignore, plugins inside JAR files will have their own mechanism for loading - if(!url.path.contains('jar!/grails/')) { + if (!url.path.contains('jar!/grails/')) { result.add(convertClassLoaderURL(url)) } @@ -238,7 +239,7 @@ class ClassPathScanner { this.rootResource = getURLs()[0] this.applicationClass = applicationClass String urlStr = rootResource.toString() - jarDeployed = urlStr.startsWith("jar:") + jarDeployed = urlStr.startsWith('jar:') try { URL withoutBang = new URL("${urlStr.substring(0, urlStr.length() - 2)}/") addURL(withoutBang) @@ -250,7 +251,7 @@ class ClassPathScanner { @Override Enumeration getResources(String name) throws IOException { - if(jarDeployed && name == '') { + if (jarDeployed && name == '') { return applicationClass.getClassLoader().getResources(name) } else { diff --git a/grails-core/src/main/groovy/grails/boot/config/tools/ProfilingGrailsApplicationPostProcessor.groovy b/grails-core/src/main/groovy/grails/boot/config/tools/ProfilingGrailsApplicationPostProcessor.groovy index e93d1eea854..a0843de0c4b 100644 --- a/grails-core/src/main/groovy/grails/boot/config/tools/ProfilingGrailsApplicationPostProcessor.groovy +++ b/grails-core/src/main/groovy/grails/boot/config/tools/ProfilingGrailsApplicationPostProcessor.groovy @@ -18,13 +18,13 @@ */ package grails.boot.config.tools -import grails.boot.config.GrailsApplicationPostProcessor -import grails.core.GrailsApplicationLifeCycle import org.springframework.beans.BeansException import org.springframework.beans.factory.config.BeanPostProcessor import org.springframework.context.ApplicationContext import org.springframework.context.ConfigurableApplicationContext +import grails.boot.config.GrailsApplicationPostProcessor +import grails.core.GrailsApplicationLifeCycle /** * Profiles bean creation outputting data to the console @@ -34,12 +34,11 @@ import org.springframework.context.ConfigurableApplicationContext */ class ProfilingGrailsApplicationPostProcessor extends GrailsApplicationPostProcessor implements BeanPostProcessor { - long startTime ProfilingGrailsApplicationPostProcessor(GrailsApplicationLifeCycle lifeCycle, ApplicationContext applicationContext, Class... classes) { super(lifeCycle, applicationContext, classes) - ((ConfigurableApplicationContext)applicationContext).beanFactory.addBeanPostProcessor(this) + ((ConfigurableApplicationContext) applicationContext).beanFactory.addBeanPostProcessor(this) } @Override @@ -51,8 +50,8 @@ class ProfilingGrailsApplicationPostProcessor extends GrailsApplicationPostProce @Override Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { def totalTime = System.currentTimeMillis() - startTime - if(totalTime > 10) { - println "Creating bean $beanName of type ${bean.getClass()} took ${totalTime}ms" + if (totalTime > 10) { + println("Creating bean $beanName of type ${bean.getClass()} took ${totalTime}ms") } return bean } diff --git a/grails-core/src/main/groovy/grails/boot/config/tools/SettingsFile.groovy b/grails-core/src/main/groovy/grails/boot/config/tools/SettingsFile.groovy index 31fa665df3c..6c8dd94c87a 100644 --- a/grails-core/src/main/groovy/grails/boot/config/tools/SettingsFile.groovy +++ b/grails-core/src/main/groovy/grails/boot/config/tools/SettingsFile.groovy @@ -21,7 +21,6 @@ package grails.boot.config.tools import groovy.transform.CompileStatic - /** * Used to interpret the Gradle settings.gradle file * @@ -31,13 +30,12 @@ import groovy.transform.CompileStatic @CompileStatic abstract class SettingsFile extends Script { - void include(String[] projectPaths) { - binding.setVariable("projectPaths", projectPaths) + binding.setVariable('projectPaths', projectPaths) } void includeFlat(String[] projectPaths) { - binding.setVariable("projectPaths", projectPaths) + binding.setVariable('projectPaths', projectPaths) } def methodMissing(String name, args) { diff --git a/grails-core/src/main/groovy/grails/compiler/DelegatingMethod.groovy b/grails-core/src/main/groovy/grails/compiler/DelegatingMethod.groovy index 8e3308a5991..28e6a30a6b8 100644 --- a/grails-core/src/main/groovy/grails/compiler/DelegatingMethod.groovy +++ b/grails-core/src/main/groovy/grails/compiler/DelegatingMethod.groovy @@ -23,7 +23,6 @@ import java.lang.annotation.Retention import java.lang.annotation.RetentionPolicy import java.lang.annotation.Target - /** * Used to indicate to the compiler that a particular method simply delegates to another one. This information is useful in cases where only the final method * should be transformed and not the methods that delegate to the said method. @@ -36,4 +35,4 @@ import java.lang.annotation.Target @Target([ElementType.METHOD]) @interface DelegatingMethod { -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/compiler/GrailsCompileStatic.groovy b/grails-core/src/main/groovy/grails/compiler/GrailsCompileStatic.groovy index aae251ba80a..50d08049078 100644 --- a/grails-core/src/main/groovy/grails/compiler/GrailsCompileStatic.groovy +++ b/grails-core/src/main/groovy/grails/compiler/GrailsCompileStatic.groovy @@ -34,5 +34,4 @@ import groovy.transform.CompileStatic 'org.grails.compiler.DynamicFinderTypeCheckingExtension', 'org.grails.compiler.DomainMappingTypeCheckingExtension', 'org.grails.compiler.RelationshipManagementMethodTypeCheckingExtension']) -@interface GrailsCompileStatic { -} +@interface GrailsCompileStatic {} diff --git a/grails-core/src/main/groovy/grails/compiler/ast/ClassInjector.java b/grails-core/src/main/groovy/grails/compiler/ast/ClassInjector.java index a56a3310ad5..e7bf0003f64 100644 --- a/grails-core/src/main/groovy/grails/compiler/ast/ClassInjector.java +++ b/grails-core/src/main/groovy/grails/compiler/ast/ClassInjector.java @@ -54,7 +54,6 @@ public interface ClassInjector { */ void performInjection(SourceUnit source, ClassNode classNode); - /** * Handles injection of properties, methods etc. into a class. * diff --git a/grails-core/src/main/groovy/grails/compiler/ast/GlobalClassInjector.groovy b/grails-core/src/main/groovy/grails/compiler/ast/GlobalClassInjector.groovy index f44f65a7deb..8f0a838c377 100644 --- a/grails-core/src/main/groovy/grails/compiler/ast/GlobalClassInjector.groovy +++ b/grails-core/src/main/groovy/grails/compiler/ast/GlobalClassInjector.groovy @@ -25,6 +25,6 @@ package grails.compiler.ast * @author Graeme Rocher * @since 3.0 */ -public interface GlobalClassInjector extends ClassInjector{ +interface GlobalClassInjector extends ClassInjector { -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/compiler/ast/GlobalClassInjectorAdapter.groovy b/grails-core/src/main/groovy/grails/compiler/ast/GlobalClassInjectorAdapter.groovy index 6a8b66d7652..dc22df68fe3 100644 --- a/grails-core/src/main/groovy/grails/compiler/ast/GlobalClassInjectorAdapter.groovy +++ b/grails-core/src/main/groovy/grails/compiler/ast/GlobalClassInjectorAdapter.groovy @@ -48,9 +48,9 @@ abstract class GlobalClassInjectorAdapter implements GlobalClassInjector { @Override void performInjectionOnAnnotatedClass(SourceUnit source, ClassNode classNode) { def className = classNode.name - if(!processesClassNames.contains(className)) { - performInjectionInternal source, classNode - processesClassNames.add className + if (!processesClassNames.contains(className)) { + performInjectionInternal(source, classNode) + processesClassNames.add(className) } } diff --git a/grails-core/src/main/groovy/grails/compiler/ast/SupportsClassNode.java b/grails-core/src/main/groovy/grails/compiler/ast/SupportsClassNode.java index afffb0733cb..69ad741a8ce 100644 --- a/grails-core/src/main/groovy/grails/compiler/ast/SupportsClassNode.java +++ b/grails-core/src/main/groovy/grails/compiler/ast/SupportsClassNode.java @@ -28,6 +28,6 @@ */ public interface SupportsClassNode { - boolean supports(ClassNode classNode); + boolean supports(ClassNode classNode); } diff --git a/grails-core/src/main/groovy/grails/config/Config.groovy b/grails-core/src/main/groovy/grails/config/Config.groovy index f5f74e92294..814baadf363 100644 --- a/grails-core/src/main/groovy/grails/config/Config.groovy +++ b/grails-core/src/main/groovy/grails/config/Config.groovy @@ -58,5 +58,5 @@ interface Config extends PropertyResolver, ConfigMap { * * @see #getRequiredProperty(String, Class) */ - public T getProperty(String key, Class targetType, T defaultValue, List allowedValues); -} \ No newline at end of file + T getProperty(String key, Class targetType, T defaultValue, List allowedValues) +} diff --git a/grails-core/src/main/groovy/grails/config/ConfigProperties.groovy b/grails-core/src/main/groovy/grails/config/ConfigProperties.groovy index c33f894fbe0..2561c7421b5 100644 --- a/grails-core/src/main/groovy/grails/config/ConfigProperties.groovy +++ b/grails-core/src/main/groovy/grails/config/ConfigProperties.groovy @@ -20,7 +20,6 @@ package grails.config import groovy.transform.CompileStatic - /** * Cached access to Config.toProperties to avoid repeated calls * @@ -45,8 +44,8 @@ class ConfigProperties extends Properties { Enumeration propertyNames() { def i = config.keySet().iterator() return ([ - hasMoreElements: {-> i.hasNext() }, - nextElement: {-> i.next() } + hasMoreElements: { -> i.hasNext() }, + nextElement: { -> i.next() } ]) as Enumeration } @@ -67,12 +66,12 @@ class ConfigProperties extends Properties { @Override Enumeration keys() { - return (Enumeration)propertyNames() + return (Enumeration) propertyNames() } @Override Set keySet() { - return (Set)stringPropertyNames() + return (Set) stringPropertyNames() } @Override diff --git a/grails-core/src/main/groovy/grails/config/Settings.groovy b/grails-core/src/main/groovy/grails/config/Settings.groovy index b2114cfafd4..f416c2961d8 100644 --- a/grails-core/src/main/groovy/grails/config/Settings.groovy +++ b/grails-core/src/main/groovy/grails/config/Settings.groovy @@ -26,68 +26,69 @@ package grails.config * @since 3.0 */ interface Settings { + /** * The active Grails profile */ - String PROFILE = "grails.profile" + String PROFILE = 'grails.profile' /** * Packages to scan for Spring beans */ - String SPRING_BEAN_PACKAGES = "grails.spring.bean.packages" + String SPRING_BEAN_PACKAGES = 'grails.spring.bean.packages' /** * Whether to disable AspectJ explicitly */ - String SPRING_DISABLE_ASPECTJ = "grails.spring.disable.aspectj.autoweaving" + String SPRING_DISABLE_ASPECTJ = 'grails.spring.disable.aspectj.autoweaving' /** * The prefix to use for property placeholders */ - String SPRING_PLACEHOLDER_PREFIX = "grails.spring.placeholder.prefix" + String SPRING_PLACEHOLDER_PREFIX = 'grails.spring.placeholder.prefix' /** * Whether to enable Spring proxy based transaction management. Since {@code @Transactional} uses an AST transform, this makes Spring proxy based transaction management redundant. * However, if Spring proxies are prefer */ - String SPRING_TRANSACTION_MANAGEMENT = "grails.spring.transactionManagement.proxies" + String SPRING_TRANSACTION_MANAGEMENT = 'grails.spring.transactionManagement.proxies' /** * Which plugins to include in the plugin manager */ - String PLUGIN_INCLUDES = "grails.plugin.includes" + String PLUGIN_INCLUDES = 'grails.plugin.includes' /** * Which plugins to exclude from the plugin manager */ - String PLUGIN_EXCLUDES = "grails.plugin.excludes" + String PLUGIN_EXCLUDES = 'grails.plugin.excludes' /** * Whether to include the jsessionid in the rendered links **/ - String GRAILS_VIEWS_ENABLE_JSESSIONID = "grails.views.enable.jsessionid" + String GRAILS_VIEWS_ENABLE_JSESSIONID = 'grails.views.enable.jsessionid' - String VIEWS_FILTERING_CODEC_FOR_CONTENT_TYPE = "grails.views.filteringCodecForContentType" + String VIEWS_FILTERING_CODEC_FOR_CONTENT_TYPE = 'grails.views.filteringCodecForContentType' /** * Whether to disable caching of resources in GSP */ - String GSP_DISABLE_CACHING_RESOURCES = "grails.gsp.disable.caching.resources" + String GSP_DISABLE_CACHING_RESOURCES = 'grails.gsp.disable.caching.resources' /** * Whether to enable GSP reload in production */ - String GSP_ENABLE_RELOAD = "grails.gsp.enable.reload" + String GSP_ENABLE_RELOAD = 'grails.gsp.enable.reload' /** * Thew views directory for GSP */ - String GSP_VIEWS_DIR = "grails.gsp.view.dir" + String GSP_VIEWS_DIR = 'grails.gsp.view.dir' /** * The encoding to use for GSP views, defaults to UTF-8 */ - String GSP_VIEW_ENCODING = "grails.views.gsp.encoding" + String GSP_VIEW_ENCODING = 'grails.views.gsp.encoding' /** * Pattern to use for class scanning */ - String CLASS_RESOURCE_PATTERN = "/**/*.class" + String CLASS_RESOURCE_PATTERN = '/**/*.class' /** * The default configured constraints for the application @@ -97,12 +98,12 @@ interface Settings { /** * Whether to autowire instances */ - String GORM_AUTOWIRE_INSTANCES = "grails.gorm.autowire" + String GORM_AUTOWIRE_INSTANCES = 'grails.gorm.autowire' /** * Whether to translate GORM events into reactor events */ - String GORM_REACTOR_EVENTS = "grails.gorm.reactor.events" + String GORM_REACTOR_EVENTS = 'grails.gorm.reactor.events' /** * The configured mime types */ @@ -125,27 +126,27 @@ interface Settings { /** * The default scope for controllers */ - String CONTROLLERS_DEFAULT_SCOPE = "grails.controllers.defaultScope" + String CONTROLLERS_DEFAULT_SCOPE = 'grails.controllers.defaultScope' /** * The upload directory for controllers, defaults to java.tmp.dir */ - String CONTROLLERS_UPLOAD_LOCATION = "grails.controllers.upload.location" + String CONTROLLERS_UPLOAD_LOCATION = 'grails.controllers.upload.location' /** * The maximum file size */ - String CONTROLLERS_UPLOAD_MAX_FILE_SIZE = "grails.controllers.upload.maxFileSize" + String CONTROLLERS_UPLOAD_MAX_FILE_SIZE = 'grails.controllers.upload.maxFileSize' /** * The maximum request size */ - String CONTROLLERS_UPLOAD_MAX_REQUEST_SIZE = "grails.controllers.upload.maxRequestSize" + String CONTROLLERS_UPLOAD_MAX_REQUEST_SIZE = 'grails.controllers.upload.maxRequestSize' /** * The file size threshold */ - String CONTROLLERS_UPLOAD_FILE_SIZE_THRESHOLD = "grails.controllers.upload.fileSizeThreshold" + String CONTROLLERS_UPLOAD_FILE_SIZE_THRESHOLD = 'grails.controllers.upload.fileSizeThreshold' /** * The encoding to use for filters, default to UTF-8 @@ -160,17 +161,17 @@ interface Settings { /** * The converter to use for creating URL tokens in URL mapping. Defaults to camel case. */ - String WEB_URL_CONVERTER = "grails.web.url.converter" + String WEB_URL_CONVERTER = 'grails.web.url.converter' /** * Whether to cache links generated by the link generator */ - String WEB_LINK_GENERATOR_USE_CACHE = "grails.web.linkGenerator.useCache" + String WEB_LINK_GENERATOR_USE_CACHE = 'grails.web.linkGenerator.useCache' /** * The path to the Grails servlet. Defaults to '/' */ - String WEB_SERVLET_PATH = "grails.web.servlet.path" + String WEB_SERVLET_PATH = 'grails.web.servlet.path' /** * The URL of the server @@ -215,32 +216,32 @@ interface Settings { /** * The default encoding */ - String DEFAULT_ENCODING = System.getProperty('file.encoding',"UTF-8") + String DEFAULT_ENCODING = System.getProperty('file.encoding', 'UTF-8') /** * Whether to log request parameters in the console */ - String SETTING_LOG_REQUEST_PARAMETERS = "grails.exceptionresolver.logRequestParameters" + String SETTING_LOG_REQUEST_PARAMETERS = 'grails.exceptionresolver.logRequestParameters' /** * The parameters to exclude from logging */ - String SETTING_EXCEPTION_RESOLVER_PARAM_EXCLUDES = "grails.exceptionresolver.params.exclude" + String SETTING_EXCEPTION_RESOLVER_PARAM_EXCLUDES = 'grails.exceptionresolver.params.exclude' /** * The class to use for stacktrace filtering. Should be an instanceof {@link org.grails.exceptions.reporting.StackTraceFilterer} */ - String SETTING_LOGGING_STACKTRACE_FILTER_CLASS = "grails.logging.stackTraceFiltererClass" + String SETTING_LOGGING_STACKTRACE_FILTER_CLASS = 'grails.logging.stackTraceFiltererClass' /** * Whether to use the legacy JSON builder */ - String SETTING_LEGACY_JSON_BUILDER = "grails.json.legacy.builder" + String SETTING_LEGACY_JSON_BUILDER = 'grails.json.legacy.builder' /** * Whether to execute Bootstrap classes */ - String SETTING_SKIP_BOOTSTRAP = "grails.bootstrap.skip" + String SETTING_SKIP_BOOTSTRAP = 'grails.bootstrap.skip' /** * Whether to load cors configuration via a filter (true) or interceptor(false) */ - String SETTING_CORS_FILTER = "grails.cors.filter" + String SETTING_CORS_FILTER = 'grails.cors.filter' String TRIM_STRINGS = 'grails.databinding.trimStrings' diff --git a/grails-core/src/main/groovy/grails/config/external/ExternalConfigRunListener.groovy b/grails-core/src/main/groovy/grails/config/external/ExternalConfigRunListener.groovy index dac7e5bbaca..1decb94c034 100644 --- a/grails-core/src/main/groovy/grails/config/external/ExternalConfigRunListener.groovy +++ b/grails-core/src/main/groovy/grails/config/external/ExternalConfigRunListener.groovy @@ -19,11 +19,13 @@ package grails.config.external -import grails.util.Environment +import java.nio.file.DirectoryStream +import java.nio.file.Files +import java.nio.file.Path + import groovy.transform.CompileStatic import groovy.util.logging.Slf4j -import org.grails.config.PropertySourcesConfig -import org.grails.config.yaml.YamlPropertySourceLoader + import org.springframework.boot.ConfigurableBootstrapContext import org.springframework.boot.SpringApplication import org.springframework.boot.SpringApplicationRunListener @@ -35,9 +37,9 @@ import org.springframework.core.io.DefaultResourceLoader import org.springframework.core.io.Resource import org.springframework.core.io.ResourceLoader -import java.nio.file.DirectoryStream -import java.nio.file.Files -import java.nio.file.Path +import grails.util.Environment +import org.grails.config.PropertySourcesConfig +import org.grails.config.yaml.YamlPropertySourceLoader @CompileStatic @Slf4j @@ -79,7 +81,7 @@ class ExternalConfigRunListener implements SpringApplicationRunListener { propertySources = loadPropertiesConfig(resource) } } else { - log.debug("Config file {} not found", [finalLocation] as Object[]) + log.debug('Config file {} not found', [finalLocation] as Object[]) } } propertySources.each { @@ -140,7 +142,7 @@ class ExternalConfigRunListener implements SpringApplicationRunListener { // Load groovy config from classpath private static List> loadClassConfig(Class location, Map currentConfig) { - log.info("Loading config class {}", location.name) + log.info('Loading config class {}', location.name) ConfigSlurper slurper = new ConfigSlurper(Environment.current.name) WriteFilteringMap filterMap = new WriteFilteringMap(currentConfig) slurper.binding = filterMap @@ -152,7 +154,7 @@ class ExternalConfigRunListener implements SpringApplicationRunListener { // Load groovy config from resource private static List> loadGroovyConfig(Resource resource, String encoding, Map currentConfig) { - log.info("Loading groovy config file {}", resource.URI) + log.info('Loading groovy config file {}', resource.URI) String configText = resource.inputStream.getText(encoding) ConfigSlurper slurper = new ConfigSlurper(Environment.current.name) WriteFilteringMap filterMap = new WriteFilteringMap(currentConfig) @@ -165,12 +167,12 @@ class ExternalConfigRunListener implements SpringApplicationRunListener { } private List> loadYamlConfig(Resource resource) { - log.info("Loading YAML config file {}", resource.URI) + log.info('Loading YAML config file {}', resource.URI) return yamlPropertySourceLoader.load(resource.filename, resource, null) } private List> loadPropertiesConfig(Resource resource) { - log.info("Loading properties config file {}", resource.URI) + log.info('Loading properties config file {}', resource.URI) return propertiesPropertySourceLoader.load(resource.filename, resource) } diff --git a/grails-core/src/main/groovy/grails/config/external/WriterFilteringMap.groovy b/grails-core/src/main/groovy/grails/config/external/WriterFilteringMap.groovy index 10246d2c668..9667f677594 100644 --- a/grails-core/src/main/groovy/grails/config/external/WriterFilteringMap.groovy +++ b/grails-core/src/main/groovy/grails/config/external/WriterFilteringMap.groovy @@ -25,6 +25,7 @@ class WriteFilteringMap implements Map { String keyPrefix private Map proxied // source map + @Delegate private Map overlap // written values, flattened -- shared private Map nestedDestinationMap // written keys at this level diff --git a/grails-core/src/main/groovy/grails/core/ArtefactHandler.java b/grails-core/src/main/groovy/grails/core/ArtefactHandler.java index b5e7e8e8a90..42bd4503094 100644 --- a/grails-core/src/main/groovy/grails/core/ArtefactHandler.java +++ b/grails-core/src/main/groovy/grails/core/ArtefactHandler.java @@ -19,6 +19,7 @@ package grails.core; import org.codehaus.groovy.ast.ClassNode; + import org.springframework.core.Ordered; /** @@ -48,11 +49,13 @@ public interface ArtefactHandler extends Ordered { * @return The aretfact type, as a String */ String getType(); + /** * @param classNode The ClassNode instance * @return True if the given ClassNode instance is an instance of the Artefact type */ boolean isArtefact(ClassNode classNode); + /** *

Called by the GrailsApplication whenever it needs to know if a given class * is considered to be the kind of artefact represented by this handler.

diff --git a/grails-core/src/main/groovy/grails/core/ArtefactHandlerAdapter.java b/grails-core/src/main/groovy/grails/core/ArtefactHandlerAdapter.java index e3f5ffe80e1..64d60362665 100644 --- a/grails-core/src/main/groovy/grails/core/ArtefactHandlerAdapter.java +++ b/grails-core/src/main/groovy/grails/core/ArtefactHandlerAdapter.java @@ -18,22 +18,24 @@ */ package grails.core; -import grails.util.GrailsNameUtils; +import java.io.IOException; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; +import java.net.URL; + import groovy.lang.Closure; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.InnerClassNode; + +import org.springframework.core.Ordered; + +import grails.util.GrailsNameUtils; import org.grails.compiler.injection.GrailsASTUtils; import org.grails.core.exceptions.GrailsRuntimeException; import org.grails.io.support.GrailsResourceUtils; import org.grails.io.support.Resource; import org.grails.io.support.UrlResource; -import org.springframework.core.Ordered; - -import java.io.IOException; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Modifier; -import java.net.URL; /** * Adapter for the {@link grails.core.ArtefactHandler} interface @@ -42,7 +44,7 @@ * @author Graeme Rocher * @since 1.0 */ -@SuppressWarnings( "deprecation" ) +@SuppressWarnings("deprecation") public abstract class ArtefactHandlerAdapter implements ArtefactHandler { protected String type; @@ -76,7 +78,6 @@ public String getType() { return type; } - /** * Default implementation of {@link grails.core.ArtefactHandler#isArtefact(org.codehaus.groovy.ast.ClassNode)} which returns true if the ClassNode passes the * {@link #isArtefactResource(org.grails.io.support.Resource)} method and the name of the ClassNode ends with the {@link #artefactSuffix} @@ -89,17 +90,17 @@ public boolean isArtefact(ClassNode classNode) { int modifiers = classNode.getModifiers(); URL url = GrailsASTUtils.getSourceUrl(classNode); - if(url == null) return false; + if (url == null) return false; try { UrlResource resource = new UrlResource(url); - if(!isArtefactResource(resource)) return false; + if (!isArtefactResource(resource)) return false; } catch (IOException e) { return false; } - if(isValidArtefactClassNode(classNode, modifiers)) { + if (isValidArtefactClassNode(classNode, modifiers)) { String name = classNode.getName(); - if(name != null && this.artefactSuffix != null && name.endsWith(artefactSuffix)) { + if (name != null && this.artefactSuffix != null && name.endsWith(artefactSuffix)) { return true; } } @@ -130,7 +131,7 @@ public final boolean isArtefact(@SuppressWarnings("rawtypes") Class aClass) { return true; } } catch (Throwable t) { - throw new GrailsRuntimeException("Failed to introspect class: "+ aClass, t); + throw new GrailsRuntimeException("Failed to introspect class: " + aClass, t); } return false; @@ -165,16 +166,16 @@ public GrailsClass newArtefactClass(@SuppressWarnings("rawtypes") Class artefact return (GrailsClass) c.newInstance(new Object[] { artefactClass}); } catch (NoSuchMethodException e) { - throw new GrailsRuntimeException("Unable to locate constructor with Class parameter for "+artefactClass, e); + throw new GrailsRuntimeException("Unable to locate constructor with Class parameter for " + artefactClass, e); } catch (IllegalAccessException e) { - throw new GrailsRuntimeException("Unable to locate constructor with Class parameter for "+artefactClass, e); + throw new GrailsRuntimeException("Unable to locate constructor with Class parameter for " + artefactClass, e); } catch (InvocationTargetException e) { - throw new GrailsRuntimeException("Error instantiated artefact class [" + artefactClass + "] of type ["+grailsClassImpl+"]: " + (e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName()), e); + throw new GrailsRuntimeException("Error instantiated artefact class [" + artefactClass + "] of type [" + grailsClassImpl + "]: " + (e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName()), e); } catch (InstantiationException e) { - throw new GrailsRuntimeException("Error instantiated artefact class [" + artefactClass + "] of type ["+grailsClassImpl+"]: " + (e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName()), e); + throw new GrailsRuntimeException("Error instantiated artefact class [" + artefactClass + "] of type [" + grailsClassImpl + "]: " + (e.getMessage() != null ? e.getMessage() : e.getClass().getSimpleName()), e); } } diff --git a/grails-core/src/main/groovy/grails/core/DefaultArtefactInfo.java b/grails-core/src/main/groovy/grails/core/DefaultArtefactInfo.java index 181c3c95bce..1740368199d 100644 --- a/grails-core/src/main/groovy/grails/core/DefaultArtefactInfo.java +++ b/grails-core/src/main/groovy/grails/core/DefaultArtefactInfo.java @@ -18,10 +18,6 @@ */ package grails.core; -import grails.core.ArtefactInfo; -import grails.core.GrailsClass; -import grails.core.InjectableGrailsClass; - import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -36,11 +32,11 @@ */ public class DefaultArtefactInfo implements ArtefactInfo { - private LinkedList grailsClasses = new LinkedList(); + private LinkedList grailsClasses = new LinkedList<>(); private Class[] classes; - private Map grailsClassesByName = new LinkedHashMap(); - private Map> classesByName = new LinkedHashMap>(); - private Map logicalPropertyNameToClassMap = new HashMap(); + private Map grailsClassesByName = new LinkedHashMap<>(); + private Map> classesByName = new LinkedHashMap<>(); + private Map logicalPropertyNameToClassMap = new HashMap<>(); @SuppressWarnings("rawtypes") public Map handlerData = new HashMap(); private GrailsClass[] grailsClassesArray; @@ -55,13 +51,13 @@ public synchronized void addGrailsClass(GrailsClass artefactClass) { } private void addGrailsClassInternal(GrailsClass artefactClass, boolean atStart) { - grailsClassesByName = new LinkedHashMap(grailsClassesByName); - classesByName = new LinkedHashMap>(classesByName); + grailsClassesByName = new LinkedHashMap<>(grailsClassesByName); + classesByName = new LinkedHashMap<>(classesByName); Class actualClass = artefactClass.getClazz(); boolean addToGrailsClasses = true; if (artefactClass instanceof InjectableGrailsClass) { - addToGrailsClasses = ((InjectableGrailsClass)artefactClass).getAvailable(); + addToGrailsClasses = ((InjectableGrailsClass) artefactClass).getAvailable(); } if (addToGrailsClasses) { GrailsClass oldVersion = grailsClassesByName.put(actualClass.getName(), artefactClass); diff --git a/grails-core/src/main/groovy/grails/core/DefaultGrailsApplication.java b/grails-core/src/main/groovy/grails/core/DefaultGrailsApplication.java index ad31acba6d8..8d5e708de42 100644 --- a/grails-core/src/main/groovy/grails/core/DefaultGrailsApplication.java +++ b/grails-core/src/main/groovy/grails/core/DefaultGrailsApplication.java @@ -18,42 +18,37 @@ */ package grails.core; -import grails.config.Config; -import grails.core.events.ArtefactAdditionEvent; -import grails.util.GrailsNameUtils; -import grails.util.GrailsUtil; -import groovy.lang.GroovyClassLoader; -import groovy.lang.GroovyRuntimeException; -import groovy.lang.GroovySystem; -import groovy.lang.MetaClassRegistry; -import groovy.lang.MetaMethod; - import java.io.IOException; import java.io.InputStream; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.URL; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; +import groovy.lang.GroovyClassLoader; +import groovy.lang.GroovyRuntimeException; +import groovy.lang.GroovySystem; +import groovy.lang.MetaClassRegistry; +import groovy.lang.MetaMethod; import org.codehaus.groovy.reflection.CachedClass; import org.codehaus.groovy.runtime.m12n.ExtensionModuleScanner; import org.codehaus.groovy.runtime.metaclass.MetaClassRegistryImpl; -import org.grails.config.PropertySourcesConfig; -import org.grails.core.AbstractGrailsApplication; -import org.grails.core.artefact.DomainClassArtefactHandler; -import org.grails.core.exceptions.GrailsConfigurationException; -import org.grails.core.io.support.GrailsFactoriesLoader; -import org.grails.datastore.mapping.model.MappingContext; -import org.grails.io.support.GrailsResourceUtils; -import org.grails.spring.beans.GrailsApplicationAwareBeanPostProcessor; -import org.springframework.beans.BeansException; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import org.springframework.beans.factory.BeanClassLoaderAware; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; import org.springframework.core.env.ConfigurableEnvironment; @@ -63,6 +58,19 @@ import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; +import grails.config.Config; +import grails.core.events.ArtefactAdditionEvent; +import grails.util.GrailsNameUtils; +import grails.util.GrailsUtil; +import org.grails.config.PropertySourcesConfig; +import org.grails.core.AbstractGrailsApplication; +import org.grails.core.artefact.DomainClassArtefactHandler; +import org.grails.core.exceptions.GrailsConfigurationException; +import org.grails.core.io.support.GrailsFactoriesLoader; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.io.support.GrailsResourceUtils; +import org.grails.spring.beans.GrailsApplicationAwareBeanPostProcessor; + /** * Default implementation of the GrailsApplication interface that manages application loading, * state, and artefact instances. @@ -93,11 +101,11 @@ public class DefaultGrailsApplication extends AbstractGrailsApplication implemen protected Class[] allClasses = new Class[0]; protected static Log log = LogFactory.getLog(DefaultGrailsApplication.class); - protected Set> loadedClasses = new LinkedHashSet>(); + protected Set> loadedClasses = new LinkedHashSet<>(); protected ArtefactHandler[] artefactHandlers; - protected Map artefactHandlersByName = new HashMap(); - protected List> allArtefactClasses = new ArrayList>(); - protected Map artefactInfo = new HashMap(); + protected Map artefactHandlersByName = new HashMap<>(); + protected List> allArtefactClasses = new ArrayList<>(); + protected Map artefactInfo = new HashMap<>(); protected Class[] allArtefactClassesArray; protected Resource[] resources; protected boolean initialised = false; @@ -111,8 +119,8 @@ private static MappingContext buildMappingContextProxy(final DefaultGrailsApplic @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { MappingContext realContext = application.mappingContext; - if(realContext == null) { - throw new GrailsConfigurationException("The method ["+method+"] cannot be accessed before GORM has initialized"); + if (realContext == null) { + throw new GrailsConfigurationException("The method [" + method + "] cannot be accessed before GORM has initialized"); } return ReflectionUtils.invokeMethod(method, realContext, args); } @@ -134,7 +142,7 @@ public DefaultGrailsApplication(GrailsApplicationClass applicationClass) { this(new GroovyClassLoader()); this.applicationClass = applicationClass; } - + public DefaultGrailsApplication(ClassLoader classLoader) { super(); this.classLoader = classLoader; @@ -145,7 +153,7 @@ public DefaultGrailsApplication(ClassLoader classLoader) { * * @param classes The classes */ - public DefaultGrailsApplication(final Class...classes) { + public DefaultGrailsApplication(final Class... classes) { this(classes, new GroovyClassLoader(Thread.currentThread().getContextClassLoader())); } @@ -216,7 +224,7 @@ public GrailsApplicationClass getApplicationClass() { * * @see grails.core.ArtefactHandler */ - @SuppressWarnings( "deprecation" ) + @SuppressWarnings("deprecation") protected void initArtefactHandlers() { List additionalArtefactHandlers = GrailsFactoriesLoader.loadFactories(ArtefactHandler.class, getClassLoader()); @@ -306,7 +314,7 @@ protected void configureLoadedClasses(Class[] classes) { */ protected void refreshArtefactGrailsClassCaches() { for (Object o : artefactInfo.values()) { - ((DefaultArtefactInfo)o).updateComplete(); + ((DefaultArtefactInfo) o).updateComplete(); } } @@ -317,9 +325,9 @@ protected void addToLoaded(Class clazz) { public Config getConfig() { if (config == null) { - if(parentContext != null) { + if (parentContext != null) { org.springframework.core.env.Environment environment = parentContext.getEnvironment(); - if(environment instanceof ConfigurableEnvironment) { + if (environment instanceof ConfigurableEnvironment) { MutablePropertySources propertySources = ((ConfigurableEnvironment) environment).getPropertySources(); this.config = new PropertySourcesConfig(propertySources); } @@ -381,7 +389,7 @@ public Class getClassForName(String className) { */ public void refresh() { if (classLoader instanceof GroovyClassLoader) { - configureLoadedClasses(((GroovyClassLoader)classLoader).getLoadedClasses()); + configureLoadedClasses(((GroovyClassLoader) classLoader).getLoadedClasses()); } } @@ -545,8 +553,6 @@ public void registerArtefactHandler(ArtefactHandler handler) { updateArtefactHandlers(); } - - public boolean hasArtefactHandler(String type) { return artefactHandlersByName.containsKey(type); } @@ -717,11 +723,12 @@ public void initialise() { } private static boolean extensionMethodsInitialized = false; + protected static void initialiseGroovyExtensionModules() { - if(extensionMethodsInitialized) return; + if (extensionMethodsInitialized) return; extensionMethodsInitialized = true; - Map> map = new HashMap>(); + Map> map = new HashMap<>(); ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); @@ -738,13 +745,13 @@ protected static void initialiseGroovyExtensionModules() { try { inStream = url.openStream(); properties.load(inStream); - ((MetaClassRegistryImpl)GroovySystem.getMetaClassRegistry()).registerExtensionModuleFromProperties(properties, classLoader, map); + ((MetaClassRegistryImpl) GroovySystem.getMetaClassRegistry()).registerExtensionModuleFromProperties(properties, classLoader, map); } catch (IOException e) { throw new GroovyRuntimeException("Unable to load module META-INF descriptor", e); } finally { - if(inStream != null) { + if (inStream != null) { inStream.close(); } } @@ -754,7 +761,7 @@ protected static void initialiseGroovyExtensionModules() { for (Map.Entry> moduleMethods : map.entrySet()) { CachedClass cls = moduleMethods.getKey(); - cls.addNewMopMethods( moduleMethods.getValue() ); + cls.addNewMopMethods(moduleMethods.getValue()); } } @@ -810,7 +817,7 @@ protected GrailsClass addArtefact(String artefactType, Class artefactClass, b if (handler != null && handler.isArtefact(artefactClass)) { GrailsClass artefactGrailsClass; if (handler instanceof DomainClassArtefactHandler) { - artefactGrailsClass = ((DomainClassArtefactHandler)handler).newArtefactClass(artefactClass, proxyMappingContext); + artefactGrailsClass = ((DomainClassArtefactHandler) handler).newArtefactClass(artefactClass, proxyMappingContext); } else { artefactGrailsClass = handler.newArtefactClass(artefactClass); } @@ -831,7 +838,7 @@ protected GrailsClass addArtefact(String artefactType, Class artefactClass, b if (isInitialised()) { initializeArtefacts(artefactType); ApplicationContext context = getMainContext(); - if(context instanceof ConfigurableApplicationContext && contextInitialized && ((ConfigurableApplicationContext) context).isActive()) { + if (context instanceof ConfigurableApplicationContext && contextInitialized && ((ConfigurableApplicationContext) context).isActive()) { context.publishEvent(new ArtefactAdditionEvent(artefactGrailsClass)); } @@ -840,15 +847,13 @@ protected GrailsClass addArtefact(String artefactType, Class artefactClass, b return artefactGrailsClass; } - - throw new GrailsConfigurationException("Cannot add " + artefactType + " class [" + artefactClass + "]. It is not a " + artefactType + "!"); } @Override public MappingContext getMappingContext() { - if(mappingContext != null) { + if (mappingContext != null) { return mappingContext; } return proxyMappingContext; diff --git a/grails-core/src/main/groovy/grails/core/GrailsApplication.java b/grails-core/src/main/groovy/grails/core/GrailsApplication.java index fbfb72d3233..7c999a797cb 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsApplication.java +++ b/grails-core/src/main/groovy/grails/core/GrailsApplication.java @@ -18,16 +18,14 @@ */ package grails.core; -import grails.config.Config; -import grails.util.Metadata; - -import java.util.Map; - -import org.grails.datastore.mapping.model.MappingContext; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.io.Resource; +import grails.config.Config; +import grails.util.Metadata; +import org.grails.datastore.mapping.model.MappingContext; + /** *

The main interface representing a running Grails application. This interface's * main purpose is to provide a mechanism for analysing the conventions within a Grails diff --git a/grails-core/src/main/groovy/grails/core/GrailsApplicationClass.groovy b/grails-core/src/main/groovy/grails/core/GrailsApplicationClass.groovy index f8e50d80f3b..56f01a072a2 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsApplicationClass.groovy +++ b/grails-core/src/main/groovy/grails/core/GrailsApplicationClass.groovy @@ -26,5 +26,4 @@ package grails.core */ trait GrailsApplicationClass implements GrailsApplicationLifeCycle { - -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/core/GrailsApplicationLifeCycle.groovy b/grails-core/src/main/groovy/grails/core/GrailsApplicationLifeCycle.groovy index 41a03be5792..7f3ca551ec3 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsApplicationLifeCycle.groovy +++ b/grails-core/src/main/groovy/grails/core/GrailsApplicationLifeCycle.groovy @@ -63,4 +63,4 @@ interface GrailsApplicationLifeCycle { * @param event The event */ void onShutdown(Map event) -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/core/GrailsApplicationLifeCycleAdapter.groovy b/grails-core/src/main/groovy/grails/core/GrailsApplicationLifeCycleAdapter.groovy index 4abd8b00828..35477b641d9 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsApplicationLifeCycleAdapter.groovy +++ b/grails-core/src/main/groovy/grails/core/GrailsApplicationLifeCycleAdapter.groovy @@ -21,7 +21,6 @@ package grails.core import groovy.transform.CompileStatic - /** * Adapter for the {@link GrailsApplicationLifeCycle} interface * @@ -30,9 +29,10 @@ import groovy.transform.CompileStatic */ @CompileStatic class GrailsApplicationLifeCycleAdapter implements GrailsApplicationLifeCycle { + @Override Closure doWithSpring() { - return {->} + return { -> } } @Override diff --git a/grails-core/src/main/groovy/grails/core/GrailsClass.java b/grails-core/src/main/groovy/grails/core/GrailsClass.java index d79479e3ff1..e727992d6c6 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsClass.java +++ b/grails-core/src/main/groovy/grails/core/GrailsClass.java @@ -29,7 +29,7 @@ * @author Graeme Rocher * @since 0.1 */ -public interface GrailsClass extends GrailsApplicationAware{ +public interface GrailsClass extends GrailsApplicationAware { /** * Whether the class is abstract or not diff --git a/grails-core/src/main/groovy/grails/core/GrailsControllerClass.java b/grails-core/src/main/groovy/grails/core/GrailsControllerClass.java index 3495af179db..c65f15f7064 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsControllerClass.java +++ b/grails-core/src/main/groovy/grails/core/GrailsControllerClass.java @@ -18,10 +18,10 @@ */ package grails.core; -import grails.web.UrlConverter; - import java.util.Set; +import grails.web.UrlConverter; + /** * Represents a controller class in Grails. * @@ -67,7 +67,6 @@ public interface GrailsControllerClass extends InjectableGrailsClass { */ String NAMESPACE_PROPERTY = "namespace"; - /** * @return The action names */ @@ -88,7 +87,6 @@ public interface GrailsControllerClass extends InjectableGrailsClass { */ boolean isSingleton(); - /** * Returns the default action for this Controller. * @@ -100,12 +98,14 @@ public interface GrailsControllerClass extends InjectableGrailsClass { * Initialize the controller class */ void initialize(); + /** * Tests if a controller maps to a given URI. * * @return true if controller maps to URI */ boolean mapsToURI(String uri); + /** * Invokes a controller action on the given controller instance * @@ -116,7 +116,6 @@ public interface GrailsControllerClass extends InjectableGrailsClass { */ Object invoke(Object controller, String action) throws Throwable; - /** * Register a new {@link grails.web.UrlConverter} with the controller * diff --git a/grails-core/src/main/groovy/grails/core/GrailsDomainClass.java b/grails-core/src/main/groovy/grails/core/GrailsDomainClass.java index 6415a49a32c..846a412ce60 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsDomainClass.java +++ b/grails-core/src/main/groovy/grails/core/GrailsDomainClass.java @@ -19,7 +19,6 @@ package grails.core; import java.util.Map; -import java.util.Set; import org.springframework.validation.Validator; @@ -45,6 +44,7 @@ public interface GrailsDomainClass extends GrailsClass { * @return Whether to autowire */ boolean isAutowire(); + /** * @param domainClass * @return true if the specifying domain class is on the owning side of a relationship diff --git a/grails-core/src/main/groovy/grails/core/GrailsUrlMappingsClass.java b/grails-core/src/main/groovy/grails/core/GrailsUrlMappingsClass.java index 1e0f21f3293..f7429d4b26b 100644 --- a/grails-core/src/main/groovy/grails/core/GrailsUrlMappingsClass.java +++ b/grails-core/src/main/groovy/grails/core/GrailsUrlMappingsClass.java @@ -18,10 +18,10 @@ */ package grails.core; -import groovy.lang.Closure; - import java.util.List; +import groovy.lang.Closure; + /** * Loads the UrlMappings. */ diff --git a/grails-core/src/main/groovy/grails/core/events/ArtefactAdditionEvent.groovy b/grails-core/src/main/groovy/grails/core/events/ArtefactAdditionEvent.groovy index 20cf92e1357..c62a518c878 100644 --- a/grails-core/src/main/groovy/grails/core/events/ArtefactAdditionEvent.groovy +++ b/grails-core/src/main/groovy/grails/core/events/ArtefactAdditionEvent.groovy @@ -20,14 +20,17 @@ package grails.core.events import groovy.transform.CompileStatic -import grails.core.GrailsClass + import org.springframework.context.ApplicationEvent +import grails.core.GrailsClass + /** * An event triggered for the addition of a new artefact */ @CompileStatic -class ArtefactAdditionEvent extends ApplicationEvent{ +class ArtefactAdditionEvent extends ApplicationEvent { + /** * Create a new ApplicationEvent. * @param source the component that published the event (never {@code null}) @@ -37,6 +40,6 @@ class ArtefactAdditionEvent extends ApplicationEvent{ } GrailsClass getArtefact() { - (GrailsClass)source + (GrailsClass) source } } diff --git a/grails-core/src/main/groovy/grails/core/support/GrailsApplicationAware.java b/grails-core/src/main/groovy/grails/core/support/GrailsApplicationAware.java index b90b688d2a6..7df33ada4c5 100644 --- a/grails-core/src/main/groovy/grails/core/support/GrailsApplicationAware.java +++ b/grails-core/src/main/groovy/grails/core/support/GrailsApplicationAware.java @@ -18,9 +18,10 @@ */ package grails.core.support; -import grails.core.GrailsApplication; import org.springframework.beans.factory.Aware; +import grails.core.GrailsApplication; + /** *

Convenience interface that can be implemented by classes that are * registered by plugins.

diff --git a/grails-core/src/main/groovy/grails/core/support/GrailsConfigurationAware.java b/grails-core/src/main/groovy/grails/core/support/GrailsConfigurationAware.java index 87409703684..aba960e46d1 100644 --- a/grails-core/src/main/groovy/grails/core/support/GrailsConfigurationAware.java +++ b/grails-core/src/main/groovy/grails/core/support/GrailsConfigurationAware.java @@ -18,9 +18,9 @@ */ package grails.core.support; -import grails.config.Config; import org.springframework.beans.factory.Aware; +import grails.config.Config; /** * Obtains the Grails ConfigObject via Spring. diff --git a/grails-core/src/main/groovy/grails/core/support/ParentApplicationContextAware.java b/grails-core/src/main/groovy/grails/core/support/ParentApplicationContextAware.java index ed622109196..8694095bc0f 100644 --- a/grails-core/src/main/groovy/grails/core/support/ParentApplicationContextAware.java +++ b/grails-core/src/main/groovy/grails/core/support/ParentApplicationContextAware.java @@ -27,6 +27,6 @@ * @author Graeme Rocher * @since 0.4 */ -public interface ParentApplicationContextAware extends Aware { +public interface ParentApplicationContextAware extends Aware { void setParentApplicationContext(ApplicationContext parent); } diff --git a/grails-core/src/main/groovy/grails/core/support/proxy/EntityProxyHandler.java b/grails-core/src/main/groovy/grails/core/support/proxy/EntityProxyHandler.java index cf90b61e652..26f12615f86 100644 --- a/grails-core/src/main/groovy/grails/core/support/proxy/EntityProxyHandler.java +++ b/grails-core/src/main/groovy/grails/core/support/proxy/EntityProxyHandler.java @@ -24,7 +24,7 @@ * @author Graeme Rocher * @since 1.3.6 */ -public interface EntityProxyHandler extends ProxyHandler{ +public interface EntityProxyHandler extends ProxyHandler { /** * This method returns the identifier of the proxy or null if the diff --git a/grails-core/src/main/groovy/grails/dev/commands/ApplicationCommand.groovy b/grails-core/src/main/groovy/grails/dev/commands/ApplicationCommand.groovy index d56d756305a..2e61c5fa442 100644 --- a/grails-core/src/main/groovy/grails/dev/commands/ApplicationCommand.groovy +++ b/grails-core/src/main/groovy/grails/dev/commands/ApplicationCommand.groovy @@ -18,10 +18,11 @@ */ package grails.dev.commands +import org.springframework.context.ConfigurableApplicationContext + import grails.util.Described import grails.util.GrailsNameUtils import grails.util.Named -import org.springframework.context.ConfigurableApplicationContext /** * Represents a command that is run against the {@link org.springframework.context.ApplicationContext} @@ -48,7 +49,7 @@ trait ApplicationCommand implements Named, Described { @Override String getName() { - return GrailsNameUtils.getScriptName( GrailsNameUtils.getLogicalName(getClass().getName(),"Command") ) + return GrailsNameUtils.getScriptName(GrailsNameUtils.getLogicalName(getClass().getName(), 'Command')) } @Override @@ -64,4 +65,4 @@ trait ApplicationCommand implements Named, Described { */ abstract boolean handle(ExecutionContext executionContext) -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/dev/commands/ApplicationContextCommandRegistry.groovy b/grails-core/src/main/groovy/grails/dev/commands/ApplicationContextCommandRegistry.groovy index 3c5607f70e7..200e964d898 100644 --- a/grails-core/src/main/groovy/grails/dev/commands/ApplicationContextCommandRegistry.groovy +++ b/grails-core/src/main/groovy/grails/dev/commands/ApplicationContextCommandRegistry.groovy @@ -17,6 +17,7 @@ package grails.dev.commands import groovy.transform.CompileStatic + import org.grails.core.io.support.GrailsFactoriesLoader /** @@ -33,14 +34,14 @@ class ApplicationContextCommandRegistry { ApplicationContextCommandRegistry() { for (ApplicationCommand cmd : GrailsFactoriesLoader.loadFactories(ApplicationCommand)) { - if(!commands.containsKey(cmd.name)) { + if (!commands.containsKey(cmd.name)) { commands[cmd.name] = cmd } } // If this is reflectively loaded from the delegating cli, we need to make sure the context class loader is also used to pull any commands that are loaded from the gradle classpath for (ApplicationCommand cmd : GrailsFactoriesLoader.loadFactories(ApplicationCommand, Thread.currentThread().contextClassLoader)) { - if(!commands.containsKey(cmd.name)) { + if (!commands.containsKey(cmd.name)) { commands[cmd.name] = cmd } } diff --git a/grails-core/src/main/groovy/grails/dev/commands/ExecutionContext.groovy b/grails-core/src/main/groovy/grails/dev/commands/ExecutionContext.groovy index b72b95b9a69..a86e4d90967 100644 --- a/grails-core/src/main/groovy/grails/dev/commands/ExecutionContext.groovy +++ b/grails-core/src/main/groovy/grails/dev/commands/ExecutionContext.groovy @@ -18,9 +18,10 @@ */ package grails.dev.commands -import grails.util.BuildSettings import groovy.transform.Canonical import groovy.transform.CompileStatic + +import grails.util.BuildSettings import org.grails.build.parsing.CommandLine /** @@ -32,6 +33,7 @@ import org.grails.build.parsing.CommandLine @CompileStatic @Canonical class ExecutionContext { + /** * The command line instance */ diff --git a/grails-core/src/main/groovy/grails/dev/commands/io/FileSystemInteraction.groovy b/grails-core/src/main/groovy/grails/dev/commands/io/FileSystemInteraction.groovy index 3a9f461240e..c7ab0ba9fdb 100644 --- a/grails-core/src/main/groovy/grails/dev/commands/io/FileSystemInteraction.groovy +++ b/grails-core/src/main/groovy/grails/dev/commands/io/FileSystemInteraction.groovy @@ -20,7 +20,6 @@ package grails.dev.commands.io import org.grails.io.support.Resource - /** * Utility methods exposed to scripts for interacting with resources (found on the file system or jars) and the file system * @@ -142,4 +141,4 @@ interface FileSystemInteraction { this.into = path } } -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/dev/commands/io/FileSystemInteractionImpl.groovy b/grails-core/src/main/groovy/grails/dev/commands/io/FileSystemInteractionImpl.groovy index de5af7b4473..f57e4ffa813 100644 --- a/grails-core/src/main/groovy/grails/dev/commands/io/FileSystemInteractionImpl.groovy +++ b/grails-core/src/main/groovy/grails/dev/commands/io/FileSystemInteractionImpl.groovy @@ -18,9 +18,17 @@ */ package grails.dev.commands.io -import grails.util.BuildSettings import groovy.transform.CompileStatic -import org.grails.io.support.* + +import grails.util.BuildSettings +import org.grails.io.support.DefaultResourceLoader +import org.grails.io.support.FileSystemResource +import org.grails.io.support.GrailsResourceUtils +import org.grails.io.support.PathMatchingResourcePatternResolver +import org.grails.io.support.Resource +import org.grails.io.support.ResourceLoader +import org.grails.io.support.ResourceLocator +import org.grails.io.support.SpringIOUtils /** * Utility methods exposed to scripts for interacting with resources (found on the file system or jars) and the file system @@ -44,7 +52,6 @@ class FileSystemInteractionImpl implements FileSystemInteraction { this.resourcePatternResolver = new PathMatchingResourcePatternResolver(resourceLoader) } - /** * Makes a directory * @@ -78,9 +85,9 @@ class FileSystemInteractionImpl implements FileSystemInteraction { FileSystemInteraction.CopySpec spec = new FileSystemInteraction.CopySpec() callable.delegate = spec callable.call() - if(spec.from && spec.into) { - if(spec.from instanceof Iterable) { - copyAll((Iterable)spec.from, spec.into) + if (spec.from && spec.into) { + if (spec.from instanceof Iterable) { + copyAll((Iterable) spec.from, spec.into) } else { copy(spec.from, spec.into) @@ -111,7 +118,7 @@ class FileSystemInteractionImpl implements FileSystemInteraction { @Override FileSystemInteractionImpl copyAll(Iterable resources, destination) { mkdir(destination) - for(path in resources) { + for (path in resources) { def from = resource(path) def to = file(destination) copy(from, to) @@ -128,7 +135,7 @@ class FileSystemInteractionImpl implements FileSystemInteraction { */ @Override FileSystemInteractionImpl copy(Resource from, File to) { - if(!to?.exists()) mkdir(to) + if (!to?.exists()) mkdir(to) if (from && to) { if (to.isDirectory()) { mkdir(to) @@ -148,10 +155,10 @@ class FileSystemInteractionImpl implements FileSystemInteraction { */ @Override File file(Object path) { - if(path instanceof File) return (File)path - else if(path instanceof Resource) return ((Resource)path).file + if (path instanceof File) return (File) path + else if (path instanceof Resource) return ((Resource) path).file else { - new File(baseDir ?: new File("."), path.toString()) + new File(baseDir ?: new File('.'), path.toString()) } } @@ -206,21 +213,21 @@ class FileSystemInteractionImpl implements FileSystemInteraction { */ @Override Resource resource(Object path) { - if(!path) return null - if(path instanceof Resource) return (Resource)path + if (!path) return null + if (path instanceof Resource) return (Resource) path def f = file(path) - if(f?.exists() && f.isFile()) { + if (f?.exists() && f.isFile()) { return new FileSystemResource(f) } else { def pathStr = path.toString() def resource = resourceLoader.getResource(pathStr) - if(resource.exists()) { + if (resource.exists()) { return resource } else { def allResources = resources(pathStr) - if(allResources) { + if (allResources) { return allResources[0] } else { @@ -254,11 +261,11 @@ class FileSystemInteractionImpl implements FileSystemInteraction { @Override String projectPath(Object path) { def file = file(path) - if(file) { + if (file) { def basePath = baseDir.canonicalPath return (file.canonicalPath - basePath).substring(1) } - return "" + return '' } /** @@ -272,5 +279,4 @@ class FileSystemInteractionImpl implements FileSystemInteraction { resources(pattern).collect() { Resource res -> res.file } } - } diff --git a/grails-core/src/main/groovy/grails/dev/commands/template/TemplateException.groovy b/grails-core/src/main/groovy/grails/dev/commands/template/TemplateException.groovy index b3062dc9bb5..f485fb474dc 100644 --- a/grails-core/src/main/groovy/grails/dev/commands/template/TemplateException.groovy +++ b/grails-core/src/main/groovy/grails/dev/commands/template/TemplateException.groovy @@ -20,7 +20,6 @@ package grails.dev.commands.template import groovy.transform.InheritConstructors - /** * Exception thrown when an error in template rendering occurs * @@ -28,5 +27,4 @@ import groovy.transform.InheritConstructors * @since 3.0 */ @InheritConstructors -class TemplateException extends RuntimeException { -} +class TemplateException extends RuntimeException {} diff --git a/grails-core/src/main/groovy/grails/dev/commands/template/TemplateRenderer.groovy b/grails-core/src/main/groovy/grails/dev/commands/template/TemplateRenderer.groovy index 7a6d928d584..3ef4cc600b7 100644 --- a/grails-core/src/main/groovy/grails/dev/commands/template/TemplateRenderer.groovy +++ b/grails-core/src/main/groovy/grails/dev/commands/template/TemplateRenderer.groovy @@ -18,8 +18,9 @@ */ package grails.dev.commands.template -import grails.codegen.model.Model import groovy.transform.CompileDynamic + +import grails.codegen.model.Model import org.grails.io.support.Resource /** @@ -53,7 +54,7 @@ interface TemplateRenderer { * @param destination The destination * @param model The model */ - void render(CharSequence template, File destination ) + void render(CharSequence template, File destination) /** * Render the given template to the given destination @@ -62,7 +63,7 @@ interface TemplateRenderer { * @param destination The destination * @param model The model */ - void render(CharSequence template, File destination, Map model ) + void render(CharSequence template, File destination, Map model) /** * Render the given template to the given destination * @@ -97,7 +98,7 @@ interface TemplateRenderer { * @param destination The destination * @param model The model */ - void render(File template, File destination, Map model ) + void render(File template, File destination, Map model) /** * Render the given template to the given destination @@ -117,7 +118,6 @@ interface TemplateRenderer { */ void render(Resource template, File destination, Model model) - /** * Render the given template to the give destination for the given model * @@ -169,4 +169,4 @@ interface TemplateRenderer { * @return The resource or null if it doesn't exist */ Resource template(Object location) -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/dev/commands/template/TemplateRendererImpl.groovy b/grails-core/src/main/groovy/grails/dev/commands/template/TemplateRendererImpl.groovy index 2400ccd2bf8..fe7814907ac 100644 --- a/grails-core/src/main/groovy/grails/dev/commands/template/TemplateRendererImpl.groovy +++ b/grails-core/src/main/groovy/grails/dev/commands/template/TemplateRendererImpl.groovy @@ -19,13 +19,14 @@ package grails.dev.commands.template -import grails.codegen.model.Model -import grails.dev.commands.io.FileSystemInteraction -import grails.dev.commands.io.FileSystemInteractionImpl import groovy.text.GStringTemplateEngine import groovy.text.Template import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + +import grails.codegen.model.Model +import grails.dev.commands.io.FileSystemInteraction +import grails.dev.commands.io.FileSystemInteractionImpl import org.grails.io.support.DefaultResourceLoader import org.grails.io.support.Resource import org.grails.io.support.ResourceLoader @@ -58,7 +59,7 @@ class TemplateRendererImpl implements TemplateRenderer { def templateArg = namedArguments.template Resource template = templateArg instanceof Resource ? templateArg : template(templateArg) boolean overwrite = namedArguments.overwrite as Boolean ?: false - render template, file(namedArguments.destination), namedArguments.model ?: [:], overwrite + render(template, file(namedArguments.destination), namedArguments.model ?: [:], overwrite) } } @@ -169,7 +170,7 @@ class TemplateRendererImpl implements TemplateRenderer { try { def templateEngine = new GStringTemplateEngine() - def reader = new InputStreamReader(template.inputStream, "UTF-8") + def reader = new InputStreamReader(template.inputStream, 'UTF-8') try { t = templateEngine.createTemplate(reader) } finally { @@ -218,12 +219,11 @@ class TemplateRendererImpl implements TemplateRenderer { Resource template(Object location) { Resource f = resource(file("src/main/templates/$location")) if (!f?.exists()) { - return resource("classpath*:META-INF/templates/" + location) + return resource('classpath*:META-INF/templates/' + location) } return resource(f) } - protected static void writeTemplateToDestination(Template template, Map model, File destination) { destination.parentFile.mkdirs() destination.withWriter { BufferedWriter w -> @@ -231,4 +231,4 @@ class TemplateRendererImpl implements TemplateRenderer { w.flush() } } -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/persistence/Event.java b/grails-core/src/main/groovy/grails/persistence/Event.java index 92a183a9b4c..bc9eccb21b5 100644 --- a/grails-core/src/main/groovy/grails/persistence/Event.java +++ b/grails-core/src/main/groovy/grails/persistence/Event.java @@ -31,14 +31,15 @@ public enum Event { onLoad, onSave, beforeLoad, beforeInsert, beforeUpdate, beforeDelete, afterLoad, afterInsert, afterUpdate, afterDelete; private static final String[] allEvents; + static { - List events = new ArrayList(); + List events = new ArrayList<>(); for (Event e : values()) { events.add(e.toString()); } allEvents = events.toArray(new String[events.size()]); - } + /** * @return The names of all persistence events */ diff --git a/grails-core/src/main/groovy/grails/persistence/support/PersistenceContextInterceptorExecutor.groovy b/grails-core/src/main/groovy/grails/persistence/support/PersistenceContextInterceptorExecutor.groovy index 34355c84523..9a0421eae67 100644 --- a/grails-core/src/main/groovy/grails/persistence/support/PersistenceContextInterceptorExecutor.groovy +++ b/grails-core/src/main/groovy/grails/persistence/support/PersistenceContextInterceptorExecutor.groovy @@ -19,6 +19,7 @@ package grails.persistence.support import groovy.transform.CompileStatic + import org.springframework.context.ApplicationContext /** @@ -45,7 +46,6 @@ class PersistenceContextInterceptorExecutor { destroyPersistenceContextInternal(persistenceContextInterceptors) } - static void initPersistenceContext(ApplicationContext appCtx) { if (appCtx) { final interceptors = appCtx.getBeansOfType(PersistenceContextInterceptor).values() @@ -76,5 +76,4 @@ class PersistenceContextInterceptorExecutor { } } - } diff --git a/grails-core/src/main/groovy/grails/plugins/DefaultGrailsPluginManager.java b/grails-core/src/main/groovy/grails/plugins/DefaultGrailsPluginManager.java index edaddd842ce..2bf823327df 100644 --- a/grails-core/src/main/groovy/grails/plugins/DefaultGrailsPluginManager.java +++ b/grails-core/src/main/groovy/grails/plugins/DefaultGrailsPluginManager.java @@ -18,19 +18,46 @@ */ package grails.plugins; -import grails.core.GrailsApplication; -import grails.core.support.ParentApplicationContextAware; -import grails.plugins.exceptions.PluginException; -import grails.util.Environment; -import grails.util.GrailsClassUtils; +import java.io.IOException; +import java.lang.reflect.Modifier; +import java.math.BigDecimal; +import java.math.BigInteger; +import java.net.URI; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Set; + import groovy.lang.GroovyClassLoader; import groovy.lang.GroovySystem; import groovy.lang.MetaClassRegistry; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; import org.codehaus.groovy.control.CompilationFailedException; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.codehaus.groovy.runtime.IOGroovyMethods; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.support.GenericApplicationContext; +import org.springframework.core.io.Resource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.util.Assert; + +import grails.core.GrailsApplication; +import grails.core.support.ParentApplicationContextAware; +import grails.plugins.exceptions.PluginException; +import grails.util.Environment; +import grails.util.GrailsClassUtils; import org.grails.core.exceptions.GrailsConfigurationException; import org.grails.core.io.CachingPathMatchingResourcePatternResolver; import org.grails.io.support.GrailsResourceUtils; @@ -43,30 +70,6 @@ import org.grails.plugins.PluginFilterRetriever; import org.grails.spring.DefaultRuntimeSpringConfiguration; import org.grails.spring.RuntimeSpringConfiguration; -import org.springframework.beans.BeansException; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationContextAware; -import org.springframework.context.support.GenericApplicationContext; -import org.springframework.core.io.Resource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.util.Assert; - -import java.io.IOException; -import java.lang.reflect.Modifier; -import java.math.BigDecimal; -import java.math.BigInteger; -import java.net.URI; -import java.net.URL; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Set; /** *

Handles the loading and management of plug-ins in the Grails system. @@ -98,19 +101,20 @@ public class DefaultGrailsPluginManager extends AbstractGrailsPluginManager { protected static final Class[] COMMON_CLASSES = { - Boolean.class, Byte.class, Character.class, Class.class, Double.class, Float.class, - Integer.class, Long.class, Number.class, Short.class, String.class, BigInteger.class, - BigDecimal.class, URL.class, URI.class}; + Boolean.class, Byte.class, Character.class, Class.class, Double.class, Float.class, + Integer.class, Long.class, Number.class, Short.class, String.class, BigInteger.class, + BigDecimal.class, URL.class, URI.class + }; private static final Log LOG = LogFactory.getLog(DefaultGrailsPluginManager.class); private static final String GRAILS_VERSION = "grailsVersion"; private static final String GRAILS_PLUGIN_SUFFIX = "GrailsPlugin"; - private List delayedLoadPlugins = new LinkedList(); + private List delayedLoadPlugins = new LinkedList<>(); private ApplicationContext parentCtx; private PathMatchingResourcePatternResolver resolver; - private Map delayedEvictions = new HashMap(); - private Map> pluginToObserverMap = new HashMap>(); + private Map delayedEvictions = new HashMap<>(); + private Map> pluginToObserverMap = new HashMap<>(); private PluginFilter pluginFilter; - private List userPlugins = new ArrayList(); + private List userPlugins = new ArrayList<>(); public DefaultGrailsPluginManager(String resourcePath, GrailsApplication application) { super(application); @@ -131,7 +135,7 @@ public DefaultGrailsPluginManager(String[] pluginResources, GrailsApplication ap super(application); resolver = CachingPathMatchingResourcePatternResolver.INSTANCE; - List resourceList = new ArrayList(); + List resourceList = new ArrayList<>(); for (String resourcePath : pluginResources) { try { resourceList.addAll(Arrays.asList(resolver.getResources(resourcePath))); @@ -261,8 +265,8 @@ function visit(node n) visit(n) */ - List sortedPlugins = new ArrayList(toSort.size()); - Set visitedPlugins = new HashSet(); + List sortedPlugins = new ArrayList<>(toSort.size()); + Set visitedPlugins = new HashSet<>(); Map> loadOrderDependencies = resolveLoadDependencies(toSort); for (GrailsPlugin plugin : toSort) { @@ -273,13 +277,13 @@ function visit(node n) } protected Map> resolveLoadDependencies(List plugins) { - Map> loadOrderDependencies = new HashMap>(); + Map> loadOrderDependencies = new HashMap<>(); for (GrailsPlugin plugin : plugins) { if (plugin.getLoadAfterNames() != null) { List loadDepsForPlugin = loadOrderDependencies.get(plugin); if (loadDepsForPlugin == null) { - loadDepsForPlugin = new ArrayList(); + loadDepsForPlugin = new ArrayList<>(); loadOrderDependencies.put(plugin, loadDepsForPlugin); } for (String pluginName : plugin.getLoadAfterNames()) { @@ -294,7 +298,7 @@ protected Map> resolveLoadDependencies(List loadDepsForPlugin = loadOrderDependencies.get(loadBeforePlugin); if (loadDepsForPlugin == null) { - loadDepsForPlugin = new ArrayList(); + loadDepsForPlugin = new ArrayList<>(); loadOrderDependencies.put(loadBeforePlugin, loadDepsForPlugin); } loadDepsForPlugin.add(plugin); @@ -320,20 +324,20 @@ private void visitTopologicalSort(GrailsPlugin plugin, List sorted private void attemptLoadPlugins(ClassLoader gcl) { // retrieve load core plugins first - List grailsCorePlugins = loadCorePlugins ? findCorePlugins() : new ArrayList(); + List grailsCorePlugins = loadCorePlugins ? findCorePlugins() : new ArrayList<>(); List grailsUserPlugins = findUserPlugins(gcl); userPlugins = grailsUserPlugins; - List allPlugins = new ArrayList(grailsCorePlugins); + List allPlugins = new ArrayList<>(grailsCorePlugins); allPlugins.addAll(grailsUserPlugins); //filtering applies to user as well as core plugins List filteredPlugins = getPluginFilter().filterPluginList(allPlugins); //make sure core plugins are loaded first - List orderedCorePlugins = new ArrayList(); - List orderedUserPlugins = new ArrayList(); + List orderedCorePlugins = new ArrayList<>(); + List orderedUserPlugins = new ArrayList<>(); for (GrailsPlugin plugin : filteredPlugins) { if (grailsCorePlugins != null) { @@ -345,7 +349,7 @@ private void attemptLoadPlugins(ClassLoader gcl) { } } - List orderedPlugins = new ArrayList(); + List orderedPlugins = new ArrayList<>(); orderedPlugins.addAll(orderedCorePlugins); orderedPlugins.addAll(orderedUserPlugins); @@ -358,7 +362,7 @@ private List findCorePlugins() { CorePluginFinder finder = new CorePluginFinder(application); finder.setParentApplicationContext(parentCtx); - List grailsCorePlugins = new ArrayList(); + List grailsCorePlugins = new ArrayList<>(); final Class[] corePluginClasses = finder.getPluginClasses(); @@ -474,7 +478,7 @@ protected GrailsPlugin createGrailsPlugin(Class pluginClass, Resource resourc } private List findUserPlugins(ClassLoader gcl) { - List grailsUserPlugins = new ArrayList(); + List grailsUserPlugins = new ArrayList<>(); LOG.info("Attempting to load [" + pluginResources.length + "] user defined plugins"); for (Resource r : pluginResources) { @@ -691,7 +695,7 @@ private void registerPlugin(GrailsPlugin plugin) { for (String observedPlugin : observedPlugins) { Set observers = pluginToObserverMap.get(observedPlugin); if (observers == null) { - observers = new HashSet(); + observers = new HashSet<>(); pluginToObserverMap.put(observedPlugin, observers); } observers.add(plugin); diff --git a/grails-core/src/main/groovy/grails/plugins/GrailsPlugin.java b/grails-core/src/main/groovy/grails/plugins/GrailsPlugin.java index 2732abc8865..71358025fad 100644 --- a/grails-core/src/main/groovy/grails/plugins/GrailsPlugin.java +++ b/grails-core/src/main/groovy/grails/plugins/GrailsPlugin.java @@ -18,20 +18,22 @@ */ package grails.plugins; -import grails.core.GrailsApplication; -import grails.util.Environment; +import java.util.Collection; +import java.util.List; +import java.util.Map; + import groovy.lang.GroovyObject; -import org.grails.plugins.support.WatchPattern; -import org.grails.spring.RuntimeSpringConfiguration; + import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.env.PropertySource; import org.springframework.core.io.Resource; import org.springframework.core.type.filter.TypeFilter; -import java.util.Collection; -import java.util.List; -import java.util.Map; +import grails.core.GrailsApplication; +import grails.util.Environment; +import org.grails.plugins.support.WatchPattern; +import org.grails.spring.RuntimeSpringConfiguration; /** *

Plugin interface that adds Spring {@link org.springframework.beans.factory.config.BeanDefinition}s @@ -194,7 +196,6 @@ public interface GrailsPlugin extends ApplicationContextAware, Comparable, Grail */ void doWithRuntimeConfiguration(RuntimeSpringConfiguration springConfig); - /** * Makes the plugin excluded for a particular Environment * @param env The Environment @@ -262,7 +263,6 @@ public interface GrailsPlugin extends ApplicationContextAware, Comparable, Grail */ String getDependentVersion(String name); - PropertySource getPropertySource(); /** diff --git a/grails-core/src/main/groovy/grails/plugins/GrailsPluginManager.java b/grails-core/src/main/groovy/grails/plugins/GrailsPluginManager.java index 864209e6a49..8923df885e2 100644 --- a/grails-core/src/main/groovy/grails/plugins/GrailsPluginManager.java +++ b/grails-core/src/main/groovy/grails/plugins/GrailsPluginManager.java @@ -22,13 +22,15 @@ import java.util.Collection; import java.util.List; import java.util.Map; -import grails.core.GrailsApplication; -import org.grails.spring.RuntimeSpringConfiguration; -import grails.plugins.exceptions.PluginException; + import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; import org.springframework.core.type.filter.TypeFilter; +import grails.core.GrailsApplication; +import grails.plugins.exceptions.PluginException; +import org.grails.spring.RuntimeSpringConfiguration; + /** *

Handles the loading and management of plug-ins in the Grails system. * A plugin a just like a normal Grails application except that it contains a file ending diff --git a/grails-core/src/main/groovy/grails/plugins/Plugin.groovy b/grails-core/src/main/groovy/grails/plugins/Plugin.groovy index 308c292b124..300d7d15bcf 100644 --- a/grails-core/src/main/groovy/grails/plugins/Plugin.groovy +++ b/grails-core/src/main/groovy/grails/plugins/Plugin.groovy @@ -18,6 +18,14 @@ */ package grails.plugins +import groovy.transform.CompileStatic + +import org.springframework.beans.BeansException +import org.springframework.beans.factory.support.BeanDefinitionRegistry +import org.springframework.context.ApplicationContext +import org.springframework.context.ApplicationContextAware +import org.springframework.context.ConfigurableApplicationContext + import grails.config.Config import grails.core.ArtefactHandler import grails.core.GrailsApplication @@ -25,14 +33,7 @@ import grails.core.GrailsApplicationLifeCycle import grails.core.support.GrailsApplicationAware import grails.spring.BeanBuilder import grails.util.Environment -import groovy.transform.CompileStatic import org.grails.spring.context.support.MapBasedSmartPropertyOverrideConfigurer -import org.springframework.beans.BeansException -import org.springframework.beans.factory.support.BeanDefinitionRegistry -import org.springframework.context.ApplicationContext -import org.springframework.context.ApplicationContextAware -import org.springframework.context.ConfigurableApplicationContext - /** * Super class for plugins to implement. Plugin implementations should define the various plugin hooks @@ -69,7 +70,7 @@ abstract class Plugin implements GrailsApplicationLifeCycle, GrailsApplicationAw /** * The {@link GrailsPluginManager} instance */ - GrailsPluginManager getManager() { pluginManager} + GrailsPluginManager getManager() { pluginManager } /** * Whether the plugin is enabled @@ -81,7 +82,6 @@ abstract class Plugin implements GrailsApplicationLifeCycle, GrailsApplicationAw */ final List artefacts = [] - /** * The {@link ApplicationContext} instance */ @@ -91,10 +91,10 @@ abstract class Plugin implements GrailsApplicationLifeCycle, GrailsApplicationAw * @return The ApplicationContext */ ConfigurableApplicationContext getApplicationContext() { - if(applicationContext instanceof ConfigurableApplicationContext) { - return (ConfigurableApplicationContext)applicationContext + if (applicationContext instanceof ConfigurableApplicationContext) { + return (ConfigurableApplicationContext) applicationContext } - return null; + return null } @Override @@ -166,8 +166,8 @@ abstract class Plugin implements GrailsApplicationLifeCycle, GrailsApplicationAw */ void beans(Closure beanDefinitions) { def bb = new BeanBuilder(null, grailsApplication.classLoader) - bb.beans beanDefinitions - bb.registerBeans((BeanDefinitionRegistry)applicationContext) - new MapBasedSmartPropertyOverrideConfigurer(grailsApplication: grailsApplication).postProcessBeanFactory(((ConfigurableApplicationContext)applicationContext).beanFactory) + bb.beans(beanDefinitions) + bb.registerBeans((BeanDefinitionRegistry) applicationContext) + new MapBasedSmartPropertyOverrideConfigurer(grailsApplication: grailsApplication).postProcessBeanFactory(((ConfigurableApplicationContext) applicationContext).beanFactory) } } diff --git a/grails-core/src/main/groovy/grails/plugins/PluginFilter.java b/grails-core/src/main/groovy/grails/plugins/PluginFilter.java index 7688245dbe7..29c30f8a15b 100644 --- a/grails-core/src/main/groovy/grails/plugins/PluginFilter.java +++ b/grails-core/src/main/groovy/grails/plugins/PluginFilter.java @@ -33,5 +33,5 @@ public interface PluginFilter { * @param original the original supplied set of GrailsPlugin instances * @return a sublist of these items */ - List filterPluginList(List original); + List filterPluginList(List original); } diff --git a/grails-core/src/main/groovy/grails/plugins/PluginManagerLoader.groovy b/grails-core/src/main/groovy/grails/plugins/PluginManagerLoader.groovy index 85abd45086d..4f3624b5e08 100644 --- a/grails-core/src/main/groovy/grails/plugins/PluginManagerLoader.groovy +++ b/grails-core/src/main/groovy/grails/plugins/PluginManagerLoader.groovy @@ -24,7 +24,7 @@ package grails.plugins * @author Graeme Rocher * @since 2.4 */ -public interface PluginManagerLoader { +interface PluginManagerLoader { /** * Load the available plugins @@ -33,4 +33,4 @@ public interface PluginManagerLoader { */ GrailsPluginManager loadPlugins() -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/util/AbstractTypeConvertingMap.java b/grails-core/src/main/groovy/grails/util/AbstractTypeConvertingMap.java index c63e151ac60..37e486b51f2 100644 --- a/grails-core/src/main/groovy/grails/util/AbstractTypeConvertingMap.java +++ b/grails-core/src/main/groovy/grails/util/AbstractTypeConvertingMap.java @@ -18,14 +18,23 @@ */ package grails.util; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.Date; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + import groovy.lang.GroovyObjectSupport; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.codehaus.groovy.util.HashCodeHelper; -import java.text.ParseException; -import java.text.SimpleDateFormat; -import java.util.*; - /** * AbstractTypeConvertingMap is a Map with type conversion capabilities. * @@ -49,10 +58,10 @@ public AbstractTypeConvertingMap(Map map) { if (map == null) map = new LinkedHashMap(); wrappedMap = map; } - + public boolean equals(Map that) { - return equals((Object)that); - } + return equals((Object) that); + } @Override public boolean equals(Object that) { @@ -68,7 +77,7 @@ public boolean equals(Object that) { return false; } - AbstractTypeConvertingMap thatMap = (AbstractTypeConvertingMap)that; + AbstractTypeConvertingMap thatMap = (AbstractTypeConvertingMap) that; if (wrappedMap == thatMap.wrappedMap) { return true; @@ -87,8 +96,8 @@ public boolean equals(Object that) { final Object key = it.next(); Object thisValue = wrappedMap.get(key); Object thatValue = thatMap.wrappedMap.get(key); - if (thisValue == null && thatValue != null || - thisValue != null && thatValue == null || + if (thisValue == null && thatValue != null || + thisValue != null && thatValue == null || thisValue != thatValue && !thisValue.equals(thatValue)) { return false; } @@ -113,7 +122,7 @@ public int hashCode() { public Byte getByte(String name) { Object o = get(name); if (o instanceof Number) { - return ((Number)o).byteValue(); + return ((Number) o).byteValue(); } if (o != null) { @@ -131,7 +140,7 @@ public Byte getByte(String name) { public Byte getByte(String name, Integer defaultValue) { Byte value = getByte(name); if (value == null && defaultValue != null) { - value = (byte)defaultValue.intValue(); + value = (byte) defaultValue.intValue(); } return value; } @@ -144,7 +153,7 @@ public Byte getByte(String name, Integer defaultValue) { public Character getChar(String name) { Object o = get(name); if (o instanceof Character) { - return (Character)o; + return (Character) o; } if (o != null) { @@ -157,9 +166,9 @@ public Character getChar(String name) { } public Character getChar(String name, Integer defaultValue) { - Character value=getChar(name); + Character value = getChar(name); if (value == null && defaultValue != null) { - value = (char)defaultValue.intValue(); + value = (char) defaultValue.intValue(); } return value; } @@ -172,7 +181,7 @@ public Character getChar(String name, Integer defaultValue) { public Integer getInt(String name) { Object o = get(name); if (o instanceof Number) { - return ((Number)o).intValue(); + return ((Number) o).intValue(); } if (o != null) { @@ -188,7 +197,7 @@ public Integer getInt(String name) { } public Integer getInt(String name, Integer defaultValue) { - Integer value=getInt(name); + Integer value = getInt(name); if (value == null) { value = defaultValue; } @@ -203,7 +212,7 @@ public Integer getInt(String name, Integer defaultValue) { public Long getLong(String name) { Object o = get(name); if (o instanceof Number) { - return ((Number)o).longValue(); + return ((Number) o).longValue(); } if (o != null) { @@ -216,7 +225,7 @@ public Long getLong(String name) { } public Long getLong(String name, Long defaultValue) { - Long value=getLong(name); + Long value = getLong(name); if (value == null) { value = defaultValue; } @@ -231,7 +240,7 @@ public Long getLong(String name, Long defaultValue) { public Short getShort(String name) { Object o = get(name); if (o instanceof Number) { - return ((Number)o).shortValue(); + return ((Number) o).shortValue(); } if (o != null) { @@ -247,7 +256,7 @@ public Short getShort(String name) { } public Short getShort(String name, Integer defaultValue) { - Short value=getShort(name); + Short value = getShort(name); if (value == null && defaultValue != null) { value = defaultValue.shortValue(); } @@ -262,7 +271,7 @@ public Short getShort(String name, Integer defaultValue) { public Double getDouble(String name) { Object o = get(name); if (o instanceof Number) { - return ((Number)o).doubleValue(); + return ((Number) o).doubleValue(); } if (o != null) { @@ -278,7 +287,7 @@ public Double getDouble(String name) { } public Double getDouble(String name, Double defaultValue) { - Double value=getDouble(name); + Double value = getDouble(name); if (value == null) { value = defaultValue; } @@ -293,7 +302,7 @@ public Double getDouble(String name, Double defaultValue) { public Float getFloat(String name) { Object o = get(name); if (o instanceof Number) { - return ((Number)o).floatValue(); + return ((Number) o).floatValue(); } if (o != null) { @@ -309,7 +318,7 @@ public Float getFloat(String name) { } public Float getFloat(String name, Float defaultValue) { - Float value=getFloat(name); + Float value = getFloat(name); if (value == null) { value = defaultValue; } @@ -324,7 +333,7 @@ public Float getFloat(String name, Float defaultValue) { public Boolean getBoolean(String name) { Object o = get(name); if (o instanceof Boolean) { - return (Boolean)o; + return (Boolean) o; } if (o != null) { @@ -367,9 +376,9 @@ public Date getDate(String name) { public Date getDate(String name, String format) { Object value = get(name); if (value instanceof Date) { - return (Date)value; + return (Date) value; } - + if (value != null) { try { return new SimpleDateFormat(format).parse(value.toString()); @@ -414,7 +423,7 @@ public Date date(String name, Collection formats) { private Date getDate(String name, Collection formats) { for (String format : formats) { - Date date = getDate(name,format); + Date date = getDate(name, format); if (date != null) return date; } return null; @@ -431,10 +440,10 @@ public List getList(String name) { return Collections.emptyList(); } if (paramValues.getClass().isArray()) { - return Arrays.asList((Object[])paramValues); + return Arrays.asList((Object[]) paramValues); } if (paramValues instanceof Collection) { - return new ArrayList((Collection)paramValues); + return new ArrayList((Collection) paramValues); } return Collections.singletonList(paramValues); } diff --git a/grails-core/src/main/groovy/grails/util/CacheEntry.java b/grails-core/src/main/groovy/grails/util/CacheEntry.java index 56dcb6192a3..58953d80c5d 100644 --- a/grails-core/src/main/groovy/grails/util/CacheEntry.java +++ b/grails-core/src/main/groovy/grails/util/CacheEntry.java @@ -18,9 +18,6 @@ */ package grails.util; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentMap; import java.util.concurrent.atomic.AtomicReference; @@ -28,6 +25,9 @@ import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + /** * Wrapper for a value inside a cache that adds timestamp information * for expiration and prevents "cache storms" with a Lock. @@ -41,21 +41,21 @@ */ public class CacheEntry { private static final Logger LOG = LoggerFactory.getLogger(CacheEntry.class); - private final AtomicReference valueRef=new AtomicReference(null); + private final AtomicReference valueRef = new AtomicReference<>(null); private long createdMillis; - private final ReadWriteLock lock=new ReentrantReadWriteLock(); - private final Lock readLock=lock.readLock(); - private final Lock writeLock=lock.writeLock(); - private volatile boolean initialized=false; + private final ReadWriteLock lock = new ReentrantReadWriteLock(); + private final Lock readLock = lock.readLock(); + private final Lock writeLock = lock.writeLock(); + private volatile boolean initialized = false; public CacheEntry() { expire(); } - + public CacheEntry(V value) { setValue(value); } - + /** * Gets a value from cache. If the key doesn't exist, it will create the value using the updater callback * Prevents cache storms with a lock. @@ -79,7 +79,7 @@ public static V getValue(ConcurrentMap> map, boolean returnExpiredWhileUpdating, Object cacheRequestObject) { CacheEntry cacheEntry = map.get(key); - if(cacheEntry==null) { + if (cacheEntry == null) { try { cacheEntry = cacheEntryFactory.call(); } @@ -87,7 +87,7 @@ public static V getValue(ConcurrentMap> map, throw new UpdateException(e); } CacheEntry previousEntry = map.putIfAbsent(key, cacheEntry); - if(previousEntry != null) { + if (previousEntry != null) { cacheEntry = previousEntry; } } @@ -100,15 +100,15 @@ public static V getValue(ConcurrentMap> map, return null; } } - + @SuppressWarnings("rawtypes") - private static final Callable DEFAULT_CACHE_ENTRY_FACTORY = new Callable() { + private static final Callable DEFAULT_CACHE_ENTRY_FACTORY = new Callable<>() { @Override public CacheEntry call() throws Exception { return new CacheEntry(); } }; - + public static V getValue(ConcurrentMap> map, K key, long timeoutMillis, Callable updater) { return getValue(map, key, timeoutMillis, updater, DEFAULT_CACHE_ENTRY_FACTORY, true, null); } @@ -116,11 +116,11 @@ public static V getValue(ConcurrentMap> map, K key, long public static V getValue(ConcurrentMap> map, K key, long timeoutMillis, Callable updater, boolean returnExpiredWhileUpdating) { return getValue(map, key, timeoutMillis, updater, DEFAULT_CACHE_ENTRY_FACTORY, returnExpiredWhileUpdating, null); } - + public V getValue(long timeout, Callable updater) { return getValue(timeout, updater, true, null); } - + /** * gets the current value from the entry and updates it if it's older than timeout * @@ -137,12 +137,12 @@ public V getValue(long timeout, Callable updater, boolean returnExpiredWhileU boolean lockAcquired = false; try { long beforeLockingCreatedMillis = createdMillis; - if(returnExpiredWhileUpdating) { - if(!writeLock.tryLock()) { - if(isInitialized()) { + if (returnExpiredWhileUpdating) { + if (!writeLock.tryLock()) { + if (isInitialized()) { return getValueWhileUpdating(cacheRequestObject); } else { - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("Locking cache for update"); } writeLock.lock(); @@ -157,7 +157,7 @@ public V getValue(long timeout, Callable updater, boolean returnExpiredWhileU if (!isInitialized() || shouldUpdate(beforeLockingCreatedMillis, cacheRequestObject)) { try { value = updateValue(getValue(), updater, cacheRequestObject); - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("Updating cache for value [{}]", value); } setValue(value); @@ -171,8 +171,8 @@ public V getValue(long timeout, Callable updater, boolean returnExpiredWhileU } return value; } finally { - if(lockAcquired) { - if(LOG.isDebugEnabled()) { + if (lockAcquired) { + if (LOG.isDebugEnabled()) { LOG.debug("Unlocking cache for update"); } writeLock.unlock(); @@ -182,7 +182,7 @@ public V getValue(long timeout, Callable updater, boolean returnExpiredWhileU return getValue(); } } - + protected V getValueWhileUpdating(Object cacheRequestObject) { return valueRef.get(); } @@ -199,9 +199,9 @@ public V getValue() { readLock.unlock(); } } - + public void setValue(V val) { - try{ + try { writeLock.lock(); valueRef.set(val); setInitialized(true); @@ -220,7 +220,7 @@ protected boolean shouldUpdate(long beforeLockingCreatedMillis, Object cacheRequ } protected void resetTimestamp(boolean updated) { - if(updated) { + if (updated) { createdMillis = System.currentTimeMillis(); } } @@ -232,7 +232,7 @@ public long getCreatedMillis() { public void expire() { createdMillis = 0L; } - + public boolean isInitialized() { return initialized; } @@ -254,18 +254,18 @@ public UpdateException(Throwable cause) { public void rethrowCause() throws Exception { if (getCause() instanceof Exception) { - throw (Exception)getCause(); + throw (Exception) getCause(); } throw this; } - + public void rethrowRuntimeException() { if (getCause() instanceof RuntimeException) { - throw (RuntimeException)getCause(); + throw (RuntimeException) getCause(); } throw this; } - + } } diff --git a/grails-core/src/main/groovy/grails/util/ClosureToMapPopulator.java b/grails-core/src/main/groovy/grails/util/ClosureToMapPopulator.java index 4f9541f0b91..19f902bc687 100644 --- a/grails-core/src/main/groovy/grails/util/ClosureToMapPopulator.java +++ b/grails-core/src/main/groovy/grails/util/ClosureToMapPopulator.java @@ -18,13 +18,13 @@ */ package grails.util; -import groovy.lang.Closure; -import groovy.lang.GroovyObjectSupport; - import java.util.Arrays; import java.util.HashMap; import java.util.Map; +import groovy.lang.Closure; +import groovy.lang.GroovyObjectSupport; + /** * A simple class that takes method invocations and property setters and populates * the arguments of these into the supplied map ignoring null values. @@ -32,7 +32,7 @@ * @author Graeme Rocher * @since 1.2 */ -@SuppressWarnings({"unchecked","rawtypes"}) +@SuppressWarnings({"unchecked", "rawtypes"}) public class ClosureToMapPopulator extends GroovyObjectSupport { private Map map; @@ -63,7 +63,7 @@ public void setProperty(String name, Object o) { public Object invokeMethod(String name, Object o) { if (o != null) { if (o.getClass().isArray()) { - Object[] args = (Object[])o; + Object[] args = (Object[]) o; if (args.length == 1) { map.put(name, args[0]); } @@ -72,7 +72,7 @@ public Object invokeMethod(String name, Object o) { } } else { - map.put(name,o); + map.put(name, o); } } return null; diff --git a/grails-core/src/main/groovy/grails/util/DomainBuilder.java b/grails-core/src/main/groovy/grails/util/DomainBuilder.java index 1c810e36d18..dfa789dd0a1 100644 --- a/grails-core/src/main/groovy/grails/util/DomainBuilder.java +++ b/grails-core/src/main/groovy/grails/util/DomainBuilder.java @@ -18,11 +18,10 @@ */ package grails.util; -import groovy.util.ObjectGraphBuilder; - import java.lang.reflect.Field; import java.util.Collection; +import groovy.util.ObjectGraphBuilder; import org.codehaus.groovy.runtime.InvokerHelper; /** @@ -50,7 +49,7 @@ public DomainBuilder() { public static class DefaultGrailsChildPropertySetter implements ChildPropertySetter { public void setChild(Object parent, Object child, String parentName, String propertyName) { if (isCollection(parent, child, parentName, propertyName)) { - String propName = propertyName.substring(0,1).toUpperCase() + propertyName.substring(1); + String propName = propertyName.substring(0, 1).toUpperCase() + propertyName.substring(1); String methodName = "addTo" + propName; InvokerHelper.invokeMethod(parent, methodName, child); } diff --git a/grails-core/src/main/groovy/grails/util/ExtendedProxy.java b/grails-core/src/main/groovy/grails/util/ExtendedProxy.java index cbb15a0900c..48f1fcdfc7c 100644 --- a/grails-core/src/main/groovy/grails/util/ExtendedProxy.java +++ b/grails-core/src/main/groovy/grails/util/ExtendedProxy.java @@ -18,11 +18,10 @@ */ package grails.util; -import groovy.lang.MetaClass; -import groovy.util.Proxy; - import java.util.Map; +import groovy.lang.MetaClass; +import groovy.util.Proxy; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.codehaus.groovy.runtime.InvokerHelper; @@ -45,7 +44,7 @@ public ExtendedProxy() { public Object getProperty(String property) { Object propertyValue = propertyMap.get(property); if (propertyValue == null) { - propertyValue = InvokerHelper.getMetaClass(getAdaptee()).getProperty(getAdaptee(),property); + propertyValue = InvokerHelper.getMetaClass(getAdaptee()).getProperty(getAdaptee(), property); } return propertyValue; } @@ -53,10 +52,10 @@ public Object getProperty(String property) { @Override public void setProperty(String property, Object newValue) { if (propertyMap.containsKey(property)) { - super.setProperty(property,newValue); + super.setProperty(property, newValue); } else { - InvokerHelper.getMetaClass(getAdaptee()).setProperty(getAdaptee(),property,newValue); + InvokerHelper.getMetaClass(getAdaptee()).setProperty(getAdaptee(), property, newValue); } } diff --git a/grails-core/src/main/groovy/grails/util/GrailsArrayUtils.groovy b/grails-core/src/main/groovy/grails/util/GrailsArrayUtils.groovy index 45a61763dbf..697cc4f914d 100644 --- a/grails-core/src/main/groovy/grails/util/GrailsArrayUtils.groovy +++ b/grails-core/src/main/groovy/grails/util/GrailsArrayUtils.groovy @@ -18,11 +18,11 @@ */ package grails.util -import groovy.transform.CompileStatic - import java.lang.reflect.Array +import groovy.transform.CompileStatic import org.codehaus.groovy.runtime.DefaultGroovyMethods + import org.springframework.util.ObjectUtils /** @@ -68,7 +68,7 @@ abstract class GrailsArrayUtils { * @return A new array with the given object added to the end */ static Object addToEnd(Object array, Object newObject) { - add array, Array.getLength(array), newObject + add(array, Array.getLength(array), newObject) } /** @@ -78,7 +78,7 @@ abstract class GrailsArrayUtils { * @return A new array with the given object added to the start */ static Object addToStart(Object array, Object newObject) { - add array, 0, newObject + add(array, 0, newObject) } /** * Adds the given object to the given array at the given position @@ -90,8 +90,8 @@ abstract class GrailsArrayUtils { */ static Object add(Object array, int pos, Object newObject) { - if(array == null) { - Object[] newArray = (Object[])Array.newInstance(newObject.getClass(), 1) + if (array == null) { + Object[] newArray = (Object[]) Array.newInstance(newObject.getClass(), 1) newArray[pos] = newObject return newArray } @@ -99,10 +99,10 @@ abstract class GrailsArrayUtils { def type = array.getClass().componentType int len = Array.getLength(array) def newArray = Array.newInstance(type, len + 1) - System.arraycopy array, 0, newArray, 0, pos - Array.set newArray, pos, newObject - if( pos < len ) { - System.arraycopy array, pos, newArray, pos + 1, len - pos + System.arraycopy(array, 0, newArray, 0, pos) + Array.set(newArray, pos, newObject) + if (pos < len) { + System.arraycopy(array, pos, newArray, pos + 1, len - pos) } return newArray } @@ -117,18 +117,18 @@ abstract class GrailsArrayUtils { * @return A new array, one element bigger, with the object added at the given position */ static Object addAll(Object array, Object otherArray) { - if(array == null) { + if (array == null) { return otherArray } else { def type = array.getClass().componentType - int len = Array.getLength( array ) - int len2 = Array.getLength( otherArray ) + int len = Array.getLength(array) + int len2 = Array.getLength(otherArray) def newArray = Array.newInstance(type, len + len2) - System.arraycopy(array, 0, newArray, 0, len); + System.arraycopy(array, 0, newArray, 0, len) try { - System.arraycopy otherArray, 0, newArray, len, len2 + System.arraycopy(otherArray, 0, newArray, len, len2) } catch (ArrayStoreException ase) { throw new IllegalArgumentException("Component types of passed arrays do not match [${array.getClass().componentType}] and [${otherArray.getClass().componentType}]", ase) } @@ -147,25 +147,25 @@ abstract class GrailsArrayUtils { static Object subarray(Object args, int start, int end) { def len = Array.getLength(args) - if(start < 0) start = 0 - if(end > len) end = len + if (start < 0) start = 0 + if (end > len) end = len def type = args.getClass().componentType def newLen = end - start - if(newLen <= 0) { + if (newLen <= 0) { return Array.newInstance(type, 0) } else { - def newArray = Array.newInstance(type, newLen ) - System.arraycopy args, start, newArray,0, newLen + def newArray = Array.newInstance(type, newLen) + System.arraycopy(args, start, newArray, 0, newLen) return newArray } } static boolean contains(Object[] array, Object elementToSearchFor) { boolean found = false - if(array) { + if (array) { found = DefaultGroovyMethods.contains(array, elementToSearchFor) } found @@ -173,15 +173,15 @@ abstract class GrailsArrayUtils { static T[] concat(T[] first, T[] second) { if (first == null) { - return second; + return second } if (second == null) { - return first; + return first } - T[] result = (T[]) java.lang.reflect.Array.newInstance(first.getClass().getComponentType(), first.length + second.length); - System.arraycopy(first, 0, result, 0, first.length); - System.arraycopy(second, 0, result, first.length, second.length); - return result; + T[] result = (T[]) java.lang.reflect.Array.newInstance(first.getClass().getComponentType(), first.length + second.length) + System.arraycopy(first, 0, result, 0, first.length) + System.arraycopy(second, 0, result, first.length, second.length) + return result } } diff --git a/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java b/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java index edec1dd5a8b..b3a34fdc4cd 100644 --- a/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java +++ b/grails-core/src/main/groovy/grails/util/GrailsClassUtils.java @@ -18,7 +18,21 @@ */ package grails.util; -import grails.artefact.Enhanced; +import java.beans.PropertyDescriptor; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.SortedSet; +import java.util.TreeSet; + import groovy.lang.AdaptingMetaClass; import groovy.lang.ExpandoMetaClass; import groovy.lang.ExpandoMetaClassCreationHandle; @@ -27,8 +41,10 @@ import groovy.lang.MetaClassRegistry; import groovy.lang.MetaProperty; import groovy.util.ConfigObject; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.beans.BeanInstantiationException; import org.springframework.beans.BeanUtils; import org.springframework.beans.BeanWrapper; @@ -41,20 +57,7 @@ import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; -import java.beans.PropertyDescriptor; -import java.lang.reflect.Field; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.TreeSet; +import grails.artefact.Enhanced; /** * Utility methods for dealing with Grails class artifacts. @@ -64,7 +67,7 @@ public class GrailsClassUtils { private static final Log LOG = LogFactory.getLog(GrailsClassUtils.class); - public static final Map, Class> PRIMITIVE_TYPE_COMPATIBLE_CLASSES = new HashMap, Class>(); + public static final Map, Class> PRIMITIVE_TYPE_COMPATIBLE_CLASSES = new HashMap<>(); /** * Just add two entries to the class compatibility map @@ -156,7 +159,7 @@ public static Set getAllInterfacesForClassAsSet(Class clazz) { */ public static Set getAllInterfacesForClassAsSet(Class clazz, ClassLoader classLoader) { Assert.notNull(clazz, "Class must not be null"); - Set interfaces = new LinkedHashSet(); + Set interfaces = new LinkedHashSet<>(); while (clazz != null) { Class[] ifcs = clazz.getInterfaces(); for (Class ifc : ifcs) { @@ -168,7 +171,6 @@ public static Set getAllInterfacesForClassAsSet(Class clazz, ClassLoader return interfaces; } - /** * Check whether the given class is visible in the given ClassLoader. * @param clazz the class to check (typically an interface) @@ -300,7 +302,7 @@ public static Class getPropertyType(Class clazz, String propertyName) { } try { - PropertyDescriptor desc=BeanUtils.getPropertyDescriptor(clazz, propertyName); + PropertyDescriptor desc = BeanUtils.getPropertyDescriptor(clazz, propertyName); if (desc != null) { return desc.getPropertyType(); } @@ -325,7 +327,7 @@ public static PropertyDescriptor[] getPropertiesOfType(Class clazz, Class return new PropertyDescriptor[0]; } - Set properties = new HashSet(); + Set properties = new HashSet<>(); PropertyDescriptor descriptor = null; try { PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz); @@ -338,7 +340,7 @@ public static PropertyDescriptor[] getPropertiesOfType(Class clazz, Class } } catch (Exception e) { - if(descriptor == null) { + if (descriptor == null) { LOG.error(String.format("Got exception while checking property descriptors for class %s", clazz.getName()), e); } else { LOG.error(String.format("Got exception while checking PropertyDescriptor.propertyType for field %s.%s", clazz.getName(), descriptor.getName()), e); @@ -363,7 +365,7 @@ private static boolean isTypeInstanceOfPropertyType(Class type, Class prop public static PropertyDescriptor[] getPropertiesAssignableToType(Class clazz, Class propertySuperType) { if (clazz == null || propertySuperType == null) return new PropertyDescriptor[0]; - Set properties = new HashSet(); + Set properties = new HashSet<>(); PropertyDescriptor descriptor = null; try { PropertyDescriptor[] descriptors = BeanUtils.getPropertyDescriptors(clazz); @@ -376,7 +378,7 @@ public static PropertyDescriptor[] getPropertiesAssignableToType(Class clazz, } } catch (Exception e) { - if(descriptor == null) { + if (descriptor == null) { LOG.error(String.format("Got exception while checking property descriptors for class %s", clazz.getName()), e); } else { LOG.error(String.format("Got exception while checking PropertyDescriptor.propertyType for field %s.%s", clazz.getName(), descriptor.getName()), e); @@ -524,7 +526,7 @@ public static boolean isGroovyAssignableFrom(Class leftType, Class rightTy */ @SuppressWarnings("rawtypes") public static boolean isStaticProperty(Class clazz, String propertyName) { - Method getter = BeanUtils.findDeclaredMethod(clazz, getGetterName(propertyName), (Class[])null); + Method getter = BeanUtils.findDeclaredMethod(clazz, getGetterName(propertyName), (Class[]) null); if (getter != null) { return isPublicStatic(getter); } @@ -597,7 +599,7 @@ public static Object getStaticFieldValue(Class clazz, String name) { * @return The value if there is one, or null if unset OR there is no such property */ public static Object getStaticPropertyValue(Class clazz, String name) { - Method getter = BeanUtils.findDeclaredMethod(clazz, getGetterName(name), (Class[])null); + Method getter = BeanUtils.findDeclaredMethod(clazz, getGetterName(name), (Class[]) null); try { if (getter != null) { ReflectionUtils.makeAccessible(getter); @@ -743,7 +745,7 @@ else if (interfaceType.equals(SortedSet.class)) { */ @SuppressWarnings("rawtypes") public static boolean isSetter(String name, Class[] args) { - if (!StringUtils.hasText(name) || args == null)return false; + if (!StringUtils.hasText(name) || args == null) return false; if (name.startsWith("set")) { if (args.length != 1) return false; @@ -757,13 +759,13 @@ public static boolean isSetter(String name, Class[] args) { public static MetaClass getExpandoMetaClass(Class clazz) { MetaClassRegistry registry = GroovySystem.getMetaClassRegistry(); Assert.isTrue(registry.getMetaClassCreationHandler() instanceof ExpandoMetaClassCreationHandle, - "Grails requires an instance of [ExpandoMetaClassCreationHandle] to be set in Groovy's MetaClassRegistry! (current is : "+registry.getMetaClassCreationHandler()+")"); + "Grails requires an instance of [ExpandoMetaClassCreationHandle] to be set in Groovy's MetaClassRegistry! (current is : " + registry.getMetaClassCreationHandler() + ")"); MetaClass mc = registry.getMetaClass(clazz); AdaptingMetaClass adapter = null; if (mc instanceof AdaptingMetaClass) { adapter = (AdaptingMetaClass) mc; - mc = ((AdaptingMetaClass)mc).getAdaptee(); + mc = ((AdaptingMetaClass) mc).getAdaptee(); } if (!(mc instanceof ExpandoMetaClass)) { @@ -774,7 +776,7 @@ public static MetaClass getExpandoMetaClass(Class clazz) { adapter.setAdaptee(mc); } } - Assert.isTrue(mc instanceof ExpandoMetaClass,"BUG! Method must return an instance of [ExpandoMetaClass]!"); + Assert.isTrue(mc instanceof ExpandoMetaClass, "BUG! Method must return an instance of [ExpandoMetaClass]!"); return mc; } @@ -830,7 +832,7 @@ public static boolean getBooleanFromMap(String key, Map map, boolean defau return defaultValue; } if (o instanceof Boolean) { - return (Boolean)o; + return (Boolean) o; } return Boolean.valueOf(o.toString()); } @@ -966,9 +968,9 @@ public static Object instantiateFromFlatConfig(Map flatConfig, S public static Boolean hasBeenEnhancedForFeature(final Class controllerClass, final String featureName) { boolean hasBeenEnhanced = false; final Enhanced enhancedAnnotation = controllerClass.getAnnotation(Enhanced.class); - if(enhancedAnnotation != null) { + if (enhancedAnnotation != null) { final String[] enhancedFor = enhancedAnnotation.enhancedFor(); - if(enhancedFor != null) { + if (enhancedFor != null) { hasBeenEnhanced = GrailsArrayUtils.contains(enhancedFor, featureName); } } @@ -979,7 +981,7 @@ public static FastClass fastClass(Class superClass) { FastClass.Generator gen = new FastClass.Generator(); gen.setType(superClass); gen.setClassLoader(superClass.getClassLoader()); - gen.setUseCache( !Environment.isReloadingAgentEnabled() ); + gen.setUseCache(!Environment.isReloadingAgentEnabled()); return gen.create(); } } diff --git a/grails-core/src/main/groovy/grails/util/GrailsMessageSourceUtils.groovy b/grails-core/src/main/groovy/grails/util/GrailsMessageSourceUtils.groovy index c36fe2918e9..5d875ef8ad1 100644 --- a/grails-core/src/main/groovy/grails/util/GrailsMessageSourceUtils.groovy +++ b/grails-core/src/main/groovy/grails/util/GrailsMessageSourceUtils.groovy @@ -19,8 +19,8 @@ package grails.util import groovy.transform.CompileStatic -import org.springframework.context.MessageSource +import org.springframework.context.MessageSource /** * A simple class that selects a single {@link org.springframework.context.MessageSource MessageSource} @@ -33,27 +33,28 @@ import org.springframework.context.MessageSource @CompileStatic class GrailsMessageSourceUtils { - static MessageSource findPreferredMessageSource(List messageSources){ - if(!messageSources) { + + static MessageSource findPreferredMessageSource(List messageSources) { + if (!messageSources) { return null } - if(messageSources.size() == 1) { + if (messageSources.size() == 1) { return messageSources.get(0) } - MessageSource firstGrailsSpring = messageSources.find {messageSource -> + MessageSource firstGrailsSpring = messageSources.find { messageSource -> String className = messageSource.class.name // use the first Grails or Spring MessageSource - className.startsWith("org.grails") || className.startsWith("grails") || className.startsWith("org.springframework") + className.startsWith('org.grails') || className.startsWith('grails') || className.startsWith('org.springframework') } // return the first Grails or Spring MessageSource - if(firstGrailsSpring) { + if (firstGrailsSpring) { return firstGrailsSpring } // return the first MessageSource from the list return messageSources.get(0) } -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/util/GrailsMetaClassUtils.java b/grails-core/src/main/groovy/grails/util/GrailsMetaClassUtils.java index dd72b7b020b..ed234b72aa6 100644 --- a/grails-core/src/main/groovy/grails/util/GrailsMetaClassUtils.java +++ b/grails-core/src/main/groovy/grails/util/GrailsMetaClassUtils.java @@ -18,6 +18,9 @@ */ package grails.util; +import java.lang.reflect.Constructor; +import java.util.List; + import groovy.lang.AdaptingMetaClass; import groovy.lang.Closure; import groovy.lang.ClosureInvokingMethod; @@ -29,13 +32,11 @@ import groovy.lang.MetaClassRegistry; import groovy.lang.MetaMethod; import groovy.lang.MetaProperty; - -import java.lang.reflect.Constructor; -import java.util.List; +import org.codehaus.groovy.runtime.metaclass.ThreadManagedMetaBeanProperty; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.codehaus.groovy.runtime.metaclass.ThreadManagedMetaBeanProperty; + import org.springframework.beans.BeanUtils; /** @@ -77,10 +78,10 @@ public static void copyExpandoMetaClass(Class fromClass, Class toClass, bo ExpandoMetaClass emc; if (oldMetaClass instanceof AdaptingMetaClass) { - adapter = ((AdaptingMetaClass)oldMetaClass); - emc = (ExpandoMetaClass)adapter.getAdaptee(); + adapter = ((AdaptingMetaClass) oldMetaClass); + emc = (ExpandoMetaClass) adapter.getAdaptee(); if (LOG.isDebugEnabled()) { - LOG.debug("Obtained adapted MetaClass ["+emc+"] from AdapterMetaClass instance ["+adapter+"]"); + LOG.debug("Obtained adapted MetaClass [" + emc + "] from AdapterMetaClass instance [" + adapter + "]"); } if (removeSource) { @@ -88,9 +89,9 @@ public static void copyExpandoMetaClass(Class fromClass, Class toClass, bo } } else { - emc = (ExpandoMetaClass)oldMetaClass; + emc = (ExpandoMetaClass) oldMetaClass; if (LOG.isDebugEnabled()) { - LOG.debug("No adapter MetaClass found, using original ["+emc+"]"); + LOG.debug("No adapter MetaClass found, using original [" + emc + "]"); } } @@ -104,14 +105,14 @@ public static void copyExpandoMetaClass(Class fromClass, Class toClass, bo replacement.setProperty(cim.getName(), callable); } else { - ((GroovyObject)replacement.getProperty(ExpandoMetaClass.STATIC_QUALIFIER)).setProperty(cim.getName(),callable); + ((GroovyObject) replacement.getProperty(ExpandoMetaClass.STATIC_QUALIFIER)).setProperty(cim.getName(), callable); } } } for (Object o : emc.getExpandoProperties()) { if (o instanceof ThreadManagedMetaBeanProperty) { - ThreadManagedMetaBeanProperty mbp = (ThreadManagedMetaBeanProperty)o; + ThreadManagedMetaBeanProperty mbp = (ThreadManagedMetaBeanProperty) o; replacement.setProperty(mbp.getName(), mbp.getInitialValue()); } } @@ -119,7 +120,7 @@ public static void copyExpandoMetaClass(Class fromClass, Class toClass, bo if (adapter == null) { if (LOG.isDebugEnabled()) { - LOG.debug("Adding MetaClass for class ["+toClass+"] MetaClass ["+replacement+"]"); + LOG.debug("Adding MetaClass for class [" + toClass + "] MetaClass [" + replacement + "]"); } registry.setMetaClass(toClass, replacement); } @@ -130,12 +131,12 @@ public static void copyExpandoMetaClass(Class fromClass, Class toClass, bo } try { Constructor c = adapter.getClass().getConstructor(new Class[]{MetaClass.class}); - MetaClass newAdapter = (MetaClass) BeanUtils.instantiateClass(c,new Object[]{replacement}); - registry.setMetaClass(toClass,newAdapter); + MetaClass newAdapter = (MetaClass) BeanUtils.instantiateClass(c, new Object[]{replacement}); + registry.setMetaClass(toClass, newAdapter); } catch (NoSuchMethodException e) { if (LOG.isDebugEnabled()) { - LOG.debug("Exception thrown constructing new MetaClass adapter when reloading: " + e.getMessage(),e); + LOG.debug("Exception thrown constructing new MetaClass adapter when reloading: " + e.getMessage(), e); } } } @@ -154,7 +155,7 @@ public static ExpandoMetaClass getExpandoMetaClass(Class aClass) { registry.removeMetaClass(aClass); mc = registry.getMetaClass(aClass); if (mc instanceof ExpandoMetaClass) { - return (ExpandoMetaClass)mc; + return (ExpandoMetaClass) mc; } ExpandoMetaClass emc = new ExpandoMetaClass(aClass, true, true); @@ -167,9 +168,9 @@ public static MetaClass getMetaClass(Object instance) { if (instance instanceof GroovyObject) { GroovyObject groovyObject = (GroovyObject) instance; MetaClass metaClass = groovyObject.getMetaClass(); - + metaClass = unwrapDelegatingMetaClass(metaClass); - + if (!(metaClass instanceof ExpandoMetaClass)) { metaClass = getExpandoMetaClass(instance.getClass()); groovyObject.setMetaClass(metaClass); @@ -181,9 +182,9 @@ public static MetaClass getMetaClass(Object instance) { } private static MetaClass unwrapDelegatingMetaClass(MetaClass metaClass) { - int counter=0; - while(metaClass instanceof DelegatingMetaClass && counter++ < MAX_DELEGATE_LEVELS) { - metaClass = ((DelegatingMetaClass)metaClass).getAdaptee(); + int counter = 0; + while (metaClass instanceof DelegatingMetaClass && counter++ < MAX_DELEGATE_LEVELS) { + metaClass = ((DelegatingMetaClass) metaClass).getAdaptee(); } return metaClass; } diff --git a/grails-core/src/main/groovy/grails/util/GrailsStringUtils.groovy b/grails-core/src/main/groovy/grails/util/GrailsStringUtils.groovy index 3e1b73351e5..cdc4bd246ed 100644 --- a/grails-core/src/main/groovy/grails/util/GrailsStringUtils.groovy +++ b/grails-core/src/main/groovy/grails/util/GrailsStringUtils.groovy @@ -18,10 +18,11 @@ */ package grails.util +import java.util.regex.Pattern + import groovy.transform.CompileStatic -import org.springframework.util.StringUtils -import java.util.regex.Pattern +import org.springframework.util.StringUtils /** * Extra methods for string manipulation @@ -30,7 +31,7 @@ import java.util.regex.Pattern * @since 2.3.6 */ @CompileStatic -abstract class GrailsStringUtils extends StringUtils{ +abstract class GrailsStringUtils extends StringUtils { private static final Pattern BOOLEAN_PATTERN = Pattern.compile(/^on$|^true$|^yes$|^1$/, Pattern.CASE_INSENSITIVE) @@ -63,16 +64,15 @@ abstract class GrailsStringUtils extends StringUtils{ * @param token The token to match */ static String substringBefore(String str, String token) { - if(token == null) return str + if (token == null) return str def i = str.indexOf(token) - if(i > -1) { + if (i > -1) { return str.substring(0, i) } return str } - /** * Returns a substring before the last occurance of the given token * @@ -89,10 +89,10 @@ abstract class GrailsStringUtils extends StringUtils{ * @param token The token to match */ static String substringBeforeLast(String str, String token) { - if(token == null) return str + if (token == null) return str def i = str.lastIndexOf(token) - if(i > -1) { + if (i > -1) { return str.substring(0, i) } return str @@ -114,10 +114,10 @@ abstract class GrailsStringUtils extends StringUtils{ * @param token The token to match */ static String substringAfter(String str, String token) { - if(token == null) return str + if (token == null) return str def i = str.indexOf(token) - if(i > -1) { + if (i > -1) { return str.substring(i + token.length()) } return str @@ -139,10 +139,10 @@ abstract class GrailsStringUtils extends StringUtils{ * @param token The token to match */ static String substringAfterLast(String str, String token) { - if(token == null) return str + if (token == null) return str def i = str.lastIndexOf(token) - if(i > -1) { + if (i > -1) { return str.substring(i + token.length()) } return str @@ -155,7 +155,7 @@ abstract class GrailsStringUtils extends StringUtils{ * @return The trimmed string */ static String trimStart(String str, String start) { - if(!str || !start || !str.startsWith(start)) { + if (!str || !start || !str.startsWith(start)) { return str } else { @@ -190,7 +190,7 @@ abstract class GrailsStringUtils extends StringUtils{ * @return The name of the file excluding path and extension */ static String getFileBasename(String path) { - stripFilenameExtension( getFilename(path) ) + stripFilenameExtension(getFilename(path)) } /** @@ -207,7 +207,7 @@ abstract class GrailsStringUtils extends StringUtils{ * GrailsStringUtils.trimToNull("xyz") = "xyz" * GrailsStringUtils.trimToNull(" xyz ") = "xyz" * - * + * * based on https://github.com/apache/commons-lang/blob/master/src/main/java/org/apache/commons/lang3/StringUtils.java#L8838 * * @param str the String to be trimmed, may be null diff --git a/grails-core/src/main/groovy/grails/util/GrailsUtil.java b/grails-core/src/main/groovy/grails/util/GrailsUtil.java index 4f344f1f3c4..891f1681469 100644 --- a/grails-core/src/main/groovy/grails/util/GrailsUtil.java +++ b/grails-core/src/main/groovy/grails/util/GrailsUtil.java @@ -18,13 +18,14 @@ */ package grails.util; +import java.io.PrintWriter; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.grails.exceptions.reporting.DefaultStackTraceFilterer; import org.grails.exceptions.reporting.StackTraceFilterer; -import java.io.PrintWriter; - /** * Grails utility methods for command line and GUI applications. * @@ -156,5 +157,4 @@ public static Throwable deepSanitize(Throwable t) { return stackFilterer.filter(t, true); } - } diff --git a/grails-core/src/main/groovy/grails/util/Holders.java b/grails-core/src/main/groovy/grails/util/Holders.java index 8132c41b6ff..91591866094 100644 --- a/grails-core/src/main/groovy/grails/util/Holders.java +++ b/grails-core/src/main/groovy/grails/util/Holders.java @@ -18,20 +18,22 @@ */ package grails.util; -import grails.config.Config; -import grails.core.GrailsApplication; -import grails.plugins.GrailsPluginManager; +import java.util.Collections; +import java.util.List; +import java.util.Map; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.grails.core.io.support.GrailsFactoriesLoader; -import org.grails.core.support.GrailsApplicationDiscoveryStrategy; + import org.springframework.context.ApplicationContext; import org.springframework.context.Lifecycle; import org.springframework.util.Assert; -import java.util.Collections; -import java.util.List; -import java.util.Map; +import grails.config.Config; +import grails.core.GrailsApplication; +import grails.plugins.GrailsPluginManager; +import org.grails.core.io.support.GrailsFactoriesLoader; +import org.grails.core.support.GrailsApplicationDiscoveryStrategy; /** * Allows looking up key classes in a static context @@ -45,13 +47,14 @@ public class Holders { private static final Log LOG = LogFactory.getLog(Holders.class); - private static Holder pluginManagers = new Holder("PluginManager"); - private static Holder pluginManagersInCreation = new Holder("PluginManagers in creation"); - private static Holder configs = new Holder("config"); - private static Holder> flatConfigs = new Holder>("flat config"); + private static Holder pluginManagers = new Holder<>("PluginManager"); + private static Holder pluginManagersInCreation = new Holder<>("PluginManagers in creation"); + private static Holder configs = new Holder<>("config"); + private static Holder> flatConfigs = new Holder<>("flat config"); private static List applicationDiscoveryStrategies = GrailsFactoriesLoader.loadFactories(GrailsApplicationDiscoveryStrategy.class, Holders.class.getClassLoader()); private static Holder servletContexts; + static { createServletContextsHolder(); @@ -88,11 +91,11 @@ public static Object getServletContext() { } public static ApplicationContext getApplicationContext() { - for(GrailsApplicationDiscoveryStrategy strategy : applicationDiscoveryStrategies) { + for (GrailsApplicationDiscoveryStrategy strategy : applicationDiscoveryStrategies) { ApplicationContext applicationContext = strategy.findApplicationContext(); - if(applicationContext != null ) { + if (applicationContext != null) { boolean running = ((Lifecycle) applicationContext).isRunning(); - if(running) { + if (running) { return applicationContext; } } @@ -105,22 +108,23 @@ public static ApplicationContext getApplicationContext() { * @return The ApplicationContext or null if it doesn't exist */ public static ApplicationContext findApplicationContext() { - for(GrailsApplicationDiscoveryStrategy strategy : applicationDiscoveryStrategies) { + for (GrailsApplicationDiscoveryStrategy strategy : applicationDiscoveryStrategies) { ApplicationContext applicationContext = strategy.findApplicationContext(); - if(applicationContext != null) { + if (applicationContext != null) { return applicationContext; } } return null; } + /** * * @return The ApplicationContext or null if it doesn't exist */ public static GrailsApplication findApplication() { - for(GrailsApplicationDiscoveryStrategy strategy : applicationDiscoveryStrategies) { + for (GrailsApplicationDiscoveryStrategy strategy : applicationDiscoveryStrategies) { GrailsApplication grailsApplication = strategy.findGrailsApplication(); - if(grailsApplication != null) { + if (grailsApplication != null) { return grailsApplication; } } @@ -216,7 +220,7 @@ private static T get(Holder holder, String type, boolean mappedOnly) { private static void createServletContextsHolder() { try { Class clazz = Holders.class.getClassLoader().loadClass("grails.web.context.WebRequestServletHolder"); - servletContexts = (Holder)clazz.newInstance(); + servletContexts = (Holder) clazz.newInstance(); } catch (ClassNotFoundException e) { // shouldn't happen diff --git a/grails-core/src/main/groovy/grails/util/Mixin.java b/grails-core/src/main/groovy/grails/util/Mixin.java index 3de84172871..68376a43171 100644 --- a/grails-core/src/main/groovy/grails/util/Mixin.java +++ b/grails-core/src/main/groovy/grails/util/Mixin.java @@ -25,7 +25,6 @@ import org.codehaus.groovy.transform.GroovyASTTransformationClass; - /** * * @author Graeme Rocher diff --git a/grails-core/src/main/groovy/grails/util/MixinTargetAware.groovy b/grails-core/src/main/groovy/grails/util/MixinTargetAware.groovy index 78e20b97e6b..b9c98886027 100644 --- a/grails-core/src/main/groovy/grails/util/MixinTargetAware.groovy +++ b/grails-core/src/main/groovy/grails/util/MixinTargetAware.groovy @@ -26,7 +26,7 @@ package grails.util * @deprecated Mixins are deprecated in Groovy 4.0 and will be removed in a future version of Grails. */ @Deprecated -public interface MixinTargetAware { +interface MixinTargetAware { void setTarget(T targetObject) -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/grails/util/Pair.java b/grails-core/src/main/groovy/grails/util/Pair.java index 12bfe10bdae..9626f711f10 100644 --- a/grails-core/src/main/groovy/grails/util/Pair.java +++ b/grails-core/src/main/groovy/grails/util/Pair.java @@ -53,7 +53,7 @@ public boolean equals(Object obj) { return false; if (getClass() != obj.getClass()) return false; - Pair other = (Pair)obj; + Pair other = (Pair) obj; if (aValue == null) { if (other.aValue != null) return false; diff --git a/grails-core/src/main/groovy/grails/util/Triple.java b/grails-core/src/main/groovy/grails/util/Triple.java index cc166b58f27..61c45afb486 100644 --- a/grails-core/src/main/groovy/grails/util/Triple.java +++ b/grails-core/src/main/groovy/grails/util/Triple.java @@ -60,7 +60,7 @@ public boolean equals(Object obj) { return false; if (getClass() != obj.getClass()) return false; - Triple other = (Triple)obj; + Triple other = (Triple) obj; if (aValue == null) { if (other.aValue != null) return false; diff --git a/grails-core/src/main/groovy/grails/util/TypeConvertingMap.groovy b/grails-core/src/main/groovy/grails/util/TypeConvertingMap.groovy index 710bc40f16c..7a503e48a9b 100644 --- a/grails-core/src/main/groovy/grails/util/TypeConvertingMap.groovy +++ b/grails-core/src/main/groovy/grails/util/TypeConvertingMap.groovy @@ -31,6 +31,7 @@ import groovy.transform.CompileStatic */ @CompileStatic class TypeConvertingMap extends AbstractTypeConvertingMap { + TypeConvertingMap() { super() } diff --git a/grails-core/src/main/groovy/grails/validation/Constrained.java b/grails-core/src/main/groovy/grails/validation/Constrained.java index b275050790e..ab114d63e51 100644 --- a/grails-core/src/main/groovy/grails/validation/Constrained.java +++ b/grails-core/src/main/groovy/grails/validation/Constrained.java @@ -18,10 +18,10 @@ */ package grails.validation; -import groovy.lang.Range; - import java.util.List; +import groovy.lang.Range; + /** * A interface for something that is constrained by various criteria * diff --git a/grails-core/src/main/groovy/grails/validation/ConstraintsEvaluator.java b/grails-core/src/main/groovy/grails/validation/ConstraintsEvaluator.java index ee9a2d115f4..f976d6106dc 100644 --- a/grails-core/src/main/groovy/grails/validation/ConstraintsEvaluator.java +++ b/grails-core/src/main/groovy/grails/validation/ConstraintsEvaluator.java @@ -18,10 +18,10 @@ */ package grails.validation; -import groovy.lang.Closure; - import java.util.Map; +import groovy.lang.Closure; + /** * Evaluates and returns constraints. * diff --git a/grails-core/src/main/groovy/grails/validation/DeferredBindingActions.java b/grails-core/src/main/groovy/grails/validation/DeferredBindingActions.java index 5d9a453b1b4..d7fdc6c611c 100644 --- a/grails-core/src/main/groovy/grails/validation/DeferredBindingActions.java +++ b/grails-core/src/main/groovy/grails/validation/DeferredBindingActions.java @@ -18,12 +18,13 @@ */ package grails.validation; +import java.util.ArrayList; +import java.util.List; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.grails.core.lifecycle.ShutdownOperations; -import java.util.ArrayList; -import java.util.List; +import org.grails.core.lifecycle.ShutdownOperations; /** * Binding operations that are deferred until either validate() or save() are called. @@ -33,13 +34,13 @@ */ public class DeferredBindingActions { - private static ThreadLocal> deferredBindingActions = new ThreadLocal>(); + private static ThreadLocal> deferredBindingActions = new ThreadLocal<>(); private static Log LOG = LogFactory.getLog(DeferredBindingActions.class); static { ShutdownOperations.addOperation(new Runnable() { public void run() { - deferredBindingActions = new ThreadLocal>(); + deferredBindingActions = new ThreadLocal<>(); } }, true); } @@ -55,7 +56,7 @@ public static void addBindingAction(Runnable runnable) { private static List getDeferredBindingActions() { List runnables = deferredBindingActions.get(); if (runnables == null) { - runnables = new ArrayList(); + runnables = new ArrayList<>(); deferredBindingActions.set(runnables); } return runnables; diff --git a/grails-core/src/main/groovy/grails/validation/ValidationException.java b/grails-core/src/main/groovy/grails/validation/ValidationException.java index 35f1c2d4fee..ce465fc71d0 100644 --- a/grails-core/src/main/groovy/grails/validation/ValidationException.java +++ b/grails-core/src/main/groovy/grails/validation/ValidationException.java @@ -18,10 +18,11 @@ */ package grails.validation; -import org.grails.core.exceptions.GrailsException; import org.springframework.validation.Errors; import org.springframework.validation.ObjectError; +import org.grails.core.exceptions.GrailsException; + /** * Thrown when validation fails during a .save(). * @@ -43,17 +44,17 @@ public Errors getErrors() { return errors; } - public String getMessage() { - return fullMessage; + public String getMessage() { + return fullMessage; } - + public static String formatErrors(Errors errors) { return formatErrors(errors, null); } - + public static String formatErrors(Errors errors, String msg) { StringBuilder b = new StringBuilder(); - if(msg != null && msg.length() > 0) { + if (msg != null && msg.length() > 0) { b.append(msg).append(":\n"); } for (ObjectError error : errors.getAllErrors()) { diff --git a/grails-core/src/main/groovy/grails/web/CamelCaseUrlConverter.java b/grails-core/src/main/groovy/grails/web/CamelCaseUrlConverter.java index 0793850656a..9ac7f2d2af7 100644 --- a/grails-core/src/main/groovy/grails/web/CamelCaseUrlConverter.java +++ b/grails-core/src/main/groovy/grails/web/CamelCaseUrlConverter.java @@ -18,9 +18,9 @@ */ package grails.web; -import grails.util.GrailsNameUtils; import org.springframework.util.StringUtils; +import grails.util.GrailsNameUtils; /** * URL converter that allows for camel case URLs diff --git a/grails-core/src/main/groovy/grails/web/HyphenatedUrlConverter.java b/grails-core/src/main/groovy/grails/web/HyphenatedUrlConverter.java index a9ba2f3668a..fa9033ab571 100644 --- a/grails-core/src/main/groovy/grails/web/HyphenatedUrlConverter.java +++ b/grails-core/src/main/groovy/grails/web/HyphenatedUrlConverter.java @@ -18,7 +18,6 @@ */ package grails.web; - import org.springframework.util.StringUtils; /** diff --git a/grails-core/src/main/groovy/org/grails/beans/support/PropertiesEditor.java b/grails-core/src/main/groovy/org/grails/beans/support/PropertiesEditor.java index 91ac4018c5a..95e95c7360e 100644 --- a/grails-core/src/main/groovy/org/grails/beans/support/PropertiesEditor.java +++ b/grails-core/src/main/groovy/org/grails/beans/support/PropertiesEditor.java @@ -38,7 +38,7 @@ public class PropertiesEditor extends org.springframework.beans.propertyeditors. public void setValue(Object value) { if (!(value instanceof Properties) && value instanceof Map) { Properties props = new Properties(); - for(Map.Entry entry : (Set)((Map)value).entrySet()) { + for (Map.Entry entry : (Set) ((Map) value).entrySet()) { props.put(String.valueOf(entry.getKey()), entry.getValue() != null ? String.valueOf(entry.getValue()) : null); } super.setValue(props); @@ -47,4 +47,4 @@ public void setValue(Object value) { super.setValue(value); } } -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/org/grails/boot/internal/JavaCompiler.groovy b/grails-core/src/main/groovy/org/grails/boot/internal/JavaCompiler.groovy index 18dc7e6f59e..3f61bfd23d4 100644 --- a/grails-core/src/main/groovy/org/grails/boot/internal/JavaCompiler.groovy +++ b/grails-core/src/main/groovy/org/grails/boot/internal/JavaCompiler.groovy @@ -18,13 +18,14 @@ */ package org.grails.boot.internal -import groovy.transform.CompileStatic -import org.codehaus.groovy.control.CompilerConfiguration -import org.springframework.util.ClassUtils +import java.nio.charset.Charset import javax.tools.ToolProvider -import java.nio.charset.Charset +import groovy.transform.CompileStatic +import org.codehaus.groovy.control.CompilerConfiguration + +import org.springframework.util.ClassUtils /** * Helper for recompiling Java code at runtime @@ -36,7 +37,7 @@ import java.nio.charset.Charset class JavaCompiler { static boolean isAvailable() { - ClassUtils.isPresent("javax.tools.JavaCompiler", JavaCompiler.classLoader) + ClassUtils.isPresent('javax.tools.JavaCompiler', JavaCompiler.classLoader) } static boolean recompile(CompilerConfiguration config, File... files) { diff --git a/grails-core/src/main/groovy/org/grails/compiler/CriteriaTypeCheckingExtension.groovy b/grails-core/src/main/groovy/org/grails/compiler/CriteriaTypeCheckingExtension.groovy index 8a00133f8a3..826135dee08 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/CriteriaTypeCheckingExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/CriteriaTypeCheckingExtension.groovy @@ -23,9 +23,9 @@ import org.codehaus.groovy.ast.expr.ArgumentListExpression import org.codehaus.groovy.ast.expr.ClassExpression import org.codehaus.groovy.ast.expr.MethodCall import org.codehaus.groovy.ast.expr.MethodCallExpression -import org.grails.compiler.injection.GrailsASTUtils import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.TypeCheckingDSL +import org.grails.compiler.injection.GrailsASTUtils /** * @@ -34,27 +34,27 @@ import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.Type class CriteriaTypeCheckingExtension extends TypeCheckingDSL { @Override - public Object run() { + Object run() { setup { newScope() } finish { scopeExit() } - + methodNotFound { ClassNode receiver, String name, ArgumentListExpression argList, ClassNode[] argTypes, MethodCall call -> def dynamicCall - if(currentScope.processingCriteriaClosure) { - dynamicCall = makeDynamic (call) + if (currentScope.processingCriteriaClosure) { + dynamicCall = makeDynamic(call) } dynamicCall } - + afterMethodCall { MethodCall call -> - if(isCriteriaCall(call)) { + if (isCriteriaCall(call)) { scopeExit() } } - + beforeMethodCall { MethodCall call -> - if(isCriteriaCall(call)) { + if (isCriteriaCall(call)) { newScope { processingCriteriaClosure = true } @@ -62,11 +62,11 @@ class CriteriaTypeCheckingExtension extends TypeCheckingDSL { } null } - + protected boolean isCriteriaCall(MethodCall call) { - call instanceof MethodCallExpression && - call.objectExpression instanceof ClassExpression && - GrailsASTUtils.isDomainClass(call.objectExpression.type, null) && + call instanceof MethodCallExpression && + call.objectExpression instanceof ClassExpression && + GrailsASTUtils.isDomainClass(call.objectExpression.type, null) && (call.method.value == 'withCriteria' || call.method.value == 'createCriteria') } } diff --git a/grails-core/src/main/groovy/org/grails/compiler/DomainMappingTypeCheckingExtension.groovy b/grails-core/src/main/groovy/org/grails/compiler/DomainMappingTypeCheckingExtension.groovy index b95b5dc7b1e..f461618a94e 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/DomainMappingTypeCheckingExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/DomainMappingTypeCheckingExtension.groovy @@ -23,26 +23,27 @@ import org.codehaus.groovy.ast.expr.ArgumentListExpression import org.codehaus.groovy.ast.expr.ClosureExpression import org.codehaus.groovy.ast.expr.MethodCall import org.codehaus.groovy.ast.stmt.EmptyStatement -import org.grails.compiler.injection.GrailsASTUtils import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.TypeCheckingDSL +import org.grails.compiler.injection.GrailsASTUtils + /** * * @since 2.4 */ class DomainMappingTypeCheckingExtension extends TypeCheckingDSL { - + @Override - public Object run() { + Object run() { setup { newScope() } finish { scopeExit() } - + beforeVisitClass { ClassNode classNode -> def mappingProperty = classNode.getField('mapping') - if(mappingProperty && mappingProperty.isStatic() && mappingProperty.initialExpression instanceof ClosureExpression) { + if (mappingProperty && mappingProperty.isStatic() && mappingProperty.initialExpression instanceof ClosureExpression) { def sourceUnit = classNode?.module?.context - if(GrailsASTUtils.isDomainClass(classNode, sourceUnit)) { + if (GrailsASTUtils.isDomainClass(classNode, sourceUnit)) { newScope { mappingClosureCode = mappingProperty.initialExpression.code } @@ -56,23 +57,23 @@ class DomainMappingTypeCheckingExtension extends TypeCheckingDSL { } afterVisitClass { ClassNode classNode -> - if(currentScope.mappingClosureCode) { + if (currentScope.mappingClosureCode) { def mappingProperty = classNode.getField('mapping') mappingProperty.initialExpression.code = currentScope.mappingClosureCode currentScope.checkingMappingClosure = true - withTypeChecker { visitClosureExpression mappingProperty.initialExpression } + withTypeChecker { visitClosureExpression(mappingProperty.initialExpression) } } scopeExit() } methodNotFound { ClassNode receiver, String name, ArgumentListExpression argList, ClassNode[] argTypes, MethodCall call -> def dynamicCall - if(currentScope.mappingClosureCode && currentScope.checkingMappingClosure) { - dynamicCall = makeDynamic (call) + if (currentScope.mappingClosureCode && currentScope.checkingMappingClosure) { + dynamicCall = makeDynamic(call) } dynamicCall } - + null } } diff --git a/grails-core/src/main/groovy/org/grails/compiler/DynamicFinderTypeCheckingExtension.groovy b/grails-core/src/main/groovy/org/grails/compiler/DynamicFinderTypeCheckingExtension.groovy index fa252eaf633..3082e15fd63 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/DynamicFinderTypeCheckingExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/DynamicFinderTypeCheckingExtension.groovy @@ -20,16 +20,17 @@ package org.grails.compiler import java.lang.reflect.Modifier -import static org.codehaus.groovy.ast.ClassHelper.CLASS_Type -import static org.codehaus.groovy.ast.ClassHelper.Integer_TYPE -import static org.codehaus.groovy.ast.ClassHelper.LIST_TYPE - import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.expr.ArgumentListExpression import org.codehaus.groovy.ast.expr.MethodCall -import org.grails.compiler.injection.GrailsASTUtils import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.TypeCheckingDSL +import org.grails.compiler.injection.GrailsASTUtils + +import static org.codehaus.groovy.ast.ClassHelper.CLASS_Type +import static org.codehaus.groovy.ast.ClassHelper.Integer_TYPE +import static org.codehaus.groovy.ast.ClassHelper.LIST_TYPE + /** * * @since 2.4 @@ -40,14 +41,14 @@ class DynamicFinderTypeCheckingExtension extends TypeCheckingDSL { Object run() { methodNotFound { ClassNode receiver, String name, ArgumentListExpression argList, ClassNode[] argTypes, MethodCall call -> def dynamicCall = null - if(receiver == CLASS_Type) { + if (receiver == CLASS_Type) { def genericsTypes = receiver.genericsTypes - if(genericsTypes) { + if (genericsTypes) { def staticMethodCallTargetType = genericsTypes[0].type - if(staticMethodCallTargetType) { + if (staticMethodCallTargetType) { def sourceUnit = staticMethodCallTargetType?.module?.context - if(GrailsASTUtils.isDomainClass(staticMethodCallTargetType, sourceUnit)) { - switch(name) { + if (GrailsASTUtils.isDomainClass(staticMethodCallTargetType, sourceUnit)) { + switch (name) { case ~/countBy[A-Z].*/: dynamicCall = makeDynamicGormCall(call, Integer_TYPE, staticMethodCallTargetType) break diff --git a/grails-core/src/main/groovy/org/grails/compiler/HttpServletRequestTypeCheckingExtension.groovy b/grails-core/src/main/groovy/org/grails/compiler/HttpServletRequestTypeCheckingExtension.groovy index 4116b5a31d2..3753f81ecba 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/HttpServletRequestTypeCheckingExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/HttpServletRequestTypeCheckingExtension.groovy @@ -34,11 +34,11 @@ class HttpServletRequestTypeCheckingExtension extends GroovyTypeCheckingExtensio def run() { unresolvedProperty { PropertyExpression expression -> def property = expression.property - if(isConstantExpression(property)) { + if (isConstantExpression(property)) { def propertyName = property.value - if(propertyName in dynamicPropertyNames) { + if (propertyName in dynamicPropertyNames) { def referenceType = getType(expression.objectExpression) - if(referenceType.name == 'jakarta.servlet.http.HttpServletRequest') { + if (referenceType.name == 'jakarta.servlet.http.HttpServletRequest') { return makeDynamic(expression) } } diff --git a/grails-core/src/main/groovy/org/grails/compiler/NamedQueryTypeCheckingExtension.groovy b/grails-core/src/main/groovy/org/grails/compiler/NamedQueryTypeCheckingExtension.groovy index b90166fb2c1..5b143cad4fc 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/NamedQueryTypeCheckingExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/NamedQueryTypeCheckingExtension.groovy @@ -32,7 +32,7 @@ import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.Type class NamedQueryTypeCheckingExtension extends TypeCheckingDSL { @Override - public Object run() { + Object run() { setup { newScope() } finish { scopeExit() } @@ -40,7 +40,7 @@ class NamedQueryTypeCheckingExtension extends TypeCheckingDSL { beforeVisitClass { ClassNode classNode -> def namedQueryProperty = classNode.getField('namedQueries') - if(namedQueryProperty && namedQueryProperty.isStatic() && namedQueryProperty.initialExpression instanceof ClosureExpression) { + if (namedQueryProperty && namedQueryProperty.isStatic() && namedQueryProperty.initialExpression instanceof ClosureExpression) { newScope { namedQueryClosureCode = namedQueryProperty.initialExpression.code } @@ -51,7 +51,7 @@ class NamedQueryTypeCheckingExtension extends TypeCheckingDSL { } afterVisitClass { ClassNode classNode -> - if(currentScope.namedQueryClosureCode) { + if (currentScope.namedQueryClosureCode) { def namedQueryProperty = classNode.getField('namedQueries') namedQueryProperty.initialExpression.code = currentScope.namedQueryClosureCode currentScope.checkingNamedQueryClosure = true @@ -61,8 +61,8 @@ class NamedQueryTypeCheckingExtension extends TypeCheckingDSL { methodNotFound { ClassNode receiver, String name, ArgumentListExpression argList, ClassNode[] argTypes, MethodCall call -> def dynamicCall - if(currentScope.namedQueryClosureCode && currentScope.checkingNamedQueryClosure) { - dynamicCall = makeDynamic (call) + if (currentScope.namedQueryClosureCode && currentScope.checkingNamedQueryClosure) { + dynamicCall = makeDynamic(call) } dynamicCall } diff --git a/grails-core/src/main/groovy/org/grails/compiler/RelationshipManagementMethodTypeCheckingExtension.groovy b/grails-core/src/main/groovy/org/grails/compiler/RelationshipManagementMethodTypeCheckingExtension.groovy index f5b0f23dc66..1e2b4bd62eb 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/RelationshipManagementMethodTypeCheckingExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/RelationshipManagementMethodTypeCheckingExtension.groovy @@ -18,12 +18,12 @@ */ package org.grails.compiler -import grails.util.GrailsNameUtils - import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.expr.ArgumentListExpression import org.codehaus.groovy.ast.expr.MethodCall import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.TypeCheckingDSL + +import grails.util.GrailsNameUtils import org.grails.compiler.injection.GrailsASTUtils /** @@ -39,11 +39,11 @@ class RelationshipManagementMethodTypeCheckingExtension extends TypeCheckingDSL methodNotFound { ClassNode receiver, String name, ArgumentListExpression argList, ClassNode[] argTypes, MethodCall call -> def dynamicCall def matcher = name =~ /(addTo|removeFrom)([A-Z].*)/ - if(matcher) { + if (matcher) { def sourceUnit = receiver.module?.context - if(GrailsASTUtils.isDomainClass(receiver, sourceUnit)) { + if (GrailsASTUtils.isDomainClass(receiver, sourceUnit)) { def propertyName = GrailsNameUtils.getPropertyName(matcher.group(2)) - if(receiver.getField(propertyName)) { + if (receiver.getField(propertyName)) { dynamicCall = makeDynamic(call, receiver) dynamicCall.declaringClass = receiver } diff --git a/grails-core/src/main/groovy/org/grails/compiler/ValidateableTypeCheckingExtension.groovy b/grails-core/src/main/groovy/org/grails/compiler/ValidateableTypeCheckingExtension.groovy index 4776b4e24e7..49bd4da82d7 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/ValidateableTypeCheckingExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/ValidateableTypeCheckingExtension.groovy @@ -32,14 +32,14 @@ import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.Type class ValidateableTypeCheckingExtension extends TypeCheckingDSL { @Override - public Object run() { + Object run() { setup { newScope() } finish { scopeExit() } beforeVisitClass { ClassNode classNode -> def constraintsProperty = classNode.getField('constraints') - if(constraintsProperty && constraintsProperty.isStatic() && constraintsProperty.initialExpression instanceof ClosureExpression) { + if (constraintsProperty && constraintsProperty.isStatic() && constraintsProperty.initialExpression instanceof ClosureExpression) { newScope { constraintsClosureCode = constraintsProperty.initialExpression.code } @@ -50,20 +50,20 @@ class ValidateableTypeCheckingExtension extends TypeCheckingDSL { } afterVisitClass { ClassNode classNode -> - if(currentScope.constraintsClosureCode) { + if (currentScope.constraintsClosureCode) { def constraintsProperty = classNode.getField('constraints') constraintsProperty.initialExpression.code = currentScope.constraintsClosureCode currentScope.checkingConstraintsClosure = true - withTypeChecker { visitClosureExpression constraintsProperty.initialExpression } + withTypeChecker { visitClosureExpression(constraintsProperty.initialExpression) } } scopeExit() } methodNotFound { ClassNode receiver, String name, ArgumentListExpression argList, ClassNode[] argTypes, MethodCall call -> def dynamicCall - if(currentScope.constraintsClosureCode && currentScope.checkingConstraintsClosure) { - if(receiver.getField(name) || 'importFrom' == name) { - dynamicCall = makeDynamic (call) + if (currentScope.constraintsClosureCode && currentScope.checkingConstraintsClosure) { + if (receiver.getField(name) || 'importFrom' == name) { + dynamicCall = makeDynamic(call) } } dynamicCall diff --git a/grails-core/src/main/groovy/org/grails/compiler/WhereQueryTypeCheckingExtension.groovy b/grails-core/src/main/groovy/org/grails/compiler/WhereQueryTypeCheckingExtension.groovy index 3919c0ad68e..25b7e86fbf4 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/WhereQueryTypeCheckingExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/WhereQueryTypeCheckingExtension.groovy @@ -23,9 +23,9 @@ import org.codehaus.groovy.ast.expr.ArgumentListExpression import org.codehaus.groovy.ast.expr.ClassExpression import org.codehaus.groovy.ast.expr.MethodCall import org.codehaus.groovy.ast.expr.MethodCallExpression -import org.grails.compiler.injection.GrailsASTUtils import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.TypeCheckingDSL +import org.grails.compiler.injection.GrailsASTUtils /** * @@ -34,27 +34,27 @@ import org.codehaus.groovy.transform.stc.GroovyTypeCheckingExtensionSupport.Type class WhereQueryTypeCheckingExtension extends TypeCheckingDSL { @Override - public Object run() { + Object run() { setup { newScope() } finish { scopeExit() } - + methodNotFound { ClassNode receiver, String name, ArgumentListExpression argList, ClassNode[] argTypes, MethodCall call -> def dynamicCall - if(currentScope.processingWhereQueryClosure) { - dynamicCall = makeDynamic (call) + if (currentScope.processingWhereQueryClosure) { + dynamicCall = makeDynamic(call) } dynamicCall } - + afterMethodCall { MethodCall call -> - if(isWhereQueryCall(call)) { + if (isWhereQueryCall(call)) { scopeExit() } } - + beforeMethodCall { MethodCall call -> - if(isWhereQueryCall(call)) { + if (isWhereQueryCall(call)) { newScope { processingWhereQueryClosure = true } @@ -62,11 +62,11 @@ class WhereQueryTypeCheckingExtension extends TypeCheckingDSL { } null } - + protected boolean isWhereQueryCall(MethodCall call) { - call instanceof MethodCallExpression && - call.objectExpression instanceof ClassExpression && - GrailsASTUtils.isDomainClass(call.objectExpression.type, null) && + call instanceof MethodCallExpression && + call.objectExpression instanceof ClassExpression && + GrailsASTUtils.isDomainClass(call.objectExpression.type, null) && call.method.value == 'where' } } diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/ASTValidationErrorsHelper.java b/grails-core/src/main/groovy/org/grails/compiler/injection/ASTValidationErrorsHelper.java index 6789813c014..052eda3fd67 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/ASTValidationErrorsHelper.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/ASTValidationErrorsHelper.java @@ -18,17 +18,37 @@ */ package org.grails.compiler.injection; -import grails.compiler.ast.GrailsArtefactClassInjector; -import grails.validation.ValidationErrors; +import java.lang.reflect.Modifier; + import org.apache.groovy.ast.tools.AnnotatedNodeUtils; -import org.codehaus.groovy.ast.*; -import org.codehaus.groovy.ast.expr.*; -import org.codehaus.groovy.ast.stmt.*; +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.BinaryExpression; +import org.codehaus.groovy.ast.expr.BooleanExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.ConstructorCallExpression; +import org.codehaus.groovy.ast.expr.EmptyExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.TupleExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; +import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.stmt.ExpressionStatement; +import org.codehaus.groovy.ast.stmt.IfStatement; +import org.codehaus.groovy.ast.stmt.ReturnStatement; +import org.codehaus.groovy.ast.stmt.Statement; import org.codehaus.groovy.syntax.Token; import org.codehaus.groovy.syntax.Types; + import org.springframework.validation.Errors; -import java.lang.reflect.Modifier; +import grails.compiler.ast.GrailsArtefactClassInjector; +import grails.validation.ValidationErrors; /** * @author Jeff Brown diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/AbstractArtefactTypeAstTransformation.java b/grails-core/src/main/groovy/org/grails/compiler/injection/AbstractArtefactTypeAstTransformation.java index 6feaa875b11..f2d5eed2760 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/AbstractArtefactTypeAstTransformation.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/AbstractArtefactTypeAstTransformation.java @@ -18,9 +18,8 @@ */ package org.grails.compiler.injection; -import grails.compiler.ast.AllArtefactClassInjector; -import grails.compiler.ast.AnnotatedClassInjector; -import grails.compiler.ast.ClassInjector; +import java.util.List; + import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; @@ -28,7 +27,9 @@ import org.codehaus.groovy.transform.GroovyASTTransformation; import org.codehaus.groovy.transform.TransformWithPriority; -import java.util.List; +import grails.compiler.ast.AllArtefactClassInjector; +import grails.compiler.ast.AnnotatedClassInjector; +import grails.compiler.ast.ClassInjector; /** * Base implementation for the artefact type transformation. @@ -45,16 +46,16 @@ protected void performInjectionOnArtefactType(SourceUnit sourceUnit, ClassNode c if (!injectors.isEmpty()) { AbstractGrailsArtefactTransformer.addToTransformedClasses(cNode.getName()); for (ClassInjector injector : injectors) { - if(injector instanceof AllArtefactClassInjector) { - injector.performInjection(sourceUnit,cNode); + if (injector instanceof AllArtefactClassInjector) { + injector.performInjection(sourceUnit, cNode); } - else if(injector instanceof AnnotatedClassInjector) { - ((AnnotatedClassInjector)injector).performInjectionOnAnnotatedClass(sourceUnit,null, cNode); + else if (injector instanceof AnnotatedClassInjector) { + ((AnnotatedClassInjector) injector).performInjectionOnAnnotatedClass(sourceUnit, null, cNode); } } } } catch (RuntimeException e) { - System.err.println("Error occurred calling AST injector ["+getClass()+"]: " + e.getMessage()); + System.err.println("Error occurred calling AST injector [" + getClass() + "]: " + e.getMessage()); throw e; } } diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/AbstractGrailsArtefactTransformer.java b/grails-core/src/main/groovy/org/grails/compiler/injection/AbstractGrailsArtefactTransformer.java index d9bacd36883..dd13d41595c 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/AbstractGrailsArtefactTransformer.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/AbstractGrailsArtefactTransformer.java @@ -18,23 +18,51 @@ */ package org.grails.compiler.injection; -import grails.artefact.Artefact; -import grails.compiler.ast.AnnotatedClassInjector; -import grails.compiler.ast.GrailsArtefactClassInjector; +import java.lang.reflect.Modifier; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import org.apache.groovy.ast.tools.AnnotatedNodeUtils; -import org.codehaus.groovy.ast.*; -import org.codehaus.groovy.ast.expr.*; -import org.codehaus.groovy.ast.stmt.*; +import org.codehaus.groovy.ast.AnnotationNode; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.InnerClassNode; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.PropertyNode; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.AttributeExpression; +import org.codehaus.groovy.ast.expr.BinaryExpression; +import org.codehaus.groovy.ast.expr.BooleanExpression; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.ConstructorCallExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; +import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.stmt.ExpressionStatement; +import org.codehaus.groovy.ast.stmt.IfStatement; +import org.codehaus.groovy.ast.stmt.ReturnStatement; +import org.codehaus.groovy.ast.stmt.ThrowStatement; import org.codehaus.groovy.classgen.GeneratorContext; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.runtime.MetaClassHelper; import org.codehaus.groovy.syntax.Token; import org.codehaus.groovy.syntax.Types; -import org.grails.core.artefact.DomainClassArtefactHandler; + import org.springframework.beans.factory.annotation.Autowired; -import java.lang.reflect.Modifier; -import java.util.*; +import grails.artefact.Artefact; +import grails.compiler.ast.AnnotatedClassInjector; +import grails.compiler.ast.GrailsArtefactClassInjector; +import org.grails.core.artefact.DomainClassArtefactHandler; /** * Abstract transformer that takes an implementation class and creates methods @@ -47,8 +75,7 @@ @SuppressWarnings("rawtypes") public abstract class AbstractGrailsArtefactTransformer implements GrailsArtefactClassInjector, AnnotatedClassInjector, Comparable { - - private static final Set KNOWN_TRANSFORMED_CLASSES = new LinkedHashSet(); + private static final Set KNOWN_TRANSFORMED_CLASSES = new LinkedHashSet<>(); private static final String INSTANCE_PREFIX = "instance"; private static final String STATIC_PREFIX = "static"; private static final AnnotationNode AUTO_WIRED_ANNOTATION = new AnnotationNode(new ClassNode(Autowired.class)); @@ -62,7 +89,7 @@ public abstract class AbstractGrailsArtefactTransformer implements GrailsArtefac private static final String[] DEFAULT_GENERICS_PLACEHOLDERS = new String[]{"D", "T"}; - private final Set classesTransformedByThis = new LinkedHashSet(); + private final Set classesTransformedByThis = new LinkedHashSet<>(); public String[] getArtefactTypes() { return new String[]{ getArtefactType() }; @@ -70,7 +97,7 @@ public String[] getArtefactTypes() { protected String getArtefactType() { String name = getClass().getSimpleName(); - if(name.endsWith("Transformer")) { + if (name.endsWith("Transformer")) { return name.substring(0, name.length() - 11); } return name; @@ -92,7 +119,7 @@ public int compareTo(Object o) { } public void performInjection(SourceUnit source, GeneratorContext context, ClassNode classNode) { - if(shouldSkipInjection(classNode) || hasArtefactAnnotation(classNode)) return; + if (shouldSkipInjection(classNode) || hasArtefactAnnotation(classNode)) return; performInjectionOnAnnotatedClass(source, context, classNode); } @@ -102,7 +129,7 @@ public void performInjectionOnAnnotatedClass(SourceUnit source, ClassNode classN } public void performInjectionOnAnnotatedClass(SourceUnit source, GeneratorContext context, ClassNode classNode) { - if(shouldSkipInjection(classNode)) return; + if (shouldSkipInjection(classNode)) return; final String className = classNode.getName(); KNOWN_TRANSFORMED_CLASSES.add(className); @@ -143,12 +170,12 @@ protected void performInstanceImplementationInjection(SourceUnit source, ClassNo final String lookupMethodName = CURRENT_PREFIX + instanceImplementation.getSimpleName(); MethodNode lookupMethod = createStaticLookupMethod(classNode, implementationNode, apiInstanceProperty, lookupMethodName); apiInstance = new MethodCallExpression(new ClassExpression(classNode), lookupMethodName, ZERO_ARGS); - ((MethodCallExpression)apiInstance).setMethodTarget(lookupMethod); + ((MethodCallExpression) apiInstance).setMethodTarget(lookupMethod); } else if (requiresAutowiring()) { PropertyNode propertyNode = new PropertyNode(apiInstanceProperty, Modifier.PUBLIC, implementationNode, classNode, constructorCallExpression, null, null); propertyNode.addAnnotation(AUTO_WIRED_ANNOTATION); - if(getMarkerAnnotation() != null) { + if (getMarkerAnnotation() != null) { propertyNode.addAnnotation(getMarkerAnnotation()); } classNode.addProperty(propertyNode); @@ -156,7 +183,7 @@ else if (requiresAutowiring()) { else { FieldNode fieldNode = classNode.getField(apiInstanceProperty); if (fieldNode == null || (Modifier.isPrivate(fieldNode.getModifiers()) && !fieldNode.getDeclaringClass().equals(classNode))) { - fieldNode = new FieldNode(apiInstanceProperty, PRIVATE_STATIC_MODIFIER,implementationNode, classNode,constructorCallExpression); + fieldNode = new FieldNode(apiInstanceProperty, PRIVATE_STATIC_MODIFIER, implementationNode, classNode, constructorCallExpression); classNode.addField(fieldNode); } } @@ -192,10 +219,10 @@ protected void performStaticImplementationInjection(ClassNode classNode, MethodNode lookupMethod = createStaticLookupMethod(classNode, staticImplementationNode, apiInstanceProperty, lookupMethodName); MethodCallExpression apiLookupMethod = new MethodCallExpression(new ClassExpression(classNode), lookupMethodName, ZERO_ARGS); - apiLookupMethod.setMethodTarget(lookupMethod); + apiLookupMethod.setMethodTarget(lookupMethod); for (MethodNode declaredMethod : declaredMethods) { - if (isStaticCandidateMethod(classNode,declaredMethod)) { + if (isStaticCandidateMethod(classNode, declaredMethod)) { addDelegateStaticMethod(classNode, apiLookupMethod, declaredMethod, genericsPlaceholders); } } @@ -206,8 +233,8 @@ protected void addEnhancedAnnotation(ClassNode classNode) { } protected boolean shouldSkipInjection(ClassNode classNode) { - return !isValidTargetClassNode(classNode) - || (!isValidArtefactType() && !isValidArtefactTypeByConvention(classNode)) || classesTransformedByThis.contains(classNode.getName()); + return !isValidTargetClassNode(classNode) || + (!isValidArtefactType() && !isValidArtefactTypeByConvention(classNode)) || classesTransformedByThis.contains(classNode.getName()); } protected boolean hasArtefactAnnotation(ClassNode classNode) { @@ -215,9 +242,9 @@ protected boolean hasArtefactAnnotation(ClassNode classNode) { } protected boolean isValidTargetClassNode(ClassNode classNode) { - if(classNode.isEnum()) return false; // don't transform enums - if(classNode instanceof InnerClassNode) return false; - if(classNode.getName().contains("$")) return false; + if (classNode.isEnum()) return false; // don't transform enums + if (classNode instanceof InnerClassNode) return false; + if (classNode.getName().contains("$")) return false; return true; } @@ -226,8 +253,8 @@ protected boolean isValidArtefactType() { } protected Map resolveGenericsPlaceHolders(ClassNode classNode) { - Map genericsPlaceHolders = new LinkedHashMap(); - for(String placeHolder : DEFAULT_GENERICS_PLACEHOLDERS) { + Map genericsPlaceHolders = new LinkedHashMap<>(); + for (String placeHolder : DEFAULT_GENERICS_PLACEHOLDERS) { genericsPlaceHolders.put(placeHolder, classNode); } return genericsPlaceHolders; @@ -245,8 +272,8 @@ protected void addDelegateStaticMethod(ClassNode classNode, MethodCallExpression private boolean isValidArtefactTypeByConvention(ClassNode classNode) { String[] artefactTypes = getArtefactTypes(); for (String artefactType : artefactTypes) { - if(artefactType.equals("*")) return true; - if(classNode.getName().endsWith(artefactType)) return true; + if (artefactType.equals("*")) return true; + if (classNode.getName().endsWith(artefactType)) return true; } return false; } @@ -262,7 +289,7 @@ protected boolean isStaticCandidateMethod(ClassNode classNode, MethodNode declar protected boolean isStaticMethodExcluded(ClassNode classNode, MethodNode declaredMethod) { return GrailsASTUtils.isSetterOrGetterMethod(declaredMethod); } - + protected boolean isStaticMethodIncluded(ClassNode classNode, MethodNode declaredMethod) { return false; } @@ -271,7 +298,7 @@ private MethodNode createStaticLookupMethod(ClassNode classNode, ClassNode imple // if autowiring is required we add a default method that throws an exception // the method should be override via meta-programming in the Grails environment MethodNode lookupMethod = classNode.getMethod(lookupMethodName, ZERO_PARAMETERS); - if (lookupMethod == null || !lookupMethod.getDeclaringClass().equals(classNode)) { + if (lookupMethod == null || !lookupMethod.getDeclaringClass().equals(classNode)) { BlockStatement methodBody = new BlockStatement(); lookupMethod = populateAutowiredApiLookupMethod(classNode, implementationNode, apiProperty, lookupMethodName, methodBody); classNode.addMethod(lookupMethod); @@ -293,20 +320,20 @@ protected boolean requiresStaticLookupMethod() { protected MethodNode populateAutowiredApiLookupMethod(ClassNode classNode, ClassNode implementationNode, String apiProperty, String methodName, BlockStatement methodBody) { - + addApiLookupFieldAndSetter(classNode, implementationNode, apiProperty, null); - + VariableExpression apiVar = new VariableExpression(apiProperty, implementationNode); - + BlockStatement ifBlock = new BlockStatement(); ArgumentListExpression arguments = new ArgumentListExpression(); - arguments.addExpression(new ConstantExpression("Method on class ["+classNode+"] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.")); - ifBlock.addStatement(new ThrowStatement(new ConstructorCallExpression(new ClassNode(IllegalStateException.class), arguments))); + arguments.addExpression(new ConstantExpression("Method on class [" + classNode + "] was used outside of a Grails application. If running in the context of a test using the mocking API or bootstrap Grails correctly.")); + ifBlock.addStatement(new ThrowStatement(new ConstructorCallExpression(new ClassNode(IllegalStateException.class), arguments))); BlockStatement elseBlock = new BlockStatement(); elseBlock.addStatement(new ReturnStatement(apiVar)); - methodBody.addStatement(new IfStatement(new BooleanExpression(new BinaryExpression(apiVar, GrailsASTUtils.EQUALS_OPERATOR, GrailsASTUtils.NULL_EXPRESSION)),ifBlock,elseBlock)); - - MethodNode methodNode = new MethodNode(methodName, PUBLIC_STATIC_MODIFIER, implementationNode,ZERO_PARAMETERS,null,methodBody); + methodBody.addStatement(new IfStatement(new BooleanExpression(new BinaryExpression(apiVar, GrailsASTUtils.EQUALS_OPERATOR, GrailsASTUtils.NULL_EXPRESSION)), ifBlock, elseBlock)); + + MethodNode methodNode = new MethodNode(methodName, PUBLIC_STATIC_MODIFIER, implementationNode, ZERO_PARAMETERS, null, methodBody); return methodNode; } @@ -316,7 +343,7 @@ protected void addApiLookupFieldAndSetter(ClassNode classNode, ClassNode impleme if (fieldNode == null || !fieldNode.getDeclaringClass().equals(classNode)) { fieldNode = new FieldNode(apiProperty, Modifier.PRIVATE | Modifier.STATIC, implementationNode, classNode, initialValueExpression); classNode.addField(fieldNode); - + String setterName = "set" + MetaClassHelper.capitalize(apiProperty); Parameter setterParameter = new Parameter(implementationNode, apiProperty); BlockStatement setterBody = new BlockStatement(); @@ -332,7 +359,7 @@ protected void addApiLookupFieldAndSetter(ClassNode classNode, ClassNode impleme protected MethodNode populateDefaultApiLookupMethod(ClassNode implementationNode, String apiInstanceProperty, String methodName, BlockStatement methodBody) { methodBody.addStatement(new ReturnStatement(new VariableExpression(apiInstanceProperty, implementationNode))); - return new MethodNode(methodName, Modifier.PRIVATE, implementationNode,ZERO_PARAMETERS,null,methodBody); + return new MethodNode(methodName, Modifier.PRIVATE, implementationNode, ZERO_PARAMETERS, null, methodBody); } /** @@ -384,7 +411,7 @@ protected AnnotationNode getMarkerAnnotation() { } public static Collection getTransformedClassNames() { - return Collections.unmodifiableCollection( KNOWN_TRANSFORMED_CLASSES ); + return Collections.unmodifiableCollection(KNOWN_TRANSFORMED_CLASSES); } public static void addToTransformedClasses(String name) { diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/ApiDelegateTransformation.java b/grails-core/src/main/groovy/org/grails/compiler/injection/ApiDelegateTransformation.java index 31386d714a5..701215ceabc 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/ApiDelegateTransformation.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/ApiDelegateTransformation.java @@ -18,9 +18,15 @@ */ package org.grails.compiler.injection; -import org.apache.grails.common.compiler.GroovyTransformOrder; +import java.util.Arrays; +import java.util.Map; + import org.codehaus.groovy.GroovyBugError; -import org.codehaus.groovy.ast.*; +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.AnnotatedNode; +import org.codehaus.groovy.ast.AnnotationNode; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.FieldNode; import org.codehaus.groovy.ast.expr.ClassExpression; import org.codehaus.groovy.ast.expr.Expression; import org.codehaus.groovy.ast.expr.VariableExpression; @@ -30,8 +36,7 @@ import org.codehaus.groovy.transform.GroovyASTTransformation; import org.codehaus.groovy.transform.TransformWithPriority; -import java.util.Arrays; -import java.util.Map; +import org.apache.grails.common.compiler.GroovyTransformOrder; /** * The logic for the {@link grails.artefact.ApiDelegate} location transform. @@ -67,11 +72,11 @@ public void visit(ASTNode[] nodes, SourceUnit source) { GrailsASTUtils.addDelegateInstanceMethods(supportedType, owner, type, new VariableExpression(fieldNode.getName()), resolveGenericsPlaceHolders(supportedType), isNoNullCheck(), isUseCompileStatic()); } } - + protected boolean isNoNullCheck() { return true; } - + protected boolean isUseCompileStatic() { return true; } diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/ApplicationClassInjector.groovy b/grails-core/src/main/groovy/org/grails/compiler/injection/ApplicationClassInjector.groovy index 33bbae3495c..47a6475f81f 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/ApplicationClassInjector.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/ApplicationClassInjector.groovy @@ -16,10 +16,8 @@ */ package org.grails.compiler.injection -import grails.compiler.ast.AstTransformer -import grails.compiler.ast.GrailsArtefactClassInjector -import grails.io.ResourceUtils -import grails.util.BuildSettings +import java.lang.reflect.Modifier + import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import org.apache.groovy.ast.tools.AnnotatedNodeUtils @@ -34,12 +32,16 @@ import org.codehaus.groovy.ast.stmt.ReturnStatement import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.classgen.GeneratorContext import org.codehaus.groovy.control.SourceUnit + +import org.springframework.util.ClassUtils + +import grails.compiler.ast.AstTransformer +import grails.compiler.ast.GrailsArtefactClassInjector +import grails.io.ResourceUtils +import grails.util.BuildSettings import org.grails.core.artefact.ApplicationArtefactHandler import org.grails.io.support.GrailsResourceUtils import org.grails.io.support.UrlResource -import org.springframework.util.ClassUtils - -import java.lang.reflect.Modifier import static org.codehaus.groovy.ast.tools.GeneralUtils.args import static org.codehaus.groovy.ast.tools.GeneralUtils.callX @@ -87,32 +89,32 @@ class ApplicationClassInjector implements GrailsArtefactClassInjector { @Override @CompileDynamic void performInjectionOnAnnotatedClass(SourceUnit source, ClassNode classNode) { - if(applicationArtefactHandler.isArtefact(classNode)) { - def objectId = Integer.valueOf( System.identityHashCode(classNode) ) - if(!transformedInstances.contains(objectId)) { + if (applicationArtefactHandler.isArtefact(classNode)) { + def objectId = Integer.valueOf(System.identityHashCode(classNode)) + if (!transformedInstances.contains(objectId)) { transformedInstances << objectId List statements = [ - stmt(callX(classX(System), "setProperty", args(propX(classX(BuildSettings), "MAIN_CLASS_NAME"), constX(classNode.name)))) + stmt(callX(classX(System), 'setProperty', args(propX(classX(BuildSettings), 'MAIN_CLASS_NAME'), constX(classNode.name)))) ] classNode.addStaticInitializerStatements(statements, true) def packageNamesMethod = classNode.getMethod('packageNames', GrailsASTUtils.ZERO_PARAMETERS) - if(packageNamesMethod == null || packageNamesMethod.declaringClass != classNode) { + if (packageNamesMethod == null || packageNamesMethod.declaringClass != classNode) { def collectionClassNode = GrailsASTUtils.replaceGenericsPlaceholders(ClassHelper.make(Collection), [E: ClassHelper.make(String)]) def packageNamesBody = new BlockStatement() def grailsAppDir = GrailsResourceUtils.getAppDir(new UrlResource(GrailsASTUtils.getSourceUrl(source))) - if(grailsAppDir.exists()) { + if (grailsAppDir.exists()) { def packageNames = ResourceUtils.getProjectPackageNames(grailsAppDir.file.parentFile) .collect() { String str -> new ConstantExpression(str) } - if(packageNames.any() { ConstantExpression packageName -> ['org','com','io','net'].contains(packageName.text) }) { + if (packageNames.any() { ConstantExpression packageName -> ['org', 'com', 'io', 'net'].contains(packageName.text) }) { GrailsASTUtils.error(source, classNode, "Do not place Groovy sources in common package names such as 'org', 'com', 'io' or 'net' as this can result in performance degradation of classpath scanning") } packageNamesBody.addStatement(new ReturnStatement(new ExpressionStatement(new ListExpression(packageNames.toList())))) - AnnotatedNodeUtils.markAsGenerated(classNode, classNode.addMethod("packageNames", Modifier.PUBLIC, collectionClassNode, ZERO_PARAMETERS, null, packageNamesBody)) + AnnotatedNodeUtils.markAsGenerated(classNode, classNode.addMethod('packageNames', Modifier.PUBLIC, collectionClassNode, ZERO_PARAMETERS, null, packageNamesBody)) } } @@ -132,9 +134,9 @@ class ApplicationClassInjector implements GrailsArtefactClassInjector { @Override boolean shouldInject(URL url) { - if(url == null) return false + if (url == null) return false def res = new UrlResource(url) - return GrailsResourceUtils.isGrailsResource(res) && res.filename == "Application.groovy" + return GrailsResourceUtils.isGrailsResource(res) && res.filename == 'Application.groovy' } private AnnotationNode addAnnotation(String annotationClassName, ClassNode classNode, String conditionalClass = null) { diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/ArtefactTypeAstTransformation.java b/grails-core/src/main/groovy/org/grails/compiler/injection/ArtefactTypeAstTransformation.java index 481fb319841..2dc2efca060 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/ArtefactTypeAstTransformation.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/ArtefactTypeAstTransformation.java @@ -18,14 +18,12 @@ */ package org.grails.compiler.injection; -import grails.artefact.Artefact; -import grails.build.logging.GrailsConsole; -import grails.compiler.ast.AllArtefactClassInjector; -import grails.compiler.ast.ClassInjector; -import grails.compiler.ast.GlobalClassInjector; -import grails.compiler.ast.GrailsArtefactClassInjector; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + import groovy.transform.CompilationUnitAware; -import org.apache.grails.common.compiler.GroovyTransformOrder; import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.AnnotatedNode; import org.codehaus.groovy.ast.AnnotationNode; @@ -39,10 +37,13 @@ import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.transform.GroovyASTTransformation; -import java.lang.reflect.Field; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; +import grails.artefact.Artefact; +import grails.build.logging.GrailsConsole; +import grails.compiler.ast.AllArtefactClassInjector; +import grails.compiler.ast.ClassInjector; +import grails.compiler.ast.GlobalClassInjector; +import grails.compiler.ast.GrailsArtefactClassInjector; +import org.apache.grails.common.compiler.GroovyTransformOrder; /** * A transformation used to apply transformers to classes not located in Grails @@ -55,13 +56,13 @@ @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) public class ArtefactTypeAstTransformation extends AbstractArtefactTypeAstTransformation implements CompilationUnitAware { private static final ClassNode MY_TYPE = new ClassNode(Artefact.class); - + protected CompilationUnit compilationUnit; public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { AnnotatedNode parent = (AnnotatedNode) astNodes[1]; AnnotationNode node = (AnnotationNode) astNodes[0]; - + if (!(node instanceof AnnotationNode) || !(parent instanceof AnnotatedNode)) { throw new RuntimeException("Internal error: wrong types: $node.class / $parent.class"); } @@ -76,21 +77,21 @@ public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { getAnnotationType().getNameWithoutPackage() + " not allowed for interfaces."); } - if(isApplied(cNode)) { + if (isApplied(cNode)) { return; } - + String artefactType = resolveArtefactType(sourceUnit, node, cNode); - if(artefactType != null) { + if (artefactType != null) { AbstractGrailsArtefactTransformer.addToTransformedClasses(cNode.getName()); } performInjectionOnArtefactType(sourceUnit, cNode, artefactType); - + performTraitInjectionOnArtefactType(sourceUnit, cNode, artefactType); - + postProcess(sourceUnit, node, cNode, artefactType); - - markApplied(cNode); + + markApplied(cNode); } protected void performTraitInjectionOnArtefactType(SourceUnit sourceUnit, @@ -113,10 +114,10 @@ protected Class getAstAppliedMarkerClass() { } protected void postProcess(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, String artefactType) { - if(!getAnnotationType().equals(annotationNode.getClassNode())) { - // add @Artefact annotation to resulting class so that "short cut" annotations like @TagLib + if (!getAnnotationType().equals(annotationNode.getClassNode())) { + // add @Artefact annotation to resulting class so that "short cut" annotations like @TagLib // also produce an @Artefact annotation in the resulting class file - AnnotationNode annotation=new AnnotationNode(getAnnotationType()); + AnnotationNode annotation = new AnnotationNode(getAnnotationType()); annotation.addMember("value", new ConstantExpression(artefactType)); classNode.addAnnotation(annotation); } @@ -138,13 +139,13 @@ protected String resolveArtefactType(SourceUnit sourceUnit, AnnotationNode annot ClassExpression ce = (ClassExpression) objectExpression; try { Field field = ce.getType().getTypeClass().getDeclaredField(pe.getPropertyAsString()); - return (String)field.get(null); + return (String) field.get(null); } catch (Exception e) {} } } } - throw new RuntimeException("Class ["+classNode.getName()+"] contains an invalid @Artefact annotation. No artefact found for value specified."); + throw new RuntimeException("Class [" + classNode.getName() + "] contains an invalid @Artefact annotation. No artefact found for value specified."); } protected boolean isArtefactAnnotationNode(AnnotationNode annotationNode) { @@ -162,7 +163,7 @@ protected Class getAnnotationTypeClass() { public void performInjectionOnArtefactType(SourceUnit sourceUnit, ClassNode cNode, String artefactType) { List injectors = findInjectors(artefactType, GrailsAwareInjectionOperation.getClassInjectors()); for (ClassInjector injector : injectors) { - if(injector instanceof CompilationUnitAware) { + if (injector instanceof CompilationUnitAware) { ((CompilationUnitAware) injector).setCompilationUnit(this.compilationUnit); } } @@ -178,7 +179,7 @@ public static void doPerformInjectionOnArtefactType(SourceUnit sourceUnit, Class public static void performInjection(SourceUnit sourceUnit, ClassNode cNode, Collection injectors) { try { for (ClassInjector injector : injectors) { - if(!GrailsASTUtils.isApplied(cNode, injector.getClass())) { + if (!GrailsASTUtils.isApplied(cNode, injector.getClass())) { GrailsASTUtils.markApplied(cNode, injector.getClass()); injector.performInjectionOnAnnotatedClass(sourceUnit, cNode); } @@ -194,18 +195,18 @@ public static void performInjection(SourceUnit sourceUnit, ClassNode cNode, Coll } public static List findInjectors(String artefactType, ClassInjector[] classInjectors) { - List injectors = new ArrayList(); + List injectors = new ArrayList<>(); for (ClassInjector classInjector : classInjectors) { if (classInjector instanceof AllArtefactClassInjector) { injectors.add(classInjector); } - else if(classInjector instanceof GlobalClassInjector) { + else if (classInjector instanceof GlobalClassInjector) { injectors.add(classInjector); } else if (classInjector instanceof GrailsArtefactClassInjector) { GrailsArtefactClassInjector gace = (GrailsArtefactClassInjector) classInjector; - if (hasArtefactType(artefactType,gace)) { + if (hasArtefactType(artefactType, gace)) { injectors.add(gace); } } @@ -215,7 +216,7 @@ else if (classInjector instanceof GrailsArtefactClassInjector) { public static boolean hasArtefactType(String artefactType, GrailsArtefactClassInjector gace) { for (String _artefactType : gace.getArtefactTypes()) { - if(_artefactType.equals("*")) return true; + if (_artefactType.equals("*")) return true; if (_artefactType.equals(artefactType)) { return true; } @@ -223,10 +224,10 @@ public static boolean hasArtefactType(String artefactType, GrailsArtefactClassIn return false; } - @Override - public void setCompilationUnit(CompilationUnit unit) { - compilationUnit = unit; - } + @Override + public void setCompilationUnit(CompilationUnit unit) { + compilationUnit = unit; + } @Override public int priority() { diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/DefaultGrailsDomainClassInjector.java b/grails-core/src/main/groovy/org/grails/compiler/injection/DefaultGrailsDomainClassInjector.java index 02e64134ec4..04c459c9d6a 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/DefaultGrailsDomainClassInjector.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/DefaultGrailsDomainClassInjector.java @@ -18,19 +18,13 @@ */ package org.grails.compiler.injection; -import grails.artefact.Artefact; - import java.lang.reflect.Modifier; import java.net.URL; import java.util.ArrayList; import java.util.Collection; -import java.util.Comparator; import java.util.List; import java.util.Set; -import grails.compiler.ast.AstTransformer; -import grails.compiler.ast.GrailsArtefactClassInjector; -import grails.compiler.ast.GrailsDomainClassInjector; import org.apache.groovy.ast.tools.AnnotatedNodeUtils; import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.ClassNode; @@ -38,11 +32,25 @@ import org.codehaus.groovy.ast.MethodNode; import org.codehaus.groovy.ast.Parameter; import org.codehaus.groovy.ast.PropertyNode; -import org.codehaus.groovy.ast.expr.*; +import org.codehaus.groovy.ast.expr.BooleanExpression; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.GStringExpression; +import org.codehaus.groovy.ast.expr.ListExpression; +import org.codehaus.groovy.ast.expr.MapEntryExpression; +import org.codehaus.groovy.ast.expr.MapExpression; +import org.codehaus.groovy.ast.expr.TernaryExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; import org.codehaus.groovy.ast.stmt.ReturnStatement; import org.codehaus.groovy.ast.stmt.Statement; import org.codehaus.groovy.classgen.GeneratorContext; import org.codehaus.groovy.control.SourceUnit; + +import grails.artefact.Artefact; +import grails.compiler.ast.AstTransformer; +import grails.compiler.ast.GrailsArtefactClassInjector; +import grails.compiler.ast.GrailsDomainClassInjector; import org.grails.core.artefact.DomainClassArtefactHandler; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.io.support.GrailsResourceUtils; @@ -57,7 +65,7 @@ @AstTransformer public class DefaultGrailsDomainClassInjector implements GrailsDomainClassInjector, GrailsArtefactClassInjector { - private List classesWithInjectedToString = new ArrayList(); + private List classesWithInjectedToString = new ArrayList<>(); public void performInjection(SourceUnit source, GeneratorContext context, ClassNode classNode) { if (GrailsASTUtils.isDomainClass(classNode, source) && shouldInjectClass(classNode)) { @@ -100,7 +108,7 @@ private String getMappingFileName(String className) { private void injectAssociations(ClassNode classNode) { - List propertiesToAdd = new ArrayList(); + List propertiesToAdd = new ArrayList<>(); for (PropertyNode propertyNode : classNode.getProperties()) { final String name = propertyNode.getName(); final boolean isHasManyProperty = name.equals(GormProperties.HAS_MANY); @@ -242,7 +250,6 @@ public void performInjection(SourceUnit source, ClassNode classNode) { performInjection(source, null, classNode); } - public void performInjectionOnAnnotatedClass(SourceUnit source, ClassNode classNode) { performInjectionOnAnnotatedEntity(classNode); } diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/EnhancesTraitTransformation.groovy b/grails-core/src/main/groovy/org/grails/compiler/injection/EnhancesTraitTransformation.groovy index 98264d97329..a617f2161b9 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/EnhancesTraitTransformation.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/EnhancesTraitTransformation.groovy @@ -18,13 +18,17 @@ */ package org.grails.compiler.injection -import grails.artefact.Enhances -import grails.compiler.traits.TraitInjector + import groovy.transform.CompilationUnitAware import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.apache.groovy.ast.tools.AnnotatedNodeUtils -import org.codehaus.groovy.ast.* +import org.codehaus.groovy.ast.ASTNode +import org.codehaus.groovy.ast.AnnotatedNode +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassHelper +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.MixinNode import org.codehaus.groovy.ast.expr.CastExpression import org.codehaus.groovy.ast.expr.ClassExpression import org.codehaus.groovy.ast.expr.ListExpression @@ -34,7 +38,11 @@ import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.GroovyASTTransformation -import static java.lang.reflect.Modifier.* +import grails.artefact.Enhances +import grails.compiler.traits.TraitInjector +import org.apache.grails.common.compiler.GroovyTransformOrder + +import static java.lang.reflect.Modifier.PUBLIC /** * Implementation for {@link Enhances) @@ -61,10 +69,9 @@ class EnhancesTraitTransformation extends AbstractArtefactTypeAstTransformation ClassNode cNode = (ClassNode) parent - - if(isTrait(cNode)) { - def expr = ann.getMember("value") - if(!(expr instanceof ListExpression)) { + if (isTrait(cNode)) { + def expr = ann.getMember('value') + if (!(expr instanceof ListExpression)) { def newList = new ListExpression() newList.addExpression(expr) expr = newList @@ -72,28 +79,26 @@ class EnhancesTraitTransformation extends AbstractArtefactTypeAstTransformation def interfaces = [ClassHelper.make(TraitInjector)] as ClassNode[] String traitClassName = cNode.name - if(traitClassName.endsWith('$Trait$Helper')) { + if (traitClassName.endsWith('$Trait$Helper')) { traitClassName = traitClassName[0..-14] } ClassNode transformerNode = new ClassNode("${traitClassName}TraitInjector", PUBLIC, ClassHelper.OBJECT_TYPE, interfaces, MixinNode.EMPTY_ARRAY) - def classNodeRef = ClassHelper.make(traitClassName).getPlainNodeReference() MethodNode getTraitMethodNode = transformerNode.addMethod( - "getTrait", PUBLIC, ClassHelper.CLASS_Type.getPlainNodeReference(), GrailsASTUtils.ZERO_PARAMETERS, null, new ReturnStatement( new ClassExpression(classNodeRef))) + 'getTrait', PUBLIC, ClassHelper.CLASS_Type.getPlainNodeReference(), GrailsASTUtils.ZERO_PARAMETERS, null, new ReturnStatement(new ClassExpression(classNodeRef))) AnnotatedNodeUtils.markAsGenerated(transformerNode, getTraitMethodNode) def strArrayType = ClassHelper.STRING_TYPE.makeArray() MethodNode getArtefactTypesMethodNode = transformerNode.addMethod( - "getArtefactTypes", PUBLIC, strArrayType, GrailsASTUtils.ZERO_PARAMETERS, null, new ReturnStatement( CastExpression.asExpression(strArrayType, expr))) + 'getArtefactTypes', PUBLIC, strArrayType, GrailsASTUtils.ZERO_PARAMETERS, null, new ReturnStatement(CastExpression.asExpression(strArrayType, expr))) AnnotatedNodeUtils.markAsGenerated(transformerNode, getArtefactTypesMethodNode) def ast = source.AST transformerNode.module = ast - - ast.classes.add transformerNode + ast.classes.add(transformerNode) def compilationTargetDirectory = GlobalGrailsClassInjectorTransformation.resolveCompilationTargetDirectory(source) GlobalGrailsClassInjectorTransformation.updateGrailsFactoriesWithType(transformerNode, GlobalGrailsClassInjectorTransformation.TRAIT_INJECTOR_CLASS, compilationTargetDirectory) diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/EntityASTTransformation.java b/grails-core/src/main/groovy/org/grails/compiler/injection/EntityASTTransformation.java index 9014a6cc945..dc6d928db83 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/EntityASTTransformation.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/EntityASTTransformation.java @@ -18,14 +18,9 @@ */ package org.grails.compiler.injection; -import grails.compiler.ast.ClassInjector; -import grails.compiler.ast.GrailsDomainClassInjector; -import grails.persistence.Entity; -import groovy.transform.CompilationUnitAware; - import java.util.List; -import org.apache.grails.common.compiler.GroovyTransformOrder; +import groovy.transform.CompilationUnitAware; import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.AnnotatedNode; import org.codehaus.groovy.ast.AnnotationNode; @@ -36,8 +31,12 @@ import org.codehaus.groovy.transform.ASTTransformation; import org.codehaus.groovy.transform.GroovyASTTransformation; import org.codehaus.groovy.transform.TransformWithPriority; -import org.grails.core.artefact.DomainClassArtefactHandler; +import grails.compiler.ast.ClassInjector; +import grails.compiler.ast.GrailsDomainClassInjector; +import grails.persistence.Entity; +import org.apache.grails.common.compiler.GroovyTransformOrder; +import org.grails.core.artefact.DomainClassArtefactHandler; @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) public class EntityASTTransformation implements ASTTransformation, CompilationUnitAware, TransformWithPriority { @@ -70,11 +69,11 @@ public void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { } public void applyTransformation(SourceUnit sourceUnit, ClassNode classNode) { - if(GrailsASTUtils.isApplied(classNode, EntityASTTransformation.class)) { + if (GrailsASTUtils.isApplied(classNode, EntityASTTransformation.class)) { return; } GrailsASTUtils.markApplied(classNode, EntityASTTransformation.class); - + GrailsDomainClassInjector domainInjector = new DefaultGrailsDomainClassInjector(); domainInjector.performInjectionOnAnnotatedEntity(classNode); @@ -87,15 +86,15 @@ public void applyTransformation(SourceUnit sourceUnit, ClassNode classNode) { injector.performInjection(sourceUnit, classNode); } catch (RuntimeException e) { try { - System.err.println("Error occurred calling AST injector ["+injector.getClass().getName()+"]: " + e.getMessage()); + System.err.println("Error occurred calling AST injector [" + injector.getClass().getName() + "]: " + e.getMessage()); } catch (Throwable t) { // ignore } throw e; } } - - if(compilationUnit != null) { + + if (compilationUnit != null) { TraitInjectionUtils.processTraitsForNode(sourceUnit, classNode, DomainClassArtefactHandler.TYPE, compilationUnit); } } diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/GlobalGrailsClassInjectorTransformation.groovy b/grails-core/src/main/groovy/org/grails/compiler/injection/GlobalGrailsClassInjectorTransformation.groovy index 4b71658b2c5..76e788eef13 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/GlobalGrailsClassInjectorTransformation.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/GlobalGrailsClassInjectorTransformation.groovy @@ -19,22 +19,16 @@ package org.grails.compiler.injection -import grails.artefact.Artefact -import grails.compiler.ast.ClassInjector -import grails.core.ArtefactHandler -import grails.io.IOUtils -import grails.plugins.metadata.GrailsPlugin -import grails.util.GrailsNameUtils +import java.lang.reflect.Modifier +import java.nio.charset.StandardCharsets + import groovy.transform.CompilationUnitAware import groovy.transform.CompileDynamic import groovy.transform.CompileStatic -import org.springframework.core.CollectionFactory import groovy.xml.MarkupBuilder import groovy.xml.StreamingMarkupBuilder import groovy.xml.XmlSlurper import groovy.xml.slurpersupport.GPathResult -import org.apache.grails.common.compiler.GroovyTransformOrder -import org.apache.grails.gradle.common.PropertyFileUtils import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassHelper @@ -48,14 +42,22 @@ import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.GroovyASTTransformation import org.codehaus.groovy.transform.TransformWithPriority + +import org.springframework.core.CollectionFactory + +import grails.artefact.Artefact +import grails.compiler.ast.ClassInjector +import grails.core.ArtefactHandler +import grails.io.IOUtils +import grails.plugins.metadata.GrailsPlugin +import grails.util.GrailsNameUtils +import org.apache.grails.common.compiler.GroovyTransformOrder +import org.apache.grails.gradle.common.PropertyFileUtils import org.grails.core.io.support.GrailsFactoriesLoader import org.grails.io.support.AntPathMatcher import org.grails.io.support.GrailsResourceUtils import org.grails.io.support.UrlResource -import java.lang.reflect.Modifier -import java.nio.charset.StandardCharsets - /** * A global transformation that applies Grails' transformations to classes within a Grails project * @@ -66,9 +68,9 @@ import java.nio.charset.StandardCharsets @CompileStatic class GlobalGrailsClassInjectorTransformation implements ASTTransformation, CompilationUnitAware, TransformWithPriority { - public static final ClassNode ARTEFACT_HANDLER_CLASS = ClassHelper.make("grails.core.ArtefactHandler") - public static final ClassNode APPLICATION_CONTEXT_COMMAND_CLASS = ClassHelper.make("grails.dev.commands.ApplicationCommand") - public static final ClassNode TRAIT_INJECTOR_CLASS = ClassHelper.make("grails.compiler.traits.TraitInjector") + public static final ClassNode ARTEFACT_HANDLER_CLASS = ClassHelper.make('grails.core.ArtefactHandler') + public static final ClassNode APPLICATION_CONTEXT_COMMAND_CLASS = ClassHelper.make('grails.dev.commands.ApplicationCommand') + public static final ClassNode TRAIT_INJECTOR_CLASS = ClassHelper.make('grails.compiler.traits.TraitInjector') @Override int priority() { @@ -78,13 +80,13 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp @Override void visit(ASTNode[] nodes, SourceUnit source) { - ModuleNode ast = source.getAST(); - List classes = new ArrayList<>(ast.getClasses()); + ModuleNode ast = source.getAST() + List classes = new ArrayList<>(ast.getClasses()) - URL url = GrailsASTUtils.getSourceUrl(source); + URL url = GrailsASTUtils.getSourceUrl(source) if (url == null) return - if (!GrailsResourceUtils.isProjectSource(new UrlResource(url))) return; + if (!GrailsResourceUtils.isProjectSource(new UrlResource(url))) return List artefactHandlers = GrailsFactoriesLoader.loadFactories(ArtefactHandler) ClassInjector[] classInjectors = GrailsAwareInjectionOperation.getClassInjectors() @@ -97,11 +99,11 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp String pluginVersion = null ClassNode pluginClassNode = null def compilationTargetDirectory = resolveCompilationTargetDirectory(source) - def pluginXmlFile = new File(compilationTargetDirectory, "META-INF/grails-plugin.xml") + def pluginXmlFile = new File(compilationTargetDirectory, 'META-INF/grails-plugin.xml') for (ClassNode classNode : classes) { - def projectName = classNode.getNodeMetaData("projectName") - def projectVersion = classNode.getNodeMetaData("projectVersion") + def projectName = classNode.getNodeMetaData('projectName') + def projectVersion = classNode.getNodeMetaData('projectVersion') if (projectVersion == null) { projectVersion = getClass().getPackage().getImplementationVersion() } @@ -110,7 +112,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp def classNodeName = classNode.name - if (classNodeName.endsWith("GrailsPlugin") && !classNode.isAbstract()) { + if (classNodeName.endsWith('GrailsPlugin') && !classNode.isAbstract()) { pluginClassNode = classNode if (!classNode.getProperty('version')) { @@ -130,20 +132,20 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp continue } - if (!GrailsResourceUtils.isGrailsResource(new UrlResource(url))) continue; + if (!GrailsResourceUtils.isGrailsResource(new UrlResource(url))) continue if (projectName && projectVersion) { GrailsASTUtils.addAnnotationOrGetExisting(classNode, GrailsPlugin, [name: GrailsNameUtils.getPropertyNameForLowerCaseHyphenSeparatedName(projectName.toString()), version: projectVersion]) } - classNode.getModule().addImport("Autowired", ClassHelper.make("org.springframework.beans.factory.annotation.Autowired")) + classNode.getModule().addImport('Autowired', ClassHelper.make('org.springframework.beans.factory.annotation.Autowired')) for (ArtefactHandler handler in artefactHandlers) { if (handler.isArtefact(classNode)) { if (!classNode.getAnnotations(ARTEFACT_CLASS_NODE)) { - transformedClasses.add classNodeName - def annotationNode = new AnnotationNode(new ClassNode(Artefact.class)) - annotationNode.addMember("value", new ConstantExpression(handler.getType())) + transformedClasses.add(classNodeName) + def annotationNode = new AnnotationNode(new ClassNode(Artefact)) + annotationNode.addMember('value', new ConstantExpression(handler.getType())) classNode.addAnnotation(annotationNode) List injectors = cache[handler.type] @@ -197,20 +199,20 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp def superTypeName = superType.getName() // generate META-INF/grails.factories - File factoriesFile = new File(compilationTargetDirectory, "META-INF/grails.factories") + File factoriesFile = new File(compilationTargetDirectory, 'META-INF/grails.factories') if (!factoriesFile.parentFile.exists()) { factoriesFile.parentFile.mkdirs() } loadFromFile(props, factoriesFile) File sourceDirectory = findSourceDirectory(compilationTargetDirectory) - File sourceFactoriesFile = new File(sourceDirectory, "src/main/resources/META-INF/grails.factories") + File sourceFactoriesFile = new File(sourceDirectory, 'src/main/resources/META-INF/grails.factories') loadFromFile(props, sourceFactoriesFile) addToProps(props, superTypeName, classNodeName) factoriesFile.withWriter { Writer writer -> - props.store(writer, "Grails Factories File") + props.store(writer, 'Grails Factories File') } PropertyFileUtils.makePropertiesFileReproducible(factoriesFile) @@ -247,7 +249,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp private static File findSourceDirectory(File compilationTargetDirectory) { File sourceDirectory = compilationTargetDirectory - while (sourceDirectory != null && !(sourceDirectory.name in ["build", "target"])) { + while (sourceDirectory != null && !(sourceDirectory.name in ['build', 'target'])) { sourceDirectory = sourceDirectory.parentFile } sourceDirectory.parentFile @@ -287,7 +289,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp pluginXml.withWriter(StandardCharsets.UTF_8.name()) { Writer writer -> def mkp = new MarkupBuilder(writer) - def pluginName = GrailsNameUtils.getLogicalPropertyName(pluginClassNode.name, "GrailsPlugin") + def pluginName = GrailsNameUtils.getLogicalPropertyName(pluginClassNode.name, 'GrailsPlugin') def pluginProperties = info.getProperties() def excludes = pluginProperties.get('pluginExcludes') @@ -296,7 +298,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp pluginExcludes.addAll(excludes) } - def grailsVersion = pluginProperties['grailsVersion'] ?: getClass().getPackage().getImplementationVersion() + " > *" + def grailsVersion = pluginProperties['grailsVersion'] ?: getClass().getPackage().getImplementationVersion() + ' > *' mkp.plugin(name: pluginName, version: pluginVersion, grailsVersion: grailsVersion) { type(pluginClassNode.name) @@ -310,7 +312,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp resources { for (String cn in artefactClasses) { if (!pluginExcludes.any() { String exc -> antPathMatcher.match(exc, cn.replace('.', '/')) }) { - resource cn + resource(cn) } } } @@ -331,7 +333,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp def pluginXml = xmlSlurper.parse(pluginXmlFile) if (pluginClassNode) { - def pluginName = GrailsNameUtils.getLogicalPropertyName(pluginClassNode.name, "GrailsPlugin") + def pluginName = GrailsNameUtils.getLogicalPropertyName(pluginClassNode.name, 'GrailsPlugin') pluginXml.@name = pluginName pluginXml.@version = pluginVersion pluginXml.type = pluginClassNode.name @@ -340,7 +342,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp def info = pluginAstReader.readPluginInfo(pluginClassNode) def pluginProperties = info.getProperties() - def grailsVersion = pluginProperties['grailsVersion'] ?: getClass().getPackage().getImplementationVersion() + " > *" + def grailsVersion = pluginProperties['grailsVersion'] ?: getClass().getPackage().getImplementationVersion() + ' > *' pluginXml.@grailsVersion = grailsVersion for (entry in pluginProperties) { pluginXml."$entry.key" = entry.value @@ -366,7 +368,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp handleExcludes(pluginXml) Writable writable = new StreamingMarkupBuilder().bind { - mkp.yield pluginXml + mkp.yield(pluginXml) } pluginXmlFile.withWriter(StandardCharsets.UTF_8.name()) { Writer writer -> @@ -394,7 +396,7 @@ class GlobalGrailsClassInjectorTransformation implements ASTTransformation, Comp } } - public static final ClassNode ARTEFACT_CLASS_NODE = new ClassNode(Artefact.class) + public static final ClassNode ARTEFACT_CLASS_NODE = new ClassNode(Artefact) CompilationUnit compilationUnit } diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/GlobalImportTransformation.groovy b/grails-core/src/main/groovy/org/grails/compiler/injection/GlobalImportTransformation.groovy index 892070f1b9f..83911291148 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/GlobalImportTransformation.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/GlobalImportTransformation.groovy @@ -19,7 +19,6 @@ package org.grails.compiler.injection import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ModuleNode @@ -29,17 +28,20 @@ import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.GroovyASTTransformation import org.codehaus.groovy.transform.TransformWithPriority +import org.apache.grails.common.compiler.GroovyTransformOrder + /** * @author Graeme Rocher * @since 3.0 */ -@GroovyASTTransformation( phase= CompilePhase.CONVERSION) +@GroovyASTTransformation(phase = CompilePhase.CONVERSION) @CompileStatic class GlobalImportTransformation implements ASTTransformation, TransformWithPriority { + @Override void visit(ASTNode[] nodes, SourceUnit source) { - ModuleNode ast = source.getAST(); - ast.addImport("Autowired", ClassHelper.make("org.springframework.beans.factory.annotation.Autowired")) + ModuleNode ast = source.getAST() + ast.addImport('Autowired', ClassHelper.make('org.springframework.beans.factory.annotation.Autowired')) } @Override diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsASTUtils.java b/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsASTUtils.java index 21d65bd375d..66684cd4f3e 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsASTUtils.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsASTUtils.java @@ -18,18 +18,68 @@ */ package org.grails.compiler.injection; -import grails.artefact.Enhanced; -import grails.compiler.ast.GrailsArtefactClassInjector; -import grails.util.GrailsNameUtils; +import java.io.File; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; +import java.lang.reflect.Modifier; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import groovy.lang.Closure; import groovy.lang.MissingMethodException; import groovy.transform.CompileStatic; import groovy.transform.TypeChecked; import groovy.transform.TypeCheckingMode; import org.apache.groovy.ast.tools.AnnotatedNodeUtils; -import org.codehaus.groovy.ast.*; -import org.codehaus.groovy.ast.expr.*; -import org.codehaus.groovy.ast.stmt.*; +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.AnnotatedNode; +import org.codehaus.groovy.ast.AnnotationNode; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.ConstructorNode; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.GenericsType; +import org.codehaus.groovy.ast.InnerClassNode; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.PropertyNode; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.BinaryExpression; +import org.codehaus.groovy.ast.expr.BooleanExpression; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ClosureExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.ConstructorCallExpression; +import org.codehaus.groovy.ast.expr.DeclarationExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.ListExpression; +import org.codehaus.groovy.ast.expr.MapEntryExpression; +import org.codehaus.groovy.ast.expr.MapExpression; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.NamedArgumentListExpression; +import org.codehaus.groovy.ast.expr.PropertyExpression; +import org.codehaus.groovy.ast.expr.TupleExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; +import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.stmt.CatchStatement; +import org.codehaus.groovy.ast.stmt.ExpressionStatement; +import org.codehaus.groovy.ast.stmt.IfStatement; +import org.codehaus.groovy.ast.stmt.ReturnStatement; +import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.stmt.ThrowStatement; +import org.codehaus.groovy.ast.stmt.TryCatchStatement; import org.codehaus.groovy.classgen.VariableScopeVisitor; import org.codehaus.groovy.control.Janitor; import org.codehaus.groovy.control.SourceUnit; @@ -40,17 +90,15 @@ import org.codehaus.groovy.syntax.Types; import org.codehaus.groovy.transform.sc.StaticCompileTransformation; import org.codehaus.groovy.transform.trait.Traits; + +import org.springframework.util.StringUtils; + +import grails.artefact.Enhanced; +import grails.compiler.ast.GrailsArtefactClassInjector; +import grails.util.GrailsNameUtils; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.io.support.FileSystemResource; import org.grails.io.support.Resource; -import org.springframework.util.StringUtils; - -import java.io.File; -import java.io.IOException; -import java.lang.annotation.*; -import java.lang.reflect.Modifier; -import java.net.URL; -import java.util.*; /** * Helper methods for working with Groovy AST trees. @@ -81,7 +129,6 @@ public class GrailsASTUtils { public static final Parameter[] ZERO_PARAMETERS = new Parameter[0]; public static final ArgumentListExpression ZERO_ARGUMENTS = new ArgumentListExpression(); - public static void warning(final SourceUnit sourceUnit, final ASTNode node, final String warningMessage) { final String sample = sourceUnit.getSample(node.getLineNumber(), node.getColumnNumber(), new Janitor()); System.err.println("WARNING: " + warningMessage + "\n\n" + sample); @@ -128,7 +175,7 @@ public static boolean hasProperty(ClassNode classNode, String propertyName) { if (method != null) return true; // check read-only field with setter - if( classNode.getField(propertyName) != null && !classNode.getMethods(GrailsNameUtils.getSetterName(propertyName)).isEmpty()) { + if (classNode.getField(propertyName) != null && !classNode.getMethods(GrailsNameUtils.getSetterName(propertyName)).isEmpty()) { return true; } @@ -226,21 +273,25 @@ public static ClassNode getFurthestUnresolvedParent(ClassNode classNode) { * @return The added method node or null if it couldn't be added */ public static MethodNode addDelegateInstanceMethod(ClassNode classNode, Expression delegate, MethodNode declaredMethod) { - return addDelegateInstanceMethod(classNode, delegate, declaredMethod, null, true); + return addDelegateInstanceMethod(classNode, delegate, declaredMethod, null, true); } + public static MethodNode addDelegateInstanceMethod(ClassNode classNode, Expression delegate, MethodNode declaredMethod, AnnotationNode markerAnnotation) { return addDelegateInstanceMethod(classNode, delegate, declaredMethod, markerAnnotation, true); } + public static MethodNode addDelegateInstanceMethod(ClassNode classNode, Expression delegate, MethodNode declaredMethod, boolean thisAsFirstArgument) { - return addDelegateInstanceMethod(classNode,delegate,declaredMethod, null, thisAsFirstArgument); + return addDelegateInstanceMethod(classNode, delegate, declaredMethod, null, thisAsFirstArgument); } + public static MethodNode addDelegateInstanceMethod(ClassNode classNode, Expression delegate, MethodNode declaredMethod, AnnotationNode markerAnnotation, boolean thisAsFirstArgument) { - return addDelegateInstanceMethod(classNode,delegate,declaredMethod, markerAnnotation, thisAsFirstArgument, null, false); + return addDelegateInstanceMethod(classNode, delegate, declaredMethod, markerAnnotation, thisAsFirstArgument, null, false); } + public static MethodNode addDelegateInstanceMethod(ClassNode classNode, Expression delegate, MethodNode declaredMethod, AnnotationNode markerAnnotation, boolean thisAsFirstArgument, Map genericsPlaceholders) { - return addDelegateInstanceMethod(classNode, delegate, declaredMethod, markerAnnotation, thisAsFirstArgument, genericsPlaceholders, false); + return addDelegateInstanceMethod(classNode, delegate, declaredMethod, markerAnnotation, thisAsFirstArgument, genericsPlaceholders, false); } - + /** * Adds a delegate method to the target class node where the first argument * is to the delegate method is 'this'. In other words a method such as @@ -276,8 +327,8 @@ public static MethodNode addDelegateInstanceMethod(ClassNode classNode, Expressi MethodCallExpression methodCallExpression = new MethodCallExpression(delegate, methodName, arguments); methodCallExpression.setMethodTarget(declaredMethod); - - if(!noNullCheck) { + + if (!noNullCheck) { ThrowStatement missingMethodException = createMissingMethodThrowable(classNode, declaredMethod); VariableExpression apiVar = addApiVariableDeclaration(delegate, declaredMethod, methodBody); IfStatement ifStatement = createIfElseStatementForApiMethodCall(methodCallExpression, apiVar, missingMethodException); @@ -285,12 +336,12 @@ public static MethodNode addDelegateInstanceMethod(ClassNode classNode, Expressi } else { methodBody.addStatement(new ExpressionStatement(methodCallExpression)); } - + MethodNode methodNode = new MethodNode(methodName, Modifier.PUBLIC, returnType, copyParameters(parameterTypes, genericsPlaceholders), GrailsArtefactClassInjector.EMPTY_CLASS_ARRAY, methodBody); copyAnnotations(declaredMethod, methodNode); - if(shouldAddMarkerAnnotation(markerAnnotation, methodNode)) { + if (shouldAddMarkerAnnotation(markerAnnotation, methodNode)) { methodNode.addAnnotation(markerAnnotation); } @@ -310,7 +361,7 @@ private static IfStatement createIfElseStatementForApiMethodCall(MethodCallExpre BlockStatement elseBlock = new BlockStatement(); elseBlock.addStatement(new ExpressionStatement(methodCallExpression)); - return new IfStatement(new BooleanExpression(new BinaryExpression(apiVar, EQUALS_OPERATOR, NULL_EXPRESSION)),ifBlock,elseBlock); + return new IfStatement(new BooleanExpression(new BinaryExpression(apiVar, EQUALS_OPERATOR, NULL_EXPRESSION)), ifBlock, elseBlock); } private static VariableExpression addApiVariableDeclaration(Expression delegate, MethodNode declaredMethod, BlockStatement methodBody) { @@ -389,16 +440,17 @@ public static MethodNode addDelegateStaticMethod(ClassNode classNode, MethodNode public static MethodNode addDelegateStaticMethod(Expression expression, ClassNode classNode, MethodNode delegateMethod) { return addDelegateStaticMethod(expression, classNode, delegateMethod, null, null, true); } - /** - * Adds a static method to the given class node that delegates to the given method - * and resolves the object to invoke the method on from the given expression. - * - * @param delegate The expression - * @param classNode The class node - * @param delegateMethod The delegate method - * @param markerAnnotation A marker annotation to be added to all methods - * @return The added method node or null if it couldn't be added - */ + + /** + * Adds a static method to the given class node that delegates to the given method + * and resolves the object to invoke the method on from the given expression. + * + * @param delegate The expression + * @param classNode The class node + * @param delegateMethod The delegate method + * @param markerAnnotation A marker annotation to be added to all methods + * @return The added method node or null if it couldn't be added + */ public static MethodNode addDelegateStaticMethod(Expression delegate, ClassNode classNode, MethodNode delegateMethod, AnnotationNode markerAnnotation, Map genericsPlaceholders, boolean noNullCheck) { Parameter[] parameterTypes = delegateMethod.getParameters(); String declaredMethodName = delegateMethod.getName(); @@ -411,12 +463,12 @@ public static MethodNode addDelegateStaticMethod(Expression delegate, ClassNode BlockStatement methodBody = new BlockStatement(); ArgumentListExpression arguments = createArgumentListFromParameters(parameterTypes, false, genericsPlaceholders); - + MethodCallExpression methodCallExpression = new MethodCallExpression( delegate, delegateMethod.getName(), arguments); methodCallExpression.setMethodTarget(delegateMethod); - if(!noNullCheck && !(delegate instanceof ClassExpression)) { + if (!noNullCheck && !(delegate instanceof ClassExpression)) { ThrowStatement missingMethodException = createMissingMethodThrowable(classNode, delegateMethod); VariableExpression apiVar = addApiVariableDeclaration(delegate, delegateMethod, methodBody); IfStatement ifStatement = createIfElseStatementForApiMethodCall(methodCallExpression, apiVar, missingMethodException); @@ -424,7 +476,7 @@ public static MethodNode addDelegateStaticMethod(Expression delegate, ClassNode } else { methodBody.addStatement(new ExpressionStatement(methodCallExpression)); } - + ClassNode returnType = replaceGenericsPlaceholders(delegateMethod.getReturnType(), genericsPlaceholders); MethodNode methodNode = new MethodNode(declaredMethodName, Modifier.PUBLIC | Modifier.STATIC, returnType, copyParameters(parameterTypes, genericsPlaceholders), GrailsArtefactClassInjector.EMPTY_CLASS_ARRAY, @@ -517,7 +569,7 @@ public static ConstructorNode addDelegateConstructor(ClassNode classNode, Method * @param constructorParams The parameter types * @return The located constructor or null */ - public static ConstructorNode findConstructor(ClassNode classNode,Parameter[] constructorParams) { + public static ConstructorNode findConstructor(ClassNode classNode, Parameter[] constructorParams) { List declaredConstructors = classNode.getDeclaredConstructors(); for (ConstructorNode declaredConstructor : declaredConstructors) { if (parametersEqual(constructorParams, declaredConstructor.getParameters())) { @@ -575,7 +627,7 @@ public static Parameter[] copyParameters(Parameter[] parameterTypes, Map emptyGenericsPlaceHoldersMap = Collections.emptyMap(); - + public static ClassNode nonGeneric(ClassNode type) { return replaceGenericsPlaceholders(type, emptyGenericsPlaceHoldersMap); } @@ -584,11 +636,11 @@ public static ClassNode nonGeneric(ClassNode type) { public static ClassNode nonGeneric(ClassNode type, final ClassNode wildcardReplacement) { return replaceGenericsPlaceholders(type, emptyGenericsPlaceHoldersMap, wildcardReplacement); } - + public static ClassNode replaceGenericsPlaceholders(ClassNode type, Map genericsPlaceholders) { return replaceGenericsPlaceholders(type, genericsPlaceholders, null); } - + public static ClassNode replaceGenericsPlaceholders(ClassNode type, Map genericsPlaceholders, ClassNode defaultPlaceholder) { if (type.isArray()) { return replaceGenericsPlaceholders(type.getComponentType(), genericsPlaceholders).makeArray(); @@ -598,14 +650,14 @@ public static ClassNode replaceGenericsPlaceholders(ClassNode type, Map 0) { GenericsType[] copiedGenericsTypes = new GenericsType[parameterized.length]; @@ -628,7 +680,7 @@ public static ClassNode replaceGenericsPlaceholders(ClassNode type, Map0) { - return implementsInterfaceInternal(childInterfaces,interfaceName ); + if (childInterfaces != null && childInterfaces.length > 0) { + return implementsInterfaceInternal(childInterfaces, interfaceName); } } @@ -709,8 +760,8 @@ private static boolean implementsInterfaceInternal(ClassNode[] interfaces, Strin public static boolean isCandidateMethod(MethodNode declaredMethod) { return !declaredMethod.isSynthetic() && - !declaredMethod.getName().contains("$") - && Modifier.isPublic(declaredMethod.getModifiers()) && + !declaredMethod.getName().contains("$") && + Modifier.isPublic(declaredMethod.getModifiers()) && !Modifier.isAbstract(declaredMethod.getModifiers()); } @@ -732,7 +783,7 @@ public static boolean isDomainClass(final ClassNode classNode, final SourceUnit final String grailsAppDirToLookFor = File.separator + GRAILS_APP_DIR + File.separator; final int indexOfGrailsAppDir = sourcePath.lastIndexOf(grailsAppDirToLookFor); - if(indexOfGrailsAppDir >= 0) { + if (indexOfGrailsAppDir >= 0) { final String pathToGrailsAppDir = sourcePath.substring(0, indexOfGrailsAppDir + grailsAppDirToLookFor.length()); @@ -775,7 +826,7 @@ public static void addDelegateInstanceMethods(ClassNode supportedSuperType, Clas } else if (isCandidateInstanceMethod(supportedSuperType, declaredMethod)) { MethodNode methodNode = addDelegateInstanceMethod(classNode, delegateInstance, declaredMethod, null, true, genericsPlaceholders, noNullCheck); - if(addCompileStatic) { + if (addCompileStatic) { addCompileStaticAnnotation(methodNode); } } @@ -792,7 +843,6 @@ public static FieldNode addFieldIfNonExistent(ClassNode classNode, ClassNode fie return null; } - /** * Adds the given expression as a member of the given annotation * @@ -802,10 +852,10 @@ public static FieldNode addFieldIfNonExistent(ClassNode classNode, ClassNode fie */ public static void addExpressionToAnnotationMember(AnnotationNode annotationNode, String memberName, Expression expression) { Expression exclude = annotationNode.getMember(memberName); - if(exclude instanceof ListExpression) { - ((ListExpression)exclude).addExpression(expression); + if (exclude instanceof ListExpression) { + ((ListExpression) exclude).addExpression(expression); } - else if(exclude != null) { + else if (exclude != null) { ListExpression list = new ListExpression(); list.addExpression(exclude); list.addExpression(expression); @@ -859,7 +909,7 @@ public static AnnotationNode addAnnotationOrGetExisting(ClassNode classNode, Cla } else { AnnotationNode existing = findAnnotation(annotationClassNode, annotations); - if (existing != null){ + if (existing != null) { annotationToAdd = existing; } else { @@ -867,16 +917,15 @@ public static AnnotationNode addAnnotationOrGetExisting(ClassNode classNode, Cla } } - if(members != null && !members.isEmpty()) { + if (members != null && !members.isEmpty()) { for (Map.Entry memberEntry : members.entrySet()) { Object value = memberEntry.getValue(); - annotationToAdd.setMember( memberEntry.getKey(), value instanceof Expression ? (Expression)value : new ConstantExpression(value)); + annotationToAdd.setMember(memberEntry.getKey(), value instanceof Expression ? (Expression) value : new ConstantExpression(value)); } } return annotationToAdd; } - /** * Add the grails.artefact.Enhanced annotation to classNode if it does not already exist and ensure that * all of the features in the enhancedFor array are represented in the enhancedFor attribute of the @@ -892,33 +941,33 @@ public static AnnotationNode addEnhancedAnnotation(final ClassNode classNode, fi if (annotations.isEmpty()) { enhancedAnnotationNode = new AnnotationNode(ENHANCED_CLASS_NODE); String grailsVersion = getGrailsVersion(); - if(grailsVersion == null) { + if (grailsVersion == null) { grailsVersion = System.getProperty("grails.version"); } - if(grailsVersion != null) { + if (grailsVersion != null) { enhancedAnnotationNode.setMember("version", new ConstantExpression(grailsVersion)); } classNode.addAnnotation(enhancedAnnotationNode); } else { enhancedAnnotationNode = annotations.get(0); } - - if(enhancedFor != null && enhancedFor.length > 0) { + + if (enhancedFor != null && enhancedFor.length > 0) { ListExpression enhancedForArray = (ListExpression) enhancedAnnotationNode.getMember("enhancedFor"); - if(enhancedForArray == null) { + if (enhancedForArray == null) { enhancedForArray = new ListExpression(); enhancedAnnotationNode.setMember("enhancedFor", enhancedForArray); } final List featureNameExpressions = enhancedForArray.getExpressions(); - for(final String feature : enhancedFor) { + for (final String feature : enhancedFor) { boolean exists = false; - for(Expression expression : featureNameExpressions) { - if(expression instanceof ConstantExpression && feature.equals(((ConstantExpression)expression).getValue())) { + for (Expression expression : featureNameExpressions) { + if (expression instanceof ConstantExpression && feature.equals(((ConstantExpression) expression).getValue())) { exists = true; break; } } - if(!exists) { + if (!exists) { featureNameExpressions.add(new ConstantExpression(feature)); } } @@ -942,7 +991,7 @@ public static AnnotationNode findAnnotation(ClassNode annotationClassNode, List< public static AnnotationNode findAnnotation(ClassNode classNode, Class type) { List annotations = classNode.getAnnotations(); - return annotations == null ? null : findAnnotation(new ClassNode(type),annotations); + return annotations == null ? null : findAnnotation(new ClassNode(type), annotations); } /** @@ -972,7 +1021,7 @@ public static boolean hasAnnotation(final MethodNode methodNode, final Class... annotationsToLookFor) { for (Class annotationClass : annotationsToLookFor) { - if(hasAnnotation(classNode, annotationClass)) { + if (hasAnnotation(classNode, annotationClass)) { return true; } } @@ -998,11 +1047,11 @@ public static void addMethodIfNotPresent(ClassNode controllerClassNode, MethodNo } public static ExpressionStatement createPrintlnStatement(String message) { - return new ExpressionStatement(new MethodCallExpression(new VariableExpression("this"),"println", new ArgumentListExpression(new ConstantExpression(message)))); + return new ExpressionStatement(new MethodCallExpression(new VariableExpression("this"), "println", new ArgumentListExpression(new ConstantExpression(message)))); } public static ExpressionStatement createPrintlnStatement(String message, String variable) { - return new ExpressionStatement(new MethodCallExpression(new VariableExpression("this"),"println", new ArgumentListExpression(new BinaryExpression(new ConstantExpression(message),Token.newSymbol(Types.PLUS, 0, 0),new VariableExpression(variable))))); + return new ExpressionStatement(new MethodCallExpression(new VariableExpression("this"), "println", new ArgumentListExpression(new BinaryExpression(new ConstantExpression(message), Token.newSymbol(Types.PLUS, 0, 0), new VariableExpression(variable))))); } /** @@ -1018,10 +1067,10 @@ public static void wrapMethodBodyInTryCatchDebugStatements(MethodNode methodNode methodNode.setCode(newCode); BlockStatement catchBlock = new BlockStatement(); ArgumentListExpression logArguments = new ArgumentListExpression(); - logArguments.addExpression(new BinaryExpression(new ConstantExpression("Error initializing class: "),Token.newSymbol(Types.PLUS, 0, 0),new VariableExpression("e"))); + logArguments.addExpression(new BinaryExpression(new ConstantExpression("Error initializing class: "), Token.newSymbol(Types.PLUS, 0, 0), new VariableExpression("e"))); logArguments.addExpression(new VariableExpression("e")); catchBlock.addStatement(new ExpressionStatement(new MethodCallExpression(new VariableExpression("log"), "error", logArguments))); - tryCatchStatement.addCatch(new CatchStatement(new Parameter(new ClassNode(Throwable.class), "e"),catchBlock)); + tryCatchStatement.addCatch(new CatchStatement(new Parameter(new ClassNode(Throwable.class), "e"), catchBlock)); } /** @@ -1035,9 +1084,9 @@ public static void wrapMethodBodyInTryCatchDebugStatements(MethodNode methodNode */ public static Map> getConstraintMetadata(final ClosureExpression closureExpression) { - final List methodExpressions = new ArrayList(); + final List methodExpressions = new ArrayList<>(); - final Map> results = new LinkedHashMap>(); + final Map> results = new LinkedHashMap<>(); final Statement closureCode = closureExpression.getCode(); if (closureCode instanceof BlockStatement) { final List closureStatements = ((BlockStatement) closureCode).getStatements(); @@ -1057,19 +1106,19 @@ public static Map> getConstraintMetadata(final C for (final MethodCallExpression methodCallExpression : methodExpressions) { final Expression objectExpression = methodCallExpression.getObjectExpression(); - if (objectExpression instanceof VariableExpression && "this".equals(((VariableExpression)objectExpression).getName())) { + if (objectExpression instanceof VariableExpression && "this".equals(((VariableExpression) objectExpression).getName())) { final Expression methodCallArguments = methodCallExpression.getArguments(); if (methodCallArguments instanceof TupleExpression) { final List methodCallArgumentExpressions = ((TupleExpression) methodCallArguments).getExpressions(); if (methodCallArgumentExpressions != null && methodCallArgumentExpressions.size() == 1 && methodCallArgumentExpressions.get(0) instanceof NamedArgumentListExpression) { - final Map constraintNameToExpression = new LinkedHashMap(); + final Map constraintNameToExpression = new LinkedHashMap<>(); final List mapEntryExpressions = ((NamedArgumentListExpression) methodCallArgumentExpressions.get(0)).getMapEntryExpressions(); for (final MapEntryExpression mapEntryExpression : mapEntryExpressions) { final Expression keyExpression = mapEntryExpression.getKeyExpression(); if (keyExpression instanceof ConstantExpression) { final Object value = ((ConstantExpression) keyExpression).getValue(); if (value instanceof String) { - constraintNameToExpression.put((String)value, mapEntryExpression.getValueExpression()); + constraintNameToExpression.put((String) value, mapEntryExpression.getValueExpression()); } } } @@ -1091,7 +1140,7 @@ public static Map> getConstraintMetadata(final C */ public static Map getAssocationMap(ClassNode classNode, String associationType) { PropertyNode property = classNode.getProperty(associationType); - Map associationMap = new LinkedHashMap(); + Map associationMap = new LinkedHashMap<>(); if (property != null && property.isStatic()) { Expression e = property.getInitialExpression(); if (e instanceof MapExpression) { @@ -1108,21 +1157,21 @@ public static Map getAssocationMap(ClassNode classNode, Strin return associationMap; } - public static Map getAllAssociationMap(ClassNode classNode) { - Map associationMap = new LinkedHashMap(); - associationMap.putAll( getAssocationMap(classNode, GormProperties.HAS_MANY)); - associationMap.putAll( getAssocationMap(classNode, GormProperties.HAS_ONE)); - associationMap.putAll( getAssocationMap(classNode, GormProperties.BELONGS_TO)); + public static Map getAllAssociationMap(ClassNode classNode) { + Map associationMap = new LinkedHashMap<>(); + associationMap.putAll(getAssocationMap(classNode, GormProperties.HAS_MANY)); + associationMap.putAll(getAssocationMap(classNode, GormProperties.HAS_ONE)); + associationMap.putAll(getAssocationMap(classNode, GormProperties.BELONGS_TO)); return associationMap; } public static ClassNode findInterface(ClassNode classNode, ClassNode interfaceNode) { - while(!classNode.equals(OBJECT_CLASS_NODE)) { + while (!classNode.equals(OBJECT_CLASS_NODE)) { Set interfaces = classNode.getAllInterfaces(); for (ClassNode anInterface : interfaces) { - if(anInterface.equals(interfaceNode)) return anInterface; + if (anInterface.equals(interfaceNode)) return anInterface; } classNode = classNode.getSuperClass(); @@ -1132,12 +1181,13 @@ public static ClassNode findInterface(ClassNode classNode, ClassNode interfaceNo public static boolean hasZeroArgsConstructor(ClassNode implementationNode) { List constructors = implementationNode.getDeclaredConstructors(); - if(constructors.isEmpty()) return true; + if (constructors.isEmpty()) return true; for (ConstructorNode constructor : constructors) { - if(constructor.getParameters().length == 0 ) return true; + if (constructor.getParameters().length == 0) return true; } return false; } + /** * Whether the given class node is an inner class * @@ -1167,53 +1217,53 @@ public static boolean isSubclassOf(ClassNode classNode, String parentClassName) @Target(ElementType.CONSTRUCTOR) @Retention(RetentionPolicy.SOURCE) private static @interface GrailsDelegatingConstructor {} - + /** * Marks a method to be staticly compiled - * + * * @param annotatedNode * @return The annotated method */ public static AnnotatedNode addCompileStaticAnnotation(AnnotatedNode annotatedNode) { return addCompileStaticAnnotation(annotatedNode, false); } - + /** * Adds @CompileStatic annotation to method - * + * * @param annotatedNode * @param skip * @return The annotated method */ public static AnnotatedNode addCompileStaticAnnotation(AnnotatedNode annotatedNode, boolean skip) { - if(annotatedNode != null) { + if (annotatedNode != null) { AnnotationNode an = new AnnotationNode(COMPILESTATIC_CLASS_NODE); - if(skip) { - an.addMember("value", new PropertyExpression(new ClassExpression(TYPECHECKINGMODE_CLASS_NODE), "SKIP")); + if (skip) { + an.addMember("value", new PropertyExpression(new ClassExpression(TYPECHECKINGMODE_CLASS_NODE), "SKIP")); } annotatedNode.addAnnotation(an); - if(!skip) { + if (!skip) { annotatedNode.getDeclaringClass().addTransform(StaticCompileTransformation.class, an); } } return annotatedNode; } - + /** * Set the method target of a MethodCallExpression to the first matching method with same number of arguments. * This doesn't check argument types. - * + * * @param methodCallExpression * @param targetClassNode */ public static MethodCallExpression applyDefaultMethodTarget(final MethodCallExpression methodCallExpression, final ClassNode targetClassNode) { - return applyMethodTarget(methodCallExpression, targetClassNode, (ClassNode[])null); + return applyMethodTarget(methodCallExpression, targetClassNode, (ClassNode[]) null); } - + /** * Set the method target of a MethodCallExpression to the first matching method with same number of arguments. * This doesn't check argument types. - * + * * @param methodCallExpression * @param targetClass * @return The method call expression @@ -1221,12 +1271,12 @@ public static MethodCallExpression applyDefaultMethodTarget(final MethodCallExpr public static MethodCallExpression applyDefaultMethodTarget(final MethodCallExpression methodCallExpression, final Class targetClass) { return applyDefaultMethodTarget(methodCallExpression, ClassHelper.make(targetClass).getPlainNodeReference()); } - + /** * Set the method target of a MethodCallExpression to the first matching method with same number and type of arguments. - * + * * A null parameter type will match any type - * + * * @param methodCallExpression * @param targetClassNode * @param targetParameterTypes @@ -1234,17 +1284,16 @@ public static MethodCallExpression applyDefaultMethodTarget(final MethodCallExpr */ public static MethodCallExpression applyMethodTarget(final MethodCallExpression methodCallExpression, final ClassNode targetClassNode, final ClassNode... targetParameterTypes) { String methodName = methodCallExpression.getMethodAsString(); - if(methodName==null) return methodCallExpression; - int argumentCount = methodCallExpression.getArguments() != null ? ((TupleExpression)methodCallExpression.getArguments()).getExpressions().size() : 0; - + if (methodName == null) return methodCallExpression; + int argumentCount = methodCallExpression.getArguments() != null ? ((TupleExpression) methodCallExpression.getArguments()).getExpressions().size() : 0; + String methodFoundInClass = null; - - + for (MethodNode method : targetClassNode.getMethods(methodName)) { int methodParameterCount = method.getParameters() != null ? method.getParameters().length : 0; if (methodParameterCount == argumentCount && (targetParameterTypes == null || (parameterTypesMatch(method.getParameters(), targetParameterTypes)))) { String methodFromClass = method.getDeclaringClass().getName(); - if(methodFoundInClass == null) { + if (methodFoundInClass == null) { methodCallExpression.setMethodTarget(method); methodFoundInClass = methodFromClass; } else if (methodFromClass.equals(methodFoundInClass)) { @@ -1254,10 +1303,10 @@ public static MethodCallExpression applyMethodTarget(final MethodCallExpression } return methodCallExpression; } - + /** * Set the method target of a MethodCallExpression to the first matching method with same number and type of arguments. - * + * * @param methodCallExpression * @param targetClass * @param targetParameterClassTypes @@ -1266,10 +1315,10 @@ public static MethodCallExpression applyMethodTarget(final MethodCallExpression public static MethodCallExpression applyMethodTarget(final MethodCallExpression methodCallExpression, final Class targetClass, final Class... targetParameterClassTypes) { return applyMethodTarget(methodCallExpression, ClassHelper.make(targetClass).getPlainNodeReference(), convertTargetParameterTypes(targetParameterClassTypes)); } - + /** * Set the method target of a MethodCallExpression to the first matching method with same number and type of arguments. - * + * * @param methodCallExpression * @param targetClassNode * @param targetParameterClassTypes @@ -1277,13 +1326,13 @@ public static MethodCallExpression applyMethodTarget(final MethodCallExpression */ public static MethodCallExpression applyMethodTarget(final MethodCallExpression methodCallExpression, final ClassNode targetClassNode, final Class... targetParameterClassTypes) { return applyMethodTarget(methodCallExpression, targetClassNode, convertTargetParameterTypes(targetParameterClassTypes)); - } + } private static ClassNode[] convertTargetParameterTypes(final Class[] targetParameterClassTypes) { ClassNode[] targetParameterTypes = null; - if(targetParameterClassTypes != null) { + if (targetParameterClassTypes != null) { targetParameterTypes = new ClassNode[targetParameterClassTypes.length]; - for(int i=0;i < targetParameterClassTypes.length;i++) { + for (int i = 0; i < targetParameterClassTypes.length; i++) { targetParameterTypes[i] = targetParameterClassTypes[i] != null ? ClassHelper.make(targetParameterClassTypes[i]).getPlainNodeReference() : null; } } @@ -1291,18 +1340,18 @@ private static ClassNode[] convertTargetParameterTypes(final Class[] targetPa } private static boolean parameterTypesMatch(Parameter[] parameters, ClassNode[] targetParameterTypes) { - if(targetParameterTypes==null || targetParameterTypes.length==0) return true; - for(int i=0;i < parameters.length;i++) { - if(targetParameterTypes.length > i && targetParameterTypes[i] != null && !parameters[i].getType().getName().equals(targetParameterTypes[i].getName())) { + if (targetParameterTypes == null || targetParameterTypes.length == 0) return true; + for (int i = 0; i < parameters.length; i++) { + if (targetParameterTypes.length > i && targetParameterTypes[i] != null && !parameters[i].getType().getName().equals(targetParameterTypes[i].getName())) { return false; } } return true; } - + /** * Build static direct call to getter of a property - * + * * @param objectExpression * @param propertyName * @param targetClassNode @@ -1311,10 +1360,10 @@ private static boolean parameterTypesMatch(Parameter[] parameters, ClassNode[] t public static MethodCallExpression buildGetPropertyExpression(final Expression objectExpression, final String propertyName, final ClassNode targetClassNode) { return buildGetPropertyExpression(objectExpression, propertyName, targetClassNode, false); } - + /** * Build static direct call to getter of a property - * + * * @param objectExpression * @param propertyName * @param targetClassNode @@ -1325,15 +1374,15 @@ public static MethodCallExpression buildGetPropertyExpression(final Expression o String methodName = (useBooleanGetter ? "is" : "get") + MetaClassHelper.capitalize(propertyName); MethodCallExpression methodCallExpression = new MethodCallExpression(objectExpression, methodName, MethodCallExpression.NO_ARGUMENTS); MethodNode getterMethod = targetClassNode.getGetterMethod(methodName); - if(getterMethod != null) { + if (getterMethod != null) { methodCallExpression.setMethodTarget(getterMethod); } return methodCallExpression; } - + /** * Build static direct call to setter of a property - * + * * @param objectExpression * @param propertyName * @param targetClassNode @@ -1344,15 +1393,15 @@ public static MethodCallExpression buildSetPropertyExpression(final Expression o String methodName = "set" + MetaClassHelper.capitalize(propertyName); MethodCallExpression methodCallExpression = new MethodCallExpression(objectExpression, methodName, new ArgumentListExpression(valueExpression)); MethodNode setterMethod = targetClassNode.getSetterMethod(methodName); - if(setterMethod != null) { + if (setterMethod != null) { methodCallExpression.setMethodTarget(setterMethod); } return methodCallExpression; } - + /** * Build static direct call to put entry in Map - * + * * @param objectExpression * @param keyName * @param valueExpression @@ -1364,7 +1413,7 @@ public static MethodCallExpression buildPutMapExpression(final Expression object /** * Build static direct call to get entry from Map - * + * * @param objectExpression * @param keyName * @return The method call expression @@ -1372,7 +1421,7 @@ public static MethodCallExpression buildPutMapExpression(final Expression object public static MethodCallExpression buildGetMapExpression(final Expression objectExpression, final String keyName) { return applyDefaultMethodTarget(new MethodCallExpression(objectExpression, "get", new ArgumentListExpression(new ConstantExpression(keyName))), Map.class); } - + public static Expression buildGetThisObjectExpression(boolean inClosureBlock) { if (!inClosureBlock) { return buildThisExpression(); @@ -1384,11 +1433,11 @@ public static Expression buildGetThisObjectExpression(boolean inClosureBlock) { public static Expression buildThisExpression() { return new VariableExpression("this"); } - + public static MethodCallExpression noImplicitThis(MethodCallExpression methodCallExpression) { return applyImplicitThis(methodCallExpression, false); } - + public static MethodCallExpression applyImplicitThis(MethodCallExpression methodCallExpression, boolean useImplicitThis) { methodCallExpression.setImplicitThis(useImplicitThis); return methodCallExpression; @@ -1397,13 +1446,13 @@ public static MethodCallExpression applyImplicitThis(MethodCallExpression method public static void copyAnnotations(final AnnotatedNode from, final AnnotatedNode to) { copyAnnotations(from, to, null, null); } - + public static void copyAnnotations(final AnnotatedNode from, final AnnotatedNode to, final Set included, final Set excluded) { final List annotationsToCopy = from.getAnnotations(); - for(final AnnotationNode node : annotationsToCopy) { + for (final AnnotationNode node : annotationsToCopy) { String annotationClassName = node.getClassNode().getName(); - if((excluded==null || !excluded.contains(annotationClassName)) && - (included==null || included.contains(annotationClassName))) { + if ((excluded == null || !excluded.contains(annotationClassName)) && + (included == null || included.contains(annotationClassName))) { final AnnotationNode copyOfAnnotationNode = cloneAnnotation(node); to.addAnnotation(copyOfAnnotationNode); } @@ -1413,53 +1462,53 @@ public static void copyAnnotations(final AnnotatedNode from, final AnnotatedNode public static AnnotationNode cloneAnnotation(final AnnotationNode node) { final AnnotationNode copyOfAnnotationNode = new AnnotationNode(node.getClassNode()); final Map members = node.getMembers(); - for(final Map.Entry entry : members.entrySet()) { + for (final Map.Entry entry : members.entrySet()) { copyOfAnnotationNode.addMember(entry.getKey(), entry.getValue()); } return copyOfAnnotationNode; } - + public static void filterAnnotations(final AnnotatedNode annotatedNode, final Set classNamesToRetain, final Set classNamesToRemove) { - for(Iterator iterator = annotatedNode.getAnnotations().iterator(); iterator.hasNext(); ) { + for (Iterator iterator = annotatedNode.getAnnotations().iterator(); iterator.hasNext(); ) { final AnnotationNode node = iterator.next(); String annotationClassName = node.getClassNode().getName(); - if((classNamesToRemove==null || classNamesToRemove.contains(annotationClassName)) && - (classNamesToRetain==null || !classNamesToRetain.contains(annotationClassName))) { + if ((classNamesToRemove == null || classNamesToRemove.contains(annotationClassName)) && + (classNamesToRetain == null || !classNamesToRetain.contains(annotationClassName))) { iterator.remove(); } } } - + public static void removeCompileStaticAnnotations(final AnnotatedNode annotatedNode) { - filterAnnotations(annotatedNode, null, new LinkedHashSet(Arrays.asList(new String[]{CompileStatic.class.getName(), TypeChecked.class.getName()}))); + filterAnnotations(annotatedNode, null, new LinkedHashSet<>(Arrays.asList(new String[]{CompileStatic.class.getName(), TypeChecked.class.getName()}))); } - + public static void markApplied(ASTNode astNode, Class transformationClass) { resolveRedirect(astNode).setNodeMetaData(appliedTransformationKey(transformationClass), Boolean.TRUE); } private static ASTNode resolveRedirect(ASTNode astNode) { - if(astNode instanceof ClassNode) { - astNode = ((ClassNode)astNode).redirect(); + if (astNode instanceof ClassNode) { + astNode = ((ClassNode) astNode).redirect(); } return astNode; } - + private static String appliedTransformationKey(Class transformationClass) { return "APPLIED_" + transformationClass.getName(); } - + public static boolean isApplied(ASTNode astNode, Class transformationClass) { return resolveRedirect(astNode).getNodeMetaData(appliedTransformationKey(transformationClass)) == Boolean.TRUE; } - + public static void processVariableScopes(SourceUnit source, ClassNode classNode) { processVariableScopes(source, classNode, null); } - + public static void processVariableScopes(SourceUnit source, ClassNode classNode, MethodNode methodNode) { VariableScopeVisitor scopeVisitor = new VariableScopeVisitor(source); - if(methodNode == null) { + if (methodNode == null) { scopeVisitor.visitClass(classNode); } else { scopeVisitor.prepareVisit(classNode); @@ -1470,7 +1519,7 @@ public static void processVariableScopes(SourceUnit source, ClassNode classNode, public static boolean isGetterMethod(MethodNode md) { String methodName = md.getName(); - return (((methodName.startsWith("get") && methodName.length() > 3) || (methodName.startsWith("is") && methodName.length() > 2)) && (md.getParameters()==null || md.getParameters().length == 0)); + return (((methodName.startsWith("get") && methodName.length() > 3) || (methodName.startsWith("is") && methodName.length() > 2)) && (md.getParameters() == null || md.getParameters().length == 0)); } public static boolean isSetterMethod(MethodNode md) { @@ -1498,7 +1547,7 @@ public static boolean isSetterOrGetterMethod(MethodNode md) { public static URL getSourceUrl(SourceUnit source) { URL url = null; final String filename = source.getName(); - if(filename==null) { + if (filename == null) { return null; } diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareClassLoader.java b/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareClassLoader.java index 75177984e5c..2c303f11e88 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareClassLoader.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareClassLoader.java @@ -18,13 +18,14 @@ */ package org.grails.compiler.injection; -import grails.compiler.ast.ClassInjector; +import java.security.CodeSource; + import groovy.lang.GroovyClassLoader; import org.codehaus.groovy.control.CompilationUnit; import org.codehaus.groovy.control.CompilerConfiguration; import org.codehaus.groovy.control.Phases; -import java.security.CodeSource; +import grails.compiler.ast.ClassInjector; /** * A class loader that is aware of Groovy sources and injection operations. @@ -59,7 +60,7 @@ public GrailsAwareClassLoader(ClassLoader loader, CompilerConfiguration config) public void setClassInjectors(ClassInjector[] classInjectors) { this.classInjectors = classInjectors; } - + /** * @see groovy.lang.GroovyClassLoader#createCompilationUnit(org.codehaus.groovy.control.CompilerConfiguration, java.security.CodeSource) */ diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareInjectionOperation.java b/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareInjectionOperation.java index a9d23cfa52c..e3ecbf743ae 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareInjectionOperation.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/GrailsAwareInjectionOperation.java @@ -18,17 +18,22 @@ */ package org.grails.compiler.injection; -import grails.compiler.ast.AstTransformer; -import grails.compiler.ast.ClassInjector; -import grails.compiler.ast.GlobalClassInjector; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Comparator; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Set; + import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.classgen.GeneratorContext; import org.codehaus.groovy.control.CompilationFailedException; import org.codehaus.groovy.control.CompilationUnit; import org.codehaus.groovy.control.SourceUnit; -import org.grails.io.support.FileSystemResource; -import org.grails.io.support.PathMatchingResourcePatternResolver; -import org.grails.io.support.Resource; + import org.springframework.asm.AnnotationVisitor; import org.springframework.asm.ClassReader; import org.springframework.asm.ClassVisitor; @@ -36,10 +41,12 @@ import org.springframework.core.io.support.ResourcePatternResolver; import org.springframework.util.ClassUtils; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.*; +import grails.compiler.ast.AstTransformer; +import grails.compiler.ast.ClassInjector; +import grails.compiler.ast.GlobalClassInjector; +import org.grails.io.support.FileSystemResource; +import org.grails.io.support.PathMatchingResourcePatternResolver; +import org.grails.io.support.Resource; /** * A Groovy compiler injection operation that uses a specified array of @@ -66,7 +73,6 @@ public GrailsAwareInjectionOperation(ClassInjector[] classInjectors) { localClassInjectors = classInjectors; } - public static ClassInjector[] getClassInjectors() { if (classInjectors == null) { initializeState(); @@ -104,17 +110,17 @@ private static void initializeState() { Resource[] resources; try { resources = scanForPatterns(resolver, pattern2, pattern); - if(resources.length == 0) { + if (resources.length == 0) { classLoader = Thread.currentThread().getContextClassLoader(); resolver = new PathMatchingResourcePatternResolver(classLoader); resources = scanForPatterns(resolver, pattern2, pattern); } - final List injectors = new ArrayList(); - final List globalInjectors = new ArrayList(); - final Set injectorClasses = new LinkedHashSet(); + final List injectors = new ArrayList<>(); + final List globalInjectors = new ArrayList<>(); + final Set injectorClasses = new LinkedHashSet<>(); for (Resource resource : resources) { // ignore not readable classes and closures - if(!resource.isReadable() || resource.getFilename().contains("$_")) continue; + if (!resource.isReadable() || resource.getFilename().contains("$_")) continue; try (InputStream inputStream = resource.getInputStream()) { final ClassReader classReader = new ClassReader(inputStream); final String astTransformerClassName = AstTransformer.class.getSimpleName(); @@ -164,10 +170,10 @@ public AnnotationVisitor visitAnnotation(String desc, boolean visible) { } } - private static Resource[] scanForPatterns(PathMatchingResourcePatternResolver resolver, String...patterns) throws IOException { - List results = new ArrayList(); - for(String pattern : patterns) { - results.addAll( Arrays.asList(resolver.getResources(pattern)) ); + private static Resource[] scanForPatterns(PathMatchingResourcePatternResolver resolver, String... patterns) throws IOException { + List results = new ArrayList<>(); + for (String pattern : patterns) { + results.addAll(Arrays.asList(resolver.getResources(pattern))); } return results.toArray(new Resource[0]); } diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/GroovyEclipseCompilationHelper.groovy b/grails-core/src/main/groovy/org/grails/compiler/injection/GroovyEclipseCompilationHelper.groovy index 5eec1f772ee..7dac91a1680 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/GroovyEclipseCompilationHelper.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/GroovyEclipseCompilationHelper.groovy @@ -20,6 +20,7 @@ package org.grails.compiler.injection import groovy.transform.CompileStatic import org.codehaus.groovy.control.SourceUnit + import org.springframework.expression.spel.standard.SpelExpressionParser import org.springframework.expression.spel.support.StandardEvaluationContext import org.springframework.expression.spel.support.StandardTypeLocator @@ -40,23 +41,23 @@ class GroovyEclipseCompilationHelper { context.setTypeLocator(new StandardTypeLocator(sourceUnit.getClass().getClassLoader())) context.setRootObject(sourceUnit) try { - // Honour the targetDirectory within the source configuration directory. - File targetDirectory = sourceUnit.configuration.targetDirectory - - if (targetDirectory == null) { - - // Resolve as before. - targetDirectory = ((File) new SpelExpressionParser().parseExpression("eclipseFile.project.getFolder(T(org.eclipse.jdt.core.JavaCore).create(eclipseFile.project).outputLocation).rawLocation.makeAbsolute().toFile().absoluteFile").getValue(context)) - - } else if (!targetDirectory.isAbsolute()) { - // Target directory is set and is not absolute. - // We should assume that this is a path relative to the current eclipse project, - // and needs resolving appropriately. - targetDirectory = ((File) new SpelExpressionParser().parseExpression("eclipseFile.project.getFolder('${targetDirectory.path}').rawLocation.makeAbsolute().toFile().absoluteFile").getValue(context)) - - } - // Else absolute file location. We should return as-is. - return targetDirectory + // Honour the targetDirectory within the source configuration directory. + File targetDirectory = sourceUnit.configuration.targetDirectory + + if (targetDirectory == null) { + + // Resolve as before. + targetDirectory = ((File) new SpelExpressionParser().parseExpression('eclipseFile.project.getFolder(T(org.eclipse.jdt.core.JavaCore).create(eclipseFile.project).outputLocation).rawLocation.makeAbsolute().toFile().absoluteFile').getValue(context)) + + } else if (!targetDirectory.isAbsolute()) { + // Target directory is set and is not absolute. + // We should assume that this is a path relative to the current eclipse project, + // and needs resolving appropriately. + targetDirectory = ((File) new SpelExpressionParser().parseExpression("eclipseFile.project.getFolder('${targetDirectory.path}').rawLocation.makeAbsolute().toFile().absoluteFile").getValue(context)) + + } + // Else absolute file location. We should return as-is. + return targetDirectory } catch (Throwable e) { // Not running Eclipse IDE, probably using the Eclipse compiler with Maven return null @@ -64,4 +65,4 @@ class GroovyEclipseCompilationHelper { } return null } -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/MixinTransformation.java b/grails-core/src/main/groovy/org/grails/compiler/injection/MixinTransformation.java index 7a070c74fa3..5916873b78e 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/MixinTransformation.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/MixinTransformation.java @@ -18,28 +18,35 @@ */ package org.grails.compiler.injection; -import grails.util.GrailsNameUtils; -import grails.util.Mixin; -import grails.util.MixinTargetAware; -import groovy.lang.GroovyObjectSupport; - import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; -import org.apache.grails.common.compiler.GroovyTransformOrder; +import groovy.lang.GroovyObjectSupport; import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.AnnotatedNode; import org.codehaus.groovy.ast.AnnotationNode; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.MethodNode; -import org.codehaus.groovy.ast.expr.*; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.ConstructorCallExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.ListExpression; +import org.codehaus.groovy.ast.expr.MapEntryExpression; +import org.codehaus.groovy.ast.expr.MapExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.transform.ASTTransformation; import org.codehaus.groovy.transform.GroovyASTTransformation; import org.codehaus.groovy.transform.TransformWithPriority; +import grails.util.GrailsNameUtils; +import grails.util.Mixin; +import grails.util.MixinTargetAware; +import org.apache.grails.common.compiler.GroovyTransformOrder; + /** * The logic for the {@link grails.util.Mixin} location transform. * @@ -79,6 +86,7 @@ public void visit(ASTNode[] astNodes, SourceUnit source) { weaveMixinsIntoClass(classNode, values); } + public void weaveMixinsIntoClass(ClassNode classNode, ListExpression values) { if (values != null) { for (Expression current : values.getExpressions()) { @@ -93,14 +101,14 @@ public void weaveMixinsIntoClass(ClassNode classNode, ListExpression values) { boolean isTargetAware = GrailsASTUtils.findInterface(mixinClassNode, new ClassNode(MixinTargetAware.class)) != null; ConstructorCallExpression initialValue; - if(isTargetAware) { + if (isTargetAware) { initialValue = new ConstructorCallExpression(mixinClassNode, new MapExpression( Arrays.asList(new MapEntryExpression(new ConstantExpression("target"), new VariableExpression("this"))) )); - } else { + } else { initialValue = new ConstructorCallExpression(mixinClassNode, GrailsASTUtils.ZERO_ARGUMENTS); } - classNode.addField(fieldName, Modifier.PRIVATE, mixinClassNode,initialValue); + classNode.addField(fieldName, Modifier.PRIVATE, mixinClassNode, initialValue); } VariableExpression fieldReference = new VariableExpression(fieldName, mixinClassNode); @@ -129,6 +137,7 @@ public void weaveMixinsIntoClass(ClassNode classNode, ListExpression values) { protected boolean hasDeclaredMethod(ClassNode classNode, MethodNode mixinMethod) { return classNode.hasDeclaredMethod(mixinMethod.getName(), mixinMethod.getParameters()); } + protected ListExpression getListOfClasses(AnnotationNode node) { Expression value = node.getMember("value"); ListExpression values = null; diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/PluginAstReader.java b/grails-core/src/main/groovy/org/grails/compiler/injection/PluginAstReader.java index 7b0a426b83b..30c05b77b03 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/PluginAstReader.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/PluginAstReader.java @@ -18,19 +18,27 @@ */ package org.grails.compiler.injection; -import grails.plugins.GrailsPluginInfo; -import grails.util.GrailsNameUtils; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import org.codehaus.groovy.ast.ClassCodeVisitorSupport; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.PropertyNode; -import org.codehaus.groovy.ast.expr.*; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.ListExpression; +import org.codehaus.groovy.ast.expr.MapEntryExpression; +import org.codehaus.groovy.ast.expr.MapExpression; import org.codehaus.groovy.control.CompilationFailedException; import org.codehaus.groovy.control.SourceUnit; -import org.codehaus.groovy.runtime.DefaultGroovyMethods; -import org.grails.io.support.Resource; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; +import grails.plugins.GrailsPluginInfo; +import grails.util.GrailsNameUtils; +import org.grails.io.support.Resource; /** * Reads plugin info from the AST @@ -52,7 +60,7 @@ GrailsPluginInfo getPluginInfo() { public GrailsPluginInfo readPluginInfo(ClassNode classNode) throws CompilationFailedException { String className = classNode.getNameWithoutPackage(); - if(className.endsWith("GrailsPlugin")) { + if (className.endsWith("GrailsPlugin")) { visitContents(className, classNode); } return pluginInfo; @@ -65,32 +73,30 @@ protected void visitContents(String className, final ClassNode classNode) { public void visitProperty(PropertyNode node) { String name = node.getName(); - - final Expression expr = node.getField().getInitialExpression(); if (expr != null) { Object value = null; if (expr instanceof ListExpression) { - final List list = new ArrayList(); - for (Expression i : ((ListExpression)expr).getExpressions()) { + final List list = new ArrayList<>(); + for (Expression i : ((ListExpression) expr).getExpressions()) { list.add(i.getText()); } value = list; } else if (expr instanceof MapExpression) { - final Map map = new LinkedHashMap(); + final Map map = new LinkedHashMap<>(); value = map; - for (MapEntryExpression mee : ((MapExpression)expr).getMapEntryExpressions()) { + for (MapEntryExpression mee : ((MapExpression) expr).getMapEntryExpressions()) { map.put(mee.getKeyExpression().getText(), mee.getValueExpression().getText()); } } else { - if(expr instanceof ConstantExpression) { + if (expr instanceof ConstantExpression) { value = expr.getText(); } } - if(value != null) { + if (value != null) { pluginInfo.setProperty(name, value); super.visitProperty(node); } @@ -109,7 +115,6 @@ protected SourceUnit getSourceUnit() { pluginInfo.setName(GrailsNameUtils.getPluginName(className + ".groovy")); } - /** * Simple Javabean implementation of the GrailsPluginInfo interface. * @@ -120,7 +125,7 @@ public class BasicGrailsPluginInfo implements GrailsPluginInfo { private String name; private String version; - private Map attributes = new ConcurrentHashMap(); + private Map attributes = new ConcurrentHashMap<>(); public BasicGrailsPluginInfo() { } @@ -146,7 +151,7 @@ public void setProperty(String property, Object newValue) { } public Object getProperty(String property) { - return attributes.get(property); + return attributes.get(property); } public String getFullName() { diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/TraitInjectionSupport.groovy b/grails-core/src/main/groovy/org/grails/compiler/injection/TraitInjectionSupport.groovy index 90a8a9cdf70..96a8e008d95 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/TraitInjectionSupport.groovy +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/TraitInjectionSupport.groovy @@ -19,9 +19,9 @@ package org.grails.compiler.injection -import grails.compiler.traits.TraitInjector import groovy.transform.CompileStatic +import grails.compiler.traits.TraitInjector /** * Utility methods used by {@link TraitInjectionUtils} @@ -37,10 +37,10 @@ class TraitInjectionSupport { injectors.sort { TraitInjector o1, TraitInjector o2 -> final Class t1 = o1.trait final Class t2 = o2.trait - if(t1 == t2) return 0 + if (t1 == t2) return 0 // lower priority of core traits so that plugins can override - if(o1.getClass().name.startsWith('grails.compiler.traits')) { + if (o1.getClass().name.startsWith('grails.compiler.traits')) { return -1 } else { diff --git a/grails-core/src/main/groovy/org/grails/compiler/injection/TraitInjectionUtils.java b/grails-core/src/main/groovy/org/grails/compiler/injection/TraitInjectionUtils.java index c7996f4008d..549ee5314e7 100644 --- a/grails-core/src/main/groovy/org/grails/compiler/injection/TraitInjectionUtils.java +++ b/grails-core/src/main/groovy/org/grails/compiler/injection/TraitInjectionUtils.java @@ -18,8 +18,13 @@ */ package org.grails.compiler.injection; -import grails.compiler.ast.SupportsClassNode; -import grails.compiler.traits.TraitInjector; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + import org.codehaus.groovy.ast.ClassHelper; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.GenericsType; @@ -27,9 +32,10 @@ import org.codehaus.groovy.control.CompilePhase; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.transform.trait.TraitComposer; -import org.grails.core.io.support.GrailsFactoriesLoader; -import java.util.*; +import grails.compiler.ast.SupportsClassNode; +import grails.compiler.traits.TraitInjector; +import org.grails.core.io.support.GrailsFactoriesLoader; /** * @@ -45,7 +51,7 @@ private TraitInjectionUtils() { } private static void extendTraits(CompilationUnit unit, SourceUnit source, ClassNode classNode) { - if(unit.getPhase() != CompilePhase.SEMANTIC_ANALYSIS.getPhaseNumber()) { + if (unit.getPhase() != CompilePhase.SEMANTIC_ANALYSIS.getPhaseNumber()) { TraitComposer.doExtendTraits(classNode, source, unit); } } @@ -63,9 +69,9 @@ private static boolean addTrait(ClassNode classNode, Class trait) { } if (!implementsTrait && !traitNotLoaded) { final GenericsType[] genericsTypes = traitClassNode.getGenericsTypes(); - final Map parameterNameToParameterValue = new LinkedHashMap(); - if(genericsTypes != null) { - for(GenericsType gt : genericsTypes) { + final Map parameterNameToParameterValue = new LinkedHashMap<>(); + if (genericsTypes != null) { + for (GenericsType gt : genericsTypes) { parameterNameToParameterValue.put(gt.getName(), classNode); } } @@ -77,7 +83,7 @@ private static boolean addTrait(ClassNode classNode, Class trait) { public static void injectTrait(CompilationUnit unit, SourceUnit source, ClassNode classNode, Class trait) { boolean traitsAdded = addTrait(classNode, trait); - if(traitsAdded) { + if (traitsAdded) { extendTraits(unit, source, classNode); } } @@ -92,38 +98,38 @@ private static void doInjectionInternal(CompilationUnit unit, SourceUnit source, traitsAdded = true; } } - if(traitsAdded) { + if (traitsAdded) { extendTraits(unit, source, classNode); } } private static List getTraitInjectors() { - if(traitInjectors == null) { + if (traitInjectors == null) { traitInjectors = GrailsFactoriesLoader.loadFactories(TraitInjector.class); traitInjectors = TraitInjectionSupport.resolveTraitInjectors(traitInjectors); } - if(traitInjectors != null) { + if (traitInjectors != null) { return Collections.unmodifiableList(traitInjectors); } else { return Collections.emptyList(); } } - - public static void processTraitsForNode(final SourceUnit sourceUnit, + + public static void processTraitsForNode(final SourceUnit sourceUnit, final ClassNode cNode, - final String artefactType, + final String artefactType, final CompilationUnit compilationUnit) { final List traitInjectors = getTraitInjectors(); - final List injectorsToUse = new ArrayList(); + final List injectorsToUse = new ArrayList<>(); for (final TraitInjector injector : traitInjectors) { final List artefactTypes = Arrays.asList(injector.getArtefactTypes()); boolean supportsClassNode = true; if (injector instanceof SupportsClassNode) { - supportsClassNode = ((SupportsClassNode)injector).supports(cNode); + supportsClassNode = ((SupportsClassNode) injector).supports(cNode); } if (artefactTypes.contains(artefactType) && supportsClassNode) { @@ -131,13 +137,13 @@ public static void processTraitsForNode(final SourceUnit sourceUnit, } } try { - if(injectorsToUse.size() > 0) { + if (injectorsToUse.size() > 0) { doInjectionInternal(compilationUnit, sourceUnit, cNode, injectorsToUse); } } catch (RuntimeException e) { try { - System.err.println("Error occurred calling Trait injector ["+TraitInjectionUtils.class.getName()+"]: " - + e.getMessage()); + System.err.println("Error occurred calling Trait injector [" + TraitInjectionUtils.class.getName() + "]: " + + e.getMessage()); e.printStackTrace(); } catch (Throwable t) { // ignore it diff --git a/grails-core/src/main/groovy/org/grails/config/CompositeConfig.java b/grails-core/src/main/groovy/org/grails/config/CompositeConfig.java index d179e260652..91fa679258d 100644 --- a/grails-core/src/main/groovy/org/grails/config/CompositeConfig.java +++ b/grails-core/src/main/groovy/org/grails/config/CompositeConfig.java @@ -18,14 +18,23 @@ */ package org.grails.config; +import java.util.ArrayDeque; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Deque; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import groovy.transform.CompileStatic; + import grails.config.Config; import grails.util.GrailsStringUtils; -import groovy.transform.CompileStatic; import org.grails.core.exceptions.GrailsConfigurationException; -import org.springframework.util.ClassUtils; - -import java.util.*; - /** * A {@link Config} composed of other Configs @@ -36,7 +45,7 @@ @CompileStatic public class CompositeConfig implements Config { - protected Deque configs = new ArrayDeque(); + protected Deque configs = new ArrayDeque<>(); /** * Adds a config at the highest level of precedence @@ -59,8 +68,8 @@ public void addLast(Config config) { @Override @Deprecated public Map flatten() { - Map flattened = new LinkedHashMap(); - for(Config c : configs) { + Map flattened = new LinkedHashMap<>(); + for (Config c : configs) { flattened.putAll(c.flatten()); } return flattened; @@ -69,7 +78,7 @@ public Map flatten() { @Override public Properties toProperties() { Properties properties = new Properties(); - for(Config c : configs) { + for (Config c : configs) { properties.putAll(c.toProperties()); } return properties; @@ -83,7 +92,7 @@ public Config merge(Map toMerge) { @Override public T getProperty(String key, Class targetType, T defaultValue, List allowedValues) { T v = getProperty(key, targetType, defaultValue); - if(!allowedValues.contains(v)) { + if (!allowedValues.contains(v)) { throw new GrailsConfigurationException("Invalid configuration value [$value] for key [${key}]. Possible values $allowedValues"); } return v; @@ -91,9 +100,9 @@ public T getProperty(String key, Class targetType, T defaultValue, List> iterator() { @Override public Set keySet() { - Set entries = new HashSet(); + Set entries = new HashSet<>(); for (Config config : configs) { entries.addAll(config.keySet()); } @@ -193,7 +201,7 @@ public Set keySet() { @Override public Collection values() { - Collection values = new ArrayList(); + Collection values = new ArrayList<>(); for (Config config : configs) { values.addAll(config.values()); } @@ -202,7 +210,7 @@ public Collection values() { @Override public Set> entrySet() { - Set> entries = new HashSet>(); + Set> entries = new HashSet<>(); for (Config config : configs) { entries.addAll(config.entrySet()); } @@ -224,7 +232,7 @@ public String getProperty(String key, String defaultValue) { public T getProperty(String key, Class targetType) { for (Config config : configs) { T v = config.getProperty(key, targetType); - if(v != null) return v; + if (v != null) return v; } return null; } @@ -238,7 +246,7 @@ public T getProperty(String key, Class targetType, T defaultValue) { @Override public String getRequiredProperty(String key) throws IllegalStateException { String value = getProperty(key); - if(GrailsStringUtils.isBlank(value)) { + if (GrailsStringUtils.isBlank(value)) { throw new IllegalStateException("Value for key [$key] cannot be resolved"); } return value; @@ -247,7 +255,7 @@ public String getRequiredProperty(String key) throws IllegalStateException { @Override public T getRequiredProperty(String key, Class targetType) throws IllegalStateException { T value = getProperty(key, targetType); - if(value == null) { + if (value == null) { throw new IllegalStateException("Value for key [$key] cannot be resolved"); } return value; @@ -264,8 +272,7 @@ public String resolveRequiredPlaceholders(String text) throws IllegalArgumentExc } @Override - public String - getProperty(String key) { + public String getProperty(String key) { return getProperty(key, String.class); } } diff --git a/grails-core/src/main/groovy/org/grails/config/EnvironmentAwarePropertySource.java b/grails-core/src/main/groovy/org/grails/config/EnvironmentAwarePropertySource.java index 923b00f5429..c6138e991de 100644 --- a/grails-core/src/main/groovy/org/grails/config/EnvironmentAwarePropertySource.java +++ b/grails-core/src/main/groovy/org/grails/config/EnvironmentAwarePropertySource.java @@ -19,13 +19,14 @@ package org.grails.config; -import grails.util.Environment; +import java.util.ArrayList; +import java.util.List; + import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.PropertySource; import org.springframework.core.env.PropertySources; -import java.util.ArrayList; -import java.util.List; +import grails.util.Environment; /** * A PropertySource aware of the Grails environment and that resolves keys based on the environment from other property sources @@ -50,35 +51,35 @@ public String[] getPropertyNames() { @Override public Object getProperty(String name) { initialize(); - if(!propertyNames.contains(name)) { + if (!propertyNames.contains(name)) { return null; } Environment env = Environment.getCurrent(); String key = "environments." + env.getName() + '.' + name; - for(PropertySource propertySource : source) { - if(propertySource != this) { + for (PropertySource propertySource : source) { + if (propertySource != this) { Object value = propertySource.getProperty(key); - if(value != null) return value; + if (value != null) return value; } } return null; } private void initialize() { - if(propertyNames == null) { + if (propertyNames == null) { propertyNames = new ArrayList<>(); Environment env = Environment.getCurrent(); String key = "environments." + env.getName(); - for(PropertySource propertySource : source) { + for (PropertySource propertySource : source) { - if((propertySource != this) && + if ((propertySource != this) && !propertySource.getName().contains("plugin") && // plugin default configuration is not allowed to be environment aware (GRAILS-12123) propertySource instanceof EnumerablePropertySource) { - EnumerablePropertySource enumerablePropertySource = (EnumerablePropertySource)propertySource; + EnumerablePropertySource enumerablePropertySource = (EnumerablePropertySource) propertySource; - for(String propertyName : enumerablePropertySource.getPropertyNames()) { - if(propertyName.startsWith(key) && propertyName.length() > key.length()) { + for (String propertyName : enumerablePropertySource.getPropertyNames()) { + if (propertyName.startsWith(key) && propertyName.length() > key.length()) { propertyNames.add(propertyName.substring(key.length() + 1)); } } diff --git a/grails-core/src/main/groovy/org/grails/config/NavigableMapConfig.java b/grails-core/src/main/groovy/org/grails/config/NavigableMapConfig.java index 341f5e3811f..42b909cf70f 100644 --- a/grails-core/src/main/groovy/org/grails/config/NavigableMapConfig.java +++ b/grails-core/src/main/groovy/org/grails/config/NavigableMapConfig.java @@ -18,17 +18,6 @@ */ package org.grails.config; -import grails.config.Config; -import grails.util.GrailsStringUtils; -import groovy.util.ConfigObject; -import org.codehaus.groovy.runtime.DefaultGroovyMethods; -import org.grails.core.exceptions.GrailsConfigurationException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.core.convert.ConversionException; -import org.springframework.core.convert.support.ConfigurableConversionService; -import org.springframework.core.convert.support.DefaultConversionService; - import java.util.ArrayList; import java.util.Collection; import java.util.IdentityHashMap; @@ -40,6 +29,20 @@ import java.util.Set; import java.util.StringTokenizer; +import groovy.util.ConfigObject; +import org.codehaus.groovy.runtime.DefaultGroovyMethods; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.core.convert.ConversionException; +import org.springframework.core.convert.support.ConfigurableConversionService; +import org.springframework.core.convert.support.DefaultConversionService; + +import grails.config.Config; +import grails.util.GrailsStringUtils; +import org.grails.core.exceptions.GrailsConfigurationException; + /** * A {@link Config} implementation that operates against a {@link org.grails.config.NavigableMap} * @@ -55,7 +58,7 @@ public abstract class NavigableMapConfig implements Config { protected NavigableMap configMap = new NavigableMap() { @Override protected Object mergeMapEntry(NavigableMap targetMap, String sourceKey, Object newValue) { - if(newValue instanceof CharSequence) { + if (newValue instanceof CharSequence) { newValue = resolvePlaceholders(newValue.toString()); } return super.mergeMapEntry(targetMap, sourceKey, newValue); @@ -69,8 +72,8 @@ public int hashCode() { @Override public boolean equals(Object obj) { - if(obj instanceof NavigableMapConfig) { - return this.configMap.equals(((NavigableMapConfig)obj).configMap); + if (obj instanceof NavigableMapConfig) { + return this.configMap.equals(((NavigableMapConfig) obj).configMap); } return false; } @@ -153,7 +156,7 @@ public Set> entrySet() { @Override @Deprecated public Map flatten() { - if(LOG.isWarnEnabled()) { + if (LOG.isWarnEnabled()) { LOG.warn("A plugin or your application called the flatten() method which can degrade startup performance"); } return configMap; @@ -176,7 +179,7 @@ public Config merge(Map toMerge) { } public Object asType(Class c) { - if(c==Boolean.class || c==boolean.class) return false; + if (c == Boolean.class || c == boolean.class) return false; return null; } @@ -208,7 +211,7 @@ public T getProperty(String key, Class targetType) { @Override public T getProperty(String key, Class targetType, T defaultValue, List allowedValues) { T value = getProperty(key, targetType, defaultValue); - if(!allowedValues.contains(value)) { + if (!allowedValues.contains(value)) { throw new GrailsConfigurationException("Invalid configuration value [$value] for key [${key}]. Possible values $allowedValues"); } return value; @@ -302,7 +305,7 @@ private Map convertToMap(NavigableMap from, IdentityHashMap entry: (Set>) config.entrySet()) { + for (Map.Entry entry: (Set>) config.entrySet()) { final IdentityHashMap> cache = new IdentityHashMap<>(); if (entry.getValue() instanceof NavigableMap) { config.setProperty(entry.getKey(), convertToMap((NavigableMap) entry.getValue(), cache)); @@ -362,8 +365,8 @@ private Object toEnumValue(Class targetType, String stringValue) { @Override public String getRequiredProperty(String key) throws IllegalStateException { String value = getProperty(key); - if(GrailsStringUtils.isBlank(value)) { - throw new IllegalStateException("Value for key ["+key+"] cannot be resolved"); + if (GrailsStringUtils.isBlank(value)) { + throw new IllegalStateException("Value for key [" + key + "] cannot be resolved"); } return value; } @@ -371,8 +374,8 @@ public String getRequiredProperty(String key) throws IllegalStateException { @Override public T getRequiredProperty(String key, Class targetType) throws IllegalStateException { T value = getProperty(key, targetType); - if(value == null) { - throw new IllegalStateException("Value for key ["+key+"] cannot be resolved"); + if (value == null) { + throw new IllegalStateException("Value for key [" + key + "] cannot be resolved"); } return value; } @@ -418,7 +421,7 @@ private Object getValueWithDotNotatedKeySupport(NavigableMap configMap, String k } private List convertTokensIntoArrayList(StringTokenizer st) { - List elements = new ArrayList(); + List elements = new ArrayList<>(); while (st.hasMoreTokens()) { elements.add(st.nextToken()); } diff --git a/grails-core/src/main/groovy/org/grails/config/NavigableMapPropertySource.groovy b/grails-core/src/main/groovy/org/grails/config/NavigableMapPropertySource.groovy index 5f7bae42155..033bba4a9ce 100644 --- a/grails-core/src/main/groovy/org/grails/config/NavigableMapPropertySource.groovy +++ b/grails-core/src/main/groovy/org/grails/config/NavigableMapPropertySource.groovy @@ -19,11 +19,11 @@ package org.grails.config import groovy.transform.CompileStatic + import org.springframework.boot.origin.OriginTrackedValue import org.springframework.core.env.MapPropertySource import org.springframework.util.StringUtils - /** * A {@link org.springframework.core.env.PropertySource} that doesn't return values for navigable submaps * @@ -43,7 +43,7 @@ class NavigableMapPropertySource extends MapPropertySource { this.propertyNames = source.keySet().findAll() { key -> !(source.get(key) instanceof NavigableMap) } as String[] - navigablePropertyNames = StringUtils.toStringArray(source.keySet()); + navigablePropertyNames = StringUtils.toStringArray(source.keySet()) } @Override @@ -55,8 +55,8 @@ class NavigableMapPropertySource extends MapPropertySource { Object getProperty(String name) { def value = super.getProperty(name) if (value instanceof OriginTrackedValue) { - return ((OriginTrackedValue)value).value - } else if(value instanceof NavigableMap || value instanceof NavigableMap.NullSafeNavigator) { + return ((OriginTrackedValue) value).value + } else if (value instanceof NavigableMap || value instanceof NavigableMap.NullSafeNavigator) { return null } return value diff --git a/grails-core/src/main/groovy/org/grails/config/PrefixedConfig.java b/grails-core/src/main/groovy/org/grails/config/PrefixedConfig.java index 7d3058dfa17..4ef0ee69f24 100644 --- a/grails-core/src/main/groovy/org/grails/config/PrefixedConfig.java +++ b/grails-core/src/main/groovy/org/grails/config/PrefixedConfig.java @@ -18,9 +18,18 @@ */ package org.grails.config; -import grails.config.Config; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; -import java.util.*; +import grails.config.Config; /** * A config that accepts a prefix @@ -64,7 +73,7 @@ public int hashCode() { @Deprecated public Map flatten() { Map flattened = delegate.flatten(); - Map map = new LinkedHashMap(flattened.size()); + Map map = new LinkedHashMap<>(flattened.size()); for (String key : flattened.keySet()) { map.put(formulateKey(key), flattened.get(key)); } @@ -79,7 +88,6 @@ public Properties toProperties() { return properties; } - @Override public Object getAt(Object key) { return get(key); @@ -87,7 +95,7 @@ public Object getAt(Object key) { @Override public Object navigate(String... path) { - List tokens = new ArrayList(); + List tokens = new ArrayList<>(); tokens.addAll(Arrays.asList(prefixTokens)); tokens.addAll(Arrays.asList(path)); return delegate.navigate(tokens.toArray(new String[tokens.size()])); @@ -126,7 +134,7 @@ public Object get(Object key) { @Override public Set keySet() { Set keys = delegate.keySet(); - Set newKeys = new HashSet(); + Set newKeys = new HashSet<>(); for (String key : keys) { newKeys.add(formulateKey(key)); } @@ -141,9 +149,9 @@ public Collection values() { @Override public Set> entrySet() { final Set> entries = delegate.entrySet(); - Set> newEntries = new HashSet>(); + Set> newEntries = new HashSet<>(); for (final Entry entry : entries) { - newEntries.add(new Entry() { + newEntries.add(new Entry<>() { @Override public String getKey() { return formulateKey(entry.getKey()); @@ -233,7 +241,6 @@ public void clear() { throw new UnsupportedOperationException("Config cannot be modified"); } - @Override public Config merge(Map toMerge) { throw new UnsupportedOperationException("Config cannot be modified"); @@ -241,7 +248,7 @@ public Config merge(Map toMerge) { @Override public T getProperty(String key, Class targetType, T defaultValue, List allowedValues) { - return delegate.getProperty(key,targetType,defaultValue,allowedValues); + return delegate.getProperty(key, targetType, defaultValue, allowedValues); } @Override diff --git a/grails-core/src/main/groovy/org/grails/config/PrefixedMapPropertySource.groovy b/grails-core/src/main/groovy/org/grails/config/PrefixedMapPropertySource.groovy index 8e36d4d5af6..484774b0371 100644 --- a/grails-core/src/main/groovy/org/grails/config/PrefixedMapPropertySource.groovy +++ b/grails-core/src/main/groovy/org/grails/config/PrefixedMapPropertySource.groovy @@ -19,6 +19,7 @@ package org.grails.config import groovy.transform.CompileStatic + import org.springframework.core.env.EnumerablePropertySource /** @@ -30,12 +31,13 @@ import org.springframework.core.env.EnumerablePropertySource @CompileStatic class PrefixedMapPropertySource extends EnumerablePropertySource { + final EnumerablePropertySource source final String prefix final String[] propertyNames PrefixedMapPropertySource(String prefix, EnumerablePropertySource source) { - super(prefix + "_" + source.getName()) + super(prefix + '_' + source.getName()) this.prefix = prefix this.source = source this.propertyNames = source.propertyNames.collect() { String n -> "${prefix}.$n".toString() } as String[] diff --git a/grails-core/src/main/groovy/org/grails/config/PropertySourcesConfig.java b/grails-core/src/main/groovy/org/grails/config/PropertySourcesConfig.java index dc58d0f06bc..2b941ef5b22 100644 --- a/grails-core/src/main/groovy/org/grails/config/PropertySourcesConfig.java +++ b/grails-core/src/main/groovy/org/grails/config/PropertySourcesConfig.java @@ -18,9 +18,15 @@ */ package org.grails.config; -import grails.util.GrailsStringUtils; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + import groovy.util.ConfigObject; import org.codehaus.groovy.runtime.DefaultGroovyMethods; + import org.springframework.core.convert.support.ConfigurableConversionService; import org.springframework.core.env.EnumerablePropertySource; import org.springframework.core.env.MapPropertySource; @@ -29,11 +35,7 @@ import org.springframework.core.env.PropertySources; import org.springframework.core.env.PropertySourcesPropertyResolver; -import java.util.ArrayList; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; +import grails.util.GrailsStringUtils; /** * @author Graeme Rocher @@ -44,7 +46,6 @@ public class PropertySourcesConfig extends NavigableMapConfig { protected PropertySources propertySources; protected PropertySourcesPropertyResolver propertySourcesPropertyResolver; - public PropertySourcesConfig(PropertySources propertySources) { this.propertySources = propertySources; this.propertySourcesPropertyResolver = new PropertySourcesPropertyResolver(propertySources); @@ -66,6 +67,7 @@ public PropertySourcesConfig(Map mapPropertySource) { this.propertySourcesPropertyResolver = new PropertySourcesPropertyResolver(propertySources); initializeFromPropertySources(propertySources); } + public PropertySourcesConfig(PropertySource propertySource) { MutablePropertySources mutablePropertySources = new MutablePropertySources(); mutablePropertySources.addFirst(propertySource); @@ -73,6 +75,7 @@ public PropertySourcesConfig(PropertySource propertySource) { this.propertySourcesPropertyResolver = new PropertySourcesPropertyResolver(propertySources); initializeFromPropertySources(propertySources); } + public PropertySources getPropertySources() { return propertySources; } @@ -84,20 +87,20 @@ public void refresh() { protected void initializeFromPropertySources(PropertySources propertySources) { EnvironmentAwarePropertySource environmentAwarePropertySource = new EnvironmentAwarePropertySource(propertySources); - if(propertySources instanceof MutablePropertySources) { + if (propertySources instanceof MutablePropertySources) { final String applicationConfig = "applicationConfigurationProperties"; if (propertySources.contains(applicationConfig)) { - ((MutablePropertySources)propertySources).addBefore(applicationConfig, environmentAwarePropertySource); + ((MutablePropertySources) propertySources).addBefore(applicationConfig, environmentAwarePropertySource); } else { - ((MutablePropertySources)propertySources).addLast(environmentAwarePropertySource); + ((MutablePropertySources) propertySources).addLast(environmentAwarePropertySource); } } List> propertySourceList = DefaultGroovyMethods.toList(propertySources); Collections.reverse(propertySourceList); - for(PropertySource propertySource : propertySourceList) { - if(propertySource instanceof EnumerablePropertySource) { - EnumerablePropertySource enumerablePropertySource = (EnumerablePropertySource)propertySource; + for (PropertySource propertySource : propertySourceList) { + if (propertySource instanceof EnumerablePropertySource) { + EnumerablePropertySource enumerablePropertySource = (EnumerablePropertySource) propertySource; mergeEnumerablePropertySource(enumerablePropertySource); } } @@ -107,7 +110,7 @@ private void mergeEnumerablePropertySource(EnumerablePropertySource enumerablePr if (enumerablePropertySource instanceof NavigableMapPropertySource) { configMap.merge(((NavigableMapPropertySource) enumerablePropertySource).getSource(), false); } else { - Map map = new LinkedHashMap(); + Map map = new LinkedHashMap<>(); final String[] propertyNames = enumerablePropertySource.getPropertyNames(); for (String propertyName : propertyNames) { @@ -129,13 +132,13 @@ private Object processAndEvaluate(Object value) { value = resolvePlaceholders(value.toString()); } else if (value instanceof List) { List result = new ArrayList<>(); - for (Object element : (List)value) { + for (Object element : (List) value) { result.add(processAndEvaluate(element)); } return result; } else if (value instanceof Map) { Map result = new LinkedHashMap<>(); - for (Object key : ((Map)value).keySet()) { + for (Object key : ((Map) value).keySet()) { result.put(key, processAndEvaluate(((Map) value).get(key))); } return result; @@ -154,7 +157,7 @@ public void setConversionService(ConfigurableConversionService conversionService @Override public String resolvePlaceholders(String text) { - if(!GrailsStringUtils.isBlank(text)) { + if (!GrailsStringUtils.isBlank(text)) { return propertySourcesPropertyResolver.resolvePlaceholders(text); } return text; @@ -164,6 +167,4 @@ public String resolvePlaceholders(String text) { public String resolveRequiredPlaceholders(String text) throws IllegalArgumentException { return propertySourcesPropertyResolver.resolveRequiredPlaceholders(text); } - - } diff --git a/grails-core/src/main/groovy/org/grails/config/yaml/YamlPropertySourceLoader.java b/grails-core/src/main/groovy/org/grails/config/yaml/YamlPropertySourceLoader.java index 2d612dddd77..2a855b3d793 100644 --- a/grails-core/src/main/groovy/org/grails/config/yaml/YamlPropertySourceLoader.java +++ b/grails-core/src/main/groovy/org/grails/config/yaml/YamlPropertySourceLoader.java @@ -18,11 +18,14 @@ */ package org.grails.config.yaml; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.stream.Collectors; -import grails.plugins.GrailsPlugin; -import grails.util.Environment; -import org.grails.config.NavigableMap; -import org.grails.config.NavigableMapPropertySource; import org.springframework.beans.factory.config.YamlProcessor; import org.springframework.boot.env.PropertySourceLoader; import org.springframework.core.Ordered; @@ -30,9 +33,10 @@ import org.springframework.core.env.PropertySource; import org.springframework.core.io.Resource; -import java.io.IOException; -import java.util.*; -import java.util.stream.Collectors; +import grails.plugins.GrailsPlugin; +import grails.util.Environment; +import org.grails.config.NavigableMap; +import org.grails.config.NavigableMapPropertySource; /** * Replacement for Spring Boot's YAML loader that uses Grails' NavigableMap. @@ -85,12 +89,11 @@ public List> load(String name, Resource resource, List propertySource.merge(map, true); }); propertySources.add( - new NavigableMapPropertySource(name ,propertySource)); + new NavigableMapPropertySource(name, propertySource)); return propertySources; } - public List> load() { final List> result = new ArrayList<>(); process((properties, map) -> result.add(getFlattenedMap(map))); diff --git a/grails-core/src/main/groovy/org/grails/core/AbstractGrailsApplication.java b/grails-core/src/main/groovy/org/grails/core/AbstractGrailsApplication.java index efd24eff04d..8b93aaa1c03 100644 --- a/grails-core/src/main/groovy/org/grails/core/AbstractGrailsApplication.java +++ b/grails-core/src/main/groovy/org/grails/core/AbstractGrailsApplication.java @@ -18,16 +18,9 @@ */ package org.grails.core; -import grails.config.Config; -import grails.core.ArtefactHandler; -import grails.core.GrailsApplication; -import grails.core.support.GrailsConfigurationAware; -import grails.util.Environment; -import grails.util.Holders; -import grails.util.Metadata; import groovy.lang.GroovyObjectSupport; import groovy.util.ConfigObject; -import org.grails.config.PropertySourcesConfig; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanClassLoaderAware; import org.springframework.context.ApplicationContext; @@ -39,6 +32,15 @@ import org.springframework.core.Ordered; import org.springframework.util.ClassUtils; +import grails.config.Config; +import grails.core.ArtefactHandler; +import grails.core.GrailsApplication; +import grails.core.support.GrailsConfigurationAware; +import grails.util.Environment; +import grails.util.Holders; +import grails.util.Metadata; +import org.grails.config.PropertySourcesConfig; + public abstract class AbstractGrailsApplication extends GroovyObjectSupport implements GrailsApplication, ApplicationContextAware, BeanClassLoaderAware, SmartApplicationListener { protected ClassLoader classLoader; protected Config config; diff --git a/grails-core/src/main/groovy/org/grails/core/AbstractGrailsClass.java b/grails-core/src/main/groovy/org/grails/core/AbstractGrailsClass.java index 71509ee9cff..760f80cb2bc 100644 --- a/grails-core/src/main/groovy/org/grails/core/AbstractGrailsClass.java +++ b/grails-core/src/main/groovy/org/grails/core/AbstractGrailsClass.java @@ -18,28 +18,30 @@ */ package org.grails.core; -import grails.core.GrailsApplication; -import grails.core.GrailsClass; -import grails.plugins.GrailsVersionUtils; -import grails.util.GrailsMetaClassUtils; -import grails.util.GrailsNameUtils; -import grails.web.Action; +import java.lang.reflect.Constructor; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.List; + import groovy.lang.GroovyObject; import groovy.lang.MetaClass; import groovy.lang.MetaProperty; -import org.grails.core.exceptions.NewInstanceCreationException; -import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; + import org.springframework.beans.BeanUtils; import org.springframework.util.Assert; import org.springframework.util.ClassUtils; import org.springframework.util.ReflectionUtils; import org.springframework.util.StringUtils; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.List; +import grails.core.GrailsApplication; +import grails.core.GrailsClass; +import grails.plugins.GrailsVersionUtils; +import grails.util.GrailsMetaClassUtils; +import grails.util.GrailsNameUtils; +import grails.web.Action; +import org.grails.core.exceptions.NewInstanceCreationException; +import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; /** * Abstract base class for Grails types that provides common functionality for @@ -122,7 +124,7 @@ public Object newInstance() { catch (Exception e) { Throwable targetException; if (e instanceof InvocationTargetException) { - targetException = ((InvocationTargetException)e).getTargetException(); + targetException = ((InvocationTargetException) e).getTargetException(); } else { targetException = e; @@ -159,14 +161,13 @@ public String getPackageName() { public Object getReferenceInstance() { Object obj = BeanUtils.instantiateClass(clazz); if (obj instanceof GroovyObject) { - ((GroovyObject)obj).setMetaClass(getMetaClass()); + ((GroovyObject) obj).setMetaClass(getMetaClass()); } return obj; } - private ClassPropertyFetcher resolvePropertyFetcher() { - if(classPropertyFetcher == null) { + if (classPropertyFetcher == null) { classPropertyFetcher = ClassPropertyFetcher.forClass(clazz); } return classPropertyFetcher; @@ -185,7 +186,7 @@ public boolean isReadableProperty(String propName) { } public boolean isActionMethod(String methodName) { - Method m = ReflectionUtils.findMethod(getClazz(), methodName, new Class[0]); + Method m = ReflectionUtils.findMethod(getClazz(), methodName, new Class[0]); if (m != null) { ReflectionUtils.makeAccessible(m); } @@ -204,7 +205,6 @@ public boolean hasMetaProperty(String propName) { return (getMetaClass().getMetaProperty(propName) != null); } - /** *

Looks for a property of the reference instance with a given name and type.

*

If found its value is returned. We follow the Java bean conventions with augmentation for groovy support @@ -244,12 +244,10 @@ public T getPropertyValue(String propName, Class type) { return ClassPropertyFetcher.getStaticPropertyValue(getClazz(), propName, type); } - public Object getPropertyValueObject(String propertyNAme) { return getPropertyValue(propertyNAme, Object.class); } - /* (non-Javadoc) * @see grails.core.GrailsClass#getPropertyValue(java.lang.String) */ diff --git a/grails-core/src/main/groovy/org/grails/core/DefaultGrailsControllerClass.java b/grails-core/src/main/groovy/org/grails/core/DefaultGrailsControllerClass.java index db80a7c582a..e1709bf86ce 100644 --- a/grails-core/src/main/groovy/org/grails/core/DefaultGrailsControllerClass.java +++ b/grails-core/src/main/groovy/org/grails/core/DefaultGrailsControllerClass.java @@ -18,21 +18,26 @@ */ package org.grails.core; +import java.lang.invoke.MethodHandle; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.MethodType; +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; + +import groovy.lang.GroovyObject; + +import org.springframework.util.ReflectionUtils; + import grails.config.Settings; import grails.core.GrailsApplication; import grails.core.GrailsControllerClass; import grails.util.Environment; import grails.web.Action; import grails.web.UrlConverter; -import groovy.lang.GroovyObject; -import org.springframework.util.ReflectionUtils; - -import java.lang.invoke.MethodHandle; -import java.lang.invoke.MethodHandles; -import java.lang.invoke.MethodType; -import java.lang.reflect.Method; -import java.lang.reflect.Modifier; -import java.util.*; /** * Evaluates the conventions contained within controllers to perform auto-configuration. @@ -52,11 +57,11 @@ public class DefaultGrailsControllerClass extends AbstractInjectableGrailsClass public static final String SCOPE = "scope"; public static final String SCOPE_SINGLETON = "singleton"; private String scope; - private Map actions = new HashMap(); + private Map actions = new HashMap<>(); private String defaultActionName; private String namespace; - protected Map actionUriToViewName = new HashMap(); - + protected Map actionUriToViewName = new HashMap<>(); + public DefaultGrailsControllerClass(Class clazz) { super(clazz, CONTROLLER); namespace = getStaticPropertyValue(NAMESPACE_PROPERTY, String.class); @@ -112,7 +117,7 @@ private void methodStrategy(Map methodNames) { for (Method method : superClass.getMethods()) { if (Modifier.isPublic(method.getModifiers()) && method.getAnnotation(Action.class) != null) { String methodName = method.getName(); - if(Environment.isDevelopmentMode()) { + if (Environment.isDevelopmentMode()) { methodNames.put(methodName, new ReflectionInvoker(method)); } else { @@ -137,14 +142,14 @@ private void methodStrategy(Map methodNames) { @Override public boolean mapsToURI(String uri) { - if(uri.startsWith("/")) { + if (uri.startsWith("/")) { String[] tokens = uri.substring(1).split("\\/"); - if(tokens.length>0) { + if (tokens.length > 0) { String controllerName = tokens[0]; - if(getLogicalPropertyName().equals(controllerName)) { - if(tokens.length>1) { + if (getLogicalPropertyName().equals(controllerName)) { + if (tokens.length > 1) { String actionName = tokens[1]; - if(actions.containsKey(actionName) || defaultActionName.equals(actionName)) { + if (actions.containsKey(actionName) || defaultActionName.equals(actionName)) { return true; } } @@ -164,9 +169,9 @@ public boolean mapsToURI(String uri) { */ @Override public void registerUrlConverter(UrlConverter urlConverter) { - for (String actionName : new ArrayList(actions.keySet())) { + for (String actionName : new ArrayList<>(actions.keySet())) { actionUriToViewName.put(urlConverter.toUrlElement(actionName), actionName); - actions.put( urlConverter.toUrlElement(actionName), actions.remove(actionName)); + actions.put(urlConverter.toUrlElement(actionName), actions.remove(actionName)); } defaultActionName = urlConverter.toUrlElement(defaultActionName); } @@ -181,9 +186,9 @@ public void registerUrlConverter(UrlConverter urlConverter) { */ @Override public Object invoke(Object controller, String action) throws Throwable { - if(action == null) action = this.defaultActionName; + if (action == null) action = this.defaultActionName; ActionInvoker handle = actions.get(action); - if(handle == null) throw new IllegalArgumentException("Invalid action name: " + action); + if (handle == null) throw new IllegalArgumentException("Invalid action name: " + action); return handle.invoke(controller); } @@ -210,6 +215,7 @@ public Object invoke(Object controller) throws Throwable { return method.invoke(controller); } } + private class MethodHandleInvoker implements ActionInvoker { private final MethodHandle handle; @@ -218,7 +224,7 @@ public MethodHandleInvoker(MethodHandle handle) { } @Override - public Object invoke(Object controller) throws Throwable{ + public Object invoke(Object controller) throws Throwable { return handle.invoke(controller); } } diff --git a/grails-core/src/main/groovy/org/grails/core/DefaultGrailsDomainClass.java b/grails-core/src/main/groovy/org/grails/core/DefaultGrailsDomainClass.java index 6bbf1a612fa..6fd611cebc6 100644 --- a/grails-core/src/main/groovy/org/grails/core/DefaultGrailsDomainClass.java +++ b/grails-core/src/main/groovy/org/grails/core/DefaultGrailsDomainClass.java @@ -18,6 +18,15 @@ */ package org.grails.core; +import java.util.Collections; +import java.util.Map; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.util.ClassUtils; +import org.springframework.validation.Validator; + import grails.core.GrailsDomainClass; import grails.util.GrailsNameUtils; import grails.validation.Constrained; @@ -27,12 +36,6 @@ import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.validation.discovery.ConstrainedDiscovery; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.util.ClassUtils; -import org.springframework.validation.Validator; - -import java.util.*; /** * Default implementation of the {@link GrailsDomainClass} interface @@ -46,7 +49,6 @@ public class DefaultGrailsDomainClass extends AbstractGrailsClass implements Gra private static final Logger log = LoggerFactory.getLogger(DefaultGrailsDomainClass.class); - private PersistentEntity persistentEntity; private MappingContext mappingContext; private Map constrainedProperties; @@ -66,7 +68,6 @@ public DefaultGrailsDomainClass(Class clazz) { super(clazz, ""); } - private void verifyContextIsInitialized() { if (mappingContext == null) { throw new GrailsConfigurationException("That API cannot be accessed before the spring context is initialized"); @@ -78,7 +79,7 @@ private void verifyContextIsInitialized() { persistentEntity = mappingContext.getPersistentEntity(this.getFullName()); if (persistentEntity == null) { MappingContext concreteMappingContext = getApplication().getMappingContext(); - if(concreteMappingContext.getClass() == KeyValueMappingContext.class) { + if (concreteMappingContext.getClass() == KeyValueMappingContext.class) { // In a unit testing context, allow persistentEntity = concreteMappingContext.addPersistentEntity(getClazz()); } @@ -92,7 +93,7 @@ private void verifyContextIsInitialized() { @Override public boolean isAutowire() { - if(autowire == null) { + if (autowire == null) { verifyContextIsInitialized(); autowire = persistentEntity.getMapping().getMappedForm().isAutowire(); } @@ -128,9 +129,9 @@ public String getPropertyName() { @Override public Map getConstrainedProperties() { verifyContextIsInitialized(); - if(constrainedProperties == null) { + if (constrainedProperties == null) { ConstrainedDiscovery constrainedDiscovery = GrailsFactoriesLoader.loadFactory(ConstrainedDiscovery.class); - if(constrainedDiscovery == null) { + if (constrainedDiscovery == null) { constrainedProperties = Collections.emptyMap(); } else { diff --git a/grails-core/src/main/groovy/org/grails/core/DefaultGrailsUrlMappingsClass.java b/grails-core/src/main/groovy/org/grails/core/DefaultGrailsUrlMappingsClass.java index ca39838b624..f75d814226e 100644 --- a/grails-core/src/main/groovy/org/grails/core/DefaultGrailsUrlMappingsClass.java +++ b/grails-core/src/main/groovy/org/grails/core/DefaultGrailsUrlMappingsClass.java @@ -18,12 +18,13 @@ */ package org.grails.core; -import grails.core.GrailsUrlMappingsClass; -import groovy.lang.Closure; - import java.util.ArrayList; import java.util.List; +import groovy.lang.Closure; + +import grails.core.GrailsUrlMappingsClass; + public class DefaultGrailsUrlMappingsClass extends AbstractGrailsClass implements GrailsUrlMappingsClass { public static final String URL_MAPPINGS = "UrlMappings"; @@ -38,7 +39,7 @@ public DefaultGrailsUrlMappingsClass(Class clazz) { public Closure getMappingsClosure() { Closure result = getStaticPropertyValue(MAPPINGS_CLOSURE, Closure.class); if (result == null) { - throw new RuntimeException(MAPPINGS_CLOSURE + " closure does not exists for class " + getClazz().getName()); + throw new RuntimeException(MAPPINGS_CLOSURE + " closure does not exists for class " + getClazz().getName()); } return result; } diff --git a/grails-core/src/main/groovy/org/grails/core/artefact/AnnotationDomainClassArtefactHandler.java b/grails-core/src/main/groovy/org/grails/core/artefact/AnnotationDomainClassArtefactHandler.java index 35288876e16..fd937ff89b0 100644 --- a/grails-core/src/main/groovy/org/grails/core/artefact/AnnotationDomainClassArtefactHandler.java +++ b/grails-core/src/main/groovy/org/grails/core/artefact/AnnotationDomainClassArtefactHandler.java @@ -33,7 +33,7 @@ public class AnnotationDomainClassArtefactHandler extends DomainClassArtefactHan private static final String JPA_MAPPING_STRATEGY = "JPA"; - private Set jpaClassNames = new HashSet(); + private Set jpaClassNames = new HashSet<>(); public Set getJpaClassNames() { return jpaClassNames; diff --git a/grails-core/src/main/groovy/org/grails/core/artefact/ApplicationArtefactHandler.groovy b/grails-core/src/main/groovy/org/grails/core/artefact/ApplicationArtefactHandler.groovy index 95f224f30a4..541a096e6ea 100644 --- a/grails-core/src/main/groovy/org/grails/core/artefact/ApplicationArtefactHandler.groovy +++ b/grails-core/src/main/groovy/org/grails/core/artefact/ApplicationArtefactHandler.groovy @@ -18,12 +18,13 @@ */ package org.grails.core.artefact +import groovy.transform.CompileStatic +import org.codehaus.groovy.ast.ClassNode + import grails.boot.config.GrailsAutoConfiguration import grails.core.ArtefactHandlerAdapter import grails.core.DefaultGrailsClass import grails.core.GrailsClass -import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.ClassNode import org.grails.compiler.injection.GrailsASTUtils /** @@ -36,7 +37,7 @@ import org.grails.compiler.injection.GrailsASTUtils class ApplicationArtefactHandler extends ArtefactHandlerAdapter { public static final ClassNode AUTO_CONFIGURATION_CLASS_NODE = new ClassNode(GrailsAutoConfiguration) - public static final String TYPE = "Application" + public static final String TYPE = 'Application' ApplicationArtefactHandler() { super(TYPE, GrailsClass, DefaultGrailsClass, null, false) @@ -48,7 +49,7 @@ class ApplicationArtefactHandler extends ArtefactHandlerAdapter { } @Override - boolean isArtefactClass(@SuppressWarnings("rawtypes") Class clazz) { + boolean isArtefactClass(@SuppressWarnings('rawtypes') Class clazz) { GrailsAutoConfiguration.isAssignableFrom(clazz) && clazz.simpleName.endsWith('Application') } } diff --git a/grails-core/src/main/groovy/org/grails/core/artefact/ControllerArtefactHandler.java b/grails-core/src/main/groovy/org/grails/core/artefact/ControllerArtefactHandler.java index a1ac7c0c943..fe7e17d4372 100644 --- a/grails-core/src/main/groovy/org/grails/core/artefact/ControllerArtefactHandler.java +++ b/grails-core/src/main/groovy/org/grails/core/artefact/ControllerArtefactHandler.java @@ -18,9 +18,7 @@ */ package org.grails.core.artefact; -import org.grails.core.AbstractGrailsClass; import grails.core.ArtefactHandlerAdapter; -import grails.core.GrailsClass; import grails.core.GrailsControllerClass; import org.grails.core.DefaultGrailsControllerClass; @@ -47,6 +45,4 @@ public ControllerArtefactHandler() { public String getPluginName() { return PLUGIN_NAME; } - - } diff --git a/grails-core/src/main/groovy/org/grails/core/artefact/DomainClassArtefactHandler.java b/grails-core/src/main/groovy/org/grails/core/artefact/DomainClassArtefactHandler.java index 63babbcb489..aa857bcacfd 100644 --- a/grails-core/src/main/groovy/org/grails/core/artefact/DomainClassArtefactHandler.java +++ b/grails-core/src/main/groovy/org/grails/core/artefact/DomainClassArtefactHandler.java @@ -18,25 +18,27 @@ */ package org.grails.core.artefact; +import java.io.IOException; +import java.lang.annotation.Annotation; +import java.net.URL; + +import groovy.lang.Closure; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.InnerClassNode; + +import org.springframework.core.Ordered; + import grails.artefact.Artefact; import grails.core.ArtefactHandlerAdapter; import grails.core.GrailsApplication; import grails.core.GrailsClass; import grails.core.GrailsDomainClass; import grails.core.support.GrailsApplicationAware; -import groovy.lang.Closure; -import org.codehaus.groovy.ast.ClassNode; -import org.codehaus.groovy.ast.InnerClassNode; import org.grails.compiler.injection.GrailsASTUtils; import org.grails.core.DefaultGrailsDomainClass; import org.grails.datastore.mapping.model.MappingContext; import org.grails.io.support.GrailsResourceUtils; import org.grails.io.support.Resource; -import org.springframework.core.Ordered; - -import java.io.IOException; -import java.lang.annotation.Annotation; -import java.net.URL; /** * Evaluates the conventions that define a domain class in Grails. @@ -48,7 +50,7 @@ public class DomainClassArtefactHandler extends ArtefactHandlerAdapter implement public static final String TYPE = "Domain"; public static final String PLUGIN_NAME = "domainClass"; - private static final String ENTITY_ANN_NAME = "Entity"; + private static final String ENTITY_ANN_NAME = "Entity"; private static final String GRAILS_PACKAGE_PREFIX = "grails."; private static final String JAKARTA_PERSISTENCE = "jakarta.persistence"; @@ -86,14 +88,13 @@ protected boolean isValidArtefactClassNode(ClassNode classNode, int modifiers) { return !classNode.isEnum() && !(classNode instanceof InnerClassNode); } - @Override public boolean isArtefact(ClassNode classNode) { - if(classNode == null) return false; - if(!isValidArtefactClassNode(classNode, classNode.getModifiers())) return false; + if (classNode == null) return false; + if (!isValidArtefactClassNode(classNode, classNode.getModifiers())) return false; URL url = GrailsASTUtils.getSourceUrl(classNode); - if(url != null) { + if (url != null) { return GrailsResourceUtils.isDomainClass(url); } else { @@ -109,12 +110,12 @@ public boolean isArtefactClass(Class clazz) { public static boolean isDomainClass(Class clazz, boolean allowProxyClass) { boolean retval = isDomainClass(clazz); - if(!retval && allowProxyClass && clazz != null && clazz.getSimpleName().contains("$")) { + if (!retval && allowProxyClass && clazz != null && clazz.getSimpleName().contains("$")) { retval = isDomainClass(clazz.getSuperclass()); } return retval; } - + public static boolean isDomainClass(Class clazz) { return clazz != null && doIsDomainClassCheck(clazz); @@ -134,7 +135,7 @@ private static boolean doIsDomainClassCheck(Class clazz) { // happens if a reference to a class that no longer exists is there } - if( artefactAnn != null && artefactAnn.value().equals(DomainClassArtefactHandler.TYPE) ) { + if (artefactAnn != null && artefactAnn.value().equals(DomainClassArtefactHandler.TYPE)) { return true; } @@ -151,7 +152,7 @@ private static boolean doIsDomainClassCheck(Class clazz) { String annName = annType.getSimpleName(); String pkgName = annType.getPackage().getName(); - if(ENTITY_ANN_NAME.equals(annName) && pkgName.startsWith(GRAILS_PACKAGE_PREFIX) || pkgName.startsWith(JAKARTA_PERSISTENCE)) { + if (ENTITY_ANN_NAME.equals(annName) && pkgName.startsWith(GRAILS_PACKAGE_PREFIX) || pkgName.startsWith(JAKARTA_PERSISTENCE)) { return true; } } diff --git a/grails-core/src/main/groovy/org/grails/core/cfg/CustomSafeConstructor.groovy b/grails-core/src/main/groovy/org/grails/core/cfg/CustomSafeConstructor.groovy index 09ac2b95e3f..e47a4a3a581 100644 --- a/grails-core/src/main/groovy/org/grails/core/cfg/CustomSafeConstructor.groovy +++ b/grails-core/src/main/groovy/org/grails/core/cfg/CustomSafeConstructor.groovy @@ -19,13 +19,14 @@ package org.grails.core.cfg import groovy.transform.Internal + import org.yaml.snakeyaml.LoaderOptions +import org.yaml.snakeyaml.constructor.Construct import org.yaml.snakeyaml.constructor.SafeConstructor import org.yaml.snakeyaml.nodes.MappingNode +import org.yaml.snakeyaml.nodes.Node import org.yaml.snakeyaml.nodes.SequenceNode import org.yaml.snakeyaml.nodes.Tag -import org.yaml.snakeyaml.constructor.Construct -import org.yaml.snakeyaml.nodes.Node /** * Yaml constructor to create containers with sensible @@ -64,4 +65,4 @@ class CustomSafeConstructor extends SafeConstructor { @Override void construct2ndStep(Node node, Object data) {} } -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/org/grails/core/cfg/GroovyConfigPropertySourceLoader.groovy b/grails-core/src/main/groovy/org/grails/core/cfg/GroovyConfigPropertySourceLoader.groovy index 6cdace651b0..f7665721bb1 100644 --- a/grails-core/src/main/groovy/org/grails/core/cfg/GroovyConfigPropertySourceLoader.groovy +++ b/grails-core/src/main/groovy/org/grails/core/cfg/GroovyConfigPropertySourceLoader.groovy @@ -16,18 +16,19 @@ */ package org.grails.core.cfg -import grails.util.BuildSettings -import grails.util.Environment -import grails.util.Metadata import groovy.transform.CompileStatic import groovy.util.logging.Slf4j -import org.grails.config.NavigableMap -import org.grails.config.NavigableMapPropertySource -import org.grails.core.exceptions.GrailsConfigurationException + import org.springframework.boot.env.PropertySourceLoader import org.springframework.core.env.PropertySource import org.springframework.core.io.Resource +import grails.util.Environment +import grails.util.Metadata +import org.grails.config.NavigableMap +import org.grails.config.NavigableMapPropertySource +import org.grails.core.exceptions.GrailsConfigurationException + /** * Adds support for defining a 'application.groovy' file in ConfigSlurper format in order to configure Spring Boot within Grails * @@ -50,25 +51,25 @@ class GroovyConfigPropertySourceLoader implements PropertySourceLoader { if (!loadedFiles.contains(name)) { def env = Environment.current.name - if(resource.exists()) { + if (resource.exists()) { ConfigSlurper configSlurper = env ? new ConfigSlurper(env) : new ConfigSlurper() configSlurper.setBinding(userHome: System.getProperty('user.home'), appName: Metadata.getCurrent().getApplicationName(), - appVersion: Metadata.getCurrent().getApplicationVersion() ) + appVersion: Metadata.getCurrent().getApplicationVersion()) try { def configObject = configSlurper.parse(resource.URL) - for(key in filteredKeys) { + for (key in filteredKeys) { configObject.remove(key) } def propertySource = new NavigableMap() propertySource.merge(configObject, false) - Resource runtimeResource = resource.createRelative( resource.filename.replace('application', 'runtime') ) - if(runtimeResource.exists()) { - def runtimeConfig = configSlurper.parse( runtimeResource.getURL() ) + Resource runtimeResource = resource.createRelative(resource.filename.replace('application', 'runtime')) + if (runtimeResource.exists()) { + def runtimeConfig = configSlurper.parse(runtimeResource.getURL()) propertySource.merge(runtimeConfig, false) } final NavigableMapPropertySource navigableMapPropertySource = new NavigableMapPropertySource(name, propertySource) diff --git a/grails-core/src/main/groovy/org/grails/core/exceptions/DefaultErrorsPrinter.groovy b/grails-core/src/main/groovy/org/grails/core/exceptions/DefaultErrorsPrinter.groovy index ff97ad72b8e..ccbae3399ec 100644 --- a/grails-core/src/main/groovy/org/grails/core/exceptions/DefaultErrorsPrinter.groovy +++ b/grails-core/src/main/groovy/org/grails/core/exceptions/DefaultErrorsPrinter.groovy @@ -20,12 +20,14 @@ package org.grails.core.exceptions import org.codehaus.groovy.control.MultipleCompilationErrorsException import org.codehaus.groovy.control.messages.SyntaxErrorMessage + +import org.springframework.core.io.FileSystemResource +import org.springframework.core.io.Resource + import org.grails.core.io.ResourceLocator import org.grails.exceptions.reporting.CodeSnippetPrinter import org.grails.exceptions.reporting.DefaultStackTracePrinter import org.grails.exceptions.reporting.SourceCodeAware -import org.springframework.core.io.FileSystemResource -import org.springframework.core.io.Resource /** * Default implementation of the {@link StackTracePrinter} interface. @@ -94,7 +96,7 @@ class DefaultErrorsPrinter extends DefaultStackTracePrinter implements CodeSnipp if (lineNumbersShown[res.filename].contains(lineNumber)) continue // don't repeat the same lines twice lineNumbersShown[res.filename] << lineNumber - pw.print formatCodeSnippetStart(res, lineNumber, attrs) + pw.print(formatCodeSnippetStart(res, lineNumber, attrs)) def input = null try { input = res.inputStream @@ -109,10 +111,10 @@ class DefaultErrorsPrinter extends DefaultStackTracePrinter implements CodeSnipp if (currentLineNumber in range) { boolean isErrorLine = currentLineNumber == lineNumber if (isErrorLine) { - pw.print formatCodeSnippetErrorLine(currentLineNumber, currentLine, attrs) + pw.print(formatCodeSnippetErrorLine(currentLineNumber, currentLine, attrs)) } else { - pw.print formatCodeSnippetLine(currentLineNumber, currentLine, attrs) + pw.print(formatCodeSnippetLine(currentLineNumber, currentLine, attrs)) } } else if (currentLineNumber > last) { @@ -132,7 +134,7 @@ class DefaultErrorsPrinter extends DefaultStackTracePrinter implements CodeSnipp } catch (e) { // ignore } - pw.print formatCodeSnippetEnd(res, lineNumber) + pw.print(formatCodeSnippetEnd(res, lineNumber)) } } else { @@ -170,7 +172,7 @@ class DefaultErrorsPrinter extends DefaultStackTracePrinter implements CodeSnipp MultipleCompilationErrorsException mcee = start Object message = mcee.getErrorCollector().getErrors().iterator().next() if (message instanceof SyntaxErrorMessage) { - SyntaxErrorMessage sem = (SyntaxErrorMessage)message + SyntaxErrorMessage sem = (SyntaxErrorMessage) message final tmp = new FileSystemResource(sem.getCause().getSourceLocator()) if (tmp.exists()) { res = tmp @@ -195,7 +197,7 @@ class DefaultErrorsPrinter extends DefaultStackTracePrinter implements CodeSnipp MultipleCompilationErrorsException mcee = cause Object message = mcee.getErrorCollector().getErrors().iterator().next() if (message instanceof SyntaxErrorMessage) { - SyntaxErrorMessage sem = (SyntaxErrorMessage)message + SyntaxErrorMessage sem = (SyntaxErrorMessage) message lineNumber = sem.getCause().getLine() } } @@ -203,7 +205,7 @@ class DefaultErrorsPrinter extends DefaultStackTracePrinter implements CodeSnipp } String formatCodeSnippetEnd(Resource resource, int lineNumber) { - "" + '' } @Deprecated diff --git a/grails-core/src/main/groovy/org/grails/core/io/CachingPathMatchingResourcePatternResolver.groovy b/grails-core/src/main/groovy/org/grails/core/io/CachingPathMatchingResourcePatternResolver.groovy index 030fb3d76a0..2b3084fb50e 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/CachingPathMatchingResourcePatternResolver.groovy +++ b/grails-core/src/main/groovy/org/grails/core/io/CachingPathMatchingResourcePatternResolver.groovy @@ -21,6 +21,7 @@ package org.grails.core.io import groovy.transform.CompileStatic import groovy.transform.Memoized + import org.springframework.core.io.Resource import org.springframework.core.io.ResourceLoader import org.springframework.core.io.support.PathMatchingResourcePatternResolver @@ -31,9 +32,10 @@ import org.springframework.core.io.support.PathMatchingResourcePatternResolver */ @CompileStatic class CachingPathMatchingResourcePatternResolver extends PathMatchingResourcePatternResolver { - public static final CachingPathMatchingResourcePatternResolver INSTANCE = new CachingPathMatchingResourcePatternResolver(); - private CachingPathMatchingResourcePatternResolver(){} + public static final CachingPathMatchingResourcePatternResolver INSTANCE = new CachingPathMatchingResourcePatternResolver() + + private CachingPathMatchingResourcePatternResolver() {} CachingPathMatchingResourcePatternResolver(ResourceLoader parent) { super(parent) diff --git a/grails-core/src/main/groovy/org/grails/core/io/DefaultResourceLocator.java b/grails-core/src/main/groovy/org/grails/core/io/DefaultResourceLocator.java index 328785d9f07..49510e18b54 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/DefaultResourceLocator.java +++ b/grails-core/src/main/groovy/org/grails/core/io/DefaultResourceLocator.java @@ -18,8 +18,6 @@ */ package org.grails.core.io; -import grails.util.Environment; - import java.io.File; import java.io.FileFilter; import java.io.IOException; @@ -29,11 +27,6 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.grails.io.support.GrailsResourceUtils; -import org.grails.plugins.BinaryGrailsPlugin; -import grails.plugins.GrailsPlugin; -import grails.plugins.GrailsPluginManager; -import grails.plugins.PluginManagerAware; import org.springframework.context.ResourceLoaderAware; import org.springframework.core.io.ByteArrayResource; import org.springframework.core.io.FileSystemResourceLoader; @@ -41,6 +34,13 @@ import org.springframework.core.io.ResourceLoader; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import grails.plugins.GrailsPlugin; +import grails.plugins.GrailsPluginManager; +import grails.plugins.PluginManagerAware; +import grails.util.Environment; +import org.grails.io.support.GrailsResourceUtils; +import org.grails.plugins.BinaryGrailsPlugin; + /** * Default ResourceLocator implementation that doesn't take into account servlet loading. * @@ -57,11 +57,11 @@ public class DefaultResourceLocator implements ResourceLocator, ResourceLoaderAw protected static final Resource NULL_RESOURCE = new ByteArrayResource("null".getBytes()); protected PathMatchingResourcePatternResolver patchMatchingResolver; - protected List classSearchDirectories = new ArrayList(); - protected List resourceSearchDirectories = new ArrayList(); - protected Map classNameToResourceCache = new ConcurrentHashMap(); - protected Map uriToResourceCache = new ConcurrentHashMap(); - protected ResourceLoader defaultResourceLoader = new FileSystemResourceLoader(); + protected List classSearchDirectories = new ArrayList<>(); + protected List resourceSearchDirectories = new ArrayList<>(); + protected Map classNameToResourceCache = new ConcurrentHashMap<>(); + protected Map uriToResourceCache = new ConcurrentHashMap<>(); + protected ResourceLoader defaultResourceLoader = new FileSystemResourceLoader(); protected GrailsPluginManager pluginManager; protected boolean warDeployed = Environment.isWarDeployed(); @@ -168,7 +168,7 @@ protected Resource findResourceInBinaryPlugins(PluginResourceInfo info) { String fullPluginName = info.pluginName; for (GrailsPlugin plugin : pluginManager.getAllPlugins()) { if (plugin.getFileSystemName().equals(fullPluginName) && (plugin instanceof BinaryGrailsPlugin)) { - return ((BinaryGrailsPlugin)plugin).getResource(info.uri); + return ((BinaryGrailsPlugin) plugin).getResource(info.uri); } } } @@ -210,7 +210,7 @@ public Resource findResourceForClassName(String className) { private List getSearchPatternForExtension(String classNameWithPathSeparator, String... extensions) { - List searchPatterns = new ArrayList(); + List searchPatterns = new ArrayList<>(); for (String extension : extensions) { String filename = classNameWithPathSeparator + extension; for (String classSearchDirectory : classSearchDirectories) { diff --git a/grails-core/src/main/groovy/org/grails/core/io/GrailsResource.groovy b/grails-core/src/main/groovy/org/grails/core/io/GrailsResource.groovy index 84bee6a1227..f2b2fc3feeb 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/GrailsResource.groovy +++ b/grails-core/src/main/groovy/org/grails/core/io/GrailsResource.groovy @@ -20,6 +20,7 @@ package org.grails.core.io import groovy.transform.CompileStatic + import org.springframework.core.io.Resource /** @@ -29,7 +30,7 @@ import org.springframework.core.io.Resource * @since 3.0 */ @CompileStatic -class GrailsResource implements Resource{ +class GrailsResource implements Resource { org.grails.io.support.Resource resource diff --git a/grails-core/src/main/groovy/org/grails/core/io/MockStringResourceLoader.java b/grails-core/src/main/groovy/org/grails/core/io/MockStringResourceLoader.java index 70eddad6a8c..c6df094de81 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/MockStringResourceLoader.java +++ b/grails-core/src/main/groovy/org/grails/core/io/MockStringResourceLoader.java @@ -18,7 +18,6 @@ */ package org.grails.core.io; -import java.io.UnsupportedEncodingException; import java.nio.charset.StandardCharsets; import java.util.HashMap; import java.util.Map; @@ -33,7 +32,7 @@ */ public class MockStringResourceLoader extends MockResourceLoader { - private Map mockResources = new HashMap(); + private Map mockResources = new HashMap<>(); @Override public Resource getResource(String location) { @@ -54,6 +53,7 @@ public Resource getResource(String location) { public void registerMockResource(String location, Resource res) { mockResources.put(location, res); } + /** * Registers a mock resource with the first argument as the location and the second as the contents * of the resource. diff --git a/grails-core/src/main/groovy/org/grails/core/io/PluginPathAwareFileSystemResourceLoader.java b/grails-core/src/main/groovy/org/grails/core/io/PluginPathAwareFileSystemResourceLoader.java index 704967e80b9..91346b6d89a 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/PluginPathAwareFileSystemResourceLoader.java +++ b/grails-core/src/main/groovy/org/grails/core/io/PluginPathAwareFileSystemResourceLoader.java @@ -18,20 +18,20 @@ */ package org.grails.core.io; +import java.util.Collection; + import org.springframework.core.io.ContextResource; import org.springframework.core.io.FileSystemResource; import org.springframework.core.io.FileSystemResourceLoader; import org.springframework.core.io.Resource; -import java.util.Collection; - /** * FileSystemResourceLoader capable of understanding paths to plugins via the ResourceLocator interface * * @author Graeme Rocher * @since 2.0 */ -public class PluginPathAwareFileSystemResourceLoader extends FileSystemResourceLoader{ +public class PluginPathAwareFileSystemResourceLoader extends FileSystemResourceLoader { public static final String WEB_APP_DIRECTORY = "web-app"; ResourceLocator resourceLocator = new DefaultResourceLocator(); @@ -49,7 +49,7 @@ protected Resource getResourceByPath(String path) { String resourcePath = path; if (resourcePath.startsWith(WEB_APP_DIRECTORY)) { - resourcePath = resourcePath.substring("web-app".length(),resourcePath.length()); + resourcePath = resourcePath.substring("web-app".length(), resourcePath.length()); } Resource res = resourceLocator.findResourceForURI(resourcePath); if (res != null) { diff --git a/grails-core/src/main/groovy/org/grails/core/io/ResourceLocator.java b/grails-core/src/main/groovy/org/grails/core/io/ResourceLocator.java index 0b01be4216a..bc5c40b118b 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/ResourceLocator.java +++ b/grails-core/src/main/groovy/org/grails/core/io/ResourceLocator.java @@ -18,10 +18,10 @@ */ package org.grails.core.io; -import org.springframework.core.io.Resource; - import java.util.Collection; +import org.springframework.core.io.Resource; + /** * Used to locate resources at development or production time. * diff --git a/grails-core/src/main/groovy/org/grails/core/io/SimpleMapResourceLoader.java b/grails-core/src/main/groovy/org/grails/core/io/SimpleMapResourceLoader.java index f94e7ce539a..b450c383d8e 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/SimpleMapResourceLoader.java +++ b/grails-core/src/main/groovy/org/grails/core/io/SimpleMapResourceLoader.java @@ -18,12 +18,12 @@ */ package org.grails.core.io; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; - import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; + /** * Simple implementation of the ResourceLoader interface that uses a Map to load resources. * @@ -32,7 +32,7 @@ */ public class SimpleMapResourceLoader implements ResourceLoader { - private Map resources = new ConcurrentHashMap(); + private Map resources = new ConcurrentHashMap<>(); public Map getResources() { return resources; diff --git a/grails-core/src/main/groovy/org/grails/core/io/SpringResource.java b/grails-core/src/main/groovy/org/grails/core/io/SpringResource.java index 7a330a057b6..5d82292f9f9 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/SpringResource.java +++ b/grails-core/src/main/groovy/org/grails/core/io/SpringResource.java @@ -18,21 +18,21 @@ */ package org.grails.core.io; -import org.grails.io.support.Resource; - import java.io.File; import java.io.IOException; import java.io.InputStream; import java.net.URI; import java.net.URL; +import org.grails.io.support.Resource; + /** * Bridges Grails and Spring Resource APIs * * @author Graeme Rocher * @since 2.2 */ -public class SpringResource implements Resource{ +public class SpringResource implements Resource { org.springframework.core.io.Resource springResource; public SpringResource(org.springframework.core.io.Resource springResource) { diff --git a/grails-core/src/main/groovy/org/grails/core/io/StaticResourceLoader.java b/grails-core/src/main/groovy/org/grails/core/io/StaticResourceLoader.java index 263884873a0..f216935791f 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/StaticResourceLoader.java +++ b/grails-core/src/main/groovy/org/grails/core/io/StaticResourceLoader.java @@ -22,6 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; import org.springframework.util.Assert; @@ -43,18 +44,18 @@ public void setBaseResource(Resource baseResource) { public Resource getResource(String location) { Assert.state(baseResource != null, "Property [baseResource] not set!"); - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("Loading resource for path {} from base resource {}", location, baseResource); } try { Resource resource = baseResource.createRelative(location); - if(LOG.isDebugEnabled() && resource.exists()) { + if (LOG.isDebugEnabled() && resource.exists()) { LOG.debug("Found resource for path {} from base resource {}", location, baseResource); } return resource; } catch (IOException e) { - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("Error loading resource for path: " + location, e); } return null; diff --git a/grails-core/src/main/groovy/org/grails/core/io/StaticResourceLocator.java b/grails-core/src/main/groovy/org/grails/core/io/StaticResourceLocator.java index 417b70ce6c0..ddce252d82a 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/StaticResourceLocator.java +++ b/grails-core/src/main/groovy/org/grails/core/io/StaticResourceLocator.java @@ -18,12 +18,12 @@ */ package org.grails.core.io; -import org.springframework.core.io.Resource; - import java.util.Collection; import java.util.HashMap; import java.util.Map; +import org.springframework.core.io.Resource; + /** * * A static resource locator that uses an internal map to locate resources. Used largely for testing. @@ -31,8 +31,8 @@ * @author Graeme Rocher * @since 2.0 */ -public class StaticResourceLocator implements ResourceLocator{ - private Map classToResourceMap = new HashMap(); +public class StaticResourceLocator implements ResourceLocator { + private Map classToResourceMap = new HashMap<>(); public void setSearchLocation(String searchLocation) { // do nothing diff --git a/grails-core/src/main/groovy/org/grails/core/io/support/GrailsFactoriesLoader.groovy b/grails-core/src/main/groovy/org/grails/core/io/support/GrailsFactoriesLoader.groovy index 69b7dcf4d67..560d23bd2d9 100644 --- a/grails-core/src/main/groovy/org/grails/core/io/support/GrailsFactoriesLoader.groovy +++ b/grails-core/src/main/groovy/org/grails/core/io/support/GrailsFactoriesLoader.groovy @@ -20,11 +20,13 @@ package org.grails.core.io.support import groovy.transform.CompileStatic -import org.grails.io.support.FactoriesLoaderSupport + import org.springframework.core.OrderComparator import org.springframework.util.Assert import org.springframework.util.ClassUtils +import org.grails.io.support.FactoriesLoaderSupport + /** * General purpose factory loading mechanism for internal use within the framework. * @@ -36,10 +38,8 @@ import org.springframework.util.ClassUtils @CompileStatic class GrailsFactoriesLoader extends FactoriesLoaderSupport { - private static final Object[] NO_ARGUMENTS = [] as Object[] - - + /** * Load the factory implementations of the given type from the default location, * using the given class loader. @@ -47,7 +47,7 @@ class GrailsFactoriesLoader extends FactoriesLoaderSupport { * @param factoryClass the interface or abstract class representing the factory */ static List loadFactories(Class factoryClass) { - (List)loadFactoriesWithArguments(factoryClass, GrailsFactoriesLoader.class.classLoader) + (List) loadFactoriesWithArguments(factoryClass, GrailsFactoriesLoader.classLoader) } /** @@ -58,13 +58,13 @@ class GrailsFactoriesLoader extends FactoriesLoaderSupport { * @param classLoader the ClassLoader to use for loading (can be {@code null} to use the default) */ static List loadFactories(Class factoryClass, ClassLoader classLoader) { - (List)loadFactoriesWithArguments(factoryClass, classLoader, NO_ARGUMENTS) + (List) loadFactoriesWithArguments(factoryClass, classLoader, NO_ARGUMENTS) } static List loadFactoriesWithArguments(Class factoryClass, ClassLoader classLoader, Object[] arguments) { - boolean hasArguments = !(arguments != null && arguments.length==0) - List results = new ArrayList() - for(Class clazz : loadFactoryClasses(factoryClass, classLoader)) { + boolean hasArguments = !(arguments != null && arguments.length == 0) + List results = new ArrayList() + for (Class clazz : loadFactoryClasses(factoryClass, classLoader)) { results.add(hasArguments ? clazz.newInstance(arguments) : clazz.getDeclaredConstructor().newInstance()) } @@ -76,23 +76,22 @@ class GrailsFactoriesLoader extends FactoriesLoaderSupport { OrderComparator.sort((List) results) results } - - static List> loadFactoryClasses(Class factoryClass, ClassLoader classLoader = GrailsFactoriesLoader.class.classLoader) { - Assert.notNull factoryClass, "'factoryClass' must not be null" - + + static List> loadFactoryClasses(Class factoryClass, ClassLoader classLoader = GrailsFactoriesLoader.classLoader) { + Assert.notNull(factoryClass, "'factoryClass' must not be null") + def factoryNames = loadFactoryNames(factoryClass, classLoader) List> result = [] for (String factoryName in factoryNames) { def clazz = loadFactoryClass(factoryName, factoryClass, classLoader) - if(clazz) { - result.add clazz + if (clazz) { + result.add(clazz) } } return result } - private static Class loadFactoryClass(String instanceClassName, Class factoryClass, ClassLoader classLoader) { try { def instanceClass = ClassUtils.forName(instanceClassName, classLoader) @@ -108,21 +107,21 @@ class GrailsFactoriesLoader extends FactoriesLoaderSupport { } } - static T loadFactory(Class factoryClass, ClassLoader classLoader = GrailsFactoriesLoader.class.classLoader) { + static T loadFactory(Class factoryClass, ClassLoader classLoader = GrailsFactoriesLoader.classLoader) { def all = loadFactories(factoryClass, classLoader) - if(all) { + if (all) { return all.get(0) } } static T loadFactory(Class factoryClass, Object... arguments) { - loadFactory(factoryClass, GrailsFactoriesLoader.class.classLoader, arguments) + loadFactory(factoryClass, GrailsFactoriesLoader.classLoader, arguments) } static T loadFactory(Class factoryClass, ClassLoader classLoader, Object... arguments) { def all = loadFactoriesWithArguments(factoryClass, classLoader, arguments) - if(all) { - return (T)all.get(0) + if (all) { + return (T) all.get(0) } } } diff --git a/grails-core/src/main/groovy/org/grails/core/lifecycle/ShutdownOperations.java b/grails-core/src/main/groovy/org/grails/core/lifecycle/ShutdownOperations.java index a2c3adaa390..a4148e2b3c2 100644 --- a/grails-core/src/main/groovy/org/grails/core/lifecycle/ShutdownOperations.java +++ b/grails-core/src/main/groovy/org/grails/core/lifecycle/ShutdownOperations.java @@ -18,12 +18,13 @@ */ package org.grails.core.lifecycle; -import grails.util.Holders; +import java.util.Collection; +import java.util.LinkedHashSet; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import java.util.Collection; -import java.util.LinkedHashSet; +import grails.util.Holders; /** * Operations that should be executed on shutdown. @@ -76,7 +77,7 @@ public static synchronized void addOperation(Runnable runnable) { */ public static synchronized void addOperation(Runnable runnable, boolean preserveForNextShutdown) { shutdownOperations.add(runnable); - if(preserveForNextShutdown) { + if (preserveForNextShutdown) { preservedShutdownOperations.add(runnable); } } diff --git a/grails-core/src/main/groovy/org/grails/core/support/ClassEditor.java b/grails-core/src/main/groovy/org/grails/core/support/ClassEditor.java index 4d04356e1fa..a6f6fb6bc1e 100644 --- a/grails-core/src/main/groovy/org/grails/core/support/ClassEditor.java +++ b/grails-core/src/main/groovy/org/grails/core/support/ClassEditor.java @@ -50,7 +50,7 @@ public void setClassLoader(ClassLoader classLoader) { @Override public String getAsText() { - return ((Class)getValue()).getName(); + return ((Class) getValue()).getName(); } @Override diff --git a/grails-core/src/main/groovy/org/grails/core/support/GrailsApplicationDiscoveryStrategy.groovy b/grails-core/src/main/groovy/org/grails/core/support/GrailsApplicationDiscoveryStrategy.groovy index 04eaa25b9f4..491fa578110 100644 --- a/grails-core/src/main/groovy/org/grails/core/support/GrailsApplicationDiscoveryStrategy.groovy +++ b/grails-core/src/main/groovy/org/grails/core/support/GrailsApplicationDiscoveryStrategy.groovy @@ -18,15 +18,16 @@ */ package org.grails.core.support -import grails.core.GrailsApplication import org.springframework.context.ApplicationContext +import grails.core.GrailsApplication + /** * Interface used for classes that discover the GrailsApplication and ApplicationContext instances * * @since 2.4 */ -public interface GrailsApplicationDiscoveryStrategy { +interface GrailsApplicationDiscoveryStrategy { /** * @return Find the GrailsApplication instance @@ -42,4 +43,4 @@ public interface GrailsApplicationDiscoveryStrategy { */ ApplicationContext findApplicationContext() -} \ No newline at end of file +} diff --git a/grails-core/src/main/groovy/org/grails/core/support/internal/tools/ClassRelativeClassLoader.java b/grails-core/src/main/groovy/org/grails/core/support/internal/tools/ClassRelativeClassLoader.java index 10c0b056bea..56f4930d674 100644 --- a/grails-core/src/main/groovy/org/grails/core/support/internal/tools/ClassRelativeClassLoader.java +++ b/grails-core/src/main/groovy/org/grails/core/support/internal/tools/ClassRelativeClassLoader.java @@ -19,17 +19,16 @@ package org.grails.core.support.internal.tools; -import grails.io.IOUtils; -import grails.util.BuildSettings; -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.UrlResource; - import java.io.IOException; import java.net.URL; import java.net.URLClassLoader; import java.util.Enumeration; +import org.springframework.core.io.FileSystemResource; + +import grails.io.IOUtils; +import grails.util.BuildSettings; + /** * A classloader that only finds resources and classes that are in the same jar as the given class * @@ -45,7 +44,7 @@ public ClassRelativeClassLoader(Class targetClass) { private static URL[] createClassLoaderUrls(Class targetClass) { URL root = IOUtils.findRootResource(targetClass); - if(BuildSettings.RESOURCES_DIR != null && BuildSettings.RESOURCES_DIR.exists()) { + if (BuildSettings.RESOURCES_DIR != null && BuildSettings.RESOURCES_DIR.exists()) { try { return new URL[] {root, new FileSystemResource(BuildSettings.RESOURCES_DIR.getCanonicalFile()).getURL() }; } catch (IOException e) { @@ -64,11 +63,12 @@ public URL getResource(String name) { @Override public Enumeration getResources(String name) throws IOException { - if("".equals(name)) { + if ("".equals(name)) { final URL[] urls = getURLs(); final int l = urls.length; - return new Enumeration() { + return new Enumeration<>() { int i = 0; + @Override public boolean hasMoreElements() { return i < l; @@ -84,6 +84,4 @@ public URL nextElement() { return findResources(name); } } - - } diff --git a/grails-core/src/main/groovy/org/grails/core/support/internal/tools/ClassRelativeResourcePatternResolver.java b/grails-core/src/main/groovy/org/grails/core/support/internal/tools/ClassRelativeResourcePatternResolver.java index a66e938f145..99898fd1dd1 100644 --- a/grails-core/src/main/groovy/org/grails/core/support/internal/tools/ClassRelativeResourcePatternResolver.java +++ b/grails-core/src/main/groovy/org/grails/core/support/internal/tools/ClassRelativeResourcePatternResolver.java @@ -19,11 +19,11 @@ package org.grails.core.support.internal.tools; +import java.util.Set; + import org.springframework.core.io.Resource; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import java.util.Set; - /** * Attempts to limit classpath searching to only locations relative to the given class * diff --git a/grails-core/src/main/groovy/org/grails/core/support/internal/tools/MetaClassChangeReporter.java b/grails-core/src/main/groovy/org/grails/core/support/internal/tools/MetaClassChangeReporter.java index 5d4a9e99e18..999784a4250 100644 --- a/grails-core/src/main/groovy/org/grails/core/support/internal/tools/MetaClassChangeReporter.java +++ b/grails-core/src/main/groovy/org/grails/core/support/internal/tools/MetaClassChangeReporter.java @@ -28,7 +28,7 @@ * @author Graeme Rocher * @since 2.0 */ -public class MetaClassChangeReporter implements MetaClassRegistryChangeEventListener{ +public class MetaClassChangeReporter implements MetaClassRegistryChangeEventListener { /** * Called when the a constant MetaClass is updated. If the new MetaClass is null, then the MetaClass * is removed. Be careful, while this method is executed other updates may happen. If you want this @@ -40,7 +40,7 @@ public void updateConstantMetaClass(MetaClassRegistryChangeEvent cmcu) { Class classToUpdate = cmcu.getClassToUpdate(); MetaClass newMetaClass = cmcu.getNewMetaClass(); - System.out.println("Class ["+classToUpdate+"] updated MetaClass to ["+newMetaClass+"]"); + System.out.println("Class [" + classToUpdate + "] updated MetaClass to [" + newMetaClass + "]"); Thread.dumpStack(); } } diff --git a/grails-core/src/main/groovy/org/grails/core/util/BeanCreationProfilingPostProcessor.java b/grails-core/src/main/groovy/org/grails/core/util/BeanCreationProfilingPostProcessor.java index 3fd7d6feb5e..a7b3080d4c8 100644 --- a/grails-core/src/main/groovy/org/grails/core/util/BeanCreationProfilingPostProcessor.java +++ b/grails-core/src/main/groovy/org/grails/core/util/BeanCreationProfilingPostProcessor.java @@ -20,6 +20,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.InstantiationAwareBeanPostProcessor; import org.springframework.context.ApplicationListener; @@ -53,7 +54,7 @@ public Object postProcessAfterInitialization(@Nullable Object bean, @Nullable St @Override public void onApplicationEvent(@NonNull ContextRefreshedEvent event) { stopWatch.complete(); - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug(stopWatch.prettyPrint()); } } diff --git a/grails-core/src/main/groovy/org/grails/core/util/IncludeExcludeSupport.groovy b/grails-core/src/main/groovy/org/grails/core/util/IncludeExcludeSupport.groovy index 8a9089c2986..769966cae98 100644 --- a/grails-core/src/main/groovy/org/grails/core/util/IncludeExcludeSupport.groovy +++ b/grails-core/src/main/groovy/org/grails/core/util/IncludeExcludeSupport.groovy @@ -29,8 +29,8 @@ import groovy.transform.CompileStatic @CompileStatic class IncludeExcludeSupport { - static final String INCLUDES_PROPERTY = "includes" - static final String EXCLUDES_PROPERTY = "excludes" + static final String INCLUDES_PROPERTY = 'includes' + static final String EXCLUDES_PROPERTY = 'excludes' List defaultIncludes List defaultExcludes diff --git a/grails-core/src/main/groovy/org/grails/core/util/StopWatch.java b/grails-core/src/main/groovy/org/grails/core/util/StopWatch.java index 7eb48693ad3..824882ad400 100644 --- a/grails-core/src/main/groovy/org/grails/core/util/StopWatch.java +++ b/grails-core/src/main/groovy/org/grails/core/util/StopWatch.java @@ -20,7 +20,10 @@ package org.grails.core.util; import java.text.NumberFormat; -import java.util.*; +import java.util.Arrays; +import java.util.Comparator; +import java.util.Deque; +import java.util.LinkedList; /** * Based on the Spring StopWatch class, but supporting nested tasks @@ -39,8 +42,8 @@ public class StopWatch { */ private final String id; - private final Deque runningTasks = new LinkedList(); - private final Deque taskList = new LinkedList(); + private final Deque runningTasks = new LinkedList<>(); + private final Deque taskList = new LinkedList<>(); /** Is the stop watch currently running? */ private boolean running; @@ -55,7 +58,6 @@ public class StopWatch { /** Total running time */ private long totalTimeMillis; - /** * Construct a new stop watch. Does not start any task. */ @@ -74,8 +76,6 @@ public StopWatch(String id) { this.id = id; } - - /** * Start an unnamed task. The results are undefined if {@link #stop()} * or timing methods are called without invoking this method. @@ -110,7 +110,7 @@ public void stop() throws IllegalStateException { throw new IllegalStateException("Can't stop StopWatch: it's not running"); } - if(!runningTasks.isEmpty()) { + if (!runningTasks.isEmpty()) { TaskInfo lastTask = runningTasks.pop(); lastTask.stop(); @@ -131,7 +131,6 @@ public boolean isRunning() { return this.running; } - /** * Return the time taken by the last task. */ @@ -162,7 +161,6 @@ public TaskInfo getLastTaskInfo() throws IllegalStateException { return this.lastTaskInfo; } - /** * Return the total time in milliseconds for all tasks. */ @@ -191,7 +189,6 @@ public TaskInfo[] getTaskInfo() { return this.taskList.toArray(new TaskInfo[this.taskList.size()]); } - /** * Return a short description of the total running time. */ @@ -216,7 +213,7 @@ public String prettyPrint() { pf.setMinimumIntegerDigits(3); pf.setGroupingUsed(false); final TaskInfo[] taskInfos = getTaskInfo(); - Arrays.sort(taskInfos, new Comparator() { + Arrays.sort(taskInfos, new Comparator<>() { @Override public int compare(TaskInfo o1, TaskInfo o2) { return Long.compare(o1.getTimeMillis(), o2.getTimeMillis()); @@ -245,7 +242,6 @@ public String toString() { return sb.toString(); } - /** * Inner class to hold data about one task executed within the stop watch. */ @@ -256,7 +252,6 @@ public static final class TaskInfo { private final long startTime; private long endTime; - TaskInfo(String taskName, long startTime) { this.taskName = taskName; this.startTime = startTime; diff --git a/grails-core/src/main/groovy/org/grails/dev/support/DevelopmentShutdownHook.groovy b/grails-core/src/main/groovy/org/grails/dev/support/DevelopmentShutdownHook.groovy index 57e712951df..781b2edc501 100644 --- a/grails-core/src/main/groovy/org/grails/dev/support/DevelopmentShutdownHook.groovy +++ b/grails-core/src/main/groovy/org/grails/dev/support/DevelopmentShutdownHook.groovy @@ -19,8 +19,9 @@ package org.grails.dev.support import groovy.transform.CompileStatic -import groovy.util.logging.Slf4j + import org.slf4j.LoggerFactory + import org.springframework.context.ApplicationContext import org.springframework.context.ApplicationContextAware import org.springframework.context.ConfigurableApplicationContext @@ -33,7 +34,7 @@ import org.springframework.context.ConfigurableApplicationContext */ class DevelopmentShutdownHook implements ApplicationContextAware { - public static final String INSTALLED = "grails.shutdown.hook.installed" + public static final String INSTALLED = 'grails.shutdown.hook.installed' @CompileStatic void setApplicationContext(ApplicationContext applicationContext) { @@ -44,13 +45,13 @@ class DevelopmentShutdownHook implements ApplicationContextAware { Runtime.runtime.addShutdownHook { try { Thread.start { - ((ConfigurableApplicationContext)applicationContext).close() + ((ConfigurableApplicationContext) applicationContext).close() }.join(2000) } catch (Throwable e) { LoggerFactory.getLogger(DevelopmentShutdownHook).warn("Error shutting down application: ${e.message}", e) } } - System.setProperty(INSTALLED, "true") + System.setProperty(INSTALLED, 'true') } } diff --git a/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPlugin.java b/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPlugin.java index 8a8b0db4c07..b9552934828 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPlugin.java +++ b/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPlugin.java @@ -18,19 +18,19 @@ */ package org.grails.plugins; -import grails.config.Config; -import grails.core.GrailsApplication; -import grails.io.IOUtils; -import grails.plugins.GrailsPlugin; -import grails.plugins.GrailsPluginManager; -import grails.util.GrailsNameUtils; +import java.io.IOException; +import java.net.URL; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import groovy.lang.GroovyObjectSupport; -import org.grails.config.yaml.YamlPropertySourceLoader; -import org.grails.core.AbstractGrailsClass; -import org.grails.core.cfg.GroovyConfigPropertySourceLoader; -import org.grails.plugins.support.WatchPattern; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.core.env.PropertySource; @@ -38,13 +38,16 @@ import org.springframework.core.io.UrlResource; import org.springframework.util.Assert; -import java.io.IOException; -import java.net.URL; -import java.util.Arrays; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import grails.config.Config; +import grails.core.GrailsApplication; +import grails.io.IOUtils; +import grails.plugins.GrailsPlugin; +import grails.plugins.GrailsPluginManager; +import grails.util.GrailsNameUtils; +import org.grails.config.yaml.YamlPropertySourceLoader; +import org.grails.core.AbstractGrailsClass; +import org.grails.core.cfg.GroovyConfigPropertySourceLoader; +import org.grails.plugins.support.WatchPattern; /** * Abstract implementation that provides some default behaviours @@ -64,7 +67,7 @@ public abstract class AbstractGrailsPlugin extends GroovyObjectSupport implement protected GrailsApplication grailsApplication; protected boolean isBase = false; protected String version = "1.0"; - protected Map dependencies = new HashMap(); + protected Map dependencies = new HashMap<>(); protected String[] dependencyNames = {}; protected Class pluginClass; protected ApplicationContext applicationContext; @@ -92,7 +95,7 @@ public AbstractGrailsPlugin(Class pluginClass, GrailsApplication application) this.pluginClass = pluginClass; Resource resource = readPluginConfiguration(pluginClass); - if(resource != null && resource.exists()) { + if (resource != null && resource.exists()) { final String filename = resource.getFilename(); try { if (filename.equals(PLUGIN_YML)) { @@ -103,7 +106,7 @@ public AbstractGrailsPlugin(Class pluginClass, GrailsApplication application) this.propertySource = propertySourceLoader.load(GrailsNameUtils.getLogicalPropertyName(pluginClass.getSimpleName(), "GrailsPlugin") + "-" + PLUGIN_GROOVY, resource, DEFAULT_CONFIG_IGNORE_LIST).stream().findFirst().orElse(null); } } catch (IOException e) { - LOG.warn("Error loading " + filename + " for plugin: " + pluginClass.getName() +": " + e.getMessage(), e); + LOG.warn("Error loading " + filename + " for plugin: " + pluginClass.getName() + ": " + e.getMessage(), e); } } } @@ -120,7 +123,6 @@ public void refresh() { // do nothing } - @Override public boolean isEnabled(String[] profiles) { return true; @@ -132,13 +134,13 @@ protected Resource readPluginConfiguration(Class pluginClass) { Boolean groovyResourceExists = groovyResource != null && groovyResource.exists(); - if(ymlResource != null && ymlResource.exists()) { + if (ymlResource != null && ymlResource.exists()) { if (groovyResourceExists) { throw new RuntimeException("A plugin [" + pluginClass.getName() + "] may define a plugin.yml or a plugin.groovy, but not both"); } return ymlResource; } - if(groovyResourceExists) { + if (groovyResourceExists) { return groovyResource; } return null; @@ -177,7 +179,6 @@ public boolean hasInterestInChange(String path) { return false; } - public String[] getDependencyNames() { return dependencyNames; } diff --git a/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPluginManager.java b/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPluginManager.java index 3593d9e2262..3601f9a766f 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPluginManager.java +++ b/grails-core/src/main/groovy/org/grails/plugins/AbstractGrailsPluginManager.java @@ -16,21 +16,6 @@ */ package org.grails.plugins; -import grails.artefact.Enhanced; -import grails.plugins.Plugin; -import grails.plugins.PluginFilter; -import org.grails.config.NavigableMap; -import grails.plugins.GrailsPlugin; -import grails.plugins.GrailsPluginManager; -import grails.plugins.GrailsVersionUtils; -import grails.util.Environment; -import grails.util.GrailsNameUtils; -import groovy.lang.ExpandoMetaClass; -import groovy.lang.GroovySystem; -import groovy.lang.MetaClassRegistry; -import groovy.util.ConfigObject; -import groovy.util.ConfigSlurper; - import java.io.File; import java.util.ArrayList; import java.util.Collections; @@ -38,18 +23,16 @@ import java.util.List; import java.util.Map; +import groovy.lang.ExpandoMetaClass; +import groovy.lang.GroovySystem; +import groovy.lang.MetaClassRegistry; +import groovy.util.ConfigObject; +import groovy.util.ConfigSlurper; +import org.codehaus.groovy.runtime.DefaultGroovyMethods; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import grails.core.ArtefactHandler; -import grails.core.GrailsApplication; -import org.grails.plugins.support.WatchPattern; -import org.grails.spring.RuntimeSpringConfiguration; -import org.grails.io.support.GrailsResourceUtils; - -import grails.plugins.exceptions.PluginException; - -import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.AutowireCapableBeanFactory; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; @@ -65,6 +48,22 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import grails.artefact.Enhanced; +import grails.core.ArtefactHandler; +import grails.core.GrailsApplication; +import grails.plugins.GrailsPlugin; +import grails.plugins.GrailsPluginManager; +import grails.plugins.GrailsVersionUtils; +import grails.plugins.Plugin; +import grails.plugins.PluginFilter; +import grails.plugins.exceptions.PluginException; +import grails.util.Environment; +import grails.util.GrailsNameUtils; +import org.grails.config.NavigableMap; +import org.grails.io.support.GrailsResourceUtils; +import org.grails.plugins.support.WatchPattern; +import org.grails.spring.RuntimeSpringConfiguration; + /** * Abstract implementation of the GrailsPluginManager interface * @@ -76,30 +75,29 @@ public abstract class AbstractGrailsPluginManager implements GrailsPluginManager private static final Log LOG = LogFactory.getLog(AbstractGrailsPluginManager.class); private static final String BLANK = ""; public static final String CONFIG_FILE = "application.groovy"; - protected List pluginList = new ArrayList(); + protected List pluginList = new ArrayList<>(); protected GrailsApplication application; protected Resource[] pluginResources = new Resource[0]; - protected Map plugins = new HashMap(); - protected Map classNameToPluginMap = new HashMap(); + protected Map plugins = new HashMap<>(); + protected Map classNameToPluginMap = new HashMap<>(); protected Class[] pluginClasses = new Class[0]; protected boolean initialised = false; protected boolean shutdown = false; protected ApplicationContext applicationContext; - protected Map failedPlugins = new HashMap(); + protected Map failedPlugins = new HashMap<>(); protected boolean loadCorePlugins = true; private static final String CONFIG_BINDING_USER_HOME = "userHome"; private static final String CONFIG_BINDING_APP_NAME = "appName"; private static final String CONFIG_BINDING_APP_VERSION = "appVersion"; - public AbstractGrailsPluginManager(GrailsApplication application) { Assert.notNull(application, "Argument [application] cannot be null!"); this.application = application; } public List getTypeFilters() { - List list = new ArrayList(); + List list = new ArrayList<>(); for (GrailsPlugin grailsPlugin : pluginList) { list.addAll(grailsPlugin.getTypeFilters()); } @@ -139,17 +137,17 @@ public GrailsPlugin getFailedPlugin(String name) { public void doRuntimeConfiguration(RuntimeSpringConfiguration springConfig) { ApplicationContext context = springConfig.getUnrefreshedApplicationContext(); AutowireCapableBeanFactory autowireCapableBeanFactory = context.getAutowireCapableBeanFactory(); - if(autowireCapableBeanFactory instanceof ConfigurableListableBeanFactory) { - ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory)autowireCapableBeanFactory; + if (autowireCapableBeanFactory instanceof ConfigurableListableBeanFactory) { + ConfigurableListableBeanFactory beanFactory = (ConfigurableListableBeanFactory) autowireCapableBeanFactory; ConversionService existingConversionService = beanFactory.getConversionService(); ConverterRegistry converterRegistry; - if(existingConversionService == null) { + if (existingConversionService == null) { GenericConversionService conversionService = new GenericConversionService(); converterRegistry = conversionService; beanFactory.setConversionService(conversionService); } else { - converterRegistry = (ConverterRegistry)existingConversionService; + converterRegistry = (ConverterRegistry) existingConversionService; } converterRegistry.addConverter(new Converter() { @@ -181,7 +179,7 @@ public void doRuntimeConfiguration(String pluginName, RuntimeSpringConfiguration return; } - if(!plugin.isEnabled(applicationContext.getEnvironment().getActiveProfiles())) return; + if (!plugin.isEnabled(applicationContext.getEnvironment().getActiveProfiles())) return; String[] dependencyNames = plugin.getDependencyNames(); doRuntimeConfigurationForDependencies(dependencyNames, springConfig); @@ -206,7 +204,7 @@ private void doRuntimeConfigurationForDependencies(String[] dependencyNames, Run if (pluginDependencies.length > 0) { doRuntimeConfigurationForDependencies(pluginDependencies, springConfig); } - if(isPluginDisabledForProfile(current)) continue; + if (isPluginDisabledForProfile(current)) continue; current.doWithRuntimeConfiguration(springConfig); } } @@ -217,7 +215,7 @@ private void doRuntimeConfigurationForDependencies(String[] dependencyNames, Run public void doPostProcessing(ApplicationContext ctx) { checkInitialised(); for (GrailsPlugin plugin : pluginList) { - if(isPluginDisabledForProfile(plugin)) continue; + if (isPluginDisabledForProfile(plugin)) continue; if (plugin.supportsCurrentScopeAndEnvironment()) { plugin.doWithApplicationContext(ctx); } @@ -267,7 +265,7 @@ public void doDynamicMethods() { } ApplicationContext ctx = applicationContext; for (GrailsPlugin plugin : pluginList) { - if(!plugin.isEnabled(ctx.getEnvironment().getActiveProfiles())) continue; + if (!plugin.isEnabled(ctx.getEnvironment().getActiveProfiles())) continue; plugin.doWithDynamicMethods(ctx); } } @@ -297,11 +295,11 @@ public void registerProvidedArtefacts(GrailsApplication app) { // since plugin classes are added as overridable artefacts, which are added as the first // item in the list of artefacts, we have to iterate in reverse order to ensure plugin // load sequence is maintained - ArrayList plugins = new ArrayList(pluginList); + ArrayList plugins = new ArrayList<>(pluginList); Collections.reverse(plugins); for (GrailsPlugin plugin : plugins) { if (plugin.supportsCurrentScopeAndEnvironment()) { - if(isPluginDisabledForProfile(plugin)) continue; + if (isPluginDisabledForProfile(plugin)) continue; for (Class artefact : plugin.getProvidedArtefacts()) { String shortName = GrailsNameUtils.getShortName(artefact); if (artefact.getName().equals(shortName)) { @@ -327,7 +325,7 @@ private boolean isAlreadyRegistered(GrailsApplication app, Class artefact) { public void doArtefactConfiguration() { checkInitialised(); for (GrailsPlugin plugin : pluginList) { - if(isPluginDisabledForProfile(plugin)) continue; + if (isPluginDisabledForProfile(plugin)) continue; if (plugin.supportsCurrentScopeAndEnvironment()) { plugin.doArtefactConfiguration(); } @@ -341,7 +339,7 @@ protected boolean isPluginDisabledForProfile(GrailsPlugin plugin) { public void onStartup(Map event) { for (GrailsPlugin plugin : pluginList) { if (plugin.getInstance() instanceof Plugin) { - ((Plugin)plugin.getInstance()).onStartup(event); + ((Plugin) plugin.getInstance()).onStartup(event); } } } @@ -354,7 +352,7 @@ public void shutdown() { Collections.reverse(reversePluginList); for (GrailsPlugin plugin : reversePluginList) { - if(!plugin.isEnabled(applicationContext.getEnvironment().getActiveProfiles())) continue; + if (!plugin.isEnabled(applicationContext.getEnvironment().getActiveProfiles())) continue; if (plugin.supportsCurrentScopeAndEnvironment()) { plugin.notifyOfEvent(GrailsPlugin.EVENT_ON_SHUTDOWN, plugin); } @@ -395,7 +393,7 @@ public void informOfClassChange(Class aClass) { GrailsPlugin plugin = getGrailsPlugin(pluginName); if (plugin != null) { - if(!plugin.isEnabled(applicationContext.getEnvironment().getActiveProfiles())) return; + if (!plugin.isEnabled(applicationContext.getEnvironment().getActiveProfiles())) return; plugin.notifyOfEvent(GrailsPlugin.EVENT_ON_CHANGE, aClass); } else { @@ -404,19 +402,19 @@ public void informOfClassChange(Class aClass) { String javaClass = classNameAsPath + ".java"; for (GrailsPlugin grailsPlugin : pluginList) { List watchPatterns = grailsPlugin.getWatchedResourcePatterns(); - if(watchPatterns != null) { + if (watchPatterns != null) { for (WatchPattern watchPattern : watchPatterns) { File parent = watchPattern.getDirectory(); String extension = watchPattern.getExtension(); - if(parent != null && extension != null) { + if (parent != null && extension != null) { File f = new File(parent, groovyClass); - if(f.exists() && f.getName().endsWith(extension)) { + if (f.exists() && f.getName().endsWith(extension)) { grailsPlugin.notifyOfEvent(GrailsPlugin.EVENT_ON_CHANGE, aClass); } else { f = new File(parent, javaClass); - if(f.exists() && f.getName().endsWith(extension)) { + if (f.exists() && f.getName().endsWith(extension)) { grailsPlugin.notifyOfEvent(GrailsPlugin.EVENT_ON_CHANGE, aClass); } } @@ -434,7 +432,7 @@ public String getPluginPath(String name) { public String getPluginPath(String name, boolean forceCamelCase) { GrailsPlugin plugin = getGrailsPlugin(name); if (plugin != null && !plugin.isBasePlugin()) { - if(forceCamelCase){ + if (forceCamelCase) { return plugin.getPluginPathCamelCase(); } else { return plugin.getPluginPath(); @@ -524,7 +522,7 @@ public void informOfClassChange(File file, @SuppressWarnings("rawtypes") Class c newMc.initialize(); registry.setMetaClass(cls, newMc); - Enhanced en = AnnotationUtils.findAnnotation(cls,Enhanced.class); + Enhanced en = AnnotationUtils.findAnnotation(cls, Enhanced.class); if (en != null) { Class[] mixinClasses = en.mixins(); if (mixinClasses != null) { diff --git a/grails-core/src/main/groovy/org/grails/plugins/BasePluginFilter.java b/grails-core/src/main/groovy/org/grails/plugins/BasePluginFilter.java index e63082dcd6f..c4475eea892 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/BasePluginFilter.java +++ b/grails-core/src/main/groovy/org/grails/plugins/BasePluginFilter.java @@ -18,9 +18,6 @@ */ package org.grails.plugins; -import grails.plugins.GrailsPlugin; -import grails.plugins.PluginFilter; - import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -30,6 +27,9 @@ import java.util.Map; import java.util.Set; +import grails.plugins.GrailsPlugin; +import grails.plugins.PluginFilter; + /** * Base functionality shared by IncludingPluginFilter and * ExcludingPluginFilter. @@ -46,12 +46,12 @@ public abstract class BasePluginFilter implements PluginFilter { /** * Plugins corresponding with the supplied names. */ - private final List explicitlyNamedPlugins = new ArrayList(); + private final List explicitlyNamedPlugins = new ArrayList<>(); /** * Plugins derivied through a dependency relationship. */ - private final List derivedPlugins = new ArrayList(); + private final List derivedPlugins = new ArrayList<>(); /** * Holds a name to GrailsPlugin map (String, Plugin). @@ -71,7 +71,7 @@ public BasePluginFilter(Set suppliedNames) { } public BasePluginFilter(String[] included) { - suppliedNames = new HashSet(); + suppliedNames = new HashSet<>(); for (int i = 0; i < included.length; i++) { suppliedNames.add(included[i].trim()); } @@ -93,16 +93,16 @@ public BasePluginFilter(String[] included) { /** * Template method shared by subclasses of BasePluginFilter. */ - public List filterPluginList(List original) { + public List filterPluginList(List original) { originalPlugins = Collections.unmodifiableList(original); - addedNames = new HashSet(); + addedNames = new HashSet<>(); buildNameMap(); buildExplicitlyNamedList(); buildDerivedPluginList(); - List pluginList = new ArrayList(); + List pluginList = new ArrayList<>(); pluginList.addAll(explicitlyNamedPlugins); pluginList.addAll(derivedPlugins); @@ -166,7 +166,7 @@ private void buildExplicitlyNamedList() { // included set for (GrailsPlugin plugin : originalPlugins) { - // find explicitly included plugins + // find explicitly included plugins String name = plugin.getName(); if (suppliedNames.contains(name)) { explicitlyNamedPlugins.add(plugin); @@ -180,7 +180,7 @@ private void buildExplicitlyNamedList() { * */ private void buildNameMap() { - nameMap = new HashMap(); + nameMap = new HashMap<>(); for (GrailsPlugin plugin : originalPlugins) { nameMap.put(plugin.getName(), plugin); } diff --git a/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPlugin.java b/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPlugin.java index 8984702f106..d97aa5c6519 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPlugin.java +++ b/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPlugin.java @@ -18,25 +18,32 @@ */ package org.grails.plugins; -import grails.core.GrailsApplication; -import grails.io.IOUtils; -import grails.io.ResourceUtils; -import grails.plugins.exceptions.PluginException; -import grails.util.BuildSettings; -import org.grails.core.io.StaticResourceLoader; -import org.springframework.core.io.Resource; -import org.springframework.core.io.UrlResource; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; -import org.springframework.util.StringUtils; - import java.io.File; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.net.URL; import java.nio.charset.Charset; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Locale; +import java.util.Map; +import java.util.Properties; + +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; +import org.springframework.util.StringUtils; + +import grails.core.GrailsApplication; +import grails.io.IOUtils; +import grails.io.ResourceUtils; +import grails.plugins.exceptions.PluginException; +import grails.util.BuildSettings; +import org.grails.core.io.StaticResourceLoader; /** * Models a pre-compiled binary plugin. @@ -58,7 +65,7 @@ public class BinaryGrailsPlugin extends DefaultGrailsPlugin { private final BinaryGrailsPluginDescriptor descriptor; private Class[] providedArtefacts = {}; - private final Map precompiledViewMap = new HashMap(); + private final Map precompiledViewMap = new HashMap<>(); private final Resource baseResource; private final Resource baseResourcesResource; private final boolean isJar; @@ -75,7 +82,7 @@ public BinaryGrailsPlugin(Class pluginClass, BinaryGrailsPluginDescriptor des super(pluginClass, application); this.descriptor = descriptor; URL rootResource = IOUtils.findRootResource(pluginClass); - if(rootResource == null) { + if (rootResource == null) { throw new PluginException("Cannot evaluate plugin location for plugin " + pluginClass); } this.baseResource = new UrlResource(rootResource); @@ -86,9 +93,9 @@ public BinaryGrailsPlugin(Class pluginClass, BinaryGrailsPluginDescriptor des } this.projectDirectory = isJar ? null : IOUtils.findApplicationDirectoryFile(pluginClass); - if(BuildSettings.BASE_DIR != null && projectDirectory != null) { + if (BuildSettings.BASE_DIR != null && projectDirectory != null) { try { - if(projectDirectory.getCanonicalPath().startsWith(BuildSettings.BASE_DIR.getCanonicalPath())) { + if (projectDirectory.getCanonicalPath().startsWith(BuildSettings.BASE_DIR.getCanonicalPath())) { isBase = true; } } catch (IOException e) { @@ -97,11 +104,11 @@ public BinaryGrailsPlugin(Class pluginClass, BinaryGrailsPluginDescriptor des } URL rootResourcesURL = IOUtils.findRootResourcesURL(pluginClass); - if(rootResourcesURL == null) { + if (rootResourcesURL == null) { throw new PluginException("Cannot evaluate plugin location for plugin " + pluginClass); } - this.baseResourcesResource= new UrlResource(rootResourcesURL); + this.baseResourcesResource = new UrlResource(rootResourcesURL); if (descriptor != null) { initializeProvidedArtefacts(descriptor.getProvidedlassNames()); initializeViewMap(descriptor); @@ -125,7 +132,7 @@ protected void initializeViewMap(BinaryGrailsPluginDescriptor descriptor) { if (viewsPropertiesResource == null || !viewsPropertiesResource.exists()) { try { String urlString = descriptorResource.getURL().toString(); - if(urlString.endsWith(PLUGIN_DESCRIPTOR_PATH)) { + if (urlString.endsWith(PLUGIN_DESCRIPTOR_PATH)) { urlString = urlString.substring(0, urlString.length() - PLUGIN_DESCRIPTOR_PATH.length()); URL newUrl = new URL(urlString + RELATIVE_VIEWS_PROPERTIES); viewsPropertiesResource = new UrlResource(newUrl); @@ -151,11 +158,11 @@ protected void initializeViewMap(BinaryGrailsPluginDescriptor descriptor) { final Class viewClass = grailsApplication.getClassLoader().loadClass(viewClassName); precompiledViewMap.put(viewName, viewClass); } catch (Throwable e) { - throw new PluginException("Failed to initialize view ["+viewName+"] from plugin ["+ getName()+ "] : " + e.getMessage(), e); + throw new PluginException("Failed to initialize view [" + viewName + "] from plugin [" + getName() + "] : " + e.getMessage(), e); } } } catch (IOException e) { - LOG.error("Error loading views for binary plugin ["+this+"]: " + e.getMessage(),e); + LOG.error("Error loading views for binary plugin [" + this + "]: " + e.getMessage(), e); } finally { try { if (input != null) input.close(); @@ -167,14 +174,14 @@ protected void initializeViewMap(BinaryGrailsPluginDescriptor descriptor) { protected void initializeProvidedArtefacts(List classNames) { - List artefacts = new ArrayList(); + List artefacts = new ArrayList<>(); if (!classNames.isEmpty()) { final ClassLoader classLoader = grailsApplication.getClassLoader(); for (String className : classNames) { try { artefacts.add(classLoader.loadClass(className)); } catch (Throwable e) { - throw new PluginException("Failed to initialize class ["+className+"] from plugin ["+ getName()+ "] : " + e.getMessage(), e); + throw new PluginException("Failed to initialize class [" + className + "] from plugin [" + getName() + "] : " + e.getMessage(), e); } } @@ -226,7 +233,7 @@ public Resource getResource(String path) { public Properties getProperties(final Locale locale) { Resource url = this.baseResourcesResource; Properties properties = null; - if(url != null) { + if (url != null) { StaticResourceLoader resourceLoader = new StaticResourceLoader(); resourceLoader.setBaseResource(url); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(resourceLoader); @@ -234,7 +241,7 @@ public Properties getProperties(final Locale locale) { // first load all properties Resource[] resources = resolver.getResources('*' + PROPERTIES_EXTENSION); resources = resources.length > 0 ? filterResources(resources, locale) : resources; - if(resources.length > 0) { + if (resources.length > 0) { properties = new Properties(); // message bundles are locale specific. The more underscores the locale has the more specific the locale @@ -246,11 +253,11 @@ public Properties getProperties(final Locale locale) { int firstUnderscoreCount = StringUtils.countOccurrencesOf(f1, "_"); int secondUnderscoreCount = StringUtils.countOccurrencesOf(f2, "_"); - if(firstUnderscoreCount == secondUnderscoreCount) { + if (firstUnderscoreCount == secondUnderscoreCount) { return 0; } else { - return firstUnderscoreCount > secondUnderscoreCount ? 1 : -1; + return firstUnderscoreCount > secondUnderscoreCount ? 1 : -1; } }); @@ -263,21 +270,20 @@ public Properties getProperties(final Locale locale) { return properties; } - private Resource[] filterResources(Resource[] resources, Locale locale) { - List finalResources = new ArrayList(resources.length); + List finalResources = new ArrayList<>(resources.length); for (Resource resource : resources) { String fn = resource.getFilename(); - if(fn.indexOf(UNDERSCORE) > -1) { - if(fn.endsWith(UNDERSCORE + locale.toString() + PROPERTIES_EXTENSION)) { + if (fn.indexOf(UNDERSCORE) > -1) { + if (fn.endsWith(UNDERSCORE + locale.toString() + PROPERTIES_EXTENSION)) { finalResources.add(resource); } - else if(fn.endsWith(UNDERSCORE + locale.getLanguage() + UNDERSCORE + locale.getCountry() + PROPERTIES_EXTENSION)) { + else if (fn.endsWith(UNDERSCORE + locale.getLanguage() + UNDERSCORE + locale.getCountry() + PROPERTIES_EXTENSION)) { finalResources.add(resource); } - else if(fn.endsWith(UNDERSCORE + locale.getLanguage() + PROPERTIES_EXTENSION)) { + else if (fn.endsWith(UNDERSCORE + locale.getLanguage() + PROPERTIES_EXTENSION)) { finalResources.add(resource); } } @@ -310,7 +316,7 @@ private void loadFromResources(Properties properties, Resource[] resources) thro * * @return The view class which is a subclass of GroovyPage */ - public Class resolveView(String viewName) { + public Class resolveView(String viewName) { // this is a workaround for GRAILS-9234; in that scenario the viewName will be // "/WEB-INF/grails-app/views/plugins/plugin9234-0.1/junk/_book.gsp" with the diff --git a/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPluginDescriptor.java b/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPluginDescriptor.java index 4d0830a6278..df50f9957b2 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPluginDescriptor.java +++ b/grails-core/src/main/groovy/org/grails/plugins/BinaryGrailsPluginDescriptor.java @@ -18,14 +18,17 @@ */ package org.grails.plugins; -import groovy.xml.slurpersupport.GPathResult; -import org.grails.core.exceptions.GrailsConfigurationException; -import org.grails.io.support.SpringIOUtils; -import org.springframework.core.io.Resource; import java.io.IOException; import java.io.InputStream; import java.util.List; +import groovy.xml.slurpersupport.GPathResult; + +import org.springframework.core.io.Resource; + +import org.grails.core.exceptions.GrailsConfigurationException; +import org.grails.io.support.SpringIOUtils; + /** * Holds a reference to the parsed grails-plugin.xml descriptor and the * resource used to parse the descriptor @@ -62,7 +65,7 @@ public List getProvidedlassNames() { * @return The parsed descriptor */ public GPathResult getParsedXml() { - if(parsedXml == null) { + if (parsedXml == null) { InputStream inputStream; try { inputStream = resource.getInputStream(); diff --git a/grails-core/src/main/groovy/org/grails/plugins/CoreGrailsPlugin.groovy b/grails-core/src/main/groovy/org/grails/plugins/CoreGrailsPlugin.groovy index c87b8449875..0ed776b0b80 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/CoreGrailsPlugin.groovy +++ b/grails-core/src/main/groovy/org/grails/plugins/CoreGrailsPlugin.groovy @@ -18,32 +18,34 @@ */ package org.grails.plugins +import groovy.transform.CompileStatic + +import org.springframework.beans.factory.config.CustomEditorConfigurer +import org.springframework.beans.factory.support.DefaultListableBeanFactory +import org.springframework.beans.factory.xml.XmlBeanDefinitionReader +import org.springframework.context.annotation.ConfigurationClassPostProcessor +import org.springframework.context.support.GenericApplicationContext +import org.springframework.core.io.Resource +import org.springframework.util.ClassUtils + import grails.config.Settings +import grails.core.support.proxy.DefaultProxyHandler import grails.plugins.Plugin import grails.util.BuildSettings import grails.util.Environment import grails.util.GrailsUtil -import groovy.transform.CompileStatic +import org.grails.beans.support.PropertiesEditor +import org.grails.core.io.DefaultResourceLocator +import org.grails.core.support.ClassEditor +import org.grails.dev.support.DevelopmentShutdownHook import org.grails.spring.DefaultRuntimeSpringConfiguration +import org.grails.spring.RuntimeSpringConfigUtilities import org.grails.spring.RuntimeSpringConfiguration import org.grails.spring.aop.autoproxy.GroovyAwareAspectJAwareAdvisorAutoProxyCreator import org.grails.spring.aop.autoproxy.GroovyAwareInfrastructureAdvisorAutoProxyCreator -import org.grails.spring.context.support.MapBasedSmartPropertyOverrideConfigurer -import org.grails.spring.RuntimeSpringConfigUtilities -import org.grails.core.io.DefaultResourceLocator import org.grails.spring.beans.GrailsApplicationAwareBeanPostProcessor import org.grails.spring.beans.PluginManagerAwareBeanPostProcessor -import org.grails.core.support.ClassEditor -import org.grails.dev.support.DevelopmentShutdownHook -import org.grails.beans.support.PropertiesEditor -import grails.core.support.proxy.DefaultProxyHandler -import org.springframework.beans.factory.config.CustomEditorConfigurer -import org.springframework.beans.factory.support.DefaultListableBeanFactory -import org.springframework.beans.factory.xml.XmlBeanDefinitionReader -import org.springframework.context.annotation.ConfigurationClassPostProcessor -import org.springframework.context.support.GenericApplicationContext -import org.springframework.core.io.Resource -import org.springframework.util.ClassUtils +import org.grails.spring.context.support.MapBasedSmartPropertyOverrideConfigurer /** * Configures the core shared beans within the Grails application context. @@ -54,96 +56,97 @@ import org.springframework.util.ClassUtils class CoreGrailsPlugin extends Plugin { def version = GrailsUtil.getGrailsVersion() - def watchedResources = [ "file:./grails-app/conf/spring/resources.xml", - "file:./grails-app/conf/spring/resources.groovy", - "file:./grails-app/conf/application.groovy", - "file:./grails-app/conf/application.yml"] + def watchedResources = [ 'file:./grails-app/conf/spring/resources.xml', + 'file:./grails-app/conf/spring/resources.groovy', + 'file:./grails-app/conf/application.groovy', + 'file:./grails-app/conf/application.yml'] - private static final SPRING_PROXY_TARGET_CLASS_CONFIG = "spring.aop.proxy-target-class" + private static final SPRING_PROXY_TARGET_CLASS_CONFIG = 'spring.aop.proxy-target-class' @Override - Closure doWithSpring() { {-> + Closure doWithSpring() { + { -> - def application = grailsApplication + def application = grailsApplication - // Grails config as properties - def config = application.config + // Grails config as properties + def config = application.config - // enable post-processing of @Configuration beans defined by plugins - grailsConfigurationClassPostProcessor ConfigurationClassPostProcessor - grailsBeanOverrideConfigurer(MapBasedSmartPropertyOverrideConfigurer) { - delegate.grailsApplication = application - } + // enable post-processing of @Configuration beans defined by plugins + grailsConfigurationClassPostProcessor(ConfigurationClassPostProcessor) + grailsBeanOverrideConfigurer(MapBasedSmartPropertyOverrideConfigurer) { + delegate.grailsApplication = application + } - Class proxyCreatorClazz = null - // replace AutoProxy advisor with Groovy aware one - if (ClassUtils.isPresent('org.aspectj.lang.annotation.Around', application.classLoader) && !config.getProperty(Settings.SPRING_DISABLE_ASPECTJ, Boolean)) { - proxyCreatorClazz = GroovyAwareAspectJAwareAdvisorAutoProxyCreator - } else { - proxyCreatorClazz = GroovyAwareInfrastructureAdvisorAutoProxyCreator - } + Class proxyCreatorClazz = null + // replace AutoProxy advisor with Groovy aware one + if (ClassUtils.isPresent('org.aspectj.lang.annotation.Around', application.classLoader) && !config.getProperty(Settings.SPRING_DISABLE_ASPECTJ, Boolean)) { + proxyCreatorClazz = GroovyAwareAspectJAwareAdvisorAutoProxyCreator + } else { + proxyCreatorClazz = GroovyAwareInfrastructureAdvisorAutoProxyCreator + } - Boolean isProxyTargetClass = config.getProperty(SPRING_PROXY_TARGET_CLASS_CONFIG, Boolean) - "org.springframework.aop.config.internalAutoProxyCreator"(proxyCreatorClazz) { - if (isProxyTargetClass != null) { - proxyTargetClass = isProxyTargetClass + Boolean isProxyTargetClass = config.getProperty(SPRING_PROXY_TARGET_CLASS_CONFIG, Boolean) + 'org.springframework.aop.config.internalAutoProxyCreator'(proxyCreatorClazz) { + if (isProxyTargetClass != null) { + proxyTargetClass = isProxyTargetClass + } } - } - def packagesToScan = [] + def packagesToScan = [] - def beanPackages = config.getProperty(Settings.SPRING_BEAN_PACKAGES, List) - if (beanPackages) { - packagesToScan += beanPackages - } + def beanPackages = config.getProperty(Settings.SPRING_BEAN_PACKAGES, List) + if (beanPackages) { + packagesToScan += beanPackages + } + if (packagesToScan) { + xmlns(grailsContext: 'http://grails.org/schema/context') + grailsContext.'component-scan'('base-package': packagesToScan.join(',')) + } - if (packagesToScan) { - xmlns grailsContext:"http://grails.org/schema/context" - grailsContext.'component-scan'('base-package':packagesToScan.join(',')) - } + grailsApplicationAwarePostProcessor(GrailsApplicationAwareBeanPostProcessor, ref('grailsApplication')) + pluginManagerPostProcessor(PluginManagerAwareBeanPostProcessor) - grailsApplicationAwarePostProcessor(GrailsApplicationAwareBeanPostProcessor, ref("grailsApplication")) - pluginManagerPostProcessor(PluginManagerAwareBeanPostProcessor) + // add shutdown hook if not running in war deployed mode + final warDeployed = Environment.isWarDeployed() + final devMode = !warDeployed && environment == Environment.DEVELOPMENT + if (devMode && ClassUtils.isPresent('jline.Terminal', application.classLoader)) { + shutdownHook(DevelopmentShutdownHook) + } + abstractGrailsResourceLocator { + searchLocations = [BuildSettings.BASE_DIR.absolutePath] + } + grailsResourceLocator(DefaultResourceLocator) { bean -> + bean.parent = 'abstractGrailsResourceLocator' + } - // add shutdown hook if not running in war deployed mode - final warDeployed = Environment.isWarDeployed() - final devMode = !warDeployed && environment == Environment.DEVELOPMENT - if (devMode && ClassUtils.isPresent('jline.Terminal', application.classLoader)) { - shutdownHook(DevelopmentShutdownHook) - } - abstractGrailsResourceLocator { - searchLocations = [BuildSettings.BASE_DIR.absolutePath] - } - grailsResourceLocator(DefaultResourceLocator) { bean -> - bean.parent = "abstractGrailsResourceLocator" - } + customEditors(CustomEditorConfigurer) { + customEditors = [(Class): ClassEditor, + (Properties): PropertiesEditor] + } - customEditors(CustomEditorConfigurer) { - customEditors = [(Class): ClassEditor, - (Properties): PropertiesEditor] + proxyHandler(DefaultProxyHandler) } - - proxyHandler(DefaultProxyHandler) - }} + } @Override @CompileStatic void onChange(Map event) { - GenericApplicationContext applicationContext = (GenericApplicationContext)this.applicationContext + GenericApplicationContext applicationContext = (GenericApplicationContext) this.applicationContext if (event.source instanceof Resource) { - Resource res = (Resource)event.source - if(res.filename.endsWith('.xml')) { + Resource res = (Resource) event.source + if (res.filename.endsWith('.xml')) { def xmlBeans = new DefaultListableBeanFactory() new XmlBeanDefinitionReader(xmlBeans).loadBeanDefinitions(res) - for(String beanName in xmlBeans.beanDefinitionNames) { + for (String beanName in xmlBeans.beanDefinitionNames) { applicationContext.registerBeanDefinition(beanName, xmlBeans.getBeanDefinition(beanName)) } } } else if (event.source instanceof Class) { def clazz = (Class) event.source - if(Script.isAssignableFrom(clazz)) { + if (Script.isAssignableFrom(clazz)) { RuntimeSpringConfiguration springConfig = new DefaultRuntimeSpringConfiguration(applicationContext) RuntimeSpringConfigUtilities.reloadSpringResourcesConfig(springConfig, grailsApplication, clazz) springConfig.registerBeansWithContext(applicationContext) diff --git a/grails-core/src/main/groovy/org/grails/plugins/CorePluginFinder.java b/grails-core/src/main/groovy/org/grails/plugins/CorePluginFinder.java index f306a09e225..74f39436d29 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/CorePluginFinder.java +++ b/grails-core/src/main/groovy/org/grails/plugins/CorePluginFinder.java @@ -18,25 +18,34 @@ */ package org.grails.plugins; -import grails.core.GrailsApplication; -import grails.core.support.ParentApplicationContextAware; -import org.grails.core.exceptions.GrailsConfigurationException; -import org.grails.io.support.SpringIOUtils; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Enumeration; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.parsers.SAXParser; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.core.io.Resource; -import org.springframework.core.io.UrlResource; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.parsers.SAXParser; -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.*; +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.Resource; +import org.springframework.core.io.UrlResource; + +import grails.core.GrailsApplication; +import grails.core.support.ParentApplicationContextAware; +import org.grails.core.exceptions.GrailsConfigurationException; +import org.grails.io.support.SpringIOUtils; /** * Loads core plugin classes. Contains functionality moved in from DefaultGrailsPluginManager. @@ -49,11 +58,11 @@ public class CorePluginFinder implements ParentApplicationContextAware { private static final Logger LOG = LoggerFactory.getLogger(CorePluginFinder.class); public static final String CORE_PLUGIN_PATTERN = "META-INF/grails-plugin.xml"; - private final Set> foundPluginClasses = new HashSet>(); + private final Set> foundPluginClasses = new HashSet<>(); @SuppressWarnings("unused") private final GrailsApplication application; @SuppressWarnings("rawtypes") - private final Map binaryDescriptors = new HashMap(); + private final Map binaryDescriptors = new HashMap<>(); public CorePluginFinder(GrailsApplication application) { this.application = application; @@ -91,8 +100,6 @@ private Resource[] resolvePluginResources() throws IOException { return resourceList.toArray(new Resource[resourceList.size()]); } - - @SuppressWarnings("rawtypes") private void loadCorePluginsFromResources(Resource[] resources) throws IOException { @@ -109,7 +116,7 @@ private void loadCorePluginsFromResources(Resource[] resources) throws IOExcepti for (String pluginType : ph.pluginTypes) { Class pluginClass = attemptCorePluginClassLoad(pluginType); - if(pluginClass != null) { + if (pluginClass != null) { addPlugin(pluginClass); binaryDescriptors.put(pluginClass, new BinaryGrailsPluginDescriptor(resource, ph.pluginClasses)); } @@ -128,7 +135,6 @@ private void loadCorePluginsFromResources(Resource[] resources) throws IOExcepti } } - private Class attemptCorePluginClassLoad(String pluginClassName) { try { final ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); @@ -143,7 +149,6 @@ private Class attemptCorePluginClassLoad(String pluginClassName) { return null; } - private void addPlugin(Class plugin) { foundPluginClasses.add(plugin); } @@ -164,11 +169,11 @@ class PluginHandler extends DefaultHandler { @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { - if(localName.equals("type")) { + if (localName.equals("type")) { state = PluginParseState.TYPE; buff = new StringBuilder(); } - else if(localName.equals("resource")) { + else if (localName.equals("resource")) { state = PluginParseState.RESOURCE; buff = new StringBuilder(); } diff --git a/grails-core/src/main/groovy/org/grails/plugins/DefaultGrailsPlugin.java b/grails-core/src/main/groovy/org/grails/plugins/DefaultGrailsPlugin.java index 6ab8520d9b0..0985f6d6ee4 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/DefaultGrailsPlugin.java +++ b/grails-core/src/main/groovy/org/grails/plugins/DefaultGrailsPlugin.java @@ -18,33 +18,28 @@ */ package org.grails.plugins; -import grails.core.ArtefactHandler; -import grails.core.GrailsApplication; -import grails.core.support.GrailsApplicationAware; -import grails.core.support.ParentApplicationContextAware; -import grails.plugins.GrailsPlugin; -import grails.plugins.GrailsPluginManager; -import grails.plugins.Plugin; -import grails.plugins.exceptions.PluginException; -import grails.spring.BeanBuilder; -import grails.util.CollectionUtils; -import grails.util.Environment; -import grails.util.GrailsArrayUtils; -import grails.util.GrailsClassUtils; -import grails.util.GrailsUtil; +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + import groovy.lang.Binding; import groovy.lang.Closure; import groovy.lang.GroovyClassLoader; import groovy.lang.GroovyObject; import groovy.lang.MetaClass; +import org.codehaus.groovy.runtime.DefaultGroovyMethods; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.codehaus.groovy.runtime.DefaultGroovyMethods; -import org.grails.core.io.CachingPathMatchingResourcePatternResolver; -import org.grails.core.io.SpringResource; -import org.grails.plugins.support.WatchPattern; -import org.grails.plugins.support.WatchPatternParser; -import org.grails.spring.RuntimeSpringConfiguration; + import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.beans.BeansException; @@ -59,17 +54,25 @@ import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import org.springframework.core.type.filter.TypeFilter; -import java.io.File; -import java.io.IOException; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; +import grails.core.ArtefactHandler; +import grails.core.GrailsApplication; +import grails.core.support.GrailsApplicationAware; +import grails.core.support.ParentApplicationContextAware; +import grails.plugins.GrailsPlugin; +import grails.plugins.GrailsPluginManager; +import grails.plugins.Plugin; +import grails.plugins.exceptions.PluginException; +import grails.spring.BeanBuilder; +import grails.util.CollectionUtils; +import grails.util.Environment; +import grails.util.GrailsArrayUtils; +import grails.util.GrailsClassUtils; +import grails.util.GrailsUtil; +import org.grails.core.io.CachingPathMatchingResourcePatternResolver; +import org.grails.core.io.SpringResource; +import org.grails.plugins.support.WatchPattern; +import org.grails.plugins.support.WatchPatternParser; +import org.grails.spring.RuntimeSpringConfiguration; /** * Implementation of the GrailsPlugin interface that wraps a Groovy plugin class @@ -108,8 +111,8 @@ public class DefaultGrailsPlugin extends AbstractGrailsPlugin implements ParentA private Class[] providedArtefacts = {}; private Collection profiles = null; private Map pluginEnvs; - private List pluginExcludes = new ArrayList(); - private Collection typeFilters = new ArrayList(); + private List pluginExcludes = new ArrayList<>(); + private Collection typeFilters = new ArrayList<>(); private Resource pluginDescriptor; private List watchedResourcePatterns; @@ -123,16 +126,16 @@ public DefaultGrailsPlugin(Class pluginClass, Resource resource, GrailsApplic try { initialisePlugin(pluginClass); } catch (Throwable e) { - throw new PluginException("Error initialising plugin for class ["+pluginClass.getName()+"]:" + e.getMessage(), e); + throw new PluginException("Error initialising plugin for class [" + pluginClass.getName() + "]:" + e.getMessage(), e); } } @Override public boolean isEnabled(String[] activeProfiles) { - if(profiles == null) return true; + if (profiles == null) return true; else { for (String activeProfile : activeProfiles) { - if(profiles.contains(activeProfile)) return true; + if (profiles.contains(activeProfile)) return true; } } return false; @@ -141,11 +144,11 @@ public boolean isEnabled(String[] activeProfiles) { @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { super.setApplicationContext(applicationContext); - if(this.plugin instanceof ApplicationContextAware) { - ((ApplicationContextAware)plugin).setApplicationContext(applicationContext); + if (this.plugin instanceof ApplicationContextAware) { + ((ApplicationContextAware) plugin).setApplicationContext(applicationContext); } - if(this.plugin instanceof ApplicationListener) { - ((ConfigurableApplicationContext)applicationContext).addApplicationListener((ApplicationListener)plugin); + if (this.plugin instanceof ApplicationListener) { + ((ConfigurableApplicationContext) applicationContext).addApplicationListener((ApplicationListener) plugin); } } @@ -169,23 +172,23 @@ public boolean hasInterestInChange(String path) { @Override public void setManager(GrailsPluginManager manager) { super.setManager(manager); - if(plugin instanceof Plugin) { - ((Plugin)plugin).setPluginManager(manager); + if (plugin instanceof Plugin) { + ((Plugin) plugin).setPluginManager(manager); } } private void initialisePlugin(Class clazz) { pluginGrailsClass = new GrailsPluginClass(clazz); - plugin = (GroovyObject)pluginGrailsClass.newInstance(); - if(plugin instanceof Plugin) { - Plugin p = (Plugin)plugin; + plugin = (GroovyObject) pluginGrailsClass.newInstance(); + if (plugin instanceof Plugin) { + Plugin p = (Plugin) plugin; p.setApplicationContext(applicationContext); p.setPlugin(this); p.setGrailsApplication(grailsApplication); p.setPluginManager(manager); } - else if(plugin instanceof GrailsApplicationAware) { - ((GrailsApplicationAware)plugin).setGrailsApplication(grailsApplication); + else if (plugin instanceof GrailsApplicationAware) { + ((GrailsApplicationAware) plugin).setGrailsApplication(grailsApplication); } pluginBean = new BeanWrapperImpl(plugin); @@ -225,7 +228,7 @@ private void evaluatePluginScopes() { private static final long serialVersionUID = 1; @Override public Object call(Object arguments) { - String envName = (String)arguments; + String envName = (String) arguments; Environment env = Environment.getEnvironment(envName); if (env != null) return env.getName(); return arguments; @@ -237,7 +240,7 @@ private Map evaluateIncludeExcludeProperty(String name, Closure converter) { Map resultMap = new HashMap(); Object propertyValue = GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(plugin, name); if (propertyValue instanceof Map) { - Map containedMap = (Map)propertyValue; + Map containedMap = (Map) propertyValue; Object includes = containedMap.get(INCLUDES); evaluateAndAddIncludeExcludeObject(resultMap, includes, true, converter); @@ -254,11 +257,11 @@ private Map evaluateIncludeExcludeProperty(String name, Closure converter) { private void evaluateAndAddIncludeExcludeObject(Map targetMap, Object includeExcludeObject, boolean include, Closure converter) { if (includeExcludeObject instanceof String) { final String includeExcludeString = (String) includeExcludeObject; - evaluateAndAddToIncludeExcludeSet(targetMap,includeExcludeString, include, converter); + evaluateAndAddToIncludeExcludeSet(targetMap, includeExcludeString, include, converter); } else if (includeExcludeObject instanceof List) { List includeExcludeList = (List) includeExcludeObject; - evaluateAndAddListOfValues(targetMap,includeExcludeList, include, converter); + evaluateAndAddListOfValues(targetMap, includeExcludeList, include, converter); } } @@ -273,7 +276,7 @@ private void evaluateAndAddListOfValues(Map targetMap, List includeExcludeList, @SuppressWarnings("unchecked") private void evaluateAndAddToIncludeExcludeSet(Map targetMap, String includeExcludeString, boolean include, Closure converter) { - Set set = lazilyCreateIncludeOrExcludeSet(targetMap,include); + Set set = lazilyCreateIncludeOrExcludeSet(targetMap, include); set.add(converter.call(includeExcludeString)); } @@ -293,18 +296,17 @@ private void evaluateProvidedArtefacts() { Object result = GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(pluginBean, plugin, PROVIDED_ARTEFACTS); if (result instanceof Collection) { final Collection artefactList = (Collection) result; - providedArtefacts = (Class[])artefactList.toArray(new Class[artefactList.size()]); + providedArtefacts = (Class[]) artefactList.toArray(new Class[artefactList.size()]); } } private void evaluateProfiles() { Object result = GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(pluginBean, plugin, PROFILES); if (result instanceof Collection) { - profiles = (Collection) result; + profiles = (Collection) result; } } - public DefaultGrailsPlugin(Class pluginClass, GrailsApplication application) { this(pluginClass, null, application); } @@ -313,7 +315,7 @@ private void evaluateObservedPlugins() { if (pluginBean.isReadableProperty(OBSERVE)) { Object observeProperty = GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(pluginBean, plugin, OBSERVE); if (observeProperty instanceof Collection) { - Collection observeList = (Collection)observeProperty; + Collection observeList = (Collection) observeProperty; observedPlugins = new String[observeList.size()]; int j = 0; for (Object anObserveList : observeList) { @@ -340,10 +342,10 @@ private void evaluatePluginStatus() { private void evaluateOnChangeListener() { if (pluginBean.isReadableProperty(ON_SHUTDOWN)) { - onShutdownListener = (Closure)GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(plugin, ON_SHUTDOWN); + onShutdownListener = (Closure) GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(plugin, ON_SHUTDOWN); } if (pluginBean.isReadableProperty(ON_CONFIG_CHANGE)) { - onConfigChangeListener = (Closure)GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(plugin, ON_CONFIG_CHANGE); + onConfigChangeListener = (Closure) GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(plugin, ON_CONFIG_CHANGE); } if (pluginBean.isReadableProperty(ON_CHANGE)) { onChangeListener = (Closure) GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(plugin, ON_CHANGE); @@ -363,19 +365,19 @@ private void evaluateOnChangeListener() { List resourceList = null; if (referencedResources instanceof String) { if (LOG.isDebugEnabled()) { - LOG.debug("Configuring plugin "+this+" to watch resources with pattern: " + referencedResources); + LOG.debug("Configuring plugin " + this + " to watch resources with pattern: " + referencedResources); } resourceList = Collections.singletonList(referencedResources.toString()); } else if (referencedResources instanceof List) { - resourceList = (List)referencedResources; + resourceList = (List) referencedResources; } if (resourceList == null) { return; } - List resourceListTmp = new ArrayList(); + List resourceListTmp = new ArrayList<>(); final String baseLocation = env.getReloadLocation(); for (Object ref : resourceList) { @@ -414,7 +416,8 @@ private String getResourcePatternForBaseLocation(String baseLocation, String res String location = baseLocation; if (!location.endsWith(File.separator)) location = location + File.separator; if (resourcePath.startsWith("./")) { - return "file:" + location + resourcePath.substring(2); } + return "file:" + location + resourcePath.substring(2); + } else if (resourcePath.startsWith("file:./")) { return "file:" + location + resourcePath.substring(7); } @@ -456,13 +459,13 @@ private void evaluatePluginLoadAfters() { if (pluginBean.isReadableProperty(PLUGIN_LOAD_AFTER_NAMES)) { List loadAfterNamesList = (List) GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(pluginBean, plugin, PLUGIN_LOAD_AFTER_NAMES); if (loadAfterNamesList != null) { - loadAfterNames = (String[])loadAfterNamesList.toArray(new String[loadAfterNamesList.size()]); + loadAfterNames = (String[]) loadAfterNamesList.toArray(new String[loadAfterNamesList.size()]); } } if (pluginBean.isReadableProperty(PLUGIN_LOAD_BEFORE_NAMES)) { List loadBeforeNamesList = (List) GrailsClassUtils.getPropertyOrStaticPropertyOrFieldValue(pluginBean, plugin, PLUGIN_LOAD_BEFORE_NAMES); if (loadBeforeNamesList != null) { - loadBeforeNames = (String[])loadBeforeNamesList.toArray(new String[loadBeforeNamesList.size()]); + loadBeforeNames = (String[]) loadBeforeNamesList.toArray(new String[loadBeforeNamesList.size()]); } } } @@ -505,7 +508,7 @@ public BeanBuilder beans(Closure closure) { } public void doWithApplicationContext(ApplicationContext ctx) { - if(plugin instanceof Plugin) { + if (plugin instanceof Plugin) { Plugin pluginObject = (Plugin) plugin; pluginObject.setApplicationContext(ctx); @@ -519,13 +522,13 @@ public void doWithApplicationContext(ApplicationContext ctx) { private void invokePluginHook(String methodName, Object[] args, ApplicationContext ctx) { if (pluginBean.isReadableProperty(methodName)) { - Closure c = (Closure)plugin.getProperty(methodName); + Closure c = (Closure) plugin.getProperty(methodName); c.setDelegate(this); c.call(args); } else { MetaClass pluginMetaClass = pluginGrailsClass.getMetaClass(); - if(!pluginMetaClass.respondsTo(plugin, methodName, args).isEmpty()) { + if (!pluginMetaClass.respondsTo(plugin, methodName, args).isEmpty()) { pluginMetaClass.invokeMethod(plugin, methodName, ctx); } } @@ -540,10 +543,10 @@ public void doWithRuntimeConfiguration(RuntimeSpringConfiguration springConfig) b.setVariable("parentCtx", getParentCtx()); b.setVariable("resolver", getResolver()); - if(plugin instanceof Plugin) { + if (plugin instanceof Plugin) { Closure c = ((Plugin) plugin).doWithSpring(); - if(c != null) { - BeanBuilder bb = new BeanBuilder(getParentCtx(),springConfig, grailsApplication.getClassLoader()); + if (c != null) { + BeanBuilder bb = new BeanBuilder(getParentCtx(), springConfig, grailsApplication.getClassLoader()); bb.setBinding(b); c.setDelegate(bb); bb.invokeMethod("beans", new Object[]{c}); @@ -557,8 +560,8 @@ public void doWithRuntimeConfiguration(RuntimeSpringConfiguration springConfig) LOG.debug("Plugin " + this + " is participating in Spring configuration..."); } - Closure c = (Closure)plugin.getProperty(DO_WITH_SPRING); - BeanBuilder bb = new BeanBuilder(getParentCtx(),springConfig, grailsApplication.getClassLoader()); + Closure c = (Closure) plugin.getProperty(DO_WITH_SPRING); + BeanBuilder bb = new BeanBuilder(getParentCtx(), springConfig, grailsApplication.getClassLoader()); bb.setBinding(b); c.setDelegate(bb); bb.invokeMethod("beans", new Object[]{c}); @@ -606,7 +609,7 @@ private boolean supportsValueInIncludeExcludeMap(Map includeExcludeMap, Object v return includes.contains(value); } - Set excludes = (Set)includeExcludeMap.get(EXCLUDES); + Set excludes = (Set) includeExcludeMap.get(EXCLUDES); return !(excludes != null && excludes.contains(value)); } @@ -624,7 +627,7 @@ public Resource[] getWatchedResources() { try { Resource[] resources = resolver.getResources(resourcesReference); if (resources.length > 0) { - watchedResources = (Resource[])GrailsArrayUtils.addAll(watchedResources, resources); + watchedResources = (Resource[]) GrailsArrayUtils.addAll(watchedResources, resources); } } catch (Exception ignored) { @@ -693,8 +696,8 @@ public GroovyObject getInstance() { } public void doWithDynamicMethods(ApplicationContext ctx) { - if(plugin instanceof Plugin) { - ((Plugin)plugin).doWithDynamicMethods(); + if (plugin instanceof Plugin) { + ((Plugin) plugin).doWithDynamicMethods(); } else { Object[] args = {ctx}; @@ -703,8 +706,8 @@ public void doWithDynamicMethods(ApplicationContext ctx) { } public boolean isEnabled() { - if(plugin instanceof Plugin) { - return ((Plugin)plugin).isEnabled(); + if (plugin instanceof Plugin) { + return ((Plugin) plugin).isEnabled(); } else { return STATUS_ENABLED.equals(status); @@ -716,10 +719,10 @@ public String[] getObservedPluginNames() { } public void notifyOfEvent(Map event) { - if(plugin instanceof Plugin) { - ((Plugin)plugin).onChange(event); + if (plugin instanceof Plugin) { + ((Plugin) plugin).onChange(event); } - else if(onChangeListener != null) { + else if (onChangeListener != null) { invokeOnChangeListener(event); } } @@ -735,8 +738,8 @@ PLUGIN_CHANGE_EVENT_MANAGER, getManager(), switch (eventKind) { case EVENT_ON_CHANGE: - if(plugin instanceof Plugin) { - ((Plugin)plugin).onChange(event); + if (plugin instanceof Plugin) { + ((Plugin) plugin).onChange(event); } else { notifyOfEvent(event); @@ -744,8 +747,8 @@ PLUGIN_CHANGE_EVENT_MANAGER, getManager(), getManager().informObservers(getName(), event); break; case EVENT_ON_SHUTDOWN: - if(plugin instanceof Plugin) { - ((Plugin)plugin).onShutdown(event); + if (plugin instanceof Plugin) { + ((Plugin) plugin).onShutdown(event); } else { invokeOnShutdownEventListener(event); @@ -753,8 +756,8 @@ PLUGIN_CHANGE_EVENT_MANAGER, getManager(), break; case EVENT_ON_CONFIG_CHANGE: - if(plugin instanceof Plugin) { - ((Plugin)plugin).onConfigChange(event); + if (plugin instanceof Plugin) { + ((Plugin) plugin).onConfigChange(event); } else { @@ -769,11 +772,11 @@ PLUGIN_CHANGE_EVENT_MANAGER, getManager(), } private void invokeOnShutdownEventListener(Map event) { - callEvent(onShutdownListener,event); + callEvent(onShutdownListener, event); } private void invokeOnConfigChangeListener(Map event) { - callEvent(onConfigChangeListener,event); + callEvent(onConfigChangeListener, event); } private void callEvent(Closure closureHook, Map event) { @@ -811,14 +814,13 @@ public void doArtefactConfiguration() { return; } - List l; - if(plugin instanceof Plugin) { - l = ((Plugin)plugin).getArtefacts(); + if (plugin instanceof Plugin) { + l = ((Plugin) plugin).getArtefacts(); } else { - l = (List)plugin.getProperty(ARTEFACTS); + l = (List) plugin.getProperty(ARTEFACTS); } for (Object artefact : l) { if (artefact instanceof Class) { diff --git a/grails-core/src/main/groovy/org/grails/plugins/ExcludingPluginFilter.java b/grails-core/src/main/groovy/org/grails/plugins/ExcludingPluginFilter.java index ebcc09de9ec..4c4d15e197c 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/ExcludingPluginFilter.java +++ b/grails-core/src/main/groovy/org/grails/plugins/ExcludingPluginFilter.java @@ -18,14 +18,14 @@ */ package org.grails.plugins; -import grails.plugins.GrailsPlugin; - import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.Set; +import grails.plugins.GrailsPlugin; + /** * Implementation of PluginFilter which removes that all of the supplied * plugins (identified by name) as well as their dependencies are omitted from the diff --git a/grails-core/src/main/groovy/org/grails/plugins/IdentityPluginFilter.java b/grails-core/src/main/groovy/org/grails/plugins/IdentityPluginFilter.java index e4d15ddebba..414a0626429 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/IdentityPluginFilter.java +++ b/grails-core/src/main/groovy/org/grails/plugins/IdentityPluginFilter.java @@ -18,10 +18,10 @@ */ package org.grails.plugins; -import grails.plugins.PluginFilter; - import java.util.List; +import grails.plugins.PluginFilter; + /** * No-op implementation of PluginFilter. * diff --git a/grails-core/src/main/groovy/org/grails/plugins/IncludingPluginFilter.java b/grails-core/src/main/groovy/org/grails/plugins/IncludingPluginFilter.java index bbe97478578..a7d8a976561 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/IncludingPluginFilter.java +++ b/grails-core/src/main/groovy/org/grails/plugins/IncludingPluginFilter.java @@ -18,12 +18,12 @@ */ package org.grails.plugins; -import grails.plugins.GrailsPlugin; - import java.util.ArrayList; import java.util.List; import java.util.Set; +import grails.plugins.GrailsPlugin; + /** * Implementation of PluginFilter which ensures that only the supplied * plugins (identified by name) as well as their dependencies are included in the filtered plugin list. diff --git a/grails-core/src/main/groovy/org/grails/plugins/MockGrailsPluginManager.java b/grails-core/src/main/groovy/org/grails/plugins/MockGrailsPluginManager.java index 3a464c17a53..973c4bcc61c 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/MockGrailsPluginManager.java +++ b/grails-core/src/main/groovy/org/grails/plugins/MockGrailsPluginManager.java @@ -18,15 +18,15 @@ */ package org.grails.plugins; -import grails.plugins.GrailsPlugin; -import groovy.lang.GroovyClassLoader; - import java.math.BigDecimal; import java.util.Collection; import java.util.Map; +import groovy.lang.GroovyClassLoader; + import grails.core.DefaultGrailsApplication; import grails.core.GrailsApplication; +import grails.plugins.GrailsPlugin; import grails.plugins.exceptions.PluginException; /** diff --git a/grails-core/src/main/groovy/org/grails/plugins/PluginFilterRetriever.java b/grails-core/src/main/groovy/org/grails/plugins/PluginFilterRetriever.java index 5a695b90aac..501fac275da 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/PluginFilterRetriever.java +++ b/grails-core/src/main/groovy/org/grails/plugins/PluginFilterRetriever.java @@ -18,16 +18,16 @@ */ package org.grails.plugins; -import grails.config.Config; -import grails.config.Settings; -import grails.plugins.PluginFilter; - import java.util.Collection; import java.util.HashSet; import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import grails.config.Config; +import grails.config.Settings; +import grails.plugins.PluginFilter; + /** * Implements mechanism for figuring out what PluginFilter * implementation to use based on a set of provided configuration properties. @@ -37,7 +37,6 @@ */ public class PluginFilterRetriever { - @SuppressWarnings("rawtypes") public PluginFilter getPluginFilter(Config config) { @@ -54,7 +53,7 @@ PluginFilter getPluginFilter(Object includes, Object excludes) { if (includes != null) { if (includes instanceof Collection) { - pluginFilter = new IncludingPluginFilter(new HashSet((Collection)includes)); + pluginFilter = new IncludingPluginFilter(new HashSet((Collection) includes)); } else { String[] includesArray = StringUtils.commaDelimitedListToStringArray(includes.toString()); @@ -63,7 +62,7 @@ PluginFilter getPluginFilter(Object includes, Object excludes) { } else if (excludes != null) { if (excludes instanceof Collection) { - pluginFilter = new ExcludingPluginFilter(new HashSet((Collection)excludes)); + pluginFilter = new ExcludingPluginFilter(new HashSet((Collection) excludes)); } else { String[] excludesArray = StringUtils.commaDelimitedListToStringArray(excludes.toString()); diff --git a/grails-core/src/main/groovy/org/grails/plugins/ProfilingGrailsPluginManager.java b/grails-core/src/main/groovy/org/grails/plugins/ProfilingGrailsPluginManager.java index 93af327f43c..50111a82f0c 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/ProfilingGrailsPluginManager.java +++ b/grails-core/src/main/groovy/org/grails/plugins/ProfilingGrailsPluginManager.java @@ -18,16 +18,18 @@ */ package org.grails.plugins; -import grails.plugins.DefaultGrailsPluginManager; -import grails.plugins.GrailsPlugin; import groovy.lang.GroovySystem; import groovy.lang.MetaClassRegistry; + +import org.springframework.context.ApplicationContext; +import org.springframework.core.io.Resource; + import grails.core.GrailsApplication; +import grails.plugins.DefaultGrailsPluginManager; +import grails.plugins.GrailsPlugin; +import grails.plugins.exceptions.PluginException; import org.grails.core.exceptions.GrailsConfigurationException; import org.grails.spring.RuntimeSpringConfiguration; -import grails.plugins.exceptions.PluginException; -import org.springframework.context.ApplicationContext; -import org.springframework.core.io.Resource; /** * A GrailsPluginManager implementation that outputs profile data to a logger. diff --git a/grails-core/src/main/groovy/org/grails/plugins/core/CoreAutoConfiguration.java b/grails-core/src/main/groovy/org/grails/plugins/core/CoreAutoConfiguration.java index e914ac1b28a..9bb20e7d2b2 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/core/CoreAutoConfiguration.java +++ b/grails-core/src/main/groovy/org/grails/plugins/core/CoreAutoConfiguration.java @@ -18,10 +18,6 @@ */ package org.grails.plugins.core; -import grails.config.ConfigProperties; -import grails.config.Settings; -import grails.core.GrailsApplication; -import org.grails.spring.context.support.GrailsPlaceholderConfigurer; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureOrder; @@ -31,6 +27,11 @@ import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.core.Ordered; +import grails.config.ConfigProperties; +import grails.config.Settings; +import grails.core.GrailsApplication; +import org.grails.spring.context.support.GrailsPlaceholderConfigurer; + /** * Core beans. * diff --git a/grails-core/src/main/groovy/org/grails/plugins/support/WatchPatternParser.java b/grails-core/src/main/groovy/org/grails/plugins/support/WatchPatternParser.java index 1677cbc460f..1836ccb0b13 100644 --- a/grails-core/src/main/groovy/org/grails/plugins/support/WatchPatternParser.java +++ b/grails-core/src/main/groovy/org/grails/plugins/support/WatchPatternParser.java @@ -18,15 +18,16 @@ */ package org.grails.plugins.support; -import grails.io.ResourceUtils; -import grails.util.BuildSettings; -import grails.util.GrailsStringUtils; -import org.springframework.util.StringUtils; - import java.io.File; import java.util.ArrayList; import java.util.List; +import org.springframework.util.StringUtils; + +import grails.io.ResourceUtils; +import grails.util.BuildSettings; +import grails.util.GrailsStringUtils; + /** * Parses a Grails plugin's watchedResources property value into a list of * @@ -38,7 +39,7 @@ public class WatchPatternParser { public static final String WILD_CARD = "*"; public List getWatchPatterns(List patterns) { - List watchPatterns = new ArrayList(); + List watchPatterns = new ArrayList<>(); for (String pattern : patterns) { WatchPattern watchPattern = new WatchPattern(); @@ -54,10 +55,10 @@ else if (pattern.startsWith(ResourceUtils.CLASSPATH_URL_PREFIX)) { if (pattern.contains(WILD_CARD)) { String dirPath = pattern.substring(0, pattern.indexOf(WILD_CARD)); - if(!GrailsStringUtils.isBlank(dirPath)) { + if (!GrailsStringUtils.isBlank(dirPath)) { watchPattern.setDirectory(new File(dirPath)); } - else if(isClasspath && BuildSettings.BASE_DIR != null) { + else if (isClasspath && BuildSettings.BASE_DIR != null) { watchPattern.setDirectory(new File(BuildSettings.BASE_DIR, "src/main/resources")); } @@ -71,7 +72,7 @@ else if(isClasspath && BuildSettings.BASE_DIR != null) { } } - return watchPatterns; + return watchPatterns; } private void setExtension(String pattern, WatchPattern watchPattern) { diff --git a/grails-core/src/main/groovy/org/grails/spring/RuntimeSpringConfigUtilities.java b/grails-core/src/main/groovy/org/grails/spring/RuntimeSpringConfigUtilities.java index 9c811577c16..3a964f25700 100644 --- a/grails-core/src/main/groovy/org/grails/spring/RuntimeSpringConfigUtilities.java +++ b/grails-core/src/main/groovy/org/grails/spring/RuntimeSpringConfigUtilities.java @@ -18,17 +18,19 @@ */ package org.grails.spring; -import grails.spring.BeanBuilder; -import grails.util.CollectionUtils; import groovy.lang.Binding; import groovy.lang.Closure; import groovy.lang.Script; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import grails.core.GrailsApplication; + import org.springframework.context.support.GenericApplicationContext; import org.springframework.util.ClassUtils; -import org.grails.spring.RuntimeSpringConfiguration; + +import grails.core.GrailsApplication; +import grails.spring.BeanBuilder; +import grails.util.CollectionUtils; /** * @since 2.4 @@ -44,7 +46,6 @@ public class RuntimeSpringConfigUtilities { private static final String DEVELOPMENT_SPRING_RESOURCES_XML = "file:./grails-app/conf/spring/resources.xml"; - private static volatile BeanBuilder springGroovyResourcesBeanBuilder = null; private RuntimeSpringConfigUtilities() { @@ -95,14 +96,14 @@ public static void loadExternalSpringConfig(RuntimeSpringConfiguration config, f } public static BeanBuilder reloadSpringResourcesConfig(RuntimeSpringConfiguration config, GrailsApplication application, Class groovySpringResourcesClass) throws InstantiationException, IllegalAccessException { - springGroovyResourcesBeanBuilder = new BeanBuilder(null, config,Thread.currentThread().getContextClassLoader()); + springGroovyResourcesBeanBuilder = new BeanBuilder(null, config, Thread.currentThread().getContextClassLoader()); springGroovyResourcesBeanBuilder.setBinding(new Binding(CollectionUtils.newMap( "application", application, "grailsApplication", application))); // GRAILS-7550 Script script = (Script) groovySpringResourcesClass.newInstance(); script.run(); Object beans = script.getProperty("beans"); - springGroovyResourcesBeanBuilder.beans((Closure)beans); + springGroovyResourcesBeanBuilder.beans((Closure) beans); return springGroovyResourcesBeanBuilder; } @@ -116,7 +117,6 @@ public static void loadSpringGroovyResourcesIntoContext(RuntimeSpringConfigurati doLoadSpringGroovyResources(config, application, context); } - /** * Resets the GrailsRumtimeConfigurator. */ diff --git a/grails-core/src/main/groovy/org/grails/spring/aop/autoproxy/GroovyAwareAspectJAwareAdvisorAutoProxyCreator.java b/grails-core/src/main/groovy/org/grails/spring/aop/autoproxy/GroovyAwareAspectJAwareAdvisorAutoProxyCreator.java index a5ee29027cc..417d30f037a 100644 --- a/grails-core/src/main/groovy/org/grails/spring/aop/autoproxy/GroovyAwareAspectJAwareAdvisorAutoProxyCreator.java +++ b/grails-core/src/main/groovy/org/grails/spring/aop/autoproxy/GroovyAwareAspectJAwareAdvisorAutoProxyCreator.java @@ -19,11 +19,8 @@ package org.grails.spring.aop.autoproxy; import groovy.lang.GroovyObject; -import org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator; -import org.springframework.aop.config.AopConfigUtils; -import java.lang.reflect.Field; -import java.util.List; +import org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator; /** * Enables AspectJ weaving from the application context. @@ -33,8 +30,6 @@ */ public class GroovyAwareAspectJAwareAdvisorAutoProxyCreator extends AnnotationAwareAspectJAutoProxyCreator { - - private static final long serialVersionUID = 1; @Override diff --git a/grails-core/src/main/groovy/org/grails/spring/aop/autoproxy/GroovyAwareInfrastructureAdvisorAutoProxyCreator.java b/grails-core/src/main/groovy/org/grails/spring/aop/autoproxy/GroovyAwareInfrastructureAdvisorAutoProxyCreator.java index 4681455b446..47db9a35217 100644 --- a/grails-core/src/main/groovy/org/grails/spring/aop/autoproxy/GroovyAwareInfrastructureAdvisorAutoProxyCreator.java +++ b/grails-core/src/main/groovy/org/grails/spring/aop/autoproxy/GroovyAwareInfrastructureAdvisorAutoProxyCreator.java @@ -19,6 +19,7 @@ package org.grails.spring.aop.autoproxy; import groovy.lang.GroovyObject; + import org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator; /** diff --git a/grails-core/src/main/groovy/org/grails/spring/beans/ClassLoaderAwareBeanPostProcessor.java b/grails-core/src/main/groovy/org/grails/spring/beans/ClassLoaderAwareBeanPostProcessor.java index fe8b58e6fa2..7a121269422 100644 --- a/grails-core/src/main/groovy/org/grails/spring/beans/ClassLoaderAwareBeanPostProcessor.java +++ b/grails-core/src/main/groovy/org/grails/spring/beans/ClassLoaderAwareBeanPostProcessor.java @@ -18,9 +18,10 @@ */ package org.grails.spring.beans; -import grails.core.support.ClassLoaderAware; import org.springframework.beans.BeansException; +import grails.core.support.ClassLoaderAware; + public class ClassLoaderAwareBeanPostProcessor extends BeanPostProcessorAdapter { private ClassLoader classLoader; @@ -32,7 +33,7 @@ public ClassLoaderAwareBeanPostProcessor(ClassLoader classLoader) { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { if (bean instanceof ClassLoaderAware) { - ((ClassLoaderAware)bean).setClassLoader(classLoader); + ((ClassLoaderAware) bean).setClassLoader(classLoader); } return bean; } diff --git a/grails-core/src/main/groovy/org/grails/spring/beans/GrailsApplicationAwareBeanPostProcessor.java b/grails-core/src/main/groovy/org/grails/spring/beans/GrailsApplicationAwareBeanPostProcessor.java index 7ade08e7392..7436f528e98 100644 --- a/grails-core/src/main/groovy/org/grails/spring/beans/GrailsApplicationAwareBeanPostProcessor.java +++ b/grails-core/src/main/groovy/org/grails/spring/beans/GrailsApplicationAwareBeanPostProcessor.java @@ -18,10 +18,11 @@ */ package org.grails.spring.beans; +import org.springframework.beans.BeansException; + import grails.core.GrailsApplication; import grails.core.support.GrailsApplicationAware; import grails.core.support.GrailsConfigurationAware; -import org.springframework.beans.BeansException; /** * Implementation of {@link org.springframework.beans.factory.config.BeanPostProcessor} @@ -47,10 +48,10 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro public static void processAwareInterfaces(GrailsApplication grailsApplication, Object bean) { if (bean instanceof GrailsApplicationAware) { - ((GrailsApplicationAware)bean).setGrailsApplication(grailsApplication); + ((GrailsApplicationAware) bean).setGrailsApplication(grailsApplication); } if (bean instanceof GrailsConfigurationAware) { - ((GrailsConfigurationAware)bean).setConfiguration(grailsApplication.getConfig()); + ((GrailsConfigurationAware) bean).setConfiguration(grailsApplication.getConfig()); } } } diff --git a/grails-core/src/main/groovy/org/grails/spring/beans/PluginManagerAwareBeanPostProcessor.java b/grails-core/src/main/groovy/org/grails/spring/beans/PluginManagerAwareBeanPostProcessor.java index e2ae41fca03..c12f16c7ed8 100644 --- a/grails-core/src/main/groovy/org/grails/spring/beans/PluginManagerAwareBeanPostProcessor.java +++ b/grails-core/src/main/groovy/org/grails/spring/beans/PluginManagerAwareBeanPostProcessor.java @@ -18,12 +18,13 @@ */ package org.grails.spring.beans; -import grails.plugins.GrailsPluginManager; -import grails.plugins.PluginManagerAware; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; +import grails.plugins.GrailsPluginManager; +import grails.plugins.PluginManagerAware; + /** * Auto-injects beans that implement PluginManagerAware. * @@ -34,9 +35,9 @@ public class PluginManagerAwareBeanPostProcessor extends BeanPostProcessorAdapte private GrailsPluginManager pluginManager; private BeanFactory beanFactory; - + public PluginManagerAwareBeanPostProcessor() { - + } public PluginManagerAwareBeanPostProcessor(GrailsPluginManager pluginManager) { @@ -45,15 +46,15 @@ public PluginManagerAwareBeanPostProcessor(GrailsPluginManager pluginManager) { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { - if(pluginManager == null) { - if(beanFactory.containsBean(GrailsPluginManager.BEAN_NAME)) { + if (pluginManager == null) { + if (beanFactory.containsBean(GrailsPluginManager.BEAN_NAME)) { pluginManager = beanFactory.getBean(GrailsPluginManager.BEAN_NAME, GrailsPluginManager.class); } } - if(pluginManager != null) { + if (pluginManager != null) { if (bean instanceof PluginManagerAware) { - ((PluginManagerAware)bean).setPluginManager(pluginManager); + ((PluginManagerAware) bean).setPluginManager(pluginManager); } } @@ -64,6 +65,4 @@ public Object postProcessBeforeInitialization(Object bean, String beanName) thro public void setBeanFactory(BeanFactory beanFactory) throws BeansException { this.beanFactory = beanFactory; } - - } diff --git a/grails-core/src/main/groovy/org/grails/spring/beans/factory/GenericBeanFactoryAccessor.java b/grails-core/src/main/groovy/org/grails/spring/beans/factory/GenericBeanFactoryAccessor.java index 68cff209398..4f73a6440b3 100644 --- a/grails-core/src/main/groovy/org/grails/spring/beans/factory/GenericBeanFactoryAccessor.java +++ b/grails-core/src/main/groovy/org/grails/spring/beans/factory/GenericBeanFactoryAccessor.java @@ -94,7 +94,7 @@ public Map getBeansOfType(Class type, boolean includeNonSingle * keys and the corresponding bean instances as values */ public Map getBeansWithAnnotation(Class annotationType) { - Map results = new LinkedHashMap(); + Map results = new LinkedHashMap<>(); for (String beanName : beanFactory.getBeanNamesForType(Object.class)) { if (findAnnotationOnBean(beanName, annotationType) != null) { results.put(beanName, beanFactory.getBean(beanName)); diff --git a/grails-core/src/main/groovy/org/grails/spring/beans/factory/HotSwappableTargetSourceFactoryBean.groovy b/grails-core/src/main/groovy/org/grails/spring/beans/factory/HotSwappableTargetSourceFactoryBean.groovy index db81fd06e65..33fea567562 100644 --- a/grails-core/src/main/groovy/org/grails/spring/beans/factory/HotSwappableTargetSourceFactoryBean.groovy +++ b/grails-core/src/main/groovy/org/grails/spring/beans/factory/HotSwappableTargetSourceFactoryBean.groovy @@ -19,6 +19,7 @@ package org.grails.spring.beans.factory import groovy.transform.CompileStatic + import org.springframework.aop.target.HotSwappableTargetSource import org.springframework.beans.factory.FactoryBean import org.springframework.beans.factory.InitializingBean @@ -31,10 +32,10 @@ import org.springframework.beans.factory.InitializingBean */ @CompileStatic class HotSwappableTargetSourceFactoryBean implements FactoryBean, InitializingBean { + protected HotSwappableTargetSource targetSource protected Object target - @Override HotSwappableTargetSource getObject() throws Exception { return targetSource diff --git a/grails-core/src/main/groovy/org/grails/spring/beans/factory/InstanceFactoryBean.java b/grails-core/src/main/groovy/org/grails/spring/beans/factory/InstanceFactoryBean.java index ce035d0dbdf..dc91dca6a4c 100644 --- a/grails-core/src/main/groovy/org/grails/spring/beans/factory/InstanceFactoryBean.java +++ b/grails-core/src/main/groovy/org/grails/spring/beans/factory/InstanceFactoryBean.java @@ -55,7 +55,6 @@ public T getObject() { return object; } - public void setObject(T object) { this.object = object; } diff --git a/grails-core/src/main/groovy/org/grails/spring/context/ApplicationContextExtension.groovy b/grails-core/src/main/groovy/org/grails/spring/context/ApplicationContextExtension.groovy index a4c781a762e..cdf6385cf66 100644 --- a/grails-core/src/main/groovy/org/grails/spring/context/ApplicationContextExtension.groovy +++ b/grails-core/src/main/groovy/org/grails/spring/context/ApplicationContextExtension.groovy @@ -19,6 +19,7 @@ package org.grails.spring.context import groovy.transform.CompileStatic + import org.springframework.context.ApplicationContext /** @@ -37,12 +38,12 @@ class ApplicationContextExtension { * @param name The bean name * @return */ - public static Object propertyMissing(ApplicationContext applicationContext, String name ) { - if(applicationContext.containsBean(name)) { - return applicationContext.getBean(name); + static Object propertyMissing(ApplicationContext applicationContext, String name) { + if (applicationContext.containsBean(name)) { + return applicationContext.getBean(name) } else { - return null; + return null } } @@ -53,7 +54,7 @@ class ApplicationContextExtension { * @param name The bean name * @return A bean or null */ - public static Object getAt(ApplicationContext applicationContext, String name) { - return propertyMissing(applicationContext, name); + static Object getAt(ApplicationContext applicationContext, String name) { + return propertyMissing(applicationContext, name) } } diff --git a/grails-core/src/main/groovy/org/grails/spring/context/annotation/ClosureClassIgnoringComponentScanBeanDefinitionParser.java b/grails-core/src/main/groovy/org/grails/spring/context/annotation/ClosureClassIgnoringComponentScanBeanDefinitionParser.java index da487063ae7..9803e766174 100644 --- a/grails-core/src/main/groovy/org/grails/spring/context/annotation/ClosureClassIgnoringComponentScanBeanDefinitionParser.java +++ b/grails-core/src/main/groovy/org/grails/spring/context/annotation/ClosureClassIgnoringComponentScanBeanDefinitionParser.java @@ -18,9 +18,6 @@ */ package org.grails.spring.context.annotation; -import grails.util.BuildSettings; -import grails.util.Environment; - import java.io.IOException; import java.lang.reflect.Method; import java.net.URL; @@ -31,11 +28,12 @@ import java.util.List; import java.util.Set; +import org.codehaus.groovy.runtime.DefaultGroovyMethods; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import grails.util.GrailsStringUtils; -import grails.plugins.GrailsPluginManager; -import org.codehaus.groovy.runtime.DefaultGroovyMethods; +import org.w3c.dom.Element; + import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.HierarchicalBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; @@ -49,7 +47,11 @@ import org.springframework.core.type.filter.TypeFilter; import org.springframework.util.AntPathMatcher; import org.springframework.util.ReflectionUtils; -import org.w3c.dom.Element; + +import grails.plugins.GrailsPluginManager; +import grails.util.BuildSettings; +import grails.util.Environment; +import grails.util.GrailsStringUtils; /** * Extends Spring's default <context:component-scan/> element to ignore @@ -95,8 +97,8 @@ protected ClassPathBeanDefinitionScanner createScanner(XmlReaderContext readerCo * @author Lari Hotari */ private static final class ParentOnlyGetResourcesClassLoader extends ClassLoader { - private final Method findResourcesMethod=ReflectionUtils.findMethod(ClassLoader.class, "findResources", String.class); - private final Method findResourceMethod=ReflectionUtils.findMethod(ClassLoader.class, "findResource", String.class); + private final Method findResourcesMethod = ReflectionUtils.findMethod(ClassLoader.class, "findResources", String.class); + private final Method findResourceMethod = ReflectionUtils.findMethod(ClassLoader.class, "findResource", String.class); private ClassLoader rootLoader; @@ -109,13 +111,13 @@ public ParentOnlyGetResourcesClassLoader(ClassLoader parent) { @Override public Enumeration getResources(String name) throws IOException { - if(Environment.isFork()) { + if (Environment.isFork()) { return super.getResources(name); } else { if (rootLoader != null) { // search all parents up to rootLoader - Collection urls = new LinkedHashSet(); + Collection urls = new LinkedHashSet<>(); findResourcesRecursive(getParent(), name, urls); return Collections.enumeration(urls); } @@ -136,12 +138,12 @@ private void findResourcesRecursive(ClassLoader parent, String name, Collection< @SuppressWarnings("unchecked") private Enumeration invokeFindResources(ClassLoader parent, String name) { - return (Enumeration)ReflectionUtils.invokeMethod(findResourcesMethod, parent, name); + return (Enumeration) ReflectionUtils.invokeMethod(findResourcesMethod, parent, name); } @Override public URL getResource(String name) { - if(Environment.isFork()) { + if (Environment.isFork()) { return super.getResource(name); } else { @@ -167,7 +169,7 @@ private URL findResourceRecursive(ClassLoader parent, String name) { } private URL invokeFindResource(ClassLoader parent, String name) { - return (URL)ReflectionUtils.invokeMethod(findResourceMethod, parent, name); + return (URL) ReflectionUtils.invokeMethod(findResourceMethod, parent, name); } } @@ -202,9 +204,9 @@ public ClassLoader getClassLoader() { final PathMatchingResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver(parentOnlyResourceLoader) { @Override protected Resource[] findAllClassPathResources(String location) throws IOException { - Set result = new LinkedHashSet(16); + Set result = new LinkedHashSet<>(16); - if(BuildSettings.CLASSES_DIR != null) { + if (BuildSettings.CLASSES_DIR != null) { @SuppressWarnings("unused") URL classesDir = BuildSettings.CLASSES_DIR.toURI().toURL(); @@ -219,14 +221,14 @@ protected Resource[] findAllClassPathResources(String location) throws IOExcepti if (LOG.isDebugEnabled()) { LOG.debug("Scanning URL " + url.toExternalForm() + " while searching for '" + location + "'"); } - /* - if (!warDeployed && classesDir!= null && url.equals(classesDir)) { - result.add(convertClassLoaderURL(url)); - } - else if (warDeployed) { - result.add(convertClassLoaderURL(url)); - } - */ + /* + if (!warDeployed && classesDir!= null && url.equals(classesDir)) { + result.add(convertClassLoaderURL(url)); + } + else if (warDeployed) { + result.add(convertClassLoaderURL(url)); + } + */ result.add(convertClassLoaderURL(url)); } } diff --git a/grails-core/src/main/groovy/org/grails/spring/context/annotation/grails-context.xsd b/grails-core/src/main/groovy/org/grails/spring/context/annotation/grails-context.xsd index ed284553ea3..b41c7d533c3 100644 --- a/grails-core/src/main/groovy/org/grails/spring/context/annotation/grails-context.xsd +++ b/grails-core/src/main/groovy/org/grails/spring/context/annotation/grails-context.xsd @@ -17,10 +17,9 @@ --> + xmlns:tool="http://www.springframework.org/schema/tool" + targetNamespace="http://www.grails.org/schema/context" elementFormDefault="qualified" + attributeFormDefault="unqualified"> diff --git a/grails-core/src/main/groovy/org/grails/spring/context/support/GrailsPlaceholderConfigurer.java b/grails-core/src/main/groovy/org/grails/spring/context/support/GrailsPlaceholderConfigurer.java index 7a88ad100b9..c34aed786d2 100644 --- a/grails-core/src/main/groovy/org/grails/spring/context/support/GrailsPlaceholderConfigurer.java +++ b/grails-core/src/main/groovy/org/grails/spring/context/support/GrailsPlaceholderConfigurer.java @@ -18,8 +18,10 @@ */ package org.grails.spring.context.support; -import grails.config.Config; -import grails.core.support.GrailsConfigurationAware; +import java.io.IOException; +import java.util.Map; +import java.util.Properties; + import org.springframework.beans.factory.BeanDefinitionStoreException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.config.BeanDefinition; @@ -28,9 +30,8 @@ import org.springframework.context.support.PropertySourcesPlaceholderConfigurer; import org.springframework.util.StringValueResolver; -import java.io.IOException; -import java.util.Map; -import java.util.Properties; +import grails.config.Config; +import grails.core.support.GrailsConfigurationAware; /** * Uses Grails' ConfigObject for place holder values. @@ -40,7 +41,6 @@ */ public class GrailsPlaceholderConfigurer extends PropertySourcesPlaceholderConfigurer implements GrailsConfigurationAware { - private Properties properties; private String beanName; private BeanFactory beanFactory; @@ -61,7 +61,7 @@ protected void loadProperties(Properties props) throws IOException { if (config != null) { props.putAll(config.toProperties()); } - else if(this.properties != null) { + else if (this.properties != null) { props.putAll(properties); } this.properties = props; @@ -88,7 +88,7 @@ protected void doProcessProperties(ConfigurableListableBeanFactory beanFactoryTo BeanDefinitionVisitor visitor = new BeanDefinitionVisitor(valueResolver) { @Override protected void visitMap(Map mapVal) { - if(mapVal instanceof Config) return; + if (mapVal instanceof Config) return; super.visitMap(mapVal); } }; diff --git a/grails-core/src/main/groovy/org/grails/spring/context/support/MapBasedSmartPropertyOverrideConfigurer.groovy b/grails-core/src/main/groovy/org/grails/spring/context/support/MapBasedSmartPropertyOverrideConfigurer.groovy index e41b3993a71..5b4c5a9fc2e 100644 --- a/grails-core/src/main/groovy/org/grails/spring/context/support/MapBasedSmartPropertyOverrideConfigurer.groovy +++ b/grails-core/src/main/groovy/org/grails/spring/context/support/MapBasedSmartPropertyOverrideConfigurer.groovy @@ -18,20 +18,18 @@ */ package org.grails.spring.context.support -import grails.config.Config -import grails.core.support.GrailsApplicationAware import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode -import grails.core.GrailsApplication + +import org.springframework.beans.factory.FactoryBean import org.springframework.beans.factory.annotation.Autowired +import org.springframework.beans.factory.config.BeanDefinition import org.springframework.beans.factory.config.BeanFactoryPostProcessor import org.springframework.beans.factory.config.ConfigurableListableBeanFactory -import org.springframework.beans.factory.config.BeanDefinition - import org.springframework.transaction.interceptor.TransactionProxyFactoryBean -import org.springframework.beans.factory.FactoryBean -import org.springframework.beans.factory.BeanCreationException +import grails.core.GrailsApplication +import grails.core.support.GrailsApplicationAware /** * Applies property configuration from a Map with bean names as keys and bean properties as name/value Maps @@ -52,14 +50,14 @@ class MapBasedSmartPropertyOverrideConfigurer implements BeanFactoryPostProcesso if (!beans) { return } - for(beanName in beans.keySet()) { + for (beanName in beans.keySet()) { def beanProperties = beans.get(beanName) if (!(beanProperties instanceof Map)) { throw new IllegalArgumentException("Entry in bean config for bean '" + beanName + "' must be a Map") } else { final beanPropertiesMap = (Map) beanProperties - for(beanPropertyName in beanPropertiesMap.keySet()) { + for (beanPropertyName in beanPropertiesMap.keySet()) { final beanPropertyValue = beanPropertiesMap.get(beanPropertyName) applyPropertyValue(factory, beanName.toString(), beanPropertyName.toString(), beanPropertyValue) } @@ -76,7 +74,7 @@ class MapBasedSmartPropertyOverrideConfigurer implements BeanFactoryPostProcesso @CompileStatic(TypeCheckingMode.SKIP) protected Map getBeansConfig() { - grailsApplication?.config?.getProperty("beans", Map) + grailsApplication?.config?.getProperty('beans', Map) } protected ClassLoader getClassLoader() { @@ -120,7 +118,7 @@ class MapBasedSmartPropertyOverrideConfigurer implements BeanFactoryPostProcesso if (TransactionProxyFactoryBean.isAssignableFrom(beanClass)) { getTargetBeanDefinition(factory, beanName, - (BeanDefinition)beanDefinition.propertyValues.getPropertyValue("target").value) + (BeanDefinition) beanDefinition.propertyValues.getPropertyValue('target').value) } else { beanDefinition diff --git a/grails-core/src/main/groovy/org/grails/spring/context/support/PluginAwareResourceBundleMessageSource.java b/grails-core/src/main/groovy/org/grails/spring/context/support/PluginAwareResourceBundleMessageSource.java index b070f4cffde..fddade94510 100644 --- a/grails-core/src/main/groovy/org/grails/spring/context/support/PluginAwareResourceBundleMessageSource.java +++ b/grails-core/src/main/groovy/org/grails/spring/context/support/PluginAwareResourceBundleMessageSource.java @@ -18,6 +18,24 @@ */ package org.grails.spring.context.support; +import java.io.File; +import java.io.FilenameFilter; +import java.text.MessageFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Locale; +import java.util.Properties; +import java.util.concurrent.Callable; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.springframework.beans.factory.InitializingBean; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.io.Resource; +import org.springframework.core.io.ResourceLoader; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.core.io.support.ResourcePatternResolver; + import grails.core.DefaultGrailsApplication; import grails.core.GrailsApplication; import grails.core.GrailsApplicationClass; @@ -32,23 +50,6 @@ import org.grails.core.io.CachingPathMatchingResourcePatternResolver; import org.grails.core.support.internal.tools.ClassRelativeResourcePatternResolver; import org.grails.plugins.BinaryGrailsPlugin; -import org.springframework.beans.factory.InitializingBean; -import org.springframework.core.io.FileSystemResource; -import org.springframework.core.io.Resource; -import org.springframework.core.io.ResourceLoader; -import org.springframework.core.io.support.PathMatchingResourcePatternResolver; -import org.springframework.core.io.support.ResourcePatternResolver; - -import java.io.File; -import java.io.FilenameFilter; -import java.text.MessageFormat; -import java.util.ArrayList; -import java.util.List; -import java.util.Locale; -import java.util.Properties; -import java.util.concurrent.Callable; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; /** * A ReloadableResourceBundleMessageSource that is capable of loading message sources from plugins. @@ -60,11 +61,11 @@ public class PluginAwareResourceBundleMessageSource extends ReloadableResourceBu private static final String GRAILS_APP_I18N_PATH_COMPONENT = "/grails-app/i18n/"; protected GrailsApplication application; protected GrailsPluginManager pluginManager; - protected List pluginBaseNames = new ArrayList(); + protected List pluginBaseNames = new ArrayList<>(); private ResourceLoader localResourceLoader; private PathMatchingResourcePatternResolver resourceResolver; - private ConcurrentMap> cachedMergedPluginProperties = new ConcurrentHashMap>(); - private ConcurrentMap> cachedMergedBinaryPluginProperties = new ConcurrentHashMap>(); + private ConcurrentMap> cachedMergedPluginProperties = new ConcurrentHashMap<>(); + private ConcurrentMap> cachedMergedBinaryPluginProperties = new ConcurrentHashMap<>(); private long pluginCacheMillis = Long.MIN_VALUE; private boolean searchClasspath = false; private String messageBundleLocationPattern = "classpath*:*.properties"; @@ -93,21 +94,21 @@ public void afterPropertiesSet() throws Exception { if (pluginCacheMillis == Long.MIN_VALUE) { pluginCacheMillis = cacheMillis; } - + if (localResourceLoader == null) { return; } Resource[] resources; - if(Environment.isDevelopmentEnvironmentAvailable()) { + if (Environment.isDevelopmentEnvironmentAvailable()) { File[] propertiesFiles = new File(BuildSettings.BASE_DIR, GRAILS_APP_I18N_PATH_COMPONENT).listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { return name.endsWith(".properties"); } }); - if(propertiesFiles != null && propertiesFiles.length > 0) { - List resourceList = new ArrayList(propertiesFiles.length); + if (propertiesFiles != null && propertiesFiles.length > 0) { + List resourceList = new ArrayList<>(propertiesFiles.length); for (File propertiesFile : propertiesFiles) { resourceList.add(new FileSystemResource(propertiesFile)); } @@ -118,14 +119,14 @@ public boolean accept(File dir, String name) { } } else { - if(searchClasspath) { + if (searchClasspath) { resources = resourceResolver.getResources(messageBundleLocationPattern); } else { DefaultGrailsApplication defaultGrailsApplication = (DefaultGrailsApplication) application; - if(defaultGrailsApplication != null) { + if (defaultGrailsApplication != null) { GrailsApplicationClass applicationClass = defaultGrailsApplication.getApplicationClass(); - if(applicationClass != null) { + if (applicationClass != null) { ResourcePatternResolver resourcePatternResolver = new ClassRelativeResourcePatternResolver(applicationClass.getClass()); resources = resourcePatternResolver.getResources(messageBundleLocationPattern); } @@ -139,23 +140,22 @@ public boolean accept(File dir, String name) { } } - List basenames = new ArrayList(); + List basenames = new ArrayList<>(); for (Resource resource : resources) { String filename = resource.getFilename(); String baseName = GrailsStringUtils.getFileBasename(filename); int i = baseName.indexOf('_'); - if(i > -1) { + if (i > -1) { baseName = baseName.substring(0, i); } - if(!basenames.contains(baseName) && !baseName.equals("")) + if (!basenames.contains(baseName) && !baseName.equals("")) basenames.add(baseName); } - setBasenames(basenames.toArray( new String[basenames.size()])); + setBasenames(basenames.toArray(new String[basenames.size()])); } - @Override protected String resolveCodeWithoutArguments(String code, Locale locale) { String msg = super.resolveCodeWithoutArguments(code, locale); @@ -177,7 +177,7 @@ protected MessageFormat resolveCode(String code, Locale locale) { * cached forever. */ protected PropertiesHolder getMergedPluginProperties(final Locale locale) { - return CacheEntry.getValue(cachedMergedPluginProperties, locale, cacheMillis, new Callable() { + return CacheEntry.getValue(cachedMergedPluginProperties, locale, cacheMillis, new Callable<>() { @Override public PropertiesHolder call() throws Exception { Properties mergedProps = new Properties(); @@ -210,9 +210,9 @@ protected String resolveCodeWithoutArgumentsFromPlugins(String code, Locale loca } return null; } - + protected PropertiesHolder getMergedBinaryPluginProperties(final Locale locale) { - return CacheEntry.getValue(cachedMergedBinaryPluginProperties, locale, cacheMillis, new Callable() { + return CacheEntry.getValue(cachedMergedBinaryPluginProperties, locale, cacheMillis, new Callable<>() { @Override public PropertiesHolder call() throws Exception { Properties mergedProps = new Properties(); @@ -277,7 +277,6 @@ public void setResourceLoader(ResourceLoader resourceLoader) { } } - /** * Set the number of seconds to cache the list of matching properties files loaded from plugin. *

    diff --git a/grails-core/src/main/groovy/org/grails/spring/context/support/ReloadableResourceBundleMessageSource.java b/grails-core/src/main/groovy/org/grails/spring/context/support/ReloadableResourceBundleMessageSource.java index 5855f521528..5313378a2b0 100644 --- a/grails-core/src/main/groovy/org/grails/spring/context/support/ReloadableResourceBundleMessageSource.java +++ b/grails-core/src/main/groovy/org/grails/spring/context/support/ReloadableResourceBundleMessageSource.java @@ -18,21 +18,23 @@ */ package org.grails.spring.context.support; -import grails.util.CacheEntry; -import grails.util.Pair; - import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.text.MessageFormat; -import java.util.*; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; +import java.util.Locale; +import java.util.Properties; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentMap; import org.springframework.context.ResourceLoaderAware; import org.springframework.context.support.AbstractMessageSource; -import org.springframework.context.support.ResourceBundleMessageSource; import org.springframework.core.io.DefaultResourceLoader; import org.springframework.core.io.Resource; import org.springframework.core.io.ResourceLoader; @@ -41,19 +43,22 @@ import org.springframework.util.PropertiesPersister; import org.springframework.util.StringUtils; +import grails.util.CacheEntry; +import grails.util.Pair; + /** * Spring-specific {@link org.springframework.context.MessageSource} implementation * that accesses resource bundles using specified basenames, participating in the * Spring {@link org.springframework.context.ApplicationContext}'s resource loading. * - *

    In contrast to the JDK-based {@link ResourceBundleMessageSource}, this class uses + *

    In contrast to the JDK-based {@link org.springframework.context.support.ResourceBundleMessageSource}, this class uses * {@link java.util.Properties} instances as its custom data structure for messages, * loading them via a {@link org.springframework.util.PropertiesPersister} strategy - * from Spring {@link Resource} handles. This strategy is not only capable of + * from Spring {@link org.springframework.core.io.Resource} handles. This strategy is not only capable of * reloading files based on timestamp changes, but also of loading properties files * with a specific character encoding. It will detect XML property files as well. * - *

    In contrast to {@link ResourceBundleMessageSource}, this class supports + *

    In contrast to {@link org.springframework.context.support.ResourceBundleMessageSource}, this class supports * reloading of properties files through the {@link #setCacheSeconds "cacheSeconds"} * setting, and also through programmatically clearing the properties cache. * Since application servers typically cache all files loaded from the classpath, @@ -63,14 +68,14 @@ * *

    Note that the base names set as {@link #setBasenames "basenames"} property * are treated in a slightly different fashion than the "basenames" property of - * {@link ResourceBundleMessageSource}. It follows the basic ResourceBundle rule of not + * {@link org.springframework.context.support.ResourceBundleMessageSource}. It follows the basic ResourceBundle rule of not * specifying file extension or language codes, but can refer to any Spring resource * location (instead of being restricted to classpath resources). With a "classpath:" * prefix, resources can still be loaded from the classpath, but "cacheSeconds" values * other than "-1" (caching forever) will not work in this case. * *

    This MessageSource implementation is usually slightly faster than - * {@link ResourceBundleMessageSource}, which builds on {@link java.util.ResourceBundle} + * {@link org.springframework.context.support.ResourceBundleMessageSource}, which builds on {@link java.util.ResourceBundle} * - in the default mode, i.e. when caching forever. With "cacheSeconds" set to 1, * message lookup takes about twice as long - with the benefit that changes in * individual properties files are detected with a maximum delay of 1 second. @@ -95,334 +100,330 @@ * @see #setResourceLoader * @see org.springframework.util.DefaultPropertiesPersister * @see org.springframework.core.io.DefaultResourceLoader - * @see ResourceBundleMessageSource + * @see org.springframework.context.support.ResourceBundleMessageSource * @see java.util.ResourceBundle */ public class ReloadableResourceBundleMessageSource extends AbstractMessageSource - implements ResourceLoaderAware { - - private static final String PROPERTIES_SUFFIX = ".properties"; + implements ResourceLoaderAware { - private static final String XML_SUFFIX = ".xml"; + private static final String PROPERTIES_SUFFIX = ".properties"; + private static final String XML_SUFFIX = ".xml"; - private String[] basenames = new String[0]; + private String[] basenames = new String[0]; - private String defaultEncoding; + private String defaultEncoding; - private Properties fileEncodings; + private Properties fileEncodings; - private boolean fallbackToSystemLocale = true; + private boolean fallbackToSystemLocale = true; - protected long cacheMillis = -1; + protected long cacheMillis = -1; protected long fileCacheMillis = Long.MIN_VALUE; - private PropertiesPersister propertiesPersister = new DefaultPropertiesPersister(); - - private ResourceLoader resourceLoader = new DefaultResourceLoader(); - - /** Cache to hold filename lists per Locale */ - private final ConcurrentMap, CacheEntry>>> cachedFilenames = - new ConcurrentHashMap, CacheEntry>>>(); - - /** Cache to hold already loaded properties per filename */ - private final ConcurrentMap> cachedProperties = new ConcurrentHashMap>(); - - /** Cache to hold merged loaded properties per locale */ - private final ConcurrentMap> cachedMergedProperties = new ConcurrentHashMap>(); - - private final ConcurrentMap> cachedResources = new ConcurrentHashMap>(); - - - /** - * Set a single basename, following the basic ResourceBundle convention of - * not specifying file extension or language codes, but in contrast to - * {@link ResourceBundleMessageSource} referring to a Spring resource location: - * e.g. "WEB-INF/messages" for "WEB-INF/messages.properties", - * "WEB-INF/messages_en.properties", etc. - *

    XML properties files are also supported: .g. "WEB-INF/messages" will find - * and load "WEB-INF/messages.xml", "WEB-INF/messages_en.xml", etc as well. - * @param basename the single basename - * @see #setBasenames - * @see org.springframework.core.io.ResourceEditor - * @see java.util.ResourceBundle - */ - public void setBasename(String basename) { - setBasenames(basename); - } - - /** - * Retrieves all codes from one or multiple basenames - * @param locale the locale - * @param basenames the basenames of the bundle - * @return a list with all codes from valid registered bundles - */ - public Set getBundleCodes(Locale locale,String...basenames){ - List validBaseNames = getValidBasenames(basenames); - - Set codes = new HashSet<>(); - for(String basename: validBaseNames){ - List> filenamesAndResources = calculateAllFilenames(basename,locale); - for (Pair filenameAndResource : filenamesAndResources) { - if(filenameAndResource.getbValue() != null) { - PropertiesHolder propHolder = getProperties(filenameAndResource.getaValue(), filenameAndResource.getbValue()); - codes.addAll(propHolder.getProperties().stringPropertyNames()); - } - } - } - return codes; - } - - protected List getValidBasenames(String[] basenames){ - List validBaseNames = new LinkedList<>(); - for(String basename:basenames){ - for(int i=0;iXML properties files are also supported: .g. "WEB-INF/messages" will find - * and load "WEB-INF/messages.xml", "WEB-INF/messages_en.xml", etc as well. - *

    The associated resource bundles will be checked sequentially when resolving - * a message code. Note that message definitions in a previous resource - * bundle will override ones in a later bundle, due to the sequential lookup. - * @param basenames an array of basenames - * @see #setBasename - * @see java.util.ResourceBundle - */ - public void setBasenames(String... basenames) { - if (basenames != null) { - this.basenames = new String[basenames.length]; - for (int i = 0; i < basenames.length; i++) { - String basename = basenames[i]; - Assert.hasText(basename, "Basename must not be empty"); - this.basenames[i] = basename.trim(); - } - } - else { - this.basenames = new String[0]; - } - } - - /** - * Set the default charset to use for parsing properties files. - * Used if no file-specific charset is specified for a file. - *

    Default is none, using the {@code java.util.Properties} - * default encoding: ISO-8859-1. - *

    Only applies to classic properties files, not to XML files. - * @param defaultEncoding the default charset - * @see #setFileEncodings - * @see org.springframework.util.PropertiesPersister#load - */ - public void setDefaultEncoding(String defaultEncoding) { - this.defaultEncoding = defaultEncoding; - } - - /** - * Set per-file charsets to use for parsing properties files. - *

    Only applies to classic properties files, not to XML files. - * @param fileEncodings Properties with filenames as keys and charset - * names as values. Filenames have to match the basename syntax, - * with optional locale-specific appendices: e.g. "WEB-INF/messages" - * or "WEB-INF/messages_en". - * @see #setBasenames - * @see org.springframework.util.PropertiesPersister#load - */ - public void setFileEncodings(Properties fileEncodings) { - this.fileEncodings = fileEncodings; - } - - /** - * Set whether to fall back to the system Locale if no files for a specific - * Locale have been found. Default is "true"; if this is turned off, the only - * fallback will be the default file (e.g. "messages.properties" for - * basename "messages"). - *

    Falling back to the system Locale is the default behavior of - * {@code java.util.ResourceBundle}. However, this is often not desirable - * in an application server environment, where the system Locale is not relevant - * to the application at all: Set this flag to "false" in such a scenario. - */ - public void setFallbackToSystemLocale(boolean fallbackToSystemLocale) { - this.fallbackToSystemLocale = fallbackToSystemLocale; - } - - /** - * Set the number of seconds to cache the list of matching properties files. - *

      - *
    • Default is "-1", indicating to cache forever (just like - * {@code java.util.ResourceBundle}). - *
    • A positive number will cache the list of matching properties files for the given - * number of seconds. This is essentially the interval between refresh checks. - *
    • A value of "0" will attemp to list the matching properties files on - * every message access. Do not use this in a production environment! - *
    - */ - public void setCacheSeconds(int cacheSeconds) { - this.cacheMillis = (cacheSeconds * 1000); - if(fileCacheMillis==Long.MIN_VALUE) { - this.fileCacheMillis = this.cacheMillis; - } - } - - /** + private PropertiesPersister propertiesPersister = new DefaultPropertiesPersister(); + + private ResourceLoader resourceLoader = new DefaultResourceLoader(); + + /** Cache to hold filename lists per Locale */ + private final ConcurrentMap, CacheEntry>>> cachedFilenames = + new ConcurrentHashMap<>(); + + /** Cache to hold already loaded properties per filename */ + private final ConcurrentMap> cachedProperties = new ConcurrentHashMap<>(); + + /** Cache to hold merged loaded properties per locale */ + private final ConcurrentMap> cachedMergedProperties = new ConcurrentHashMap<>(); + + private final ConcurrentMap> cachedResources = new ConcurrentHashMap<>(); + + /** + * Set a single basename, following the basic ResourceBundle convention of + * not specifying file extension or language codes, but in contrast to + * {@link org.springframework.context.support.ResourceBundleMessageSource} referring to a Spring resource location: + * e.g. "WEB-INF/messages" for "WEB-INF/messages.properties", + * "WEB-INF/messages_en.properties", etc. + *

    XML properties files are also supported: .g. "WEB-INF/messages" will find + * and load "WEB-INF/messages.xml", "WEB-INF/messages_en.xml", etc as well. + * @param basename the single basename + * @see #setBasenames + * @see org.springframework.core.io.ResourceEditor + * @see java.util.ResourceBundle + */ + public void setBasename(String basename) { + setBasenames(basename); + } + + /** + * Retrieves all codes from one or multiple basenames + * @param locale the locale + * @param basenames the basenames of the bundle + * @return a list with all codes from valid registered bundles + */ + public Set getBundleCodes(Locale locale, String... basenames) { + List validBaseNames = getValidBasenames(basenames); + + Set codes = new HashSet<>(); + for (String basename: validBaseNames) { + List> filenamesAndResources = calculateAllFilenames(basename, locale); + for (Pair filenameAndResource : filenamesAndResources) { + if (filenameAndResource.getbValue() != null) { + PropertiesHolder propHolder = getProperties(filenameAndResource.getaValue(), filenameAndResource.getbValue()); + codes.addAll(propHolder.getProperties().stringPropertyNames()); + } + } + } + return codes; + } + + protected List getValidBasenames(String[] basenames) { + List validBaseNames = new LinkedList<>(); + for (String basename:basenames) { + for (int i = 0; i < this.basenames.length; i++) { + if (basenames[i].equals(basename)) { + validBaseNames.add(basename); + break; + } + } + } + return validBaseNames; + } + + /** + * Set an array of basenames, each following the basic ResourceBundle convention + * of not specifying file extension or language codes, but in contrast to + * {@link org.springframework.context.support.ResourceBundleMessageSource} referring to a Spring resource location: + * e.g. "WEB-INF/messages" for "WEB-INF/messages.properties", + * "WEB-INF/messages_en.properties", etc. + *

    XML properties files are also supported: .g. "WEB-INF/messages" will find + * and load "WEB-INF/messages.xml", "WEB-INF/messages_en.xml", etc as well. + *

    The associated resource bundles will be checked sequentially when resolving + * a message code. Note that message definitions in a previous resource + * bundle will override ones in a later bundle, due to the sequential lookup. + * @param basenames an array of basenames + * @see #setBasename + * @see java.util.ResourceBundle + */ + public void setBasenames(String... basenames) { + if (basenames != null) { + this.basenames = new String[basenames.length]; + for (int i = 0; i < basenames.length; i++) { + String basename = basenames[i]; + Assert.hasText(basename, "Basename must not be empty"); + this.basenames[i] = basename.trim(); + } + } + else { + this.basenames = new String[0]; + } + } + + /** + * Set the default charset to use for parsing properties files. + * Used if no file-specific charset is specified for a file. + *

    Default is none, using the {@code java.util.Properties} + * default encoding: ISO-8859-1. + *

    Only applies to classic properties files, not to XML files. + * @param defaultEncoding the default charset + * @see #setFileEncodings + * @see org.springframework.util.PropertiesPersister#load + */ + public void setDefaultEncoding(String defaultEncoding) { + this.defaultEncoding = defaultEncoding; + } + + /** + * Set per-file charsets to use for parsing properties files. + *

    Only applies to classic properties files, not to XML files. + * @param fileEncodings Properties with filenames as keys and charset + * names as values. Filenames have to match the basename syntax, + * with optional locale-specific appendices: e.g. "WEB-INF/messages" + * or "WEB-INF/messages_en". + * @see #setBasenames + * @see org.springframework.util.PropertiesPersister#load + */ + public void setFileEncodings(Properties fileEncodings) { + this.fileEncodings = fileEncodings; + } + + /** + * Set whether to fall back to the system Locale if no files for a specific + * Locale have been found. Default is "true"; if this is turned off, the only + * fallback will be the default file (e.g. "messages.properties" for + * basename "messages"). + *

    Falling back to the system Locale is the default behavior of + * {@code java.util.ResourceBundle}. However, this is often not desirable + * in an application server environment, where the system Locale is not relevant + * to the application at all: Set this flag to "false" in such a scenario. + */ + public void setFallbackToSystemLocale(boolean fallbackToSystemLocale) { + this.fallbackToSystemLocale = fallbackToSystemLocale; + } + + /** + * Set the number of seconds to cache the list of matching properties files. + *

      + *
    • Default is "-1", indicating to cache forever (just like + * {@code java.util.ResourceBundle}). + *
    • A positive number will cache the list of matching properties files for the given + * number of seconds. This is essentially the interval between refresh checks. + *
    • A value of "0" will attemp to list the matching properties files on + * every message access. Do not use this in a production environment! + *
    + */ + public void setCacheSeconds(int cacheSeconds) { + this.cacheMillis = (cacheSeconds * 1000); + if (fileCacheMillis == Long.MIN_VALUE) { + this.fileCacheMillis = this.cacheMillis; + } + } + + /** * Set the number of seconds to cache loaded properties files. *
      *
    • Default value is the same value as cacheSeconds - *
    • A positive number will cache loaded properties files for the given - * number of seconds. This is essentially the interval between refresh checks. - * Note that a refresh attempt will first check the last-modified timestamp - * of the file before actually reloading it; so if files don't change, this - * interval can be set rather low, as refresh attempts will not actually reload. - *
    • A value of "0" will check the last-modified timestamp of the file on - * every message access. Do not use this in a production environment! - *
    - */ - public void setFileCacheSeconds(int fileCacheSeconds) { - this.fileCacheMillis = (fileCacheSeconds * 1000); - } - - /** - * Set the PropertiesPersister to use for parsing properties files. - *

    The default is a DefaultPropertiesPersister. - * @see org.springframework.util.DefaultPropertiesPersister - */ - public void setPropertiesPersister(PropertiesPersister propertiesPersister) { - this.propertiesPersister = - (propertiesPersister != null ? propertiesPersister : new DefaultPropertiesPersister()); - } - - /** - * Set the ResourceLoader to use for loading bundle properties files. - *

    The default is a DefaultResourceLoader. Will get overridden by the - * ApplicationContext if running in a context, as it implements the - * ResourceLoaderAware interface. Can be manually overridden when - * running outside of an ApplicationContext. - * @see org.springframework.core.io.DefaultResourceLoader - * @see org.springframework.context.ResourceLoaderAware - */ - public void setResourceLoader(ResourceLoader resourceLoader) { - this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader()); - } - - - /** - * Resolves the given message code as key in the retrieved bundle files, - * returning the value found in the bundle as-is (without MessageFormat parsing). - */ - @Override - protected String resolveCodeWithoutArguments(String code, Locale locale) { - if (this.cacheMillis < 0) { - PropertiesHolder propHolder = getMergedProperties(locale); - String result = propHolder.getProperty(code); - if (result != null) { - return result; - } - } - else { - for (String basename : this.basenames) { + *

  • A positive number will cache loaded properties files for the given + * number of seconds. This is essentially the interval between refresh checks. + * Note that a refresh attempt will first check the last-modified timestamp + * of the file before actually reloading it; so if files don't change, this + * interval can be set rather low, as refresh attempts will not actually reload. + *
  • A value of "0" will check the last-modified timestamp of the file on + * every message access. Do not use this in a production environment! + *
+ */ + public void setFileCacheSeconds(int fileCacheSeconds) { + this.fileCacheMillis = (fileCacheSeconds * 1000); + } + + /** + * Set the PropertiesPersister to use for parsing properties files. + *

The default is a DefaultPropertiesPersister. + * @see org.springframework.util.DefaultPropertiesPersister + */ + public void setPropertiesPersister(PropertiesPersister propertiesPersister) { + this.propertiesPersister = + (propertiesPersister != null ? propertiesPersister : new DefaultPropertiesPersister()); + } + + /** + * Set the ResourceLoader to use for loading bundle properties files. + *

The default is a DefaultResourceLoader. Will get overridden by the + * ApplicationContext if running in a context, as it implements the + * ResourceLoaderAware interface. Can be manually overridden when + * running outside of an ApplicationContext. + * @see org.springframework.core.io.DefaultResourceLoader + * @see org.springframework.context.ResourceLoaderAware + */ + public void setResourceLoader(ResourceLoader resourceLoader) { + this.resourceLoader = (resourceLoader != null ? resourceLoader : new DefaultResourceLoader()); + } + + /** + * Resolves the given message code as key in the retrieved bundle files, + * returning the value found in the bundle as-is (without MessageFormat parsing). + */ + @Override + protected String resolveCodeWithoutArguments(String code, Locale locale) { + if (this.cacheMillis < 0) { + PropertiesHolder propHolder = getMergedProperties(locale); + String result = propHolder.getProperty(code); + if (result != null) { + return result; + } + } + else { + for (String basename : this.basenames) { List> filenamesAndResources = calculateAllFilenames(basename, locale); for (Pair filenameAndResource : filenamesAndResources) { - if(filenameAndResource.getbValue() != null) { + if (filenameAndResource.getbValue() != null) { PropertiesHolder propHolder = getProperties(filenameAndResource.getaValue(), filenameAndResource.getbValue()); String result = propHolder.getProperty(code); - if (result != null) { - return result; - } + if (result != null) { + return result; + } + } + } + } + } + return null; + } + + /** + * Resolves the given message code as key in the retrieved bundle files, + * using a cached MessageFormat instance per message code. + */ + @Override + protected MessageFormat resolveCode(String code, Locale locale) { + if (this.cacheMillis < 0) { + PropertiesHolder propHolder = getMergedProperties(locale); + MessageFormat result = propHolder.getMessageFormat(code, locale); + if (result != null) { + return result; + } + } + else { + for (String basename : this.basenames) { + List> filenamesAndResources = calculateAllFilenames(basename, locale); + for (Pair filenameAndResource : filenamesAndResources) { + if (filenameAndResource.getbValue() != null) { + PropertiesHolder propHolder = getProperties(filenameAndResource.getaValue(), filenameAndResource.getbValue()); + MessageFormat result = propHolder.getMessageFormat(code, locale); + if (result != null) { + return result; + } + } + } + } + } + return null; + } + + /** + * Get a PropertiesHolder that contains the actually visible properties + * for a Locale, after merging all specified resource bundles. + * Either fetches the holder from the cache or freshly loads it. + *

Only used when caching resource bundle contents forever, i.e. + * with {@code cacheSeconds < 0}. Therefore, merged properties are always + * cached forever. + */ + protected PropertiesHolder getMergedProperties(final Locale locale) { + return CacheEntry.getValue(cachedMergedProperties, locale, cacheMillis, new Callable<>() { + @Override + public PropertiesHolder call() throws Exception { + Properties mergedProps = new Properties(); + PropertiesHolder mergedHolder = new PropertiesHolder(mergedProps); + for (int i = basenames.length - 1; i >= 0; i--) { + List> filenamesAndResources = calculateAllFilenames(basenames[i], locale); + for (int j = filenamesAndResources.size() - 1; j >= 0; j--) { + Pair filenameAndResource = filenamesAndResources.get(j); + if (filenameAndResource.getbValue() != null) { + PropertiesHolder propHolder = getProperties(filenameAndResource.getaValue(), filenameAndResource.getbValue()); + mergedProps.putAll(propHolder.getProperties()); + } } - } - } - } - return null; - } - - /** - * Resolves the given message code as key in the retrieved bundle files, - * using a cached MessageFormat instance per message code. - */ - @Override - protected MessageFormat resolveCode(String code, Locale locale) { - if (this.cacheMillis < 0) { - PropertiesHolder propHolder = getMergedProperties(locale); - MessageFormat result = propHolder.getMessageFormat(code, locale); - if (result != null) { - return result; - } - } - else { - for (String basename : this.basenames) { - List> filenamesAndResources = calculateAllFilenames(basename, locale); - for (Pair filenameAndResource : filenamesAndResources) { - if(filenameAndResource.getbValue() != null) { - PropertiesHolder propHolder = getProperties(filenameAndResource.getaValue(), filenameAndResource.getbValue()); - MessageFormat result = propHolder.getMessageFormat(code, locale); - if (result != null) { - return result; - } - } - } - } - } - return null; - } - - - /** - * Get a PropertiesHolder that contains the actually visible properties - * for a Locale, after merging all specified resource bundles. - * Either fetches the holder from the cache or freshly loads it. - *

Only used when caching resource bundle contents forever, i.e. - * with {@code cacheSeconds < 0}. Therefore, merged properties are always - * cached forever. - */ - protected PropertiesHolder getMergedProperties(final Locale locale) { - return CacheEntry.getValue(cachedMergedProperties, locale, cacheMillis, new Callable() { - @Override - public PropertiesHolder call() throws Exception { - Properties mergedProps = new Properties(); - PropertiesHolder mergedHolder = new PropertiesHolder(mergedProps); - for (int i = basenames.length - 1; i >= 0; i--) { - List> filenamesAndResources = calculateAllFilenames(basenames[i], locale); - for (int j = filenamesAndResources.size() - 1; j >= 0; j--) { - Pair filenameAndResource = filenamesAndResources.get(j); - if(filenameAndResource.getbValue() != null) { - PropertiesHolder propHolder = getProperties(filenameAndResource.getaValue(), filenameAndResource.getbValue()); - mergedProps.putAll(propHolder.getProperties()); - } - } - } - return mergedHolder; - } - }); - } - - /** - * Calculate all filenames for the given bundle basename and Locale. - * Will calculate filenames for the given Locale, the system Locale - * (if applicable), and the default file. - * @param basename the basename of the bundle - * @param locale the locale - * @return the List of filenames to check - * @see #setFallbackToSystemLocale - * @see #calculateFilenamesForLocale - */ - protected List> calculateAllFilenames(final String basename, final Locale locale) { - Pair cacheKey = new Pair(basename, locale); - return CacheEntry.getValue(cachedFilenames, cacheKey, cacheMillis, new Callable>>() { - @Override - public List> call() throws Exception { - List filenames = new ArrayList(7); + } + return mergedHolder; + } + }); + } + + /** + * Calculate all filenames for the given bundle basename and Locale. + * Will calculate filenames for the given Locale, the system Locale + * (if applicable), and the default file. + * @param basename the basename of the bundle + * @param locale the locale + * @return the List of filenames to check + * @see #setFallbackToSystemLocale + * @see #calculateFilenamesForLocale + */ + protected List> calculateAllFilenames(final String basename, final Locale locale) { + Pair cacheKey = new Pair<>(basename, locale); + return CacheEntry.getValue(cachedFilenames, cacheKey, cacheMillis, new Callable<>() { + @Override + public List> call() throws Exception { + List filenames = new ArrayList<>(7); filenames.addAll(calculateFilenamesForLocale(basename, locale)); if (fallbackToSystemLocale && !locale.equals(Locale.getDefault())) { List fallbackFilenames = calculateFilenamesForLocale(basename, Locale.getDefault()); @@ -434,74 +435,73 @@ public List> call() throws Exception { } } filenames.add(basename); - List> filenamesAndResources = new ArrayList>(filenames.size()); - for(String filename : filenames) { - filenamesAndResources.add(new Pair(filename, locateResource(filename))); + List> filenamesAndResources = new ArrayList<>(filenames.size()); + for (String filename : filenames) { + filenamesAndResources.add(new Pair<>(filename, locateResource(filename))); } return filenamesAndResources; - } - }); - } - - /** - * Calculate the filenames for the given bundle basename and Locale, - * appending language code, country code, and variant code. - * E.g.: basename "messages", Locale "de_AT_oo" -> "messages_de_AT_OO", - * "messages_de_AT", "messages_de". - *

Follows the rules defined by {@link java.util.Locale#toString()}. - * @param basename the basename of the bundle - * @param locale the locale - * @return the List of filenames to check - */ - protected List calculateFilenamesForLocale(String basename, Locale locale) { - List result = new ArrayList(3); - String language = locale.getLanguage(); - String country = locale.getCountry(); - String variant = locale.getVariant(); - StringBuilder temp = new StringBuilder(basename); - - temp.append('_'); - if (language.length() > 0) { - temp.append(language); - result.add(0, temp.toString()); - } - - temp.append('_'); - if (country.length() > 0) { - temp.append(country); - result.add(0, temp.toString()); - } - - if (variant.length() > 0 && (language.length() > 0 || country.length() > 0)) { - temp.append('_').append(variant); - result.add(0, temp.toString()); - } - - return result; - } - - - /** - * Get a PropertiesHolder for the given filename, either from the - * cache or freshly loaded. - * @param filename the bundle filename (basename + Locale) - * @return the current PropertiesHolder for the bundle - */ - @SuppressWarnings("rawtypes") + } + }); + } + + /** + * Calculate the filenames for the given bundle basename and Locale, + * appending language code, country code, and variant code. + * E.g.: basename "messages", Locale "de_AT_oo" -> "messages_de_AT_OO", + * "messages_de_AT", "messages_de". + *

Follows the rules defined by {@link java.util.Locale#toString()}. + * @param basename the basename of the bundle + * @param locale the locale + * @return the List of filenames to check + */ + protected List calculateFilenamesForLocale(String basename, Locale locale) { + List result = new ArrayList<>(3); + String language = locale.getLanguage(); + String country = locale.getCountry(); + String variant = locale.getVariant(); + StringBuilder temp = new StringBuilder(basename); + + temp.append('_'); + if (language.length() > 0) { + temp.append(language); + result.add(0, temp.toString()); + } + + temp.append('_'); + if (country.length() > 0) { + temp.append(country); + result.add(0, temp.toString()); + } + + if (variant.length() > 0 && (language.length() > 0 || country.length() > 0)) { + temp.append('_').append(variant); + result.add(0, temp.toString()); + } + + return result; + } + + /** + * Get a PropertiesHolder for the given filename, either from the + * cache or freshly loaded. + * @param filename the bundle filename (basename + Locale) + * @return the current PropertiesHolder for the bundle + */ + @SuppressWarnings("rawtypes") protected PropertiesHolder getProperties(final String filename, final Resource resource) { - return CacheEntry.getValue(cachedProperties, filename, fileCacheMillis, new Callable() { + return CacheEntry.getValue(cachedProperties, filename, fileCacheMillis, new Callable<>() { @Override public PropertiesHolder call() throws Exception { return new PropertiesHolder(filename, resource); } - }, new Callable() { + }, new Callable<>() { @Override public CacheEntry call() throws Exception { return new PropertiesHolderCacheEntry(); } }, true, null); - } - + } + protected static class PropertiesHolderCacheEntry extends CacheEntry { public PropertiesHolderCacheEntry() { super(); @@ -510,103 +510,101 @@ public PropertiesHolderCacheEntry() { @Override protected PropertiesHolder updateValue(PropertiesHolder oldValue, Callable updater, Object cacheRequestObject) throws Exception { - if(oldValue != null) { + if (oldValue != null) { oldValue.update(); return oldValue; } return updater.call(); } } - - - /** - * Load the properties from the given resource. - * @param resource the resource to load from - * @param filename the original bundle filename (basename + Locale) - * @return the populated Properties instance - * @throws IOException if properties loading failed - */ - protected Properties loadProperties(Resource resource, String filename) throws IOException { - InputStream is = resource.getInputStream(); - Properties props = new Properties(); - try { - if (resource.getFilename().endsWith(XML_SUFFIX)) { - if (logger.isDebugEnabled()) { - logger.debug("Loading properties [" + resource.getFilename() + "]"); - } - this.propertiesPersister.loadFromXml(props, is); - } - else { - String encoding = null; - if (this.fileEncodings != null) { - encoding = this.fileEncodings.getProperty(filename); - } - if (encoding == null) { - encoding = this.defaultEncoding; - } - if (encoding != null) { - if (logger.isDebugEnabled()) { - logger.debug("Loading properties [" + resource.getFilename() + "] with encoding '" + encoding + "'"); - } - this.propertiesPersister.load(props, new InputStreamReader(is, encoding)); - } - else { - if (logger.isDebugEnabled()) { - logger.debug("Loading properties [" + resource.getFilename() + "]"); - } - this.propertiesPersister.load(props, is); - } - } - return props; - } - finally { - is.close(); - } - } - - - /** - * Clear the resource bundle cache. - * Subsequent resolve calls will lead to reloading of the properties files. - */ - public void clearCache() { - logger.debug("Clearing entire resource bundle cache"); - this.cachedProperties.clear(); - this.cachedMergedProperties.clear(); - this.cachedFilenames.clear(); - this.cachedResources.clear(); - } - - /** - * Clear the resource bundle caches of this MessageSource and all its ancestors. - * @see #clearCache - */ - public void clearCacheIncludingAncestors() { - clearCache(); - if (getParentMessageSource() instanceof ReloadableResourceBundleMessageSource) { - ((ReloadableResourceBundleMessageSource) getParentMessageSource()).clearCacheIncludingAncestors(); - } else if (getParentMessageSource() instanceof org.springframework.context.support.ReloadableResourceBundleMessageSource) { + + /** + * Load the properties from the given resource. + * @param resource the resource to load from + * @param filename the original bundle filename (basename + Locale) + * @return the populated Properties instance + * @throws IOException if properties loading failed + */ + protected Properties loadProperties(Resource resource, String filename) throws IOException { + InputStream is = resource.getInputStream(); + Properties props = new Properties(); + try { + if (resource.getFilename().endsWith(XML_SUFFIX)) { + if (logger.isDebugEnabled()) { + logger.debug("Loading properties [" + resource.getFilename() + "]"); + } + this.propertiesPersister.loadFromXml(props, is); + } + else { + String encoding = null; + if (this.fileEncodings != null) { + encoding = this.fileEncodings.getProperty(filename); + } + if (encoding == null) { + encoding = this.defaultEncoding; + } + if (encoding != null) { + if (logger.isDebugEnabled()) { + logger.debug("Loading properties [" + resource.getFilename() + "] with encoding '" + encoding + "'"); + } + this.propertiesPersister.load(props, new InputStreamReader(is, encoding)); + } + else { + if (logger.isDebugEnabled()) { + logger.debug("Loading properties [" + resource.getFilename() + "]"); + } + this.propertiesPersister.load(props, is); + } + } + return props; + } + finally { + is.close(); + } + } + + /** + * Clear the resource bundle cache. + * Subsequent resolve calls will lead to reloading of the properties files. + */ + public void clearCache() { + logger.debug("Clearing entire resource bundle cache"); + this.cachedProperties.clear(); + this.cachedMergedProperties.clear(); + this.cachedFilenames.clear(); + this.cachedResources.clear(); + } + + /** + * Clear the resource bundle caches of this MessageSource and all its ancestors. + * @see #clearCache + */ + public void clearCacheIncludingAncestors() { + clearCache(); + if (getParentMessageSource() instanceof ReloadableResourceBundleMessageSource) { + ((ReloadableResourceBundleMessageSource) getParentMessageSource()).clearCacheIncludingAncestors(); + } else if (getParentMessageSource() instanceof org.springframework.context.support.ReloadableResourceBundleMessageSource) { ((org.springframework.context.support.ReloadableResourceBundleMessageSource) getParentMessageSource()).clearCacheIncludingAncestors(); - } - } - - @Override - public String toString() { - return getClass().getName() + ": basenames=[" + StringUtils.arrayToCommaDelimitedString(this.basenames) + "]"; - } - - protected Resource locateResource(final String filename) { - return CacheEntry.getValue(cachedResources, filename, cacheMillis, new Callable() { - @Override - public Resource call() throws Exception { - return locateResourceWithoutCache(filename); - } - }); - } - + } + } + + @Override + public String toString() { + return getClass().getName() + ": basenames=[" + StringUtils.arrayToCommaDelimitedString(this.basenames) + "]"; + } + + protected Resource locateResource(final String filename) { + return CacheEntry.getValue(cachedResources, filename, cacheMillis, new Callable<>() { + @Override + public Resource call() throws Exception { + return locateResourceWithoutCache(filename); + } + }); + } + protected Resource locateResourceWithoutCache(String filename) { Resource resource = resourceLoader.getResource(org.grails.io.support.ResourceLoader.CLASSPATH_URL_PREFIX + filename + PROPERTIES_SUFFIX); - if(!resource.exists()) { + if (!resource.exists()) { resource = resourceLoader.getResource(filename + PROPERTIES_SUFFIX); } if (!resource.exists()) { @@ -617,48 +615,48 @@ protected Resource locateResourceWithoutCache(String filename) { } else { return null; } - } - - /** - * PropertiesHolder for caching. - * Stores the last-modified timestamp of the source file for efficient - * change detection, and the timestamp of the last refresh attempt - * (updated every time the cache entry gets re-validated). - */ - protected class PropertiesHolder { - private Properties properties; - - private String filename; - private Resource resource; - - private long fileTimestamp = -1; - - /** Cache to hold already generated MessageFormats per message code */ - private final ConcurrentMap, CacheEntry> cachedMessageFormats = - new ConcurrentHashMap, CacheEntry>(); - - public PropertiesHolder(String filename, Resource resource) { - this.filename = filename; - this.resource = resource; - doUpdate(true); - } - - public PropertiesHolder(Properties properties) { - this.properties = properties; - } - - public boolean update() { - return doUpdate(false); - } - + } + + /** + * PropertiesHolder for caching. + * Stores the last-modified timestamp of the source file for efficient + * change detection, and the timestamp of the last refresh attempt + * (updated every time the cache entry gets re-validated). + */ + protected class PropertiesHolder { + private Properties properties; + + private String filename; + private Resource resource; + + private long fileTimestamp = -1; + + /** Cache to hold already generated MessageFormats per message code */ + private final ConcurrentMap, CacheEntry> cachedMessageFormats = + new ConcurrentHashMap<>(); + + public PropertiesHolder(String filename, Resource resource) { + this.filename = filename; + this.resource = resource; + doUpdate(true); + } + + public PropertiesHolder(Properties properties) { + this.properties = properties; + } + + public boolean update() { + return doUpdate(false); + } + private boolean doUpdate(boolean initialization) { - if(filename == null) { + if (filename == null) { return false; } - if(!initialization && cacheMillis >= 0) { + if (!initialization && cacheMillis >= 0) { resource = locateResource(filename); } - if(resource != null) { + if (resource != null) { long newFileTimestamp; try { newFileTimestamp = resource.lastModified(); @@ -669,69 +667,69 @@ private boolean doUpdate(boolean initialization) { } newFileTimestamp = -1; } - if (fileCacheMillis >= 0 && newFileTimestamp == fileTimestamp && this.properties != null) { - return false; - } - try { - this.properties = loadProperties(resource, filename); - this.fileTimestamp = newFileTimestamp; - this.cachedMessageFormats.clear(); - } - catch (IOException ex) { - if (logger.isWarnEnabled()) { - logger.warn("Could not parse properties file [" + resource.getFilename() + "]", ex); - } - } - return true; - } - else { - // Resource does not exist. - if (logger.isDebugEnabled()) { - logger.debug("No properties file found for [" + filename + "] - neither plain properties nor XML"); - } + if (fileCacheMillis >= 0 && newFileTimestamp == fileTimestamp && this.properties != null) { + return false; + } + try { + this.properties = loadProperties(resource, filename); + this.fileTimestamp = newFileTimestamp; + this.cachedMessageFormats.clear(); + } + catch (IOException ex) { + if (logger.isWarnEnabled()) { + logger.warn("Could not parse properties file [" + resource.getFilename() + "]", ex); + } + } + return true; + } + else { + // Resource does not exist. + if (logger.isDebugEnabled()) { + logger.debug("No properties file found for [" + filename + "] - neither plain properties nor XML"); + } this.properties = new Properties(); this.fileTimestamp = -1; this.cachedMessageFormats.clear(); - return true; - } - } + return true; + } + } - public String getFilename() { + public String getFilename() { return filename; } - public Properties getProperties() { - return properties; - } - - public long getFileTimestamp() { - return fileTimestamp; - } - - public String getProperty(String code) { - if (this.properties == null) { - return null; - } - return this.properties.getProperty(code); - } - - public MessageFormat getMessageFormat(final String code, final Locale locale) { - if (this.properties == null) { - return null; - } - Pair cacheKey = new Pair(code, locale); - return CacheEntry.getValue(cachedMessageFormats, cacheKey, -1, new Callable() { - @Override - public MessageFormat call() throws Exception { - String msg = properties.getProperty(code); - if (msg != null) { - return createMessageFormat(msg, locale); - } else { - return null; - } - } - }); - } - } + public Properties getProperties() { + return properties; + } + + public long getFileTimestamp() { + return fileTimestamp; + } + + public String getProperty(String code) { + if (this.properties == null) { + return null; + } + return this.properties.getProperty(code); + } + + public MessageFormat getMessageFormat(final String code, final Locale locale) { + if (this.properties == null) { + return null; + } + Pair cacheKey = new Pair<>(code, locale); + return CacheEntry.getValue(cachedMessageFormats, cacheKey, -1, new Callable<>() { + @Override + public MessageFormat call() throws Exception { + String msg = properties.getProperty(code); + if (msg != null) { + return createMessageFormat(msg, locale); + } else { + return null; + } + } + }); + } + } } diff --git a/grails-core/src/main/groovy/org/grails/transaction/ChainedTransactionManager.java b/grails-core/src/main/groovy/org/grails/transaction/ChainedTransactionManager.java index cb57334e153..8df0a2f73db 100644 --- a/grails-core/src/main/groovy/org/grails/transaction/ChainedTransactionManager.java +++ b/grails-core/src/main/groovy/org/grails/transaction/ChainedTransactionManager.java @@ -27,6 +27,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.transaction.CannotCreateTransactionException; import org.springframework.transaction.HeuristicCompletionException; import org.springframework.transaction.PlatformTransactionManager; @@ -45,9 +46,9 @@ * which means the {@link PlatformTransactionManager} most likely to break the transaction should be the last * in the list configured. A {@link PlatformTransactionManager} throwing an exception during commit will automatically * cause the remaining transaction managers to roll back instead of committing. - * + * * original source: https://github.com/spring-projects/spring-data-commons/blob/master/src/main/java/org/springframework/data/transaction/ChainedTransactionManager.java - * + * * @author Michael Hunger * @author Oliver Gierke * @author Lari Hotari @@ -57,184 +58,184 @@ */ public class ChainedTransactionManager implements PlatformTransactionManager { - private final static Logger LOGGER = LoggerFactory.getLogger(ChainedTransactionManager.class); - - private final List transactionManagers; - private final SynchronizationManager synchronizationManager; - - /** - * Creates a new {@link ChainedTransactionManager} delegating to the given {@link PlatformTransactionManager}s. - * - * @param transactionManagers must not be {@literal null} or empty. - */ - public ChainedTransactionManager(PlatformTransactionManager... transactionManagers) { - this(SpringTransactionSynchronizationManager.INSTANCE, transactionManagers); - } - - /** - * Creates a new {@link ChainedTransactionManager} using the given {@link SynchronizationManager} and - * {@link PlatformTransactionManager}s. - * - * @param synchronizationManager must not be {@literal null}. - * @param transactionManagers must not be {@literal null} or empty. - */ - ChainedTransactionManager(SynchronizationManager synchronizationManager, - PlatformTransactionManager... transactionManagers) { - - Assert.notNull(synchronizationManager, "SynchronizationManager must not be null!"); - Assert.notNull(transactionManagers, "Transaction managers must not be null!"); - Assert.isTrue(transactionManagers.length > 0, "At least one PlatformTransactionManager must be given!"); - - this.synchronizationManager = synchronizationManager; - this.transactionManagers = new ArrayList(); - this.transactionManagers.addAll(Arrays.asList(transactionManagers)); - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.PlatformTransactionManager#getTransaction(org.springframework.transaction.TransactionDefinition) - */ - public MultiTransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { - - MultiTransactionStatus mts = new MultiTransactionStatus(transactionManagers.get(0)); - - if (!synchronizationManager.isSynchronizationActive() && canCreateTransaction(definition)) { - synchronizationManager.initSynchronization(); - mts.setNewSynchronization(); - } - - try { - - for (PlatformTransactionManager transactionManager : transactionManagers) { - mts.registerTransactionManager(definition, transactionManager); - } - - } catch (Exception ex) { - - Map transactionStatuses = mts.getTransactionStatuses(); - - for (PlatformTransactionManager transactionManager : transactionManagers) { - try { - if (transactionStatuses.get(transactionManager) != null) { - transactionManager.rollback(transactionStatuses.get(transactionManager)); - } - } catch (Exception ex2) { - LOGGER.warn("Rollback exception (" + transactionManager + ") " + ex2.getMessage(), ex2); - } - } - - if (mts.isNewSynchronization()) { - synchronizationManager.clearSynchronization(); - } - - throw new CannotCreateTransactionException(ex.getMessage(), ex); - } - - return mts; - } - - protected boolean canCreateTransaction(TransactionDefinition definition) { - return definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED || - definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW || - definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED; - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.PlatformTransactionManager#commit(org.springframework.transaction.TransactionStatus) - */ - public void commit(TransactionStatus status) throws TransactionException { - - MultiTransactionStatus multiTransactionStatus = (MultiTransactionStatus) status; - - boolean commit = true; - Exception commitException = null; - PlatformTransactionManager commitExceptionTransactionManager = null; - - for (PlatformTransactionManager transactionManager : reverse(transactionManagers)) { - - if (commit) { - - try { - multiTransactionStatus.commit(transactionManager); - } catch (Exception ex) { - commit = false; - commitException = ex; - commitExceptionTransactionManager = transactionManager; - } - - } else { - - // after unsucessfull commit we must try to rollback remaining transaction managers - - try { - multiTransactionStatus.rollback(transactionManager); - } catch (Exception ex) { - LOGGER.warn("Rollback exception (after commit) (" + transactionManager + ") " + ex.getMessage(), ex); - } - } - } - - if (multiTransactionStatus.isNewSynchronization()) { - synchronizationManager.clearSynchronization(); - } - - if (commitException != null) { - boolean firstTransactionManagerFailed = commitExceptionTransactionManager == getLastTransactionManager(); - int transactionState = firstTransactionManagerFailed ? HeuristicCompletionException.STATE_ROLLED_BACK - : HeuristicCompletionException.STATE_MIXED; - throw new HeuristicCompletionException(transactionState, commitException); - } - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.PlatformTransactionManager#rollback(org.springframework.transaction.TransactionStatus) - */ - public void rollback(TransactionStatus status) throws TransactionException { - - Exception rollbackException = null; - PlatformTransactionManager rollbackExceptionTransactionManager = null; - - MultiTransactionStatus multiTransactionStatus = (MultiTransactionStatus) status; - - for (PlatformTransactionManager transactionManager : reverse(transactionManagers)) { - try { - multiTransactionStatus.rollback(transactionManager); - } catch (Exception ex) { - if (rollbackException == null) { - rollbackException = ex; - rollbackExceptionTransactionManager = transactionManager; - } else { - LOGGER.warn("Rollback exception (" + transactionManager + ") " + ex.getMessage(), ex); - } - } - } - - if (multiTransactionStatus.isNewSynchronization()) { - synchronizationManager.clearSynchronization(); - } - - if (rollbackException != null) { - throw new UnexpectedRollbackException("Rollback exception, originated at (" + rollbackExceptionTransactionManager - + ") " + rollbackException.getMessage(), rollbackException); - } - } - - private Iterable reverse(Collection collection) { - - List list = new ArrayList(collection); - Collections.reverse(list); - return list; - } - - private PlatformTransactionManager getLastTransactionManager() { - return transactionManagers.get(lastTransactionManagerIndex()); - } - - private int lastTransactionManagerIndex() { - return transactionManagers.size() - 1; - } + private final static Logger LOGGER = LoggerFactory.getLogger(ChainedTransactionManager.class); + + private final List transactionManagers; + private final SynchronizationManager synchronizationManager; + + /** + * Creates a new {@link ChainedTransactionManager} delegating to the given {@link PlatformTransactionManager}s. + * + * @param transactionManagers must not be {@literal null} or empty. + */ + public ChainedTransactionManager(PlatformTransactionManager... transactionManagers) { + this(SpringTransactionSynchronizationManager.INSTANCE, transactionManagers); + } + + /** + * Creates a new {@link ChainedTransactionManager} using the given {@link SynchronizationManager} and + * {@link PlatformTransactionManager}s. + * + * @param synchronizationManager must not be {@literal null}. + * @param transactionManagers must not be {@literal null} or empty. + */ + ChainedTransactionManager(SynchronizationManager synchronizationManager, + PlatformTransactionManager... transactionManagers) { + + Assert.notNull(synchronizationManager, "SynchronizationManager must not be null!"); + Assert.notNull(transactionManagers, "Transaction managers must not be null!"); + Assert.isTrue(transactionManagers.length > 0, "At least one PlatformTransactionManager must be given!"); + + this.synchronizationManager = synchronizationManager; + this.transactionManagers = new ArrayList<>(); + this.transactionManagers.addAll(Arrays.asList(transactionManagers)); + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.PlatformTransactionManager#getTransaction(org.springframework.transaction.TransactionDefinition) + */ + public MultiTransactionStatus getTransaction(TransactionDefinition definition) throws TransactionException { + + MultiTransactionStatus mts = new MultiTransactionStatus(transactionManagers.get(0)); + + if (!synchronizationManager.isSynchronizationActive() && canCreateTransaction(definition)) { + synchronizationManager.initSynchronization(); + mts.setNewSynchronization(); + } + + try { + + for (PlatformTransactionManager transactionManager : transactionManagers) { + mts.registerTransactionManager(definition, transactionManager); + } + + } catch (Exception ex) { + + Map transactionStatuses = mts.getTransactionStatuses(); + + for (PlatformTransactionManager transactionManager : transactionManagers) { + try { + if (transactionStatuses.get(transactionManager) != null) { + transactionManager.rollback(transactionStatuses.get(transactionManager)); + } + } catch (Exception ex2) { + LOGGER.warn("Rollback exception (" + transactionManager + ") " + ex2.getMessage(), ex2); + } + } + + if (mts.isNewSynchronization()) { + synchronizationManager.clearSynchronization(); + } + + throw new CannotCreateTransactionException(ex.getMessage(), ex); + } + + return mts; + } + + protected boolean canCreateTransaction(TransactionDefinition definition) { + return definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRED || + definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_REQUIRES_NEW || + definition.getPropagationBehavior() == TransactionDefinition.PROPAGATION_NESTED; + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.PlatformTransactionManager#commit(org.springframework.transaction.TransactionStatus) + */ + public void commit(TransactionStatus status) throws TransactionException { + + MultiTransactionStatus multiTransactionStatus = (MultiTransactionStatus) status; + + boolean commit = true; + Exception commitException = null; + PlatformTransactionManager commitExceptionTransactionManager = null; + + for (PlatformTransactionManager transactionManager : reverse(transactionManagers)) { + + if (commit) { + + try { + multiTransactionStatus.commit(transactionManager); + } catch (Exception ex) { + commit = false; + commitException = ex; + commitExceptionTransactionManager = transactionManager; + } + + } else { + + // after unsucessfull commit we must try to rollback remaining transaction managers + + try { + multiTransactionStatus.rollback(transactionManager); + } catch (Exception ex) { + LOGGER.warn("Rollback exception (after commit) (" + transactionManager + ") " + ex.getMessage(), ex); + } + } + } + + if (multiTransactionStatus.isNewSynchronization()) { + synchronizationManager.clearSynchronization(); + } + + if (commitException != null) { + boolean firstTransactionManagerFailed = commitExceptionTransactionManager == getLastTransactionManager(); + int transactionState = firstTransactionManagerFailed ? HeuristicCompletionException.STATE_ROLLED_BACK : + HeuristicCompletionException.STATE_MIXED; + throw new HeuristicCompletionException(transactionState, commitException); + } + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.PlatformTransactionManager#rollback(org.springframework.transaction.TransactionStatus) + */ + public void rollback(TransactionStatus status) throws TransactionException { + + Exception rollbackException = null; + PlatformTransactionManager rollbackExceptionTransactionManager = null; + + MultiTransactionStatus multiTransactionStatus = (MultiTransactionStatus) status; + + for (PlatformTransactionManager transactionManager : reverse(transactionManagers)) { + try { + multiTransactionStatus.rollback(transactionManager); + } catch (Exception ex) { + if (rollbackException == null) { + rollbackException = ex; + rollbackExceptionTransactionManager = transactionManager; + } else { + LOGGER.warn("Rollback exception (" + transactionManager + ") " + ex.getMessage(), ex); + } + } + } + + if (multiTransactionStatus.isNewSynchronization()) { + synchronizationManager.clearSynchronization(); + } + + if (rollbackException != null) { + throw new UnexpectedRollbackException("Rollback exception, originated at (" + rollbackExceptionTransactionManager + + ") " + rollbackException.getMessage(), rollbackException); + } + } + + private Iterable reverse(Collection collection) { + + List list = new ArrayList<>(collection); + Collections.reverse(list); + return list; + } + + private PlatformTransactionManager getLastTransactionManager() { + return transactionManagers.get(lastTransactionManagerIndex()); + } + + private int lastTransactionManagerIndex() { + return transactionManagers.size() - 1; + } public List getTransactionManagers() { return transactionManagers; diff --git a/grails-core/src/main/groovy/org/grails/transaction/ChainedTransactionManagerPostProcessor.java b/grails-core/src/main/groovy/org/grails/transaction/ChainedTransactionManagerPostProcessor.java index 027991530aa..b6381b33866 100644 --- a/grails-core/src/main/groovy/org/grails/transaction/ChainedTransactionManagerPostProcessor.java +++ b/grails-core/src/main/groovy/org/grails/transaction/ChainedTransactionManagerPostProcessor.java @@ -19,13 +19,12 @@ package org.grails.transaction; -import grails.config.Config; - -import java.util.*; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.grails.config.PropertySourcesConfig; import org.springframework.beans.BeansException; import org.springframework.beans.factory.ListableBeanFactory; import org.springframework.beans.factory.config.BeanDefinition; @@ -41,22 +40,25 @@ import org.springframework.transaction.jta.JtaTransactionManager; import org.springframework.util.ClassUtils; +import grails.config.Config; +import org.grails.config.PropertySourcesConfig; + /** * A {@link BeanDefinitionRegistryPostProcessor} for using the "Best Effort 1 Phase Commit" (BE1PC) in Grails - * applications when there are multiple data sources. - * + * applications when there are multiple data sources. + * * When the context contains multiple transactionManager beans, the bean with the name "transactionManager" * will be renamed to "$primaryTransactionManager" and a new ChainedTransactionManager bean will be added with the name * "transactionManager". All transactionManager beans will be registered in the ChainedTransactionManager bean. * - * The post processor checks if the previous transactionManager bean is an instance of {@link JtaTransactionManager}. + * The post processor checks if the previous transactionManager bean is an instance of {@link JtaTransactionManager}. * In that case it will not do anything since it's assumed that JTA/XA is handling transactions spanning multiple datasources. - * + * * For performance reasons an additional dataSource can be marked as non-transactional by adding a property 'transactional = false' in * it's dataSource configuration. This will leave the dataSource out of the transactions initiated by Grails transactions. - * This is the default behaviour in Grails versions before Grails 2.3.6 . - * - * + * This is the default behaviour in Grails versions before Grails 2.3.6 . + * + * * @author Lari Hotari * @since 2.3.6 * @@ -75,7 +77,7 @@ public class ChainedTransactionManagerPostProcessor implements BeanDefinitionReg private static final String PRIMARY_TRANSACTION_MANAGER = "$primaryTransactionManager"; private static final String TRANSACTION_MANAGER = "transactionManager"; private static final String READONLY = "readOnly"; - + private Config config; private Map dsConfigs; @@ -84,7 +86,7 @@ public class ChainedTransactionManagerPostProcessor implements BeanDefinitionReg public ChainedTransactionManagerPostProcessor(Config config) { this(config, null, null); } - + public ChainedTransactionManagerPostProcessor(Config config, String whitelistPattern, String blacklistPattern) { transactionManagerBeanNames = null; this.config = config; @@ -95,22 +97,21 @@ public ChainedTransactionManagerPostProcessor(Config config, String whitelistPat beanNameBlacklistPattern = blacklistPattern; } } - + public ChainedTransactionManagerPostProcessor() { this(new PropertySourcesConfig(), null, null); } - @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { - + } protected void registerAdditionalTransactionManagers(BeanDefinitionRegistry registry, BeanDefinition chainedTransactionManagerBeanDefinition, ManagedList transactionManagerRefs) { String[] allBeanNames = getTransactionManagerBeanNames(registry); for (String beanName : allBeanNames) { BeanDefinition beanDefinition = registry.getBeanDefinition(beanName); - if(!TRANSACTION_MANAGER.equals(beanName) && !PRIMARY_TRANSACTION_MANAGER.equals(beanName) && isValidTransactionManagerBeanDefinition(beanName, beanDefinition)) { + if (!TRANSACTION_MANAGER.equals(beanName) && !PRIMARY_TRANSACTION_MANAGER.equals(beanName) && isValidTransactionManagerBeanDefinition(beanName, beanDefinition)) { String suffix = resolveDataSourceSuffix(beanName); if (!isNotTransactional(suffix)) { transactionManagerRefs.add(new RuntimeBeanReference(beanName)); @@ -119,12 +120,11 @@ protected void registerAdditionalTransactionManagers(BeanDefinitionRegistry regi } } - protected static String[] getTransactionManagerBeanNames(BeanDefinitionRegistry registry) { - if(transactionManagerBeanNames == null) { + if (transactionManagerBeanNames == null) { - if(registry instanceof ListableBeanFactory) { - transactionManagerBeanNames = ((ListableBeanFactory)registry).getBeanNamesForType(PlatformTransactionManager.class, false, false); + if (registry instanceof ListableBeanFactory) { + transactionManagerBeanNames = ((ListableBeanFactory) registry).getBeanNamesForType(PlatformTransactionManager.class, false, false); } else { transactionManagerBeanNames = registry.getBeanDefinitionNames(); @@ -144,8 +144,8 @@ public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) t protected ManagedList createTransactionManagerBeanReferences( BeanDefinition chainedTransactionManagerBeanDefinition) { - ManagedList transactionManagerRefs = new ManagedList(); - ConstructorArgumentValues constructorValues=chainedTransactionManagerBeanDefinition.getConstructorArgumentValues(); + ManagedList transactionManagerRefs = new ManagedList<>(); + ConstructorArgumentValues constructorValues = chainedTransactionManagerBeanDefinition.getConstructorArgumentValues(); constructorValues.addIndexedArgumentValue(0, transactionManagerRefs); transactionManagerRefs.add(new RuntimeBeanReference(PRIMARY_TRANSACTION_MANAGER)); return transactionManagerRefs; @@ -170,20 +170,20 @@ protected boolean hasJtaOrChainedTransactionManager(BeanDefinitionRegistry regis } protected Class resolveTransactionManagerClass(BeanDefinitionRegistry registry) { - if(!registry.containsBeanDefinition(TRANSACTION_MANAGER)) { + if (!registry.containsBeanDefinition(TRANSACTION_MANAGER)) { return null; } BeanDefinition transactionManagerBeanDefinition = registry.getBeanDefinition(TRANSACTION_MANAGER); - ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); + ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); Class transactionManagerBeanClass = ClassUtils.resolveClassName(transactionManagerBeanDefinition.getBeanClassName(), classLoader); return transactionManagerBeanClass; } protected int countChainableTransactionManagerBeans(BeanDefinitionRegistry registry) { - int transactionManagerBeanCount=0; + int transactionManagerBeanCount = 0; for (String beanName : getTransactionManagerBeanNames(registry)) { BeanDefinition beanDefinition = registry.getBeanDefinition(beanName); - if(isValidTransactionManagerBeanDefinition(beanName, beanDefinition)) { + if (isValidTransactionManagerBeanDefinition(beanName, beanDefinition)) { String suffix = resolveDataSourceSuffix(beanName); if (beanName.equals(TRANSACTION_MANAGER) || !isNotTransactional(suffix)) { transactionManagerBeanCount++; @@ -194,21 +194,21 @@ protected int countChainableTransactionManagerBeans(BeanDefinitionRegistry regis } protected boolean isValidTransactionManagerBeanDefinition(String beanName, BeanDefinition beanDefinition) { - return beanName.matches(beanNameWhitelistPattern) && (beanNameBlacklistPattern==null || !beanName.matches(beanNameBlacklistPattern)) && !beanName.matches(beanNameInternalBlacklistPattern); + return beanName.matches(beanNameWhitelistPattern) && (beanNameBlacklistPattern == null || !beanName.matches(beanNameBlacklistPattern)) && !beanName.matches(beanNameInternalBlacklistPattern); } - + protected boolean isNotTransactional(String suffix) { if (suffix == null || config == null) { return false; } Boolean transactional = config.getProperty(DATA_SOURCES_PREFIX + suffix + "." + TRANSACTIONAL, Boolean.class, null); - if(transactional == null) { - Boolean isReadOnly = config.getProperty(DATA_SOURCES_PREFIX + suffix + "." + READONLY, Boolean.class, null); + if (transactional == null) { + Boolean isReadOnly = config.getProperty(DATA_SOURCES_PREFIX + suffix + "." + READONLY, Boolean.class, null); if (isReadOnly != null && isReadOnly == true) { transactional = false; } } - if(transactional != null){ + if (transactional != null) { return !transactional; } else { @@ -217,11 +217,11 @@ protected boolean isNotTransactional(String suffix) { } protected String resolveDataSourceSuffix(String transactionManagerBeanName) { - if(TRANSACTION_MANAGER.equals(transactionManagerBeanName)) { + if (TRANSACTION_MANAGER.equals(transactionManagerBeanName)) { return ""; } else { - Matcher matcher=SUFFIX_PATTERN.matcher(transactionManagerBeanName); - if(matcher.matches()) { + Matcher matcher = SUFFIX_PATTERN.matcher(transactionManagerBeanName); + if (matcher.matches()) { return matcher.group(1); } } @@ -229,11 +229,11 @@ protected String resolveDataSourceSuffix(String transactionManagerBeanName) { } private static boolean renameBean(String oldName, String newName, BeanDefinitionRegistry registry) { - if(!registry.containsBeanDefinition(oldName)) { + if (!registry.containsBeanDefinition(oldName)) { return false; } // remove link to child beans - Set previousChildBeans = new LinkedHashSet(); + Set previousChildBeans = new LinkedHashSet<>(); for (String bdName : getTransactionManagerBeanNames(registry)) { if (!oldName.equals(bdName)) { BeanDefinition bd = registry.getBeanDefinition(bdName); @@ -248,7 +248,7 @@ private static boolean renameBean(String oldName, String newName, BeanDefinition registry.removeBeanDefinition(oldName); registry.registerBeanDefinition(newName, oldBeanDefinition); // re-link possible child beans to new parent name - for(String bdName : previousChildBeans) { + for (String bdName : previousChildBeans) { BeanDefinition bd = registry.getBeanDefinition(bdName); bd.setParentName(newName); } diff --git a/grails-core/src/main/groovy/org/grails/transaction/GrailsTransactionAttribute.java b/grails-core/src/main/groovy/org/grails/transaction/GrailsTransactionAttribute.java index 89ed9fb4d1a..54a7c8fdd28 100644 --- a/grails-core/src/main/groovy/org/grails/transaction/GrailsTransactionAttribute.java +++ b/grails-core/src/main/groovy/org/grails/transaction/GrailsTransactionAttribute.java @@ -23,6 +23,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.interceptor.NoRollbackRuleAttribute; import org.springframework.transaction.interceptor.RollbackRuleAttribute; @@ -49,7 +50,7 @@ public GrailsTransactionAttribute() { public GrailsTransactionAttribute(int propagationBehavior, List rollbackRules) { super(propagationBehavior, rollbackRules); } - + public GrailsTransactionAttribute(TransactionAttribute other) { super(); setPropagationBehavior(other.getPropagationBehavior()); @@ -67,15 +68,15 @@ public GrailsTransactionAttribute(TransactionDefinition other) { setReadOnly(other.isReadOnly()); setName(other.getName()); } - + public GrailsTransactionAttribute(GrailsTransactionAttribute other) { - this((RuleBasedTransactionAttribute)other); + this((RuleBasedTransactionAttribute) other); } - + public GrailsTransactionAttribute(RuleBasedTransactionAttribute other) { super(other); - if(other instanceof GrailsTransactionAttribute) { - this.inheritRollbackOnly = ((GrailsTransactionAttribute)other).inheritRollbackOnly; + if (other instanceof GrailsTransactionAttribute) { + this.inheritRollbackOnly = ((GrailsTransactionAttribute) other).inheritRollbackOnly; } } @@ -100,7 +101,7 @@ public boolean rollbackOn(Throwable ex) { } if (log.isTraceEnabled()) { - log.trace("Winning rollback rule is: $winner" ); + log.trace("Winning rollback rule is: $winner"); } // User superclass behavior (rollback on unchecked) if no rule matches. @@ -113,6 +114,7 @@ public boolean rollbackOn(Throwable ex) { return !(winner instanceof NoRollbackRuleAttribute); } + public boolean isInheritRollbackOnly() { return inheritRollbackOnly; } diff --git a/grails-core/src/main/groovy/org/grails/transaction/GroovyAwareNamedTransactionAttributeSource.java b/grails-core/src/main/groovy/org/grails/transaction/GroovyAwareNamedTransactionAttributeSource.java index a870eeceb55..6e576c23211 100644 --- a/grails-core/src/main/groovy/org/grails/transaction/GroovyAwareNamedTransactionAttributeSource.java +++ b/grails-core/src/main/groovy/org/grails/transaction/GroovyAwareNamedTransactionAttributeSource.java @@ -18,8 +18,6 @@ */ package org.grails.transaction; -import grails.util.CollectionUtils; - import java.lang.reflect.Method; import java.util.Properties; import java.util.Set; @@ -27,6 +25,8 @@ import org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource; import org.springframework.transaction.interceptor.TransactionAttribute; +import grails.util.CollectionUtils; + /** * @author Graeme Rocher * @since 1.1.1 Don't match Groovy synthetic methods diff --git a/grails-core/src/main/groovy/org/grails/transaction/MultiTransactionStatus.java b/grails-core/src/main/groovy/org/grails/transaction/MultiTransactionStatus.java index 8ad3ef72551..641b5b01ea4 100644 --- a/grails-core/src/main/groovy/org/grails/transaction/MultiTransactionStatus.java +++ b/grails-core/src/main/groovy/org/grails/transaction/MultiTransactionStatus.java @@ -38,173 +38,173 @@ */ class MultiTransactionStatus implements TransactionStatus { - private final PlatformTransactionManager mainTransactionManager; - private final Map transactionStatuses = Collections - .synchronizedMap(new HashMap()); - - private boolean newSynchronization; - - /** - * Creates a new {@link MultiTransactionStatus} for the given {@link PlatformTransactionManager}. - * - * @param mainTransactionManager must not be {@literal null}. - */ - public MultiTransactionStatus(PlatformTransactionManager mainTransactionManager) { - - Assert.notNull(mainTransactionManager, "TransactionManager must not be null!"); - this.mainTransactionManager = mainTransactionManager; - } - - public Map getTransactionStatuses() { - return transactionStatuses; - } - - public void setNewSynchronization() { - this.newSynchronization = true; - } - - public boolean isNewSynchronization() { - return newSynchronization; - } - - public void registerTransactionManager(TransactionDefinition definition, PlatformTransactionManager transactionManager) { - getTransactionStatuses().put(transactionManager, transactionManager.getTransaction(definition)); - } - - public void commit(PlatformTransactionManager transactionManager) { - TransactionStatus transactionStatus = getTransactionStatus(transactionManager); - transactionManager.commit(transactionStatus); - } - - /** - * Rolls back the {@link TransactionStatus} registered for the given {@link PlatformTransactionManager}. - * - * @param transactionManager must not be {@literal null}. - */ - public void rollback(PlatformTransactionManager transactionManager) { - transactionManager.rollback(getTransactionStatus(transactionManager)); - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.TransactionStatus#isRollbackOnly() - */ - public boolean isRollbackOnly() { - return getMainTransactionStatus().isRollbackOnly(); - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.TransactionStatus#isCompleted() - */ - public boolean isCompleted() { - return getMainTransactionStatus().isCompleted(); - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.TransactionStatus#isNewTransaction() - */ - public boolean isNewTransaction() { - return getMainTransactionStatus().isNewTransaction(); - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.TransactionStatus#hasSavepoint() - */ - public boolean hasSavepoint() { - return getMainTransactionStatus().hasSavepoint(); - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.TransactionStatus#setRollbackOnly() - */ - public void setRollbackOnly() { - for (TransactionStatus ts : transactionStatuses.values()) { - ts.setRollbackOnly(); - } - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.SavepointManager#createSavepoint() - */ - public Object createSavepoint() throws TransactionException { - - SavePoints savePoints = new SavePoints(); - - for (TransactionStatus transactionStatus : transactionStatuses.values()) { - savePoints.save(transactionStatus); - } - return savePoints; - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.SavepointManager#rollbackToSavepoint(java.lang.Object) - */ - public void rollbackToSavepoint(Object savepoint) throws TransactionException { - SavePoints savePoints = (SavePoints) savepoint; - savePoints.rollback(); - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.SavepointManager#releaseSavepoint(java.lang.Object) - */ - public void releaseSavepoint(Object savepoint) throws TransactionException { - ((SavePoints) savepoint).release(); - } - - /* - * (non-Javadoc) - * @see org.springframework.transaction.TransactionStatus#flush() - */ - public void flush() { - for (TransactionStatus transactionStatus : transactionStatuses.values()) { - transactionStatus.flush(); - } - } - - private TransactionStatus getMainTransactionStatus() { - return transactionStatuses.get(mainTransactionManager); - } - - private TransactionStatus getTransactionStatus(PlatformTransactionManager transactionManager) { - return this.getTransactionStatuses().get(transactionManager); - } - - private static class SavePoints { - - private final Map savepoints = new HashMap(); - - private void addSavePoint(TransactionStatus status, Object savepoint) { - - Assert.notNull(status, "TransactionStatus must not be null!"); - this.savepoints.put(status, savepoint); - } - - private void save(TransactionStatus transactionStatus) { - Object savepoint = transactionStatus.createSavepoint(); - addSavePoint(transactionStatus, savepoint); - } - - public void rollback() { - for (TransactionStatus transactionStatus : savepoints.keySet()) { - transactionStatus.rollbackToSavepoint(savepointFor(transactionStatus)); - } - } - - private Object savepointFor(TransactionStatus transactionStatus) { - return savepoints.get(transactionStatus); - } - - public void release() { - for (TransactionStatus transactionStatus : savepoints.keySet()) { - transactionStatus.releaseSavepoint(savepointFor(transactionStatus)); - } - } - } + private final PlatformTransactionManager mainTransactionManager; + private final Map transactionStatuses = Collections + .synchronizedMap(new HashMap<>()); + + private boolean newSynchronization; + + /** + * Creates a new {@link MultiTransactionStatus} for the given {@link PlatformTransactionManager}. + * + * @param mainTransactionManager must not be {@literal null}. + */ + public MultiTransactionStatus(PlatformTransactionManager mainTransactionManager) { + + Assert.notNull(mainTransactionManager, "TransactionManager must not be null!"); + this.mainTransactionManager = mainTransactionManager; + } + + public Map getTransactionStatuses() { + return transactionStatuses; + } + + public void setNewSynchronization() { + this.newSynchronization = true; + } + + public boolean isNewSynchronization() { + return newSynchronization; + } + + public void registerTransactionManager(TransactionDefinition definition, PlatformTransactionManager transactionManager) { + getTransactionStatuses().put(transactionManager, transactionManager.getTransaction(definition)); + } + + public void commit(PlatformTransactionManager transactionManager) { + TransactionStatus transactionStatus = getTransactionStatus(transactionManager); + transactionManager.commit(transactionStatus); + } + + /** + * Rolls back the {@link TransactionStatus} registered for the given {@link PlatformTransactionManager}. + * + * @param transactionManager must not be {@literal null}. + */ + public void rollback(PlatformTransactionManager transactionManager) { + transactionManager.rollback(getTransactionStatus(transactionManager)); + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.TransactionStatus#isRollbackOnly() + */ + public boolean isRollbackOnly() { + return getMainTransactionStatus().isRollbackOnly(); + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.TransactionStatus#isCompleted() + */ + public boolean isCompleted() { + return getMainTransactionStatus().isCompleted(); + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.TransactionStatus#isNewTransaction() + */ + public boolean isNewTransaction() { + return getMainTransactionStatus().isNewTransaction(); + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.TransactionStatus#hasSavepoint() + */ + public boolean hasSavepoint() { + return getMainTransactionStatus().hasSavepoint(); + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.TransactionStatus#setRollbackOnly() + */ + public void setRollbackOnly() { + for (TransactionStatus ts : transactionStatuses.values()) { + ts.setRollbackOnly(); + } + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.SavepointManager#createSavepoint() + */ + public Object createSavepoint() throws TransactionException { + + SavePoints savePoints = new SavePoints(); + + for (TransactionStatus transactionStatus : transactionStatuses.values()) { + savePoints.save(transactionStatus); + } + return savePoints; + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.SavepointManager#rollbackToSavepoint(java.lang.Object) + */ + public void rollbackToSavepoint(Object savepoint) throws TransactionException { + SavePoints savePoints = (SavePoints) savepoint; + savePoints.rollback(); + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.SavepointManager#releaseSavepoint(java.lang.Object) + */ + public void releaseSavepoint(Object savepoint) throws TransactionException { + ((SavePoints) savepoint).release(); + } + + /* + * (non-Javadoc) + * @see org.springframework.transaction.TransactionStatus#flush() + */ + public void flush() { + for (TransactionStatus transactionStatus : transactionStatuses.values()) { + transactionStatus.flush(); + } + } + + private TransactionStatus getMainTransactionStatus() { + return transactionStatuses.get(mainTransactionManager); + } + + private TransactionStatus getTransactionStatus(PlatformTransactionManager transactionManager) { + return this.getTransactionStatuses().get(transactionManager); + } + + private static class SavePoints { + + private final Map savepoints = new HashMap<>(); + + private void addSavePoint(TransactionStatus status, Object savepoint) { + + Assert.notNull(status, "TransactionStatus must not be null!"); + this.savepoints.put(status, savepoint); + } + + private void save(TransactionStatus transactionStatus) { + Object savepoint = transactionStatus.createSavepoint(); + addSavePoint(transactionStatus, savepoint); + } + + public void rollback() { + for (TransactionStatus transactionStatus : savepoints.keySet()) { + transactionStatus.rollbackToSavepoint(savepointFor(transactionStatus)); + } + } + + private Object savepointFor(TransactionStatus transactionStatus) { + return savepoints.get(transactionStatus); + } + + public void release() { + for (TransactionStatus transactionStatus : savepoints.keySet()) { + transactionStatus.releaseSavepoint(savepointFor(transactionStatus)); + } + } + } } diff --git a/grails-core/src/main/groovy/org/grails/transaction/SpringTransactionSynchronizationManager.java b/grails-core/src/main/groovy/org/grails/transaction/SpringTransactionSynchronizationManager.java index 4c0b0cd10c1..bb7934246b6 100644 --- a/grails-core/src/main/groovy/org/grails/transaction/SpringTransactionSynchronizationManager.java +++ b/grails-core/src/main/groovy/org/grails/transaction/SpringTransactionSynchronizationManager.java @@ -29,29 +29,29 @@ */ enum SpringTransactionSynchronizationManager implements SynchronizationManager { - INSTANCE; + INSTANCE; - /* - * (non-Javadoc) - * @see org.grails.transaction.SynchronizationManager#initSynchronization() - */ - public void initSynchronization() { - TransactionSynchronizationManager.initSynchronization(); - } + /* + * (non-Javadoc) + * @see org.grails.transaction.SynchronizationManager#initSynchronization() + */ + public void initSynchronization() { + TransactionSynchronizationManager.initSynchronization(); + } - /* - * (non-Javadoc) - * @see org.grails.transaction.SynchronizationManager#isSynchronizationActive() - */ - public boolean isSynchronizationActive() { - return TransactionSynchronizationManager.isSynchronizationActive(); - } + /* + * (non-Javadoc) + * @see org.grails.transaction.SynchronizationManager#isSynchronizationActive() + */ + public boolean isSynchronizationActive() { + return TransactionSynchronizationManager.isSynchronizationActive(); + } - /* - * (non-Javadoc) - * @see org.grails.transaction.SynchronizationManager#clearSynchronization() - */ - public void clearSynchronization() { - TransactionSynchronizationManager.clear(); - } + /* + * (non-Javadoc) + * @see org.grails.transaction.SynchronizationManager#clearSynchronization() + */ + public void clearSynchronization() { + TransactionSynchronizationManager.clear(); + } } diff --git a/grails-core/src/main/groovy/org/grails/transaction/SynchronizationManager.java b/grails-core/src/main/groovy/org/grails/transaction/SynchronizationManager.java index cb53d9e7752..c2bde3be6b2 100644 --- a/grails-core/src/main/groovy/org/grails/transaction/SynchronizationManager.java +++ b/grails-core/src/main/groovy/org/grails/transaction/SynchronizationManager.java @@ -29,9 +29,9 @@ */ interface SynchronizationManager { - void initSynchronization(); + void initSynchronization(); - boolean isSynchronizationActive(); + boolean isSynchronizationActive(); - void clearSynchronization(); + void clearSynchronization(); } diff --git a/grails-core/src/main/groovy/org/grails/transaction/TransactionManagerPostProcessor.java b/grails-core/src/main/groovy/org/grails/transaction/TransactionManagerPostProcessor.java index 67c4d8e62bb..077a5e95859 100644 --- a/grails-core/src/main/groovy/org/grails/transaction/TransactionManagerPostProcessor.java +++ b/grails-core/src/main/groovy/org/grails/transaction/TransactionManagerPostProcessor.java @@ -18,8 +18,6 @@ */ package org.grails.transaction; -import grails.core.GrailsApplication; -import grails.transaction.TransactionManagerAware; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.BeanFactoryAware; @@ -30,6 +28,9 @@ import org.springframework.transaction.PlatformTransactionManager; import org.springframework.util.Assert; +import grails.core.GrailsApplication; +import grails.transaction.TransactionManagerAware; + /** * Injects the platform transaction manager into beans that implement {@link grails.transaction.TransactionManagerAware}. * @@ -67,7 +68,7 @@ public void setBeanFactory(BeanFactory beanFactory) throws BeansException { public boolean postProcessAfterInstantiation(Object bean, String name) throws BeansException { if (bean instanceof TransactionManagerAware) { initialize(); - if(transactionManager != null) { + if (transactionManager != null) { TransactionManagerAware tma = (TransactionManagerAware) bean; tma.setTransactionManager(transactionManager); } @@ -76,7 +77,7 @@ public boolean postProcessAfterInstantiation(Object bean, String name) throws Be } private void initialize() { - if(transactionManager == null && beanFactory != null && !initialized) { + if (transactionManager == null && beanFactory != null && !initialized) { if (beanFactory.containsBean(GrailsApplication.TRANSACTION_MANAGER_BEAN)) { transactionManager = beanFactory.getBean(GrailsApplication.TRANSACTION_MANAGER_BEAN, PlatformTransactionManager.class); } else { @@ -90,7 +91,7 @@ private void initialize() { // If at least one is found, use the first of them as the // transaction manager for the application. if (beanNames.length > 0) { - transactionManager = (PlatformTransactionManager)beanFactory.getBean(beanNames[0]); + transactionManager = (PlatformTransactionManager) beanFactory.getBean(beanNames[0]); } } initialized = true; diff --git a/grails-core/src/main/groovy/org/grails/validation/ConstraintEvalUtils.groovy b/grails-core/src/main/groovy/org/grails/validation/ConstraintEvalUtils.groovy index e47003a4363..e1bc73602ec 100644 --- a/grails-core/src/main/groovy/org/grails/validation/ConstraintEvalUtils.groovy +++ b/grails-core/src/main/groovy/org/grails/validation/ConstraintEvalUtils.groovy @@ -18,10 +18,11 @@ */ package org.grails.validation +import groovy.transform.CompileStatic + import grails.config.Config import grails.config.Settings import grails.util.ClosureToMapPopulator -import groovy.transform.CompileStatic import org.grails.core.lifecycle.ShutdownOperations /** diff --git a/grails-core/src/main/groovy/org/grails/validation/discovery/ConstrainedDiscovery.groovy b/grails-core/src/main/groovy/org/grails/validation/discovery/ConstrainedDiscovery.groovy index be94bb37637..f443568457c 100644 --- a/grails-core/src/main/groovy/org/grails/validation/discovery/ConstrainedDiscovery.groovy +++ b/grails-core/src/main/groovy/org/grails/validation/discovery/ConstrainedDiscovery.groovy @@ -37,4 +37,4 @@ interface ConstrainedDiscovery { * @return The constrained properties */ Map findConstrainedProperties(PersistentEntity entity) -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/boot-plugin/src/main/groovy/org/grails/datastore/gorm/boot/autoconfigure/HibernateGormAutoConfiguration.groovy b/grails-data-hibernate5/boot-plugin/src/main/groovy/org/grails/datastore/gorm/boot/autoconfigure/HibernateGormAutoConfiguration.groovy index 72fd05dfb0d..7167a13d9b8 100644 --- a/grails-data-hibernate5/boot-plugin/src/main/groovy/org/grails/datastore/gorm/boot/autoconfigure/HibernateGormAutoConfiguration.groovy +++ b/grails-data-hibernate5/boot-plugin/src/main/groovy/org/grails/datastore/gorm/boot/autoconfigure/HibernateGormAutoConfiguration.groovy @@ -14,19 +14,19 @@ */ package org.grails.datastore.gorm.boot.autoconfigure +import java.beans.Introspector + +import javax.sql.DataSource + import groovy.transform.CompileStatic -import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher -import org.grails.datastore.mapping.services.Service -import org.grails.orm.hibernate.HibernateDatastore -import org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration + import org.hibernate.SessionFactory + import org.springframework.beans.BeansException import org.springframework.beans.factory.BeanFactory import org.springframework.beans.factory.BeanFactoryAware import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.config.ConfigurableBeanFactory import org.springframework.beans.factory.config.ConfigurableListableBeanFactory -import org.springframework.beans.factory.support.BeanDefinitionRegistry import org.springframework.boot.autoconfigure.AutoConfigurationPackages import org.springframework.boot.autoconfigure.AutoConfigureAfter import org.springframework.boot.autoconfigure.AutoConfigureBefore @@ -38,18 +38,14 @@ import org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfigurat import org.springframework.context.ApplicationContext import org.springframework.context.ApplicationContextAware import org.springframework.context.ConfigurableApplicationContext -import org.springframework.context.EnvironmentAware -import org.springframework.context.ResourceLoaderAware import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration -import org.springframework.context.annotation.ImportBeanDefinitionRegistrar -import org.springframework.core.env.Environment -import org.springframework.core.io.ResourceLoader -import org.springframework.core.type.AnnotationMetadata import org.springframework.transaction.PlatformTransactionManager -import javax.sql.DataSource -import java.beans.Introspector +import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher +import org.grails.datastore.mapping.services.Service +import org.grails.orm.hibernate.HibernateDatastore +import org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration /** * Auto configuration for GORM for Hibernate @@ -61,7 +57,7 @@ import java.beans.Introspector @Configuration @ConditionalOnClass(HibernateMappingContextConfiguration) @ConditionalOnBean(DataSource) -@ConditionalOnMissingBean(type = "grails.orm.bootstrap.HibernateDatastoreSpringInitializer") +@ConditionalOnMissingBean(type = 'grails.orm.bootstrap.HibernateDatastoreSpringInitializer') @AutoConfigureAfter(DataSourceAutoConfiguration) @AutoConfigureBefore([HibernateJpaAutoConfiguration]) class HibernateGormAutoConfiguration implements ApplicationContextAware,BeanFactoryAware { @@ -77,22 +73,22 @@ class HibernateGormAutoConfiguration implements ApplicationContextAware,BeanFact HibernateDatastore hibernateDatastore() { List packageNames = AutoConfigurationPackages.get(this.beanFactory) List packages = [] - for(name in packageNames) { + for (name in packageNames) { Package pkg = Package.getPackage(name) - if(pkg != null) { + if (pkg != null) { packages.add(pkg) } } ConfigurableListableBeanFactory beanFactory = applicationContext.beanFactory HibernateDatastore datastore - if(dataSource == null) { + if (dataSource == null) { datastore = new HibernateDatastore( applicationContext.getEnvironment(), new ConfigurableApplicationContextEventPublisher(applicationContext), packages as Package[] ) - beanFactory.registerSingleton("dataSource", datastore.getDataSource()) + beanFactory.registerSingleton('dataSource', datastore.getDataSource()) } else { datastore = new HibernateDatastore( @@ -103,14 +99,14 @@ class HibernateGormAutoConfiguration implements ApplicationContextAware,BeanFact ) } - for(Service service in datastore.getServices()) { + for (Service service in datastore.getServices()) { Class serviceClass = service.getClass() grails.gorm.services.Service ann = serviceClass.getAnnotation(grails.gorm.services.Service) String serviceName = ann?.name() - if(serviceName == null) { + if (serviceName == null) { serviceName = Introspector.decapitalize(serviceClass.simpleName) } - if(!applicationContext.containsBean(serviceName)) { + if (!applicationContext.containsBean(serviceName)) { applicationContext.beanFactory.registerSingleton( serviceName, service @@ -132,9 +128,9 @@ class HibernateGormAutoConfiguration implements ApplicationContextAware,BeanFact @Override void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if(!(applicationContext instanceof ConfigurableApplicationContext)) { - throw new IllegalArgumentException("Neo4jAutoConfiguration requires an instance of ConfigurableApplicationContext") + if (!(applicationContext instanceof ConfigurableApplicationContext)) { + throw new IllegalArgumentException('Neo4jAutoConfiguration requires an instance of ConfigurableApplicationContext') } - this.applicationContext = (ConfigurableApplicationContext)applicationContext + this.applicationContext = (ConfigurableApplicationContext) applicationContext } } diff --git a/grails-data-hibernate5/boot-plugin/src/main/groovy/org/grails/datastore/gorm/boot/compiler/GormCompilerAutoConfiguration.groovy b/grails-data-hibernate5/boot-plugin/src/main/groovy/org/grails/datastore/gorm/boot/compiler/GormCompilerAutoConfiguration.groovy index 860c85cbec0..32d7f22be7a 100644 --- a/grails-data-hibernate5/boot-plugin/src/main/groovy/org/grails/datastore/gorm/boot/compiler/GormCompilerAutoConfiguration.groovy +++ b/grails-data-hibernate5/boot-plugin/src/main/groovy/org/grails/datastore/gorm/boot/compiler/GormCompilerAutoConfiguration.groovy @@ -19,6 +19,7 @@ import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.control.CompilationFailedException import org.codehaus.groovy.control.customizers.ImportCustomizer + import org.grails.cli.compiler.AstUtils import org.grails.cli.compiler.CompilerAutoConfiguration import org.grails.cli.compiler.DependencyCustomizer @@ -31,20 +32,21 @@ import org.grails.cli.compiler.DependencyCustomizer * */ @CompileStatic -class GormCompilerAutoConfiguration extends CompilerAutoConfiguration{ +class GormCompilerAutoConfiguration extends CompilerAutoConfiguration { + @Override boolean matches(ClassNode classNode) { - return AstUtils.hasAtLeastOneAnnotation(classNode, "grails.persistence.Entity", "grails.gorm.annotation.Entity" ,"Entity") + return AstUtils.hasAtLeastOneAnnotation(classNode, 'grails.persistence.Entity', 'grails.gorm.annotation.Entity', 'Entity') } @Override void applyDependencies(DependencyCustomizer dependencies) throws CompilationFailedException { - dependencies.ifAnyMissingClasses("grails.persistence.Entity", "grails.gorm.annotation.Entity") - .add("grails-data-hibernate5-core") + dependencies.ifAnyMissingClasses('grails.persistence.Entity', 'grails.gorm.annotation.Entity') + .add('grails-data-hibernate5-core') } @Override void applyImports(ImportCustomizer imports) throws CompilationFailedException { - imports.addStarImports("grails.gorm", "grails.gorm.annotation") + imports.addStarImports('grails.gorm', 'grails.gorm.annotation') } -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java b/grails-data-hibernate5/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java index c4dea433d0c..06b9c831341 100644 --- a/grails-data-hibernate5/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java +++ b/grails-data-hibernate5/core/src/main/groovy/grails/orm/HibernateCriteriaBuilder.java @@ -18,31 +18,36 @@ */ package grails.orm; +import java.util.List; +import java.util.Map; + import groovy.lang.GroovySystem; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.orm.hibernate.GrailsHibernateTemplate; -import org.grails.orm.hibernate.HibernateDatastore; -import org.grails.orm.hibernate.cfg.GrailsHibernateUtil; -import org.grails.orm.hibernate.query.*; -import org.grails.datastore.mapping.query.api.QueryableCriteria; + +import jakarta.persistence.metamodel.Attribute; +import jakarta.persistence.metamodel.PluralAttribute; + import org.hibernate.Criteria; -import org.hibernate.HibernateException; import org.hibernate.SessionFactory; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.Projection; import org.hibernate.criterion.ProjectionList; import org.hibernate.criterion.Projections; -import org.hibernate.engine.spi.SessionFactoryImplementor; import org.hibernate.sql.JoinType; import org.hibernate.type.StandardBasicTypes; import org.hibernate.type.Type; + import org.springframework.orm.hibernate5.SessionHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; -import jakarta.persistence.metamodel.Attribute; -import jakarta.persistence.metamodel.PluralAttribute; -import java.util.List; -import java.util.Map; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.query.api.QueryableCriteria; +import org.grails.orm.hibernate.GrailsHibernateTemplate; +import org.grails.orm.hibernate.HibernateDatastore; +import org.grails.orm.hibernate.cfg.GrailsHibernateUtil; +import org.grails.orm.hibernate.query.AbstractHibernateCriteriaBuilder; +import org.grails.orm.hibernate.query.AbstractHibernateQuery; +import org.grails.orm.hibernate.query.HibernateProjectionAdapter; +import org.grails.orm.hibernate.query.HibernateQuery; /** *

Wraps the Hibernate Criteria API in a builder. The builder can be retrieved through the "createCriteria()" dynamic static @@ -136,7 +141,7 @@ public HibernateCriteriaBuilder(Class targetClass, SessionFactory sessionFactory * @param alias The alias to assign to the joined association (for later reference). * @param joinType The type of join to use. * @return this (for method chaining) - * @throws HibernateException Indicates a problem creating the sub criteria + * @throws org.hibernate.HibernateException Indicates a problem creating the sub criteria * @see #createAlias(String, String) */ public Criteria createAlias(String associationPath, String alias, int joinType) { @@ -155,7 +160,7 @@ protected void cacheCriteriaMapping() { protected Class getClassForAssociationType(Attribute type) { if (type instanceof PluralAttribute) { - return ((PluralAttribute)type).getElementType().getJavaType(); + return ((PluralAttribute) type).getElementType().getJavaType(); } return type.getJavaType(); } @@ -191,7 +196,7 @@ protected void createCriteriaInstance() { { if (TransactionSynchronizationManager.hasResource(sessionFactory)) { participate = true; - hibernateSession = ((SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory)).getSession(); + hibernateSession = ((SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory)).getSession(); } else { hibernateSession = sessionFactory.openSession(); @@ -218,13 +223,13 @@ public static org.hibernate.criterion.DetachedCriteria getHibernateDetachedCrite Class targetClass = persistentEntity.getJavaClass(); org.hibernate.criterion.DetachedCriteria detachedCriteria; - if(alias != null) { + if (alias != null) { detachedCriteria = org.hibernate.criterion.DetachedCriteria.forClass(targetClass, alias); } else { detachedCriteria = org.hibernate.criterion.DetachedCriteria.forClass(targetClass); } - populateHibernateDetachedCriteria(new HibernateQuery(detachedCriteria,persistentEntity), detachedCriteria, queryableCriteria); + populateHibernateDetachedCriteria(new HibernateQuery(detachedCriteria, persistentEntity), detachedCriteria, queryableCriteria); return detachedCriteria; } diff --git a/grails-data-hibernate5/core/src/main/groovy/grails/orm/PagedResultList.java b/grails-data-hibernate5/core/src/main/groovy/grails/orm/PagedResultList.java index 6332bdefcbc..ad370bd638e 100644 --- a/grails-data-hibernate5/core/src/main/groovy/grails/orm/PagedResultList.java +++ b/grails-data-hibernate5/core/src/main/groovy/grails/orm/PagedResultList.java @@ -18,16 +18,17 @@ */ package grails.orm; -import org.grails.orm.hibernate.GrailsHibernateTemplate; -import org.grails.orm.hibernate.query.HibernateQuery; +import java.sql.SQLException; +import java.util.Iterator; + import org.hibernate.Criteria; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.criterion.Projections; import org.hibernate.internal.CriteriaImpl; -import java.sql.SQLException; -import java.util.Iterator; +import org.grails.orm.hibernate.GrailsHibernateTemplate; +import org.grails.orm.hibernate.query.HibernateQuery; /** * A result list for Criteria list calls, which is aware of the totalCount for @@ -37,7 +38,7 @@ * @since 1.0 * @deprecated Use {@link org.grails.orm.hibernate.query.PagedResultList} instead. */ -@SuppressWarnings({"unchecked","rawtypes"}) +@SuppressWarnings({"unchecked", "rawtypes"}) @Deprecated public class PagedResultList extends grails.gorm.PagedResultList { @@ -66,7 +67,7 @@ protected void initialize() { @Override public int getTotalCount() { if (totalCount == Integer.MIN_VALUE) { - totalCount = hibernateTemplate.execute(new GrailsHibernateTemplate.HibernateCallback() { + totalCount = hibernateTemplate.execute(new GrailsHibernateTemplate.HibernateCallback<>() { public Integer doInHibernate(Session session) throws HibernateException, SQLException { CriteriaImpl impl = (CriteriaImpl) criteria; Criteria totalCriteria = session.createCriteria(impl.getEntityOrClassName()); @@ -84,7 +85,7 @@ public Integer doInHibernate(Session session) throws HibernateException, SQLExce } totalCriteria.setProjection(impl.getProjection()); totalCriteria.setProjection(Projections.rowCount()); - return ((Number)totalCriteria.uniqueResult()).intValue(); + return ((Number) totalCriteria.uniqueResult()).intValue(); } }); } diff --git a/grails-data-hibernate5/core/src/main/groovy/grails/orm/RlikeExpression.java b/grails-data-hibernate5/core/src/main/groovy/grails/orm/RlikeExpression.java index d16c458f031..e2e6c0223d1 100644 --- a/grails-data-hibernate5/core/src/main/groovy/grails/orm/RlikeExpression.java +++ b/grails-data-hibernate5/core/src/main/groovy/grails/orm/RlikeExpression.java @@ -23,7 +23,11 @@ import org.hibernate.criterion.CriteriaQuery; import org.hibernate.criterion.Criterion; import org.hibernate.criterion.MatchMode; -import org.hibernate.dialect.*; +import org.hibernate.dialect.Dialect; +import org.hibernate.dialect.H2Dialect; +import org.hibernate.dialect.MySQLDialect; +import org.hibernate.dialect.Oracle8iDialect; +import org.hibernate.dialect.PostgreSQL81Dialect; import org.hibernate.engine.spi.TypedValue; /** diff --git a/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/HibernateEntity.groovy b/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/HibernateEntity.groovy index 7339430b01a..555a69c0615 100644 --- a/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/HibernateEntity.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/HibernateEntity.groovy @@ -21,6 +21,7 @@ package grails.gorm.hibernate import groovy.transform.CompileStatic import groovy.transform.Generated + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.GormEntity import org.grails.orm.hibernate.AbstractHibernateGormStaticApi @@ -43,7 +44,7 @@ trait HibernateEntity extends GormEntity { */ @Generated static List findAllWithSql(CharSequence sql) { - currentHibernateStaticApi().findAllWithSql sql, Collections.emptyMap() + currentHibernateStaticApi().findAllWithSql(sql, Collections.emptyMap()) } /** @@ -66,7 +67,7 @@ trait HibernateEntity extends GormEntity { */ @Generated static List findAllWithSql(CharSequence sql, Map args) { - currentHibernateStaticApi().findAllWithSql sql, args + currentHibernateStaticApi().findAllWithSql(sql, args) } /** @@ -82,6 +83,6 @@ trait HibernateEntity extends GormEntity { @Generated private static AbstractHibernateGormStaticApi currentHibernateStaticApi() { - (AbstractHibernateGormStaticApi)GormEnhancer.findStaticApi(this) + (AbstractHibernateGormStaticApi) GormEnhancer.findStaticApi(this) } -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/annotation/ManagedEntity.java b/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/annotation/ManagedEntity.java index 5dc5f3488bc..874efe9f95c 100644 --- a/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/annotation/ManagedEntity.java +++ b/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/annotation/ManagedEntity.java @@ -19,13 +19,13 @@ package grails.gorm.hibernate.annotation; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; + @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @GroovyASTTransformationClass("org.grails.orm.hibernate.compiler.HibernateEntityTransformation") diff --git a/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/mapping/MappingBuilder.groovy b/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/mapping/MappingBuilder.groovy index fb16cc64046..2de0609c2c5 100644 --- a/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/mapping/MappingBuilder.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/grails/orm/hibernate/mapping/MappingBuilder.groovy @@ -20,6 +20,7 @@ package grails.gorm.hibernate.mapping import groovy.transform.CompileStatic + import org.grails.datastore.mapping.config.MappingDefinition import org.grails.orm.hibernate.cfg.Mapping import org.grails.orm.hibernate.cfg.PropertyConfig @@ -69,7 +70,7 @@ class MappingBuilder { @Override Mapping build() { - if(mapping == null) { + if (mapping == null) { mapping = Mapping.configureNew(definition) } return mapping diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateDatastore.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateDatastore.java index 425bf01dc9e..0d62627c39e 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateDatastore.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateDatastore.java @@ -18,18 +18,50 @@ */ package org.grails.orm.hibernate; -import grails.gorm.multitenancy.Tenants; +import java.io.Closeable; +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.concurrent.Callable; + +import javax.sql.DataSource; + import groovy.lang.Closure; -import org.grails.datastore.gorm.validation.registry.support.ValidatorRegistries; + +import jakarta.annotation.PreDestroy; + +import org.hibernate.Session; +import org.hibernate.SessionFactory; + +import org.springframework.beans.BeanUtils; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationContextAware; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.MessageSource; +import org.springframework.context.MessageSourceAware; +import org.springframework.core.env.PropertyResolver; + +import grails.gorm.multitenancy.Tenants; import org.grails.datastore.gorm.events.AutoTimestampEventListener; +import org.grails.datastore.gorm.jdbc.schema.DefaultSchemaHandler; +import org.grails.datastore.gorm.jdbc.schema.SchemaHandler; +import org.grails.datastore.gorm.validation.registry.support.ValidatorRegistries; import org.grails.datastore.mapping.config.Settings; import org.grails.datastore.mapping.core.AbstractDatastore; import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.DatastoreAware; -import org.grails.datastore.mapping.core.connections.*; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSources; +import org.grails.datastore.mapping.core.connections.MultipleConnectionSourceCapableDatastore; +import org.grails.datastore.mapping.core.connections.SingletonConnectionSources; import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.model.config.GormProperties; -import org.grails.datastore.mapping.multitenancy.*; +import org.grails.datastore.mapping.multitenancy.AllTenantsResolver; +import org.grails.datastore.mapping.multitenancy.MultiTenancySettings; +import org.grails.datastore.mapping.multitenancy.SchemaMultiTenantCapableDatastore; +import org.grails.datastore.mapping.multitenancy.TenantResolver; import org.grails.datastore.mapping.multitenancy.exceptions.TenantNotFoundException; import org.grails.datastore.mapping.multitenancy.resolvers.FixedTenantResolver; import org.grails.datastore.mapping.transactions.TransactionCapableDatastore; @@ -37,24 +69,7 @@ import org.grails.orm.hibernate.cfg.HibernateMappingContext; import org.grails.orm.hibernate.connections.HibernateConnectionSource; import org.grails.orm.hibernate.connections.HibernateConnectionSourceSettings; -import org.grails.datastore.gorm.jdbc.schema.DefaultSchemaHandler; -import org.grails.datastore.gorm.jdbc.schema.SchemaHandler; import org.grails.orm.hibernate.event.listener.AbstractHibernateEventListener; -import org.hibernate.Session; -import org.hibernate.SessionFactory; -import org.springframework.beans.BeanUtils; -import org.springframework.context.*; -import org.springframework.core.env.PropertyResolver; - -import jakarta.annotation.PreDestroy; -import javax.sql.DataSource; -import java.io.Closeable; -import java.io.IOException; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.concurrent.Callable; /** * Datastore implementation that uses a Hibernate SessionFactory underneath. @@ -109,18 +124,18 @@ protected AbstractHibernateDatastore(ConnectionSources schemaHandlerClass = settings.getDataSource().getSchemaHandler(); this.schemaHandler = BeanUtils.instantiateClass(schemaHandlerClass); this.tenantResolver = multiTenantResolver; - if(multiTenantResolver instanceof DatastoreAware) { + if (multiTenantResolver instanceof DatastoreAware) { ((DatastoreAware) multiTenantResolver).setDatastore(this); } } protected AbstractHibernateDatastore(MappingContext mappingContext, SessionFactory sessionFactory, PropertyResolver config, ApplicationContext applicationContext, String dataSourceName) { super(mappingContext, config, (ConfigurableApplicationContext) applicationContext); - this.connectionSources = new SingletonConnectionSources<>(new HibernateConnectionSource(dataSourceName, sessionFactory, null, null ), config); + this.connectionSources = new SingletonConnectionSources<>(new HibernateConnectionSource(dataSourceName, sessionFactory, null, null), config); this.sessionFactory = sessionFactory; this.dataSourceName = dataSourceName; initializeConverters(mappingContext); - if(applicationContext != null) { + if (applicationContext != null) { setApplicationContext(applicationContext); } @@ -128,7 +143,7 @@ protected AbstractHibernateDatastore(MappingContext mappingContext, SessionFacto passReadOnlyToHibernate = config.getProperty(CONFIG_PROPERTY_PASS_READONLY_TO_HIBERNATE, Boolean.class, false); isCacheQueries = config.getProperty(CONFIG_PROPERTY_CACHE_QUERIES, Boolean.class, false); - if( config.getProperty(SETTING_AUTO_FLUSH, Boolean.class, false) ) { + if (config.getProperty(SETTING_AUTO_FLUSH, Boolean.class, false)) { this.defaultFlushModeName = FlushMode.AUTO.name(); defaultFlushMode = FlushMode.AUTO.level; } @@ -167,7 +182,7 @@ public MultiTenancySettings.MultiTenancyMode getMultiTenancyMode() { @Override public Datastore getDatastoreForTenantId(Serializable tenantId) { - if(getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DATABASE) { + if (getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DATABASE) { return getDatastoreForConnection(tenantId.toString()); } else { @@ -191,16 +206,16 @@ public ConnectionSources getC * @param connectionName The name of the connection * @return The child data store */ - public abstract AbstractHibernateDatastore getDatastoreForConnection(String connectionName); + public abstract AbstractHibernateDatastore getDatastoreForConnection(String connectionName); public Iterable resolveTenantIds() { - if(this.tenantResolver instanceof AllTenantsResolver) { - return ((AllTenantsResolver)tenantResolver).resolveTenantIds(); + if (this.tenantResolver instanceof AllTenantsResolver) { + return ((AllTenantsResolver) tenantResolver).resolveTenantIds(); } - else if(this.multiTenantMode == MultiTenancySettings.MultiTenancyMode.DATABASE) { + else if (this.multiTenantMode == MultiTenancySettings.MultiTenancyMode.DATABASE) { List tenantIds = new ArrayList<>(); for (ConnectionSource connectionSource : this.connectionSources.getAllConnectionSources()) { - if(!ConnectionSource.DEFAULT.equals(connectionSource.getName())) { + if (!ConnectionSource.DEFAULT.equals(connectionSource.getName())) { tenantIds.add(connectionSource.getName()); } } @@ -260,7 +275,7 @@ public SessionFactory getSessionFactory() { * @return The {@link DataSource} being used by this datastore instance */ public DataSource getDataSource() { - return ((HibernateConnectionSource)this.connectionSources.getDefaultConnectionSource()).getDataSource(); + return ((HibernateConnectionSource) this.connectionSources.getDefaultConnectionSource()).getDataSource(); } // for testing @@ -366,25 +381,24 @@ public T withNewSession(final Closure callable) { @Override public T1 withNewSession(Serializable tenantId, Closure callable) { - if(getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DATABASE) { + if (getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DATABASE) { AbstractHibernateDatastore datastore = getDatastoreForConnection(tenantId.toString()); SessionFactory sessionFactory = datastore.getSessionFactory(); - return datastore.getHibernateTemplate().executeWithExistingOrCreateNewSession( sessionFactory, callable); + return datastore.getHibernateTemplate().executeWithExistingOrCreateNewSession(sessionFactory, callable); } else { return withNewSession(callable); } } - /** * Enable the tenant id filter for the given datastore and entity * */ public void enableMultiTenancyFilter() { Serializable currentId = Tenants.currentId(this); - if(ConnectionSource.DEFAULT.equals(currentId)) { + if (ConnectionSource.DEFAULT.equals(currentId)) { disableMultiTenancyFilter(); } else { @@ -396,7 +410,6 @@ public void enableMultiTenancyFilter() { } } - /** * Disable the tenant id filter for the given datastore and entity */ @@ -410,8 +423,8 @@ public void disableMultiTenancyFilter() { protected Closure prepareMultiTenantClosure(final Closure callable) { final boolean isMultiTenant = getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR; Closure multiTenantCallable; - if(isMultiTenant) { - multiTenantCallable = new Closure(this) { + if (isMultiTenant) { + multiTenantCallable = new Closure<>(this) { @Override public T call(Object... args) { enableMultiTenancyFilter(); diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormInstanceApi.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormInstanceApi.groovy index 7adadd48231..5b7c18d66bc 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormInstanceApi.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormInstanceApi.groovy @@ -18,31 +18,37 @@ */ package org.grails.orm.hibernate -import grails.gorm.validation.CascadingValidator import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + +import org.hibernate.FlushMode +import org.hibernate.HibernateException +import org.hibernate.LockMode +import org.hibernate.Session +import org.hibernate.SessionFactory + +import org.springframework.beans.BeanWrapperImpl +import org.springframework.beans.InvalidPropertyException +import org.springframework.dao.DataAccessException +import org.springframework.validation.Errors +import org.springframework.validation.Validator + +import grails.gorm.validation.CascadingValidator +import org.grails.datastore.gorm.GormInstanceApi import org.grails.datastore.gorm.GormValidateable import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.dirty.checking.DirtyCheckable +import org.grails.datastore.mapping.engine.event.ValidationEvent +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.model.config.GormProperties +import org.grails.datastore.mapping.model.types.Association import org.grails.datastore.mapping.model.types.Embedded +import org.grails.datastore.mapping.model.types.ToOne import org.grails.datastore.mapping.proxy.ProxyHandler import org.grails.datastore.mapping.reflect.ClassUtils import org.grails.datastore.mapping.reflect.EntityReflector import org.grails.orm.hibernate.support.HibernateRuntimeUtils -import org.grails.datastore.gorm.GormInstanceApi -import org.grails.datastore.mapping.engine.event.ValidationEvent -import org.grails.datastore.mapping.model.PersistentEntity -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.mapping.model.types.Association -import org.grails.datastore.mapping.model.types.ToOne -import org.hibernate.* -import org.springframework.beans.BeanWrapperImpl -import org.springframework.beans.InvalidPropertyException -import org.springframework.dao.DataAccessException -import org.springframework.validation.Errors -import org.springframework.validation.Validator - /** * Abstract extension of the {@link GormInstanceApi} class that provides common logic shared by Hibernate 3 and Hibernate 4 @@ -52,12 +58,13 @@ import org.springframework.validation.Validator */ @CompileStatic abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { - private static final String ARGUMENT_VALIDATE = "validate" - private static final String ARGUMENT_DEEP_VALIDATE = "deepValidate" - private static final String ARGUMENT_FLUSH = "flush" - private static final String ARGUMENT_INSERT = "insert" - private static final String ARGUMENT_MERGE = "merge" - private static final String ARGUMENT_FAIL_ON_ERROR = "failOnError" + + private static final String ARGUMENT_VALIDATE = 'validate' + private static final String ARGUMENT_DEEP_VALIDATE = 'deepValidate' + private static final String ARGUMENT_FLUSH = 'flush' + private static final String ARGUMENT_INSERT = 'insert' + private static final String ARGUMENT_MERGE = 'merge' + private static final String ARGUMENT_FAIL_ON_ERROR = 'failOnError' private static final Class DEFERRED_BINDING static { @@ -78,8 +85,6 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { */ static final ThreadLocal insertActiveThreadLocal = new ThreadLocal() - - protected SessionFactory sessionFactory protected ClassLoader classLoader protected IHibernateTemplate hibernateTemplate @@ -119,20 +124,20 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { Errors errors = HibernateRuntimeUtils.setupErrorsProperty(target) if (validator) { - datastore.applicationEventPublisher?.publishEvent new ValidationEvent(datastore, target) + datastore.applicationEventPublisher?.publishEvent(new ValidationEvent(datastore, target)) if (validator instanceof CascadingValidator) { - ((CascadingValidator)validator).validate target, errors, deepValidate + ((CascadingValidator) validator).validate(target, errors, deepValidate) } else if (validator instanceof org.grails.datastore.gorm.validation.CascadingValidator) { - ((org.grails.datastore.gorm.validation.CascadingValidator) validator).validate target, errors, deepValidate + ((org.grails.datastore.gorm.validation.CascadingValidator) validator).validate(target, errors, deepValidate) } else { - validator.validate target, errors + validator.validate(target, errors) } if (errors.hasErrors()) { - handleValidationError(domainClass,target,errors) + handleValidationError(domainClass, target, errors) if (shouldFail(arguments)) { - throw validationException.newInstance("Validation Error(s) occurred during save()", errors) + throw validationException.newInstance('Validation Error(s) occurred during save()', errors) } return null } @@ -144,7 +149,7 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { // this piece of code will retrieve a persistent instant // of a domain class property is only the id is set thus // relieving this burden off the developer - autoRetrieveAssociations datastore, domainClass, target + autoRetrieveAssociations(datastore, domainClass, target) // Once we get here we've either validated this object or skipped validation, either way // we don't need to validate again for the rest of this save. @@ -155,7 +160,7 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { if (shouldInsert(arguments)) { return performInsert(target, shouldFlush) } - else if(shouldMerge(arguments)) { + else if (shouldMerge(arguments)) { return performMerge(target, shouldFlush) } else { @@ -193,7 +198,7 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { @Override void discard(D instance) { - hibernateTemplate.evict instance + hibernateTemplate.evict(instance) } @Override @@ -201,8 +206,8 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { boolean flush = shouldFlush(params) try { hibernateTemplate.execute { Session session -> - session.delete instance - if(flush) { + session.delete(instance) + if (flush) { session.flush() } } @@ -221,7 +226,7 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { @Override boolean isAttached(D instance) { - hibernateTemplate.contains instance + hibernateTemplate.contains(instance) } @Override @@ -249,9 +254,9 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { protected D performSave(final D target, final boolean flush) { hibernateTemplate.execute { Session session -> - session.saveOrUpdate target + session.saveOrUpdate(target) if (flush) { - flushSession session + flushSession(session) } return target } @@ -262,9 +267,9 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { Object merged = session.merge(target) session.lock(merged, LockMode.NONE) if (flush) { - flushSession session + flushSession(session) } - return (D)merged + return (D) merged } } @@ -272,9 +277,9 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { hibernateTemplate.execute { Session session -> try { markInsertActive() - session.save target + session.save(target) if (shouldFlush) { - flushSession session + flushSession(session) } return target } finally { @@ -289,7 +294,7 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { session.flush() } catch (HibernateException e) { // session should not be flushed again after a data access exception! - session.setFlushMode FlushMode.MANUAL + session.setFlushMode(FlushMode.MANUAL) throw e } } @@ -298,13 +303,13 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { * @param entity The domain class to retrieve associations for * @param target The target object */ - @SuppressWarnings("unchecked") + @SuppressWarnings('unchecked') private void autoRetrieveAssociations(Datastore datastore, PersistentEntity entity, Object target) { EntityReflector reflector = datastore.mappingContext.getEntityReflector(entity) IHibernateTemplate t = this.hibernateTemplate for (PersistentProperty prop in entity.associations) { - if(prop instanceof ToOne && !(prop instanceof Embedded)) { - ToOne toOne = (ToOne)prop + if (prop instanceof ToOne && !(prop instanceof Embedded)) { + ToOne toOne = (ToOne) prop def propertyName = prop.name def propValue = reflector.getProperty(target, propertyName) @@ -318,13 +323,13 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { } def identity = otherSide.identity - if(identity == null) { + if (identity == null) { continue } def otherSideReflector = datastore.mappingContext.getEntityReflector(otherSide) try { - def id = (Serializable)otherSideReflector.getProperty(propValue, identity.name); + def id = (Serializable) otherSideReflector.getProperty(propValue, identity.name) if (id) { final Object associatedInstance = t.get(prop.type, id) if (associatedInstance) { @@ -365,7 +370,6 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { ClassUtils.getBooleanFromMap(ARGUMENT_MERGE, arguments) } - protected boolean shouldFlush(Map map) { if (map?.containsKey(ARGUMENT_FLUSH)) { return ClassUtils.getBooleanFromMap(ARGUMENT_FLUSH, map) @@ -391,21 +395,21 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { */ protected Object handleValidationError(PersistentEntity entity, final Object target, Errors errors) { // if a validation error occurs set the object to read-only to prevent a flush - setObjectToReadOnly target + setObjectToReadOnly(target) if (entity) { for (Association association in entity.associations) { if (association instanceof ToOne && !association instanceof Embedded) { - if(proxyHandler.isInitialized(target, association.name)) { + if (proxyHandler.isInitialized(target, association.name)) { def bean = new BeanWrapperImpl(target) def propertyValue = bean.getPropertyValue(association.name) if (propertyValue != null) { - setObjectToReadOnly propertyValue + setObjectToReadOnly(propertyValue) } } } } } - setErrorsOnInstance target, errors + setErrorsOnInstance(target, errors) return null } @@ -421,7 +425,7 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { hibernateTemplate.execute { Session session -> if (session.contains(target) && proxyHandler.isInitialized(target)) { target = proxyHandler.unwrap(target) - session.setReadOnly target, true + session.setReadOnly(target, true) session.flushMode = FlushMode.MANUAL } } @@ -444,8 +448,8 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { */ @CompileDynamic protected void setErrorsOnInstance(Object target, Errors errors) { - if(target instanceof GormValidateable) { - ((GormValidateable)target).setErrors(errors) + if (target instanceof GormValidateable) { + ((GormValidateable) target).setErrors(errors) } else { target."$GormProperties.ERRORS" = errors @@ -457,14 +461,14 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { * to set a ThreadLocal variable that determines the value for getAssumedUnsaved(). */ static void markInsertActive() { - insertActiveThreadLocal.set(Boolean.TRUE); + insertActiveThreadLocal.set(Boolean.TRUE) } /** * Clears the ThreadLocal variable set by markInsertActive(). */ static void resetInsertActive() { - insertActiveThreadLocal.remove(); + insertActiveThreadLocal.remove() } /** @@ -476,7 +480,7 @@ abstract class AbstractHibernateGormInstanceApi extends GormInstanceApi { if (target.hasProperty(GormProperties.VERSION)) { Object version = target."${GormProperties.VERSION}" if (version instanceof Long) { - target."${GormProperties.VERSION}" = ++((Long)version) + target."${GormProperties.VERSION}" = ++((Long) version) } } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormStaticApi.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormStaticApi.groovy index 0f396c24ca1..a94ae96587a 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormStaticApi.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormStaticApi.groovy @@ -21,18 +21,12 @@ package org.grails.orm.hibernate import groovy.transform.CompileDynamic import groovy.transform.CompileStatic -import org.grails.datastore.mapping.proxy.ProxyHandler -import org.grails.datastore.mapping.reflect.ClassUtils -import org.grails.orm.hibernate.cfg.AbstractGrailsDomainBinder -import org.grails.orm.hibernate.cfg.CompositeIdentity -import org.grails.orm.hibernate.exceptions.GrailsQueryException -import org.grails.orm.hibernate.query.GrailsHibernateQueryUtils -import org.grails.orm.hibernate.query.HibernateHqlQuery -import org.grails.orm.hibernate.support.HibernateRuntimeUtils -import org.grails.datastore.gorm.GormStaticApi -import org.grails.datastore.gorm.finders.DynamicFinder -import org.grails.datastore.gorm.finders.FinderMethod +import jakarta.persistence.criteria.CriteriaBuilder +import jakarta.persistence.criteria.CriteriaQuery +import jakarta.persistence.criteria.Expression +import jakarta.persistence.criteria.Root + import org.hibernate.Criteria import org.hibernate.FlushMode import org.hibernate.Session @@ -42,13 +36,21 @@ import org.hibernate.jpa.QueryHints import org.hibernate.query.NativeQuery import org.hibernate.query.Query import org.hibernate.transform.DistinctRootEntityResultTransformer + import org.springframework.core.convert.ConversionService import org.springframework.transaction.PlatformTransactionManager -import jakarta.persistence.criteria.CriteriaBuilder -import jakarta.persistence.criteria.CriteriaQuery -import jakarta.persistence.criteria.Expression -import jakarta.persistence.criteria.Root +import org.grails.datastore.gorm.GormStaticApi +import org.grails.datastore.gorm.finders.DynamicFinder +import org.grails.datastore.gorm.finders.FinderMethod +import org.grails.datastore.mapping.proxy.ProxyHandler +import org.grails.datastore.mapping.reflect.ClassUtils +import org.grails.orm.hibernate.cfg.AbstractGrailsDomainBinder +import org.grails.orm.hibernate.cfg.CompositeIdentity +import org.grails.orm.hibernate.exceptions.GrailsQueryException +import org.grails.orm.hibernate.query.GrailsHibernateQueryUtils +import org.grails.orm.hibernate.query.HibernateHqlQuery +import org.grails.orm.hibernate.support.HibernateRuntimeUtils /** * Abstract implementation of the Hibernate static API for GORM, providing String-based method implementations @@ -81,7 +83,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { this.conversionService = datastore.mappingContext.conversionService this.proxyHandler = datastore.mappingContext.proxyHandler this.hibernateSession = new HibernateSession( - (HibernateDatastore)datastore, + (HibernateDatastore) datastore, hibernateTemplate.getSessionFactory(), hibernateTemplate.getFlushMode() ) @@ -92,7 +94,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { } @Override - public T withNewSession(Closure callable) { + T withNewSession(Closure callable) { AbstractHibernateDatastore hibernateDatastore = (AbstractHibernateDatastore) datastore hibernateDatastore.withNewSession(callable) } @@ -103,7 +105,6 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { hibernateDatastore.withSession(callable) } - @Override D get(Serializable id) { if (id == null) { @@ -111,31 +112,31 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { } id = convertIdentifier(id) - + if (id == null) { return null } - if(persistentEntity.isMultiTenant()) { + if (persistentEntity.isMultiTenant()) { // for multi-tenant entities we process get(..) via a query - (D)hibernateTemplate.execute( { Session session -> + (D) hibernateTemplate.execute({ Session session -> CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder() CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(persistentEntity.javaClass) Root queryRoot = criteriaQuery.from(persistentEntity.javaClass) - criteriaQuery = criteriaQuery.where ( + criteriaQuery = criteriaQuery.where( //TODO: Remove explicit type cast once GROOVY-9460 criteriaBuilder.equal((Expression) queryRoot.get(persistentEntity.identity.name), id) ) Query criteria = session.createQuery(criteriaQuery) HibernateHqlQuery hibernateHqlQuery = new HibernateHqlQuery( hibernateSession, persistentEntity, criteria) - return proxyHandler.unwrap( hibernateHqlQuery.singleResult() ) - } ) + return proxyHandler.unwrap(hibernateHqlQuery.singleResult()) + }) } else { // for non multi-tenant entities we process get(..) via the second level cache - return (D)proxyHandler.unwrap( + return (D) proxyHandler.unwrap( hibernateTemplate.get(persistentEntity.javaClass, id) ) } @@ -152,13 +153,13 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { if (id == null) { return null } - - (D)hibernateTemplate.execute( { Session session -> + + (D) hibernateTemplate.execute({ Session session -> CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder() CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(persistentEntity.javaClass) Root queryRoot = criteriaQuery.from(persistentEntity.javaClass) - criteriaQuery = criteriaQuery.where ( + criteriaQuery = criteriaQuery.where( //TODO: Remove explicit type cast once GROOVY-9460 criteriaBuilder.equal((Expression) queryRoot.get(persistentEntity.identity.name), id) ) @@ -166,9 +167,9 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { .setHint(QueryHints.HINT_READONLY, true) HibernateHqlQuery hibernateHqlQuery = new HibernateHqlQuery( hibernateSession, persistentEntity, criteria) - return proxyHandler.unwrap( hibernateHqlQuery.singleResult() ) + return proxyHandler.unwrap(hibernateHqlQuery.singleResult()) - } ) + }) } @Override @@ -184,7 +185,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override List getAll() { - (List)hibernateTemplate.execute({ Session session -> + (List) hibernateTemplate.execute({ Session session -> CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder() CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(persistentEntity.javaClass) Query criteria = session.createQuery(criteriaQuery) @@ -196,7 +197,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override Integer count() { - (Integer)hibernateTemplate.execute({ Session session -> + (Integer) hibernateTemplate.execute({ Session session -> CriteriaBuilder criteriaBuilder = session.getCriteriaBuilder() CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(persistentEntity.javaClass) criteriaQuery.select(criteriaBuilder.count(criteriaQuery.from(persistentEntity.javaClass))) @@ -240,7 +241,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { CriteriaQuery criteriaQuery = criteriaBuilder.createQuery(persistentEntity.javaClass) Root queryRoot = criteriaQuery.from(persistentEntity.javaClass) def idProp = queryRoot.get(persistentEntity.identity.name) - criteriaQuery = criteriaQuery.where ( + criteriaQuery = criteriaQuery.where( //TODO: Remove explicit type cast once GROOVY-9460 criteriaBuilder.equal((Expression) idProp, id) ) @@ -283,7 +284,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { D find(CharSequence query, Map queryNamedArgs, Map args) { queryNamedArgs = new LinkedHashMap(queryNamedArgs) args = new LinkedHashMap(args) - if(query instanceof GString) { + if (query instanceof GString) { query = buildNamedParameterQueryFromGString((GString) query, queryNamedArgs) } @@ -299,7 +300,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { populateQueryArguments(q, queryNamedArgs) populateQueryArguments(q, args) populateQueryWithNamedArguments(q, queryNamedArgs) - proxyHandler.unwrap( createHqlQuery(session, q).singleResult() ) + proxyHandler.unwrap(createHqlQuery(session, q).singleResult()) } } @@ -307,8 +308,8 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override D find(CharSequence query, Collection params, Map args) { - if(query instanceof GString) { - throw new GrailsQueryException("Unsafe query [$query]. GORM cannot automatically escape a GString value when combined with ordinal parameters, so this query is potentially vulnerable to HQL injection attacks. Please embed the parameters within the GString so they can be safely escaped."); + if (query instanceof GString) { + throw new GrailsQueryException("Unsafe query [$query]. GORM cannot automatically escape a GString value when combined with ordinal parameters, so this query is potentially vulnerable to HQL injection attacks. Please embed the parameters within the GString so they can be safely escaped.") } String queryString = query.toString() @@ -322,14 +323,14 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { params.eachWithIndex { val, int i -> if (val instanceof CharSequence) { - q.setParameter i, val.toString() + q.setParameter(i, val.toString()) } else { - q.setParameter i, val + q.setParameter(i, val) } } populateQueryArguments(q, args) - proxyHandler.unwrap( createHqlQuery(session, q).singleResult() ) + proxyHandler.unwrap(createHqlQuery(session, q).singleResult()) } } @@ -337,7 +338,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { List findAll(CharSequence query, Map params, Map args) { params = new LinkedHashMap(params) args = new LinkedHashMap(args) - if(query instanceof GString) { + if (query instanceof GString) { query = buildNamedParameterQueryFromGString((GString) query, params) } @@ -363,7 +364,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { return (D) template.execute { Session session -> List params = [] - if(sql instanceof GString) { + if (sql instanceof GString) { sql = buildOrdinalParameterQueryFromGString((GString)sql, params) } @@ -374,17 +375,17 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { params.eachWithIndex { val, int i -> i++ if (val instanceof CharSequence) { - q.setParameter i, val.toString() + q.setParameter(i, val.toString()) } else { - q.setParameter i, val + q.setParameter(i, val) } } q.addEntity(persistentClass) populateQueryArguments(q, args) q.setMaxResults(1) def results = createHqlQuery(session, q).list() - if(results.isEmpty()) { + if (results.isEmpty()) { return null } else { @@ -406,7 +407,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { return (List) template.execute { Session session -> List params = [] - if(sql instanceof GString) { + if (sql instanceof GString) { sql = buildOrdinalParameterQueryFromGString((GString)sql, params) } @@ -417,10 +418,10 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { params.eachWithIndex { val, int i -> i++ if (val instanceof CharSequence) { - q.setParameter i, val.toString() + q.setParameter(i, val.toString()) } else { - q.setParameter i, val + q.setParameter(i, val) } } q.addEntity(persistentClass) @@ -431,9 +432,9 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override List findAll(CharSequence query) { - if(query instanceof GString) { + if (query instanceof GString) { Map params = [:] - String hql = buildNamedParameterQueryFromGString((GString)query, params) + String hql = buildNamedParameterQueryFromGString((GString) query, params) return findAll(hql, params, Collections.emptyMap()) } else { @@ -443,9 +444,9 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override List executeQuery(CharSequence query) { - if(query instanceof GString) { + if (query instanceof GString) { Map params = [:] - String hql = buildNamedParameterQueryFromGString((GString)query, params) + String hql = buildNamedParameterQueryFromGString((GString) query, params) return executeQuery(hql, params, Collections.emptyMap()) } else { @@ -455,9 +456,9 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override Integer executeUpdate(CharSequence query) { - if(query instanceof GString) { + if (query instanceof GString) { Map params = [:] - String hql = buildNamedParameterQueryFromGString((GString)query, params) + String hql = buildNamedParameterQueryFromGString((GString) query, params) return executeUpdate(hql, params, Collections.emptyMap()) } else { @@ -467,35 +468,33 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override D find(CharSequence query) { - if(query instanceof GString) { + if (query instanceof GString) { Map params = [:] - String hql = buildNamedParameterQueryFromGString((GString)query, params) + String hql = buildNamedParameterQueryFromGString((GString) query, params) return find(hql, params, Collections.emptyMap()) } else { - return (D)super.find(query) + return (D) super.find(query) } } @Override D find(CharSequence query, Map params) { - if(query instanceof GString) { + if (query instanceof GString) { Map newParams = new LinkedHashMap(params) - String hql = buildNamedParameterQueryFromGString((GString)query, newParams) + String hql = buildNamedParameterQueryFromGString((GString) query, newParams) return find(hql, newParams, newParams) } else { - return (D)super.find(query, params) + return (D) super.find(query, params) } } - - @Override List findAll(CharSequence query, Map params) { - if(query instanceof GString) { + if (query instanceof GString) { Map newParams = new LinkedHashMap(params) - String hql = buildNamedParameterQueryFromGString((GString)query, newParams) + String hql = buildNamedParameterQueryFromGString((GString) query, newParams) return findAll(hql, newParams, newParams) } else { @@ -505,9 +504,9 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override List executeQuery(CharSequence query, Map args) { - if(query instanceof GString) { + if (query instanceof GString) { Map newParams = new LinkedHashMap(args) - String hql = buildNamedParameterQueryFromGString((GString)query, newParams) + String hql = buildNamedParameterQueryFromGString((GString) query, newParams) return executeQuery(hql, newParams, newParams) } else { @@ -517,9 +516,9 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override Integer executeUpdate(CharSequence query, Map args) { - if(query instanceof GString) { + if (query instanceof GString) { Map newParams = new LinkedHashMap(args) - String hql = buildNamedParameterQueryFromGString((GString)query, newParams) + String hql = buildNamedParameterQueryFromGString((GString) query, newParams) return executeUpdate(hql, newParams, newParams) } else { @@ -529,7 +528,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override List findAll(CharSequence query, Collection params, Map args) { - if(query instanceof GString) { + if (query instanceof GString) { throw new GrailsQueryException("Unsafe query [$query]. GORM cannot automatically escape a GString value when combined with ordinal parameters, so this query is potentially vulnerable to HQL injection attacks. Please embed the parameters within the GString so they can be safely escaped.") } @@ -545,10 +544,10 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { params.eachWithIndex { val, int i -> if (val instanceof CharSequence) { - q.setParameter i, val.toString() + q.setParameter(i, val.toString()) } else { - q.setParameter i, val + q.setParameter(i, val) } } populateQueryArguments(q, args) @@ -562,16 +561,16 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { return (D) template.execute { Session session -> Example example = Example.create(exampleObject).ignoreCase() - Criteria crit = session.createCriteria(persistentEntity.javaClass); + Criteria crit = session.createCriteria(persistentEntity.javaClass) hibernateTemplate.applySettings(crit) - crit.add example + crit.add(example) GrailsHibernateQueryUtils.populateArgumentsForCriteria(persistentEntity, crit, args, datastore.mappingContext.conversionService, true) crit.maxResults = 1 firePreQueryEvent(session, crit) List results = crit.list() firePostQueryEvent(session, crit, results) if (results) { - return proxyHandler.unwrap( results.get(0) ) + return proxyHandler.unwrap(results.get(0)) } } } @@ -582,9 +581,9 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { return (List) template.execute { Session session -> Example example = Example.create(exampleObject).ignoreCase() - Criteria crit = session.createCriteria(persistentEntity.javaClass); + Criteria crit = session.createCriteria(persistentEntity.javaClass) hibernateTemplate.applySettings(crit) - crit.add example + crit.add(example) GrailsHibernateQueryUtils.populateArgumentsForCriteria(persistentEntity, crit, args, datastore.mappingContext.conversionService, true) firePreQueryEvent(session, crit) List results = crit.list() @@ -596,16 +595,16 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override List findAllWhere(Map queryMap, Map args) { if (!queryMap) return null - (List)hibernateTemplate.execute { Session session -> + (List) hibernateTemplate.execute { Session session -> Map processedQueryMap = [:] - queryMap.each{ key, value -> processedQueryMap[key.toString()] = value } + queryMap.each { key, value -> processedQueryMap[key.toString()] = value } Map queryArgs = filterQueryArgumentMap(processedQueryMap) List nullNames = removeNullNames(queryArgs) Criteria criteria = session.createCriteria(persistentClass) hibernateTemplate.applySettings(criteria) criteria.add(Restrictions.allEq(queryArgs)) for (name in nullNames) { - criteria.add Restrictions.isNull(name) + criteria.add(Restrictions.isNull(name)) } criteria.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE) @@ -617,14 +616,13 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { } } - @Override List executeQuery(CharSequence query, Map params, Map args) { def template = hibernateTemplate args = new HashMap(args) params = new HashMap(params) - if(query instanceof GString) { + if (query instanceof GString) { query = buildNamedParameterQueryFromGString((GString) query, params) } @@ -642,8 +640,8 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override List executeQuery(CharSequence query, Collection params, Map args) { - if(query instanceof GString) { - throw new GrailsQueryException("Unsafe query [$query]. GORM cannot automatically escape a GString value when combined with ordinal parameters, so this query is potentially vulnerable to HQL injection attacks. Please embed the parameters within the GString so they can be safely escaped."); + if (query instanceof GString) { + throw new GrailsQueryException("Unsafe query [$query]. GORM cannot automatically escape a GString value when combined with ordinal parameters, so this query is potentially vulnerable to HQL injection attacks. Please embed the parameters within the GString so they can be safely escaped.") } def template = hibernateTemplate @@ -655,10 +653,10 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { params.eachWithIndex { val, int i -> if (val instanceof CharSequence) { - q.setParameter i, val.toString() + q.setParameter(i, val.toString()) } else { - q.setParameter i, val + q.setParameter(i, val) } } populateQueryArguments(q, args) @@ -669,16 +667,16 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { @Override D findWhere(Map queryMap, Map args) { if (!queryMap) return null - (D)hibernateTemplate.execute { Session session -> + (D) hibernateTemplate.execute { Session session -> Map processedQueryMap = [:] - queryMap.each{ key, value -> processedQueryMap[key.toString()] = value } + queryMap.each { key, value -> processedQueryMap[key.toString()] = value } Map queryArgs = filterQueryArgumentMap(processedQueryMap) List nullNames = removeNullNames(queryArgs) Criteria criteria = session.createCriteria(persistentClass) hibernateTemplate.applySettings(criteria) criteria.add(Restrictions.allEq(queryArgs)) for (name in nullNames) { - criteria.add Restrictions.isNull(name) + criteria.add(Restrictions.isNull(name)) } criteria.setMaxResults(1) GrailsHibernateQueryUtils.populateArgumentsForCriteria(persistentEntity, criteria, args, datastore.mappingContext.conversionService, true) @@ -693,8 +691,6 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { getAllInternal(ids) } - - List getAll(Long... ids) { getAllInternal(ids as List) } @@ -708,7 +704,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { private List getAllInternal(List ids) { if (!ids) return [] - (List)hibernateTemplate.execute { Session session -> + (List) hibernateTemplate.execute { Session session -> def identityType = persistentEntity.identity.type ids = ids.collect { HibernateRuntimeUtils.convertValueToType((Serializable)it, identityType, conversionService) } def criteria = session.createCriteria(persistentClass) @@ -793,7 +789,7 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { Set allNames = new HashSet<>(query.keySet() as Set) for (String name in allNames) { if (query[name] == null) { - query.remove name + query.remove(name) nullNames << name } } @@ -802,17 +798,17 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { protected Serializable convertIdentifier(Serializable id) { def identity = persistentEntity.identity - if(identity != null) { + if (identity != null) { ConversionService conversionService = persistentEntity.mappingContext.conversionService - if(id != null) { + if (id != null) { Class identityType = identity.type Class idInstanceType = id.getClass() - if(identityType.isAssignableFrom(idInstanceType)) { + if (identityType.isAssignableFrom(idInstanceType)) { return id } - else if(conversionService.canConvert(idInstanceType, identityType)) { + else if (conversionService.canConvert(idInstanceType, identityType)) { try { - return (Serializable)conversionService.convert(id, identityType) + return (Serializable) conversionService.convert(id, identityType) } catch (Throwable e) { // unconvertable id, return null return null @@ -838,18 +834,18 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { String stringKey = key.toString() def value = entry.value - if(value == null) { - q.setParameter stringKey, null + if (value == null) { + q.setParameter(stringKey, null) } else if (value instanceof CharSequence) { - q.setParameter stringKey, value.toString() - } else if (List.class.isAssignableFrom(value.getClass())) { - q.setParameterList stringKey, (List) value - } else if (Set.class.isAssignableFrom(value.getClass())) { - q.setParameterList stringKey, (Set) value + q.setParameter(stringKey, value.toString()) + } else if (List.isAssignableFrom(value.getClass())) { + q.setParameterList(stringKey, (List) value) + } else if (Set.isAssignableFrom(value.getClass())) { + q.setParameterList(stringKey, (Set) value) } else if (value.getClass().isArray()) { - q.setParameterList stringKey, (Object[]) value + q.setParameterList(stringKey, (Object[]) value) } else { - q.setParameter stringKey, value + q.setParameter(stringKey, value) } } } @@ -857,8 +853,8 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { protected Integer intValue(Map args, String key) { def value = args.get(key) - if(value) { - return conversionService.convert(value, Integer.class) + if (value) { + return conversionService.convert(value, Integer) } return null } @@ -881,18 +877,18 @@ abstract class AbstractHibernateGormStaticApi extends GormStaticApi { q.cacheable = ClassUtils.getBooleanFromMap(DynamicFinder.ARGUMENT_CACHE, args) } if (args.containsKey(DynamicFinder.ARGUMENT_FETCH_SIZE)) { - Integer fetchSizeParam = conversionService.convert(args.remove(DynamicFinder.ARGUMENT_FETCH_SIZE), Integer.class); - q.setFetchSize(fetchSizeParam.intValue()); + Integer fetchSizeParam = conversionService.convert(args.remove(DynamicFinder.ARGUMENT_FETCH_SIZE), Integer) + q.setFetchSize(fetchSizeParam.intValue()) } if (args.containsKey(DynamicFinder.ARGUMENT_TIMEOUT)) { - Integer timeoutParam = conversionService.convert(args.remove(DynamicFinder.ARGUMENT_TIMEOUT), Integer.class); - q.setTimeout(timeoutParam.intValue()); + Integer timeoutParam = conversionService.convert(args.remove(DynamicFinder.ARGUMENT_TIMEOUT), Integer) + q.setTimeout(timeoutParam.intValue()) } if (args.containsKey(DynamicFinder.ARGUMENT_READ_ONLY)) { - q.setReadOnly((Boolean)args.remove(DynamicFinder.ARGUMENT_READ_ONLY)); + q.setReadOnly((Boolean) args.remove(DynamicFinder.ARGUMENT_READ_ONLY)) } if (args.containsKey(DynamicFinder.ARGUMENT_FLUSH_MODE)) { - q.setHibernateFlushMode((FlushMode)args.remove(DynamicFinder.ARGUMENT_FLUSH_MODE)); + q.setHibernateFlushMode((FlushMode) args.remove(DynamicFinder.ARGUMENT_FLUSH_MODE)) } args.remove(DynamicFinder.ARGUMENT_CACHE) diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormValidationApi.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormValidationApi.groovy index 685a2ae6900..bf21ffb7c61 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormValidationApi.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/AbstractHibernateGormValidationApi.groovy @@ -19,24 +19,26 @@ package org.grails.orm.hibernate import groovy.transform.CompileStatic -import org.grails.datastore.gorm.validation.CascadingValidator -import org.grails.datastore.mapping.reflect.ClassUtils -import org.grails.datastore.mapping.validation.ValidationErrors -import org.grails.orm.hibernate.support.HibernateRuntimeUtils -import org.grails.datastore.gorm.GormValidationApi -import org.grails.datastore.mapping.engine.event.ValidationEvent + import org.hibernate.Session + import org.springframework.validation.Errors import org.springframework.validation.FieldError import org.springframework.validation.ObjectError import org.springframework.validation.Validator +import org.grails.datastore.gorm.GormValidationApi +import org.grails.datastore.gorm.validation.CascadingValidator +import org.grails.datastore.mapping.engine.event.ValidationEvent +import org.grails.datastore.mapping.reflect.ClassUtils +import org.grails.datastore.mapping.validation.ValidationErrors +import org.grails.orm.hibernate.support.HibernateRuntimeUtils + @CompileStatic abstract class AbstractHibernateGormValidationApi extends GormValidationApi { - public static final String ARGUMENT_DEEP_VALIDATE = "deepValidate"; - private static final String ARGUMENT_EVICT = "evict"; - + public static final String ARGUMENT_DEEP_VALIDATE = 'deepValidate' + private static final String ARGUMENT_EVICT = 'evict' protected ClassLoader classLoader protected AbstractHibernateDatastore datastore @@ -48,24 +50,23 @@ abstract class AbstractHibernateGormValidationApi extends GormValidationApi extends GormValidationApi @@ -84,21 +84,20 @@ abstract class AbstractHibernateGormValidationApi extends GormValidationApi extends GormValidationApi validatedFieldsList) { - ValidationEvent event = new ValidationEvent(datastore, target); - event.setValidatedFields(validatedFieldsList); - datastore.getApplicationEventPublisher().publishEvent(event); + ValidationEvent event = new ValidationEvent(datastore, target) + event.setValidatedFields(validatedFieldsList) + datastore.getApplicationEventPublisher().publishEvent(event) } - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') private Errors filterErrors(Errors errors, Set validatedFields, Object target) { - if (validatedFields == null) return errors; + if (validatedFields == null) return errors - ValidationErrors result = new ValidationErrors(target); + ValidationErrors result = new ValidationErrors(target) - final List allErrors = errors.getAllErrors(); + final List allErrors = errors.getAllErrors() for (Object allError : allErrors) { - ObjectError error = (ObjectError) allError; + ObjectError error = (ObjectError) allError if (error instanceof FieldError) { - FieldError fieldError = (FieldError) error; - if (!validatedFields.contains(fieldError.getField())) continue; + FieldError fieldError = (FieldError) error + if (!validatedFields.contains(fieldError.getField())) continue } - result.addError(error); + result.addError(error) } - return result; + return result } /** @@ -165,6 +164,6 @@ abstract class AbstractHibernateGormValidationApi extends GormValidationApi persist(Iterable objects) { - List identifiers = new ArrayList(); + List identifiers = new ArrayList<>(); for (Object object : objects) { identifiers.add(hibernateTemplate.save(object)); } @@ -151,7 +153,7 @@ public void delete(Iterable objects) { protected Collection getIterableAsCollection(Iterable objects) { Collection list; if (objects instanceof Collection) { - list = (Collection)objects; + list = (Collection) objects; } else { list = new ArrayList(); @@ -202,6 +204,5 @@ public void setSynchronizedWithTransaction(boolean synchronizedWithTransaction) // no-op } - public abstract FlushModeType getFlushMode(); } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/EventListenerIntegrator.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/EventListenerIntegrator.java index 6ce47135104..749a3250b10 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/EventListenerIntegrator.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/EventListenerIntegrator.java @@ -19,7 +19,11 @@ package org.grails.orm.hibernate; import java.io.Serializable; -import java.util.*; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; import org.hibernate.boot.Metadata; import org.hibernate.engine.spi.SessionFactoryImplementor; @@ -76,7 +80,6 @@ public EventListenerIntegrator(HibernateEventListeners hibernateEventListeners, EventType.POST_COLLECTION_REMOVE, EventType.POST_COLLECTION_UPDATE); - @SuppressWarnings({ "unchecked", "rawtypes" }) @Override public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { @@ -88,7 +91,7 @@ public void integrate(Metadata metadata, SessionFactoryImplementor sessionFactor EventType type = EventType.resolveEventTypeByName(entry.getKey()); Object listenerObject = entry.getValue(); if (listenerObject instanceof Collection) { - appendListeners(listenerRegistry, type, (Collection)listenerObject); + appendListeners(listenerRegistry, type, (Collection) listenerObject); } else if (listenerObject != null) { appendListeners(listenerRegistry, type, Collections.singleton(listenerObject)); @@ -97,7 +100,7 @@ else if (listenerObject != null) { } if (hibernateEventListeners != null && hibernateEventListeners.getListenerMap() != null) { - Map listenerMap = hibernateEventListeners.getListenerMap(); + Map listenerMap = hibernateEventListeners.getListenerMap(); for (EventType type : TYPES) { appendListeners(listenerRegistry, type, listenerMap); } @@ -111,7 +114,7 @@ protected void appendListeners(EventListenerRegistry listenerRegistry, EventListenerGroup group = listenerRegistry.getEventListenerGroup(eventType); for (T listener : listeners) { if (listener != null) { - if(shouldOverrideListeners(eventType, listener)) { + if (shouldOverrideListeners(eventType, listener)) { // since ClosureEventTriggeringInterceptor extends DefaultSaveOrUpdateEventListener we want to override instead of append the listener here // to avoid there being 2 implementations which would impact performance too group.clear(); @@ -125,8 +128,8 @@ protected void appendListeners(EventListenerRegistry listenerRegistry, } private boolean shouldOverrideListeners(EventType eventType, Object listener) { - return (listener instanceof org.hibernate.event.internal.DefaultSaveOrUpdateEventListener) - && eventType.equals(EventType.SAVE_UPDATE); + return (listener instanceof org.hibernate.event.internal.DefaultSaveOrUpdateEventListener) && + eventType.equals(EventType.SAVE_UPDATE); } @SuppressWarnings("unchecked") @@ -135,20 +138,18 @@ protected void appendListeners(final EventListenerRegistry listenerRegistry, Object listener = listeners.get(eventType.eventName()); if (listener != null) { - if(shouldOverrideListeners(eventType, listener)) { + if (shouldOverrideListeners(eventType, listener)) { // since ClosureEventTriggeringInterceptor extends DefaultSaveOrUpdateEventListener we want to override instead of append the listener here // to avoid there being 2 implementations which would impact performance too listenerRegistry.setListeners(eventType, (T) listener); } else { - listenerRegistry.appendListeners(eventType, (T)listener); + listenerRegistry.appendListeners(eventType, (T) listener); } } } - - public void disintegrate(SessionFactoryImplementor sessionFactory, SessionFactoryServiceRegistry serviceRegistry) { // nothing to do } -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java index 796bd695ece..84366ff9211 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTemplate.java @@ -18,9 +18,35 @@ */ package org.grails.orm.hibernate; +import java.io.Serializable; +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import javax.sql.DataSource; + import groovy.lang.Closure; import org.codehaus.groovy.runtime.DefaultGroovyMethods; -import org.hibernate.*; + +import jakarta.persistence.PersistenceException; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Root; + +import org.hibernate.Criteria; +import org.hibernate.FlushMode; +import org.hibernate.HibernateException; +import org.hibernate.JDBCException; +import org.hibernate.LockMode; +import org.hibernate.LockOptions; +import org.hibernate.Session; +import org.hibernate.SessionFactory; import org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl; import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider; import org.hibernate.engine.spi.SessionFactoryImplementor; @@ -30,6 +56,7 @@ import org.hibernate.query.Query; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.dao.InvalidDataAccessApiUsageException; @@ -44,22 +71,6 @@ import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.util.Assert; -import jakarta.persistence.PersistenceException; -import jakarta.persistence.criteria.CriteriaBuilder; -import jakarta.persistence.criteria.CriteriaQuery; -import jakarta.persistence.criteria.Root; -import javax.sql.DataSource; -import java.io.Serializable; -import java.lang.reflect.InvocationHandler; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.lang.reflect.Proxy; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.Collection; -import java.util.List; - public class GrailsHibernateTemplate implements IHibernateTemplate { private static final Logger LOG = LoggerFactory.getLogger(GrailsHibernateTemplate.class); @@ -82,14 +93,15 @@ public interface HibernateCallback { protected GrailsHibernateTemplate() { // for testing } + public GrailsHibernateTemplate(SessionFactory sessionFactory) { Assert.notNull(sessionFactory, "Property 'sessionFactory' is required"); this.sessionFactory = sessionFactory; ConnectionProvider connectionProvider = ((SessionFactoryImplementor) sessionFactory).getServiceRegistry().getService(ConnectionProvider.class); - if(connectionProvider instanceof DatasourceConnectionProviderImpl) { + if (connectionProvider instanceof DatasourceConnectionProviderImpl) { this.dataSource = ((DatasourceConnectionProviderImpl) connectionProvider).getDataSource(); - if(dataSource instanceof TransactionAwareDataSourceProxy) { + if (dataSource instanceof TransactionAwareDataSourceProxy) { this.dataSource = ((TransactionAwareDataSourceProxy) dataSource).getTargetDataSource(); } jdbcExceptionTranslator = new SQLErrorCodeSQLExceptionTranslator(dataSource); @@ -108,7 +120,7 @@ public GrailsHibernateTemplate(SessionFactory sessionFactory, HibernateDatastore public GrailsHibernateTemplate(SessionFactory sessionFactory, HibernateDatastore datastore, int defaultFlushMode) { this(sessionFactory); - if(datastore != null) { + if (datastore != null) { cacheQueries = datastore.isCacheQueries(); this.osivReadOnly = datastore.isOsivReadOnly(); this.passReadOnlyToHibernate = datastore.isPassReadOnlyToHibernate(); @@ -116,7 +128,6 @@ public GrailsHibernateTemplate(SessionFactory sessionFactory, HibernateDatastore this.flushMode = defaultFlushMode; } - @Override public T execute(Closure callable) { HibernateCallback hibernateCallback = DefaultGroovyMethods.asType(callable, HibernateCallback.class); @@ -125,15 +136,15 @@ public T execute(Closure callable) { @Override public T executeWithNewSession(final Closure callable) { - SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory); + SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory); SessionHolder previousHolder = sessionHolder; - ConnectionHolder previousConnectionHolder = (ConnectionHolder)TransactionSynchronizationManager.getResource(dataSource); + ConnectionHolder previousConnectionHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); Session newSession = null; boolean previousActiveSynchronization = TransactionSynchronizationManager.isSynchronizationActive(); List transactionSynchronizations = previousActiveSynchronization ? TransactionSynchronizationManager.getSynchronizations() : null; try { // if there are any previous synchronizations active we need to clear them and restore them later (see finally block) - if(previousActiveSynchronization) { + if (previousActiveSynchronization) { TransactionSynchronizationManager.clearSynchronization(); // init a new synchronization to ensure that any opened database connections are closed by the synchronization TransactionSynchronizationManager.initSynchronization(); @@ -142,7 +153,7 @@ public T executeWithNewSession(final Closure callable) { // if there are already bound holders, unbind them so they can be restored later if (sessionHolder != null) { TransactionSynchronizationManager.unbindResource(sessionFactory); - if(previousConnectionHolder != null) { + if (previousConnectionHolder != null) { TransactionSynchronizationManager.unbindResource(dataSource); } } @@ -158,11 +169,11 @@ public T executeWithNewSession(final Closure callable) { finally { try { // if an active synchronization was registered during the life time of the new session clear it - if(TransactionSynchronizationManager.isSynchronizationActive()) { + if (TransactionSynchronizationManager.isSynchronizationActive()) { TransactionSynchronizationManager.clearSynchronization(); } // If there is a synchronization active then leave it to the synchronization to close the session - if(newSession != null) { + if (newSession != null) { SessionFactoryUtils.closeSession(newSession); } @@ -171,20 +182,20 @@ public T executeWithNewSession(final Closure callable) { ConnectionHolder connectionHolder = (ConnectionHolder) TransactionSynchronizationManager.unbindResourceIfPossible(dataSource); // if there is a connection holder and it holds an open connection close it try { - if(connectionHolder != null && !connectionHolder.getConnection().isClosed()) { + if (connectionHolder != null && !connectionHolder.getConnection().isClosed()) { Connection conn = connectionHolder.getConnection(); DataSourceUtils.releaseConnection(conn, dataSource); } } catch (SQLException e) { // ignore, connection closed already? - if(LOG.isDebugEnabled()) { + if (LOG.isDebugEnabled()) { LOG.debug("Could not close opened JDBC connection. Did the application close the connection manually?: " + e.getMessage()); } } } finally { // if there were previously active synchronizations then register those again - if(previousActiveSynchronization) { + if (previousActiveSynchronization) { TransactionSynchronizationManager.initSynchronization(); for (TransactionSynchronization transactionSynchronization : transactionSynchronizations) { TransactionSynchronizationManager.registerSynchronization(transactionSynchronization); @@ -192,9 +203,9 @@ public T executeWithNewSession(final Closure callable) { } // now restore any previous state - if(previousHolder != null) { + if (previousHolder != null) { TransactionSynchronizationManager.bindResource(sessionFactory, previousHolder); - if(previousConnectionHolder != null) { + if (previousConnectionHolder != null) { TransactionSynchronizationManager.bindResource(dataSource, previousConnectionHolder); } } @@ -206,7 +217,7 @@ public T executeWithNewSession(final Closure callable) { @Override public T1 executeWithExistingOrCreateNewSession(SessionFactory sessionFactory, Closure callable) { SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory); - if(sessionHolder == null) { + if (sessionHolder == null) { return executeWithNewSession(callable); } else { @@ -253,8 +264,8 @@ public List executeFind(HibernateCallback action) throws DataAccessExcepti } protected boolean shouldPassReadOnlyToHibernate() { - if((passReadOnlyToHibernate || osivReadOnly) && TransactionSynchronizationManager.hasResource(getSessionFactory())) { - if(TransactionSynchronizationManager.isActualTransactionActive()) { + if ((passReadOnlyToHibernate || osivReadOnly) && TransactionSynchronizationManager.hasResource(getSessionFactory())) { + if (TransactionSynchronizationManager.isActualTransactionActive()) { return passReadOnlyToHibernate && TransactionSynchronizationManager.isCurrentTransactionReadOnly(); } else { return osivReadOnly; @@ -417,7 +428,7 @@ public void evict(final Object entity) throws DataAccessException { public void lock(final Object entity, final LockMode lockMode) throws DataAccessException { doExecute(session -> { - session.buildLockRequest(new LockOptions(lockMode)).lock(entity);//LockMode.PESSIMISTIC_WRITE + session.buildLockRequest(new LockOptions(lockMode)).lock(entity); //LockMode.PESSIMISTIC_WRITE return null; }, true); } @@ -504,7 +515,6 @@ protected void prepareCriteria(Query jpaQuery) { } } - /** * Invocation handler that suppresses close calls on Hibernate Sessions. * Also prepares returned Query and Criteria objects. @@ -654,7 +664,7 @@ public int getFlushMode() { * @see org.hibernate.Session#setFlushMode */ protected FlushMode applyFlushMode(Session session, boolean existingTransaction) { - if(isApplyFlushModeOnlyToNonExistingTransactions() && existingTransaction) { + if (isApplyFlushModeOnlyToNonExistingTransactions() && existingTransaction) { return null; } @@ -762,11 +772,11 @@ protected Collection getIterableAsCollection(Iterable objects) { } return list; } - + public boolean isApplyFlushModeOnlyToNonExistingTransactions() { return applyFlushModeOnlyToNonExistingTransactions; } - + public void setApplyFlushModeOnlyToNonExistingTransactions(boolean applyFlushModeOnlyToNonExistingTransactions) { this.applyFlushModeOnlyToNonExistingTransactions = applyFlushModeOnlyToNonExistingTransactions; } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTransactionManager.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTransactionManager.groovy index 8540f7646b9..cf177896b4b 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTransactionManager.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsHibernateTransactionManager.groovy @@ -18,13 +18,17 @@ */ package org.grails.orm.hibernate +import javax.sql.DataSource + import groovy.transform.CompileStatic import groovy.util.logging.Slf4j + import org.hibernate.FlushMode import org.hibernate.Session import org.hibernate.SessionFactory import org.hibernate.engine.jdbc.spi.JdbcCoordinator import org.hibernate.engine.spi.SessionImplementor + import org.springframework.orm.hibernate5.HibernateTransactionManager import org.springframework.orm.hibernate5.SessionHolder import org.springframework.transaction.TransactionDefinition @@ -32,8 +36,6 @@ import org.springframework.transaction.support.DefaultTransactionStatus import org.springframework.transaction.support.TransactionSynchronizationManager import org.springframework.util.Assert -import javax.sql.DataSource - /** * Extends the standard class to always set the flush mode to manual when in a read-only transaction. * @@ -65,17 +67,17 @@ class GrailsHibernateTransactionManager extends HibernateTransactionManager { @Override protected void doBegin(Object transaction, TransactionDefinition definition) { - super.doBegin transaction, definition + super.doBegin(transaction, definition) if (definition.isReadOnly()) { // transaction is HibernateTransactionManager.HibernateTransactionObject private class instance // always set to manual; the base class doesn't because the OSIV has already registered a session - SessionHolder holder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory) + SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory) holder.session.setHibernateFlushMode(FlushMode.MANUAL) } - else if(defaultFlushMode != FlushMode.AUTO) { - SessionHolder holder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory) + else if (defaultFlushMode != FlushMode.AUTO) { + SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory) holder.session.setHibernateFlushMode(defaultFlushMode) } } @@ -83,10 +85,10 @@ class GrailsHibernateTransactionManager extends HibernateTransactionManager { @Override protected void doRollback(DefaultTransactionStatus status) { super.doRollback(status) - if(isJdbcBatchVersionedData) { + if (isJdbcBatchVersionedData) { try { - SessionHolder holder = (SessionHolder)TransactionSynchronizationManager.getResource(sessionFactory) - if(holder != null) { + SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory) + if (holder != null) { Session session = holder.getSession() JdbcCoordinator jdbcCoordinator = ((SessionImplementor) session).getJdbcCoordinator() jdbcCoordinator.abortBatch() @@ -99,7 +101,7 @@ class GrailsHibernateTransactionManager extends HibernateTransactionManager { @Override void setSessionFactory(SessionFactory sessionFactory) { - Assert.notNull(sessionFactory, "SessionFactory cannot be null") + Assert.notNull(sessionFactory, 'SessionFactory cannot be null') super.setSessionFactory(sessionFactory) this.isJdbcBatchVersionedData = sessionFactory.getSessionFactoryOptions().isJdbcBatchVersionedData() } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsSessionContext.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsSessionContext.java index 156442ace38..648d8a43328 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsSessionContext.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/GrailsSessionContext.java @@ -18,6 +18,10 @@ */ package org.grails.orm.hibernate; +import jakarta.transaction.Status; +import jakarta.transaction.Transaction; +import jakarta.transaction.TransactionManager; + import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.Session; @@ -28,6 +32,7 @@ import org.hibernate.service.spi.ServiceBinding; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.orm.hibernate5.SessionHolder; import org.springframework.orm.hibernate5.SpringFlushSynchronization; @@ -37,10 +42,6 @@ import org.springframework.transaction.support.TransactionSynchronization; import org.springframework.transaction.support.TransactionSynchronizationManager; -import jakarta.transaction.Status; -import jakarta.transaction.Transaction; -import jakarta.transaction.TransactionManager; - /** * Based on org.springframework.orm.hibernate4.SpringSessionContext. * @@ -125,37 +126,38 @@ private Session createSession(Object resource) { // Use same Session for further Hibernate actions within the transaction. // Thread object will get removed by synchronization at transaction completion. if (TransactionSynchronizationManager.isSynchronizationActive()) { - // We're within a Spring-managed transaction, possibly from JtaTransactionManager. - LOG.debug("Registering Spring transaction synchronization for new Hibernate Session"); - SessionHolder holderToUse = sessionHolder; - if (holderToUse == null) { - holderToUse = new SessionHolder(session); - } - else { - // it's up to the caller to manage concurrent sessions - // holderToUse.addSession(session); - } - if (TransactionSynchronizationManager.isCurrentTransactionReadOnly()) { - session.setHibernateFlushMode(FlushMode.MANUAL); - } - TransactionSynchronizationManager.registerSynchronization(createSpringSessionSynchronization(holderToUse)); - holderToUse.setSynchronizedWithTransaction(true); - if (holderToUse != sessionHolder) { - TransactionSynchronizationManager.bindResource(sessionFactory, holderToUse); - } + // We're within a Spring-managed transaction, possibly from JtaTransactionManager. + LOG.debug("Registering Spring transaction synchronization for new Hibernate Session"); + SessionHolder holderToUse = sessionHolder; + if (holderToUse == null) { + holderToUse = new SessionHolder(session); + } + else { + // it's up to the caller to manage concurrent sessions + // holderToUse.addSession(session); + } + if (TransactionSynchronizationManager.isCurrentTransactionReadOnly()) { + session.setHibernateFlushMode(FlushMode.MANUAL); + } + TransactionSynchronizationManager.registerSynchronization(createSpringSessionSynchronization(holderToUse)); + holderToUse.setSynchronizedWithTransaction(true); + if (holderToUse != sessionHolder) { + TransactionSynchronizationManager.bindResource(sessionFactory, holderToUse); + } } else { - // No Spring transaction management active -> try JTA transaction synchronization. - registerJtaSynchronization(session, sessionHolder); + // No Spring transaction management active -> try JTA transaction synchronization. + registerJtaSynchronization(session, sessionHolder); } -/* // Check whether we are allowed to return the Session. + /* + // Check whether we are allowed to return the Session. if (!allowCreate && !isSessionTransactional(session, sessionFactory)) { closeSession(session); throw new IllegalStateException("No Hibernate Session bound to thread, " + "and configuration does not allow creation of non-transactional one here"); } -*/ + */ return session; } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java index c22560276b7..7eb3e337a08 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateDatastore.java @@ -18,6 +18,42 @@ */ package org.grails.orm.hibernate; +import java.io.IOException; +import java.io.Serializable; +import java.sql.Connection; +import java.sql.SQLException; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.Callable; + +import javax.sql.DataSource; + +import org.hibernate.SessionFactory; +import org.hibernate.boot.Metadata; +import org.hibernate.boot.SchemaAutoTooling; +import org.hibernate.cfg.Environment; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.integrator.spi.Integrator; +import org.hibernate.integrator.spi.IntegratorService; +import org.hibernate.service.ServiceRegistry; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.BeansException; +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.context.MessageSource; +import org.springframework.context.MessageSourceAware; +import org.springframework.context.support.StaticMessageSource; +import org.springframework.core.env.PropertyResolver; +import org.springframework.jdbc.datasource.ConnectionHolder; +import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; +import org.springframework.transaction.support.TransactionSynchronizationManager; + import grails.gorm.MultiTenant; import org.grails.datastore.gorm.events.AutoTimestampEventListener; import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher; @@ -36,7 +72,11 @@ import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.DatastoreUtils; import org.grails.datastore.mapping.core.Session; -import org.grails.datastore.mapping.core.connections.*; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSources; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer; +import org.grails.datastore.mapping.core.connections.DefaultConnectionSource; +import org.grails.datastore.mapping.core.connections.SingletonConnectionSources; import org.grails.datastore.mapping.core.exceptions.ConfigurationException; import org.grails.datastore.mapping.engine.event.DatastoreInitializedEvent; import org.grails.datastore.mapping.model.DatastoreConfigurationException; @@ -54,31 +94,6 @@ import org.grails.orm.hibernate.event.listener.HibernateEventListener; import org.grails.orm.hibernate.multitenancy.MultiTenantEventListener; import org.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor; -import org.hibernate.SessionFactory; -import org.hibernate.boot.Metadata; -import org.hibernate.boot.SchemaAutoTooling; -import org.hibernate.cfg.Environment; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.integrator.spi.Integrator; -import org.hibernate.integrator.spi.IntegratorService; -import org.hibernate.service.ServiceRegistry; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.BeansException; -import org.springframework.context.*; -import org.springframework.context.support.StaticMessageSource; -import org.springframework.core.env.PropertyResolver; -import org.springframework.jdbc.datasource.ConnectionHolder; -import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import javax.sql.DataSource; -import java.io.IOException; -import java.io.Serializable; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.*; -import java.util.concurrent.Callable; /** * Datastore implementation that uses a Hibernate SessionFactory underneath. @@ -132,9 +147,7 @@ public void persistentEntityAdded(PersistentEntity entity) { }); initializeConverters(this.mappingContext); - - - if(!(connectionSources instanceof SingletonConnectionSources)) { + if (!(connectionSources instanceof SingletonConnectionSources)) { final HibernateDatastore parent = this; Iterable> allConnectionSources = connectionSources.getAllConnectionSources(); @@ -158,8 +171,8 @@ public void persistentEntityAdded(PersistentEntity entity) { registerAllEntitiesWithEnhancer(); }); - if(multiTenantMode == MultiTenancySettings.MultiTenancyMode.SCHEMA) { - if(this.tenantResolver instanceof AllTenantsResolver) { + if (multiTenantMode == MultiTenancySettings.MultiTenancyMode.SCHEMA) { + if (this.tenantResolver instanceof AllTenantsResolver) { AllTenantsResolver allTenantsResolver = (AllTenantsResolver) tenantResolver; Iterable tenantIds = allTenantsResolver.resolveTenantIds(); @@ -176,7 +189,6 @@ public void persistentEntityAdded(PersistentEntity entity) { } } - this.gormEnhancer = initialize(); } @@ -233,7 +245,7 @@ public HibernateDatastore(PropertyResolver configuration, HibernateConnectionSou * @param eventPublisher The {@link ConfigurableApplicationEventPublisher} instance * @param classes The persistent classes */ - public HibernateDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class...classes) { + public HibernateDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { this(configuration, new HibernateConnectionSourceFactory(classes), eventPublisher); } @@ -244,7 +256,7 @@ public HibernateDatastore(PropertyResolver configuration, ConfigurableApplicatio * @param eventPublisher The {@link ConfigurableApplicationEventPublisher} instance * @param classes The persistent classes */ - public HibernateDatastore(DataSource dataSource, PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class...classes) { + public HibernateDatastore(DataSource dataSource, PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { this(configuration, createConnectionFactoryForDataSource(dataSource, classes), eventPublisher); } @@ -255,7 +267,7 @@ public HibernateDatastore(DataSource dataSource, PropertyResolver configuration, * @param eventPublisher The event publisher * @param packagesToScan The packages to scan */ - public HibernateDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Package...packagesToScan) { + public HibernateDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Package... packagesToScan) { this(configuration, eventPublisher, new ClasspathEntityScanner().scan(packagesToScan)); } @@ -266,7 +278,7 @@ public HibernateDatastore(PropertyResolver configuration, ConfigurableApplicatio * @param eventPublisher The event publisher * @param packagesToScan The packages to scan */ - public HibernateDatastore(DataSource dataSource, PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Package...packagesToScan) { + public HibernateDatastore(DataSource dataSource, PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Package... packagesToScan) { this(dataSource, configuration, eventPublisher, new ClasspathEntityScanner().scan(packagesToScan)); } @@ -276,16 +288,17 @@ public HibernateDatastore(DataSource dataSource, PropertyResolver configuration, * @param configuration The configuration * @param classes The persistent classes */ - public HibernateDatastore(PropertyResolver configuration, Class...classes) { + public HibernateDatastore(PropertyResolver configuration, Class... classes) { this(configuration, new HibernateConnectionSourceFactory(classes)); } + /** * Construct a Hibernate datastore scanning the given packages * * @param configuration The configuration * @param packagesToScan The packages to scan */ - public HibernateDatastore(PropertyResolver configuration, Package...packagesToScan) { + public HibernateDatastore(PropertyResolver configuration, Package... packagesToScan) { this(configuration, new ClasspathEntityScanner().scan(packagesToScan)); } @@ -294,16 +307,17 @@ public HibernateDatastore(PropertyResolver configuration, Package...packagesToSc * * @param classes The classes */ - public HibernateDatastore(Map configuration, Class...classes) { + public HibernateDatastore(Map configuration, Class... classes) { this(DatastoreUtils.createPropertyResolver(configuration), new HibernateConnectionSourceFactory(classes)); } + /** * Construct a Hibernate datastore scanning the given packages * * @param configuration The configuration * @param packagesToScan The packages to scan */ - public HibernateDatastore(Map configuration, Package...packagesToScan) { + public HibernateDatastore(Map configuration, Package... packagesToScan) { this(DatastoreUtils.createPropertyResolver(configuration), packagesToScan); } @@ -312,7 +326,7 @@ public HibernateDatastore(Map configuration, Package...packagesTo * * @param classes The classes */ - public HibernateDatastore(Class...classes) { + public HibernateDatastore(Class... classes) { this(DatastoreUtils.createPropertyResolver(Collections.singletonMap(Settings.SETTING_DB_CREATE, "create-drop")), new HibernateConnectionSourceFactory(classes)); } @@ -321,7 +335,7 @@ public HibernateDatastore(Class...classes) { * * @param packagesToScan The packages to scan */ - public HibernateDatastore(Package...packagesToScan) { + public HibernateDatastore(Package... packagesToScan) { this(new ClasspathEntityScanner().scan(packagesToScan)); } @@ -346,7 +360,6 @@ public GrailsHibernateTransactionManager getTransactionManager() { return transactionManager; } - /** * Obtain a child {@link HibernateDatastore} by connection name * @@ -355,12 +368,12 @@ public GrailsHibernateTransactionManager getTransactionManager() { * @return The {@link HibernateDatastore} */ public HibernateDatastore getDatastoreForConnection(String connectionName) { - if(connectionName.equals(Settings.SETTING_DATASOURCE) || connectionName.equals(ConnectionSource.DEFAULT)) { + if (connectionName.equals(Settings.SETTING_DATASOURCE) || connectionName.equals(ConnectionSource.DEFAULT)) { return this; } else { HibernateDatastore hibernateDatastore = this.datastoresByConnectionSource.get(connectionName); - if(hibernateDatastore == null) { - throw new ConfigurationException("DataSource not found for name ["+connectionName+"] in configuration. Please check your multiple data sources configuration and try again."); + if (hibernateDatastore == null) { + throw new ConfigurationException("DataSource not found for name [" + connectionName + "] in configuration. Please check your multiple data sources configuration and try again."); } return hibernateDatastore; } @@ -386,7 +399,7 @@ public void setMessageSource(MessageSource messageSource) { protected void registerEventListeners(ConfigurableApplicationEventPublisher eventPublisher) { eventPublisher.addApplicationListener(autoTimestampEventListener); - if(multiTenantMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { + if (multiTenantMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { eventPublisher.addApplicationListener(new MultiTenantEventListener()); } eventPublisher.addApplicationListener(eventTriggeringInterceptor); @@ -399,8 +412,8 @@ protected void configureValidatorRegistry(HibernateConnectionSourceSettings sett } protected void configureValidatorRegistry(HibernateConnectionSourceSettings settings, HibernateMappingContext mappingContext, ValidatorRegistry validatorRegistry, MessageSource messageSource) { - if(validatorRegistry instanceof ConstraintRegistry) { - ((ConstraintRegistry)validatorRegistry).addConstraintFactory( + if (validatorRegistry instanceof ConstraintRegistry) { + ((ConstraintRegistry) validatorRegistry).addConstraintFactory( new MappingContextAwareConstraintFactory(UniqueConstraint.class, messageSource, mappingContext) ); } @@ -411,15 +424,15 @@ protected void configureValidatorRegistry(HibernateConnectionSourceSettings sett protected HibernateGormEnhancer initialize() { final HibernateConnectionSource defaultConnectionSource = (HibernateConnectionSource) getConnectionSources().getDefaultConnectionSource(); - if(multiTenantMode == MultiTenancySettings.MultiTenancyMode.SCHEMA) { + if (multiTenantMode == MultiTenancySettings.MultiTenancyMode.SCHEMA) { return new HibernateGormEnhancer(this, transactionManager, defaultConnectionSource.getSettings()) { @Override public List allQualifiers(Datastore datastore, PersistentEntity entity) { List allQualifiers = super.allQualifiers(datastore, entity); - if( MultiTenant.class.isAssignableFrom(entity.getJavaClass()) ) { - if(tenantResolver instanceof AllTenantsResolver) { + if (MultiTenant.class.isAssignableFrom(entity.getJavaClass())) { + if (tenantResolver instanceof AllTenantsResolver) { Iterable tenantIds = ((AllTenantsResolver) tenantResolver).resolveTenantIds(); - for(Serializable id : tenantIds) { + for (Serializable id : tenantIds) { allQualifiers.add(id.toString()); } } @@ -427,9 +440,9 @@ public List allQualifiers(Datastore datastore, PersistentEntity entity) Collection schemaNames = schemaHandler.resolveSchemaNames(defaultConnectionSource.getDataSource()); for (String schemaName : schemaNames) { // skip common internal schemas - if(schemaName.equals("INFORMATION_SCHEMA") || schemaName.equals("PUBLIC")) continue; + if (schemaName.equals("INFORMATION_SCHEMA") || schemaName.equals("PUBLIC")) continue; for (String connectionName : datastoresByConnectionSource.keySet()) { - if(schemaName.equalsIgnoreCase(connectionName)) { + if (schemaName.equalsIgnoreCase(connectionName)) { allQualifiers.add(connectionName); } } @@ -457,11 +470,11 @@ protected Session createSession(PropertyResolver connectionDetails) { } public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if(applicationContext instanceof ConfigurableApplicationContext) { + if (applicationContext instanceof ConfigurableApplicationContext) { super.setApplicationContext(applicationContext); for (HibernateDatastore hibernateDatastore : datastoresByConnectionSource.values()) { - if(hibernateDatastore != this) { + if (hibernateDatastore != this) { hibernateDatastore.setApplicationContext(applicationContext); } } @@ -480,7 +493,7 @@ public void setApplicationContext(ApplicationContext applicationContext) throws ); registerEventListeners(eventPublisher); - this.eventPublisher.publishEvent( new DatastoreInitializedEvent(this) ); + this.eventPublisher.publishEvent(new DatastoreInitializedEvent(this)); } } @@ -545,15 +558,15 @@ public void addTenantForSchema(String schemaName) { registerAllEntitiesWithEnhancer(); HibernateConnectionSource defaultConnectionSource = (HibernateConnectionSource) connectionSources.getDefaultConnectionSource(); DataSource dataSource = defaultConnectionSource.getDataSource(); - if(dataSource instanceof TransactionAwareDataSourceProxy) { + if (dataSource instanceof TransactionAwareDataSourceProxy) { dataSource = ((TransactionAwareDataSourceProxy) dataSource).getTargetDataSource(); } Object existing = TransactionSynchronizationManager.getResource(dataSource); - if(existing instanceof ConnectionHolder) { + if (existing instanceof ConnectionHolder) { ConnectionHolder connectionHolder = (ConnectionHolder) existing; Connection connection = connectionHolder.getConnection(); try { - if(!connection.isClosed() && !connection.isReadOnly()) { + if (!connection.isClosed() && !connection.isReadOnly()) { schemaHandler.useDefaultSchema(connection); } } catch (SQLException e) { @@ -574,14 +587,14 @@ protected void registerAllEntitiesWithEnhancer() { } private void addTenantForSchemaInternal(final String schemaName) { - if( multiTenantMode != MultiTenancySettings.MultiTenancyMode.SCHEMA ) { + if (multiTenantMode != MultiTenancySettings.MultiTenancyMode.SCHEMA) { throw new ConfigurationException("The method [addTenantForSchema] can only be called with multi-tenancy mode SCHEMA. Current mode is: " + multiTenantMode); } HibernateConnectionSourceFactory factory = (HibernateConnectionSourceFactory) connectionSources.getFactory(); HibernateConnectionSource defaultConnectionSource = (HibernateConnectionSource) connectionSources.getDefaultConnectionSource(); HibernateConnectionSourceSettings tenantSettings; try { - tenantSettings = (HibernateConnectionSourceSettings)connectionSources.getDefaultConnectionSource().getSettings().clone(); + tenantSettings = (HibernateConnectionSourceSettings) connectionSources.getDefaultConnectionSource().getSettings().clone(); } catch (CloneNotSupportedException e) { throw new ConfigurationException("Couldn't clone default Hibernate settings! " + e.getMessage(), e); } @@ -589,8 +602,8 @@ private void addTenantForSchemaInternal(final String schemaName) { String dbCreate = tenantSettings.getDataSource().getDbCreate(); - SchemaAutoTooling schemaAutoTooling = dbCreate != null ? SchemaAutoTooling.interpret(dbCreate) : null; - if(schemaAutoTooling != null && schemaAutoTooling != SchemaAutoTooling.VALIDATE && schemaAutoTooling != SchemaAutoTooling.NONE) { + SchemaAutoTooling schemaAutoTooling = dbCreate != null ? SchemaAutoTooling.interpret(dbCreate) : null; + if (schemaAutoTooling != null && schemaAutoTooling != SchemaAutoTooling.VALIDATE && schemaAutoTooling != SchemaAutoTooling.NONE) { Connection connection = null; try { @@ -606,7 +619,7 @@ private void addTenantForSchemaInternal(final String schemaName) { throw new DatastoreConfigurationException(String.format("Failed to create schema for name [%s]", schemaName)); } finally { - if(connection != null) { + if (connection != null) { try { schemaHandler.useDefaultSchema(connection); connection.close(); @@ -663,7 +676,7 @@ private static HibernateConnectionSourceFactory createConnectionFactoryForDataSo new DataSourceConnectionSourceFactory() { @Override public ConnectionSource create(String name, DataSourceSettings settings) { - if(ConnectionSource.DEFAULT.equals(name)) { + if (ConnectionSource.DEFAULT.equals(name)) { return new DataSourceConnectionSource(ConnectionSource.DEFAULT, dataSource, settings); } else { diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormEnhancer.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormEnhancer.groovy index 2b2cf7b6530..9a47fb8c419 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormEnhancer.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormEnhancer.groovy @@ -19,13 +19,16 @@ package org.grails.orm.hibernate import groovy.transform.CompileStatic + +import org.springframework.transaction.PlatformTransactionManager + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.GormInstanceApi import org.grails.datastore.gorm.GormStaticApi import org.grails.datastore.gorm.GormValidationApi import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings -import org.springframework.transaction.PlatformTransactionManager + /** * Extended GORM Enhancer that fills out the remaining GORM for Hibernate methods * and implements string-based query support via HQL. diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy index ff07d05b937..34385e2de57 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormInstanceApi.groovy @@ -20,12 +20,14 @@ package org.grails.orm.hibernate import groovy.transform.CompileDynamic import groovy.transform.CompileStatic -import org.grails.orm.hibernate.cfg.GrailsHibernateUtil + import org.hibernate.engine.spi.EntityEntry import org.hibernate.engine.spi.SessionImplementor import org.hibernate.persister.entity.EntityPersister import org.hibernate.tuple.NonIdentifierAttribute +import org.grails.orm.hibernate.cfg.GrailsHibernateUtil + /** * The implementation of the GORM instance API contract for Hibernate. * @@ -40,7 +42,7 @@ class HibernateGormInstanceApi extends AbstractHibernateGormInstanceApi { HibernateGormInstanceApi(Class persistentClass, HibernateDatastore datastore, ClassLoader classLoader) { super(persistentClass, datastore, classLoader, null) hibernateTemplate = new GrailsHibernateTemplate(sessionFactory, datastore) - instanceApiHelper = new InstanceApiHelper((GrailsHibernateTemplate)hibernateTemplate) + instanceApiHelper = new InstanceApiHelper((GrailsHibernateTemplate) hibernateTemplate) } /** @@ -54,7 +56,7 @@ class HibernateGormInstanceApi extends AbstractHibernateGormInstanceApi { @CompileDynamic boolean isDirty(D instance, String fieldName) { - SessionImplementor session = (SessionImplementor)sessionFactory.currentSession + SessionImplementor session = (SessionImplementor) sessionFactory.currentSession def entry = findEntityEntry(instance, session) if (!entry || !entry.loadedState) { return false @@ -63,7 +65,7 @@ class HibernateGormInstanceApi extends AbstractHibernateGormInstanceApi { EntityPersister persister = entry.persister Object[] values = persister.getPropertyValues(instance) def dirtyProperties = findDirty(persister, values, entry, instance, session) - if(dirtyProperties == null) { + if (dirtyProperties == null) { return false } else { @@ -85,7 +87,7 @@ class HibernateGormInstanceApi extends AbstractHibernateGormInstanceApi { */ @CompileDynamic boolean isDirty(D instance) { - SessionImplementor session = (SessionImplementor)sessionFactory.currentSession + SessionImplementor session = (SessionImplementor) sessionFactory.currentSession def entry = findEntityEntry(instance, session) if (!entry || !entry.loadedState) { return false @@ -105,7 +107,7 @@ class HibernateGormInstanceApi extends AbstractHibernateGormInstanceApi { @CompileDynamic List getDirtyPropertyNames(D instance) { - SessionImplementor session = (SessionImplementor)sessionFactory.currentSession + SessionImplementor session = (SessionImplementor) sessionFactory.currentSession def entry = findEntityEntry(instance, session) if (!entry || !entry.loadedState) { return [] @@ -117,7 +119,7 @@ class HibernateGormInstanceApi extends AbstractHibernateGormInstanceApi { List names = [] def entityProperties = persister.getEntityMetamodel().getProperties() for (index in dirtyPropertyIndexes) { - names.add entityProperties[index].name + names.add(entityProperties[index].name) } return names } @@ -129,7 +131,7 @@ class HibernateGormInstanceApi extends AbstractHibernateGormInstanceApi { * @return The original persisted value */ Object getPersistentValue(D instance, String fieldName) { - SessionImplementor session = (SessionImplementor)sessionFactory.currentSession + SessionImplementor session = (SessionImplementor) sessionFactory.currentSession def entry = findEntityEntry(instance, session, false) if (!entry || !entry.loadedState) { return null @@ -142,7 +144,6 @@ class HibernateGormInstanceApi extends AbstractHibernateGormInstanceApi { return fieldIndex == -1 ? null : entry.loadedState[fieldIndex] } - protected EntityEntry findEntityEntry(D instance, SessionImplementor session, boolean forDirtyCheck = true) { def entry = session.persistenceContext.getEntry(instance) if (!entry) { diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy index c35e7e5e7d1..28a7c3bfa89 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormStaticApi.groovy @@ -18,9 +18,27 @@ */ package org.grails.orm.hibernate -import grails.orm.HibernateCriteriaBuilder import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + +import jakarta.persistence.FlushModeType +import jakarta.persistence.criteria.CriteriaBuilder +import jakarta.persistence.criteria.CriteriaQuery +import jakarta.persistence.criteria.Root + +import org.hibernate.Criteria +import org.hibernate.FlushMode +import org.hibernate.LockMode +import org.hibernate.Session +import org.hibernate.SessionFactory +import org.hibernate.query.Query + +import org.springframework.core.convert.ConversionService +import org.springframework.orm.hibernate5.SessionHolder +import org.springframework.transaction.PlatformTransactionManager +import org.springframework.transaction.support.TransactionSynchronizationManager + +import grails.orm.HibernateCriteriaBuilder import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.finders.DynamicFinder import org.grails.datastore.gorm.finders.FinderMethod @@ -30,19 +48,8 @@ import org.grails.datastore.mapping.query.event.PreQueryEvent import org.grails.orm.hibernate.exceptions.GrailsQueryException import org.grails.orm.hibernate.query.GrailsHibernateQueryUtils import org.grails.orm.hibernate.query.HibernateHqlQuery -import org.grails.orm.hibernate.query.PagedResultList import org.grails.orm.hibernate.query.HibernateQuery -import org.hibernate.* -import org.hibernate.query.Query -import org.springframework.core.convert.ConversionService -import org.springframework.orm.hibernate5.SessionHolder -import org.springframework.transaction.PlatformTransactionManager -import org.springframework.transaction.support.TransactionSynchronizationManager - -import jakarta.persistence.FlushModeType -import jakarta.persistence.criteria.CriteriaBuilder -import jakarta.persistence.criteria.CriteriaQuery -import jakarta.persistence.criteria.Root +import org.grails.orm.hibernate.query.PagedResultList /** * The implementation of the GORM static method contract for Hibernate @@ -52,6 +59,7 @@ import jakarta.persistence.criteria.Root */ @CompileStatic class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { + protected SessionFactory sessionFactory protected ConversionService conversionService protected Class identityType @@ -73,7 +81,7 @@ class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { @Override GrailsHibernateTemplate getHibernateTemplate() { - return (GrailsHibernateTemplate)super.getHibernateTemplate() + return (GrailsHibernateTemplate) super.getHibernateTemplate() } @Override @@ -102,14 +110,14 @@ class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { ) HibernateHqlQuery hibernateQuery = new HibernateHqlQuery( - new HibernateSession((HibernateDatastore)datastore, sessionFactory), + new HibernateSession((HibernateDatastore) datastore, sessionFactory), persistentEntity, query ) hibernateTemplate.applySettings(query) params = params ? new HashMap(params) : Collections.emptyMap() - if(params.containsKey(DynamicFinder.ARGUMENT_MAX)) { + if (params.containsKey(DynamicFinder.ARGUMENT_MAX)) { return new PagedResultList( hibernateTemplate, persistentEntity, @@ -130,24 +138,23 @@ class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { return GormEnhancer.findStaticApi(persistentClass, name) } - @Override GrailsCriteria createCriteria() { def builder = new HibernateCriteriaBuilder(persistentClass, sessionFactory) - builder.datastore = (AbstractHibernateDatastore)datastore + builder.datastore = (AbstractHibernateDatastore) datastore builder.conversionService = conversionService return builder } @Override D lock(Serializable id) { - (D)hibernateTemplate.lock((Class)persistentClass, convertIdentifier(id), LockMode.PESSIMISTIC_WRITE) + (D) hibernateTemplate.lock((Class)persistentClass, convertIdentifier(id), LockMode.PESSIMISTIC_WRITE) } @Override Integer executeUpdate(CharSequence query, Map params, Map args) { - if(query instanceof GString) { + if (query instanceof GString) { params = new LinkedHashMap(params) query = buildNamedParameterQueryFromGString((GString) query, params) } @@ -157,7 +164,7 @@ class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { return (Integer) template.execute { Session session -> Query q = (Query) session.createQuery(query.toString()) template.applySettings(q) - def sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource( sessionFactory ) + def sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory) if (sessionHolder && sessionHolder.hasTimeout()) { q.timeout = sessionHolder.timeToLiveInSeconds } @@ -174,8 +181,8 @@ class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { @Override Integer executeUpdate(CharSequence query, Collection params, Map args) { - if(query instanceof GString) { - throw new GrailsQueryException("Unsafe query [$query]. GORM cannot automatically escape a GString value when combined with ordinal parameters, so this query is potentially vulnerable to HQL injection attacks. Please embed the parameters within the GString so they can be safely escaped."); + if (query instanceof GString) { + throw new GrailsQueryException("Unsafe query [$query]. GORM cannot automatically escape a GString value when combined with ordinal parameters, so this query is potentially vulnerable to HQL injection attacks. Please embed the parameters within the GString so they can be safely escaped.") } def template = hibernateTemplate @@ -184,18 +191,17 @@ class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { return (Integer) template.execute { Session session -> Query q = (Query) session.createQuery(query.toString()) template.applySettings(q) - def sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource( sessionFactory ) + def sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory) if (sessionHolder && sessionHolder.hasTimeout()) { q.timeout = sessionHolder.timeToLiveInSeconds } - params.eachWithIndex { val, int i -> if (val instanceof CharSequence) { - q.setParameter i, val.toString() + q.setParameter(i, val.toString()) } else { - q.setParameter i, val + q.setParameter(i, val) } } populateQueryArguments(q, args) @@ -206,7 +212,7 @@ class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { } protected T withQueryEvents(Query query, Closure callable) { - HibernateDatastore hibernateDatastore = (HibernateDatastore)datastore + HibernateDatastore hibernateDatastore = (HibernateDatastore) datastore def eventPublisher = hibernateDatastore.applicationEventPublisher @@ -221,17 +227,17 @@ class HibernateGormStaticApi extends AbstractHibernateGormStaticApi { @Override protected void firePostQueryEvent(Session session, Criteria criteria, Object result) { - if(result instanceof List) { - datastore.applicationEventPublisher.publishEvent( new PostQueryEvent(datastore, new HibernateQuery(criteria, persistentEntity), (List)result)) + if (result instanceof List) { + datastore.applicationEventPublisher.publishEvent(new PostQueryEvent(datastore, new HibernateQuery(criteria, persistentEntity), (List) result)) } else { - datastore.applicationEventPublisher.publishEvent( new PostQueryEvent(datastore, new HibernateQuery(criteria, persistentEntity), Collections.singletonList(result))) + datastore.applicationEventPublisher.publishEvent(new PostQueryEvent(datastore, new HibernateQuery(criteria, persistentEntity), Collections.singletonList(result))) } } @Override protected void firePreQueryEvent(Session session, Criteria criteria) { - datastore.applicationEventPublisher.publishEvent( new PreQueryEvent(datastore, new HibernateQuery(criteria, persistentEntity))) + datastore.applicationEventPublisher.publishEvent(new PreQueryEvent(datastore, new HibernateQuery(criteria, persistentEntity))) } @Override diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormValidationApi.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormValidationApi.groovy index 34ed12f59fa..61db55a4551 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormValidationApi.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateGormValidationApi.groovy @@ -19,6 +19,7 @@ package org.grails.orm.hibernate import groovy.transform.CompileStatic + import org.hibernate.FlushMode import org.hibernate.Session @@ -32,8 +33,8 @@ class HibernateGormValidationApi extends AbstractHibernateGormValidationApi configClass) { this.configClass = configClass; } + /** * Set the DataSource to be used by the SessionFactory. * If set, this will override corresponding settings in Hibernate properties. @@ -141,6 +144,7 @@ public void setConfigClass(Class public void setDataSource(DataSource dataSource) { this.dataSource = dataSource; } + public DataSource getDataSource() { return dataSource; } @@ -166,6 +170,7 @@ public void setConfigLocation(Resource configLocation) { public void setConfigLocations(Resource[] configLocations) { this.configLocations = configLocations; } + public Resource[] getConfigLocations() { return configLocations; } @@ -183,6 +188,7 @@ public Resource[] getConfigLocations() { public void setMappingResources(String[] mappingResources) { this.mappingResources = mappingResources; } + public String[] getMappingResources() { return mappingResources; } @@ -199,6 +205,7 @@ public String[] getMappingResources() { public void setMappingLocations(Resource[] mappingLocations) { this.mappingLocations = mappingLocations; } + public Resource[] getMappingLocations() { return mappingLocations; } @@ -215,6 +222,7 @@ public Resource[] getMappingLocations() { public void setCacheableMappingLocations(Resource[] cacheableMappingLocations) { this.cacheableMappingLocations = cacheableMappingLocations; } + public Resource[] getCacheableMappingLocations() { return cacheableMappingLocations; } @@ -229,6 +237,7 @@ public Resource[] getCacheableMappingLocations() { public void setMappingJarLocations(Resource[] mappingJarLocations) { this.mappingJarLocations = mappingJarLocations; } + public Resource[] getMappingJarLocations() { return mappingJarLocations; } @@ -243,6 +252,7 @@ public Resource[] getMappingJarLocations() { public void setMappingDirectoryLocations(Resource[] mappingDirectoryLocations) { this.mappingDirectoryLocations = mappingDirectoryLocations; } + public Resource[] getMappingDirectoryLocations() { return mappingDirectoryLocations; } @@ -256,6 +266,7 @@ public Resource[] getMappingDirectoryLocations() { public void setEntityInterceptor(Interceptor entityInterceptor) { this.entityInterceptor = entityInterceptor; } + public Interceptor getEntityInterceptor() { return entityInterceptor; } @@ -267,6 +278,7 @@ public Interceptor getEntityInterceptor() { public void setNamingStrategy(NamingStrategy namingStrategy) { this.namingStrategy = namingStrategy; } + public NamingStrategy getNamingStrategy() { return namingStrategy; } @@ -300,6 +312,7 @@ public Properties getHibernateProperties() { public void setAnnotatedClasses(Class[] annotatedClasses) { this.annotatedClasses = annotatedClasses; } + public Class[] getAnnotatedClasses() { return annotatedClasses; } @@ -312,6 +325,7 @@ public Class[] getAnnotatedClasses() { public void setAnnotatedPackages(String[] annotatedPackages) { this.annotatedPackages = annotatedPackages; } + public String[] getAnnotatedPackages() { return annotatedPackages; } @@ -324,6 +338,7 @@ public String[] getAnnotatedPackages() { public void setPackagesToScan(String... packagesToScan) { this.packagesToScan = packagesToScan; } + public String[] getPackagesToScan() { return packagesToScan; } @@ -338,6 +353,7 @@ public void setResourceLoader(ResourceLoader resourceLoader) { public void setProxyIfReloadEnabled(boolean proxyIfReloadEnabled) { this.proxyIfReloadEnabled = proxyIfReloadEnabled; } + public boolean isProxyIfReloadEnabled() { return proxyIfReloadEnabled; } @@ -350,6 +366,7 @@ public boolean isProxyIfReloadEnabled() { public void setCurrentSessionContextClass(Class currentSessionContextClass) { this.currentSessionContextClass = currentSessionContextClass; } + public Class getCurrentSessionContextClass() { return currentSessionContextClass; } @@ -361,6 +378,7 @@ public Class getConfigClass() { public void setHibernateEventListeners(final HibernateEventListeners listeners) { hibernateEventListeners = listeners; } + public HibernateEventListeners getHibernateEventListeners() { return hibernateEventListeners; } @@ -368,6 +386,7 @@ public HibernateEventListeners getHibernateEventListeners() { public void setSessionFactoryBeanName(String name) { sessionFactoryBeanName = name; } + public String getSessionFactoryBeanName() { return sessionFactoryBeanName; } @@ -375,6 +394,7 @@ public String getSessionFactoryBeanName() { public void setDataSourceName(String name) { dataSourceName = name; } + public String getDataSourceName() { return dataSourceName; } @@ -391,6 +411,7 @@ public String getDataSourceName() { public void setEventListeners(Map eventListeners) { this.eventListeners = eventListeners; } + public Map getEventListeners() { return eventListeners; } @@ -399,7 +420,7 @@ protected void buildSessionFactory() throws Exception { configuration = newConfiguration(); - if(hibernateMappingContext == null) { + if (hibernateMappingContext == null) { throw new IllegalArgumentException("HibernateMappingContext is required."); } @@ -458,7 +479,7 @@ protected void buildSessionFactory() throws Exception { } if (namingStrategy != null) { -// configuration.setNamingStrategy(namingStrategy); + // configuration.setNamingStrategy(namingStrategy); } if (hibernateProperties != null) { @@ -469,7 +490,6 @@ protected void buildSessionFactory() throws Exception { configuration.addAnnotatedClasses(annotatedClasses); } - if (annotatedPackages != null) { configuration.addPackages(annotatedPackages); } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateSession.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateSession.java index dd492c08d6d..a2b8570306c 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateSession.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/HibernateSession.java @@ -28,24 +28,28 @@ import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; +import org.hibernate.Criteria; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.proxy.HibernateProxy; + +import org.springframework.context.ApplicationEventPublisher; + import org.grails.datastore.gorm.timestamp.DefaultTimestampProvider; +import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.datastore.mapping.proxy.ProxyHandler; -import org.grails.datastore.mapping.query.event.PostQueryEvent; -import org.grails.datastore.mapping.query.event.PreQueryEvent; -import org.grails.orm.hibernate.proxy.HibernateProxyHandler; -import org.grails.orm.hibernate.query.HibernateHqlQuery; -import org.grails.orm.hibernate.query.HibernateQuery; -import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.api.QueryableCriteria; +import org.grails.datastore.mapping.query.event.PostQueryEvent; +import org.grails.datastore.mapping.query.event.PreQueryEvent; import org.grails.datastore.mapping.query.jpa.JpaQueryBuilder; import org.grails.datastore.mapping.query.jpa.JpaQueryInfo; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; -import org.hibernate.*; -import org.hibernate.proxy.HibernateProxy; -import org.springframework.context.ApplicationEventPublisher; +import org.grails.orm.hibernate.proxy.HibernateProxyHandler; +import org.grails.orm.hibernate.query.HibernateHqlQuery; +import org.grails.orm.hibernate.query.HibernateQuery; /** * Session implementation that wraps a Hibernate {@link org.hibernate.Session}. @@ -71,14 +75,14 @@ public HibernateSession(HibernateDatastore hibernateDatastore, SessionFactory se @Override public Serializable getObjectIdentifier(Object instance) { - if(instance == null) return null; - if(proxyHandler.isProxy(instance)) { - return ((HibernateProxy)instance).getHibernateLazyInitializer().getIdentifier(); + if (instance == null) return null; + if (proxyHandler.isProxy(instance)) { + return ((HibernateProxy) instance).getHibernateLazyInitializer().getIdentifier(); } Class type = instance.getClass(); ClassPropertyFetcher cpf = ClassPropertyFetcher.forClass(type); final PersistentEntity persistentEntity = getMappingContext().getPersistentEntity(type.getName()); - if(persistentEntity != null) { + if (persistentEntity != null) { return (Serializable) cpf.getPropertyValue(instance, persistentEntity.getIdentity().getName()); } return null; @@ -103,7 +107,7 @@ public long deleteAll(final QueryableCriteria criteria) { List parameters = jpaQueryInfo.getParameters(); if (parameters != null) { for (int i = 0, count = parameters.size(); i < count; i++) { - query.setParameter(JpaQueryBuilder.PARAMETER_NAME_PREFIX + (i+1), parameters.get(i)); + query.setParameter(JpaQueryBuilder.PARAMETER_NAME_PREFIX + (i + 1), parameters.get(i)); } } @@ -130,7 +134,7 @@ public long updateAll(final QueryableCriteria criteria, final Map, Mapping> MAPPING_CACHE = new HashMap<>(); - /** * Obtains a mapping object for the given domain class nam * @@ -71,7 +70,7 @@ public static void clearMappingCache() { public static void clearMappingCache(Class theClass) { String className = theClass.getName(); - for(Iterator, Mapping>> it = MAPPING_CACHE.entrySet().iterator(); it.hasNext();) { + for (Iterator, Mapping>> it = MAPPING_CACHE.entrySet().iterator(); it.hasNext();) { Map.Entry, Mapping> entry = it.next(); if (className.equals(entry.getKey().getName())) { it.remove(); diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/CacheConfig.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/CacheConfig.groovy index 15aeb6827d1..99702598884 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/CacheConfig.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/CacheConfig.groovy @@ -22,6 +22,7 @@ import groovy.transform.AutoClone import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + import org.springframework.beans.MutablePropertyValues import org.springframework.validation.DataBinder @@ -35,13 +36,14 @@ import org.springframework.validation.DataBinder @CompileStatic @Builder(builderStrategy = SimpleStrategy, prefix = '') class CacheConfig implements Cloneable { - static final List USAGE_OPTIONS = ['read-only', 'read-write','nonstrict-read-write','transactional'] + + static final List USAGE_OPTIONS = ['read-only', 'read-write', 'nonstrict-read-write', 'transactional'] static final List INCLUDE_OPTIONS = ['all', 'non-lazy'] /** * The cache usage */ - String usage = "read-write" + String usage = 'read-write' /** * Whether caching is enabled */ @@ -49,7 +51,7 @@ class CacheConfig implements Cloneable { /** * What to include in caching */ - String include = "all" + String include = 'all' /** * Configures a new CacheConfig instance diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/ColumnConfig.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/ColumnConfig.groovy index c26f8c7b643..9062a3b4d09 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/ColumnConfig.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/ColumnConfig.groovy @@ -22,6 +22,7 @@ import groovy.transform.AutoClone import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + import org.springframework.beans.MutablePropertyValues import org.springframework.validation.DataBinder @@ -35,6 +36,7 @@ import org.springframework.validation.DataBinder @CompileStatic @Builder(builderStrategy = SimpleStrategy, prefix = '') class ColumnConfig { + /** * The column name */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/CompositeIdentity.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/CompositeIdentity.groovy index 234d9c659e6..11b09015a44 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/CompositeIdentity.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/CompositeIdentity.groovy @@ -22,6 +22,7 @@ import groovy.transform.AutoClone import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + import org.grails.datastore.mapping.config.Property /** @@ -34,6 +35,7 @@ import org.grails.datastore.mapping.config.Property @Builder(builderStrategy = SimpleStrategy, prefix = '') @CompileStatic class CompositeIdentity extends Property { + /** * The property names that make up the custom identity */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/DiscriminatorConfig.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/DiscriminatorConfig.groovy index 53842c800d1..46351684fff 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/DiscriminatorConfig.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/DiscriminatorConfig.groovy @@ -32,6 +32,7 @@ import groovy.transform.builder.SimpleStrategy @CompileStatic @Builder(builderStrategy = SimpleStrategy, prefix = '') class DiscriminatorConfig { + /** * The discriminator value */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java index 13c7983e5cb..1c5715728c5 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsDomainBinder.java @@ -18,57 +18,107 @@ */ package org.grails.orm.hibernate.cfg; +import java.lang.reflect.Method; +import java.math.BigInteger; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.sql.Types; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; +import java.util.SortedSet; +import java.util.StringTokenizer; + import groovy.lang.Closure; -import groovy.transform.Trait; import org.codehaus.groovy.runtime.DefaultGroovyMethods; import org.codehaus.groovy.transform.trait.Traits; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport; -import org.grails.datastore.mapping.model.*; -import org.grails.datastore.mapping.model.config.GormProperties; -import org.grails.datastore.mapping.model.types.*; -import org.grails.datastore.mapping.model.types.ToOne; -import org.grails.datastore.mapping.reflect.EntityReflector; -import org.grails.datastore.mapping.reflect.NameUtils; -import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy; + +import jakarta.persistence.Entity; + import org.hibernate.FetchMode; import org.hibernate.MappingException; import org.hibernate.boot.internal.MetadataBuildingContextRootImpl; import org.hibernate.boot.model.naming.Identifier; import org.hibernate.boot.registry.classloading.spi.ClassLoaderService; -import org.hibernate.boot.spi.*; -import org.hibernate.cfg.*; +import org.hibernate.boot.spi.InFlightMetadataCollector; +import org.hibernate.boot.spi.MetadataBuildingContext; +import org.hibernate.boot.spi.MetadataBuildingOptions; +import org.hibernate.boot.spi.MetadataContributor; +import org.hibernate.cfg.AccessType; +import org.hibernate.cfg.BinderHelper; +import org.hibernate.cfg.ImprovedNamingStrategy; +import org.hibernate.cfg.NamingStrategy; +import org.hibernate.cfg.SecondPass; import org.hibernate.engine.OptimisticLockStyle; import org.hibernate.engine.spi.FilterDefinition; import org.hibernate.engine.spi.PersistentAttributeInterceptable; import org.hibernate.id.PersistentIdentifierGenerator; import org.hibernate.id.enhanced.SequenceStyleGenerator; -import org.hibernate.mapping.*; +import org.hibernate.mapping.Backref; +import org.hibernate.mapping.Bag; import org.hibernate.mapping.Collection; +import org.hibernate.mapping.Column; +import org.hibernate.mapping.Component; +import org.hibernate.mapping.DependantValue; +import org.hibernate.mapping.Formula; +import org.hibernate.mapping.IndexBackref; +import org.hibernate.mapping.IndexedCollection; +import org.hibernate.mapping.JoinedSubclass; +import org.hibernate.mapping.KeyValue; import org.hibernate.mapping.ManyToOne; import org.hibernate.mapping.OneToMany; import org.hibernate.mapping.OneToOne; +import org.hibernate.mapping.PersistentClass; +import org.hibernate.mapping.Property; +import org.hibernate.mapping.RootClass; +import org.hibernate.mapping.Selectable; +import org.hibernate.mapping.SimpleValue; +import org.hibernate.mapping.SingleTableSubclass; +import org.hibernate.mapping.Subclass; import org.hibernate.mapping.Table; +import org.hibernate.mapping.UnionSubclass; +import org.hibernate.mapping.UniqueKey; +import org.hibernate.mapping.Value; import org.hibernate.persister.entity.UnionSubclassEntityPersister; -import org.hibernate.type.*; +import org.hibernate.type.EnumType; +import org.hibernate.type.ForeignKeyDirection; +import org.hibernate.type.IntegerType; +import org.hibernate.type.LongType; +import org.hibernate.type.StandardBasicTypes; +import org.hibernate.type.TimestampType; +import org.hibernate.type.Type; import org.hibernate.usertype.UserCollectionType; import org.jboss.jandex.IndexView; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.util.StringUtils; -import jakarta.persistence.Entity; -import java.io.UnsupportedEncodingException; -import java.lang.reflect.Method; -import java.math.BigInteger; -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.sql.Types; -import java.util.*; -import java.util.List; -import java.util.Map; -import java.util.Set; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport; +import org.grails.datastore.mapping.model.DatastoreConfigurationException; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.PersistentProperty; +import org.grails.datastore.mapping.model.config.GormProperties; +import org.grails.datastore.mapping.model.types.Association; +import org.grails.datastore.mapping.model.types.Basic; +import org.grails.datastore.mapping.model.types.Embedded; +import org.grails.datastore.mapping.model.types.ManyToMany; +import org.grails.datastore.mapping.model.types.TenantId; +import org.grails.datastore.mapping.model.types.ToMany; +import org.grails.datastore.mapping.model.types.ToOne; +import org.grails.datastore.mapping.reflect.EntityReflector; +import org.grails.datastore.mapping.reflect.NameUtils; +import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy; /** * Handles the binding Grails domain classes and properties to the Hibernate runtime meta model. @@ -101,6 +151,7 @@ public class GrailsDomainBinder implements MetadataContributor { * be configured in DataSource.groovy via hibernate.naming_strategy = .... */ public static Map NAMING_STRATEGIES = new HashMap<>(); + static { NAMING_STRATEGIES.put(ConnectionSource.DEFAULT, ImprovedNamingStrategy.INSTANCE); } @@ -152,25 +203,22 @@ public void contribute(InFlightMetadataCollector metadataCollector, IndexView ja MetadataBuildingOptions options = metadataCollector.getMetadataBuildingOptions(); ClassLoaderService classLoaderService = options.getServiceRegistry().getService(ClassLoaderService.class); - this.metadataBuildingContext = new MetadataBuildingContextRootImpl( metadataCollector.getBootstrapContext(), options, metadataCollector ); - java.util.Collection persistentEntities = hibernateMappingContext.getPersistentEntities(); + java.util.Collection persistentEntities = hibernateMappingContext.getPersistentEntities(); for (PersistentEntity persistentEntity : persistentEntities) { - if(!persistentEntity.getJavaClass().isAnnotationPresent(Entity.class)) { - if(ConnectionSourcesSupport.usesConnectionSource(persistentEntity, dataSourceName) && persistentEntity.isRoot()) { + if (!persistentEntity.getJavaClass().isAnnotationPresent(Entity.class)) { + if (ConnectionSourcesSupport.usesConnectionSource(persistentEntity, dataSourceName) && persistentEntity.isRoot()) { bindRoot((HibernatePersistentEntity) persistentEntity, metadataCollector, sessionFactoryName); } } } } - - /** * Override the default naming strategy for the default datasource given a Class or a full class name. * @param strategy the class or name @@ -196,17 +244,17 @@ public static void configureNamingStrategy(final String datasourceName, final Ob Class namingStrategyClass = null; NamingStrategy namingStrategy; if (strategy instanceof Class) { - namingStrategyClass = (Class)strategy; + namingStrategyClass = (Class) strategy; } else if (strategy instanceof CharSequence) { namingStrategyClass = Thread.currentThread().getContextClassLoader().loadClass(strategy.toString()); } if (namingStrategyClass == null) { - namingStrategy = (NamingStrategy)strategy; + namingStrategy = (NamingStrategy) strategy; } else { - namingStrategy = (NamingStrategy)namingStrategyClass.newInstance(); + namingStrategy = (NamingStrategy) namingStrategyClass.newInstance(); } NAMING_STRATEGIES.put(datasourceName, namingStrategy); @@ -230,20 +278,20 @@ protected void bindMapSecondPass(ToMany property, InFlightMetadataCollector mapp } map.setIndex(value); - if(!(property instanceof org.grails.datastore.mapping.model.types.OneToMany) && !(property instanceof ManyToMany)) { + if (!(property instanceof org.grails.datastore.mapping.model.types.OneToMany) && !(property instanceof ManyToMany)) { SimpleValue elt = new SimpleValue(metadataBuildingContext, map.getCollectionTable()); map.setElement(elt); - String typeName = getTypeName(property,getPropertyConfig(property), getMapping(property.getOwner())); - if (typeName == null ) { + String typeName = getTypeName(property, getPropertyConfig(property), getMapping(property.getOwner())); + if (typeName == null) { - if(property instanceof Basic) { + if (property instanceof Basic) { Basic basic = (Basic) property; typeName = basic.getComponentType().getName(); } } - if(typeName == null || typeName.equals(Object.class.getName())) { + if (typeName == null || typeName.equals(Object.class.getName())) { typeName = StandardBasicTypes.STRING.getName(); } bindSimpleValue(typeName, elt, false, getMapElementName(property, sessionFactoryBeanName), mappings); @@ -350,17 +398,17 @@ protected void bindCollectionSecondPass(ToMany property, InFlightMetadataCollect PersistentClass associatedClass = null; if (LOG.isDebugEnabled()) - LOG.debug("Mapping collection: " - + collection.getRole() - + " -> " - + collection.getCollectionTable().getName()); + LOG.debug("Mapping collection: " + + collection.getRole() + + " -> " + + collection.getCollectionTable().getName()); PropertyConfig propConfig = getPropertyConfig(property); PersistentEntity referenced = property.getAssociatedEntity(); if (propConfig != null && StringUtils.hasText(propConfig.getSort())) { if (!property.isBidirectional() && (property instanceof org.grails.datastore.mapping.model.types.OneToMany)) { - throw new DatastoreConfigurationException("Default sort for associations ["+property.getOwner().getName()+"->" + property.getName() + + throw new DatastoreConfigurationException("Default sort for associations [" + property.getOwner().getName() + "->" + property.getName() + "] are not supported with unidirectional one to many relationships."); } if (referenced != null) { @@ -388,7 +436,7 @@ protected void bindCollectionSecondPass(ToMany property, InFlightMetadataCollect if (rootMapping != null) { DiscriminatorConfig discriminatorConfig = rootMapping.getDiscriminator(); - if(discriminatorConfig != null) { + if (discriminatorConfig != null) { final ColumnConfig discriminatorColumn = discriminatorConfig.getColumn(); if (discriminatorColumn != null) { discriminatorColumnName = discriminatorColumn.getName(); @@ -405,7 +453,6 @@ protected void bindCollectionSecondPass(ToMany property, InFlightMetadataCollect collection.setWhere(discriminatorColumnName + " in (" + inclause + ")"); } - OneToMany oneToMany = (OneToMany) collection.getElement(); String associatedClassName = oneToMany.getReferencedEntityName(); @@ -424,9 +471,9 @@ protected void bindCollectionSecondPass(ToMany property, InFlightMetadataCollect } final boolean isManyToMany = property instanceof ManyToMany; - if(referenced != null && !isManyToMany && referenced.isMultiTenant()) { + if (referenced != null && !isManyToMany && referenced.isMultiTenant()) { String filterCondition = getMultiTenantFilterCondition(sessionFactoryBeanName, referenced); - if(filterCondition != null) { + if (filterCondition != null) { if (isUnidirectionalOneToMany(property)) { collection.addManyToManyFilter(GormProperties.TENANT_IDENTITY, filterCondition, true, Collections.emptyMap(), Collections.emptyMap()); } else { @@ -452,7 +499,7 @@ protected void bindCollectionSecondPass(ToMany property, InFlightMetadataCollect } } else { if (hasJoinKeyMapping(propConfig)) { - bindSimpleValue("long", key,false, propConfig.getJoinTable().getKey().getName(), mappings); + bindSimpleValue("long", key, false, propConfig.getJoinTable().getKey().getName(), mappings); } else { bindDependentKeyValue(property, key, mappings, sessionFactoryBeanName); } @@ -475,7 +522,7 @@ protected void bindCollectionSecondPass(ToMany property, InFlightMetadataCollect if (LOG.isDebugEnabled()) LOG.debug("[GrailsDomainBinder] Mapping other side " + otherSide.getOwner().getName() + "." + otherSide.getName() + " -> " + collection.getCollectionTable().getName() + " as ManyToOne"); ManyToOne element = new ManyToOne(metadataBuildingContext, collection.getCollectionTable()); - bindManyToMany((Association)otherSide, element, mappings, sessionFactoryBeanName); + bindManyToMany((Association) otherSide, element, mappings, sessionFactoryBeanName); collection.setElement(element); bindCollectionForPropertyConfig(collection, propConfig); if (property.isCircular()) { @@ -497,7 +544,7 @@ protected void bindCollectionSecondPass(ToMany property, InFlightMetadataCollect private String getMultiTenantFilterCondition(String sessionFactoryBeanName, PersistentEntity referenced) { TenantId tenantId = referenced.getTenantId(); - if(tenantId != null) { + if (tenantId != null) { String defaultColumnName = getDefaultColumnName(tenantId, sessionFactoryBeanName); return ":tenantId = " + defaultColumnName; } @@ -530,8 +577,8 @@ protected String buildOrderByClause(String hqlOrderBy, PersistentClass associate if (isNonPropertyToken(token)) { if (currentOrdering != null) { throw new DatastoreConfigurationException( - "Error while parsing sort clause: " + hqlOrderBy - + " (" + role + ")" + "Error while parsing sort clause: " + hqlOrderBy + + " (" + role + ")" ); } currentOrdering = token; @@ -565,8 +612,8 @@ protected String buildOrderByClause(String hqlOrderBy, PersistentClass associate Property p = BinderHelper.findPropertyByName(associatedClass, property); if (p == null) { throw new DatastoreConfigurationException( - "property from sort clause not found: " - + associatedClass.getEntityName() + "." + property + "property from sort clause not found: " + + associatedClass.getEntityName() + "." + property ); } PersistentClass pc = p.getPersistentClass(); @@ -575,8 +622,8 @@ protected String buildOrderByClause(String hqlOrderBy, PersistentClass associate table = ""; } - else if (pc == associatedClass - || (associatedClass instanceof SingleTableSubclass && + else if (pc == associatedClass || + (associatedClass instanceof SingleTableSubclass && pc.getMappedClass().isAssignableFrom(associatedClass.getMappedClass()))) { table = ""; } else { @@ -615,7 +662,7 @@ protected Set buildDiscriminatorSet(HibernatePersistentEntity domainClas String discriminator = domainClass.getName(); if (mapping != null && mapping.getDiscriminator() != null) { DiscriminatorConfig discriminatorConfig = mapping.getDiscriminator(); - if(discriminatorConfig.getValue() != null) { + if (discriminatorConfig.getValue() != null) { discriminator = discriminatorConfig.getValue(); } } @@ -623,7 +670,7 @@ protected Set buildDiscriminatorSet(HibernatePersistentEntity domainClas String quote = "'"; if (rootMapping != null && rootMapping.getDatasources() != null) { DiscriminatorConfig discriminatorConfig = rootMapping.getDiscriminator(); - if(discriminatorConfig != null && discriminatorConfig.getType() != null && !discriminatorConfig.getType().equals("string")) + if (discriminatorConfig != null && discriminatorConfig.getType() != null && !discriminatorConfig.getType().equals("string")) quote = ""; } theSet.add(quote + discriminator + quote); @@ -672,7 +719,7 @@ protected void bindCollectionWithJoinTable(ToMany property, final boolean hasJoinColumnMapping = hasJoinColumnMapping(config); if (isBasicCollectionType) { - final Class referencedType = ((Basic)property).getComponentType(); + final Class referencedType = ((Basic) property).getComponentType(); String className = referencedType.getName(); final boolean isEnum = referencedType.isEnum(); if (hasJoinColumnMapping) { @@ -685,7 +732,7 @@ protected void bindCollectionWithJoinTable(ToMany property, } if (isEnum) { - bindEnumType(property, referencedType,element,columnName); + bindEnumType(property, referencedType, element, columnName); } else { @@ -698,10 +745,10 @@ protected void bindCollectionWithJoinTable(ToMany property, } if (typeName == null) { String domainName = property.getOwner().getName(); - throw new MappingException("Missing type or column for column["+columnName+"] on domain["+domainName+"] referencing["+className+"]"); + throw new MappingException("Missing type or column for column[" + columnName + "] on domain[" + domainName + "] referencing[" + className + "]"); } - bindSimpleValue(typeName, element,true, columnName, mappings); + bindSimpleValue(typeName, element, true, columnName, mappings); if (hasJoinColumnMapping) { bindColumnConfigToColumn(property, getColumnForSimpleValue(element), config.getJoinTable().getColumn()); } @@ -723,7 +770,7 @@ protected void bindCollectionWithJoinTable(ToMany property, columnName = namingStrategy.propertyToColumnName(NameUtils.decapitalize(domainClass.getName())) + FOREIGN_KEY_SUFFIX; } - bindSimpleValue("long", element,true, columnName, mappings); + bindSimpleValue("long", element, true, columnName, mappings); } } @@ -741,14 +788,14 @@ protected String removeBackticks(String s) { } protected Column getColumnForSimpleValue(SimpleValue element) { - return (Column)element.getColumnIterator().next(); + return (Column) element.getColumnIterator().next(); } protected String getTypeName(PersistentProperty property, PropertyConfig config, Mapping mapping) { if (config != null && config.getType() != null) { final Object typeObj = config.getType(); if (typeObj instanceof Class) { - return ((Class)typeObj).getName(); + return ((Class) typeObj).getName(); } return typeObj.toString(); } @@ -780,7 +827,7 @@ protected void bindColumnConfigToColumn(PersistentProperty property, Column colu if (columnConfig.getSqlType() != null && !columnConfig.getSqlType().isEmpty()) { column.setSqlType(columnConfig.getSqlType()); } - if(allowUnique) { + if (allowUnique) { column.setUnique(columnConfig.getUnique()); } } @@ -807,12 +854,12 @@ protected void bindUnidirectionalOneToManyInverseValues(ToMany property, ManyToO } else { manyToOne.setIgnoreNotFound(config.getIgnoreNotFound()); final FetchMode fetch = config.getFetchMode(); - if(!fetch.equals(FetchMode.JOIN) && !fetch.equals(FetchMode.EAGER)) { + if (!fetch.equals(FetchMode.JOIN) && !fetch.equals(FetchMode.EAGER)) { manyToOne.setLazy(true); } final Boolean lazy = config.getLazy(); - if(lazy != null) { + if (lazy != null) { manyToOne.setLazy(lazy); } } @@ -827,11 +874,11 @@ protected void bindCollectionForPropertyConfig(Collection collection, PropertyCo collection.setExtraLazy(false); } else { final FetchMode fetch = config.getFetchMode(); - if(!fetch.equals(FetchMode.JOIN) && !fetch.equals(FetchMode.EAGER)) { + if (!fetch.equals(FetchMode.JOIN) && !fetch.equals(FetchMode.EAGER)) { collection.setLazy(true); } final Boolean lazy = config.getLazy(); - if(lazy != null) { + if (lazy != null) { collection.setExtraLazy(lazy); } } @@ -848,7 +895,7 @@ public PropertyConfig getPropertyConfig(PersistentProperty property) { * @return true if it is unidirectional and a one-to-many */ protected boolean isUnidirectionalOneToMany(PersistentProperty property) { - return ((property instanceof org.grails.datastore.mapping.model.types.OneToMany) && !((Association)property).isBidirectional()); + return ((property instanceof org.grails.datastore.mapping.model.types.OneToMany) && !((Association) property).isBidirectional()); } /** @@ -870,7 +917,7 @@ protected void bindDependentKeyValue(PersistentProperty property, DependantValue final Mapping mapping = getMapping(refDomainClass.getJavaClass()); boolean hasCompositeIdentifier = hasCompositeIdentifier(mapping); if ((shouldCollectionBindWithJoinColumn((ToMany) property) && hasCompositeIdentifier) || - (hasCompositeIdentifier && ( property instanceof ManyToMany))) { + (hasCompositeIdentifier && (property instanceof ManyToMany))) { CompositeIdentity ci = (CompositeIdentity) mapping.getIdentity(); bindCompositeIdentifierToManyToOne((Association) property, key, ci, refDomainClass, EMPTY_PATH, sessionFactoryBeanName); } @@ -1110,16 +1157,16 @@ protected void bindCollectionTable(ToMany property, InFlightMetadataCollector ma String tableName = (jt != null && jt.getName() != null ? jt.getName() : namingStrategy.tableName(calculateTableForMany(property, sessionFactoryBeanName))); String schemaName = getSchemaName(mappings); String catalogName = getCatalogName(mappings); - if(jt != null) { - if(jt.getSchema() != null) { + if (jt != null) { + if (jt.getSchema() != null) { schemaName = jt.getSchema(); } - if(jt.getCatalog() != null) { + if (jt.getCatalog() != null) { catalogName = jt.getCatalog(); } } - if(schemaName == null && owningTableSchema != null) { + if (schemaName == null && owningTableSchema != null) { schemaName = owningTableSchema; } @@ -1158,7 +1205,7 @@ protected String calculateTableForMany(ToMany property, String sessionFactoryBea } if (property.getAssociatedEntity() == null) { - throw new MappingException("Expected an entity to be associated with the association (" + property + ") and none was found. "); + throw new MappingException("Expected an entity to be associated with the association (" + property + ") and none was found. "); } String right = getTableName(property.getAssociatedEntity(), sessionFactoryBeanName); @@ -1211,10 +1258,10 @@ protected String getTableName(PersistentEntity domainClass, String sessionFactor String shortName = domainClass.getJavaClass().getSimpleName(); PersistentEntityNamingStrategy namingStrategy = this.namingStrategy; - if(namingStrategy != null) { + if (namingStrategy != null) { tableName = namingStrategy.resolveTableName(domainClass); } - if(tableName == null) { + if (tableName == null) { tableName = getNamingStrategy(sessionFactoryBeanName).classToTableName(shortName); } } @@ -1393,8 +1440,6 @@ public void bindRoot(HibernatePersistentEntity entity, InFlightMetadataCollector root.setAbstract(entity.isAbstract()); final MappingContext mappingContext = entity.getMappingContext(); - - final java.util.Collection children = mappingContext.getDirectChildEntities(entity); if (children.isEmpty()) { root.setPolymorphic(false); @@ -1469,7 +1514,7 @@ protected void bindSubClasses(HibernatePersistentEntity domainClass, PersistentC for (PersistentEntity sub : subClasses) { final Class javaClass = sub.getJavaClass(); if (javaClass.getSuperclass().equals(domainClass.getJavaClass()) && ConnectionSourcesSupport.usesConnectionSource(sub, dataSourceName)) { - bindSubClass((HibernatePersistentEntity)sub, parent, mappings, sessionFactoryBeanName); + bindSubClass((HibernatePersistentEntity) sub, parent, mappings, sessionFactoryBeanName); } } } @@ -1491,9 +1536,9 @@ protected void bindSubClass(HibernatePersistentEntity sub, PersistentClass paren boolean tablePerConcreteClass = m != null && m.isTablePerConcreteClass(); final String fullName = sub.getName(); if (tablePerSubclass) { - subClass = new JoinedSubclass( parent, this.metadataBuildingContext); + subClass = new JoinedSubclass(parent, this.metadataBuildingContext); } - else if(tablePerConcreteClass) { + else if (tablePerConcreteClass) { subClass = new UnionSubclass(parent, this.metadataBuildingContext); } else { @@ -1534,7 +1579,7 @@ else if(tablePerConcreteClass) { if (tablePerSubclass) { bindJoinedSubClass(sub, (JoinedSubclass) subClass, mappings, m, sessionFactoryBeanName); } - else if( tablePerConcreteClass) { + else if (tablePerConcreteClass) { bindUnionSubclass(sub, (UnionSubclass) subClass, mappings, sessionFactoryBeanName); } else { @@ -1550,16 +1595,15 @@ else if( tablePerConcreteClass) { } } - public void bindUnionSubclass(HibernatePersistentEntity subClass, UnionSubclass unionSubclass, InFlightMetadataCollector mappings, String sessionFactoryBeanName) throws MappingException { bindClass(subClass, unionSubclass, mappings); Mapping subMapping = getMapping(subClass.getJavaClass()); - if ( unionSubclass.getEntityPersisterClass() == null ) { + if (unionSubclass.getEntityPersisterClass() == null) { unionSubclass.getRootClass().setEntityPersisterClass( - UnionSubclassEntityPersister.class ); + UnionSubclassEntityPersister.class); } String schema = subMapping != null && subMapping.getTable().getSchema() != null ? @@ -1577,7 +1621,7 @@ public void bindUnionSubclass(HibernatePersistentEntity subClass, UnionSubclass null, denormalizedSuperTable ); - unionSubclass.setTable( mytable ); + unionSubclass.setTable(mytable); unionSubclass.setClassName(subClass.getName()); LOG.info( @@ -1588,6 +1632,7 @@ public void bindUnionSubclass(HibernatePersistentEntity subClass, UnionSubclass createClassProperties(subClass, unionSubclass, mappings, sessionFactoryBeanName); } + /** * Binds a joined sub-class mapping using table-per-subclass * @@ -1676,14 +1721,14 @@ protected void bindDiscriminatorProperty(Table table, RootClass entity, InFlight boolean hasDiscriminatorConfig = discriminatorConfig != null; entity.setDiscriminatorValue(hasDiscriminatorConfig ? discriminatorConfig.getValue() : entity.getClassName()); - if(hasDiscriminatorConfig) { + if (hasDiscriminatorConfig) { if (discriminatorConfig.getInsertable() != null) { entity.setDiscriminatorInsertable(discriminatorConfig.getInsertable()); } Object type = discriminatorConfig.getType(); if (type != null) { - if(type instanceof Class) { - d.setTypeName(((Class)type).getName()); + if (type instanceof Class) { + d.setTypeName(((Class) type).getName()); } else { d.setTypeName(type.toString()); @@ -1691,13 +1736,12 @@ protected void bindDiscriminatorProperty(Table table, RootClass entity, InFlight } } - if (hasDiscriminatorConfig && discriminatorConfig.getFormula() != null) { Formula formula = new Formula(); formula.setFormula(discriminatorConfig.getFormula()); d.addFormula(formula); } - else{ + else { bindSimpleValue(STRING_TYPE, d, false, RootClass.DEFAULT_DISCRIMINATOR_COLUMN_NAME, mappings); ColumnConfig cc = !hasDiscriminatorConfig ? null : discriminatorConfig.getColumn(); @@ -1761,7 +1805,7 @@ protected void bindRootPersistentClassCommonValues(HibernatePersistentEntity dom final boolean hasTableDefinition = m != null && m.getTable() != null; if (hasTableDefinition && m.getTable().getSchema() != null) { - schema = m.getTable().getSchema(); + schema = m.getTable().getSchema(); } if (hasTableDefinition && m.getTable().getCatalog() != null) { catalog = m.getTable().getCatalog(); @@ -1797,8 +1841,6 @@ protected void bindRootPersistentClassCommonValues(HibernatePersistentEntity dom createClassProperties(domainClass, root, mappings, sessionFactoryBeanName); } - - protected void bindIdentity( HibernatePersistentEntity domainClass, RootClass root, @@ -1808,7 +1850,7 @@ protected void bindIdentity( PersistentProperty identifierProp = domainClass.getIdentity(); if (gormMapping == null) { - if(identifierProp != null) { + if (identifierProp != null) { bindSimpleId(identifierProp, root, mappings, null, sessionFactoryBeanName); } return; @@ -1823,7 +1865,7 @@ protected void bindIdentity( if (propertyName != null) { PersistentProperty namedIdentityProp = domainClass.getPropertyByName(propertyName); if (namedIdentityProp == null) { - throw new MappingException("Mapping specifies an identifier property name that doesn't exist ["+propertyName+"]"); + throw new MappingException("Mapping specifies an identifier property name that doesn't exist [" + propertyName + "]"); } if (!namedIdentityProp.equals(identifierProp)) { identifierProp = namedIdentityProp; @@ -1889,7 +1931,7 @@ protected void createClassProperties(HibernatePersistentEntity domainClass, Pers if (currentGrailsProp.isInherited()) { continue; } - if(currentGrailsProp.getName().equals(GormProperties.VERSION) ) continue; + if (currentGrailsProp.getName().equals(GormProperties.VERSION)) continue; if (isCompositeIdProperty(gormMapping, currentGrailsProp)) continue; if (isIdentityProperty(gormMapping, currentGrailsProp)) continue; @@ -1912,7 +1954,7 @@ protected void createClassProperties(HibernatePersistentEntity domainClass, Pers bindSimpleValue(currentGrailsProp, null, (SimpleValue) value, EMPTY_PATH, mappings, sessionFactoryBeanName); } else if (collectionType != null) { - String typeName = getTypeName(currentGrailsProp, getPropertyConfig(currentGrailsProp),gormMapping); + String typeName = getTypeName(currentGrailsProp, getPropertyConfig(currentGrailsProp), gormMapping); if ("serializable".equals(typeName)) { value = new SimpleValue(metadataBuildingContext, table); bindSimpleValue(typeName, (SimpleValue) value, currentGrailsProp.isNullable(), @@ -1930,7 +1972,7 @@ else if (currentGrailsProp.getType().isEnum()) { value = new SimpleValue(metadataBuildingContext, table); bindEnumType(currentGrailsProp, (SimpleValue) value, EMPTY_PATH, sessionFactoryBeanName); } - else if(currentGrailsProp instanceof Association) { + else if (currentGrailsProp instanceof Association) { Association association = (Association) currentGrailsProp; if (currentGrailsProp instanceof org.grails.datastore.mapping.model.types.ManyToOne) { if (LOG.isDebugEnabled()) @@ -1965,7 +2007,7 @@ else if (canBindOneToOneWithSingleColumnAndForeignKey((Association) currentGrail } } else if (currentGrailsProp instanceof Embedded) { - embedded.add((Embedded)currentGrailsProp); + embedded.add((Embedded) currentGrailsProp); continue; } } @@ -1995,7 +2037,7 @@ else if (currentGrailsProp instanceof Embedded) { } private boolean isHasOne(Association association) { - return association instanceof org.grails.datastore.mapping.model.types.OneToOne && ((org.grails.datastore.mapping.model.types.OneToOne)association).isForeignKeyInChild(); + return association instanceof org.grails.datastore.mapping.model.types.OneToOne && ((org.grails.datastore.mapping.model.types.OneToOne) association).isForeignKeyInChild(); } protected void bindNaturalIdentifier(Table table, Mapping mapping, PersistentClass persistentClass) { @@ -2057,7 +2099,7 @@ protected void setGeneratedUniqueName(UniqueKey uk) { protected boolean canBindOneToOneWithSingleColumnAndForeignKey(Association currentGrailsProp) { if (currentGrailsProp.isBidirectional()) { final Association otherSide = currentGrailsProp.getInverseSide(); - if(otherSide != null) { + if (otherSide != null) { if (isHasOne(otherSide)) { return false; } @@ -2079,7 +2121,7 @@ protected boolean isIdentityProperty(Mapping gormMapping, PersistentProperty cur return false; } - String identityName = ((Identity)identityMapping).getName(); + String identityName = ((Identity) identityMapping).getName(); return identityName != null && identityName.equals(currentGrailsProp.getName()); } @@ -2105,7 +2147,7 @@ protected void bindEnumType(PersistentProperty property, Class propertyType, enumProperties.put(EnumType.TYPE, String.valueOf(Types.VARCHAR)); enumProperties.put(EnumType.NAMED, Boolean.TRUE.toString()); } - else if("identity".equals(enumType)) { + else if ("identity".equals(enumType)) { simpleValue.setTypeName(IdentityEnumType.class.getName()); } else if (!"ordinal".equalsIgnoreCase(enumType)) { @@ -2152,7 +2194,7 @@ protected Class getUserType(PersistentProperty currentGrailsProp) { PropertyConfig config = getPropertyConfig(currentGrailsProp); Object typeObj = config == null ? null : config.getType(); if (typeObj instanceof Class) { - userType = (Class)typeObj; + userType = (Class) typeObj; } else if (typeObj != null) { String typeName = typeObj.toString(); try { @@ -2160,7 +2202,7 @@ protected Class getUserType(PersistentProperty currentGrailsProp) { } catch (ClassNotFoundException e) { // only print a warning if the user type is in a package this excludes basic // types like string, int etc. - if (typeName.indexOf(".")>-1) { + if (typeName.indexOf(".") > -1) { if (LOG.isWarnEnabled()) { LOG.warn("UserType not found ", e); } @@ -2177,7 +2219,7 @@ protected boolean isCompositeIdProperty(Mapping gormMapping, PersistentProperty String[] propertyNames = ((CompositeIdentity) id).getPropertyNames(); String property = currentGrailsProp.getName(); for (String currentName : propertyNames) { - if(currentName != null && currentName.equals(property)) return true; + if (currentName != null && currentName.equals(property)) return true; } } } @@ -2185,7 +2227,7 @@ protected boolean isCompositeIdProperty(Mapping gormMapping, PersistentProperty } protected boolean isBidirectionalManyToOne(PersistentProperty currentGrailsProp) { - return ((currentGrailsProp instanceof org.grails.datastore.mapping.model.types.ManyToOne) && ((Association)currentGrailsProp).isBidirectional()); + return ((currentGrailsProp instanceof org.grails.datastore.mapping.model.types.ManyToOne) && ((Association) currentGrailsProp).isBidirectional()); } /** @@ -2345,7 +2387,7 @@ protected void bindManyToOne(Association property, ManyToOne manyToOne, if (pc.getColumns().isEmpty()) { mapping.getColumns().put(property.getName(), pc); } - if (!hasJoinKeyMapping(pc) ) { + if (!hasJoinKeyMapping(pc)) { JoinTable jt = new JoinTable(); final ColumnConfig columnConfig = new ColumnConfig(); columnConfig.setName(namingStrategy.propertyToColumnName(property.getName()) + @@ -2391,7 +2433,7 @@ protected void bindCompositeIdentifierToManyToOne(Association property, for (String propertyName : propertyNames) { ColumnConfig cc; // if a column configuration exists in the mapping use it - if(j < i) { + if (j < i) { cc = columns.get(j++); } // otherwise create a new one to represent the composite column @@ -2399,17 +2441,17 @@ protected void bindCompositeIdentifierToManyToOne(Association property, cc = new ColumnConfig(); } // if the name is null then configure the name by convention - if(cc.getName() == null) { + if (cc.getName() == null) { // use the referenced table name as a prefix String prefix = getTableName(refDomainClass, sessionFactoryBeanName); PersistentProperty referencedProperty = refDomainClass.getPropertyByName(propertyName); // if the referenced property is a ToOne and it has a composite id // then a column is needed for each property that forms the composite id - if(referencedProperty instanceof ToOne) { + if (referencedProperty instanceof ToOne) { ToOne toOne = (ToOne) referencedProperty; PersistentProperty[] compositeIdentity = toOne.getAssociatedEntity().getCompositeIdentity(); - if(compositeIdentity != null) { + if (compositeIdentity != null) { for (PersistentProperty cip : compositeIdentity) { // for each property of a composite id by default we use the table name and the property name as a prefix String compositeIdPrefix = addUnderscore(prefix, namingStrategy.propertyToColumnName(referencedProperty.getName())); @@ -2439,10 +2481,10 @@ private int calculateForeignKeyColumnCount(PersistentEntity refDomainClass, Stri int expectedForeignKeyColumnLength = 0; for (String propertyName : propertyNames) { PersistentProperty referencedProperty = refDomainClass.getPropertyByName(propertyName); - if(referencedProperty instanceof ToOne) { + if (referencedProperty instanceof ToOne) { ToOne toOne = (ToOne) referencedProperty; PersistentProperty[] compositeIdentity = toOne.getAssociatedEntity().getCompositeIdentity(); - if(compositeIdentity != null) { + if (compositeIdentity != null) { expectedForeignKeyColumnLength += compositeIdentity.length; } else { @@ -2565,7 +2607,7 @@ protected void bindSimpleId(PersistentProperty identifier, RootClass entity, // create the id value SimpleValue id = new SimpleValue(metadataBuildingContext, entity.getTable()); - Property idProperty = new Property(); + Property idProperty = new Property(); idProperty.setName(identifier.getName()); idProperty.setValue(id); entity.setDeclaredIdentifierProperty(idProperty); @@ -2579,13 +2621,13 @@ protected void bindSimpleId(PersistentProperty identifier, RootClass entity, id.setIdentifierGeneratorStrategy(useSequence ? "sequence-identity" : "native"); } else { String generator = mappedId.getGenerator(); - if("native".equals(generator) && useSequence) { + if ("native".equals(generator) && useSequence) { generator = "sequence-identity"; } id.setIdentifierGeneratorStrategy(generator); params.putAll(mappedId.getParams()); - if(params.containsKey(SEQUENCE_KEY)) { - params.put(SequenceStyleGenerator.SEQUENCE_PARAM, params.getProperty(SEQUENCE_KEY)); + if (params.containsKey(SEQUENCE_KEY)) { + params.put(SequenceStyleGenerator.SEQUENCE_PARAM, params.getProperty(SEQUENCE_KEY)); } if ("assigned".equals(generator)) { id.setNullValue("undefined"); @@ -2622,7 +2664,7 @@ protected void bindSimpleId(PersistentProperty identifier, RootClass entity, private String getSchemaName(InFlightMetadataCollector mappings) { Identifier schema = mappings.getDatabase().getDefaultNamespace().getName().getSchema(); - if(schema != null) { + if (schema != null) { return schema.getCanonicalName(); } return null; @@ -2630,7 +2672,7 @@ private String getSchemaName(InFlightMetadataCollector mappings) { private String getCatalogName(InFlightMetadataCollector mappings) { Identifier catalog = mappings.getDatabase().getDefaultNamespace().getName().getCatalog(); - if(catalog != null) { + if (catalog != null) { return catalog.getCanonicalName(); } return null; @@ -2658,21 +2700,20 @@ protected void bindProperty(PersistentProperty grailsProperty, Property prop, In grailsProperty.getMapping().getMappedForm().getAccessType() ); - if(accessType == AccessType.FIELD) { + if (accessType == AccessType.FIELD) { EntityReflector.PropertyReader reader = grailsProperty.getReader(); - Method getter = reader != null ? reader.getter() : null; - if(getter != null && getter.getAnnotation(Traits.Implemented.class) != null) { + Method getter = reader != null ? reader.getter() : null; + if (getter != null && getter.getAnnotation(Traits.Implemented.class) != null) { prop.setPropertyAccessorName(TraitPropertyAccessStrategy.class.getName()); } else { - prop.setPropertyAccessorName( accessType.getType() ); + prop.setPropertyAccessorName(accessType.getType()); } } else { - prop.setPropertyAccessorName( accessType.getType() ); + prop.setPropertyAccessorName(accessType.getType()); } - prop.setOptional(grailsProperty.isNullable()); setCascadeBehaviour(grailsProperty, prop); @@ -2688,7 +2729,7 @@ protected void bindProperty(PersistentProperty grailsProperty, Property prop, In prop.setLazy(isLazy); if (isLazy && isToOne && !(PersistentAttributeInterceptable.class.isAssignableFrom(propertyOwner.getJavaClass()))) { -// handleLazyProxy(propertyOwner, grailsProperty); + // handleLazyProxy(propertyOwner, grailsProperty); } } } @@ -2696,10 +2737,10 @@ protected void bindProperty(PersistentProperty grailsProperty, Property prop, In protected boolean getLaziness(PersistentProperty grailsProperty) { PropertyConfig config = getPropertyConfig(grailsProperty); final Boolean lazy = config.getLazy(); - if(lazy == null && grailsProperty instanceof Association) { + if (lazy == null && grailsProperty instanceof Association) { return true; } - else if(lazy != null) { + else if (lazy != null) { return lazy; } return false; @@ -2716,7 +2757,7 @@ protected boolean getUpdateableness(PersistentProperty grailsProperty) { } protected boolean isBidirectionalManyToOneWithListMapping(PersistentProperty grailsProperty, Property prop) { - if(grailsProperty instanceof Association) { + if (grailsProperty instanceof Association) { Association association = (Association) grailsProperty; Association otherSide = association.getInverseSide(); @@ -2762,7 +2803,7 @@ else if (association instanceof org.grails.datastore.mapping.model.types.OneToOn if (referenced != null && referenced.isOwningEntity(domainClass) && !isCircularAssociation(grailsProperty)) { cascadeStrategy = CASCADE_ALL; } - else if(isCompositeIdProperty((Mapping) domainClass.getMapping().getMappedForm(), grailsProperty)) { + else if (isCompositeIdProperty((Mapping) domainClass.getMapping().getMappedForm(), grailsProperty)) { cascadeStrategy = CASCADE_ALL; } else { @@ -2826,7 +2867,7 @@ protected String getAssociationDescription(Association grailsProperty) { protected void bindSimpleValue(PersistentProperty property, PersistentProperty parentProperty, SimpleValue simpleValue, String path, InFlightMetadataCollector mappings, String sessionFactoryBeanName) { // set type - bindSimpleValue(property,parentProperty, simpleValue, path, getPropertyConfig(property), sessionFactoryBeanName); + bindSimpleValue(property, parentProperty, simpleValue, path, getPropertyConfig(property), sessionFactoryBeanName); } protected void bindSimpleValue(PersistentProperty grailsProp, SimpleValue simpleValue, @@ -2848,17 +2889,17 @@ protected void bindSimpleValue(PersistentProperty grailsProp, boolean hasConfig = propertyConfig != null; String generator = hasConfig ? propertyConfig.getGenerator() : null; - if(generator != null) { + if (generator != null) { simpleValue.setIdentifierGeneratorStrategy(generator); Properties params = propertyConfig.getTypeParams(); - if(params != null) { + if (params != null) { Properties generatorProps = new Properties(); generatorProps.putAll(params); - if(generatorProps.containsKey(SEQUENCE_KEY)) { - generatorProps.put(SequenceStyleGenerator.SEQUENCE_PARAM, generatorProps.getProperty(SEQUENCE_KEY)); + if (generatorProps.containsKey(SEQUENCE_KEY)) { + generatorProps.put(SequenceStyleGenerator.SEQUENCE_PARAM, generatorProps.getProperty(SEQUENCE_KEY)); } - simpleValue.setIdentifierGeneratorProperties( generatorProps ); + simpleValue.setIdentifierGeneratorProperties(generatorProps); } } @@ -2866,8 +2907,8 @@ protected void bindSimpleValue(PersistentProperty grailsProp, // not all custom mapped properties will have column definitions, // in which case we still need to create a Hibernate column for // this value. - List columnDefinitions = hasConfig ? propertyConfig.getColumns() - : Arrays.asList(new Object[] { null }); + List columnDefinitions = hasConfig ? propertyConfig.getColumns() : + Arrays.asList(new Object[] { null }); if (columnDefinitions.isEmpty()) { columnDefinitions = Arrays.asList(new Object[] { null }); } @@ -2888,7 +2929,6 @@ protected void bindSimpleValue(PersistentProperty grailsProp, column.setValue(simpleValue); - if (cc != null) { if (cc.getLength() != -1) { column.setLength(cc.getLength()); @@ -2899,7 +2939,7 @@ protected void bindSimpleValue(PersistentProperty grailsProp, if (cc.getScale() != -1) { column.setScale(cc.getScale()); } - if(!mappedForm.isUniqueWithinGroup()) { + if (!mappedForm.isUniqueWithinGroup()) { column.setUnique(cc.isUnique()); } } @@ -3021,7 +3061,7 @@ else if ((property instanceof ToOne) && association.isCircular()) { Mapping mapping = getMapping(owner); if (mapping == null || mapping.getTablePerHierarchy()) { if (LOG.isDebugEnabled()) - LOG.debug("[GrailsDomainBinder] Sub class property [" + property.getName() + "] for column name ["+column.getName()+"] set to nullable"); + LOG.debug("[GrailsDomainBinder] Sub class property [" + property.getName() + "] for column name [" + column.getName() + "] set to nullable"); column.setNullable(true); } else { column.setNullable(property.isNullable()); @@ -3029,10 +3069,9 @@ else if ((property instanceof ToOne) && association.isCircular()) { } if (LOG.isDebugEnabled()) - LOG.debug("[GrailsDomainBinder] bound property [" + property.getName() + "] to column name ["+column.getName()+"] in table ["+table.getName()+"]"); + LOG.debug("[GrailsDomainBinder] bound property [" + property.getName() + "] to column name [" + column.getName() + "] in table [" + table.getName() + "]"); } - protected void createKeyForProps(PersistentProperty grailsProp, String path, Table table, String columnName, List propertyNames, String sessionFactoryBeanName) { List keyList = new ArrayList<>(); @@ -3056,7 +3095,7 @@ protected void createUniqueKeyForColumns(Table table, String columnName, List persistentClasses, Map inheritedMetas) throws MappingException { bindMapSecondPass(property, mappings, persistentClasses, - (org.hibernate.mapping.Map)collection, sessionFactoryBeanName); + (org.hibernate.mapping.Map) collection, sessionFactoryBeanName); } @SuppressWarnings("rawtypes") @@ -3465,6 +3498,7 @@ public void doSecondPass(Map persistentClasses) throws MappingException { (org.hibernate.mapping.Map) collection, sessionFactoryBeanName); } } + /** * A Collection type, for the moment only Set is supported * @@ -3571,5 +3605,3 @@ public String getTypeName(ToMany property) { } } - - diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java index 421e89d9933..4ddea5c68d1 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsHibernateUtil.java @@ -18,20 +18,20 @@ */ package org.grails.orm.hibernate.cfg; +import java.util.List; +import java.util.Map; + import groovy.lang.GroovyObject; import groovy.lang.GroovySystem; import groovy.lang.MetaClass; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.model.PersistentProperty; -import org.grails.datastore.mapping.model.config.GormProperties; -import org.grails.datastore.mapping.model.types.Association; -import org.grails.datastore.mapping.model.types.Embedded; -import org.grails.datastore.mapping.reflect.ClassUtils; -import org.grails.orm.hibernate.AbstractHibernateDatastore; -import org.grails.orm.hibernate.datasource.MultipleDataSourceSupport; -import org.grails.orm.hibernate.proxy.HibernateProxyHandler; -import org.grails.orm.hibernate.support.HibernateRuntimeUtils; -import org.hibernate.*; + +import org.hibernate.Criteria; +import org.hibernate.FetchMode; +import org.hibernate.FlushMode; +import org.hibernate.Hibernate; +import org.hibernate.LockMode; +import org.hibernate.Session; +import org.hibernate.SessionFactory; import org.hibernate.criterion.Order; import org.hibernate.engine.spi.EntityEntry; import org.hibernate.engine.spi.SessionImplementor; @@ -40,10 +40,20 @@ import org.hibernate.proxy.HibernateProxy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.core.convert.ConversionService; import org.springframework.transaction.support.TransactionSynchronizationManager; -import java.util.*; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.PersistentProperty; +import org.grails.datastore.mapping.model.config.GormProperties; +import org.grails.datastore.mapping.model.types.Association; +import org.grails.datastore.mapping.model.types.Embedded; +import org.grails.datastore.mapping.reflect.ClassUtils; +import org.grails.orm.hibernate.AbstractHibernateDatastore; +import org.grails.orm.hibernate.datasource.MultipleDataSourceSupport; +import org.grails.orm.hibernate.proxy.HibernateProxyHandler; +import org.grails.orm.hibernate.support.HibernateRuntimeUtils; /** * Utility methods for configuring Hibernate inside Grails. @@ -70,7 +80,6 @@ public class GrailsHibernateUtil extends HibernateRuntimeUtils { public static final String ARGUMENT_LOCK = "lock"; public static final Class[] EMPTY_CLASS_ARRAY = {}; - private static HibernateProxyHandler proxyHandler = new HibernateProxyHandler(); public static void populateArgumentsForCriteria(AbstractHibernateDatastore datastore, Class targetClass, Criteria c, Map argMap, ConversionService conversionService) { @@ -90,16 +99,16 @@ public static void populateArgumentsForCriteria(AbstractHibernateDatastore datas Integer maxParam = null; Integer offsetParam = null; if (argMap.containsKey(ARGUMENT_MAX)) { - maxParam = conversionService.convert(argMap.get(ARGUMENT_MAX),Integer.class); + maxParam = conversionService.convert(argMap.get(ARGUMENT_MAX), Integer.class); } if (argMap.containsKey(ARGUMENT_OFFSET)) { - offsetParam = conversionService.convert(argMap.get(ARGUMENT_OFFSET),Integer.class); + offsetParam = conversionService.convert(argMap.get(ARGUMENT_OFFSET), Integer.class); } if (argMap.containsKey(ARGUMENT_FETCH_SIZE)) { - c.setFetchSize(conversionService.convert(argMap.get(ARGUMENT_FETCH_SIZE),Integer.class)); + c.setFetchSize(conversionService.convert(argMap.get(ARGUMENT_FETCH_SIZE), Integer.class)); } if (argMap.containsKey(ARGUMENT_TIMEOUT)) { - c.setTimeout(conversionService.convert(argMap.get(ARGUMENT_TIMEOUT),Integer.class)); + c.setTimeout(conversionService.convert(argMap.get(ARGUMENT_TIMEOUT), Integer.class)); } if (argMap.containsKey(ARGUMENT_FLUSH_MODE)) { c.setFlushMode(convertFlushMode(argMap.get(ARGUMENT_FLUSH_MODE))); @@ -107,10 +116,10 @@ public static void populateArgumentsForCriteria(AbstractHibernateDatastore datas if (argMap.containsKey(ARGUMENT_READ_ONLY)) { c.setReadOnly(ClassUtils.getBooleanFromMap(ARGUMENT_READ_ONLY, argMap)); } - String orderParam = (String)argMap.get(ARGUMENT_ORDER); + String orderParam = (String) argMap.get(ARGUMENT_ORDER); Object fetchObj = argMap.get(ARGUMENT_FETCH); if (fetchObj instanceof Map) { - Map fetch = (Map)fetchObj; + Map fetch = (Map) fetchObj; for (Object o : fetch.keySet()) { String associationName = (String) o; c.setFetchMode(associationName, getFetchMode(fetch.get(associationName))); @@ -199,7 +208,7 @@ private static FlushMode convertFlushMode(Object object) { return null; } if (object instanceof FlushMode) { - return (FlushMode)object; + return (FlushMode) object; } return FlushMode.valueOf(String.valueOf(object)); } @@ -212,15 +221,15 @@ private static void addOrderPossiblyNested(AbstractHibernateDatastore datastore, if (firstDotPos == -1) { addOrder(c, sort, order, ignoreCase); } else { // nested property - String sortHead = sort.substring(0,firstDotPos); - String sortTail = sort.substring(firstDotPos+1); + String sortHead = sort.substring(0, firstDotPos); + String sortTail = sort.substring(firstDotPos + 1); PersistentProperty property = getGrailsDomainClassProperty(datastore, targetClass, sortHead); if (property instanceof Embedded) { // embedded objects cannot reference entities (at time of writing), so no more recursion needed addOrder(c, sort, order, ignoreCase); - } else if(property instanceof Association) { + } else if (property instanceof Association) { Criteria subCriteria = c.createCriteria(sortHead); - Class propertyTargetClass = ((Association)property).getAssociatedEntity().getJavaClass(); + Class propertyTargetClass = ((Association) property).getAssociatedEntity().getJavaClass(); GrailsHibernateUtil.cacheCriteriaByMapping(datastore, propertyTargetClass, subCriteria); addOrderPossiblyNested(datastore, subCriteria, propertyTargetClass, sortTail, order, ignoreCase); // Recurse on nested sort } @@ -244,9 +253,9 @@ private static void addOrder(Criteria c, String sort, String order, boolean igno * assuming targetClass corresponds to a GrailsDomainClass. */ private static PersistentProperty getGrailsDomainClassProperty(AbstractHibernateDatastore datastore, Class targetClass, String propertyName) { - PersistentEntity grailsClass = datastore != null ? datastore.getMappingContext().getPersistentEntity( targetClass.getName()) : null; + PersistentEntity grailsClass = datastore != null ? datastore.getMappingContext().getPersistentEntity(targetClass.getName()) : null; if (grailsClass == null) { - throw new IllegalArgumentException("Unexpected: class is not a domain class:"+targetClass.getName()); + throw new IllegalArgumentException("Unexpected: class is not a domain class:" + targetClass.getName()); } return grailsClass.getPropertyByName(propertyName); } @@ -296,11 +305,11 @@ public static FetchMode getFetchMode(Object object) { */ public static void setObjectToReadyOnly(Object target, SessionFactory sessionFactory) { Object resource = TransactionSynchronizationManager.getResource(sessionFactory); - if(resource != null) { + if (resource != null) { Session session = sessionFactory.getCurrentSession(); if (canModifyReadWriteState(session, target)) { if (target instanceof HibernateProxy) { - target = ((HibernateProxy)target).getHibernateLazyInitializer().getImplementation(); + target = ((HibernateProxy) target).getHibernateLazyInitializer().getImplementation(); } session.setReadOnly(target, true); session.setHibernateFlushMode(FlushMode.MANUAL); @@ -335,7 +344,7 @@ public static void setObjectToReadWrite(final Object target, SessionFactory sess Object actualTarget = target; if (target instanceof HibernateProxy) { - actualTarget = ((HibernateProxy)target).getHibernateLazyInitializer().getImplementation(); + actualTarget = ((HibernateProxy) target).getHibernateLazyInitializer().getImplementation(); } session.setReadOnly(actualTarget, false); @@ -349,7 +358,7 @@ public static void setObjectToReadWrite(final Object target, SessionFactory sess */ public static void incrementVersion(Object target) { MetaClass metaClass = GroovySystem.getMetaClassRegistry().getMetaClass(target.getClass()); - if (metaClass.hasProperty(target, GormProperties.VERSION)!=null) { + if (metaClass.hasProperty(target, GormProperties.VERSION) != null) { Object version = metaClass.getProperty(target, GormProperties.VERSION); if (version instanceof Long) { Long newVersion = (Long) version + 1; @@ -367,7 +376,7 @@ public static void incrementVersion(Object target) { @Deprecated public static void ensureCorrectGroovyMetaClass(Object target, Class persistentClass) { if (target instanceof GroovyObject) { - GroovyObject go = ((GroovyObject)target); + GroovyObject go = ((GroovyObject) target); if (!go.getMetaClass().getTheClass().equals(persistentClass)) { go.setMetaClass(GroovySystem.getMetaClassRegistry().getMetaClass(persistentClass)); } @@ -452,6 +461,4 @@ public static boolean isNotEmpty(final String string) { public static String unqualify(final String qualifiedName) { return StringHelper.unqualify(qualifiedName); } - - } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsIdentifierGeneratorFactory.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsIdentifierGeneratorFactory.java index eac6c6791ec..67a5da6b001 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsIdentifierGeneratorFactory.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/GrailsIdentifierGeneratorFactory.java @@ -23,11 +23,12 @@ import org.hibernate.cfg.Configuration; import org.hibernate.id.SequenceGenerator; import org.hibernate.id.factory.internal.DefaultIdentifierGeneratorFactory; + import org.springframework.util.ReflectionUtils; /** * Hibernate IdentifierGeneratorFactory that prefers sequence-identity generator over sequence generator - * + * * @author Lari Hotari */ public class GrailsIdentifierGeneratorFactory extends DefaultIdentifierGeneratorFactory { @@ -36,12 +37,12 @@ public class GrailsIdentifierGeneratorFactory extends DefaultIdentifierGenerator @Override public Class getIdentifierGeneratorClass(String strategy) { Class generatorClass = super.getIdentifierGeneratorClass(strategy); - if("native".equals(strategy) && generatorClass == SequenceGenerator.class) { + if ("native".equals(strategy) && generatorClass == SequenceGenerator.class) { generatorClass = super.getIdentifierGeneratorClass("sequence-identity"); } return generatorClass; } - + public static void applyNewInstance(Configuration cfg) throws IllegalArgumentException, IllegalAccessException { Field field = ReflectionUtils.findField(Configuration.class, "identifierGeneratorFactory"); field.setAccessible(true); diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy index 89703d55900..b7d7e55b00a 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingBuilder.groovy @@ -19,16 +19,16 @@ package org.grails.orm.hibernate.cfg import groovy.transform.CompileStatic -import org.grails.datastore.mapping.config.groovy.MappingConfigurationBuilder -import org.grails.datastore.mapping.model.config.GormProperties -import org.grails.datastore.mapping.reflect.ClassPropertyFetcher + +import jakarta.persistence.AccessType + import org.hibernate.FetchMode import org.slf4j.Logger import org.slf4j.LoggerFactory -import org.springframework.beans.MutablePropertyValues -import org.springframework.validation.DataBinder -import jakarta.persistence.AccessType +import org.grails.datastore.mapping.config.groovy.MappingConfigurationBuilder +import org.grails.datastore.mapping.model.config.GormProperties +import org.grails.datastore.mapping.reflect.ClassPropertyFetcher /** * Implements the ORM mapping DSL constructing a model that can be evaluated by the @@ -38,7 +38,7 @@ import jakarta.persistence.AccessType * @since 1.0 */ -class HibernateMappingBuilder implements MappingConfigurationBuilder{ +class HibernateMappingBuilder implements MappingConfigurationBuilder { private static final String INCLUDE_PARAM = 'include' private static final String EXCLUDE_PARAM = 'exclude' @@ -87,7 +87,7 @@ class HibernateMappingBuilder implements MappingConfigurationBuilderConfigures the second-level cache with the default usage of 'read-write' and the default include of 'all' if * the passed argument is true @@ -372,7 +371,7 @@ class HibernateMappingBuilder implements MappingConfigurationBuilder constraintsToImports = ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy((Class)args[0], GormProperties.CONSTRAINTS, Closure) - if(constraintsToImports) { + List constraintsToImports = ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy((Class) args[0], GormProperties.CONSTRAINTS, Closure) + if (constraintsToImports) { List originalIncludes = this.methodMissingIncludes List originalExludes = this.methodMissingExcludes try { - if(args[-1] instanceof Map) { + if (args[-1] instanceof Map) { Map argMap = (Map) args[-1] def includes = argMap.get(INCLUDE_PARAM) def excludes = argMap.get(EXCLUDE_PARAM) - if(includes instanceof List) { + if (includes instanceof List) { this.methodMissingIncludes = includes } - if(excludes instanceof List) { + if (excludes instanceof List) { this.methodMissingExcludes = excludes } } - for(Closure callable in constraintsToImports) { + for (Closure callable in constraintsToImports) { callable.setDelegate(this) callable.setResolveStrategy(Closure.DELEGATE_ONLY) callable.call() diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java index 20fd322c276..d69c5e234aa 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContext.java @@ -18,23 +18,34 @@ */ package org.grails.orm.hibernate.cfg; -import grails.gorm.annotation.Entity; -import grails.gorm.hibernate.HibernateEntity; +import java.lang.annotation.Annotation; + import groovy.lang.Closure; import groovy.lang.GroovyObject; + +import org.springframework.validation.Errors; + +import grails.gorm.annotation.Entity; +import grails.gorm.hibernate.HibernateEntity; import org.grails.datastore.gorm.GormEntity; import org.grails.datastore.mapping.config.AbstractGormMappingFactory; import org.grails.datastore.mapping.config.Property; import org.grails.datastore.mapping.config.groovy.MappingConfigurationBuilder; -import org.grails.datastore.mapping.model.*; +import org.grails.datastore.mapping.model.AbstractMappingContext; +import org.grails.datastore.mapping.model.ClassMapping; +import org.grails.datastore.mapping.model.DatastoreConfigurationException; +import org.grails.datastore.mapping.model.EmbeddedPersistentEntity; +import org.grails.datastore.mapping.model.IdentityMapping; +import org.grails.datastore.mapping.model.MappingConfigurationStrategy; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.MappingFactory; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.ValueGenerator; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.datastore.mapping.model.config.JpaMappingConfigurationStrategy; import org.grails.datastore.mapping.reflect.ClassUtils; import org.grails.orm.hibernate.connections.HibernateConnectionSourceSettings; import org.grails.orm.hibernate.proxy.HibernateProxyHandler; -import org.springframework.validation.Errors; - -import java.lang.annotation.Annotation; /** * A Mapping context for Hibernate @@ -55,13 +66,13 @@ public class HibernateMappingContext extends AbstractMappingContext { * @param contextObject The context object (for example a Spring ApplicationContext) * @param persistentClasses The persistent classes */ - public HibernateMappingContext(HibernateConnectionSourceSettings settings, Object contextObject, Class...persistentClasses) { + public HibernateMappingContext(HibernateConnectionSourceSettings settings, Object contextObject, Class... persistentClasses) { this.mappingFactory = new HibernateMappingFactory(); // The mapping factory needs to be configured before initialize can be safely called initialize(settings); - if(settings != null) { + if (settings != null) { this.mappingFactory.setDefaultMapping(settings.getDefault().getMapping()); this.mappingFactory.setDefaultConstraints(settings.getDefault().getConstraints()); } @@ -76,7 +87,7 @@ protected boolean supportsCustomType(Class propertyType) { addPersistentEntities(persistentClasses); } - public HibernateMappingContext(HibernateConnectionSourceSettings settings, Class...persistentClasses) { + public HibernateMappingContext(HibernateConnectionSourceSettings settings, Class... persistentClasses) { this(settings, null, persistentClasses); } @@ -105,9 +116,9 @@ public MappingFactory getMappingFactory() { @Override protected PersistentEntity createPersistentEntity(Class javaClass) { - if(GormEntity.class.isAssignableFrom(javaClass)) { + if (GormEntity.class.isAssignableFrom(javaClass)) { Object mappingStrategy = resolveMappingStrategy(javaClass); - if(isValidMappingStrategy(javaClass, mappingStrategy)) { + if (isValidMappingStrategy(javaClass, mappingStrategy)) { return new HibernatePersistentEntity(javaClass, this); } } @@ -129,7 +140,7 @@ public static boolean isDomainClass(Class clazz) { } private static boolean doIsDomainClassCheck(Class clazz) { - if(GormEntity.class.isAssignableFrom(clazz)) { + if (GormEntity.class.isAssignableFrom(clazz)) { return true; } @@ -192,10 +203,12 @@ public PersistentEntity getPersistentEntity(String name) { static class HibernateEmbeddedPersistentEntity extends EmbeddedPersistentEntity { private final ClassMapping classMapping; + public HibernateEmbeddedPersistentEntity(Class type, MappingContext ctx) { super(type, ctx); - this.classMapping = new ClassMapping() { + this.classMapping = new ClassMapping<>() { Mapping mappedForm = (Mapping) context.getMappingFactory().createMappedForm(HibernateEmbeddedPersistentEntity.this); + @Override public PersistentEntity getEntity() { return HibernateEmbeddedPersistentEntity.this; @@ -219,7 +232,7 @@ public ClassMapping getMapping() { } } - class HibernateMappingFactory extends AbstractGormMappingFactory { + class HibernateMappingFactory extends AbstractGormMappingFactory { public HibernateMappingFactory() { } @@ -234,19 +247,19 @@ public IdentityMapping createIdentityMapping(final ClassMapping classMapping) { final Mapping mappedForm = createMappedForm(classMapping.getEntity()); final Object identity = mappedForm.getIdentity(); final ValueGenerator generator; - if(identity instanceof Identity) { + if (identity instanceof Identity) { Identity id = (Identity) identity; String generatorName = id.getGenerator(); - if(generatorName != null) { + if (generatorName != null) { ValueGenerator resolvedGenerator; try { resolvedGenerator = ValueGenerator.valueOf(generatorName.toUpperCase(java.util.Locale.ENGLISH)); } catch (IllegalArgumentException e) { - if(ClassUtils.isPresent(generatorName)) { + if (ClassUtils.isPresent(generatorName)) { resolvedGenerator = ValueGenerator.CUSTOM; } else { - throw new DatastoreConfigurationException("Invalid id generation strategy for entity ["+classMapping.getEntity().getName()+"]: " + generatorName); + throw new DatastoreConfigurationException("Invalid id generation strategy for entity [" + classMapping.getEntity().getName() + "]: " + generatorName); } } generator = resolvedGenerator; @@ -261,16 +274,16 @@ public IdentityMapping createIdentityMapping(final ClassMapping classMapping) { return new IdentityMapping() { @Override public String[] getIdentifierName() { - if(identity instanceof Identity) { + if (identity instanceof Identity) { final String name = ((Identity) identity).getName(); - if(name != null) { + if (name != null) { return new String[]{name}; } else { return DEFAULT_IDENTITY_MAPPING; } } - else if(identity instanceof CompositeIdentity) { + else if (identity instanceof CompositeIdentity) { return ((CompositeIdentity) identity).getPropertyNames(); } return DEFAULT_IDENTITY_MAPPING; diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java index a9fa201954d..16e1185d3f6 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernateMappingContextConfiguration.java @@ -19,17 +19,23 @@ package org.grails.orm.hibernate.cfg; -import org.grails.datastore.gorm.GormEntity; -import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings; -import org.grails.datastore.gorm.validation.jakarta.JakartaValidatorRegistry; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.validation.ValidatorRegistry; -import org.grails.orm.hibernate.EventListenerIntegrator; -import org.grails.orm.hibernate.GrailsSessionContext; -import org.grails.orm.hibernate.HibernateEventListeners; -import org.grails.orm.hibernate.MetadataIntegrator; -import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import javax.sql.DataSource; + +import jakarta.persistence.Embeddable; +import jakarta.persistence.Entity; +import jakarta.persistence.MappedSuperclass; + import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.SessionFactory; @@ -50,6 +56,7 @@ import org.hibernate.property.access.spi.PropertyAccessStrategy; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.spi.ServiceRegistryImplementor; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; @@ -64,12 +71,15 @@ import org.springframework.core.type.filter.TypeFilter; import org.springframework.util.ClassUtils; -import jakarta.persistence.Embeddable; -import jakarta.persistence.Entity; -import jakarta.persistence.MappedSuperclass; -import javax.sql.DataSource; -import java.io.IOException; -import java.util.*; +import org.grails.datastore.gorm.GormEntity; +import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.orm.hibernate.EventListenerIntegrator; +import org.grails.orm.hibernate.GrailsSessionContext; +import org.grails.orm.hibernate.HibernateEventListeners; +import org.grails.orm.hibernate.MetadataIntegrator; +import org.grails.orm.hibernate.access.TraitPropertyAccessStrategy; /** * A Configuration that uses a MappingContext to configure Hibernate @@ -82,9 +92,10 @@ public class HibernateMappingContextConfiguration extends Configuration implemen private static final String RESOURCE_PATTERN = "/**/*.class"; private static final TypeFilter[] ENTITY_TYPE_FILTERS = new TypeFilter[] { - new AnnotationTypeFilter(Entity.class, false), - new AnnotationTypeFilter(Embeddable.class, false), - new AnnotationTypeFilter(MappedSuperclass.class, false)}; + new AnnotationTypeFilter(Entity.class, false), + new AnnotationTypeFilter(Embeddable.class, false), + new AnnotationTypeFilter(MappedSuperclass.class, false) + }; protected String sessionFactoryBeanName = "sessionFactory"; protected String dataSourceName = ConnectionSource.DEFAULT; @@ -107,7 +118,7 @@ public void setApplicationContext(ApplicationContext applicationContext) throws String dsName = ConnectionSource.DEFAULT.equals(dataSourceName) ? "dataSource" : "dataSource_" + dataSourceName; Properties properties = getProperties(); - if(applicationContext.containsBean(dsName)) { + if (applicationContext.containsBean(dsName)) { properties.put(Environment.DATASOURCE, applicationContext.getBean(dsName)); } properties.put(Environment.CURRENT_SESSION_CONTEXT_CLASS, currentSessionContext.getName()); @@ -228,7 +239,7 @@ public SessionFactory buildSessionFactory() throws HibernateException { Object classLoaderObject = getProperties().get(AvailableSettings.CLASSLOADERS); ClassLoader appClassLoader; - if(classLoaderObject instanceof ClassLoader) { + if (classLoaderObject instanceof ClassLoader) { appClassLoader = (ClassLoader) classLoaderObject; } else { @@ -246,26 +257,26 @@ public SessionFactory buildSessionFactory() throws HibernateException { List annotatedClasses = new ArrayList<>(); for (PersistentEntity persistentEntity : hibernateMappingContext.getPersistentEntities()) { Class javaClass = persistentEntity.getJavaClass(); - if(javaClass.isAnnotationPresent(Entity.class)) { + if (javaClass.isAnnotationPresent(Entity.class)) { annotatedClasses.add(javaClass); } } - if(!additionalClasses.isEmpty()) { + if (!additionalClasses.isEmpty()) { for (Class additionalClass : additionalClasses) { - if(GormEntity.class.isAssignableFrom(additionalClass)) { + if (GormEntity.class.isAssignableFrom(additionalClass)) { hibernateMappingContext.addPersistentEntity(additionalClass); } } } - addAnnotatedClasses( annotatedClasses.toArray(new Class[annotatedClasses.size()])); + addAnnotatedClasses(annotatedClasses.toArray(new Class[annotatedClasses.size()])); ClassLoaderService classLoaderService = new ClassLoaderServiceImpl(appClassLoader) { @Override public Collection loadJavaServices(Class serviceContract) { - if(MetadataContributor.class.isAssignableFrom(serviceContract)) { - if(metadataContributor != null) { + if (MetadataContributor.class.isAssignableFrom(serviceContract)) { + if (metadataContributor != null) { return (Collection) Arrays.asList(domainBinder, metadataContributor); } else { @@ -291,10 +302,12 @@ public Collection loadJavaServices(Class serviceContract) { setSessionFactoryObserver(new SessionFactoryObserver() { private static final long serialVersionUID = 1; + public void sessionFactoryCreated(SessionFactory factory) {} + public void sessionFactoryClosed(SessionFactory factory) { if (serviceRegistry != null) { - ((ServiceRegistryImplementor)serviceRegistry).destroy(); + ((ServiceRegistryImplementor) serviceRegistry).destroy(); } } }); @@ -348,7 +361,6 @@ public ServiceRegistry getServiceRegistry() { return serviceRegistry; } - @Override protected void reset() { super.reset(); diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernatePersistentEntity.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernatePersistentEntity.java index a1f5b54e093..fad837c38f1 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernatePersistentEntity.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/HibernatePersistentEntity.java @@ -18,7 +18,11 @@ */ package org.grails.orm.hibernate.cfg; -import org.grails.datastore.mapping.model.*; +import org.grails.datastore.mapping.model.AbstractClassMapping; +import org.grails.datastore.mapping.model.AbstractPersistentEntity; +import org.grails.datastore.mapping.model.ClassMapping; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.PersistentEntity; /** * Persistent entity implementation for Hibernate @@ -29,14 +33,12 @@ public class HibernatePersistentEntity extends AbstractPersistentEntity { private final AbstractClassMapping classMapping; - public HibernatePersistentEntity(Class javaClass, final MappingContext context) { super(javaClass, context); - - - this.classMapping = new AbstractClassMapping(this, context) { + this.classMapping = new AbstractClassMapping<>(this, context) { Mapping mappedForm = (Mapping) context.getMappingFactory().createMappedForm(HibernatePersistentEntity.this); + @Override public PersistentEntity getEntity() { return HibernatePersistentEntity.this; @@ -55,7 +57,6 @@ protected boolean includeIdentifiers() { return true; } - @Override public ClassMapping getMapping() { return this.classMapping; diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Identity.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Identity.groovy index 8c845acb183..2356838a4cc 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Identity.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Identity.groovy @@ -21,10 +21,12 @@ package org.grails.orm.hibernate.cfg import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy -import org.grails.datastore.mapping.config.Property + import org.springframework.beans.MutablePropertyValues import org.springframework.validation.DataBinder +import org.grails.datastore.mapping.config.Property + /** * Defines the identity generation strategy. In the case of a 'composite' identity the properties * array defines the property names that formulate the composite id. @@ -35,6 +37,7 @@ import org.springframework.validation.DataBinder @CompileStatic @Builder(builderStrategy = SimpleStrategy, prefix = '') class Identity extends Property { + /** * The generator to use */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/IdentityEnumType.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/IdentityEnumType.java index c242b37f16a..0b56d2016ea 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/IdentityEnumType.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/IdentityEnumType.java @@ -18,6 +18,18 @@ */ package org.grails.orm.hibernate.cfg; +import java.io.Serializable; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.Map; +import java.util.Properties; + import org.hibernate.HibernateException; import org.hibernate.MappingException; import org.hibernate.engine.spi.SharedSessionContractImplementor; @@ -28,14 +40,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.*; - /** * Hibernate Usertype that enum values by their ID. * @@ -59,7 +63,7 @@ public class IdentityEnumType implements UserType, ParameterizedType, Serializab protected Class> enumClass; protected BidiEnumMap bidiMap; protected AbstractStandardBasicType type; - protected int[] sqlTypes; + protected int[] sqlTypes; public static BidiEnumMap getBidiEnumMap(Class> cls) throws IllegalAccessException, NoSuchMethodException, InvocationTargetException { BidiEnumMap m = ENUM_MAPPINGS.get(cls); @@ -77,17 +81,16 @@ public static BidiEnumMap getBidiEnumMap(Class> cls) throws Il return m; } - @SuppressWarnings("unchecked") public void setParameterValues(Properties properties) { try { - enumClass = (Class>)Thread.currentThread().getContextClassLoader().loadClass( - (String)properties.get(PARAM_ENUM_CLASS)); + enumClass = (Class>) Thread.currentThread().getContextClassLoader().loadClass( + (String) properties.get(PARAM_ENUM_CLASS)); if (LOG.isDebugEnabled()) { LOG.debug(String.format("Building ID-mapping for Enum Class %s", enumClass.getName())); } bidiMap = getBidiEnumMap(enumClass); - type = (AbstractStandardBasicType)typeConfiguration.getBasicTypeRegistry().getRegisteredType(bidiMap.keyType.getName()); + type = (AbstractStandardBasicType) typeConfiguration.getBasicTypeRegistry().getRegisteredType(bidiMap.keyType.getName()); if (LOG.isDebugEnabled()) { LOG.debug(String.format("Mapped Basic Type is %s", type)); } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/InstanceProxy.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/InstanceProxy.groovy index c647c43d393..bed30aed4b4 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/InstanceProxy.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/InstanceProxy.groovy @@ -25,6 +25,7 @@ import org.grails.orm.hibernate.AbstractHibernateGormValidationApi @CompileStatic class InstanceProxy { + protected instance protected AbstractHibernateGormValidationApi validateApi protected AbstractHibernateGormInstanceApi instanceApi @@ -36,27 +37,27 @@ class InstanceProxy { this.instanceApi = instanceApi this.validateApi = validateApi validateMethods = validateApi.methods*.name as Set - validateMethods.remove 'getValidator' - validateMethods.remove 'setValidator' - validateMethods.remove 'getBeforeValidateHelper' - validateMethods.remove 'setBeforeValidateHelper' - validateMethods.remove 'getValidateMethod' - validateMethods.remove 'setValidateMethod' + validateMethods.remove('getValidator') + validateMethods.remove('setValidator') + validateMethods.remove('getBeforeValidateHelper') + validateMethods.remove('setBeforeValidateHelper') + validateMethods.remove('getValidateMethod') + validateMethods.remove('setValidateMethod') } def invokeMethod(String name, args) { if (validateMethods.contains(name)) { - validateApi.invokeMethod(name, prependToArray(instance, (Object[])args)) + validateApi.invokeMethod(name, prependToArray(instance, (Object[]) args)) } else { - instanceApi.invokeMethod(name, prependToArray(instance, (Object[])args)) + instanceApi.invokeMethod(name, prependToArray(instance, (Object[]) args)) } } private final static Object[] prependToArray(Object item, Object[] array) { def list = new ArrayList(array.length + 1) - list.add item - list.addAll array + list.add(item) + list.addAll(array) list as Object[] } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/JoinTable.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/JoinTable.groovy index c4bef8eba10..c3bc008128f 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/JoinTable.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/JoinTable.groovy @@ -34,6 +34,7 @@ import groovy.transform.builder.SimpleStrategy @Builder(builderStrategy = SimpleStrategy, prefix = '') @CompileStatic class JoinTable extends Table { + /** * The foreign key column */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Mapping.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Mapping.groovy index d6fca255dbc..c45f11d9cda 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Mapping.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Mapping.groovy @@ -22,11 +22,13 @@ import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + +import org.springframework.beans.MutablePropertyValues +import org.springframework.validation.DataBinder + import org.grails.datastore.mapping.config.Entity import org.grails.datastore.mapping.config.Property import org.grails.datastore.mapping.model.config.GormProperties -import org.springframework.beans.MutablePropertyValues -import org.springframework.validation.DataBinder /** * Models the mapping from GORM classes to the db. @@ -52,7 +54,7 @@ class Mapping extends Entity { return null } - return type instanceof Class ? ((Class)type).name : type.toString() + return type instanceof Class ? ((Class) type).name : type.toString() } /** @@ -141,7 +143,6 @@ class Mapping extends Entity { */ String comment - boolean isTablePerConcreteClass() { return tablePerConcreteClass } @@ -193,8 +194,8 @@ class Mapping extends Entity { */ @Override Mapping id(Map identityConfig) { - if(identity instanceof Identity) { - Identity.configureExisting((Identity)identity, identityConfig) + if (identity instanceof Identity) { + Identity.configureExisting((Identity) identity, identityConfig) } return this } @@ -205,8 +206,8 @@ class Mapping extends Entity { */ @Override Mapping id(@DelegatesTo(Identity) Closure identityConfig) { - if(identity instanceof Identity) { - Identity.configureExisting((Identity)identity, identityConfig) + if (identity instanceof Identity) { + Identity.configureExisting((Identity) identity, identityConfig) } return this } @@ -228,7 +229,7 @@ class Mapping extends Entity { * @return This mapping */ Mapping cache(@DelegatesTo(CacheConfig) Closure cacheConfig) { - if(this.cache == null) { + if (this.cache == null) { this.cache = new CacheConfig() } CacheConfig.configureExisting(cache, cacheConfig) @@ -241,7 +242,7 @@ class Mapping extends Entity { * @return This mapping */ Mapping cache(Map cacheConfig) { - if(this.cache == null) { + if (this.cache == null) { this.cache = new CacheConfig() } CacheConfig.configureExisting(cache, cacheConfig) @@ -254,7 +255,7 @@ class Mapping extends Entity { * @return This mapping */ Mapping cache(String usage) { - if(this.cache == null) { + if (this.cache == null) { this.cache = new CacheConfig() } this.cache.usage = usage @@ -262,7 +263,6 @@ class Mapping extends Entity { return this } - /** * Configures sorting * @param name The name @@ -270,7 +270,7 @@ class Mapping extends Entity { * @return This mapping */ Mapping sort(String name, String direction) { - if(name && direction) { + if (name && direction) { this.sort.name = name this.sort.direction = direction } @@ -284,7 +284,7 @@ class Mapping extends Entity { * @return This mapping */ Mapping sort(Map nameAndDirections) { - if(nameAndDirections) { + if (nameAndDirections) { this.sort.namesAndDirections = nameAndDirections } return this @@ -296,7 +296,7 @@ class Mapping extends Entity { * @return This mapping */ Mapping discriminator(@DelegatesTo(DiscriminatorConfig) Closure discriminatorDef) { - if(discriminator == null) { + if (discriminator == null) { discriminator = new DiscriminatorConfig() } discriminatorDef.setDelegate(discriminator) @@ -311,7 +311,7 @@ class Mapping extends Entity { * @return This mapping */ Mapping discriminator(String value) { - if(discriminator == null) { + if (discriminator == null) { discriminator = new DiscriminatorConfig() } discriminator.value = value @@ -324,28 +324,28 @@ class Mapping extends Entity { * @return This mapping */ Mapping discriminator(Map args) { - if(args != null) { - if(discriminator == null) { + if (args != null) { + if (discriminator == null) { discriminator = new DiscriminatorConfig() } String value = args.remove('value')?.toString() discriminator.value = value if (args.column instanceof String) { - discriminator.column = new ColumnConfig(name:args.column.toString()) + discriminator.column = new ColumnConfig(name: args.column.toString()) } else if (args.column instanceof Map) { ColumnConfig config = new ColumnConfig() DataBinder dataBinder = new DataBinder(config) - dataBinder.bind(new MutablePropertyValues((Map)args.column)) + dataBinder.bind(new MutablePropertyValues((Map) args.column)) discriminator.column = config } discriminator.type(args.remove('type')) - if(args.containsKey('insert')) { - discriminator.insertable( args.remove('insert') as Boolean ) + if (args.containsKey('insert')) { + discriminator.insertable(args.remove('insert') as Boolean) } - if(args.containsKey('insertable')) { - discriminator.insertable( args.remove('insertable') as Boolean ) + if (args.containsKey('insertable')) { + discriminator.insertable(args.remove('insertable') as Boolean) } discriminator.formula(args.remove('formula')?.toString()) } @@ -359,7 +359,7 @@ class Mapping extends Entity { */ CompositeIdentity composite(String...propertyNames) { identity = new CompositeIdentity(propertyNames: propertyNames) - return (CompositeIdentity)identity + return (CompositeIdentity) identity } /** @@ -397,11 +397,10 @@ class Mapping extends Entity { @CompileStatic Mapping version(String versionColumn) { PropertyConfig pc = getOrInitializePropertyConfig(GormProperties.VERSION) - pc.columns << new ColumnConfig(name:versionColumn) + pc.columns << new ColumnConfig(name: versionColumn) return this } - /** * Configure a property * @param name The name of the property @@ -436,7 +435,7 @@ class Mapping extends Entity { */ @Override PropertyConfig property(@DelegatesTo(PropertyConfig) Closure propertyConfig) { - if(columns.containsKey('*')) { + if (columns.containsKey('*')) { PropertyConfig cloned = cloneGlobalConstraint() return PropertyConfig.configureExisting(cloned, propertyConfig) } @@ -462,8 +461,8 @@ class Mapping extends Entity { * @return This mapping */ @Override - PropertyConfig property( Map propertyConfig) { - if(columns.containsKey('*')) { + PropertyConfig property(Map propertyConfig) { + if (columns.containsKey('*')) { // apply global constraints constraints PropertyConfig cloned = cloneGlobalConstraint() return PropertyConfig.configureExisting(cloned, propertyConfig) @@ -512,11 +511,11 @@ class Mapping extends Entity { @Override def propertyMissing(String name, Object val) { - if(val instanceof Closure) { - property(name, (Closure)val) + if (val instanceof Closure) { + property(name, (Closure) val) } - else if(val instanceof PropertyConfig) { - columns[name] =((PropertyConfig)val) + else if (val instanceof PropertyConfig) { + columns[name] = ((PropertyConfig) val) } else { throw new MissingPropertyException(name, Mapping) @@ -526,20 +525,20 @@ class Mapping extends Entity { @CompileDynamic @Override def methodMissing(String name, Object args) { - if(args && args.getClass().isArray()) { - if(args[0] instanceof Closure) { - property(name, (Closure)args[0]) + if (args && args.getClass().isArray()) { + if (args[0] instanceof Closure) { + property(name, (Closure) args[0]) } - else if(args[0] instanceof PropertyConfig) { - columns[name] = (PropertyConfig)args[0] + else if (args[0] instanceof PropertyConfig) { + columns[name] = (PropertyConfig) args[0] } - else if(args[0] instanceof Map) { + else if (args[0] instanceof Map) { PropertyConfig property = getOrInitializePropertyConfig(name) Map namedArgs = (Map) args[0] - if(args[-1] instanceof Closure) { + if (args[-1] instanceof Closure) { PropertyConfig.configureExisting( property, - ((Closure)args[-1]) + ((Closure) args[-1]) ) } @@ -557,12 +556,12 @@ class Mapping extends Entity { @Override protected PropertyConfig getOrInitializePropertyConfig(String name) { PropertyConfig pc = columns[name] - if(pc == null && columns.containsKey('*')) { + if (pc == null && columns.containsKey('*')) { // apply global constraints constraints PropertyConfig globalConstraints = columns.get('*') - if(globalConstraints != null) { - pc = (PropertyConfig)globalConstraints.clone() - if(pc.columns.size() == 1) { + if (globalConstraints != null) { + pc = (PropertyConfig) globalConstraints.clone() + if (pc.columns.size() == 1) { pc.firstColumnIsColumnCopy = true } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/NaturalId.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/NaturalId.groovy index 6eb401b4048..ff0d6f25d4e 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/NaturalId.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/NaturalId.groovy @@ -29,6 +29,7 @@ import groovy.transform.builder.SimpleStrategy @CompileStatic @Builder(builderStrategy = SimpleStrategy, prefix = '') class NaturalId { + /** * The property names that make up the natural id */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyConfig.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyConfig.groovy index 79fd0f717cb..763d0d0f556 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyConfig.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyConfig.groovy @@ -22,12 +22,15 @@ import groovy.transform.CompileStatic import groovy.transform.PackageScope import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy -import org.grails.datastore.mapping.config.Property + +import jakarta.persistence.FetchType + import org.hibernate.FetchMode + import org.springframework.beans.MutablePropertyValues import org.springframework.validation.DataBinder -import jakarta.persistence.FetchType +import org.grails.datastore.mapping.config.Property /** * Custom mapping for a single domain property. Note that a property @@ -48,7 +51,7 @@ class PropertyConfig extends Property { // Whether the first column is created from cloning this instance boolean firstColumnIsColumnCopy = false - boolean explicitSaveUpdateCascade; + boolean explicitSaveUpdateCascade /** * The Hibernate type or user type of the property. This can be @@ -67,7 +70,6 @@ class PropertyConfig extends Property { */ String sort - /** * The default sort order */ @@ -78,7 +80,6 @@ class PropertyConfig extends Property { */ Integer batchSize - /** * Whether to ignore ObjectNotFoundException */ @@ -124,12 +125,12 @@ class PropertyConfig extends Property { * @return This property config */ PropertyConfig column(@DelegatesTo(ColumnConfig) Closure columnDef) { - if(columns.size() == 1 && firstColumnIsColumnCopy) { + if (columns.size() == 1 && firstColumnIsColumnCopy) { firstColumnIsColumnCopy = false ColumnConfig.configureExisting(columns[0], columnDef) } else { - columns.add( ColumnConfig.configureNew(columnDef) ) + columns.add(ColumnConfig.configureNew(columnDef)) } return this } @@ -139,13 +140,13 @@ class PropertyConfig extends Property { * @param columnDef The column definition * @return This property config */ - PropertyConfig column( Map columnDef ) { - if(columns.size() == 1 && firstColumnIsColumnCopy) { + PropertyConfig column(Map columnDef) { + if (columns.size() == 1 && firstColumnIsColumnCopy) { firstColumnIsColumnCopy = false ColumnConfig.configureExisting(columns[0], columnDef) } else { - columns.add( ColumnConfig.configureNew(columnDef) ) + columns.add(ColumnConfig.configureNew(columnDef)) } return this } @@ -155,13 +156,13 @@ class PropertyConfig extends Property { * @param columnDef The column definition * @return This property config */ - PropertyConfig column( String columnDef ) { - if(columns.size() == 1 && firstColumnIsColumnCopy) { + PropertyConfig column(String columnDef) { + if (columns.size() == 1 && firstColumnIsColumnCopy) { firstColumnIsColumnCopy = false columns[0].name = columnDef } else { - columns.add( ColumnConfig.configureNew(name: columnDef) ) + columns.add(ColumnConfig.configureNew(name: columnDef)) } return this } @@ -176,7 +177,7 @@ class PropertyConfig extends Property { * @return This mapping */ PropertyConfig cache(@DelegatesTo(CacheConfig) Closure cacheConfig) { - if(this.cache == null) { + if (this.cache == null) { this.cache = new CacheConfig() } CacheConfig.configureExisting(cache, cacheConfig) @@ -189,7 +190,7 @@ class PropertyConfig extends Property { * @return This mapping */ PropertyConfig cache(Map cacheConfig) { - if(this.cache == null) { + if (this.cache == null) { this.cache = new CacheConfig() } CacheConfig.configureExisting(cache, cacheConfig) @@ -220,7 +221,7 @@ class PropertyConfig extends Property { @Override void setUnique(boolean unique) { super.setUnique(unique) - if(columns.size() == 1) { + if (columns.size() == 1) { columns[0].unique = unique } } @@ -230,10 +231,10 @@ class PropertyConfig extends Property { PropertyConfig joinTable(Map joinTableDef) { DataBinder dataBinder = new DataBinder(joinTable) dataBinder.bind(new MutablePropertyValues(joinTableDef)) - if(joinTableDef.key) { + if (joinTableDef.key) { joinTable.key(joinTableDef.key.toString()) } - if(joinTableDef.column) { + if (joinTableDef.column) { joinTable.column(joinTableDef.column.toString()) } return this @@ -243,7 +244,7 @@ class PropertyConfig extends Property { * @param fetch The Hibernate {@link FetchMode} */ void setFetch(FetchMode fetch) { - if(FetchMode.JOIN.equals(fetch)) { + if (FetchMode.JOIN.equals(fetch)) { super.setFetchStrategy(FetchType.EAGER) } else { @@ -256,7 +257,7 @@ class PropertyConfig extends Property { */ FetchMode getFetchMode() { FetchType strategy = super.getFetchStrategy() - if(strategy == null) { + if (strategy == null) { return FetchMode.DEFAULT } switch (strategy) { @@ -292,7 +293,6 @@ class PropertyConfig extends Property { return configureExisting(property, config) } - /** * Configures a new PropertyConfig instance * @@ -320,9 +320,9 @@ class PropertyConfig extends Property { } else { cc = new ColumnConfig() - property.columns.add cc + property.columns.add(cc) } - if(config.column) { + if (config.column) { config.name = config.column } ColumnConfig.configureExisting(cc, config) @@ -349,13 +349,13 @@ class PropertyConfig extends Property { */ String getColumn() { checkHasSingleColumn() - if(columns.isEmpty()) return null + if (columns.isEmpty()) return null return columns[0].name } String getEnumType() { checkHasSingleColumn() - if(columns.isEmpty()) return "default" + if (columns.isEmpty()) return 'default' return columns[0].enumType } @@ -366,7 +366,7 @@ class PropertyConfig extends Property { */ String getSqlType() { checkHasSingleColumn() - if(columns.isEmpty()) return null + if (columns.isEmpty()) return null return columns[0].sqlType } @@ -377,7 +377,7 @@ class PropertyConfig extends Property { */ String getIndexName() { checkHasSingleColumn() - if(columns.isEmpty()) return null + if (columns.isEmpty()) return null return columns[0].index?.toString() } @@ -388,11 +388,11 @@ class PropertyConfig extends Property { * column. */ boolean isUnique() { - if(columns.size()>1) { + if (columns.size() > 1) { return super.isUnique() } else { - if(columns.isEmpty()) return super.isUnique() + if (columns.isEmpty()) return super.isUnique() return columns[0].unique } } @@ -404,7 +404,7 @@ class PropertyConfig extends Property { */ int getLength() { checkHasSingleColumn() - if(columns.isEmpty()) return -1 + if (columns.isEmpty()) return -1 return columns[0].length } @@ -415,7 +415,7 @@ class PropertyConfig extends Property { */ int getPrecision() { checkHasSingleColumn() - if(columns.isEmpty()) return -1 + if (columns.isEmpty()) return -1 return columns[0].precision } @@ -426,7 +426,7 @@ class PropertyConfig extends Property { */ int getScale() { checkHasSingleColumn() - if(columns.isEmpty()) { + if (columns.isEmpty()) { return super.getScale() } return columns[0].scale @@ -435,7 +435,7 @@ class PropertyConfig extends Property { @Override void setScale(int scale) { checkHasSingleColumn() - if(!columns.isEmpty()) { + if (!columns.isEmpty()) { columns[0].scale = scale } else { @@ -449,25 +449,25 @@ class PropertyConfig extends Property { protected void checkHasSingleColumn() { if (columns?.size() > 1) { - throw new RuntimeException("Cannot treat multi-column property as a single-column property") + throw new RuntimeException('Cannot treat multi-column property as a single-column property') } } @Override PropertyConfig clone() throws CloneNotSupportedException { - PropertyConfig pc = (PropertyConfig)super.clone() + PropertyConfig pc = (PropertyConfig) super.clone() pc.fetch = fetchMode - pc.indexColumn = indexColumn != null ? (PropertyConfig)indexColumn.clone() : null + pc.indexColumn = indexColumn != null ? (PropertyConfig) indexColumn.clone() : null pc.cache = cache != null ? cache.clone() : cache pc.joinTable = joinTable.clone() - if(typeParams != null) { + if (typeParams != null) { pc.typeParams = new Properties(typeParams) } List newColumns = new ArrayList(columns.size()) pc.columns = newColumns - for(c in columns) { + for (c in columns) { newColumns.add(c.clone()) } return pc diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyDefinitionDelegate.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyDefinitionDelegate.groovy index 29e538f19a7..0199bb608c7 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyDefinitionDelegate.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/PropertyDefinitionDelegate.groovy @@ -20,6 +20,7 @@ package org.grails.orm.hibernate.cfg import groovy.transform.CompileStatic + import org.grails.datastore.mapping.model.DatastoreConfigurationException /** @@ -35,6 +36,7 @@ import org.grails.datastore.mapping.model.DatastoreConfigurationException */ @CompileStatic class PropertyDefinitionDelegate { + PropertyConfig config private int index = 0 @@ -45,13 +47,13 @@ class PropertyDefinitionDelegate { ColumnConfig column(Map args) { // Check that this column has a name - if (!args["name"]) { - throw new DatastoreConfigurationException("Column definition must have a name!") + if (!args['name']) { + throw new DatastoreConfigurationException('Column definition must have a name!') } // Create a new column configuration based on the mapping for this column. ColumnConfig column - if(index < config.columns.size()) { + if (index < config.columns.size()) { // configure existing column = config.columns[0] } @@ -60,14 +62,14 @@ class PropertyDefinitionDelegate { // Append the new column configuration to the property config. config.columns << column } - column.name = args["name"] - column.sqlType = args["sqlType"] - column.enumType = args["enumType"] ?: column.enumType - column.index = args["index"] - column.unique = args["unique"] ?: false - column.length = args["length"] ? args["length"] as Integer : -1 - column.precision = args["precision"] ? args["precision"] as Integer : -1 - column.scale = args["scale"] ? args["scale"] as Integer : -1 + column.name = args['name'] + column.sqlType = args['sqlType'] + column.enumType = args['enumType'] ?: column.enumType + column.index = args['index'] + column.unique = args['unique'] ?: false + column.length = args['length'] ? args['length'] as Integer : -1 + column.precision = args['precision'] ? args['precision'] as Integer : -1 + column.scale = args['scale'] ? args['scale'] as Integer : -1 index++ return column diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/SortConfig.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/SortConfig.groovy index 8a1fc87d409..37438d605da 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/SortConfig.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/SortConfig.groovy @@ -28,6 +28,7 @@ import groovy.transform.builder.SimpleStrategy @CompileStatic @Builder(builderStrategy = SimpleStrategy, prefix = '') class SortConfig { + /** * The property to sort bu */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Table.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Table.groovy index 70e917dbb17..a7f697d44a3 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Table.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/cfg/Table.groovy @@ -21,6 +21,7 @@ package org.grails.orm.hibernate.cfg import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + import org.springframework.beans.MutablePropertyValues import org.springframework.validation.DataBinder @@ -33,6 +34,7 @@ import org.springframework.validation.DataBinder @Builder(builderStrategy = SimpleStrategy, prefix = '') @CompileStatic class Table { + /** * The table name */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/compiler/HibernateEntityTransformation.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/compiler/HibernateEntityTransformation.groovy index 572cd473c15..ea09484403b 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/compiler/HibernateEntityTransformation.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/compiler/HibernateEntityTransformation.groovy @@ -19,12 +19,21 @@ package org.grails.orm.hibernate.compiler -import grails.gorm.dirty.checking.DirtyCheckedProperty +import java.lang.reflect.Modifier + import groovy.transform.CompilationUnitAware import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.apache.groovy.ast.tools.AnnotatedNodeUtils -import org.codehaus.groovy.ast.* +import org.codehaus.groovy.ast.ASTNode +import org.codehaus.groovy.ast.AnnotatedNode +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassCodeVisitorSupport +import org.codehaus.groovy.ast.ClassHelper +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.FieldNode +import org.codehaus.groovy.ast.InnerClassNode +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.Parameter import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.IfStatement import org.codehaus.groovy.ast.stmt.ReturnStatement @@ -36,19 +45,35 @@ import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.GroovyASTTransformation import org.codehaus.groovy.transform.TransformWithPriority import org.codehaus.groovy.transform.sc.StaticCompilationVisitor -import org.grails.compiler.gorm.GormEntityTransformation -import org.grails.datastore.mapping.model.config.GormProperties -import org.grails.datastore.mapping.reflect.AstUtils -import org.grails.datastore.mapping.reflect.NameUtils + +import jakarta.persistence.Transient + import org.hibernate.engine.spi.EntityEntry import org.hibernate.engine.spi.ManagedEntity import org.hibernate.engine.spi.PersistentAttributeInterceptable import org.hibernate.engine.spi.PersistentAttributeInterceptor -import jakarta.persistence.Transient -import java.lang.reflect.Modifier +import grails.gorm.dirty.checking.DirtyCheckedProperty +import org.apache.grails.common.compiler.GroovyTransformOrder +import org.grails.compiler.gorm.GormEntityTransformation +import org.grails.datastore.mapping.model.config.GormProperties +import org.grails.datastore.mapping.reflect.AstUtils +import org.grails.datastore.mapping.reflect.NameUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.equalsNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.fieldX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.neX +import static org.codehaus.groovy.ast.tools.GeneralUtils.param +import static org.codehaus.groovy.ast.tools.GeneralUtils.params +import static org.codehaus.groovy.ast.tools.GeneralUtils.propX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ternaryX +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX /** * A transformation that transforms entities that implement the {@link grails.gorm.hibernate.annotation.ManagedEntity} trait, @@ -60,26 +85,27 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.* @CompileStatic @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) class HibernateEntityTransformation implements ASTTransformation, CompilationUnitAware, TransformWithPriority { - private static final ClassNode MY_TYPE = new ClassNode(grails.gorm.hibernate.annotation.ManagedEntity.class); - private static final Object APPLIED_MARKER = new Object(); + + private static final ClassNode MY_TYPE = new ClassNode(grails.gorm.hibernate.annotation.ManagedEntity) + private static final Object APPLIED_MARKER = new Object() // final boolean available = ClassUtils.isPresent("org.hibernate.SessionFactory") && Boolean.valueOf(System.getProperty("hibernate.enhance", "true")) CompilationUnit compilationUnit @Override void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { - AnnotatedNode parent = (AnnotatedNode) astNodes[1]; - AnnotationNode node = (AnnotationNode) astNodes[0]; + AnnotatedNode parent = (AnnotatedNode) astNodes[1] + AnnotationNode node = (AnnotationNode) astNodes[0] if (!(astNodes[0] instanceof AnnotationNode) || !(astNodes[1] instanceof AnnotatedNode)) { - throw new RuntimeException("Internal error: wrong types: ${node.getClass()} / ${parent.getClass()}"); + throw new RuntimeException("Internal error: wrong types: ${node.getClass()} / ${parent.getClass()}") } if (!MY_TYPE.equals(node.getClassNode()) || !(parent instanceof ClassNode)) { - return; + return } - ClassNode cNode = (ClassNode) parent; + ClassNode cNode = (ClassNode) parent visit(cNode, sourceUnit) } @@ -97,12 +123,12 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni def mapWith = AstUtils.getPropertyFromHierarchy(classNode, GormProperties.MAPPING_STRATEGY) String mapWithValue = mapWith?.initialExpression?.text - if(mapWithValue != null && (mapWithValue != ('hibernate') || mapWithValue != GormProperties.DEFAULT_MAPPING_STRATEGY)) { + if (mapWithValue != null && (mapWithValue != ('hibernate') || mapWithValue != GormProperties.DEFAULT_MAPPING_STRATEGY)) { return } new GormEntityTransformation(compilationUnit: compilationUnit).visit(classNode, sourceUnit) - + ClassNode managedEntityClassNode = ClassHelper.make(ManagedEntity) ClassNode attributeInterceptableClassNode = ClassHelper.make(PersistentAttributeInterceptable) ClassNode entityEntryClassNode = ClassHelper.make(EntityEntry) @@ -117,7 +143,7 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni def staticCompilationVisitor = new StaticCompilationVisitor(sourceUnit, classNode) - AnnotationNode transientAnnotationNode = new AnnotationNode(ClassHelper.make(Transient.class)) + AnnotationNode transientAnnotationNode = new AnnotationNode(ClassHelper.make(Transient)) FieldNode entityEntryHolderField = classNode.addField(entryHolderFieldName, Modifier.PRIVATE | Modifier.TRANSIENT, entityEntryClassNode, null) entityEntryHolderField .addAnnotation(transientAnnotationNode) @@ -134,8 +160,6 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni interceptorField .addAnnotation(transientAnnotationNode) - - // add method: PersistentAttributeInterceptor $$_hibernate_getInterceptor() def getInterceptorMethod = new MethodNode( '$$_hibernate_getInterceptor', @@ -150,14 +174,14 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni staticCompilationVisitor.visitMethod(getInterceptorMethod) // add method: void $$_hibernate_setInterceptor(PersistentAttributeInterceptor interceptor) - def p1 = param(persistentAttributeInterceptorClassNode, "interceptor") + def p1 = param(persistentAttributeInterceptorClassNode, 'interceptor') def setInterceptorMethod = new MethodNode( '$$_hibernate_setInterceptor', Modifier.PUBLIC, ClassHelper.VOID_TYPE, params(p1), null, - assignS( varX(interceptorField), varX(p1) ) + assignS(varX(interceptorField), varX(p1)) ) classNode.addMethod(setInterceptorMethod) AnnotatedNodeUtils.markAsGenerated(classNode, setInterceptorMethod) @@ -170,13 +194,12 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni ClassHelper.OBJECT_TYPE, AstUtils.ZERO_PARAMETERS, null, - returnS(varX("this")) + returnS(varX('this')) ) classNode.addMethod(getEntityInstanceMethod) AnnotatedNodeUtils.markAsGenerated(classNode, getEntityInstanceMethod) staticCompilationVisitor.visitMethod(getEntityInstanceMethod) - // add method: EntityEntry $$_hibernate_getEntityEntry() def getEntityEntryMethod = new MethodNode( '$$_hibernate_getEntityEntry', @@ -191,14 +214,14 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni staticCompilationVisitor.visitMethod(getEntityEntryMethod) // add method: void $$_hibernate_setEntityEntry(EntityEntry entityEntry) - def entityEntryParam = param(entityEntryClassNode, "entityEntry") + def entityEntryParam = param(entityEntryClassNode, 'entityEntry') def setEntityEntryMethod = new MethodNode( '$$_hibernate_setEntityEntry', Modifier.PUBLIC, ClassHelper.VOID_TYPE, params(entityEntryParam), null, - assignS( varX(entityEntryHolderField), varX(entityEntryParam) ) + assignS(varX(entityEntryHolderField), varX(entityEntryParam)) ) classNode.addMethod(setEntityEntryMethod) AnnotatedNodeUtils.markAsGenerated(classNode, setEntityEntryMethod) @@ -231,37 +254,37 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni staticCompilationVisitor.visitMethod(getNextManagedEntityMethod) // add method: void $$_hibernate_setPreviousManagedEntity(ManagedEntity previous) - def previousParam = param(managedEntityClassNode, "previous") + def previousParam = param(managedEntityClassNode, 'previous') def setPreviousManagedEntityMethod = new MethodNode( '$$_hibernate_setPreviousManagedEntity', Modifier.PUBLIC, ClassHelper.VOID_TYPE, params(previousParam), null, - assignS( varX(previousManagedEntityField), varX(previousParam) ) + assignS(varX(previousManagedEntityField), varX(previousParam)) ) classNode.addMethod(setPreviousManagedEntityMethod) AnnotatedNodeUtils.markAsGenerated(classNode, setPreviousManagedEntityMethod) staticCompilationVisitor.visitMethod(setPreviousManagedEntityMethod) // add method: void $$_hibernate_setNextManagedEntity(ManagedEntity next) - def nextParam = param(managedEntityClassNode, "next") + def nextParam = param(managedEntityClassNode, 'next') def setNextManagedEntityMethod = new MethodNode( '$$_hibernate_setNextManagedEntity', Modifier.PUBLIC, ClassHelper.VOID_TYPE, params(nextParam), null, - assignS( varX(nextManagedEntityField), varX(nextParam) ) + assignS(varX(nextManagedEntityField), varX(nextParam)) ) classNode.addMethod(setNextManagedEntityMethod) AnnotatedNodeUtils.markAsGenerated(classNode, setNextManagedEntityMethod) staticCompilationVisitor.visitMethod(setNextManagedEntityMethod) List allMethods = classNode.getMethods() - for(MethodNode methodNode in allMethods) { - if(methodNode.getAnnotations(ClassHelper.make(DirtyCheckedProperty))) { - if(AstUtils.isGetter(methodNode)) { + for (MethodNode methodNode in allMethods) { + if (methodNode.getAnnotations(ClassHelper.make(DirtyCheckedProperty))) { + if (AstUtils.isGetter(methodNode)) { def codeVisitor = new ClassCodeVisitorSupport() { @Override protected SourceUnit getSourceUnit() { @@ -270,20 +293,20 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni @Override void visitReturnStatement(ReturnStatement statement) { - ReturnStatement rs = (ReturnStatement)statement + ReturnStatement rs = (ReturnStatement) statement def i = varX(interceptorField) def propertyName = NameUtils.getPropertyNameForGetterOrSetter(methodNode.getName()) def returnType = methodNode.getReturnType() final boolean isPrimitive = ClassHelper.isPrimitiveType(returnType) - String readMethodName = isPrimitive ? "read${NameUtils.capitalize(returnType.getName())}" : "readObject" - def readObjectCall = callX(i, readMethodName, args(varX("this"), constX(propertyName), rs.getExpression())) + String readMethodName = isPrimitive ? "read${NameUtils.capitalize(returnType.getName())}" : 'readObject' + def readObjectCall = callX(i, readMethodName, args(varX('this'), constX(propertyName), rs.getExpression())) def ternaryExpr = ternaryX( equalsNullX(varX(interceptorField)), rs.getExpression(), readObjectCall ) - staticCompilationVisitor.visitTernaryExpression ternaryExpr + staticCompilationVisitor.visitTernaryExpression(ternaryExpr) rs.setExpression(ternaryExpr) } @@ -292,21 +315,21 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni } else { Statement code = methodNode.code - if(code instanceof BlockStatement) { - BlockStatement bs = (BlockStatement)code + if (code instanceof BlockStatement) { + BlockStatement bs = (BlockStatement) code Parameter parameter = methodNode.getParameters()[0] ClassNode parameterType = parameter.type final boolean isPrimitive = ClassHelper.isPrimitiveType(parameterType) - String writeMethodName = isPrimitive ? "write${NameUtils.capitalize(parameterType.getName())}" : "writeObject" + String writeMethodName = isPrimitive ? "write${NameUtils.capitalize(parameterType.getName())}" : 'writeObject' String propertyName = NameUtils.getPropertyNameForGetterOrSetter(methodNode.getName()) def interceptorFieldExpr = fieldX(interceptorField) - def ifStatement = ifS( neX(interceptorFieldExpr, constX(null) ), + def ifStatement = ifS(neX(interceptorFieldExpr, constX(null)), assignS( varX(parameter), - callX( interceptorFieldExpr, writeMethodName, args( varX("this"), constX(propertyName), propX(varX("this"), propertyName), varX(parameter))) + callX(interceptorFieldExpr, writeMethodName, args(varX('this'), constX(propertyName), propX(varX('this'), propertyName), varX(parameter))) ) ) - staticCompilationVisitor.visitIfElse((IfStatement)ifStatement) + staticCompilationVisitor.visitIfElse((IfStatement) ifStatement) bs.getStatements().add(0, ifStatement) } } @@ -321,4 +344,4 @@ class HibernateEntityTransformation implements ASTTransformation, CompilationUni int priority() { GroovyTransformOrder.HIBERNATE5_ORDER } -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/AbstractHibernateConnectionSourceFactory.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/AbstractHibernateConnectionSourceFactory.java index 3aab65a879b..598afb3c9b9 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/AbstractHibernateConnectionSourceFactory.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/AbstractHibernateConnectionSourceFactory.java @@ -19,19 +19,24 @@ package org.grails.orm.hibernate.connections; +import java.io.Serializable; +import java.util.Collections; +import java.util.Map; + +import javax.sql.DataSource; + +import org.hibernate.SessionFactory; + +import org.springframework.core.env.PropertyResolver; + import org.grails.datastore.gorm.jdbc.connections.CachedDataSourceConnectionSourceFactory; -import org.grails.datastore.mapping.core.connections.*; -import org.grails.orm.hibernate.cfg.Settings; import org.grails.datastore.gorm.jdbc.connections.DataSourceConnectionSourceFactory; import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings; import org.grails.datastore.gorm.jdbc.connections.DataSourceSettingsBuilder; -import org.hibernate.SessionFactory; -import org.springframework.core.env.PropertyResolver; - -import javax.sql.DataSource; -import java.io.Serializable; -import java.util.Collections; -import java.util.Map; +import org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings; +import org.grails.orm.hibernate.cfg.Settings; /** * Constructs a Hibernate {@link SessionFactory} @@ -58,7 +63,6 @@ public ConnectionSource creat return create(name, dataSourceConnectionSource, settings); } - @Override public Serializable getConnectionSourcesConfigurationKey() { return Settings.SETTING_DATASOURCES; @@ -77,23 +81,23 @@ public HibernateConnectionSourceSettings bu * @param settings The settings * @return The ConnectionSource */ - public abstract ConnectionSource create(String name, ConnectionSource dataSourceConnectionSource, HibernateConnectionSourceSettings settings); + public abstract ConnectionSource create(String name, ConnectionSource dataSourceConnectionSource, HibernateConnectionSourceSettings settings); protected HibernateConnectionSourceSettings buildSettings(String name, PropertyResolver configuration, F fallbackSettings, boolean isDefaultDataSource) { HibernateConnectionSourceSettingsBuilder builder; HibernateConnectionSourceSettings settings; - if(isDefaultDataSource) { + if (isDefaultDataSource) { String qualified = Settings.SETTING_DATASOURCES + '.' + Settings.SETTING_DATASOURCE; builder = new HibernateConnectionSourceSettingsBuilder(configuration, "", fallbackSettings); Map config = configuration.getProperty(qualified, Map.class, Collections.emptyMap()); settings = builder.build(); - if(!config.isEmpty()) { + if (!config.isEmpty()) { DataSourceSettings dsfallbackSettings = null; - if(fallbackSettings instanceof HibernateConnectionSourceSettings) { - dsfallbackSettings = ((HibernateConnectionSourceSettings)fallbackSettings).getDataSource(); + if (fallbackSettings instanceof HibernateConnectionSourceSettings) { + dsfallbackSettings = ((HibernateConnectionSourceSettings) fallbackSettings).getDataSource(); } - else if(fallbackSettings instanceof DataSourceSettings) { + else if (fallbackSettings instanceof DataSourceSettings) { dsfallbackSettings = (DataSourceSettings) fallbackSettings; } DataSourceSettingsBuilder dataSourceSettingsBuilder = new DataSourceSettingsBuilder(configuration, qualified, dsfallbackSettings); @@ -114,22 +118,22 @@ private HibernateConnectionSourceSettings b builder = new HibernateConnectionSourceSettingsBuilder(configuration, prefix, fallbackSettings); DataSourceSettings dsfallbackSettings = null; - if(fallbackSettings instanceof HibernateConnectionSourceSettings) { - dsfallbackSettings = ((HibernateConnectionSourceSettings)fallbackSettings).getDataSource(); + if (fallbackSettings instanceof HibernateConnectionSourceSettings) { + dsfallbackSettings = ((HibernateConnectionSourceSettings) fallbackSettings).getDataSource(); } - else if(fallbackSettings instanceof DataSourceSettings) { + else if (fallbackSettings instanceof DataSourceSettings) { dsfallbackSettings = (DataSourceSettings) fallbackSettings; } settings = builder.build(); - if(prefix.length() == 0) { + if (prefix.length() == 0) { // if the prefix is zero length then this is a datasource added at runtime using ConnectionSources.addConnectionSource DataSourceSettingsBuilder dataSourceSettingsBuilder = new DataSourceSettingsBuilder(configuration, prefix, dsfallbackSettings); DataSourceSettings dataSourceSettings = dataSourceSettingsBuilder.build(); settings.setDataSource(dataSourceSettings); } else { - if(configuration.getProperty(prefix + ".dataSource", Map.class, Collections.emptyMap()).isEmpty()) { + if (configuration.getProperty(prefix + ".dataSource", Map.class, Collections.emptyMap()).isEmpty()) { DataSourceSettingsBuilder dataSourceSettingsBuilder = new DataSourceSettingsBuilder(configuration, prefix, dsfallbackSettings); DataSourceSettings dataSourceSettings = dataSourceSettingsBuilder.build(); settings.setDataSource(dataSourceSettings); diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSource.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSource.java index 72da82de170..700dfc01306 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSource.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSource.java @@ -19,13 +19,15 @@ package org.grails.orm.hibernate.connections; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.datastore.mapping.core.connections.DefaultConnectionSource; -import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings; -import org.hibernate.SessionFactory; +import java.io.IOException; import javax.sql.DataSource; -import java.io.IOException; + +import org.hibernate.SessionFactory; + +import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.DefaultConnectionSource; /** * @@ -36,7 +38,7 @@ */ public class HibernateConnectionSource extends DefaultConnectionSource { - protected final ConnectionSource dataSource; + protected final ConnectionSource dataSource; public HibernateConnectionSource(String name, SessionFactory sessionFactory, ConnectionSource dataSourceConnectionSource, HibernateConnectionSourceSettings settings) { super(name, sessionFactory, settings); @@ -50,7 +52,7 @@ public void close() throws IOException { SessionFactory sessionFactory = getSource(); sessionFactory.close(); } finally { - if(dataSource != null) { + if (dataSource != null) { dataSource.close(); } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceFactory.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceFactory.java index 155ac461bce..7e56d36b07e 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceFactory.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceFactory.java @@ -19,23 +19,18 @@ package org.grails.orm.hibernate.connections; -import org.grails.datastore.gorm.validation.jakarta.JakartaValidatorRegistry; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.datastore.mapping.core.exceptions.ConfigurationException; -import org.grails.datastore.mapping.core.grailsversion.GrailsVersion; -import org.grails.datastore.mapping.validation.ValidatorRegistry; -import org.grails.orm.hibernate.HibernateEventListeners; -import org.grails.orm.hibernate.cfg.GrailsDomainBinder; -import org.grails.orm.hibernate.cfg.HibernateMappingContext; -import org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration; -import org.grails.datastore.gorm.jdbc.connections.*; -import org.grails.orm.hibernate.support.AbstractClosureEventTriggeringInterceptor; -import org.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor; +import java.io.File; +import java.io.IOException; +import java.util.Properties; + +import javax.sql.DataSource; + import org.hibernate.Interceptor; import org.hibernate.SessionFactory; import org.hibernate.boot.spi.MetadataContributor; import org.hibernate.cfg.Configuration; import org.hibernate.cfg.NamingStrategy; + import org.springframework.beans.BeanUtils; import org.springframework.beans.BeansException; import org.springframework.beans.factory.annotation.Autowired; @@ -46,10 +41,19 @@ import org.springframework.context.support.StaticMessageSource; import org.springframework.core.io.Resource; -import javax.sql.DataSource; -import java.io.File; -import java.io.IOException; -import java.util.Properties; +import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings; +import org.grails.datastore.gorm.jdbc.connections.SpringDataSourceConnectionSourceFactory; +import org.grails.datastore.gorm.validation.jakarta.JakartaValidatorRegistry; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.exceptions.ConfigurationException; +import org.grails.datastore.mapping.core.grailsversion.GrailsVersion; +import org.grails.datastore.mapping.validation.ValidatorRegistry; +import org.grails.orm.hibernate.HibernateEventListeners; +import org.grails.orm.hibernate.cfg.GrailsDomainBinder; +import org.grails.orm.hibernate.cfg.HibernateMappingContext; +import org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration; +import org.grails.orm.hibernate.support.AbstractClosureEventTriggeringInterceptor; +import org.grails.orm.hibernate.support.ClosureEventTriggeringInterceptor; /** * Constructs {@link SessionFactory} instances from a {@link HibernateMappingContext} @@ -72,7 +76,7 @@ public class HibernateConnectionSourceFactory extends AbstractHibernateConnectio protected MetadataContributor metadataContributor; protected MessageSource messageSource = new StaticMessageSource(); - public HibernateConnectionSourceFactory(Class...classes) { + public HibernateConnectionSourceFactory(Class... classes) { this.persistentClasses = classes; } @@ -109,7 +113,7 @@ public ConnectionSource creat public HibernateMappingContextConfiguration buildConfiguration(String name, ConnectionSource dataSourceConnectionSource, HibernateConnectionSourceSettings settings) { boolean isDefault = ConnectionSource.DEFAULT.equals(name); - if(mappingContext == null) { + if (mappingContext == null) { mappingContext = new HibernateMappingContext(settings, applicationContext, persistentClasses); } @@ -117,8 +121,8 @@ public HibernateMappingContextConfiguration buildConfiguration(String name, Conn Class configClass = hibernateSettings.getConfigClass(); HibernateMappingContextConfiguration configuration; - if(configClass != null) { - if( !HibernateMappingContextConfiguration.class.isAssignableFrom(configClass) ) { + if (configClass != null) { + if (!HibernateMappingContextConfiguration.class.isAssignableFrom(configClass)) { throw new ConfigurationException("The configClass setting must be a subclass for [HibernateMappingContextConfiguration]"); } else { @@ -129,13 +133,13 @@ public HibernateMappingContextConfiguration buildConfiguration(String name, Conn configuration = new HibernateMappingContextConfiguration(); } - if(JakartaValidatorRegistry.isAvailable() && messageSource != null) { - ValidatorRegistry registry = new JakartaValidatorRegistry(mappingContext,dataSourceConnectionSource.getSettings(), messageSource ); + if (JakartaValidatorRegistry.isAvailable() && messageSource != null) { + ValidatorRegistry registry = new JakartaValidatorRegistry(mappingContext, dataSourceConnectionSource.getSettings(), messageSource); mappingContext.setValidatorRegistry(registry); configuration.getProperties().put("jakarta.persistence.validation.factory", registry); } - if(applicationContext != null && applicationContext.containsBean(dataSourceConnectionSource.getName())) { + if (applicationContext != null && applicationContext.containsBean(dataSourceConnectionSource.getName())) { configuration.setApplicationContext(this.applicationContext); } else { @@ -234,7 +238,7 @@ public HibernateMappingContextConfiguration buildConfiguration(String name, Conn AbstractClosureEventTriggeringInterceptor eventTriggeringInterceptor; - if(closureEventTriggeringInterceptorClass == null) { + if (closureEventTriggeringInterceptorClass == null) { eventTriggeringInterceptor = new ClosureEventTriggeringInterceptor(); } else { @@ -245,7 +249,7 @@ public HibernateMappingContextConfiguration buildConfiguration(String name, Conn try { Class namingStrategy = hibernateSettings.getNaming_strategy(); - if(namingStrategy != null) { + if (namingStrategy != null) { GrailsDomainBinder.configureNamingStrategy(name, namingStrategy); } } catch (Throwable e) { @@ -254,7 +258,7 @@ public HibernateMappingContextConfiguration buildConfiguration(String name, Conn configuration.setEventListeners(hibernateSettings.toHibernateEventListeners(eventTriggeringInterceptor)); HibernateEventListeners hibernateEventListeners = hibernateSettings.getHibernateEventListeners(); - configuration.setHibernateEventListeners(this.hibernateEventListeners != null ? this.hibernateEventListeners : hibernateEventListeners); + configuration.setHibernateEventListeners(this.hibernateEventListeners != null ? this.hibernateEventListeners : hibernateEventListeners); configuration.setHibernateMappingContext(mappingContext); configuration.setDataSourceName(name); configuration.setSessionFactoryBeanName(isDefault ? "sessionFactory" : "sessionFactory_" + name); @@ -265,10 +269,10 @@ public HibernateMappingContextConfiguration buildConfiguration(String name, Conn @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if(applicationContext != null) { + if (applicationContext != null) { this.applicationContext = applicationContext; this.messageSource = applicationContext; - if (!GrailsVersion.isAtLeastMajorMinor(3,3)) { + if (!GrailsVersion.isAtLeastMajorMinor(3, 3)) { SpringDataSourceConnectionSourceFactory springDataSourceConnectionSourceFactory = new SpringDataSourceConnectionSourceFactory(); springDataSourceConnectionSourceFactory.setApplicationContext(applicationContext); this.dataSourceConnectionSourceFactory = springDataSourceConnectionSourceFactory; diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceSettings.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceSettings.groovy index 89f198bfaeb..0c9aab26a2d 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceSettings.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceSettings.groovy @@ -23,18 +23,21 @@ import groovy.transform.AutoClone import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy -import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings -import org.grails.orm.hibernate.HibernateEventListeners -import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings -import org.grails.orm.hibernate.dirty.GrailsEntityDirtinessStrategy -import org.grails.orm.hibernate.support.AbstractClosureEventTriggeringInterceptor + import org.hibernate.CustomEntityDirtinessStrategy import org.hibernate.cfg.AvailableSettings import org.hibernate.cfg.Configuration import org.hibernate.cfg.ImprovedNamingStrategy import org.hibernate.cfg.NamingStrategy + import org.springframework.core.io.Resource +import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings +import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings +import org.grails.orm.hibernate.HibernateEventListeners +import org.grails.orm.hibernate.dirty.GrailsEntityDirtinessStrategy +import org.grails.orm.hibernate.support.AbstractClosureEventTriggeringInterceptor + /** * Settings for Hibernate * @@ -66,12 +69,11 @@ class HibernateConnectionSourceSettings extends ConnectionSourceSettings { */ Properties toProperties() { Properties properties = new Properties() - properties.putAll( dataSource.toHibernateProperties() ) - properties.putAll( hibernate.toProperties() ) + properties.putAll(dataSource.toHibernateProperties()) + properties.putAll(hibernate.toProperties()) return properties } - @Builder(builderStrategy = SimpleStrategy, prefix = '') @AutoClone static class HibernateSettings extends LinkedHashMap { @@ -99,7 +101,6 @@ class HibernateConnectionSourceSettings extends ConnectionSourceSettings { */ FlushSettings flush = new FlushSettings() - /** * The configuration class */ @@ -206,7 +207,7 @@ class HibernateConnectionSourceSettings extends ConnectionSourceSettings { @CompileStatic Map toHibernateEventListeners(AbstractClosureEventTriggeringInterceptor eventTriggeringInterceptor) { - if(eventTriggeringInterceptor != null) { + if (eventTriggeringInterceptor != null) { return [ 'save': eventTriggeringInterceptor, 'save-update': eventTriggeringInterceptor, @@ -231,11 +232,11 @@ class HibernateConnectionSourceSettings extends ConnectionSourceSettings { @CompileStatic Properties toProperties() { Properties props = new Properties() - if(naming_strategy != null) { - props.put("hibernate.naming_strategy".toString(), naming_strategy.name) + if (naming_strategy != null) { + props.put('hibernate.naming_strategy', naming_strategy.name) } - if(configClass != null) { - props.put("hibernate.config_class".toString(), configClass.name) + if (configClass != null) { + props.put('hibernate.config_class', configClass.name) } props.put('hibernate.use_query_cache', String.valueOf(cache.queries)) @@ -246,23 +247,23 @@ class HibernateConnectionSourceSettings extends ConnectionSourceSettings { // Hibernate 5.1/5.2: manually enforce connection release mode ON_CLOSE (the former default) try { // Try Hibernate 5.2 - AvailableSettings.class.getField("CONNECTION_HANDLING") - props.put("hibernate.connection.handling_mode", "DELAYED_ACQUISITION_AND_HOLD") + AvailableSettings.getField('CONNECTION_HANDLING') + props.put('hibernate.connection.handling_mode', 'DELAYED_ACQUISITION_AND_HOLD') } catch (NoSuchFieldException ex) { // Try Hibernate 5.1 try { - AvailableSettings.class.getField("ACQUIRE_CONNECTIONS") - props.put("hibernate.connection.release_mode", "ON_CLOSE") + AvailableSettings.getField('ACQUIRE_CONNECTIONS') + props.put('hibernate.connection.release_mode', 'ON_CLOSE') } catch (NoSuchFieldException ex2) { // on Hibernate 5.0.x or lower - no need to change the default there } } - String prefix = "hibernate" - props.putAll( additionalProperties ) - populateProperties(props, this,prefix) + String prefix = 'hibernate' + props.putAll(additionalProperties) + populateProperties(props, this, prefix) return props } @@ -270,8 +271,8 @@ class HibernateConnectionSourceSettings extends ConnectionSourceSettings { protected void populateProperties(Properties props, Map current, String prefix) { for (key in current.keySet()) { def value = current.get(key) - if(value instanceof Map) { - populateProperties(props, (Map)value, "${prefix}.$key") + if (value instanceof Map) { + populateProperties(props, (Map) value, "${prefix}.$key") } else { props.put("$prefix.$key".toString(), value) @@ -336,6 +337,5 @@ class HibernateConnectionSourceSettings extends ConnectionSourceSettings { boolean enabled = true } - } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceSettingsBuilder.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceSettingsBuilder.groovy index 74b33bca46b..b9239d5cd8a 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceSettingsBuilder.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/connections/HibernateConnectionSourceSettingsBuilder.groovy @@ -20,9 +20,11 @@ package org.grails.orm.hibernate.connections import groovy.transform.CompileStatic + +import org.springframework.core.env.PropertyResolver + import org.grails.datastore.mapping.config.ConfigurationBuilder import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings -import org.springframework.core.env.PropertyResolver /** * Builds the GORM for Hibernate configuration @@ -32,31 +34,32 @@ import org.springframework.core.env.PropertyResolver */ @CompileStatic class HibernateConnectionSourceSettingsBuilder extends ConfigurationBuilder { + HibernateConnectionSourceSettings fallBackHibernateSettings - HibernateConnectionSourceSettingsBuilder(PropertyResolver propertyResolver, String configurationPrefix = "", ConnectionSourceSettings fallBackConfiguration = null) { + HibernateConnectionSourceSettingsBuilder(PropertyResolver propertyResolver, String configurationPrefix = '', ConnectionSourceSettings fallBackConfiguration = null) { super(propertyResolver, configurationPrefix, fallBackConfiguration) - if(fallBackConfiguration instanceof HibernateConnectionSourceSettings) { - fallBackHibernateSettings = (HibernateConnectionSourceSettings)fallBackConfiguration + if (fallBackConfiguration instanceof HibernateConnectionSourceSettings) { + fallBackHibernateSettings = (HibernateConnectionSourceSettings) fallBackConfiguration } } @Override protected HibernateConnectionSourceSettings createBuilder() { def settings = new HibernateConnectionSourceSettings() - if(fallBackHibernateSettings != null) { - settings.getHibernate().putAll( fallBackHibernateSettings.getHibernate() ) + if (fallBackHibernateSettings != null) { + settings.getHibernate().putAll(fallBackHibernateSettings.getHibernate()) } return settings } @Override HibernateConnectionSourceSettings build() { - HibernateConnectionSourceSettings finalSettings = (HibernateConnectionSourceSettings)super.build() - Map orgHibernateProperties = propertyResolver.getProperty("org.hibernate", Map.class, Collections.emptyMap()) + HibernateConnectionSourceSettings finalSettings = (HibernateConnectionSourceSettings) super.build() + Map orgHibernateProperties = propertyResolver.getProperty('org.hibernate', Map, Collections.emptyMap()) Properties additionalProperties = finalSettings.getHibernate().getAdditionalProperties() - for(key in orgHibernateProperties.keySet()) { + for (key in orgHibernateProperties.keySet()) { additionalProperties.put("org.hibernate.$key".toString(), orgHibernateProperties.get(key)) } return finalSettings diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/datasource/MultipleDataSourceSupport.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/datasource/MultipleDataSourceSupport.java index 71823e05bf3..b312dd2d272 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/datasource/MultipleDataSourceSupport.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/datasource/MultipleDataSourceSupport.java @@ -18,11 +18,11 @@ */ package org.grails.orm.hibernate.datasource; +import java.util.List; + import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport; import org.grails.datastore.mapping.model.PersistentEntity; -import java.util.List; - /** * Support methods for Multiple data source handling * diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/dirty/GrailsEntityDirtinessStrategy.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/dirty/GrailsEntityDirtinessStrategy.groovy index 7d938fb513f..93c88d34523 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/dirty/GrailsEntityDirtinessStrategy.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/dirty/GrailsEntityDirtinessStrategy.groovy @@ -20,13 +20,7 @@ package org.grails.orm.hibernate.dirty import groovy.transform.CompileDynamic import groovy.transform.CompileStatic -import org.grails.datastore.gorm.GormEnhancer -import org.grails.datastore.mapping.dirty.checking.DirtyCheckable -import org.grails.datastore.mapping.dirty.checking.DirtyCheckingSupport -import org.grails.datastore.mapping.model.PersistentEntity -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.mapping.model.config.GormProperties -import org.grails.datastore.mapping.model.types.Embedded + import org.hibernate.CustomEntityDirtinessStrategy import org.hibernate.Hibernate import org.hibernate.Session @@ -36,6 +30,14 @@ import org.hibernate.persister.entity.EntityPersister import org.slf4j.Logger import org.slf4j.LoggerFactory +import org.grails.datastore.gorm.GormEnhancer +import org.grails.datastore.mapping.dirty.checking.DirtyCheckable +import org.grails.datastore.mapping.dirty.checking.DirtyCheckingSupport +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.PersistentProperty +import org.grails.datastore.mapping.model.config.GormProperties +import org.grails.datastore.mapping.model.types.Embedded + /** * A class to customize Hibernate dirtiness based on Grails {@link DirtyCheckable} interface * @@ -47,7 +49,7 @@ import org.slf4j.LoggerFactory @CompileStatic class GrailsEntityDirtinessStrategy implements CustomEntityDirtinessStrategy { - protected static final Logger LOG = LoggerFactory.getLogger(GrailsEntityDirtinessStrategy.class) + protected static final Logger LOG = LoggerFactory.getLogger(GrailsEntityDirtinessStrategy) @Override boolean canDirtyCheck(Object entity, EntityPersister persister, Session session) { @@ -93,30 +95,30 @@ class GrailsEntityDirtinessStrategy implements CustomEntityDirtinessStrategy { @Override void findDirty(Object entity, EntityPersister persister, Session session, CustomEntityDirtinessStrategy.DirtyCheckContext dirtyCheckContext) { Status status = getStatus(session, entity) - if(entity instanceof DirtyCheckable) { + if (entity instanceof DirtyCheckable) { dirtyCheckContext.doDirtyChecking( new CustomEntityDirtinessStrategy.AttributeChecker() { @Override boolean isDirty(CustomEntityDirtinessStrategy.AttributeInformation attributeInformation) { String propertyName = attributeInformation.name - if(status != null) { - if(status == Status.MANAGED) { + if (status != null) { + if (status == Status.MANAGED) { // perform dirty check DirtyCheckable dirtyCheckable = cast(entity) - if(GormProperties.LAST_UPDATED == propertyName) { + if (GormProperties.LAST_UPDATED == propertyName) { return dirtyCheckable.hasChanged() } else { - if(dirtyCheckable.hasChanged(propertyName)) { + if (dirtyCheckable.hasChanged(propertyName)) { return true } else { PersistentEntity gormEntity = GormEnhancer.findEntity(Hibernate.getClass(entity)) PersistentProperty prop = gormEntity.getPropertyByName(attributeInformation.name) - if(prop instanceof Embedded) { + if (prop instanceof Embedded) { def val = prop.reader.read(entity) - if( val instanceof DirtyCheckable ) { - return ((DirtyCheckable)val).hasChanged() + if (val instanceof DirtyCheckable) { + return ((DirtyCheckable) val).hasChanged() } else { return false @@ -150,6 +152,6 @@ class GrailsEntityDirtinessStrategy implements CustomEntityDirtinessStrategy { } private DirtyCheckable cast(Object entity) { - return DirtyCheckable.class.cast(entity) + return DirtyCheckable.cast(entity) } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/event/listener/AbstractHibernateEventListener.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/event/listener/AbstractHibernateEventListener.java index d08b0fc8788..d716cadf3e3 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/event/listener/AbstractHibernateEventListener.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/event/listener/AbstractHibernateEventListener.java @@ -18,16 +18,17 @@ */ package org.grails.orm.hibernate.event.listener; +import java.util.List; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.springframework.context.ApplicationEvent; + import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener; import org.grails.orm.hibernate.AbstractHibernateDatastore; import org.grails.orm.hibernate.connections.HibernateConnectionSourceSettings; import org.grails.orm.hibernate.support.SoftKey; -import org.springframework.context.ApplicationEvent; - -import java.util.List; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; /** *

Invokes closure events on domain entities such as beforeInsert, beforeUpdate and beforeDelete. @@ -40,7 +41,7 @@ public abstract class AbstractHibernateEventListener extends AbstractPersistenceEventListener { protected final transient ConcurrentMap>, Boolean> cachedShouldTrigger = - new ConcurrentHashMap>, Boolean>(); + new ConcurrentHashMap<>(); protected final boolean failOnError; protected final List failOnErrorPackages; diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/event/listener/HibernateEventListener.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/event/listener/HibernateEventListener.java index 9b9b364b161..4b45a17acb6 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/event/listener/HibernateEventListener.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/event/listener/HibernateEventListener.java @@ -18,6 +18,25 @@ */ package org.grails.orm.hibernate.event.listener; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; + +import org.hibernate.Hibernate; +import org.hibernate.HibernateException; +import org.hibernate.engine.spi.SessionFactoryImplementor; +import org.hibernate.event.spi.EventSource; +import org.hibernate.event.spi.PostDeleteEvent; +import org.hibernate.event.spi.PostInsertEvent; +import org.hibernate.event.spi.PostLoadEvent; +import org.hibernate.event.spi.PostUpdateEvent; +import org.hibernate.event.spi.PreDeleteEvent; +import org.hibernate.event.spi.PreInsertEvent; +import org.hibernate.event.spi.PreLoadEvent; +import org.hibernate.event.spi.PreUpdateEvent; +import org.hibernate.event.spi.SaveOrUpdateEvent; + +import org.springframework.context.ApplicationEvent; + import grails.gorm.MultiTenant; import org.grails.datastore.gorm.timestamp.DefaultTimestampProvider; import org.grails.datastore.gorm.timestamp.TimestampProvider; @@ -27,14 +46,6 @@ import org.grails.orm.hibernate.AbstractHibernateDatastore; import org.grails.orm.hibernate.support.ClosureEventListener; import org.grails.orm.hibernate.support.SoftKey; -import org.hibernate.Hibernate; -import org.hibernate.HibernateException; -import org.hibernate.engine.spi.SessionFactoryImplementor; -import org.hibernate.event.spi.*; -import org.springframework.context.ApplicationEvent; - -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentMap; /** *

Invokes closure events on domain entities such as beforeInsert, beforeUpdate and beforeDelete. @@ -49,7 +60,6 @@ public class HibernateEventListener extends AbstractHibernateEventListener { protected transient ConcurrentMap>, ClosureEventListener> eventListeners = new ConcurrentHashMap<>(); - public HibernateEventListener(AbstractHibernateDatastore datastore) { super(datastore); } @@ -58,40 +68,40 @@ public HibernateEventListener(AbstractHibernateDatastore datastore) { protected void onPersistenceEvent(final AbstractPersistenceEvent event) { switch (event.getEventType()) { case PreInsert: - if (onPreInsert((PreInsertEvent)event.getNativeEvent())) { + if (onPreInsert((PreInsertEvent) event.getNativeEvent())) { event.cancel(); } break; case PostInsert: - onPostInsert((PostInsertEvent)event.getNativeEvent()); + onPostInsert((PostInsertEvent) event.getNativeEvent()); break; case PreUpdate: - if (onPreUpdate((PreUpdateEvent)event.getNativeEvent())) { + if (onPreUpdate((PreUpdateEvent) event.getNativeEvent())) { event.cancel(); } break; case PostUpdate: - onPostUpdate((PostUpdateEvent)event.getNativeEvent()); + onPostUpdate((PostUpdateEvent) event.getNativeEvent()); break; case PreDelete: - if (onPreDelete((PreDeleteEvent)event.getNativeEvent())) { + if (onPreDelete((PreDeleteEvent) event.getNativeEvent())) { event.cancel(); } break; case PostDelete: - onPostDelete((PostDeleteEvent)event.getNativeEvent()); + onPostDelete((PostDeleteEvent) event.getNativeEvent()); break; case PreLoad: - onPreLoad((PreLoadEvent)event.getNativeEvent()); + onPreLoad((PreLoadEvent) event.getNativeEvent()); break; case PostLoad: - onPostLoad((PostLoadEvent)event.getNativeEvent()); + onPostLoad((PostLoadEvent) event.getNativeEvent()); break; case SaveOrUpdate: - onSaveOrUpdate((SaveOrUpdateEvent)event.getNativeEvent()); + onSaveOrUpdate((SaveOrUpdateEvent) event.getNativeEvent()); break; case Validation: - onValidate((ValidationEvent)event); + onValidate((ValidationEvent) event); break; default: throw new IllegalStateException("Unexpected EventType: " + event.getEventType()); @@ -100,7 +110,7 @@ protected void onPersistenceEvent(final AbstractPersistenceEvent event) { public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { Object entity = event.getObject(); - if(entity != null) { + if (entity != null) { ClosureEventListener eventListener; EventSource session = event.getSession(); eventListener = findEventListener(entity, (SessionFactoryImplementor) session.getSessionFactory()); @@ -184,7 +194,7 @@ protected ClosureEventListener findEventListener(Object entity, SessionFactoryIm if (entity == null) return null; Class clazz = Hibernate.getClass(entity); - SoftKey> key = new SoftKey>(clazz); + SoftKey> key = new SoftKey<>(clazz); ClosureEventListener eventListener = eventListeners.get(key); if (eventListener != null) { return eventListener; @@ -192,7 +202,7 @@ protected ClosureEventListener findEventListener(Object entity, SessionFactoryIm Boolean shouldTrigger = cachedShouldTrigger.get(key); if (shouldTrigger == null || shouldTrigger) { - synchronized(cachedShouldTrigger) { + synchronized (cachedShouldTrigger) { eventListener = eventListeners.get(key); if (eventListener == null) { AbstractHibernateDatastore datastore = getDatastore(); diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/CouldNotDetermineHibernateDialectException.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/CouldNotDetermineHibernateDialectException.java index 5333dd30f5b..40ecc9a2339 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/CouldNotDetermineHibernateDialectException.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/CouldNotDetermineHibernateDialectException.java @@ -35,4 +35,4 @@ public CouldNotDetermineHibernateDialectException(String message, Throwable caus super(message, cause); } -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsHibernateConfigurationException.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsHibernateConfigurationException.java index 44cccf611ec..95b514074ae 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsHibernateConfigurationException.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsHibernateConfigurationException.java @@ -24,7 +24,7 @@ * @author Graeme Rocher * @since 1.1 */ -public class GrailsHibernateConfigurationException extends GrailsHibernateException{ +public class GrailsHibernateConfigurationException extends GrailsHibernateException { private static final long serialVersionUID = 5212907914995954558L; diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsHibernateException.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsHibernateException.java index 1febb6e6750..959f3feaf05 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsHibernateException.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsHibernateException.java @@ -18,7 +18,6 @@ */ package org.grails.orm.hibernate.exceptions; - import org.grails.datastore.mapping.core.DatastoreException; /** @@ -30,7 +29,6 @@ public abstract class GrailsHibernateException extends DatastoreException { private static final long serialVersionUID = -6019220941440364736L; - public GrailsHibernateException(String message) { super(message); } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsQueryException.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsQueryException.java index 71cf1ff86c4..578439e8143 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsQueryException.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/exceptions/GrailsQueryException.java @@ -18,7 +18,6 @@ */ package org.grails.orm.hibernate.exceptions; - import org.grails.datastore.mapping.core.DatastoreException; /** @@ -30,7 +29,6 @@ public class GrailsQueryException extends DatastoreException { private static final long serialVersionUID = 775603608315415077L; - public GrailsQueryException(String message, Throwable cause) { super(message, cause); } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java index c36e88fa54f..ffe1f054529 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/multitenancy/MultiTenantEventListener.java @@ -19,22 +19,26 @@ package org.grails.orm.hibernate.multitenancy; +import java.io.Serializable; + +import org.springframework.context.ApplicationEvent; + import grails.gorm.multitenancy.Tenants; import org.grails.datastore.gorm.GormEnhancer; import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.datastore.mapping.engine.event.*; +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; +import org.grails.datastore.mapping.engine.event.PersistenceEventListener; +import org.grails.datastore.mapping.engine.event.PreInsertEvent; +import org.grails.datastore.mapping.engine.event.PreUpdateEvent; +import org.grails.datastore.mapping.engine.event.ValidationEvent; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.types.TenantId; import org.grails.datastore.mapping.multitenancy.MultiTenantCapableDatastore; import org.grails.datastore.mapping.multitenancy.exceptions.TenantException; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.event.PreQueryEvent; -import org.grails.datastore.mapping.reflect.EntityReflector; import org.grails.orm.hibernate.AbstractHibernateDatastore; -import org.springframework.context.ApplicationEvent; - -import java.io.Serializable; /** * An event listener that hooks into persistence events to enable discriminator based multi tenancy (ie {@link org.grails.datastore.mapping.multitenancy.MultiTenancySettings.MultiTenancyMode#DISCRIMINATOR} @@ -55,47 +59,47 @@ public boolean supportsSourceType(Class sourceType) { @Override public void onApplicationEvent(ApplicationEvent event) { - if(supportsEventType(event.getClass())) { + if (supportsEventType(event.getClass())) { Datastore hibernateDatastore = (Datastore) event.getSource(); - if(event instanceof PreQueryEvent) { + if (event instanceof PreQueryEvent) { PreQueryEvent preQueryEvent = (PreQueryEvent) event; Query query = preQueryEvent.getQuery(); PersistentEntity entity = query.getEntity(); - if(entity.isMultiTenant()) { - if(hibernateDatastore == null) { + if (entity.isMultiTenant()) { + if (hibernateDatastore == null) { hibernateDatastore = GormEnhancer.findDatastore(entity.getJavaClass()); } - if(supportsSourceType(hibernateDatastore.getClass())) { - ((AbstractHibernateDatastore)hibernateDatastore).enableMultiTenancyFilter(); + if (supportsSourceType(hibernateDatastore.getClass())) { + ((AbstractHibernateDatastore) hibernateDatastore).enableMultiTenancyFilter(); } } } - else if((event instanceof ValidationEvent) || (event instanceof PreInsertEvent) || (event instanceof PreUpdateEvent)) { + else if ((event instanceof ValidationEvent) || (event instanceof PreInsertEvent) || (event instanceof PreUpdateEvent)) { AbstractPersistenceEvent preInsertEvent = (AbstractPersistenceEvent) event; PersistentEntity entity = preInsertEvent.getEntity(); - if(entity.isMultiTenant()) { + if (entity.isMultiTenant()) { TenantId tenantId = entity.getTenantId(); - if(hibernateDatastore == null) { + if (hibernateDatastore == null) { hibernateDatastore = GormEnhancer.findDatastore(entity.getJavaClass()); } - if(supportsSourceType(hibernateDatastore.getClass())) { + if (supportsSourceType(hibernateDatastore.getClass())) { Serializable currentId; - if(hibernateDatastore instanceof MultiTenantCapableDatastore) { + if (hibernateDatastore instanceof MultiTenantCapableDatastore) { currentId = Tenants.currentId((MultiTenantCapableDatastore) hibernateDatastore); } else { currentId = Tenants.currentId(hibernateDatastore.getClass()); } - if(currentId != null) { + if (currentId != null) { try { - if(currentId == ConnectionSource.DEFAULT) { + if (currentId == ConnectionSource.DEFAULT) { currentId = (Serializable) preInsertEvent.getEntityAccess().getProperty(tenantId.getName()); } preInsertEvent.getEntityAccess().setProperty(tenantId.getName(), currentId); } catch (Exception e) { - throw new TenantException("Could not assigned tenant id ["+currentId+"] to property ["+tenantId+"], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: " + e.getMessage(), e); + throw new TenantException("Could not assigned tenant id [" + currentId + "] to property [" + tenantId + "], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: " + e.getMessage(), e); } } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler.java index 43dd52c9852..f5f771b2b35 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/proxy/HibernateProxyHandler.java @@ -19,17 +19,17 @@ package org.grails.orm.hibernate.proxy; import java.io.Serializable; -import org.grails.datastore.gorm.GormEnhancer; + +import org.hibernate.Hibernate; +import org.hibernate.collection.spi.PersistentCollection; +import org.hibernate.proxy.HibernateProxy; +import org.hibernate.proxy.HibernateProxyHelper; + import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.engine.AssociationQueryExecutor; -import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.proxy.ProxyFactory; import org.grails.datastore.mapping.proxy.ProxyHandler; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; -import org.hibernate.Hibernate; -import org.hibernate.collection.spi.PersistentCollection; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.HibernateProxyHelper; /** * Implementation of the ProxyHandler interface for Hibernate using org.hibernate.Hibernate @@ -86,7 +86,7 @@ public Object unwrap(Object object) { @Override public Serializable getIdentifier(Object o) { if (o instanceof HibernateProxy) { - return ((HibernateProxy)o).getHibernateLazyInitializer().getIdentifier(); + return ((HibernateProxy) o).getHibernateLazyInitializer().getIdentifier(); } else { //TODO seems we can get the id here if its has normal getId @@ -120,7 +120,7 @@ public Object unwrapIfProxy(Object instance) { */ @Override public boolean isProxy(Object o) { - return (o instanceof HibernateProxy) || (o instanceof PersistentCollection); + return (o instanceof HibernateProxy) || (o instanceof PersistentCollection); } /** diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/proxy/SimpleHibernateProxyHandler.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/proxy/SimpleHibernateProxyHandler.java index 6deb4816ce8..0adbe69b848 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/proxy/SimpleHibernateProxyHandler.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/proxy/SimpleHibernateProxyHandler.java @@ -18,22 +18,22 @@ */ package org.grails.orm.hibernate.proxy; +import java.io.Serializable; import groovy.lang.GroovyObject; import groovy.lang.GroovySystem; + +import org.hibernate.collection.spi.PersistentCollection; +import org.hibernate.proxy.HibernateProxy; +import org.hibernate.proxy.HibernateProxyHelper; +import org.hibernate.proxy.LazyInitializer; + import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.engine.AssociationQueryExecutor; import org.grails.datastore.mapping.proxy.JavassistProxyFactory; import org.grails.datastore.mapping.proxy.ProxyFactory; import org.grails.datastore.mapping.proxy.ProxyHandler; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; -import org.hibernate.Hibernate; -import org.hibernate.collection.spi.PersistentCollection; -import org.hibernate.proxy.HibernateProxy; -import org.hibernate.proxy.HibernateProxyHelper; -import org.hibernate.proxy.LazyInitializer; - -import java.io.Serializable; /** * Implementation of the ProxyHandler interface for Hibernate. @@ -81,7 +81,7 @@ public Serializable getIdentifier(Object obj) { public Object unwrapIfProxy(Object instance) { if (instance instanceof HibernateProxy) { - final HibernateProxy proxy = (HibernateProxy)instance; + final HibernateProxy proxy = (HibernateProxy) instance; return unwrapProxy(proxy); } else { @@ -109,14 +109,13 @@ public Object unwrapProxy(final HibernateProxy proxy) { */ private static void ensureCorrectGroovyMetaClass(Object target, Class persistentClass) { if (target instanceof GroovyObject) { - GroovyObject go = ((GroovyObject)target); + GroovyObject go = ((GroovyObject) target); if (!go.getMetaClass().getTheClass().equals(persistentClass)) { go.setMetaClass(GroovySystem.getMetaClassRegistry().getMetaClass(persistentClass)); } } } - public HibernateProxy getAssociationProxy(Object obj, String associationName) { try { Object proxy = ClassPropertyFetcher.getInstancePropertyValue(obj, associationName); @@ -136,7 +135,7 @@ public boolean isProxy(Object o) { public void initialize(Object o) { if (o instanceof HibernateProxy) { - final LazyInitializer hibernateLazyInitializer = ((HibernateProxy)o).getHibernateLazyInitializer(); + final LazyInitializer hibernateLazyInitializer = ((HibernateProxy) o).getHibernateLazyInitializer(); if (hibernateLazyInitializer.isUninitialized()) { hibernateLazyInitializer.initialize(); } @@ -148,13 +147,13 @@ public void initialize(Object o) { public Object getProxyIdentifier(Object o) { if (o instanceof HibernateProxy) { - return ((HibernateProxy)o).getHibernateLazyInitializer().getIdentifier(); + return ((HibernateProxy) o).getHibernateLazyInitializer().getIdentifier(); } return super.getIdentifier(o); } public Class getProxiedClass(Object o) { - if(o instanceof HibernateProxy) { + if (o instanceof HibernateProxy) { return HibernateProxyHelper.getClassWithoutInitializingProxy(o); } else { diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateCriteriaBuilder.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateCriteriaBuilder.java index 1537a350f64..d23650e909f 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateCriteriaBuilder.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateCriteriaBuilder.java @@ -19,29 +19,60 @@ package org.grails.orm.hibernate.query; -import grails.gorm.MultiTenant; -import groovy.lang.*; -import org.grails.datastore.mapping.multitenancy.MultiTenancySettings; -import org.grails.datastore.mapping.query.Query; -import org.grails.datastore.mapping.query.api.*; -import org.grails.datastore.mapping.reflect.NameUtils; -import org.grails.orm.hibernate.AbstractHibernateDatastore; -import org.hibernate.*; +import java.beans.PropertyDescriptor; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import groovy.lang.Closure; +import groovy.lang.DelegatesTo; +import groovy.lang.GroovyObjectSupport; +import groovy.lang.MetaClass; +import groovy.lang.MetaMethod; +import groovy.lang.MissingMethodException; + +import jakarta.persistence.criteria.JoinType; +import jakarta.persistence.metamodel.Attribute; +import jakarta.persistence.metamodel.EntityType; + import org.hibernate.Criteria; -import org.hibernate.criterion.*; +import org.hibernate.FetchMode; +import org.hibernate.LockMode; +import org.hibernate.Metamodel; +import org.hibernate.Session; +import org.hibernate.SessionFactory; +import org.hibernate.TypeHelper; +import org.hibernate.criterion.AggregateProjection; +import org.hibernate.criterion.CountProjection; +import org.hibernate.criterion.CriteriaSpecification; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.IdentifierProjection; +import org.hibernate.criterion.Junction; +import org.hibernate.criterion.Order; +import org.hibernate.criterion.Projection; import org.hibernate.criterion.ProjectionList; import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Property; +import org.hibernate.criterion.PropertyProjection; import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.SimpleExpression; +import org.hibernate.criterion.Subqueries; import org.hibernate.transform.ResultTransformer; import org.hibernate.type.Type; + import org.springframework.beans.BeanUtils; import org.springframework.core.convert.ConversionService; -import jakarta.persistence.criteria.JoinType; -import jakarta.persistence.metamodel.Attribute; -import jakarta.persistence.metamodel.EntityType; -import java.beans.PropertyDescriptor; -import java.util.*; +import grails.gorm.MultiTenant; +import org.grails.datastore.mapping.multitenancy.MultiTenancySettings; +import org.grails.datastore.mapping.query.Query; +import org.grails.datastore.mapping.query.api.BuildableCriteria; +import org.grails.datastore.mapping.query.api.QueryableCriteria; +import org.grails.datastore.mapping.reflect.NameUtils; +import org.grails.orm.hibernate.AbstractHibernateDatastore; /** * Abstract super class for sharing code between Hibernate 3 and 4 implementations of HibernateCriteriaBuilder @@ -49,33 +80,33 @@ * @author Graeme Rocher * @since 3.0.7 */ -public abstract class AbstractHibernateCriteriaBuilder extends GroovyObjectSupport implements org.grails.datastore.mapping.query.api.BuildableCriteria, org.grails.datastore.mapping.query.api.ProjectionList { +public abstract class AbstractHibernateCriteriaBuilder extends GroovyObjectSupport implements org.grails.datastore.mapping.query.api.BuildableCriteria, org.grails.datastore.mapping.query.api.ProjectionList { public static final String AND = "and"; // builder public static final String IS_NULL = "isNull"; // builder public static final String IS_NOT_NULL = "isNotNull"; // builder - public static final String NOT = "not";// builder + public static final String NOT = "not"; // builder public static final String OR = "or"; // builder public static final String ID_EQUALS = "idEq"; // builder public static final String IS_EMPTY = "isEmpty"; //builder public static final String IS_NOT_EMPTY = "isNotEmpty"; //builder - public static final String RLIKE = "rlike";//method - public static final String BETWEEN = "between";//method - public static final String EQUALS = "eq";//method - public static final String EQUALS_PROPERTY = "eqProperty";//method - public static final String GREATER_THAN = "gt";//method - public static final String GREATER_THAN_PROPERTY = "gtProperty";//method - public static final String GREATER_THAN_OR_EQUAL = "ge";//method - public static final String GREATER_THAN_OR_EQUAL_PROPERTY = "geProperty";//method - public static final String ILIKE = "ilike";//method - public static final String IN = "in";//method + public static final String RLIKE = "rlike"; //method + public static final String BETWEEN = "between"; //method + public static final String EQUALS = "eq"; //method + public static final String EQUALS_PROPERTY = "eqProperty"; //method + public static final String GREATER_THAN = "gt"; //method + public static final String GREATER_THAN_PROPERTY = "gtProperty"; //method + public static final String GREATER_THAN_OR_EQUAL = "ge"; //method + public static final String GREATER_THAN_OR_EQUAL_PROPERTY = "geProperty"; //method + public static final String ILIKE = "ilike"; //method + public static final String IN = "in"; //method public static final String LESS_THAN = "lt"; //method - public static final String LESS_THAN_PROPERTY = "ltProperty";//method - public static final String LESS_THAN_OR_EQUAL = "le";//method - public static final String LESS_THAN_OR_EQUAL_PROPERTY = "leProperty";//method - public static final String LIKE = "like";//method - public static final String NOT_EQUAL = "ne";//method - public static final String NOT_EQUAL_PROPERTY = "neProperty";//method + public static final String LESS_THAN_PROPERTY = "ltProperty"; //method + public static final String LESS_THAN_OR_EQUAL = "le"; //method + public static final String LESS_THAN_OR_EQUAL_PROPERTY = "leProperty"; //method + public static final String LIKE = "like"; //method + public static final String NOT_EQUAL = "ne"; //method + public static final String NOT_EQUAL_PROPERTY = "neProperty"; //method public static final String SIZE_EQUALS = "sizeEq"; //method public static final String ORDER_DESCENDING = "desc"; public static final String ORDER_ASCENDING = "asc"; @@ -89,22 +120,21 @@ public abstract class AbstractHibernateCriteriaBuilder extends GroovyObjectSuppo protected static final String SET_RESULT_TRANSFORMER_CALL = "setResultTransformer"; protected static final String PROJECTIONS = "projections"; - protected SessionFactory sessionFactory; protected Session hibernateSession; protected Class targetClass; protected Criteria criteria; protected MetaClass criteriaMetaClass; protected boolean uniqueResult = false; - protected List logicalExpressionStack = new ArrayList(); - protected List associationStack = new ArrayList(); + protected List logicalExpressionStack = new ArrayList<>(); + protected List associationStack = new ArrayList<>(); protected boolean participate; protected boolean scroll; protected boolean count; protected ProjectionList projectionList = Projections.projectionList(); - protected List aliasStack = new ArrayList(); - protected List aliasInstanceStack = new ArrayList(); - protected Map aliasMap = new HashMap(); + protected List aliasStack = new ArrayList<>(); + protected List aliasInstanceStack = new ArrayList<>(); + protected Map aliasMap = new HashMap<>(); protected static final String ALIAS = "_alias"; protected ResultTransformer resultTransformer; protected int aliasCount; @@ -129,7 +159,7 @@ public AbstractHibernateCriteriaBuilder(Class targetClass, SessionFactory sessio public void setDatastore(AbstractHibernateDatastore datastore) { this.datastore = datastore; - if(MultiTenant.class.isAssignableFrom(targetClass) && datastore.getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR ) { + if (MultiTenant.class.isAssignableFrom(targetClass) && datastore.getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { datastore.enableMultiTenancyFilter(); } } @@ -165,7 +195,7 @@ public org.grails.datastore.mapping.query.api.ProjectionList property(String pro */ protected void addProjectionToList(Projection propertyProjection, String alias) { if (alias != null) { - projectionList.add(propertyProjection,alias); + projectionList.add(propertyProjection, alias); } else { projectionList.add(propertyProjection); @@ -222,7 +252,7 @@ public org.grails.datastore.mapping.query.api.ProjectionList distinct(String pro */ public org.grails.datastore.mapping.query.api.ProjectionList distinct(String propertyName, String alias) { final Projection proj = Projections.distinct(Projections.property(calculatePropertyName(propertyName))); - addProjectionToList(proj,alias); + addProjectionToList(proj, alias); return this; } @@ -289,7 +319,6 @@ public BuildableCriteria join(String property, JoinType joinType) { return this; } - /** * Whether a pessimistic lock should be obtained. * @@ -353,7 +382,7 @@ public BuildableCriteria readOnly(boolean readOnly) { protected String calculatePropertyName(String propertyName) { String lastAlias = getLastAlias(); if (lastAlias != null) { - return lastAlias +'.'+propertyName; + return lastAlias + '.' + propertyName; } return propertyName; @@ -459,7 +488,6 @@ public org.grails.datastore.mapping.query.api.ProjectionList countDistinct(Strin return this; } - /** * Adds a projection that allows the criteria's result to be grouped by a property * @@ -587,13 +615,12 @@ public void resultTransformer(ResultTransformer transformer) { * * @return this (for method chaining) * #see {@link #createAlias(String, String, int)} - * @throws HibernateException Indicates a problem creating the sub criteria + * @throws org.hibernate.HibernateException Indicates a problem creating the sub criteria */ public Criteria createAlias(String associationPath, String alias) { return criteria.createAlias(associationPath, alias); } - /** * Creates a Criterion that compares to class properties for equality * @param propertyName The first property name @@ -704,11 +731,10 @@ public org.grails.datastore.mapping.query.api.Criteria leProperty(String propert @Override public org.grails.datastore.mapping.query.api.Criteria allEq(Map propertyValues) { - addToCriteria( Restrictions.allEq(propertyValues) ); + addToCriteria(Restrictions.allEq(propertyValues)); return this; } - /** * Creates a subquery criterion that ensures the given property is equal to all the given returned values * @@ -721,7 +747,6 @@ public org.grails.datastore.mapping.query.api.Criteria eqAll(String propertyName return eqAll(propertyName, new grails.gorm.DetachedCriteria(targetClass).build(propertyValue)); } - /** * Creates a subquery criterion that ensures the given property is greater than all the given returned values * @@ -931,7 +956,7 @@ public org.grails.datastore.mapping.query.api.Criteria gt(String propertyName, O Criterion gt; if (propertyValue instanceof org.hibernate.criterion.DetachedCriteria) { - gt = Property.forName(propertyName).gt((org.hibernate.criterion.DetachedCriteria)propertyValue); + gt = Property.forName(propertyName).gt((org.hibernate.criterion.DetachedCriteria) propertyValue); } else { gt = Restrictions.gt(propertyName, propertyValue); @@ -941,7 +966,7 @@ public org.grails.datastore.mapping.query.api.Criteria gt(String propertyName, O } public org.grails.datastore.mapping.query.api.Criteria lte(String s, Object o) { - return le(s,o); + return le(s, o); } /** @@ -1080,8 +1105,8 @@ protected org.grails.datastore.mapping.query.api.Criteria executeLogicalExpressi try { invokeClosureNode(callable); } finally { - LogicalExpression logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size()-1); - if(logicalExpression != null) + LogicalExpression logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size() - 1); + if (logicalExpression != null) addToCriteria(logicalExpression.toCriterion()); } @@ -1140,12 +1165,12 @@ public org.grails.datastore.mapping.query.api.Criteria eq(String propertyName, O eq = Property.forName(propertyName).eq((org.hibernate.criterion.DetachedCriteria) propertyValue); } else { - eq = Restrictions.eq(propertyName, propertyValue); + eq = Restrictions.eq(propertyName, propertyValue); } if (params != null && (eq instanceof SimpleExpression)) { Object ignoreCase = params.get("ignoreCase"); - if (ignoreCase instanceof Boolean && (Boolean)ignoreCase) { - eq = ((SimpleExpression)eq).ignoreCase(); + if (ignoreCase instanceof Boolean && (Boolean) ignoreCase) { + eq = ((SimpleExpression) eq).ignoreCase(); } } addToCriteria(eq); @@ -1187,7 +1212,7 @@ public org.grails.datastore.mapping.query.api.Criteria sqlRestriction(String sql final TypeHelper typeHelper = sessionFactory.getTypeHelper(); for (int i = 0; i < typesArray.length; i++) { final Object value = values.get(i); - typesArray[i] = typeHelper.basic(value.getClass()); + typesArray[i] = typeHelper.basic(value.getClass()); valuesArray[i] = value; } } @@ -1258,8 +1283,8 @@ public org.grails.datastore.mapping.query.api.Criteria in(String propertyName, C propertyName = calculatePropertyName(propertyName); - if(values instanceof List) { - values = convertArgumentList((List)values); + if (values instanceof List) { + values = convertArgumentList((List) values); } addToCriteria(Restrictions.in(propertyName, values == null ? Collections.EMPTY_LIST : values)); return this; @@ -1269,13 +1294,14 @@ public org.grails.datastore.mapping.query.api.Criteria in(String propertyName, C protected List convertArgumentList(List argList) { List convertedList = new ArrayList(argList.size()); for (Object item : argList) { - if(item instanceof CharSequence) { + if (item instanceof CharSequence) { item = item.toString(); } convertedList.add(item); } return convertedList; } + /** * Delegates to in as in is a Groovy keyword */ @@ -1361,16 +1387,16 @@ public org.grails.datastore.mapping.query.api.Criteria order(Query.Order o) { private void addOrderInternal(Criteria criteria, Query.Order o, String property) { final int i = property.indexOf('.'); - if(i == -1) { + if (i == -1) { Order order = convertOrder(o, property); addOrderInternal(criteria, order); } else { - String sortHead = property.substring(0,i); - String sortTail = property.substring(i+1); + String sortHead = property.substring(0, i); + String sortTail = property.substring(i + 1); createAliasIfNeccessary(sortHead, sortHead, org.hibernate.sql.JoinType.INNER_JOIN.getJoinTypeValue()); - final Criteria sub = aliasInstanceStack.get(aliasInstanceStack.size()-1); + final Criteria sub = aliasInstanceStack.get(aliasInstanceStack.size() - 1); addOrderInternal(sub, o, sortTail); } } @@ -1379,13 +1405,13 @@ protected Order convertOrder(Query.Order o, String property) { Order order; switch (o.getDirection()) { case DESC: - order = Order.desc(property); + order = Order.desc(property); break; default: order = Order.asc(property); break; } - if(o.isIgnoreCase()) { + if (o.isIgnoreCase()) { order.ignoreCase(); } return order; @@ -1592,7 +1618,7 @@ public Object list(@DelegatesTo(Criteria.class) Closure c) { public Object list(Map params, @DelegatesTo(Criteria.class) Closure c) { return invokeMethod(LIST_CALL, new Object[]{params, c}); } - + @Override public Object listDistinct(@DelegatesTo(Criteria.class) Closure c) { return invokeMethod(LIST_DISTINCT_CALL, new Object[]{c}); @@ -1602,16 +1628,16 @@ public Object listDistinct(@DelegatesTo(Criteria.class) Closure c) { public Object get(@DelegatesTo(Criteria.class) Closure c) { return invokeMethod(GET_CALL, new Object[]{c}); } - + @Override public Object scroll(@DelegatesTo(Criteria.class) Closure c) { return invokeMethod(SCROLL_CALL, new Object[]{c}); } - + @SuppressWarnings("rawtypes") @Override public Object invokeMethod(String name, Object obj) { - Object[] args = obj.getClass().isArray() ? (Object[])obj : new Object[]{obj}; + Object[] args = obj.getClass().isArray() ? (Object[]) obj : new Object[]{obj}; if (paginationEnabledList && SET_RESULT_TRANSFORMER_CALL.equals(name) && args.length == 1 && args[0] instanceof ResultTransformer) { @@ -1679,7 +1705,7 @@ else if (paginationEnabledList) { } if (resultTransformer == null) { // GRAILS-9644 - Use projection transformer - criteria.setResultTransformer( isProjection ? + criteria.setResultTransformer(isProjection ? CriteriaSpecification.PROJECTION : CriteriaSpecification.ROOT_ENTITY ); @@ -1689,7 +1715,7 @@ else if (paginationEnabledList) { criteria.setResultTransformer(resultTransformer); } // GRAILS-7324 look if we already have association to sort by - Map argMap = (Map)args[0]; + Map argMap = (Map) args[0]; final String sort = (String) argMap.get(HibernateQueryConstants.ARGUMENT_SORT); if (sort != null) { boolean ignoreCase = true; @@ -1745,7 +1771,7 @@ else if (paginationEnabledList) { if (isAssociationQueryMethod(args) || isAssociationQueryWithJoinSpecificationMethod(args)) { final boolean hasMoreThanOneArg = args.length > 1; Object callable = hasMoreThanOneArg ? args[1] : args[0]; - int joinType = hasMoreThanOneArg ? (Integer)args[0] : org.hibernate.sql.JoinType.INNER_JOIN.getJoinTypeValue(); + int joinType = hasMoreThanOneArg ? (Integer) args[0] : org.hibernate.sql.JoinType.INNER_JOIN.getJoinTypeValue(); if (name.equals(AND) || name.equals(OR) || name.equals(NOT)) { if (criteria == null) { @@ -1755,7 +1781,7 @@ else if (paginationEnabledList) { logicalExpressionStack.add(new LogicalExpression(name)); invokeClosureNode(callable); - LogicalExpression logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size()-1); + LogicalExpression logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size() - 1); addToCriteria(logicalExpression.toCriterion()); return name; @@ -1790,7 +1816,7 @@ else if (paginationEnabledList) { } associationStack.add(name); final String associationPath = getAssociationPath(); - createAliasIfNeccessary(name, associationPath,joinType); + createAliasIfNeccessary(name, associationPath, joinType); // the criteria within an association node are grouped with an implicit AND logicalExpressionStack.add(new LogicalExpression(AND)); invokeClosureNode(callable); @@ -1798,11 +1824,11 @@ else if (paginationEnabledList) { if (!aliasInstanceStack.isEmpty()) { aliasInstanceStack.remove(aliasInstanceStack.size() - 1); } - LogicalExpression logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size()-1); + LogicalExpression logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size() - 1); if (!logicalExpression.args.isEmpty()) { addToCriteria(logicalExpression.toCriterion()); } - associationStack.remove(associationStack.size()-1); + associationStack.remove(associationStack.size() - 1); targetClass = oldTargetClass; return name; @@ -1814,11 +1840,11 @@ else if (paginationEnabledList) { targetClass = pd.getPropertyType(); invokeClosureNode(callable); targetClass = oldTargetClass; - LogicalExpression logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size()-1); + LogicalExpression logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size() - 1); if (!logicalExpression.args.isEmpty()) { addToCriteria(logicalExpression.toCriterion()); } - associationStack.remove(associationStack.size()-1); + associationStack.remove(associationStack.size() - 1); return name; } } @@ -1842,7 +1868,7 @@ else if (args.length == 1 && args[0] != null) { throwRuntimeException(new IllegalArgumentException("call to [" + name + "] with value [" + value + "] requires a String value.")); } - String propertyName = calculatePropertyName((String)value); + String propertyName = calculatePropertyName((String) value); if (name.equals(IS_NULL)) { c = Restrictions.isNull(propertyName); } @@ -1869,7 +1895,6 @@ else if (name.equals(IS_NOT_EMPTY)) { protected abstract List createPagedResultList(Map args); - private boolean isAssociationQueryMethod(Object[] args) { return args.length == 1 && args[0] instanceof Closure; } @@ -1878,7 +1903,6 @@ private boolean isAssociationQueryWithJoinSpecificationMethod(Object[] args) { return args.length == 2 && (args[0] instanceof Number) && (args[1] instanceof Closure); } - private void createAliasIfNeccessary(String associationName, String associationPath, int joinType) { String newAlias; if (aliasMap.containsKey(associationPath)) { @@ -1921,20 +1945,17 @@ public Criteria buildCriteria(Closure criteriaClosure) { return criteria; } - protected abstract void createCriteriaInstance(); protected abstract void cacheCriteriaMapping(); - private void invokeClosureNode(Object args) { - Closure callable = (Closure)args; + Closure callable = (Closure) args; callable.setDelegate(this); callable.setResolveStrategy(Closure.DELEGATE_FIRST); callable.call(); } - /** * adds and returns the given criterion to the currently active criteria set. * this might be either the root criteria or a currently open @@ -1950,19 +1971,18 @@ protected Criterion addToCriteria(Criterion c) { return c; } - - /** * Add order directly to criteria. */ private static void addOrder(Criteria c, String sort, String order, boolean ignoreCase) { if (HibernateQueryConstants.ORDER_DESC.equals(order)) { - c.addOrder( ignoreCase ? Order.desc(sort).ignoreCase() : Order.desc(sort)); + c.addOrder(ignoreCase ? Order.desc(sort).ignoreCase() : Order.desc(sort)); } else { - c.addOrder( ignoreCase ? Order.asc(sort).ignoreCase() : Order.asc(sort) ); + c.addOrder(ignoreCase ? Order.asc(sort).ignoreCase() : Order.asc(sort)); } } + /** * Returns the criteria instance * @return The criteria instance @@ -1997,14 +2017,13 @@ public void setUniqueResult(boolean uniqueResult) { protected abstract Class getClassForAssociationType(Attribute type); - /** * instances of this class are pushed onto the logicalExpressionStack * to represent all the unfinished "and", "or", and "not" expressions. */ protected class LogicalExpression { public final Object name; - public final List args = new ArrayList(); + public final List args = new ArrayList<>(); public LogicalExpression(Object name) { this.name = name; @@ -2047,6 +2066,7 @@ public Junction buildJunction(Junction junction, List criterions) { return junction; } } + /** * Throws a runtime exception where necessary to ensure the session gets closed */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateCriterionAdapter.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateCriterionAdapter.java index 118206d3835..37f682d20e2 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateCriterionAdapter.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateCriterionAdapter.java @@ -18,6 +18,19 @@ */ package org.grails.orm.hibernate.query; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.hibernate.criterion.Conjunction; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Disjunction; +import org.hibernate.criterion.Junction; +import org.hibernate.criterion.Property; +import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.Subqueries; + import org.grails.datastore.gorm.query.criteria.DetachedAssociationCriteria; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.types.Association; @@ -25,11 +38,6 @@ import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.api.QueryableCriteria; import org.grails.datastore.mapping.query.criteria.FunctionCallingCriterion; -import org.hibernate.criterion.*; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; /** * Adapts Grails datastore API to Hibernate API @@ -38,7 +46,7 @@ * @since 2.0 */ public abstract class AbstractHibernateCriterionAdapter { - protected static final Map, CriterionAdaptor> criterionAdaptors = new HashMap, CriterionAdaptor>(); + protected static final Map, CriterionAdaptor> criterionAdaptors = new HashMap<>(); protected static boolean initialized; protected static final String ALIAS = "_alias"; @@ -61,7 +69,6 @@ protected void initialize() { //add simple size criterions (sizeEq, sizeGt, sizeLt, sizeGe, sizeLe) addSizeComparisonCriterionAdapters(); - //add simple criterions (isNull, isNotNull, isEmpty, isNotEmpty) addSimpleCriterionAdapters(); @@ -74,7 +81,6 @@ protected void initialize() { // add subquery adapters (gtAll, geAll, gtSome, ltAll, leAll) addSubqueryCriterionAdapters(); - // add junctions (conjunction, disjunction, negation) addJunctionCriterionAdapters(); @@ -82,7 +88,6 @@ protected void initialize() { addAssociationQueryCriterionAdapters(); } - initialized = true; } @@ -100,21 +105,21 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que criterionAdaptors.put(Query.GreaterThanEqualsAll.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.GreaterThanEqualsAll criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getValue()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getValue()); return Property.forName(getPropertyName(criterion, alias)).geAll(detachedCriteria); } }); criterionAdaptors.put(Query.LessThanAll.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.LessThanAll criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getValue()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getValue()); return Property.forName(getPropertyName(criterion, alias)).ltAll(detachedCriteria); } }); criterionAdaptors.put(Query.LessThanEqualsAll.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.LessThanEqualsAll criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getValue()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getValue()); return Property.forName(getPropertyName(criterion, alias)).leAll(detachedCriteria); } }); @@ -122,28 +127,28 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que criterionAdaptors.put(Query.GreaterThanSome.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.GreaterThanSome criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getValue()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getValue()); return Property.forName(getPropertyName(criterion, alias)).gtSome(detachedCriteria); } }); criterionAdaptors.put(Query.GreaterThanEqualsSome.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.GreaterThanEqualsSome criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getValue()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getValue()); return Property.forName(getPropertyName(criterion, alias)).geSome(detachedCriteria); } }); criterionAdaptors.put(Query.LessThanSome.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.LessThanSome criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getValue()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getValue()); return Property.forName(getPropertyName(criterion, alias)).ltSome(detachedCriteria); } }); criterionAdaptors.put(Query.LessThanEqualsSome.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.LessThanEqualsSome criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getValue()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getValue()); return Property.forName(getPropertyName(criterion, alias)).leSome(detachedCriteria); } }); @@ -151,7 +156,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que criterionAdaptors.put(Query.NotIn.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.NotIn criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getSubquery()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getSubquery()); return Property.forName(getPropertyName(criterion, alias)).notIn(detachedCriteria); } }); @@ -164,7 +169,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que if (subquery.getAlias() == null) { subqueryAlias = criterion.getSubquery().getPersistentEntity().getJavaClass().getSimpleName() + ALIAS; } - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,subquery, subqueryAlias); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, subquery, subqueryAlias); return Subqueries.exists(detachedCriteria); } }); @@ -172,7 +177,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que criterionAdaptors.put(Query.NotExists.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.NotExists criterion, String alias) { - DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery,criterion.getSubquery()); + DetachedCriteria detachedCriteria = toHibernateDetachedCriteria(hibernateQuery, criterion.getSubquery()); return Subqueries.notExists(detachedCriteria); } }); @@ -183,10 +188,10 @@ protected void addAssociationQueryCriterionAdapters() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.Criterion criterion, String alias) { DetachedAssociationCriteria existing = (DetachedAssociationCriteria) criterion; - if(existing.getAlias() == null) { + if (existing.getAlias() == null) { alias = hibernateQuery.handleAssociationQuery(existing.getAssociation(), existing.getCriteria()); } - else{ + else { alias = hibernateQuery.handleAssociationQuery(existing.getAssociation(), existing.getCriteria(), existing.getAlias()); } Association association = existing.getAssociation(); @@ -238,7 +243,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que criterionAdaptors.put(Query.Negation.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.Negation criterion, String alias) { - CriterionAdaptor adapter = (CriterionAdaptor)criterionAdaptors.get(Query.Disjunction.class); + CriterionAdaptor adapter = (CriterionAdaptor) criterionAdaptors.get(Query.Disjunction.class); return Restrictions.not(adapter.toHibernateCriterion(hibernateQuery, new Query.Disjunction(criterion.getCriteria()), alias)); } }); @@ -253,14 +258,13 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que } }); - criterionAdaptors.put(Query.In.class, new CriterionAdaptor() { @Override public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.Criterion criterion, String alias) { Query.In inListQuery = (Query.In) criterion; QueryableCriteria subquery = inListQuery.getSubquery(); - if(subquery != null) { - return Property.forName(getPropertyName(criterion,alias)).in( toHibernateDetachedCriteria(hibernateQuery, subquery) ); + if (subquery != null) { + return Property.forName(getPropertyName(criterion, alias)).in(toHibernateDetachedCriteria(hibernateQuery, subquery)); } else { return Restrictions.in(getPropertyName(criterion, alias), inListQuery.getValues()); @@ -376,7 +380,7 @@ protected void addSizeComparisonCriterionAdapters() { public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.SizeEquals criterion, String alias) { String propertyName = getPropertyName(criterion, alias); Object value = criterion.getValue(); - int size = value instanceof Number ? ((Number)value).intValue() : Integer.parseInt(value.toString()); + int size = value instanceof Number ? ((Number) value).intValue() : Integer.parseInt(value.toString()); return Restrictions.sizeEq(propertyName, size); } }); @@ -386,7 +390,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.SizeGreaterThan criterion, String alias) { String propertyName = getPropertyName(criterion, alias); Object value = criterion.getValue(); - int size = value instanceof Number ? ((Number)value).intValue() : Integer.parseInt(value.toString()); + int size = value instanceof Number ? ((Number) value).intValue() : Integer.parseInt(value.toString()); return Restrictions.sizeGt(propertyName, size); } }); @@ -396,7 +400,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.SizeGreaterThanEquals criterion, String alias) { String propertyName = getPropertyName(criterion, alias); Object value = criterion.getValue(); - int size = value instanceof Number ? ((Number)value).intValue() : Integer.parseInt(value.toString()); + int size = value instanceof Number ? ((Number) value).intValue() : Integer.parseInt(value.toString()); return Restrictions.sizeGe(propertyName, size); } }); @@ -406,7 +410,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.SizeLessThan criterion, String alias) { String propertyName = getPropertyName(criterion, alias); Object value = criterion.getValue(); - int size = value instanceof Number ? ((Number)value).intValue() : Integer.parseInt(value.toString()); + int size = value instanceof Number ? ((Number) value).intValue() : Integer.parseInt(value.toString()); return Restrictions.sizeLt(propertyName, size); } }); @@ -416,7 +420,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.SizeLessThanEquals criterion, String alias) { String propertyName = getPropertyName(criterion, alias); Object value = criterion.getValue(); - int size = value instanceof Number ? ((Number)value).intValue() : Integer.parseInt(value.toString()); + int size = value instanceof Number ? ((Number) value).intValue() : Integer.parseInt(value.toString()); return Restrictions.sizeLe(propertyName, size); } }); @@ -434,7 +438,7 @@ public org.hibernate.criterion.Criterion toHibernateCriterion(AbstractHibernateQ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.Equals criterion, String alias) { String propertyName = getPropertyName(criterion, alias); Object value = criterion.getValue(); - if(value instanceof DetachedCriteria) { + if (value instanceof DetachedCriteria) { return Property.forName(propertyName).eq((DetachedCriteria) value); } return Restrictions.eq(propertyName, value); @@ -467,7 +471,7 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.GreaterThanEquals criterion, String alias) { String propertyName = getPropertyName(criterion, alias); Object value = criterion.getValue(); - if(value instanceof DetachedCriteria) { + if (value instanceof DetachedCriteria) { return Property.forName(propertyName).ge((DetachedCriteria) value); } return Restrictions.ge(propertyName, value); @@ -500,7 +504,6 @@ public Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Que /** utility methods to group and clean up the initialization of the Criterion Adapters**/ protected abstract Criterion createRlikeExpression(String propertyName, String pattern); - protected String getPropertyName(Query.Criterion criterion, String alias) { return calculatePropertyName(((Query.PropertyNameCriterion) criterion).getProperty(), alias); } @@ -534,13 +537,12 @@ protected void applySubCriteriaToJunction(PersistentEntity entity, AbstractHiber else if (subCriterion instanceof FunctionCallingCriterion) { Criterion sqlRestriction = hibernateCriteria.getRestrictionForFunctionCall((FunctionCallingCriterion) subCriterion, entity); if (sqlRestriction != null) { - conjunction.add(sqlRestriction); + conjunction.add(sqlRestriction); } } } } - public org.hibernate.criterion.Criterion toHibernateCriterion(AbstractHibernateQuery hibernateQuery, Query.Criterion criterion, String alias) { final CriterionAdaptor criterionAdaptor = criterionAdaptors.get(criterion.getClass()); if (criterionAdaptor != null) { @@ -549,7 +551,6 @@ public org.hibernate.criterion.Criterion toHibernateCriterion(AbstractHibernateQ return null; } - protected abstract org.hibernate.criterion.DetachedCriteria toHibernateDetachedCriteria(AbstractHibernateQuery query, QueryableCriteria queryableCriteria); protected org.hibernate.criterion.DetachedCriteria toHibernateDetachedCriteria(AbstractHibernateQuery query, QueryableCriteria queryableCriteria, String alias) { diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java index 9e8beae4967..eed1e54beaa 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/AbstractHibernateQuery.java @@ -19,38 +19,33 @@ package org.grails.orm.hibernate.query; import java.lang.reflect.Field; -import java.util.*; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import jakarta.persistence.FetchType; import jakarta.persistence.criteria.JoinType; -import org.grails.datastore.mapping.core.Datastore; -import org.grails.datastore.mapping.proxy.ProxyHandler; -import org.grails.datastore.mapping.query.event.PostQueryEvent; -import org.grails.datastore.mapping.query.event.PreQueryEvent; -import org.grails.orm.hibernate.AbstractHibernateSession; -import org.grails.orm.hibernate.IHibernateTemplate; -import org.grails.orm.hibernate.cfg.AbstractGrailsDomainBinder; -import org.grails.orm.hibernate.cfg.Mapping; -import org.grails.orm.hibernate.proxy.HibernateProxyHandler; -import org.grails.datastore.gorm.finders.DynamicFinder; -import org.grails.datastore.gorm.query.criteria.DetachedAssociationCriteria; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.model.PersistentProperty; -import org.grails.datastore.mapping.model.types.Association; -import org.grails.datastore.mapping.model.types.Embedded; -import org.grails.datastore.mapping.query.AssociationQuery; -import org.grails.datastore.mapping.query.Query; -import org.grails.datastore.mapping.query.api.QueryableCriteria; -import org.grails.datastore.mapping.query.criteria.FunctionCallingCriterion; -import org.hibernate.*; -import org.hibernate.criterion.*; +import org.hibernate.Criteria; +import org.hibernate.FetchMode; +import org.hibernate.LockMode; +import org.hibernate.NonUniqueResultException; +import org.hibernate.SessionFactory; +import org.hibernate.criterion.CriteriaSpecification; +import org.hibernate.criterion.DetachedCriteria; +import org.hibernate.criterion.Projections; +import org.hibernate.criterion.Restrictions; +import org.hibernate.criterion.SimpleExpression; import org.hibernate.dialect.Dialect; import org.hibernate.dialect.function.SQLFunction; import org.hibernate.persister.entity.PropertyMapping; import org.hibernate.type.BasicType; import org.hibernate.type.TypeResolver; + import org.springframework.context.ApplicationEventPublisher; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.support.DefaultConversionService; @@ -58,6 +53,26 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException; import org.springframework.util.ReflectionUtils; +import org.grails.datastore.gorm.finders.DynamicFinder; +import org.grails.datastore.gorm.query.criteria.DetachedAssociationCriteria; +import org.grails.datastore.mapping.core.Datastore; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.PersistentProperty; +import org.grails.datastore.mapping.model.types.Association; +import org.grails.datastore.mapping.model.types.Embedded; +import org.grails.datastore.mapping.proxy.ProxyHandler; +import org.grails.datastore.mapping.query.AssociationQuery; +import org.grails.datastore.mapping.query.Query; +import org.grails.datastore.mapping.query.api.QueryableCriteria; +import org.grails.datastore.mapping.query.criteria.FunctionCallingCriterion; +import org.grails.datastore.mapping.query.event.PostQueryEvent; +import org.grails.datastore.mapping.query.event.PreQueryEvent; +import org.grails.orm.hibernate.AbstractHibernateSession; +import org.grails.orm.hibernate.IHibernateTemplate; +import org.grails.orm.hibernate.cfg.AbstractGrailsDomainBinder; +import org.grails.orm.hibernate.cfg.Mapping; +import org.grails.orm.hibernate.proxy.HibernateProxyHandler; + /** * Bridges the Query API with the Hibernate Criteria API * @@ -72,7 +87,8 @@ public abstract class AbstractHibernateQuery extends Query { protected static final String ALIAS = "_alias"; protected static ConversionService conversionService = new DefaultConversionService(); protected static Field opField = ReflectionUtils.findField(SimpleExpression.class, "op"); - private static final Map JOIN_STATUS_CACHE = new ConcurrentHashMap(); + private static final Map JOIN_STATUS_CACHE = new ConcurrentHashMap<>(); + static { ReflectionUtils.makeAccessible(opField); } @@ -82,10 +98,10 @@ public abstract class AbstractHibernateQuery extends Query { protected AbstractHibernateQuery.HibernateProjectionList hibernateProjectionList; protected String alias; protected int aliasCount; - protected Map createdAssociationPaths = new HashMap(); - protected LinkedList aliasStack = new LinkedList(); - protected LinkedList entityStack = new LinkedList(); - protected LinkedList associationStack = new LinkedList(); + protected Map createdAssociationPaths = new HashMap<>(); + protected LinkedList aliasStack = new LinkedList<>(); + protected LinkedList entityStack = new LinkedList<>(); + protected LinkedList associationStack = new LinkedList<>(); protected LinkedList aliasInstanceStack = new LinkedList(); private boolean hasJoins = false; protected ProxyHandler proxyHandler = new HibernateProxyHandler(); @@ -94,7 +110,7 @@ public abstract class AbstractHibernateQuery extends Query { protected AbstractHibernateQuery(Criteria criteria, AbstractHibernateSession session, PersistentEntity entity) { super(session, entity); this.criteria = criteria; - if(entity != null) { + if (entity != null) { initializeJoinStatus(); } this.abstractHibernateCriterionAdapter = createHibernateCriterionAdapter(); @@ -104,7 +120,7 @@ protected AbstractHibernateQuery(DetachedCriteria criteria, PersistentEntity ent super(null, entity); this.detachedCriteria = criteria; this.abstractHibernateCriterionAdapter = createHibernateCriterionAdapter(); - if(entity != null) { + if (entity != null) { initializeJoinStatus(); } } @@ -117,10 +133,10 @@ protected Object resolveIdIfEntity(Object value) { protected void initializeJoinStatus() { Boolean cachedStatus = JOIN_STATUS_CACHE.get(entity.getName()); - if(cachedStatus != null) hasJoins = cachedStatus; + if (cachedStatus != null) hasJoins = cachedStatus; else { - for(Association a : entity.getAssociations()) { - if( a.getFetchStrategy() == FetchType.EAGER ) hasJoins = true; + for (Association a : entity.getAssociations()) { + if (a.getFetchStrategy() == FetchType.EAGER) hasJoins = true; } } } @@ -180,7 +196,7 @@ else if (criterion instanceof PropertyCriterion) { Association association = associationCriteria.getAssociation(); List criteria = associationCriteria.getCriteria(); - if(association instanceof Embedded) { + if (association instanceof Embedded) { String associationName = association.getName(); if (getCurrentAlias() != null) { associationName = getCurrentAlias() + '.' + associationName; @@ -196,10 +212,10 @@ else if (criterion instanceof PropertyCriterion) { CriteriaAndAlias criteriaAndAlias = getCriteriaAndAlias(associationCriteria); - if(criteriaAndAlias.criteria != null) { + if (criteriaAndAlias.criteria != null) { aliasInstanceStack.add(criteriaAndAlias.criteria); } - else if(criteriaAndAlias.detachedCriteria != null) { + else if (criteriaAndAlias.detachedCriteria != null) { aliasInstanceStack.add(criteriaAndAlias.detachedCriteria); } aliasStack.add(criteriaAndAlias.alias); @@ -231,7 +247,6 @@ else if(criteriaAndAlias.detachedCriteria != null) { } } - @Override public PersistentEntity getEntity() { if (!entityStack.isEmpty()) { @@ -241,7 +256,7 @@ public PersistentEntity getEntity() { } protected String getAssociationPath(String propertyName) { - if(propertyName.indexOf('.') > -1) { + if (propertyName.indexOf('.') > -1) { return propertyName; } else { @@ -286,7 +301,7 @@ static void doTypeConversionIfNeccessary(PersistentEntity entity, PropertyCriter org.hibernate.criterion.Criterion getRestrictionForFunctionCall(FunctionCallingCriterion criterion, PersistentEntity entity) { org.hibernate.criterion.Criterion sqlRestriction; - SessionFactory sessionFactory = ((IHibernateTemplate)session.getNativeInterface()).getSessionFactory(); + SessionFactory sessionFactory = ((IHibernateTemplate) session.getNativeInterface()).getSessionFactory(); String property = criterion.getProperty(); Criterion datastoreCriterion = criterion.getPropertyCriterion(); PersistentProperty pp = entity.getPropertyByName(property); @@ -305,7 +320,7 @@ org.hibernate.criterion.Criterion getRestrictionForFunctionCall(FunctionCallingC if (basic != null && datastoreCriterion instanceof PropertyCriterion) { PropertyCriterion pc = (PropertyCriterion) datastoreCriterion; - final org.hibernate.criterion.Criterion hibernateCriterion = getHibernateCriterionAdapter().toHibernateCriterion(this, datastoreCriterion,alias); + final org.hibernate.criterion.Criterion hibernateCriterion = getHibernateCriterionAdapter().toHibernateCriterion(this, datastoreCriterion, alias); if (hibernateCriterion instanceof SimpleExpression) { SimpleExpression expr = (SimpleExpression) hibernateCriterion; Object op = ReflectionUtils.getField(opField, expr); @@ -327,15 +342,15 @@ org.hibernate.criterion.Criterion getRestrictionForFunctionCall(FunctionCallingC } } else { - throw new InvalidDataAccessResourceUsageException("Unsupported function ["+functionName+"] defined in query for property ["+property+"] with type ["+pp.getType()+"]"); + throw new InvalidDataAccessResourceUsageException("Unsupported function [" + functionName + "] defined in query for property [" + property + "] with type [" + pp.getType() + "]"); } } else { - throw new InvalidDataAccessResourceUsageException("Unsupported function ["+functionName+"] defined in query for property ["+property+"] with type ["+pp.getType()+"]"); + throw new InvalidDataAccessResourceUsageException("Unsupported function [" + functionName + "] defined in query for property [" + property + "] with type [" + pp.getType() + "]"); } } else { - throw new InvalidDataAccessResourceUsageException("Unsupported function defined in query ["+functionName+"]"); + throw new InvalidDataAccessResourceUsageException("Unsupported function defined in query [" + functionName + "]"); } return sqlRestriction; } @@ -468,10 +483,10 @@ public AssociationQuery createQuery(String associationName) { CriteriaAndAlias subCriteria = getOrCreateAlias(associationName, alias); Association association = (Association) property; - if(subCriteria.criteria != null) { + if (subCriteria.criteria != null) { return new HibernateAssociationQuery(subCriteria.criteria, (AbstractHibernateSession) getSession(), association.getAssociatedEntity(), association, alias); } - else if(subCriteria.detachedCriteria != null) { + else if (subCriteria.detachedCriteria != null) { return new HibernateAssociationQuery(subCriteria.detachedCriteria, (AbstractHibernateSession) getSession(), association.getAssociatedEntity(), association, alias); } } @@ -482,7 +497,7 @@ protected CriteriaAndAlias getCriteriaAndAlias(DetachedAssociationCriteria assoc String associationPath = associationCriteria.getAssociationPath(); String alias = associationCriteria.getAlias(); - if(associationPath == null) { + if (associationPath == null) { associationPath = associationCriteria.getAssociation().getName(); } return getOrCreateAlias(associationPath, alias); @@ -492,14 +507,14 @@ protected CriteriaAndAlias getOrCreateAlias(String associationName, String alias CriteriaAndAlias subCriteria = null; String associationPath = getAssociationPath(associationName); Criteria parentCriteria = criteria; - if(alias == null) { + if (alias == null) { alias = generateAlias(associationName); } else { CriteriaAndAlias criteriaAndAlias = createdAssociationPaths.get(alias); - if(criteriaAndAlias != null) { + if (criteriaAndAlias != null) { parentCriteria = criteriaAndAlias.criteria; - if(parentCriteria != null) { + if (parentCriteria != null) { alias = associationName + '_' + alias; associationPath = criteriaAndAlias.associationPath + '.' + associationPath; @@ -511,25 +526,25 @@ protected CriteriaAndAlias getOrCreateAlias(String associationName, String alias } else { JoinType joinType = joinTypes.get(associationName); - if(parentCriteria != null) { + if (parentCriteria != null) { Criteria sc = parentCriteria.createAlias(associationPath, alias, resolveJoinType(joinType)); subCriteria = new CriteriaAndAlias(sc, alias, associationPath); } - else if(detachedCriteria != null) { + else if (detachedCriteria != null) { DetachedCriteria sc = detachedCriteria.createAlias(associationPath, alias, resolveJoinType(joinType)); subCriteria = new CriteriaAndAlias(sc, alias, associationPath); } - if(subCriteria != null) { + if (subCriteria != null) { - createdAssociationPaths.put(associationPath,subCriteria); - createdAssociationPaths.put(alias,subCriteria); + createdAssociationPaths.put(associationPath, subCriteria); + createdAssociationPaths.put(alias, subCriteria); } } return subCriteria; } private org.hibernate.sql.JoinType resolveJoinType(JoinType joinType) { - if(joinType == null) { + if (joinType == null) { return org.hibernate.sql.JoinType.INNER_JOIN; } switch (joinType) { @@ -552,21 +567,21 @@ public ProjectionList projections() { @Override public Query max(int max) { - if(criteria != null) + if (criteria != null) criteria.setMaxResults(max); return this; } @Override public Query maxResults(int max) { - if(criteria != null) + if (criteria != null) criteria.setMaxResults(max); return this; } @Override public Query offset(int offset) { - if(criteria != null) + if (criteria != null) criteria.setFirstResult(offset); return this; } @@ -598,12 +613,12 @@ public Query order(Order order) { String property = order.getProperty(); int i = property.indexOf('.'); - if(i > -1) { + if (i > -1) { - String sortHead = property.substring(0,i); + String sortHead = property.substring(0, i); String sortTail = property.substring(i + 1); - if(createdAssociationPaths.containsKey(sortHead)) { + if (createdAssociationPaths.containsKey(sortHead)) { CriteriaAndAlias criteriaAndAlias = createdAssociationPaths.get(sortHead); Criteria criteria = criteriaAndAlias.criteria; org.hibernate.criterion.Order hibernateOrder = order.getDirection() == Order.Direction.ASC ? @@ -616,17 +631,17 @@ public Query order(Order order) { PersistentProperty persistentProperty = entity.getPropertyByName(sortHead); - if(persistentProperty instanceof Association) { + if (persistentProperty instanceof Association) { Association a = (Association) persistentProperty; - if(persistentProperty instanceof Embedded) { + if (persistentProperty instanceof Embedded) { addSimpleOrder(order, property); } else { - if(criteria != null) { + if (criteria != null) { Criteria subCriteria = criteria.createCriteria(sortHead); addOrderToCriteria(subCriteria, sortTail, order); } - else if(detachedCriteria != null) { + else if (detachedCriteria != null) { DetachedCriteria subDetachedCriteria = detachedCriteria.createCriteria(sortHead); addOrderToDetachedCriteria(subDetachedCriteria, sortTail, order); } @@ -634,7 +649,6 @@ else if(detachedCriteria != null) { } } - } else { addSimpleOrder(order, property); @@ -645,16 +659,16 @@ else if(detachedCriteria != null) { private void addSimpleOrder(Order order, String property) { Criteria c = criteria; - if(c != null) { + if (c != null) { addOrderToCriteria(c, property, order); - }else { + } else { DetachedCriteria dc = detachedCriteria; addOrderToDetachedCriteria(dc, property, order); } } private void addOrderToDetachedCriteria(DetachedCriteria dc, String property, Order order) { - if(dc != null) { + if (dc != null) { org.hibernate.criterion.Order hibernateOrder = order.getDirection() == Order.Direction.ASC ? org.hibernate.criterion.Order.asc(calculatePropertyName(property)) : org.hibernate.criterion.Order.desc(calculatePropertyName(property)); @@ -674,9 +688,9 @@ private void addOrderToCriteria(Criteria c, String property, Order order) { @Override public Query join(String property) { this.hasJoins = true; - if(criteria != null) + if (criteria != null) criteria.setFetchMode(property, FetchMode.JOIN); - else if(detachedCriteria != null) + else if (detachedCriteria != null) detachedCriteria.setFetchMode(property, FetchMode.JOIN); return this; } @@ -684,22 +698,22 @@ else if(detachedCriteria != null) @Override public Query select(String property) { this.hasJoins = true; - if(criteria != null) + if (criteria != null) criteria.setFetchMode(property, FetchMode.SELECT); - else if(detachedCriteria != null) + else if (detachedCriteria != null) detachedCriteria.setFetchMode(property, FetchMode.SELECT); return this; } @Override public List list() { - if(criteria == null) throw new IllegalStateException("Cannot execute query using a detached criteria instance"); + if (criteria == null) throw new IllegalStateException("Cannot execute query using a detached criteria instance"); int projectionLength = 0; if (hibernateProjectionList != null) { org.hibernate.criterion.ProjectionList projectionList = hibernateProjectionList.getHibernateProjectionList(); projectionLength = projectionList.getLength(); - if(projectionLength > 0) { + if (projectionLength > 0) { criteria.setProjection(projectionList); } } @@ -717,25 +731,25 @@ public List list() { public List listForCriteria() { Datastore datastore = session.getDatastore(); ApplicationEventPublisher publisher = datastore.getApplicationEventPublisher(); - if(publisher != null) { + if (publisher != null) { publisher.publishEvent(new PreQueryEvent(datastore, this)); } List results = criteria.list(); - if(publisher != null) { + if (publisher != null) { publisher.publishEvent(new PostQueryEvent(datastore, this, results)); } return results; } protected void applyDefaultSortOrderAndCaching() { - if(this.orderBy.isEmpty() && entity != null) { + if (this.orderBy.isEmpty() && entity != null) { // don't apply default sorting, if projections present - if(hibernateProjectionList != null && !hibernateProjectionList.isEmpty()) return; + if (hibernateProjectionList != null && !hibernateProjectionList.isEmpty()) return; Mapping mapping = AbstractGrailsDomainBinder.getMapping(entity.getJavaClass()); - if(mapping != null) { - if(queryCache == null && mapping.getCache() != null && mapping.getCache().isEnabled()) { + if (mapping != null) { + if (queryCache == null && mapping.getCache() != null && mapping.getCache().isEnabled()) { criteria.setCacheable(true); } @@ -748,17 +762,17 @@ protected void applyDefaultSortOrderAndCaching() { protected void applyFetchStrategies() { for (Map.Entry entry : fetchStrategies.entrySet()) { - switch(entry.getValue()) { + switch (entry.getValue()) { case EAGER: - if(criteria != null) + if (criteria != null) criteria.setFetchMode(entry.getKey(), FetchMode.JOIN); - else if(detachedCriteria != null) + else if (detachedCriteria != null) detachedCriteria.setFetchMode(entry.getKey(), FetchMode.JOIN); break; case LAZY: - if(criteria != null) + if (criteria != null) criteria.setFetchMode(entry.getKey(), FetchMode.SELECT); - else if(detachedCriteria != null) + else if (detachedCriteria != null) detachedCriteria.setFetchMode(entry.getKey(), FetchMode.SELECT); break; } @@ -772,7 +786,7 @@ protected void flushBeforeQuery() { @Override public Object singleResult() { - if(criteria == null) throw new IllegalStateException("Cannot execute query using a detached criteria instance"); + if (criteria == null) throw new IllegalStateException("Cannot execute query using a detached criteria instance"); if (hibernateProjectionList != null) { criteria.setProjection(hibernateProjectionList.getHibernateProjectionList()); @@ -783,12 +797,12 @@ public Object singleResult() { Datastore datastore = session.getDatastore(); ApplicationEventPublisher publisher = datastore.getApplicationEventPublisher(); - if(publisher != null) { + if (publisher != null) { publisher.publishEvent(new PreQueryEvent(datastore, this)); } Object result; - if(hasJoins) { + if (hasJoins) { try { result = proxyHandler.unwrap(criteria.uniqueResult());; } catch (NonUniqueResultException e) { @@ -798,7 +812,7 @@ public Object singleResult() { else { result = singleResultViaListCall(); } - if(publisher != null) { + if (publisher != null) { publisher.publishEvent(new PostQueryEvent(datastore, this, Collections.singletonList(result))); } return result; @@ -806,17 +820,16 @@ public Object singleResult() { private Object singleResultViaListCall() { criteria.setMaxResults(1); - if(hibernateProjectionList != null && hibernateProjectionList.isRowCount()) { + if (hibernateProjectionList != null && hibernateProjectionList.isRowCount()) { criteria.setFirstResult(0); } List results = criteria.list(); - if(results.size()>0) { + if (results.size() > 0) { return proxyHandler.unwrap(results.get(0)); } return null; } - @Override protected List executeQuery(PersistentEntity entity, Junction criteria) { return list(); @@ -843,20 +856,20 @@ protected void addToCriteria(org.hibernate.criterion.Criterion criterion) { } if (aliasInstanceStack.isEmpty()) { - if(criteria != null) { + if (criteria != null) { criteria.add(criterion); } - else if(detachedCriteria != null) { + else if (detachedCriteria != null) { detachedCriteria.add(criterion); } } else { Object criteriaObject = aliasInstanceStack.getLast(); - if(criteriaObject instanceof Criteria) - ((Criteria)criteriaObject).add(criterion); - else if(criteriaObject instanceof DetachedCriteria) { - ((DetachedCriteria)criteriaObject).add(criterion); + if (criteriaObject instanceof Criteria) + ((Criteria) criteriaObject).add(criterion); + else if (criteriaObject instanceof DetachedCriteria) { + ((DetachedCriteria) criteriaObject).add(criterion); } } } @@ -931,7 +944,6 @@ public boolean isEmpty() { return projectionList.getLength() == 0; } - @Override public ProjectionList add(Projection p) { projectionList.add(new HibernateProjectionAdapter(p).toHibernateProjection()); @@ -1002,9 +1014,9 @@ public ProjectionList avg(String name) { @Override public ProjectionList distinct() { - if(criteria != null) + if (criteria != null) criteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); - else if(detachedCriteria != null) + else if (detachedCriteria != null) detachedCriteria.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY); return this; } @@ -1033,7 +1045,7 @@ public HibernateAssociationQuery(DetachedCriteria criteria, AbstractHibernateSes public Query order(Order order) { Order.Direction direction = order.getDirection(); - switch(direction) { + switch (direction) { case ASC: assocationCriteria.addOrder(org.hibernate.criterion.Order.asc(order.getProperty())); case DESC: @@ -1050,15 +1062,15 @@ public Query isEmpty(String property) { } protected void addToCriteria(org.hibernate.criterion.Criterion criterion) { - if (hibernateJunction != null) { - hibernateJunction.add(criterion); - } - else if(assocationCriteria != null) { - assocationCriteria.add(criterion); - } - else if(detachedAssocationCriteria != null) { - detachedAssocationCriteria.add(criterion); - } + if (hibernateJunction != null) { + hibernateJunction.add(criterion); + } + else if (assocationCriteria != null) { + assocationCriteria.add(criterion); + } + else if (detachedAssocationCriteria != null) { + detachedAssocationCriteria.add(criterion); + } } @Override diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java index 8a12def8605..2a6e6406a87 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/GrailsHibernateQueryUtils.java @@ -19,27 +19,34 @@ package org.grails.orm.hibernate.query; -import org.grails.datastore.mapping.config.Property; -import org.grails.datastore.mapping.reflect.ClassUtils; -import org.grails.orm.hibernate.cfg.AbstractGrailsDomainBinder; -import org.grails.orm.hibernate.cfg.Mapping; -import org.grails.datastore.gorm.finders.DynamicFinder; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.model.PersistentProperty; -import org.grails.datastore.mapping.model.types.Association; -import org.grails.datastore.mapping.model.types.Embedded; +import java.util.Map; + +import jakarta.persistence.LockModeType; +import jakarta.persistence.criteria.CriteriaBuilder; +import jakarta.persistence.criteria.CriteriaQuery; +import jakarta.persistence.criteria.Expression; +import jakarta.persistence.criteria.From; +import jakarta.persistence.criteria.Join; +import jakarta.persistence.criteria.Root; + import org.hibernate.Criteria; import org.hibernate.FetchMode; import org.hibernate.FlushMode; import org.hibernate.LockMode; import org.hibernate.criterion.Order; import org.hibernate.query.Query; -import org.springframework.core.convert.ConversionService; -import jakarta.persistence.LockModeType; -import jakarta.persistence.criteria.*; -import java.util.Map; +import org.springframework.core.convert.ConversionService; +import org.grails.datastore.gorm.finders.DynamicFinder; +import org.grails.datastore.mapping.config.Property; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.PersistentProperty; +import org.grails.datastore.mapping.model.types.Association; +import org.grails.datastore.mapping.model.types.Embedded; +import org.grails.datastore.mapping.reflect.ClassUtils; +import org.grails.orm.hibernate.cfg.AbstractGrailsDomainBinder; +import org.grails.orm.hibernate.cfg.Mapping; /** * Utility methods for configuring Hibernate queries @@ -179,12 +186,12 @@ public static void populateArgumentsForCriteria( Map sortMap = (Map) sortObj; for (Object sort : sortMap.keySet()) { final String order = DynamicFinder.ORDER_DESC.equalsIgnoreCase((String) sortMap.get(sort)) ? DynamicFinder.ORDER_DESC : DynamicFinder.ORDER_ASC; - addOrderPossiblyNested(query,queryRoot, criteriaBuilder, entity, (String) sort, order, ignoreCase); + addOrderPossiblyNested(query, queryRoot, criteriaBuilder, entity, (String) sort, order, ignoreCase); } } else { final String sort = (String) sortObj; final String order = DynamicFinder.ORDER_DESC.equalsIgnoreCase(orderParam) ? DynamicFinder.ORDER_DESC : DynamicFinder.ORDER_ASC; - addOrderPossiblyNested(query, queryRoot, criteriaBuilder,entity, sort, order, ignoreCase); + addOrderPossiblyNested(query, queryRoot, criteriaBuilder, entity, sort, order, ignoreCase); } } else if (useDefaultMapping) { Mapping m = AbstractGrailsDomainBinder.getMapping(entity.getJavaClass()); @@ -192,7 +199,7 @@ public static void populateArgumentsForCriteria( Map sortMap = m.getSort().getNamesAndDirections(); for (Object sort : sortMap.keySet()) { final String order = DynamicFinder.ORDER_DESC.equalsIgnoreCase((String) sortMap.get(sort)) ? DynamicFinder.ORDER_DESC : DynamicFinder.ORDER_ASC; - addOrderPossiblyNested(query,queryRoot, criteriaBuilder, entity, (String) sort, order, true); + addOrderPossiblyNested(query, queryRoot, criteriaBuilder, entity, (String) sort, order, true); } } } @@ -279,7 +286,6 @@ private static void addOrderPossiblyNested(Criteria c, PersistentEntity entity, } } - /** * Add order to criteria, creating necessary subCriteria if nested sort property (ie. sort:'nested.property'). */ diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateCriterionAdapter.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateCriterionAdapter.java index c5e779ea4cf..ec2edab7c7b 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateCriterionAdapter.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateCriterionAdapter.java @@ -18,14 +18,12 @@ */ package org.grails.orm.hibernate.query; +import org.hibernate.criterion.Criterion; +import org.hibernate.criterion.DetachedCriteria; + import grails.orm.HibernateCriteriaBuilder; import grails.orm.RlikeExpression; - -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.api.QueryableCriteria; -import org.hibernate.criterion.Criterion; -import org.hibernate.criterion.DetachedCriteria; /** * @author Graeme Rocher diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateHqlQuery.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateHqlQuery.java index e0a5f41914a..3bf5c1b01a9 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateHqlQuery.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateHqlQuery.java @@ -19,15 +19,16 @@ package org.grails.orm.hibernate.query; +import java.util.List; + +import org.springframework.context.ApplicationEventPublisher; + import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.event.PostQueryEvent; import org.grails.datastore.mapping.query.event.PreQueryEvent; -import org.springframework.context.ApplicationEventPublisher; - -import java.util.List; /** * A query implementation for HQL queries @@ -55,7 +56,7 @@ protected List executeQuery(PersistentEntity entity, Junction criteria) { PreQueryEvent preQueryEvent = new PreQueryEvent(datastore, this); applicationEventPublisher.publishEvent(preQueryEvent); - if(uniqueResult) { + if (uniqueResult) { query.setMaxResults(1); List results = query.list(); applicationEventPublisher.publishEvent(new PostQueryEvent(datastore, this, results)); diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateProjectionAdapter.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateProjectionAdapter.java index 971dba57ff0..d296b01d038 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateProjectionAdapter.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateProjectionAdapter.java @@ -21,10 +21,11 @@ import java.util.HashMap; import java.util.Map; -import org.grails.datastore.mapping.query.Query; import org.hibernate.criterion.Projection; import org.hibernate.criterion.Projections; +import org.grails.datastore.mapping.query.Query; + /** * Adapts Grails datastore API to Hibernate projections. * @@ -78,7 +79,7 @@ public HibernateProjectionAdapter(Query.Projection projection) { public Projection toHibernateProjection() { ProjectionAdapter projectionAdapter = adapterMap.get(projection.getClass()); - if(projectionAdapter == null) throw new UnsupportedOperationException("Unsupported projection used: " + projection.getClass().getName()); + if (projectionAdapter == null) throw new UnsupportedOperationException("Unsupported projection used: " + projection.getClass().getName()); return projectionAdapter.toHibernateProjection(projection); } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java index 2bf3b138830..8d016e2e760 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/HibernateQuery.java @@ -18,21 +18,10 @@ */ package org.grails.orm.hibernate.query; -import grails.orm.HibernateCriteriaBuilder; -import grails.orm.RlikeExpression; - -import java.sql.SQLException; import java.util.Iterator; import java.util.List; -import org.grails.orm.hibernate.AbstractHibernateSession; -import org.grails.orm.hibernate.GrailsHibernateTemplate; -import org.grails.orm.hibernate.HibernateSession; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.query.api.QueryableCriteria; import org.hibernate.Criteria; -import org.hibernate.HibernateException; -import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.criterion.DetachedCriteria; import org.hibernate.dialect.Dialect; @@ -43,6 +32,14 @@ import org.hibernate.type.BasicType; import org.hibernate.type.TypeResolver; +import grails.orm.HibernateCriteriaBuilder; +import grails.orm.RlikeExpression; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.query.api.QueryableCriteria; +import org.grails.orm.hibernate.AbstractHibernateSession; +import org.grails.orm.hibernate.GrailsHibernateTemplate; +import org.grails.orm.hibernate.HibernateSession; + /** * Bridges the Query API with the Hibernate Criteria API * diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/PagedResultList.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/PagedResultList.java index 5ae8f7dc4e6..e1add6d6c26 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/PagedResultList.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/query/PagedResultList.java @@ -18,16 +18,18 @@ */ package org.grails.orm.hibernate.query; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.orm.hibernate.GrailsHibernateTemplate; -import org.hibernate.HibernateException; -import org.hibernate.Session; -import org.hibernate.query.Query; +import java.sql.SQLException; import jakarta.persistence.criteria.CriteriaBuilder; import jakarta.persistence.criteria.CriteriaQuery; import jakarta.persistence.criteria.Root; -import java.sql.SQLException; + +import org.hibernate.HibernateException; +import org.hibernate.Session; +import org.hibernate.query.Query; + +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.orm.hibernate.GrailsHibernateTemplate; public class PagedResultList extends grails.gorm.PagedResultList { @@ -59,12 +61,12 @@ protected void initialize() { @Override public int getTotalCount() { if (totalCount == Integer.MIN_VALUE) { - totalCount = hibernateTemplate.execute(new GrailsHibernateTemplate.HibernateCallback() { + totalCount = hibernateTemplate.execute(new GrailsHibernateTemplate.HibernateCallback<>() { public Integer doInHibernate(Session session) throws HibernateException, SQLException { final CriteriaQuery finalQuery = criteriaQuery.select(criteriaBuilder.count(queryRoot)).distinct(true).orderBy(); final Query query = session.createQuery(finalQuery); hibernateTemplate.applySettings(query); - return ((Number)query.uniqueResult()).intValue(); + return ((Number) query.uniqueResult()).intValue(); } }); } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/AbstractClosureEventTriggeringInterceptor.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/AbstractClosureEventTriggeringInterceptor.java index 9379b11fd98..c395e9bd0a2 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/AbstractClosureEventTriggeringInterceptor.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/AbstractClosureEventTriggeringInterceptor.java @@ -20,7 +20,15 @@ package org.grails.orm.hibernate.support; import org.hibernate.event.internal.DefaultSaveOrUpdateEventListener; -import org.hibernate.event.spi.*; +import org.hibernate.event.spi.PostDeleteEventListener; +import org.hibernate.event.spi.PostInsertEventListener; +import org.hibernate.event.spi.PostLoadEventListener; +import org.hibernate.event.spi.PostUpdateEventListener; +import org.hibernate.event.spi.PreDeleteEventListener; +import org.hibernate.event.spi.PreInsertEventListener; +import org.hibernate.event.spi.PreLoadEventListener; +import org.hibernate.event.spi.PreUpdateEventListener; + import org.springframework.context.ApplicationContextAware; /** diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventListener.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventListener.java index c3e694a7c45..fe0f31e1597 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventListener.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventListener.java @@ -18,39 +18,60 @@ */ package org.grails.orm.hibernate.support; +import java.lang.reflect.Field; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + import groovy.lang.Closure; import groovy.lang.GroovySystem; import groovy.lang.MetaClass; -import org.grails.datastore.gorm.GormValidateable; -import org.grails.datastore.gorm.support.BeforeValidateHelper.BeforeValidateEventTriggerCaller; -import org.grails.datastore.gorm.support.EventTriggerCaller; -import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; -import org.grails.datastore.mapping.engine.event.ValidationEvent; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.model.PersistentProperty; -import org.grails.datastore.mapping.model.config.GormProperties; -import org.grails.datastore.mapping.reflect.ClassUtils; -import org.grails.datastore.mapping.reflect.EntityReflector; -import org.grails.datastore.mapping.validation.ValidationException; -import org.grails.orm.hibernate.AbstractHibernateGormValidationApi; + import org.hibernate.FlushMode; import org.hibernate.HibernateException; import org.hibernate.Session; import org.hibernate.action.internal.EntityUpdateAction; import org.hibernate.engine.spi.ActionQueue; import org.hibernate.engine.spi.ExecutableList; -import org.hibernate.event.spi.*; +import org.hibernate.event.spi.AbstractEvent; +import org.hibernate.event.spi.AbstractPreDatabaseOperationEvent; +import org.hibernate.event.spi.PostDeleteEvent; +import org.hibernate.event.spi.PostDeleteEventListener; +import org.hibernate.event.spi.PostInsertEvent; +import org.hibernate.event.spi.PostInsertEventListener; +import org.hibernate.event.spi.PostLoadEvent; +import org.hibernate.event.spi.PostLoadEventListener; +import org.hibernate.event.spi.PostUpdateEvent; +import org.hibernate.event.spi.PostUpdateEventListener; +import org.hibernate.event.spi.PreDeleteEvent; +import org.hibernate.event.spi.PreDeleteEventListener; +import org.hibernate.event.spi.PreInsertEvent; +import org.hibernate.event.spi.PreLoadEvent; +import org.hibernate.event.spi.PreLoadEventListener; +import org.hibernate.event.spi.PreUpdateEvent; +import org.hibernate.event.spi.PreUpdateEventListener; +import org.hibernate.event.spi.SaveOrUpdateEvent; +import org.hibernate.event.spi.SaveOrUpdateEventListener; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.tuple.entity.EntityMetamodel; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.util.ReflectionUtils; import org.springframework.validation.Errors; -import java.lang.reflect.Field; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import org.grails.datastore.gorm.GormValidateable; +import org.grails.datastore.gorm.support.BeforeValidateHelper.BeforeValidateEventTriggerCaller; +import org.grails.datastore.gorm.support.EventTriggerCaller; +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; +import org.grails.datastore.mapping.engine.event.ValidationEvent; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.PersistentProperty; +import org.grails.datastore.mapping.model.config.GormProperties; +import org.grails.datastore.mapping.reflect.ClassUtils; +import org.grails.datastore.mapping.reflect.EntityReflector; +import org.grails.datastore.mapping.validation.ValidationException; +import org.grails.orm.hibernate.AbstractHibernateGormValidationApi; /** *

Invokes closure events on domain entities such as beforeInsert, beforeUpdate and beforeDelete. @@ -101,7 +122,7 @@ public ClosureEventListener(PersistentEntity persistentEntity, boolean failOnErr saveOrUpdateCaller = buildCaller(AbstractPersistenceEvent.ONLOAD_SAVE, domainClazz); beforeInsertCaller = buildCaller(AbstractPersistenceEvent.BEFORE_INSERT_EVENT, domainClazz); EventTriggerCaller preLoadEventCaller = buildCaller(AbstractPersistenceEvent.ONLOAD_EVENT, domainClazz); - if (preLoadEventCaller == null) { + if (preLoadEventCaller == null) { this.preLoadEventCaller = buildCaller(AbstractPersistenceEvent.BEFORE_LOAD_EVENT, domainClazz); } else { @@ -127,16 +148,15 @@ public ClosureEventListener(PersistentEntity persistentEntity, boolean failOnErr validateParams.put(AbstractHibernateGormValidationApi.ARGUMENT_DEEP_VALIDATE, Boolean.FALSE); try { - actionQueueUpdatesField=ReflectionUtils.findField(ActionQueue.class, "updates"); + actionQueueUpdatesField = ReflectionUtils.findField(ActionQueue.class, "updates"); actionQueueUpdatesField.setAccessible(true); - entityUpdateActionStateField=ReflectionUtils.findField(EntityUpdateAction.class, "state"); + entityUpdateActionStateField = ReflectionUtils.findField(EntityUpdateAction.class, "state"); entityUpdateActionStateField.setAccessible(true); } catch (Exception e) { // ignore } } - public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException { // no-op, merely a hook for plugins to override } @@ -229,7 +249,7 @@ public boolean onPreDelete(final PreDeleteEvent event) { return false; } - return doWithManualSession(event, new Closure(this) { + return doWithManualSession(event, new Closure<>(this) { @Override public Boolean call() { return preDeleteEventListener.call(event.getEntity()); @@ -238,7 +258,7 @@ public Boolean call() { } public boolean onPreUpdate(final PreUpdateEvent event) { - return doWithManualSession(event, new Closure(this) { + return doWithManualSession(event, new Closure<>(this) { @Override public Boolean call() { Object entity = event.getEntity(); @@ -255,7 +275,7 @@ public Boolean call() { } public boolean onPreInsert(final PreInsertEvent event) { - return doWithManualSession(event, new Closure(this) { + return doWithManualSession(event, new Closure<>(this) { @Override public Boolean call() { Object entity = event.getEntity(); @@ -282,13 +302,13 @@ public void onValidate(ValidationEvent event) { protected boolean doValidate(Object entity) { boolean evict = false; GormValidateable validateable = (GormValidateable) entity; - if ( !validateable.shouldSkipValidation() - && !validateable.validate(validateParams)) { + if (!validateable.shouldSkipValidation() && + !validateable.validate(validateParams)) { evict = true; if (failOnErrorEnabled) { Errors errors = validateable.getErrors(); - throw ValidationException.newInstance("Validation error whilst flushing entity [" + entity.getClass().getName() - + "]", errors); + throw ValidationException.newInstance("Validation error whilst flushing entity [" + entity.getClass().getName() + + "]", errors); } } return evict; @@ -306,25 +326,25 @@ private void synchronizePersisterState(AbstractPreDatabaseOperationEvent event, private void synchronizePersisterState(AbstractPreDatabaseOperationEvent event, Object[] state, EntityPersister persister, String[] propertyNames) { Object entity = event.getEntity(); EntityReflector reflector = persistentEntity.getReflector(); - HashMap changedState= new HashMap<>(); + HashMap changedState = new HashMap<>(); EntityMetamodel entityMetamodel = persister.getEntityMetamodel(); for (int i = 0; i < propertyNames.length; i++) { String p = propertyNames[i]; Integer index = entityMetamodel.getPropertyIndexOrNull(p); - if(index == null) continue; - + if (index == null) continue; + PersistentProperty property = persistentEntity.getPropertyByName(p); if (property == null) { continue; } String propertyName = property.getName(); - if(GormProperties.VERSION.equals(propertyName)) { + if (GormProperties.VERSION.equals(propertyName)) { continue; } Object value = reflector.getProperty(entity, propertyName); - if(state[index] != value) { + if (state[index] != value) { changedState.put(i, value); } state[index] = value; @@ -335,15 +355,15 @@ private void synchronizePersisterState(AbstractPreDatabaseOperationEvent event, private void synchronizeEntityUpdateActionState(AbstractPreDatabaseOperationEvent event, Object entity, HashMap changedState) { - if(actionQueueUpdatesField != null && event instanceof PreInsertEvent && changedState.size() > 0) { + if (actionQueueUpdatesField != null && event instanceof PreInsertEvent && changedState.size() > 0) { try { - ExecutableList updates = (ExecutableList)actionQueueUpdatesField.get(event.getSession().getActionQueue()); - if(updates != null) { + ExecutableList updates = (ExecutableList) actionQueueUpdatesField.get(event.getSession().getActionQueue()); + if (updates != null) { for (EntityUpdateAction updateAction : updates) { - if(updateAction.getInstance() == entity) { - Object[] updateState = (Object[])entityUpdateActionStateField.get(updateAction); + if (updateAction.getInstance() == entity) { + Object[] updateState = (Object[]) entityUpdateActionStateField.get(updateAction); if (updateState != null) { - for(Map.Entry entry : changedState.entrySet()) { + for (Map.Entry entry : changedState.entrySet()) { updateState[entry.getKey()] = entry.getValue(); } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java index b5f03c11157..422e12cbe6b 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/ClosureEventTriggeringInterceptor.java @@ -18,17 +18,8 @@ */ package org.grails.orm.hibernate.support; -import org.grails.datastore.gorm.events.AutoTimestampEventListener; -import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher; -import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher; -import org.grails.datastore.mapping.dirty.checking.DirtyCheckable; -import org.grails.datastore.mapping.engine.ModificationTrackingEntityAccess; -import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; -import org.grails.datastore.mapping.model.MappingContext; -import org.grails.datastore.mapping.model.PersistentEntity; -import org.grails.datastore.mapping.model.types.Embedded; -import org.grails.datastore.mapping.proxy.ProxyHandler; -import org.grails.orm.hibernate.AbstractHibernateDatastore; +import java.util.Map; + import org.hibernate.Hibernate; import org.hibernate.HibernateException; import org.hibernate.event.spi.AbstractEvent; @@ -43,11 +34,22 @@ import org.hibernate.event.spi.SaveOrUpdateEvent; import org.hibernate.persister.entity.EntityPersister; import org.hibernate.tuple.entity.EntityMetamodel; + import org.springframework.beans.BeansException; import org.springframework.context.ApplicationContext; import org.springframework.context.ConfigurableApplicationContext; -import java.util.Map; +import org.grails.datastore.gorm.events.AutoTimestampEventListener; +import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher; +import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher; +import org.grails.datastore.mapping.dirty.checking.DirtyCheckable; +import org.grails.datastore.mapping.engine.ModificationTrackingEntityAccess; +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.types.Embedded; +import org.grails.datastore.mapping.proxy.ProxyHandler; +import org.grails.orm.hibernate.AbstractHibernateDatastore; /** * Listens for Hibernate events and publishes corresponding Datastore events. @@ -81,7 +83,7 @@ public void setEventPublisher(ConfigurableApplicationEventPublisher eventPublish @Override public void onSaveOrUpdate(SaveOrUpdateEvent hibernateEvent) throws HibernateException { Object entity = getEntity(hibernateEvent); - if(entity != null && proxyHandler.isInitialized(entity)) { + if (entity != null && proxyHandler.isInitialized(entity)) { activateDirtyChecking(entity); org.grails.datastore.mapping.engine.event.SaveOrUpdateEvent grailsEvent = new org.grails.datastore.mapping.engine.event.SaveOrUpdateEvent( this.datastore, entity); @@ -92,7 +94,7 @@ public void onSaveOrUpdate(SaveOrUpdateEvent hibernateEvent) throws HibernateExc protected Object getEntity(SaveOrUpdateEvent hibernateEvent) { Object object = hibernateEvent.getObject(); - if(object != null) { + if (object != null) { return object; } else { @@ -119,7 +121,7 @@ public boolean onPreInsert(PreInsertEvent hibernateEvent) { PersistentEntity persistentEntity = mappingContext.getPersistentEntity(type.getName()); AbstractPersistenceEvent grailsEvent; ModificationTrackingEntityAccess entityAccess = null; - if(persistentEntity != null) { + if (persistentEntity != null) { entityAccess = new ModificationTrackingEntityAccess(mappingContext.createEntityAccess(persistentEntity, entity)); grailsEvent = new org.grails.datastore.mapping.engine.event.PreInsertEvent(this.datastore, persistentEntity, entityAccess); } @@ -130,7 +132,7 @@ public boolean onPreInsert(PreInsertEvent hibernateEvent) { publishEvent(hibernateEvent, grailsEvent); boolean cancelled = grailsEvent.isCancelled(); - if(!cancelled && entityAccess != null) { + if (!cancelled && entityAccess != null) { synchronizeHibernateState(hibernateEvent, entityAccess); } return cancelled; @@ -138,7 +140,7 @@ public boolean onPreInsert(PreInsertEvent hibernateEvent) { private void synchronizeHibernateState(PreInsertEvent hibernateEvent, ModificationTrackingEntityAccess entityAccess) { Map modifiedProperties = entityAccess.getModifiedProperties(); - if(!modifiedProperties.isEmpty()) { + if (!modifiedProperties.isEmpty()) { Object[] state = hibernateEvent.getState(); EntityPersister persister = hibernateEvent.getPersister(); synchronizeHibernateState(persister, state, modifiedProperties); @@ -175,9 +177,9 @@ private void updateModifiedPropertiesWithAutoTimestamp(Map modif private void synchronizeHibernateState(EntityPersister persister, Object[] state, Map modifiedProperties) { EntityMetamodel entityMetamodel = persister.getEntityMetamodel(); - for(Map.Entry entry : modifiedProperties.entrySet()) { + for (Map.Entry entry : modifiedProperties.entrySet()) { Integer index = entityMetamodel.getPropertyIndexOrNull(entry.getKey()); - if(index != null) { + if (index != null) { state[index] = entry.getValue(); } } @@ -198,7 +200,7 @@ public boolean onPreUpdate(PreUpdateEvent hibernateEvent) { PersistentEntity persistentEntity = mappingContext.getPersistentEntity(type.getName()); AbstractPersistenceEvent grailsEvent; ModificationTrackingEntityAccess entityAccess = null; - if(persistentEntity != null) { + if (persistentEntity != null) { entityAccess = new ModificationTrackingEntityAccess(mappingContext.createEntityAccess(persistentEntity, entity)); grailsEvent = new org.grails.datastore.mapping.engine.event.PreUpdateEvent(this.datastore, persistentEntity, entityAccess); } @@ -208,7 +210,7 @@ public boolean onPreUpdate(PreUpdateEvent hibernateEvent) { publishEvent(hibernateEvent, grailsEvent); boolean cancelled = grailsEvent.isCancelled(); - if(!cancelled && entityAccess != null) { + if (!cancelled && entityAccess != null) { boolean autoTimestamp = persistentEntity.getMapping().getMappedForm().isAutoTimestamp(); synchronizeHibernateState(hibernateEvent, entityAccess, autoTimestamp); } @@ -238,7 +240,7 @@ public void onPostDelete(PostDeleteEvent hibernateEvent) { private void publishEvent(AbstractEvent hibernateEvent, AbstractPersistenceEvent mappingEvent) { mappingEvent.setNativeEvent(hibernateEvent); - if(eventPublisher != null) { + if (eventPublisher != null) { eventPublisher.publishEvent(mappingEvent); } } @@ -248,29 +250,28 @@ public boolean requiresPostCommitHanding(EntityPersister persister) { return false; } - @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if(applicationContext instanceof ConfigurableApplicationContext) { + if (applicationContext instanceof ConfigurableApplicationContext) { this.eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext) applicationContext); } } private void activateDirtyChecking(Object entity) { - if(entity instanceof DirtyCheckable && proxyHandler.isInitialized(entity)) { + if (entity instanceof DirtyCheckable && proxyHandler.isInitialized(entity)) { PersistentEntity persistentEntity = mappingContext.getPersistentEntity(Hibernate.getClass(entity).getName()); entity = proxyHandler.unwrap(entity); DirtyCheckable dirtyCheckable = (DirtyCheckable) entity; Map dirtyCheckingState = persistentEntity.getReflector().getDirtyCheckingState(entity); - if(dirtyCheckingState == null) { + if (dirtyCheckingState == null) { dirtyCheckable.trackChanges(); for (Embedded association : persistentEntity.getEmbedded()) { - if(DirtyCheckable.class.isAssignableFrom(association.getType())) { + if (DirtyCheckable.class.isAssignableFrom(association.getType())) { Object embedded = association.getReader().read(entity); - if(embedded != null) { + if (embedded != null) { DirtyCheckable embeddedCheck = (DirtyCheckable) embedded; - if(embeddedCheck.listDirtyPropertyNames().isEmpty()) { + if (embeddedCheck.listDirtyPropertyNames().isEmpty()) { embeddedCheck.trackChanges(); } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/DataSourceFactoryBean.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/DataSourceFactoryBean.groovy index 3859372de45..7268f99205d 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/DataSourceFactoryBean.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/DataSourceFactoryBean.groovy @@ -19,13 +19,12 @@ package org.grails.orm.hibernate.support -import org.grails.orm.hibernate.AbstractHibernateDatastore -import org.grails.orm.hibernate.connections.HibernateConnectionSource +import javax.sql.DataSource + import org.springframework.beans.factory.FactoryBean -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.beans.factory.annotation.Qualifier -import javax.sql.DataSource +import org.grails.orm.hibernate.AbstractHibernateDatastore +import org.grails.orm.hibernate.connections.HibernateConnectionSource /** * A factory class to retrieve a {@link javax.sql.DataSource} from the Hibernate datastore @@ -44,7 +43,7 @@ class DataSourceFactoryBean implements FactoryBean { @Override DataSource getObject() throws Exception { - ((HibernateConnectionSource)datastore.connectionSources.getConnectionSource(connectionName)).dataSource + ((HibernateConnectionSource) datastore.connectionSources.getConnectionSource(connectionName)).dataSource } @Override diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDatastoreConnectionSourcesRegistrar.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDatastoreConnectionSourcesRegistrar.groovy index 1e39988a84d..231da37c875 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDatastoreConnectionSourcesRegistrar.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDatastoreConnectionSourcesRegistrar.groovy @@ -19,12 +19,12 @@ package org.grails.orm.hibernate.support +import javax.sql.DataSource + import groovy.transform.CompileStatic -import org.grails.datastore.gorm.bootstrap.support.InstanceFactoryBean -import org.grails.datastore.mapping.config.Settings -import org.grails.datastore.mapping.core.connections.ConnectionSource -import org.grails.datastore.mapping.core.grailsversion.GrailsVersion + import org.hibernate.SessionFactory + import org.springframework.beans.BeansException import org.springframework.beans.factory.config.ConfigurableListableBeanFactory import org.springframework.beans.factory.config.ConstructorArgumentValues @@ -34,8 +34,10 @@ import org.springframework.beans.factory.support.RootBeanDefinition import org.springframework.core.Ordered import org.springframework.transaction.PlatformTransactionManager -import javax.sql.DataSource - +import org.grails.datastore.gorm.bootstrap.support.InstanceFactoryBean +import org.grails.datastore.mapping.config.Settings +import org.grails.datastore.mapping.core.connections.ConnectionSource +import org.grails.datastore.mapping.core.grailsversion.GrailsVersion /** * A factory bean that looks up a datastore by connection name @@ -54,12 +56,12 @@ class HibernateDatastoreConnectionSourcesRegistrar implements BeanDefinitionRegi @Override void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { - for(String dataSourceName in dataSourceNames) { + for (String dataSourceName in dataSourceNames) { boolean isDefault = dataSourceName == ConnectionSource.DEFAULT || dataSourceName == Settings.SETTING_DATASOURCE - boolean shouldConfigureDataSourceBean = GrailsVersion.isAtLeastMajorMinor(3,3) + boolean shouldConfigureDataSourceBean = GrailsVersion.isAtLeastMajorMinor(3, 3) String dataSourceBeanName = isDefault ? Settings.SETTING_DATASOURCE : "${Settings.SETTING_DATASOURCE}_$dataSourceName" - if(!registry.containsBeanDefinition(dataSourceBeanName) && shouldConfigureDataSourceBean) { + if (!registry.containsBeanDefinition(dataSourceBeanName) && shouldConfigureDataSourceBean) { def dataSourceBean = new RootBeanDefinition() dataSourceBean.setTargetType(DataSource) dataSourceBean.setBeanClass(InstanceFactoryBean) @@ -72,7 +74,7 @@ class HibernateDatastoreConnectionSourcesRegistrar implements BeanDefinitionRegi registry.registerBeanDefinition(dataSourceBeanName, dataSourceBean) } - if(!isDefault) { + if (!isDefault) { String suffix = '_' + dataSourceName String sessionFactoryName = "sessionFactory$suffix" String transactionManagerBeanName = "transactionManager$suffix" diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDatastoreFactoryBean.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDatastoreFactoryBean.groovy index ec72c5de213..f8724fd021c 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDatastoreFactoryBean.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDatastoreFactoryBean.groovy @@ -20,14 +20,18 @@ package org.grails.orm.hibernate.support import groovy.transform.CompileStatic -import org.grails.datastore.mapping.model.MappingContext -import org.grails.orm.hibernate.AbstractHibernateDatastore + import org.hibernate.SessionFactory + import org.springframework.beans.BeansException import org.springframework.beans.factory.FactoryBean import org.springframework.context.ApplicationContext import org.springframework.context.ApplicationContextAware import org.springframework.core.env.PropertyResolver + +import org.grails.datastore.mapping.model.MappingContext +import org.grails.orm.hibernate.AbstractHibernateDatastore + /** * Helper for constructing the datastore * @@ -35,14 +39,14 @@ import org.springframework.core.env.PropertyResolver * @since 5.0 */ @CompileStatic -public class HibernateDatastoreFactoryBean implements FactoryBean, ApplicationContextAware { +class HibernateDatastoreFactoryBean implements FactoryBean, ApplicationContextAware { - private final Class objectType; - private final MappingContext mappingContext; - private final SessionFactory sessionFactory; - private final PropertyResolver configuration; - private final String dataSourceName; - ApplicationContext applicationContext; + private final Class objectType + private final MappingContext mappingContext + private final SessionFactory sessionFactory + private final PropertyResolver configuration + private final String dataSourceName + ApplicationContext applicationContext HibernateDatastoreFactoryBean(Class objectType, MappingContext mappingContext, SessionFactory sessionFactory, PropertyResolver configuration, String dataSourceName) { this.objectType = objectType @@ -53,29 +57,28 @@ public class HibernateDatastoreFactoryBean } @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - this.applicationContext = applicationContext; + void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + this.applicationContext = applicationContext } @Override - public T getObject() throws Exception { + T getObject() throws Exception { AbstractHibernateDatastore datastore = objectType.newInstance(mappingContext, sessionFactory, configuration, dataSourceName) - - if(applicationContext != null) { + if (applicationContext != null) { datastore.setApplicationContext(applicationContext) } - return datastore; + return datastore } @Override - public Class getObjectType() { - return objectType; + Class getObjectType() { + return objectType } @Override - public boolean isSingleton() { - return true; + boolean isSingleton() { + return true } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDialectDetectorFactoryBean.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDialectDetectorFactoryBean.java index 50ce661f036..191dde207c5 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDialectDetectorFactoryBean.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateDialectDetectorFactoryBean.java @@ -24,7 +24,6 @@ import javax.sql.DataSource; -import org.grails.orm.hibernate.exceptions.CouldNotDetermineHibernateDialectException; import org.hibernate.HibernateException; import org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl; import org.hibernate.boot.registry.selector.internal.StrategySelectorImpl; @@ -32,11 +31,16 @@ import org.hibernate.dialect.Dialect; import org.hibernate.engine.jdbc.dialect.internal.DialectFactoryImpl; import org.hibernate.engine.jdbc.dialect.internal.StandardDialectResolver; -import org.hibernate.engine.jdbc.dialect.spi.*; +import org.hibernate.engine.jdbc.dialect.spi.DatabaseMetaDataDialectResolutionInfoAdapter; +import org.hibernate.engine.jdbc.dialect.spi.DialectFactory; +import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfo; +import org.hibernate.engine.jdbc.dialect.spi.DialectResolutionInfoSource; +import org.hibernate.engine.jdbc.dialect.spi.DialectResolver; import org.hibernate.service.Service; import org.hibernate.service.ServiceRegistry; import org.hibernate.service.spi.ServiceBinding; import org.hibernate.service.spi.ServiceRegistryImplementor; + import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.jdbc.datasource.DataSourceUtils; @@ -45,6 +49,8 @@ import org.springframework.util.Assert; import org.springframework.util.StringUtils; +import org.grails.orm.hibernate.exceptions.CouldNotDetermineHibernateDialectException; + /** * @author Steven Devijver * @author Graeme Rocher @@ -88,7 +94,7 @@ public void afterPropertiesSet() throws MetaDataAccessException { Connection connection = null; - String dbName = (String)JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductName"); + String dbName = (String) JdbcUtils.extractDatabaseMetaData(dataSource, "getDatabaseProductName"); try { connection = DataSourceUtils.getConnection(dataSource); @@ -113,12 +119,12 @@ public DialectResolutionInfo getDialectResolutionInfo() { hibernateDialectClassName = vendorNameDialectMappings.getProperty(dbName); } - if (!StringUtils.hasText(hibernateDialectClassName)) { + if (!StringUtils.hasText(hibernateDialectClassName)) { throw new CouldNotDetermineHibernateDialectException( "Could not determine Hibernate dialect for database name [" + dbName + "]!"); - } + } } finally { - DataSourceUtils.releaseConnection(connection,dataSource); + DataSourceUtils.releaseConnection(connection, dataSource); } } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateRuntimeUtils.groovy b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateRuntimeUtils.groovy index ee03ca5f337..8f8290dad3d 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateRuntimeUtils.groovy +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateRuntimeUtils.groovy @@ -20,21 +20,24 @@ package org.grails.orm.hibernate.support import groovy.transform.CompileStatic -import org.grails.datastore.gorm.GormValidateable -import org.grails.datastore.mapping.model.config.GormProperties -import org.grails.datastore.mapping.proxy.ProxyHandler -import org.grails.datastore.mapping.validation.ValidationErrors -import org.grails.orm.hibernate.proxy.HibernateProxyHandler import org.codehaus.groovy.runtime.StringGroovyMethods -import org.grails.datastore.mapping.model.PersistentEntity -import org.grails.datastore.mapping.model.types.Association -import org.grails.datastore.mapping.model.types.OneToOne + import org.hibernate.Session import org.hibernate.SessionFactory + import org.springframework.core.convert.ConversionService import org.springframework.validation.Errors import org.springframework.validation.FieldError +import org.grails.datastore.gorm.GormValidateable +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.config.GormProperties +import org.grails.datastore.mapping.model.types.Association +import org.grails.datastore.mapping.model.types.OneToOne +import org.grails.datastore.mapping.proxy.ProxyHandler +import org.grails.datastore.mapping.validation.ValidationErrors +import org.grails.orm.hibernate.proxy.HibernateProxyHandler + /** * Utility methods used at runtime by the GORM for Hibernate implementation * @@ -43,16 +46,17 @@ import org.springframework.validation.FieldError */ @CompileStatic class HibernateRuntimeUtils { - private static ProxyHandler proxyHandler = new HibernateProxyHandler(); - private static final String DYNAMIC_FILTER_ENABLER = "dynamicFilterEnabler"; + private static ProxyHandler proxyHandler = new HibernateProxyHandler() - @SuppressWarnings("rawtypes") - public static void enableDynamicFilterEnablerIfPresent(SessionFactory sessionFactory, Session session) { + private static final String DYNAMIC_FILTER_ENABLER = 'dynamicFilterEnabler' + + @SuppressWarnings('rawtypes') + static void enableDynamicFilterEnablerIfPresent(SessionFactory sessionFactory, Session session) { if (sessionFactory != null && session != null) { - final Set definedFilterNames = sessionFactory.getDefinedFilterNames(); + final Set definedFilterNames = sessionFactory.getDefinedFilterNames() if (definedFilterNames != null && definedFilterNames.contains(DYNAMIC_FILTER_ENABLER)) - session.enableFilter(DYNAMIC_FILTER_ENABLER); // work around for HHH-2624 + session.enableFilter(DYNAMIC_FILTER_ENABLER) // work around for HHH-2624 } } @@ -64,16 +68,16 @@ class HibernateRuntimeUtils { * @param target object to initialize * @return the new Errors object */ - public static Errors setupErrorsProperty(Object target) { + static Errors setupErrorsProperty(Object target) { boolean isGormValidateable = target instanceof GormValidateable MetaClass mc = isGormValidateable ? null : GroovySystem.metaClassRegistry.getMetaClass(target.getClass()) def errors = new ValidationErrors(target) - Errors originalErrors = isGormValidateable ? ((GormValidateable)target).getErrors() : (Errors) mc.getProperty(target, GormProperties.ERRORS) + Errors originalErrors = isGormValidateable ? ((GormValidateable) target).getErrors() : (Errors) mc.getProperty(target, GormProperties.ERRORS) for (Object o in originalErrors.fieldErrors) { - FieldError fe = (FieldError)o + FieldError fe = (FieldError) o if (fe.isBindingFailure()) { errors.addError(new FieldError(fe.getObjectName(), fe.field, @@ -85,16 +89,16 @@ class HibernateRuntimeUtils { } } - if(isGormValidateable) { - ((GormValidateable)target).setErrors(errors) + if (isGormValidateable) { + ((GormValidateable) target).setErrors(errors) } else { - mc.setProperty(target, GormProperties.ERRORS, errors); + mc.setProperty(target, GormProperties.ERRORS, errors) } - return errors; + return errors } - public static void autoAssociateBidirectionalOneToOnes(PersistentEntity entity, Object target) { + static void autoAssociateBidirectionalOneToOnes(PersistentEntity entity, Object target) { def mappingContext = entity.mappingContext for (Association association : entity.associations) { if (!(association instanceof OneToOne) || !association.bidirectional || !association.owningSide) { @@ -112,7 +116,6 @@ class HibernateRuntimeUtils { continue } - def entityReflector = mappingContext.getEntityReflector(entity) Object inverseObject = entityReflector.getProperty(target, propertyName) if (inverseObject == null) { @@ -135,23 +138,23 @@ class HibernateRuntimeUtils { static Object convertValueToType(Object passedValue, Class targetType, ConversionService conversionService) { // workaround for GROOVY-6127, do not assign directly in parameters before it's fixed Object value = passedValue - if(targetType != null && value != null && !(value in targetType)) { + if (targetType != null && value != null && !(value in targetType)) { if (value instanceof CharSequence) { value = value.toString() - if(value in targetType) { + if (value in targetType) { return value } } try { - if (value instanceof Number && (targetType==Long || targetType==Integer)) { - if(targetType == Long) { - value = ((Number)value).toLong() + if (value instanceof Number && (targetType == Long || targetType == Integer)) { + if (targetType == Long) { + value = ((Number) value).toLong() } else { - value = ((Number)value).toInteger() + value = ((Number) value).toInteger() } } else if (value instanceof String && targetType in Number) { String strValue = value.trim() - if(targetType == Long) { + if (targetType == Long) { value = Long.parseLong(strValue) } else if (targetType == Integer) { value = Integer.parseInt(strValue) diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateVersionSupport.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateVersionSupport.java index 64e62a35dc7..71970b80c28 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateVersionSupport.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/HibernateVersionSupport.java @@ -18,13 +18,12 @@ */ package org.grails.orm.hibernate.support; -import org.grails.datastore.mapping.core.grailsversion.GrailsVersion; -import org.grails.datastore.mapping.reflect.ClassUtils; -import org.hibernate.*; -import org.springframework.util.Assert; -import org.springframework.util.ReflectionUtils; +import org.hibernate.FlushMode; +import org.hibernate.Hibernate; +import org.hibernate.Query; +import org.hibernate.Session; -import java.lang.reflect.Method; +import org.grails.datastore.mapping.core.grailsversion.GrailsVersion; /** * @@ -38,7 +37,6 @@ */ public class HibernateVersionSupport { - /** * Get the native Hibernate FlushMode, adapting between Hibernate 5.0/5.1 and 5.2+. * @param session the Hibernate Session to get the flush mode from diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/SoftKey.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/SoftKey.java index faec3a90045..245c505e811 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/SoftKey.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/support/SoftKey.java @@ -50,7 +50,7 @@ public boolean equals(Object obj) { return false; } @SuppressWarnings("unchecked") - SoftKey other = (SoftKey)obj; + SoftKey other = (SoftKey) obj; if (hash != other.hash) { return false; } diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java index eee227bbfc9..c861eaa5f75 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/HibernateJtaTransactionManagerAdapter.java @@ -19,10 +19,15 @@ package org.grails.orm.hibernate.transaction; -import jakarta.transaction.*; import javax.transaction.xa.XAResource; -import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; +import jakarta.transaction.RollbackException; +import jakarta.transaction.Status; +import jakarta.transaction.Synchronization; +import jakarta.transaction.SystemException; +import jakarta.transaction.Transaction; +import jakarta.transaction.TransactionManager; + import org.springframework.transaction.PlatformTransactionManager; import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.TransactionStatus; @@ -33,28 +38,28 @@ /** * Adapter for adding transaction controlling hooks for supporting * Hibernate's org.hibernate.engine.transaction.Isolater class's interaction with transactions - * + * * This is required when there is no real JTA transaction manager in use and Spring's - * {@link TransactionAwareDataSourceProxy} is used. - * + * {@link org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy} is used. + * * Without this solution, using Hibernate's TableGenerator identity strategies will fail to support transactions. * The id generator will commit the current transaction and break transactional behaviour. - * + * * The javadoc of Hibernate's {@code TableHiLoGenerator} states this. However this isn't mentioned in the javadocs of other TableGenerators. - * + * * @author Lari Hotari */ public class HibernateJtaTransactionManagerAdapter implements TransactionManager { PlatformTransactionManager springTransactionManager; - ThreadLocal currentTransactionHolder= new ThreadLocal<>(); - + ThreadLocal currentTransactionHolder = new ThreadLocal<>(); + public HibernateJtaTransactionManagerAdapter(PlatformTransactionManager springTransactionManager) { this.springTransactionManager = springTransactionManager; } - + @Override public void begin() { - TransactionDefinition definition=new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW); + TransactionDefinition definition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW); currentTransactionHolder.set(springTransactionManager.getTransaction(definition)); } @@ -68,21 +73,21 @@ public void commit() throws public void rollback() throws IllegalStateException, SecurityException { springTransactionManager.rollback(getAndRemoveStatus()); } - + @Override public void setRollbackOnly() throws IllegalStateException { currentTransactionHolder.get().setRollbackOnly(); } - + protected TransactionStatus getAndRemoveStatus() { - TransactionStatus status=currentTransactionHolder.get(); + TransactionStatus status = currentTransactionHolder.get(); currentTransactionHolder.remove(); return status; } @Override public int getStatus() { - TransactionStatus status=currentTransactionHolder.get(); + TransactionStatus status = currentTransactionHolder.get(); return convertToJtaStatus(status); } @@ -95,7 +100,7 @@ protected static int convertToJtaStatus(TransactionStatus status) { } else { return Status.STATUS_ACTIVE; } - } else { + } else { return Status.STATUS_NO_TRANSACTION; } } @@ -107,7 +112,7 @@ public Transaction getTransaction() { @Override public void resume(Transaction tobj) throws IllegalStateException { - TransactionAdapter transaction = (TransactionAdapter)tobj; + TransactionAdapter transaction = (TransactionAdapter) tobj; // commit the PROPAGATION_NOT_SUPPORTED transaction returned in suspend springTransactionManager.commit(transaction.transactionStatus); } @@ -117,23 +122,23 @@ public Transaction suspend() { currentTransactionHolder.set(springTransactionManager.getTransaction(new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_NOT_SUPPORTED))); return new TransactionAdapter(springTransactionManager, currentTransactionHolder); } - + @Override public void setTransactionTimeout(int seconds) { - + } private static class TransactionAdapter implements Transaction { PlatformTransactionManager springTransactionManager; TransactionStatus transactionStatus; ThreadLocal currentTransactionHolder; - + TransactionAdapter(PlatformTransactionManager springTransactionManager, ThreadLocal currentTransactionHolder) { this.springTransactionManager = springTransactionManager; this.currentTransactionHolder = currentTransactionHolder; this.transactionStatus = currentTransactionHolder.get(); } - + @Override public void commit() throws SecurityException, IllegalStateException { @@ -165,7 +170,7 @@ public void registerSynchronization(final Synchronization sync) throws RollbackE public void beforeCompletion() { sync.beforeCompletion(); } - + @Override public void afterCompletion(int status) { int jtaStatus; @@ -178,11 +183,15 @@ public void afterCompletion(int status) { } sync.afterCompletion(jtaStatus); } - + public void suspend() { } + public void resume() { } + public void flush() { } + public void beforeCommit(boolean readOnly) { } + public void afterCommit() { } }); } @@ -190,23 +199,23 @@ public void afterCommit() { } @Override public void rollback() throws IllegalStateException, SystemException { springTransactionManager.rollback(transactionStatus); - currentTransactionHolder.remove(); + currentTransactionHolder.remove(); } @Override public void setRollbackOnly() throws IllegalStateException, SystemException { transactionStatus.setRollbackOnly(); } - + @Override public boolean equals(Object obj) { - if(obj == this) { + if (obj == this) { return true; } else if (obj == null) { return false; } else if (obj.getClass() == TransactionAdapter.class) { - TransactionAdapter other = (TransactionAdapter)obj; - if(other.transactionStatus == this.transactionStatus) { + TransactionAdapter other = (TransactionAdapter) obj; + if (other.transactionStatus == this.transactionStatus) { return true; } else if (other.transactionStatus != null) { return other.transactionStatus.equals(this.transactionStatus); @@ -217,7 +226,7 @@ public boolean equals(Object obj) { return false; } } - + @Override public int hashCode() { return transactionStatus != null ? transactionStatus.hashCode() : System.identityHashCode(this); diff --git a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/PlatformTransactionManagerProxy.java b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/PlatformTransactionManagerProxy.java index 8e90d0d345c..ae7b8ccee57 100644 --- a/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/PlatformTransactionManagerProxy.java +++ b/grails-data-hibernate5/core/src/main/groovy/org/grails/orm/hibernate/transaction/PlatformTransactionManagerProxy.java @@ -56,4 +56,4 @@ public PlatformTransactionManager getTargetTransactionManager() { public void setTargetTransactionManager(PlatformTransactionManager targetTransactionManager) { this.targetTransactionManager = targetTransactionManager; } -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmChangelogSyncCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmChangelogSyncCommand.groovy index 606aecefc85..25f30e22876 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmChangelogSyncCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmChangelogSyncCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmChangelogSyncCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmChangelogSyncSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmChangelogSyncSqlCommand.groovy index 951bda1d5b2..476d383410b 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmChangelogSyncSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmChangelogSyncSqlCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmChangelogSyncSqlCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmClearChecksumsCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmClearChecksumsCommand.groovy index b0c64f23329..0006e1649b4 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmClearChecksumsCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmClearChecksumsCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmClearChecksumsCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDbDocCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDbDocCommand.groovy index 9b28378ae70..059ff5208eb 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDbDocCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDbDocCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmDbDocCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDiffCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDiffCommand.groovy index 1e3e580183a..9e3f1e6a13c 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDiffCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDiffCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand -import grails.util.Environment import groovy.transform.CompileStatic + import liquibase.database.Database + +import grails.dev.commands.ApplicationCommand +import grails.util.Environment import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDropAllCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDropAllCommand.groovy index 7ed762e558e..efbc21c533c 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDropAllCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmDropAllCommand.groovy @@ -18,11 +18,13 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.CatalogAndSchema import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmDropAllCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmFutureRollbackCountSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmFutureRollbackCountSqlCommand.groovy index 0f6ae66cc87..899a550d927 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmFutureRollbackCountSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmFutureRollbackCountSqlCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmFutureRollbackSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmFutureRollbackSqlCommand.groovy index 42d1143b6e3..2e7e0d66e08 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmFutureRollbackSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmFutureRollbackSqlCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmFutureRollbackSqlCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGenerateChangelogCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGenerateChangelogCommand.groovy index c7e34712541..73d1e226bd7 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGenerateChangelogCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGenerateChangelogCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.database.Database + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGenerateGormChangelogCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGenerateGormChangelogCommand.groovy index fdc1352c2ee..8519c83732f 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGenerateGormChangelogCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGenerateGormChangelogCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.database.Database + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGormDiffCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGormDiffCommand.groovy index fb38b8ea0e5..52d68b92e0b 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGormDiffCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmGormDiffCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.database.Database + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmListLocksCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmListLocksCommand.groovy index 92a2a9e5b4d..c53d1c9af70 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmListLocksCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmListLocksCommand.groovy @@ -18,12 +18,14 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmListLocksCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { @@ -39,7 +41,7 @@ class DbmListLocksCommand implements ApplicationCommand, ApplicationContextDatab } } - private static void withFilePrintStreamOrSystemOut(String filename, @ClosureParams(value = SimpleType, options = "java.io.PrintStream") Closure closure) { + private static void withFilePrintStreamOrSystemOut(String filename, @ClosureParams(value = SimpleType, options = 'java.io.PrintStream') Closure closure) { if (!filename) { closure.call(System.out) return diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmMarkNextChangesetRanCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmMarkNextChangesetRanCommand.groovy index 6c901c993ee..4ba6e019872 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmMarkNextChangesetRanCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmMarkNextChangesetRanCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmMarkNextChangesetRanCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmMarkNextChangesetRanSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmMarkNextChangesetRanSqlCommand.groovy index 406498ed356..427c424b942 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmMarkNextChangesetRanSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmMarkNextChangesetRanSqlCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmMarkNextChangesetRanSqlCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmPreviousChangesetSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmPreviousChangesetSqlCommand.groovy index c0dac8f1f4b..0d4e77405f7 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmPreviousChangesetSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmPreviousChangesetSqlCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase import liquibase.database.Database + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmReleaseLocksCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmReleaseLocksCommand.groovy index e0e031fb9d3..61ad05209bf 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmReleaseLocksCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmReleaseLocksCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmReleaseLocksCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCommand.groovy index 5fb16bc3501..416ba3c6a42 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCountCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCountCommand.groovy index f6b83bb92cc..dc61205b9b2 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCountCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCountCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCountSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCountSqlCommand.groovy index d65f87cd2a9..a9b0a2c3137 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCountSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackCountSqlCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackSqlCommand.groovy index 8d6912d6339..bea1a2c8bb6 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackSqlCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackToDateCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackToDateCommand.groovy index cd19371b6ed..2b3701a8ef8 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackToDateCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackToDateCommand.groovy @@ -18,12 +18,14 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand +import java.text.ParseException + import groovy.transform.CompileStatic + import liquibase.Liquibase -import org.grails.plugins.databasemigration.DatabaseMigrationException -import java.text.ParseException +import grails.dev.commands.ApplicationCommand +import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic class DbmRollbackToDateCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackToDateSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackToDateSqlCommand.groovy index b07faa89c6e..c263063c92d 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackToDateSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmRollbackToDateSqlCommand.groovy @@ -18,12 +18,14 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand +import java.text.ParseException + import groovy.transform.CompileStatic + import liquibase.Liquibase -import org.grails.plugins.databasemigration.DatabaseMigrationException -import java.text.ParseException +import grails.dev.commands.ApplicationCommand +import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic class DbmRollbackToDateSqlCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmStatusCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmStatusCommand.groovy index 63ab9dc9ec6..3465df19d63 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmStatusCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmStatusCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmStatusCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmTagCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmTagCommand.groovy index 18755875f91..ba5e30d591a 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmTagCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmTagCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCommand.groovy index 278c674c7f0..2306b00c1da 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmUpdateCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCountCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCountCommand.groovy index 0e9d8c13732..663c73dfc1c 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCountCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCountCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCountSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCountSqlCommand.groovy index 1fb3cd65fce..be681a37b88 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCountSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateCountSqlCommand.groovy @@ -18,9 +18,11 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase + +import grails.dev.commands.ApplicationCommand import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateSqlCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateSqlCommand.groovy index c814c7eb2f5..a58602ef5bb 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateSqlCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmUpdateSqlCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmUpdateSqlCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmValidateCommand.groovy b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmValidateCommand.groovy index 3e752117073..d62c81b5588 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmValidateCommand.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/commands/org/grails/plugins/databasemigration/command/DbmValidateCommand.groovy @@ -18,10 +18,12 @@ */ package org.grails.plugins.databasemigration.command -import grails.dev.commands.ApplicationCommand import groovy.transform.CompileStatic + import liquibase.Liquibase +import grails.dev.commands.ApplicationCommand + @CompileStatic class DbmValidateCommand implements ApplicationCommand, ApplicationContextDatabaseMigrationCommand { diff --git a/grails-data-hibernate5/dbmigration/grails-app/conf/logback.groovy b/grails-data-hibernate5/dbmigration/grails-app/conf/logback.groovy index f9f0967baec..fb6b43c55aa 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/conf/logback.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/conf/logback.groovy @@ -24,8 +24,8 @@ import org.springframework.boot.logging.logback.WhitespaceThrowableProxyConverte import java.nio.charset.StandardCharsets -conversionRule 'clr', ColorConverter -conversionRule 'wex', WhitespaceThrowableProxyConverter +conversionRule('clr', ColorConverter) +conversionRule('wex', WhitespaceThrowableProxyConverter) // See http://logback.qos.ch/manual/groovy.html for details on configuration appender('STDOUT', ConsoleAppender) { diff --git a/grails-data-hibernate5/dbmigration/grails-app/domain/testapp/Account.groovy b/grails-data-hibernate5/dbmigration/grails-app/domain/testapp/Account.groovy index 943771e5b40..8bb9041bbc2 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/domain/testapp/Account.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/domain/testapp/Account.groovy @@ -20,6 +20,7 @@ package testapp class Account { + String name String number -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/dbmigration/grails-app/domain/testapp/Person.groovy b/grails-data-hibernate5/dbmigration/grails-app/domain/testapp/Person.groovy index 4ff21fe7f5d..eacc974084d 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/domain/testapp/Person.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/domain/testapp/Person.groovy @@ -20,6 +20,7 @@ package testapp class Person { + String firstName String lastName String gender @@ -27,4 +28,4 @@ class Person { String emailAddress String cell -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/dbmigration/grails-app/init/databasemigration/Application.groovy b/grails-data-hibernate5/dbmigration/grails-app/init/databasemigration/Application.groovy index 7dd1f809286..7e4201eb57f 100644 --- a/grails-data-hibernate5/dbmigration/grails-app/init/databasemigration/Application.groovy +++ b/grails-data-hibernate5/dbmigration/grails-app/init/databasemigration/Application.groovy @@ -18,14 +18,16 @@ */ package databasemigration +import groovy.transform.CompileStatic + import grails.boot.GrailsApp import grails.boot.config.GrailsAutoConfiguration import grails.plugins.metadata.PluginSource -import groovy.transform.CompileStatic @PluginSource @CompileStatic class Application extends GrailsAutoConfiguration { + static void main(String[] args) { GrailsApp.run(Application) } diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationException.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationException.groovy index 9657de91f6a..f1a23996763 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationException.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationException.groovy @@ -21,5 +21,4 @@ package org.grails.plugins.databasemigration import groovy.transform.InheritConstructors @InheritConstructors -class DatabaseMigrationException extends RuntimeException { -} +class DatabaseMigrationException extends RuntimeException {} diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationGrailsPlugin.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationGrailsPlugin.groovy index 2b016999e41..2840e3adf31 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationGrailsPlugin.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationGrailsPlugin.groovy @@ -18,15 +18,17 @@ */ package org.grails.plugins.databasemigration -import grails.plugins.Plugin +import javax.sql.DataSource + import liquibase.parser.ChangeLogParser import liquibase.parser.ChangeLogParserFactory + +import org.springframework.context.ApplicationContext + +import grails.plugins.Plugin import org.grails.plugins.databasemigration.liquibase.GrailsLiquibase import org.grails.plugins.databasemigration.liquibase.GrailsLiquibaseFactory import org.grails.plugins.databasemigration.liquibase.GroovyChangeLogParser -import org.springframework.context.ApplicationContext - -import javax.sql.DataSource class DatabaseMigrationGrailsPlugin extends Plugin { @@ -34,17 +36,17 @@ class DatabaseMigrationGrailsPlugin extends Plugin { def grailsVersion = '7.0.0-SNAPSHOT > *' def pluginExcludes = [ - "**/testapp/**", - "grails-app/views/error.gsp" + '**/testapp/**', + 'grails-app/views/error.gsp' ] - def title = "Grails Database Migration Plugin" // Headline display name of the plugin - def author = "Kazuki YAMAMOTO" - def authorEmail = "" + def title = 'Grails Database Migration Plugin' // Headline display name of the plugin + def author = 'Kazuki YAMAMOTO' + def authorEmail = '' def description = 'Grails Database Migration Plugin' - def documentation = "https://docs.grails.org/latest/grails-data/hibernate5/manual/index.html#databaseMigration" - def license = "APACHE" - def scm = [url: "https://github.com/apache/grails-core"] + def documentation = 'https://docs.grails.org/latest/grails-data/hibernate5/manual/index.html#databaseMigration' + def license = 'APACHE' + def scm = [url: 'https://github.com/apache/grails-core'] @Override Closure doWithSpring() { @@ -67,7 +69,7 @@ class DatabaseMigrationGrailsPlugin extends Plugin { return } - if(!updateAllOnStart) { + if (!updateAllOnStart) { def updateOnStart = config.getProperty("${configPrefix}.updateOnStart", Boolean, false) if (!updateOnStart) { return diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationTransactionManager.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationTransactionManager.groovy index df17c909c57..eabb3b549e4 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationTransactionManager.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/DatabaseMigrationTransactionManager.groovy @@ -19,13 +19,14 @@ package org.grails.plugins.databasemigration -import grails.gorm.transactions.GrailsTransactionTemplate import org.springframework.context.ApplicationContext import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.TransactionDefinition import org.springframework.transaction.support.DefaultTransactionDefinition import org.springframework.util.Assert +import grails.gorm.transactions.GrailsTransactionTemplate + /** * Created by Jim on 7/15/2016. */ @@ -44,9 +45,9 @@ class DatabaseMigrationTransactionManager { * @return The transactionManager bean for the current dataSource */ PlatformTransactionManager getTransactionManager() { - String dataSource = this.dataSource ?: "dataSource" - String beanName = "transactionManager" - if (dataSource != "dataSource") { + String dataSource = this.dataSource ?: 'dataSource' + String beanName = 'transactionManager' + if (dataSource != 'dataSource') { beanName += "_${dataSource}" } applicationContext.getBean(beanName, PlatformTransactionManager) @@ -106,7 +107,7 @@ class DatabaseMigrationTransactionManager { */ void withNewTransaction(Map transactionProperties, Closure callable) { def props = new HashMap(transactionProperties) - props.remove 'propagationName' + props.remove('propagationName') props.propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRES_NEW withTransaction(props, callable) } @@ -114,7 +115,7 @@ class DatabaseMigrationTransactionManager { void withTransaction(Map transactionProperties, Closure callable) { def transactionDefinition = new DefaultTransactionDefinition() transactionProperties.each { k, v -> - if(v instanceof CharSequence && !(v instanceof String)) { + if (v instanceof CharSequence && !(v instanceof String)) { v = v.toString() } try { @@ -133,7 +134,7 @@ class DatabaseMigrationTransactionManager { * @return The result of the closure execution */ void withTransaction(TransactionDefinition definition, Closure callable) { - Assert.notNull transactionManager, "No transactionManager bean configured" + Assert.notNull(transactionManager, 'No transactionManager bean configured') if (!callable) { return diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/EnvironmentAwareCodeGenConfig.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/EnvironmentAwareCodeGenConfig.groovy index b1c2644177a..826aa19e06a 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/EnvironmentAwareCodeGenConfig.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/EnvironmentAwareCodeGenConfig.groovy @@ -20,6 +20,7 @@ package org.grails.plugins.databasemigration import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + import org.grails.config.CodeGenConfig @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/PluginConstants.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/PluginConstants.groovy index 03fb87aa9f2..20f039fce06 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/PluginConstants.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/PluginConstants.groovy @@ -20,7 +20,8 @@ package org.grails.plugins.databasemigration class PluginConstants { - static final String DATA_SOURCE_NAME_KEY = "dataSourceName" + + static final String DATA_SOURCE_NAME_KEY = 'dataSourceName' static final String DEFAULT_DATASOURCE_NAME = 'dataSource' static final String DEFAULT_CHANGE_LOG_LOCATION = 'grails-app/migrations' } diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/ApplicationContextDatabaseMigrationCommand.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/ApplicationContextDatabaseMigrationCommand.groovy index 34b49e430ef..26c4a9cf7c9 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/ApplicationContextDatabaseMigrationCommand.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/ApplicationContextDatabaseMigrationCommand.groovy @@ -18,25 +18,28 @@ */ package org.grails.plugins.databasemigration.command -import grails.config.ConfigMap -import grails.core.GrailsApplication -import grails.dev.commands.ExecutionContext -import grails.util.Environment import groovy.transform.CompileStatic import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType + import liquibase.database.Database import liquibase.parser.ChangeLogParser import liquibase.parser.ChangeLogParserFactory +import org.hibernate.dialect.Dialect +import org.hibernate.engine.jdbc.spi.JdbcServices +import org.hibernate.engine.spi.SessionFactoryImplementor + +import org.springframework.context.ConfigurableApplicationContext + +import grails.config.ConfigMap +import grails.core.GrailsApplication +import grails.dev.commands.ExecutionContext +import grails.util.Environment import org.grails.config.PropertySourcesConfig import org.grails.orm.hibernate.HibernateDatastore import org.grails.plugins.databasemigration.DatabaseMigrationTransactionManager import org.grails.plugins.databasemigration.liquibase.GormDatabase import org.grails.plugins.databasemigration.liquibase.GroovyChangeLogParser -import org.hibernate.dialect.Dialect -import org.hibernate.engine.jdbc.spi.JdbcServices -import org.hibernate.engine.spi.SessionFactoryImplementor -import org.springframework.context.ConfigurableApplicationContext import static org.grails.plugins.databasemigration.DatabaseMigrationGrailsPlugin.isDefaultDataSource import static org.grails.plugins.databasemigration.PluginConstants.DEFAULT_DATASOURCE_NAME @@ -80,16 +83,16 @@ trait ApplicationContextDatabaseMigrationCommand implements DatabaseMigrationCom } private Database createGormDatabase(ConfigurableApplicationContext applicationContext, String dataSource) { - String sessionFactoryName = "sessionFactory" + String sessionFactoryName = 'sessionFactory' if (!isDefaultDataSource(dataSource)) { sessionFactoryName = sessionFactoryName + '_' + dataSource } def serviceRegistry = applicationContext.getBean(sessionFactoryName, SessionFactoryImplementor).serviceRegistry.parentServiceRegistry - Dialect dialect = serviceRegistry.getService(JdbcServices.class).dialect + Dialect dialect = serviceRegistry.getService(JdbcServices).dialect - HibernateDatastore hibernateDatastore = applicationContext.getBean("hibernateDatastore", HibernateDatastore) + HibernateDatastore hibernateDatastore = applicationContext.getBean('hibernateDatastore', HibernateDatastore) hibernateDatastore = hibernateDatastore.getDatastoreForConnection(dataSource) Database database = new GormDatabase(dialect, serviceRegistry, hibernateDatastore) diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DatabaseMigrationCommand.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DatabaseMigrationCommand.groovy index 3b0afc70f7e..9b05c64f230 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DatabaseMigrationCommand.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DatabaseMigrationCommand.groovy @@ -18,11 +18,16 @@ */ package org.grails.plugins.databasemigration.command -import grails.config.ConfigMap +import java.nio.file.Path +import java.text.DateFormat +import java.text.ParseException +import java.text.SimpleDateFormat + import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType + import liquibase.Contexts import liquibase.LabelExpression import liquibase.Liquibase @@ -39,7 +44,6 @@ import liquibase.command.core.DiffCommandStep import liquibase.command.core.GenerateChangelogCommandStep import liquibase.command.core.helpers.AbstractChangelogCommandStep import liquibase.command.core.helpers.DbUrlConnectionArgumentsCommandStep -import liquibase.command.core.helpers.DbUrlConnectionCommandStep import liquibase.command.core.helpers.DiffOutputControlCommandStep import liquibase.command.core.helpers.PreCompareCommandStep import liquibase.command.core.helpers.ReferenceDbUrlConnectionCommandStep @@ -68,15 +72,12 @@ import liquibase.statement.core.RawSqlStatement import liquibase.structure.core.Catalog import liquibase.util.LiquibaseUtil import liquibase.util.StreamUtil + +import grails.config.ConfigMap import org.grails.build.parsing.CommandLine import org.grails.plugins.databasemigration.DatabaseMigrationException import org.grails.plugins.databasemigration.NoopVisitor -import java.nio.file.Path -import java.text.DateFormat -import java.text.ParseException -import java.text.SimpleDateFormat - import static org.grails.plugins.databasemigration.DatabaseMigrationGrailsPlugin.getDataSourceName import static org.grails.plugins.databasemigration.DatabaseMigrationGrailsPlugin.isDefaultDataSource import static org.grails.plugins.databasemigration.PluginConstants.DATA_SOURCE_NAME_KEY @@ -158,7 +159,7 @@ trait DatabaseMigrationCommand { return (Map) dataSources.get(dataSourceName) } - void withFileOrSystemOutWriter(String filename, @ClosureParams(value = SimpleType, options = "java.io.Writer") Closure closure) { + void withFileOrSystemOutWriter(String filename, @ClosureParams(value = SimpleType, options = 'java.io.Writer') Closure closure) { if (!filename) { closure.call(new PrintWriter(System.out)) return @@ -251,7 +252,7 @@ trait DatabaseMigrationCommand { def compareControl = new CompareControl([] as CompareControl.SchemaComparison[], null as String) DiffOutputControl diffOutputControl = createDiffOutputControl() - final CommandScope command = new CommandScope("groovyGenerateChangeLog"); + final CommandScope command = new CommandScope('groovyGenerateChangeLog') command .addArgumentValue(ReferenceDbUrlConnectionCommandStep.REFERENCE_DATABASE_ARG, originalDatabase) .addArgumentValue(DbUrlConnectionArgumentsCommandStep.DATABASE_ARG, originalDatabase) @@ -263,10 +264,9 @@ trait DatabaseMigrationCommand { .addArgumentValue(DiffOutputControlCommandStep.INCLUDE_TABLESPACE_ARG, diffOutputControl.getIncludeTablespace()) .addArgumentValue(GenerateChangelogCommandStep.OVERWRITE_OUTPUT_FILE_ARG, GenerateChangelogCommandStep.OVERWRITE_OUTPUT_FILE_ARG.getDefaultValue()) .addArgumentValue(GenerateChangelogCommandStep.RUN_ON_CHANGE_TYPES_ARG, AbstractChangelogCommandStep.RUN_ON_CHANGE_TYPES_ARG.getDefaultValue()) - .addArgumentValue(GenerateChangelogCommandStep.REPLACE_IF_EXISTS_TYPES_ARG, AbstractChangelogCommandStep.REPLACE_IF_EXISTS_TYPES_ARG.getDefaultValue()); - + .addArgumentValue(GenerateChangelogCommandStep.REPLACE_IF_EXISTS_TYPES_ARG, AbstractChangelogCommandStep.REPLACE_IF_EXISTS_TYPES_ARG.getDefaultValue()) - if(diffOutputControl.isReplaceIfExistsSet()) { + if (diffOutputControl.isReplaceIfExistsSet()) { command.addArgumentValue(GenerateChangelogCommandStep.USE_OR_REPLACE_OPTION, true) } command.setOutput(System.out) @@ -278,7 +278,7 @@ trait DatabaseMigrationCommand { def compareControl = new CompareControl([] as CompareControl.SchemaComparison[], null as String) DiffOutputControl diffOutputControl = createDiffOutputControl() - final CommandScope command = new CommandScope("groovyDiffChangelog"); + final CommandScope command = new CommandScope('groovyDiffChangelog') command .addArgumentValue(ReferenceDbUrlConnectionCommandStep.REFERENCE_DATABASE_ARG, referenceDatabase) .addArgumentValue(DbUrlConnectionArgumentsCommandStep.DATABASE_ARG, targetDatabase) @@ -290,9 +290,9 @@ trait DatabaseMigrationCommand { .addArgumentValue(DiffOutputControlCommandStep.INCLUDE_SCHEMA_ARG, diffOutputControl.getIncludeSchema()) .addArgumentValue(DiffOutputControlCommandStep.INCLUDE_TABLESPACE_ARG, diffOutputControl.getIncludeTablespace()) .addArgumentValue(GenerateChangelogCommandStep.RUN_ON_CHANGE_TYPES_ARG, AbstractChangelogCommandStep.RUN_ON_CHANGE_TYPES_ARG.getDefaultValue()) - .addArgumentValue(GenerateChangelogCommandStep.REPLACE_IF_EXISTS_TYPES_ARG, AbstractChangelogCommandStep.REPLACE_IF_EXISTS_TYPES_ARG.getDefaultValue()); + .addArgumentValue(GenerateChangelogCommandStep.REPLACE_IF_EXISTS_TYPES_ARG, AbstractChangelogCommandStep.REPLACE_IF_EXISTS_TYPES_ARG.getDefaultValue()) - if(diffOutputControl.isReplaceIfExistsSet()) { + if (diffOutputControl.isReplaceIfExistsSet()) { command.addArgumentValue(GenerateChangelogCommandStep.USE_OR_REPLACE_OPTION, true) } command.setOutput(System.out) @@ -305,10 +305,10 @@ trait DatabaseMigrationCommand { LabelExpression labelExpression = liquibase.changeLogParameters.labels liquibase.changeLogParameters.setContexts(contexts) - final ExecutorService executorService = Scope.getCurrentScope().getSingleton(ExecutorService.class) - final Executor oldTemplate = executorService.getExecutor("jdbc", database) + final ExecutorService executorService = Scope.getCurrentScope().getSingleton(ExecutorService) + final Executor oldTemplate = executorService.getExecutor('jdbc', database) final LoggingExecutor outputTemplate = new LoggingExecutor(oldTemplate, output, database) - executorService.setExecutor("jdbc", database, outputTemplate) + executorService.setExecutor('jdbc', database, outputTemplate) outputHeader(outputTemplate, (String) "Previous $count SQL Changeset(s) Skipping $skip Script", liquibase, database) @@ -334,7 +334,7 @@ trait DatabaseMigrationCommand { } finally { try { lockService.releaseLock() - executorService.setExecutor("jdbc", database, oldTemplate) + executorService.setExecutor('jdbc', database, oldTemplate) } catch (LockException e) { throw new LiquibaseException(e.message, e.cause) } @@ -342,23 +342,23 @@ trait DatabaseMigrationCommand { } void outputHeader(Executor executor, String message, Liquibase liquibase, Database database) throws DatabaseException { - executor.comment("*********************************************************************") + executor.comment('*********************************************************************') executor.comment(message) - executor.comment("*********************************************************************") - executor.comment("Change Log: " + liquibase.changeLogFile) - executor.comment("Ran at: " + DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(new Date())) + executor.comment('*********************************************************************') + executor.comment('Change Log: ' + liquibase.changeLogFile) + executor.comment('Ran at: ' + DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT).format(new Date())) DatabaseConnection connection = liquibase.getDatabase().getConnection() if (connection != null) { - executor.comment("Against: " + connection.getConnectionUserName() + "@" + connection.getURL()) + executor.comment('Against: ' + connection.getConnectionUserName() + '@' + connection.getURL()) } - executor.comment("Liquibase version: " + LiquibaseUtil.getBuildVersion()) - executor.comment("*********************************************************************" + StreamUtil.getLineSeparator()) + executor.comment('Liquibase version: ' + LiquibaseUtil.getBuildVersion()) + executor.comment('*********************************************************************' + StreamUtil.getLineSeparator()) if (database instanceof OracleDatabase) { - executor.execute(new RawSqlStatement("SET DEFINE OFF;")) + executor.execute(new RawSqlStatement('SET DEFINE OFF;')) } if (database instanceof MSSQLDatabase && database.getDefaultCatalogName() != null) { - executor.execute(new RawSqlStatement("USE " + database.escapeObjectName(database.getDefaultCatalogName(), Catalog.class) + ";")) + executor.execute(new RawSqlStatement('USE ' + database.escapeObjectName(database.getDefaultCatalogName(), Catalog) + ';')) } } @@ -368,7 +368,7 @@ trait DatabaseMigrationCommand { String excludeObjects = config.getProperty("${configPrefix}.excludeObjects".toString(), String) String includeObjects = config.getProperty("${configPrefix}.includeObjects".toString(), String) if (excludeObjects && includeObjects) { - throw new DatabaseMigrationException("Cannot specify both excludeObjects and includeObjects") + throw new DatabaseMigrationException('Cannot specify both excludeObjects and includeObjects') } if (excludeObjects) { diffOutputControl.objectChangeFilter = new StandardObjectChangeFilter(StandardObjectChangeFilter.FilterType.EXCLUDE, excludeObjects) @@ -416,11 +416,11 @@ trait DatabaseMigrationCommand { } private String getExtension(String fileName) { - String extension = "" + String extension = '' int i = fileName.lastIndexOf('.') if (i > 0) { - extension = fileName.substring(i+1) + extension = fileName.substring(i + 1) } extension } diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DbmChangelogToGroovy.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DbmChangelogToGroovy.groovy index 1192111d6a7..532ca699bcb 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DbmChangelogToGroovy.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DbmChangelogToGroovy.groovy @@ -21,8 +21,10 @@ package org.grails.plugins.databasemigration.command import groovy.transform.CompileStatic import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType + import liquibase.parser.ChangeLogParserFactory import liquibase.serializer.ChangeLogSerializerFactory + import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic @@ -65,7 +67,7 @@ class DbmChangelogToGroovy implements ScriptDatabaseMigrationCommand { } } - private static void withFileOrSystemOutputStream(File file, @ClosureParams(value = SimpleType, options = "java.io.OutputStream") Closure closure) { + private static void withFileOrSystemOutputStream(File file, @ClosureParams(value = SimpleType, options = 'java.io.OutputStream') Closure closure) { if (!file) { closure.call(System.out) return diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DbmCreateChangelog.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DbmCreateChangelog.groovy index 041c644fad7..dddc41bfa67 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DbmCreateChangelog.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/DbmCreateChangelog.groovy @@ -19,8 +19,10 @@ package org.grails.plugins.databasemigration.command import groovy.transform.CompileStatic + import liquibase.serializer.ChangeLogSerializer import liquibase.serializer.ChangeLogSerializerFactory + import org.grails.plugins.databasemigration.DatabaseMigrationException @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/ScriptDatabaseMigrationCommand.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/ScriptDatabaseMigrationCommand.groovy index e7fcbeaf86d..0be43b3e95f 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/ScriptDatabaseMigrationCommand.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/command/ScriptDatabaseMigrationCommand.groovy @@ -18,12 +18,14 @@ */ package org.grails.plugins.databasemigration.command -import grails.config.ConfigMap -import grails.util.Environment -import grails.util.GrailsNameUtils import groovy.transform.CompileStatic + import liquibase.parser.ChangeLogParser import liquibase.parser.ChangeLogParserFactory + +import grails.config.ConfigMap +import grails.util.Environment +import grails.util.GrailsNameUtils import org.grails.cli.profile.ExecutionContext import org.grails.config.CodeGenConfig import org.grails.plugins.databasemigration.EnvironmentAwareCodeGenConfig @@ -59,7 +61,7 @@ trait ScriptDatabaseMigrationCommand implements DatabaseMigrationCommand { abstract void handle() String getName() { - return GrailsNameUtils.getScriptName(GrailsNameUtils.getLogicalName(getClass().getName(), "Command")) + return GrailsNameUtils.getScriptName(GrailsNameUtils.getLogicalName(getClass().getName(), 'Command')) } void setConfig(ConfigMap config) { diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/ChangelogXml2Groovy.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/ChangelogXml2Groovy.groovy index ab4c897edfd..3e92e62d034 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/ChangelogXml2Groovy.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/ChangelogXml2Groovy.groovy @@ -39,20 +39,20 @@ class ChangelogXml2Groovy { */ static String convert(String xml) { def groovy = new StringBuilder('databaseChangeLog = {') - groovy.append NEWLINE + groovy.append(NEWLINE) new XmlParser(false, false).parseText(xml).each { Node node -> convertNode(node, groovy, 1) } - groovy.append '}' - groovy.append NEWLINE + groovy.append('}') + groovy.append(NEWLINE) groovy.toString() } protected static void convertNode(Node node, StringBuilder groovy, int indentLevel) { - groovy.append NEWLINE - appendWithIndent indentLevel, groovy, (String) node.name() + groovy.append(NEWLINE) + appendWithIndent(indentLevel, groovy, (String) node.name()) String mixedText def children = [] @@ -64,17 +64,17 @@ class ChangelogXml2Groovy { } } - appendAttrs groovy, node, mixedText + appendAttrs(groovy, node, mixedText) if (children) { - groovy.append ' {' + groovy.append(' {') for (child in children) { convertNode((Node) child, groovy, indentLevel + 1) } - appendWithIndent indentLevel, groovy, '}' - groovy.append NEWLINE + appendWithIndent(indentLevel, groovy, '}') + groovy.append(NEWLINE) } else { - groovy.append NEWLINE + groovy.append(NEWLINE) } } @@ -84,28 +84,28 @@ class ChangelogXml2Groovy { String delimiter = '' if (text) { - local.append '"""' - local.append text.replaceAll(/(\$|\\)/, /\\$1/) - local.append '"""' + local.append('"""') + local.append(text.replaceAll(/(\$|\\)/, /\\$1/)) + local.append('"""') delimiter = ', ' } node.attributes().each { name, value -> - local.append delimiter - local.append name + local.append(delimiter) + local.append(name) local.append(': "').append(((String) value).replaceAll(/(\$|\\|\\n)/, /\\$1/)).append('"') delimiter = ', ' } if (local.length()) { - groovy.append '(' - groovy.append local.toString() - groovy.append ')' + groovy.append('(') + groovy.append(local.toString()) + groovy.append(')') } } protected static void appendWithIndent(int indentLevel, StringBuilder groovy, String s) { - indentLevel.times { groovy.append ' ' } - groovy.append s + indentLevel.times { groovy.append(' ') } + groovy.append(s) } -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/DatabaseChangeLogBuilder.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/DatabaseChangeLogBuilder.groovy index a7e9c3467f7..ad420e35bad 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/DatabaseChangeLogBuilder.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/DatabaseChangeLogBuilder.groovy @@ -19,11 +19,14 @@ package org.grails.plugins.databasemigration.liquibase import groovy.transform.CompileStatic -import liquibase.parser.core.ParsedNode import org.codehaus.groovy.runtime.InvokerHelper -import org.grails.plugins.databasemigration.DatabaseMigrationException + +import liquibase.parser.core.ParsedNode + import org.springframework.context.ApplicationContext +import org.grails.plugins.databasemigration.DatabaseMigrationException + import static org.grails.plugins.databasemigration.PluginConstants.DATA_SOURCE_NAME_KEY @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/EmbeddedJarPathHandler.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/EmbeddedJarPathHandler.groovy index e7864732c43..bfba3ce565f 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/EmbeddedJarPathHandler.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/EmbeddedJarPathHandler.groovy @@ -19,23 +19,25 @@ package org.grails.plugins.databasemigration.liquibase +import java.nio.file.FileSystem +import java.nio.file.FileSystems +import java.nio.file.Path +import java.nio.file.Paths + import groovy.transform.CompileStatic + import liquibase.resource.AbstractPathResourceAccessor import liquibase.resource.PathResource import liquibase.resource.Resource import liquibase.resource.ResourceAccessor import liquibase.resource.ZipPathHandler -import java.nio.file.FileSystem -import java.nio.file.FileSystems -import java.nio.file.Path -import java.nio.file.Paths - @CompileStatic class EmbeddedJarPathHandler extends ZipPathHandler { + @Override int getPriority(String root) { - if (root.startsWith("jar:file:") && root.endsWith("!/")) { //only can handle `jar:` urls for the entire jar + if (root.startsWith('jar:file:') && root.endsWith('!/')) { //only can handle `jar:` urls for the entire jar if (parseJarPath(root).contains('!')) { return PRIORITY_SPECIALIZED } @@ -44,7 +46,7 @@ class EmbeddedJarPathHandler extends ZipPathHandler { } private String parseJarPath(String root) { - root.substring(9, root.lastIndexOf("!")) + root.substring(9, root.lastIndexOf('!')) } @Override @@ -56,6 +58,7 @@ class EmbeddedJarPathHandler extends ZipPathHandler { @CompileStatic class EmbeddedJarResourceAccessor extends AbstractPathResourceAccessor { + private FileSystem fileSystem EmbeddedJarResourceAccessor(List jarPaths) { @@ -63,7 +66,7 @@ class EmbeddedJarResourceAccessor extends AbstractPathResourceAccessor { Path firstPath = Paths.get(jarPaths.pop()) fileSystem = FileSystems.newFileSystem(firstPath, null as ClassLoader) - while(jarPaths) { + while (jarPaths) { Path innerPath = fileSystem.getPath(jarPaths.pop()) fileSystem = FileSystems.newFileSystem(innerPath, null as ClassLoader) } @@ -79,7 +82,7 @@ class EmbeddedJarResourceAccessor extends AbstractPathResourceAccessor { @Override protected Path getRootPath() { - return this.fileSystem.getPath("/") + return this.fileSystem.getPath('/') } @Override diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GormDatabase.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GormDatabase.groovy index 99a79be4b56..b1315943bb8 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GormDatabase.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GormDatabase.groovy @@ -19,6 +19,7 @@ package org.grails.plugins.databasemigration.liquibase import groovy.transform.CompileStatic + import liquibase.database.DatabaseConnection import liquibase.database.OfflineConnection import liquibase.exception.DatabaseException @@ -27,12 +28,13 @@ import liquibase.snapshot.DatabaseSnapshot import liquibase.snapshot.JdbcDatabaseSnapshot import liquibase.snapshot.SnapshotControl import liquibase.structure.DatabaseObject -import org.grails.orm.hibernate.HibernateDatastore import org.hibernate.boot.Metadata import org.hibernate.boot.MetadataSources import org.hibernate.dialect.Dialect import org.hibernate.service.ServiceRegistry +import org.grails.orm.hibernate.HibernateDatastore + @CompileStatic class GormDatabase extends HibernateDatabase { @@ -51,7 +53,7 @@ class GormDatabase extends HibernateDatabase { this.metadata = hibernateDatastore.getMetadata() SnapshotControl snapshotControl = new SnapshotControl(this, null, null) GormDatabase database = this - OfflineConnection connection = new OfflineConnection("offline:gorm", null) { + OfflineConnection connection = new OfflineConnection('offline:gorm', null) { DatabaseSnapshot getSnapshot(DatabaseObject[] examples) { new JdbcDatabaseSnapshot(examples, database, snapshotControl) } @@ -68,7 +70,7 @@ class GormDatabase extends HibernateDatabase { * Return the hibernate {@link Metadata} used by this database. */ @Override - public Metadata getMetadata() { + Metadata getMetadata() { metadata } @@ -77,15 +79,9 @@ class GormDatabase extends HibernateDatabase { //no op } - @Override boolean isCorrectDatabaseImplementation(DatabaseConnection conn) throws DatabaseException { return false } } - - - - - diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GrailsLiquibase.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GrailsLiquibase.groovy index 9eba4818cd7..94412c49ee2 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GrailsLiquibase.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GrailsLiquibase.groovy @@ -18,18 +18,20 @@ */ package org.grails.plugins.databasemigration.liquibase +import java.sql.Connection + import groovy.transform.CompileStatic + import liquibase.Liquibase import liquibase.database.Database import liquibase.exception.DatabaseException import liquibase.exception.LiquibaseException import liquibase.integration.spring.SpringLiquibase import liquibase.resource.ResourceAccessor + import org.springframework.context.ApplicationContext import org.springframework.core.io.DefaultResourceLoader -import java.sql.Connection - import static org.grails.plugins.databasemigration.PluginConstants.DATA_SOURCE_NAME_KEY @CompileStatic @@ -50,7 +52,7 @@ class GrailsLiquibase extends SpringLiquibase { @Override protected Liquibase createLiquibase(Connection connection) throws LiquibaseException { - Liquibase liquibase = new Liquibase(getChangeLog(), createResourceOpener(), createDatabase (connection, null)) + Liquibase liquibase = new Liquibase(getChangeLog(), createResourceOpener(), createDatabase(connection, null)) if (parameters != null) { for (Map.Entry entry : parameters.entrySet()) { liquibase.setChangeLogParameter(entry.getKey(), entry.getValue()) @@ -64,7 +66,6 @@ class GrailsLiquibase extends SpringLiquibase { return liquibase } - @Override protected Database createDatabase(Connection connection, ResourceAccessor accessor) throws DatabaseException { Database database = super.createDatabase(connection, accessor) diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChange.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChange.groovy index 01f3e48464f..d57b4fcdd3b 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChange.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChange.groovy @@ -18,10 +18,11 @@ */ package org.grails.plugins.databasemigration.liquibase -import grails.config.Config -import grails.core.GrailsApplication +import java.sql.Connection + import groovy.sql.Sql import groovy.transform.CompileStatic + import liquibase.Scope import liquibase.change.AbstractChange import liquibase.change.ChangeMetaData @@ -40,10 +41,12 @@ import liquibase.parser.core.ParsedNode import liquibase.parser.core.ParsedNodeException import liquibase.resource.ResourceAccessor import liquibase.statement.SqlStatement -import org.grails.plugins.databasemigration.DatabaseMigrationTransactionManager + import org.springframework.context.ApplicationContext -import java.sql.Connection +import grails.config.Config +import grails.core.GrailsApplication +import org.grails.plugins.databasemigration.DatabaseMigrationTransactionManager import static org.grails.plugins.databasemigration.PluginConstants.DATA_SOURCE_NAME_KEY @@ -54,7 +57,7 @@ import static org.grails.plugins.databasemigration.PluginConstants.DATA_SOURCE_N * @author Kazuki YAMAMOTO */ @CompileStatic -@DatabaseChange(name = "grailsChange", description = "Executes groovy code to apply a database change.", priority = ChangeMetaData.PRIORITY_DEFAULT) +@DatabaseChange(name = 'grailsChange', description = 'Executes groovy code to apply a database change.', priority = ChangeMetaData.PRIORITY_DEFAULT) class GroovyChange extends AbstractChange { ApplicationContext ctx @@ -93,8 +96,8 @@ class GroovyChange extends AbstractChange { void load(ParsedNode parsedNode, ResourceAccessor resourceAccessor) throws ParsedNodeException { ctx = parsedNode.getChildValue(null, 'applicationContext', ApplicationContext) dataSourceName = parsedNode.getChildValue(null, DATA_SOURCE_NAME_KEY, String) - if (dataSourceName?.startsWith("dataSource_")) { - dataSourceName = dataSourceName.substring("dataSource_".length()) + if (dataSourceName?.startsWith('dataSource_')) { + dataSourceName = dataSourceName.substring('dataSource_'.length()) } initClosure = parsedNode.getChildValue(null, 'init', Closure) @@ -160,7 +163,7 @@ class GroovyChange extends AbstractChange { if (shouldRun() && changeClosure) { changeClosure.delegate = this try { - if(!changeClosureCalled) { + if (!changeClosureCalled) { withNewTransaction(changeClosure) } } finally { @@ -190,7 +193,7 @@ class GroovyChange extends AbstractChange { @Override CheckSum generateCheckSum() { - CheckSum.compute checksumString ?: 'Grails Change' + CheckSum.compute(checksumString ?: 'Grails Change') } @Override @@ -205,7 +208,7 @@ class GroovyChange extends AbstractChange { * @param message the error message */ void error(String message) { - validationErrors.addError message + validationErrors.addError(message) } /** @@ -214,7 +217,7 @@ class GroovyChange extends AbstractChange { * @param warning the warning message */ void warn(String warning) { - warnings.addWarning warning + warnings.addWarning(warning) } /** @@ -313,7 +316,7 @@ class GroovyChange extends AbstractChange { * @return Whether the database executor is instance of LoggingExecutor */ protected boolean shouldRun() { - !(Scope.getCurrentScope().getSingleton(ExecutorService.class).getExecutor("jdbc", database) instanceof LoggingExecutor) + !(Scope.getCurrentScope().getSingleton(ExecutorService).getExecutor('jdbc', database) instanceof LoggingExecutor) } /** @@ -324,6 +327,6 @@ class GroovyChange extends AbstractChange { */ protected void withNewTransaction(Closure callable) { new DatabaseMigrationTransactionManager(ctx, dataSourceName) - .withNewTransaction callable + .withNewTransaction(callable) } } diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChangeLogParser.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChangeLogParser.groovy index c20064625c1..0083c7aa800 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChangeLogParser.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChangeLogParser.groovy @@ -18,18 +18,21 @@ */ package org.grails.plugins.databasemigration.liquibase -import grails.config.ConfigMap -import grails.io.IOUtils import groovy.transform.CompileDynamic import groovy.transform.CompileStatic +import org.codehaus.groovy.control.CompilerConfiguration + import liquibase.changelog.ChangeLogParameters import liquibase.exception.ChangeLogParseException import liquibase.parser.core.ParsedNode import liquibase.parser.core.xml.AbstractChangeLogParser import liquibase.resource.ResourceAccessor -import org.codehaus.groovy.control.CompilerConfiguration + import org.springframework.context.ApplicationContext +import grails.config.ConfigMap +import grails.io.IOUtils + import static org.grails.plugins.databasemigration.PluginConstants.DATA_SOURCE_NAME_KEY @CompileStatic diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChangeLogSerializer.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChangeLogSerializer.groovy index 063e45e5f43..162fe79fa59 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChangeLogSerializer.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyChangeLogSerializer.groovy @@ -19,6 +19,7 @@ package org.grails.plugins.databasemigration.liquibase import groovy.transform.CompileStatic + import liquibase.changelog.ChangeLogChild import liquibase.changelog.ChangeSet import liquibase.serializer.ChangeLogSerializer diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyDiffToChangeLogCommandStep.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyDiffToChangeLogCommandStep.groovy index 94771e3b3b5..a226fa5c29d 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyDiffToChangeLogCommandStep.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyDiffToChangeLogCommandStep.groovy @@ -19,6 +19,7 @@ package org.grails.plugins.databasemigration.liquibase import groovy.transform.CompileStatic + import liquibase.command.CommandResultsBuilder import liquibase.command.CommandScope import liquibase.command.core.DiffChangelogCommandStep @@ -31,33 +32,34 @@ import liquibase.database.ObjectQuotingStrategy import liquibase.diff.DiffResult import liquibase.diff.output.DiffOutputControl import liquibase.serializer.ChangeLogSerializerFactory + import grails.util.GrailsStringUtils @CompileStatic class GroovyDiffToChangeLogCommandStep extends DiffChangelogCommandStep { - public static final String[] COMMAND_NAME = new String[] {"groovyDiffChangelog"} + public static final String[] COMMAND_NAME = new String[] {'groovyDiffChangelog'} @Override void run(CommandResultsBuilder resultsBuilder) { CommandScope commandScope = resultsBuilder.getCommandScope() - Database referenceDatabase = commandScope.getArgumentValue(ReferenceDbUrlConnectionCommandStep.REFERENCE_DATABASE_ARG); - String changeLogFile = commandScope.getArgumentValue(CHANGELOG_FILE_ARG); + Database referenceDatabase = commandScope.getArgumentValue(ReferenceDbUrlConnectionCommandStep.REFERENCE_DATABASE_ARG) + String changeLogFile = commandScope.getArgumentValue(CHANGELOG_FILE_ARG) - InternalSnapshotCommandStep.logUnsupportedDatabase(referenceDatabase, this.getClass()); + InternalSnapshotCommandStep.logUnsupportedDatabase(referenceDatabase, this.getClass()) DiffCommandStep diffCommandStep = new DiffCommandStep() - DiffResult diffResult = diffCommandStep.createDiffResult(resultsBuilder); + DiffResult diffResult = diffCommandStep.createDiffResult(resultsBuilder) - PrintStream outputStream = new PrintStream(resultsBuilder.getOutputStream()); + PrintStream outputStream = new PrintStream(resultsBuilder.getOutputStream()) - ObjectQuotingStrategy originalStrategy = referenceDatabase.getObjectQuotingStrategy(); + ObjectQuotingStrategy originalStrategy = referenceDatabase.getObjectQuotingStrategy() DiffOutputControl diffOutputControl = (DiffOutputControl) resultsBuilder.getResult(DiffOutputControlCommandStep.DIFF_OUTPUT_CONTROL.getName()) try { - referenceDatabase.setObjectQuotingStrategy(ObjectQuotingStrategy.QUOTE_ALL_OBJECTS); + referenceDatabase.setObjectQuotingStrategy(ObjectQuotingStrategy.QUOTE_ALL_OBJECTS) if (GrailsStringUtils.trimToNull(changeLogFile) == null) { createDiffToChangeLogObject(diffResult, diffOutputControl, false).print(outputStream, ChangeLogSerializerFactory.instance.getSerializer('groovy')) } else { @@ -65,10 +67,10 @@ class GroovyDiffToChangeLogCommandStep extends DiffChangelogCommandStep { } } finally { - referenceDatabase.setObjectQuotingStrategy(originalStrategy); - outputStream.flush(); + referenceDatabase.setObjectQuotingStrategy(originalStrategy) + outputStream.flush() } - resultsBuilder.addResult("statusCode", 0); + resultsBuilder.addResult('statusCode', 0) } diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyGenerateChangeLogCommandStep.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyGenerateChangeLogCommandStep.groovy index f9430191d48..bff305a1b00 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyGenerateChangeLogCommandStep.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyGenerateChangeLogCommandStep.groovy @@ -19,6 +19,7 @@ package org.grails.plugins.databasemigration.liquibase import groovy.transform.CompileStatic + import liquibase.Scope import liquibase.command.CommandResultsBuilder import liquibase.command.CommandScope @@ -33,51 +34,52 @@ import liquibase.diff.DiffResult import liquibase.diff.output.DiffOutputControl import liquibase.diff.output.changelog.DiffToChangeLog import liquibase.serializer.ChangeLogSerializerFactory + import grails.util.GrailsStringUtils @CompileStatic class GroovyGenerateChangeLogCommandStep extends GenerateChangelogCommandStep { - public static final String[] COMMAND_NAME = new String[] {"groovyGenerateChangeLog"}; + public static final String[] COMMAND_NAME = new String[] {'groovyGenerateChangeLog'} private static final String INFO_MESSAGE = - "When generating formatted SQL changelogs, it is important to decide if batched statements\n" + + 'When generating formatted SQL changelogs, it is important to decide if batched statements\n' + "should be split or not. For storedlogic objects, the default behavior is 'splitStatements:false'\n." + - "All other objects default to 'splitStatements:true'. See https://docs.liquibase.org for additional information."; + "All other objects default to 'splitStatements:true'. See https://docs.liquibase.org for additional information." @Override void run(CommandResultsBuilder resultsBuilder) throws Exception { - CommandScope commandScope = resultsBuilder.getCommandScope(); + CommandScope commandScope = resultsBuilder.getCommandScope() - String changeLogFile = GrailsStringUtils.trimToNull(commandScope.getArgumentValue(CHANGELOG_FILE_ARG)); - if (changeLogFile != null && changeLogFile.toLowerCase().endsWith(".sql")) { - Scope.getCurrentScope().getUI().sendMessage("\n" + INFO_MESSAGE + "\n"); - Scope.getCurrentScope().getLog(getClass()).info("\n" + INFO_MESSAGE + "\n"); + String changeLogFile = GrailsStringUtils.trimToNull(commandScope.getArgumentValue(CHANGELOG_FILE_ARG)) + if (changeLogFile != null && changeLogFile.toLowerCase().endsWith('.sql')) { + Scope.getCurrentScope().getUI().sendMessage('\n' + INFO_MESSAGE + '\n') + Scope.getCurrentScope().getLog(getClass()).info('\n' + INFO_MESSAGE + '\n') } - final Database referenceDatabase = commandScope.getArgumentValue(ReferenceDbUrlConnectionCommandStep.REFERENCE_DATABASE_ARG); + final Database referenceDatabase = commandScope.getArgumentValue(ReferenceDbUrlConnectionCommandStep.REFERENCE_DATABASE_ARG) - InternalSnapshotCommandStep.logUnsupportedDatabase(referenceDatabase, this.getClass()); + InternalSnapshotCommandStep.logUnsupportedDatabase(referenceDatabase, this.getClass()) DiffCommandStep diffCommandStep = new DiffCommandStep() - DiffResult diffResult = diffCommandStep.createDiffResult(resultsBuilder); + DiffResult diffResult = diffCommandStep.createDiffResult(resultsBuilder) DiffOutputControl diffOutputControl = (DiffOutputControl) resultsBuilder.getResult(DiffOutputControlCommandStep.DIFF_OUTPUT_CONTROL.getName()) - DiffToChangeLog changeLogWriter = new DiffToChangeLog(diffResult, diffOutputControl); + DiffToChangeLog changeLogWriter = new DiffToChangeLog(diffResult, diffOutputControl) - changeLogWriter.setChangeSetAuthor(commandScope.getArgumentValue(AUTHOR_ARG)); - changeLogWriter.setChangeSetContext(commandScope.getArgumentValue(CONTEXT_ARG)); - changeLogWriter.setChangeSetPath(changeLogFile); + changeLogWriter.setChangeSetAuthor(commandScope.getArgumentValue(AUTHOR_ARG)) + changeLogWriter.setChangeSetContext(commandScope.getArgumentValue(CONTEXT_ARG)) + changeLogWriter.setChangeSetPath(changeLogFile) - ObjectQuotingStrategy originalStrategy = referenceDatabase.getObjectQuotingStrategy(); + ObjectQuotingStrategy originalStrategy = referenceDatabase.getObjectQuotingStrategy() try { - referenceDatabase.setObjectQuotingStrategy(ObjectQuotingStrategy.QUOTE_ALL_OBJECTS); + referenceDatabase.setObjectQuotingStrategy(ObjectQuotingStrategy.QUOTE_ALL_OBJECTS) if (GrailsStringUtils.trimToNull(changeLogFile) != null) { changeLogWriter.print(changeLogFile, ChangeLogSerializerFactory.instance.getSerializer(changeLogFile)) } else { - PrintStream outputStream = new PrintStream(resultsBuilder.getOutputStream()); + PrintStream outputStream = new PrintStream(resultsBuilder.getOutputStream()) try { changeLogWriter.print(outputStream, ChangeLogSerializerFactory.instance.getSerializer('groovy')) } finally { @@ -86,10 +88,10 @@ class GroovyGenerateChangeLogCommandStep extends GenerateChangelogCommandStep { } if (GrailsStringUtils.trimToNull(changeLogFile) != null) { - Scope.getCurrentScope().getUI().sendMessage("Generated changelog written to " + new File(changeLogFile).getAbsolutePath()); + Scope.getCurrentScope().getUI().sendMessage('Generated changelog written to ' + new File(changeLogFile).getAbsolutePath()) } } finally { - referenceDatabase.setObjectQuotingStrategy(originalStrategy); + referenceDatabase.setObjectQuotingStrategy(originalStrategy) } } diff --git a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyPrecondition.groovy b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyPrecondition.groovy index 458d82179d4..5abcb6b467b 100644 --- a/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyPrecondition.groovy +++ b/grails-data-hibernate5/dbmigration/src/main/groovy/org/grails/plugins/databasemigration/liquibase/GroovyPrecondition.groovy @@ -18,10 +18,11 @@ */ package org.grails.plugins.databasemigration.liquibase -import grails.config.Config -import grails.core.GrailsApplication +import java.sql.Connection + import groovy.sql.Sql import groovy.transform.CompileStatic + import liquibase.CatalogAndSchema import liquibase.changelog.ChangeSet import liquibase.changelog.DatabaseChangeLog @@ -41,9 +42,11 @@ import liquibase.resource.ResourceAccessor import liquibase.snapshot.DatabaseSnapshot import liquibase.snapshot.SnapshotControl import liquibase.snapshot.SnapshotGeneratorFactory + import org.springframework.context.ApplicationContext -import java.sql.Connection +import grails.config.Config +import grails.core.GrailsApplication /** * Custom Groovy-based precondition. diff --git a/grails-data-hibernate5/dbmigration/src/main/resources/migration.gdsl b/grails-data-hibernate5/dbmigration/src/main/resources/migration.gdsl index 8622d7049ca..f08aad3f274 100644 --- a/grails-data-hibernate5/dbmigration/src/main/resources/migration.gdsl +++ b/grails-data-hibernate5/dbmigration/src/main/resources/migration.gdsl @@ -3,12 +3,12 @@ migrationDir = ".*/grails-app/migrations/.*" final String STRING = String.name contributor(context(pathRegexp: migrationDir, scope: scriptScope())) { - property name: "databaseChangeLog", type: {} + property(name: "databaseChangeLog", type: {}) } def changelogBody = context(scope: closureScope()) contributor([changelogBody]) { - method name: "changeSet", params: [ + method(name: "changeSet", params: [ args: [ parameter(name: 'id', type: STRING), parameter(name: 'author', type: STRING), @@ -22,11 +22,11 @@ contributor([changelogBody]) { ], body: {} - ], type: void + ], type: void) - method name: "include", params: [ + method(name: "include", params: [ args: [parameter(name: 'file', type: STRING)] - ], type: void + ], type: void) } void provideChildsOf(String parentMethod, Closure callback) { @@ -47,43 +47,43 @@ void provideChildsOf(String parentMethod, boolean isArg, Closure callback) { //Grails changes provideChildsOf("changeSet") { - method name: "grailsChange", params: [:], body: {} + method(name: "grailsChange", params: [:], body: {}) } provideChildsOf("grailsChange") { - method name: "init", params: [:], body: {}, type: void - method name: "validate", params: [:], body: {}, type: void - method name: "change", params: [:], body: {}, type: void - method name: "rollback", params: [:], body: {}, type: void - method name: "confirm", params: [:], body: {}, type: void - method name: "checkSum", params: [:], body: {}, type: void + method(name: "init", params: [:], body: {}, type: void) + method(name: "validate", params: [:], body: {}, type: void) + method(name: "change", params: [:], body: {}, type: void) + method(name: "rollback", params: [:], body: {}, type: void) + method(name: "confirm", params: [:], body: {}, type: void) + method(name: "checkSum", params: [:], body: {}, type: void) } provideChildsOf("change") { - property name: "changeSet", type: "liquibase.changelog.ChangeSet" - property name: "resourceAccessor", type: "liquibase.resource.ResourceAccessor" - property name: "ctx", type: "org.springframework.context.ApplicationContext" - property name: "application", type: "org.codehaus.groovy.grails.commons.GrailsApplication" - property name: "database", type: "liquibase.database.Database" - property name: "databaseConnection", type: "liquibase.database.DatabaseConnection" - property name: "connection", type: "java.sql.Connection" - property name: "sql", type: "groovy.sql.Sql" + property(name: "changeSet", type: "liquibase.changelog.ChangeSet") + property(name: "resourceAccessor", type: "liquibase.resource.ResourceAccessor") + property(name: "ctx", type: "org.springframework.context.ApplicationContext") + property(name: "application", type: "org.codehaus.groovy.grails.commons.GrailsApplication") + property(name: "database", type: "liquibase.database.Database") + property(name: "databaseConnection", type: "liquibase.database.DatabaseConnection") + property(name: "connection", type: "java.sql.Connection") + property(name: "sql", type: "groovy.sql.Sql") } provideChildsOf("rollback") { - property name: "database", type: "liquibase.database.Database" - property name: "databaseConnection", type: "liquibase.database.DatabaseConnection" - property name: "connection", type: "java.sql.Connection" - property name: "sql", type: "groovy.sql.Sql" + property(name: "database", type: "liquibase.database.Database") + property(name: "databaseConnection", type: "liquibase.database.DatabaseConnection") + property(name: "connection", type: "java.sql.Connection") + property(name: "sql", type: "groovy.sql.Sql") } provideChildsOf("changeSet") { - method name: "sql", params: [query: "java.lang.String"], type: void + method(name: "sql", params: [query: "java.lang.String"], type: void) } provideChildsOf("changeSet") { - method name: "sqlFile", params: [ + method(name: "sqlFile", params: [ args: [ parameter(name: "dbms", type: STRING), parameter(name: "encoding", type: STRING), @@ -93,11 +93,11 @@ provideChildsOf("changeSet") { parameter(name: "splitStatements", type: STRING), parameter(name: "stripComments", type: STRING), ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "createSequence", params: [ + method(name: "createSequence", params: [ args: [ parameter(name: "catalogName", type: STRING), parameter(name: "cycle", type: STRING), @@ -109,7 +109,7 @@ provideChildsOf("changeSet") { parameter(name: "sequenceName", type: STRING), parameter(name: "startValue", type: STRING) ] - ], type: void + ], type: void) } //liquibase changes @@ -133,16 +133,16 @@ List columnArgs = [ ] columnType = { - method name: "column", params: [ + method(name: "column", params: [ args: columnArgs, body: {} - ], type: void + ], type: void) } columnTypeNoBody = { - method name: "column", params: [ + method(name: "column", params: [ args: columnArgs - ], type: void + ], type: void) } List param = [ @@ -151,7 +151,7 @@ List param = [ ] provideChildsOf("changeSet") { - method name: "createTable", params: [ + method(name: "createTable", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'remarks', type: STRING), @@ -160,14 +160,14 @@ provideChildsOf("changeSet") { parameter(name: 'tablespace', type: STRING), ], body: {} - ], type: void + ], type: void) } provideChildsOf("createTable", columnType) provideChildsOf("createTable", columnTypeNoBody) provideChildsOf("changeSet") { - method name: "createView", params: [ + method(name: "createView", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'replaceIfExists', type: STRING), @@ -175,12 +175,12 @@ provideChildsOf("changeSet") { parameter(name: 'selectQuery', type: STRING), parameter(name: 'viewName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("column") { - method name: "constraints", params: [ + method(name: "constraints", params: [ args: [ parameter(name: 'nullable', type: STRING), parameter(name: 'primaryKey', type: STRING), @@ -193,12 +193,12 @@ provideChildsOf("column") { parameter(name: 'deferrable', type: STRING), parameter(name: 'initiallyDeferred', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "addAutoIncrement", params: [ + method(name: "addAutoIncrement", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnDataType', type: STRING), @@ -208,25 +208,25 @@ provideChildsOf("changeSet") { parameter(name: 'startWith', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "addColumn", params: [ + method(name: "addColumn", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ], body: {} - ], type: void + ], type: void) } provideChildsOf("addColumn", columnType) provideChildsOf("addColumn", columnTypeNoBody) provideChildsOf("changeSet") { - method name: "addDefaultValue", params: [ + method(name: "addDefaultValue", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnDataType', type: STRING), @@ -241,11 +241,11 @@ provideChildsOf("changeSet") { parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "addForeignKeyConstraint", params: [ + method(name: "addForeignKeyConstraint", params: [ args: [ parameter(name: 'baseColumnNames', type: STRING), parameter(name: 'baseTableCatalogName', type: STRING), @@ -262,11 +262,11 @@ provideChildsOf("changeSet") { parameter(name: 'referencedTableSchemaName', type: STRING), parameter(name: 'referencesUniqueColumn', type: STRING), ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "addNotNullConstraint", params: [ + method(name: "addNotNullConstraint", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnDataType', type: STRING), @@ -275,11 +275,11 @@ provideChildsOf("changeSet") { parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "addPrimaryKey", params: [ + method(name: "addPrimaryKey", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnNames', type: STRING), @@ -288,11 +288,11 @@ provideChildsOf("changeSet") { parameter(name: 'tableName', type: STRING), parameter(name: 'tablespace', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "addUniqueConstraint", params: [ + method(name: "addUniqueConstraint", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnNames', type: STRING), @@ -304,11 +304,11 @@ provideChildsOf("changeSet") { parameter(name: 'tableName', type: STRING), parameter(name: 'tablespace', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "createIndex", params: [ + method(name: "createIndex", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'indexName', type: STRING), @@ -318,45 +318,45 @@ provideChildsOf("changeSet") { parameter(name: 'unique', type: STRING), ], body: {} - ], type: void + ], type: void) } provideChildsOf("createIndex", columnType) provideChildsOf("createIndex", columnTypeNoBody) provideChildsOf("changeSet") { - method name: "delete", params: [ + method(name: "delete", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING), parameter(name: 'where', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropAllForeignKeyConstraints", params: [ + method(name: "dropAllForeignKeyConstraints", params: [ args: [ parameter(name: 'baseTableCatalogName', type: STRING), parameter(name: 'baseTableName', type: STRING), parameter(name: 'baseTableSchemaName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropColumn", params: [ + method(name: "dropColumn", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnName', type: STRING), parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropDefaultValue", params: [ + method(name: "dropDefaultValue", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnDataType', type: STRING), @@ -364,33 +364,33 @@ provideChildsOf("changeSet") { parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropForeignKeyConstraint", params: [ + method(name: "dropForeignKeyConstraint", params: [ args: [ parameter(name: 'baseTableCatalogName', type: STRING), parameter(name: 'baseTableName', type: STRING), parameter(name: 'baseTableSchemaName', type: STRING), parameter(name: 'constraintName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropIndex", params: [ + method(name: "dropIndex", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'indexName', type: STRING), parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropNotNullConstraint", params: [ + method(name: "dropNotNullConstraint", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnDataType', type: STRING), @@ -398,33 +398,33 @@ provideChildsOf("changeSet") { parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropPrimaryKey", params: [ + method(name: "dropPrimaryKey", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'constraintName', type: STRING), parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropTable", params: [ + method(name: "dropTable", params: [ args: [ parameter(name: 'cascadeConstraints', type: STRING), parameter(name: 'catalogName', type: STRING), parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropUniqueConstraint", params: [ + method(name: "dropUniqueConstraint", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'constraintName', type: STRING), @@ -432,21 +432,21 @@ provideChildsOf("changeSet") { parameter(name: 'tableName', type: STRING), parameter(name: 'uniqueColumns', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropView", params: [ + method(name: "dropView", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'schemaName', type: STRING), parameter(name: 'viewName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "modifyDataType", params: [ + method(name: "modifyDataType", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnName', type: STRING), @@ -455,11 +455,11 @@ provideChildsOf("changeSet") { parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "renameColumn", params: [ + method(name: "renameColumn", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'columnDataType', type: STRING), @@ -469,33 +469,33 @@ provideChildsOf("changeSet") { parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "renameTable", params: [ + method(name: "renameTable", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'newTableName', type: STRING), parameter(name: 'oldTableName', type: STRING), parameter(name: 'schemaName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "renameView", params: [ + method(name: "renameView", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'newViewName', type: STRING), parameter(name: 'oldViewName', type: STRING), parameter(name: 'schemaName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "addLookupTable", params: [ + method(name: "addLookupTable", params: [ args: [ parameter(name: 'constraintName', type: STRING), parameter(name: 'existingColumnName', type: STRING), @@ -508,11 +508,11 @@ provideChildsOf("changeSet") { parameter(name: 'newTableName', type: STRING), parameter(name: 'newTableSchemaName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "alterSequence", params: [ + method(name: "alterSequence", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'incrementBy', type: STRING), @@ -522,11 +522,11 @@ provideChildsOf("changeSet") { parameter(name: 'schemaName', type: STRING), parameter(name: 'sequenceName', type: STRING), ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "createProcedure", params: [ + method(name: "createProcedure", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'comments', type: STRING), @@ -538,61 +538,61 @@ provideChildsOf("changeSet") { parameter(name: 'relativeToChangelogFile', type: STRING), parameter(name: 'schemaName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "customChange", params: [ + method(name: "customChange", params: [ args: [ parameter(name: 'class', type: STRING), ], body: {} - ], type: void + ], type: void) } provideChildsOf("customChange") { - method name: "param", params: [ + method(name: "param", params: [ args: [ parameter(name: 'id', type: STRING), parameter(name: 'value', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropProcedure", params: [ + method(name: "dropProcedure", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'procedureName', type: STRING), parameter(name: 'schemaName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "dropSequence", params: [ + method(name: "dropSequence", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'schemaName', type: STRING), parameter(name: 'sequenceName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "empty", params: [], type: void + method(name: "empty", params: [], type: void) } provideChildsOf("changeSet") { - method name: "executeCommand", params: [ + method(name: "executeCommand", params: [ args: [ parameter(name: 'executable', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "insert", params: [ + method(name: "insert", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'dbms', type: STRING), @@ -600,13 +600,13 @@ provideChildsOf("changeSet") { parameter(name: 'tableName', type: STRING) ], body: {} - ], type: void + ], type: void) } provideChildsOf("insert", columnType) provideChildsOf("insert", columnTypeNoBody) provideChildsOf("changeSet") { - method name: "loadData", params: [ + method(name: "loadData", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'encoding', type: STRING), @@ -617,13 +617,13 @@ provideChildsOf("changeSet") { parameter(name: 'tableName', type: STRING) ], body: {} - ], type: void + ], type: void) } provideChildsOf("loadData", columnType) provideChildsOf("loadData", columnTypeNoBody) provideChildsOf("changeSet") { - method name: "loadUpdateData", params: [ + method(name: "loadUpdateData", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'encoding', type: STRING), @@ -635,13 +635,13 @@ provideChildsOf("changeSet") { parameter(name: 'tableName', type: STRING) ], body: {} - ], type: void + ], type: void) } provideChildsOf("loadUpdateData", columnType) provideChildsOf("loadUpdateData", columnTypeNoBody) provideChildsOf("changeSet") { - method name: "mergeColumns", params: [ + method(name: "mergeColumns", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'column1Name', type: STRING), @@ -652,27 +652,27 @@ provideChildsOf("changeSet") { parameter(name: 'schemaName', type: STRING), parameter(name: 'tableName', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "stop", params: [ + method(name: "stop", params: [ args: [ parameter(name: 'message', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "tagDatabase", params: [ + method(name: "tagDatabase", params: [ args: [ parameter(name: 'tag', type: STRING) ] - ], type: void + ], type: void) } provideChildsOf("changeSet") { - method name: "update", params: [ + method(name: "update", params: [ args: [ parameter(name: 'catalogName', type: STRING), parameter(name: 'schemaName', type: STRING), @@ -680,7 +680,7 @@ provideChildsOf("changeSet") { parameter(name: 'where', type: STRING) ], body: {} - ], type: void + ], type: void) } provideChildsOf("update", columnType) provideChildsOf("update", columnTypeNoBody) \ No newline at end of file diff --git a/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/orm/bootstrap/HibernateDatastoreSpringInitializer.groovy b/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/orm/bootstrap/HibernateDatastoreSpringInitializer.groovy index 14f1748e563..b21856d0a85 100644 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/orm/bootstrap/HibernateDatastoreSpringInitializer.groovy +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/orm/bootstrap/HibernateDatastoreSpringInitializer.groovy @@ -14,8 +14,18 @@ */ package grails.orm.bootstrap +import javax.sql.DataSource + import groovy.transform.CompileStatic -import groovy.util.logging.Slf4j + +import org.springframework.beans.factory.support.BeanDefinitionRegistry +import org.springframework.context.ApplicationContext +import org.springframework.context.ApplicationEventPublisher +import org.springframework.context.support.GenericApplicationContext +import org.springframework.core.env.ConfigurableEnvironment +import org.springframework.core.env.PropertyResolver +import org.springframework.transaction.PlatformTransactionManager + import org.grails.datastore.gorm.bootstrap.AbstractDatastoreInitializer import org.grails.datastore.gorm.jdbc.connections.CachedDataSourceConnectionSourceFactory import org.grails.datastore.gorm.support.AbstractDatastorePersistenceContextInterceptor @@ -28,15 +38,6 @@ import org.grails.orm.hibernate.cfg.Settings import org.grails.orm.hibernate.connections.HibernateConnectionSourceFactory import org.grails.orm.hibernate.proxy.HibernateProxyHandler import org.grails.orm.hibernate.support.HibernateDatastoreConnectionSourcesRegistrar -import org.springframework.beans.factory.support.BeanDefinitionRegistry -import org.springframework.context.ApplicationContext -import org.springframework.context.ApplicationEventPublisher -import org.springframework.context.support.GenericApplicationContext -import org.springframework.core.env.ConfigurableEnvironment -import org.springframework.core.env.PropertyResolver -import org.springframework.transaction.PlatformTransactionManager - -import javax.sql.DataSource /** * Class that handles the details of initializing GORM for Hibernate @@ -44,12 +45,12 @@ import javax.sql.DataSource * @author Graeme Rocher * @since 3.0 */ -@Slf4j class HibernateDatastoreSpringInitializer extends AbstractDatastoreInitializer { - public static final String SESSION_FACTORY_BEAN_NAME = "sessionFactory" + + public static final String SESSION_FACTORY_BEAN_NAME = 'sessionFactory' public static final String DEFAULT_DATA_SOURCE_NAME = Settings.SETTING_DATASOURCE - public static final String DATA_SOURCES = Settings.SETTING_DATASOURCES; - public static final String TEST_DB_URL = "jdbc:h2:mem:grailsDb;LOCK_TIMEOUT=10000;DB_CLOSE_DELAY=-1" + public static final String DATA_SOURCES = Settings.SETTING_DATASOURCES + public static final String TEST_DB_URL = 'jdbc:h2:mem:grailsDb;LOCK_TIMEOUT=10000;DB_CLOSE_DELAY=-1' String defaultDataSourceBeanName = ConnectionSource.DEFAULT String defaultSessionFactoryBeanName = SESSION_FACTORY_BEAN_NAME @@ -82,24 +83,23 @@ class HibernateDatastoreSpringInitializer extends AbstractDatastoreInitializer { configureDataSources(this.configuration) } - @CompileStatic void configureDataSources(PropertyResolver config) { Set dataSourceNames = new HashSet() - if(config == null) { + if (config == null) { dataSourceNames = [defaultDataSourceBeanName] as Set } else { - Map dataSources = config.getProperty(DATA_SOURCES, Map.class, Collections.emptyMap()) + Map dataSources = config.getProperty(DATA_SOURCES, Map, Collections.emptyMap()) if (dataSources != null && !dataSources.isEmpty()) { - dataSourceNames.addAll( AbstractConnectionSources.toValidConnectionSourceNames(dataSources) ) + dataSourceNames.addAll(AbstractConnectionSources.toValidConnectionSourceNames(dataSources)) } - Map dataSource = (Map)config.getProperty(DEFAULT_DATA_SOURCE_NAME, Map.class, Collections.emptyMap()) + Map dataSource = (Map) config.getProperty(DEFAULT_DATA_SOURCE_NAME, Map, Collections.emptyMap()) if (dataSource != null && !dataSource.isEmpty()) { - dataSourceNames.add( ConnectionSource.DEFAULT ) + dataSourceNames.add(ConnectionSource.DEFAULT) } } this.dataSources = dataSourceNames @@ -134,10 +134,10 @@ class HibernateDatastoreSpringInitializer extends AbstractDatastoreInitializer { return applicationContext } - public Closure getBeanDefinitions(BeanDefinitionRegistry beanDefinitionRegistry) { + Closure getBeanDefinitions(BeanDefinitionRegistry beanDefinitionRegistry) { ApplicationEventPublisher eventPublisher = super.findEventPublisher(beanDefinitionRegistry) Closure beanDefinitions = { - def common = getCommonConfiguration(beanDefinitionRegistry, "hibernate") + def common = getCommonConfiguration(beanDefinitionRegistry, 'hibernate') common.delegate = delegate common.call() @@ -151,46 +151,45 @@ class HibernateDatastoreSpringInitializer extends AbstractDatastoreInitializer { bean.autowire = true dataSourceConnectionSourceFactory = ref('dataSourceConnectionSourceFactory') } - hibernateDatastore(HibernateDatastore, config, hibernateConnectionSourceFactory, eventPublisher) { bean-> + hibernateDatastore(HibernateDatastore, config, hibernateConnectionSourceFactory, eventPublisher) { bean -> bean.primary = true } - sessionFactory(hibernateDatastore:'getSessionFactory') { bean-> + sessionFactory(hibernateDatastore: 'getSessionFactory') { bean -> bean.primary = true } - transactionManager(hibernateDatastore:"getTransactionManager") { bean-> + transactionManager(hibernateDatastore: 'getTransactionManager') { bean -> bean.primary = true } - autoTimestampEventListener(hibernateDatastore:"getAutoTimestampEventListener") - getBeanDefinition("transactionManager").beanClass = PlatformTransactionManager + autoTimestampEventListener(hibernateDatastore: 'getAutoTimestampEventListener') + getBeanDefinition('transactionManager').beanClass = PlatformTransactionManager hibernateDatastoreConnectionSourcesRegistrar(HibernateDatastoreConnectionSourcesRegistrar, dataSources) // domain model mapping context, used for configuration - grailsDomainClassMappingContext(hibernateDatastore:"getMappingContext") + grailsDomainClassMappingContext(hibernateDatastore: 'getMappingContext') loadDataServices(null) - .each {serviceName, serviceClass-> + .each { serviceName, serviceClass -> "$serviceName"(DatastoreServiceMethodInvokingFactoryBean, serviceClass) { - targetObject = ref("hibernateDatastore") + targetObject = ref('hibernateDatastore') targetMethod = 'getService' arguments = [serviceClass] } } - if(isGrailsPresent) { - if(ClassUtils.isPresent("org.grails.plugin.hibernate.support.AggregatePersistenceContextInterceptor")) { + if (isGrailsPresent) { + if (ClassUtils.isPresent('org.grails.plugin.hibernate.support.AggregatePersistenceContextInterceptor')) { ClassLoader cl = ClassUtils.getClassLoader() - persistenceInterceptor(cl.loadClass("org.grails.plugin.hibernate.support.AggregatePersistenceContextInterceptor"), ref("hibernateDatastore")) - proxyHandler(cl.loadClass("org.grails.datastore.gorm.proxy.ProxyHandlerAdapter"), ref('hibernateProxyHandler')) + persistenceInterceptor(cl.loadClass('org.grails.plugin.hibernate.support.AggregatePersistenceContextInterceptor'), ref('hibernateDatastore')) + proxyHandler(cl.loadClass('org.grails.datastore.gorm.proxy.ProxyHandlerAdapter'), ref('hibernateProxyHandler')) } + boolean osivEnabled = config.getProperty('hibernate.osiv.enabled', Boolean, true) + boolean isWebApplication = beanDefinitionRegistry?.containsBeanDefinition('dispatcherServlet') || + beanDefinitionRegistry?.containsBeanDefinition('grailsControllerHelper') - boolean osivEnabled = config.getProperty("hibernate.osiv.enabled", Boolean, true) - boolean isWebApplication = beanDefinitionRegistry?.containsBeanDefinition("dispatcherServlet") || - beanDefinitionRegistry?.containsBeanDefinition("grailsControllerHelper") - - if (isWebApplication && osivEnabled && ClassUtils.isPresent("org.grails.plugin.hibernate.support.GrailsOpenSessionInViewInterceptor")) { + if (isWebApplication && osivEnabled && ClassUtils.isPresent('org.grails.plugin.hibernate.support.GrailsOpenSessionInViewInterceptor')) { ClassLoader cl = ClassUtils.getClassLoader() - openSessionInViewInterceptor(cl.loadClass("org.grails.plugin.hibernate.support.GrailsOpenSessionInViewInterceptor")) { - hibernateDatastore = ref("hibernateDatastore") + openSessionInViewInterceptor(cl.loadClass('org.grails.plugin.hibernate.support.GrailsOpenSessionInViewInterceptor')) { + hibernateDatastore = ref('hibernateDatastore') } } } @@ -198,7 +197,6 @@ class HibernateDatastoreSpringInitializer extends AbstractDatastoreInitializer { return beanDefinitions } - protected GenericApplicationContext createApplicationContext() { GenericApplicationContext applicationContext = new GenericApplicationContext() if (configuration instanceof ConfigurableEnvironment) { diff --git a/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/plugin/hibernate/HibernateGrailsPlugin.groovy b/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/plugin/hibernate/HibernateGrailsPlugin.groovy index 285fd64dd18..c596d4949d9 100644 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/plugin/hibernate/HibernateGrailsPlugin.groovy +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/plugin/hibernate/HibernateGrailsPlugin.groovy @@ -19,20 +19,22 @@ package grails.plugin.hibernate +import groovy.transform.CompileStatic + +import org.springframework.beans.factory.support.BeanDefinitionRegistry +import org.springframework.context.ConfigurableApplicationContext +import org.springframework.core.convert.converter.Converter +import org.springframework.core.convert.support.ConfigurableConversionService +import org.springframework.core.env.PropertyResolver + import grails.config.Config import grails.core.GrailsApplication import grails.core.GrailsClass import grails.orm.bootstrap.HibernateDatastoreSpringInitializer import grails.plugins.Plugin import grails.util.Environment -import groovy.transform.CompileStatic import org.grails.config.PropertySourcesConfig import org.grails.core.artefact.DomainClassArtefactHandler -import org.springframework.beans.factory.support.BeanDefinitionRegistry -import org.springframework.context.ConfigurableApplicationContext -import org.springframework.core.convert.converter.Converter -import org.springframework.core.convert.support.ConfigurableConversionService -import org.springframework.core.env.PropertyResolver /** * Plugin that integrates Hibernate into a Grails application @@ -64,37 +66,37 @@ class HibernateGrailsPlugin extends Plugin { Set dataSourceNames - Closure doWithSpring() {{-> - ConfigurableApplicationContext applicationContext = (ConfigurableApplicationContext) applicationContext - - GrailsApplication grailsApplication = grailsApplication - Config config = grailsApplication.config - if(config instanceof PropertySourcesConfig) { - ConfigurableConversionService conversionService = applicationContext.getEnvironment().getConversionService() - conversionService.addConverter(new Converter() { - @Override - Class convert(String source) { - Class.forName(source) - } - }) - ((PropertySourcesConfig)config).setConversionService(conversionService) + Closure doWithSpring() { + { -> + ConfigurableApplicationContext applicationContext = (ConfigurableApplicationContext) applicationContext + + GrailsApplication grailsApplication = grailsApplication + Config config = grailsApplication.config + if (config instanceof PropertySourcesConfig) { + ConfigurableConversionService conversionService = applicationContext.getEnvironment().getConversionService() + conversionService.addConverter(new Converter() { + @Override + Class convert(String source) { + Class.forName(source) + } + }) + ((PropertySourcesConfig) config).setConversionService(conversionService) + } + + def domainClasses = grailsApplication.getArtefacts(DomainClassArtefactHandler.TYPE) + .collect() { GrailsClass cls -> cls.clazz } + + def springInitializer = new HibernateDatastoreSpringInitializer((PropertyResolver) config, domainClasses) + springInitializer.enableReload = Environment.isDevelopmentMode() + springInitializer.registerApplicationIfNotPresent = false + springInitializer.grailsPlugin = true + dataSourceNames = springInitializer.dataSources + def beans = springInitializer.getBeanDefinitions((BeanDefinitionRegistry) applicationContext) + + beans.delegate = delegate + beans.call() } - - - def domainClasses = grailsApplication.getArtefacts(DomainClassArtefactHandler.TYPE) - .collect() { GrailsClass cls -> cls.clazz } - - def springInitializer = new HibernateDatastoreSpringInitializer((PropertyResolver)config, domainClasses) - springInitializer.enableReload = Environment.isDevelopmentMode() - springInitializer.registerApplicationIfNotPresent = false - springInitializer.grailsPlugin = true - dataSourceNames = springInitializer.dataSources - def beans = springInitializer.getBeanDefinitions((BeanDefinitionRegistry)applicationContext) - - beans.delegate = delegate - beans.call() - }} - + } @Override void onChange(Map event) { diff --git a/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/plugin/hibernate/commands/SchemaExportCommand.groovy b/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/plugin/hibernate/commands/SchemaExportCommand.groovy index 9f4b1cc6bb8..5b6a06a7b92 100644 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/plugin/hibernate/commands/SchemaExportCommand.groovy +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/plugin/hibernate/commands/SchemaExportCommand.groovy @@ -18,23 +18,19 @@ */ package grails.plugin.hibernate.commands +import groovy.transform.CompileStatic + +import org.hibernate.engine.spi.SessionFactoryImplementor +import org.hibernate.tool.hbm2ddl.SchemaExport as HibernateSchemaExport +import org.hibernate.tool.schema.TargetType + import grails.dev.commands.ApplicationCommand import grails.dev.commands.ExecutionContext import grails.util.Environment -import groovy.transform.CompileStatic import org.grails.build.parsing.CommandLine import org.grails.datastore.mapping.core.connections.ConnectionSource import org.grails.orm.hibernate.HibernateDatastore -import org.grails.orm.hibernate.HibernateMappingContextSessionFactoryBean -import org.grails.orm.hibernate.cfg.HibernateMappingContextConfiguration -import org.hibernate.boot.MetadataBuilder -import org.hibernate.boot.MetadataSources -import org.hibernate.boot.spi.MetadataImplementor -import org.hibernate.engine.spi.SessionFactoryImplementor -import org.hibernate.service.ServiceRegistry -import org.hibernate.service.spi.ServiceRegistryImplementor -import org.hibernate.tool.hbm2ddl.SchemaExport as HibernateSchemaExport -import org.hibernate.tool.schema.TargetType + /** * Adds a schema-export command * @@ -44,7 +40,7 @@ import org.hibernate.tool.schema.TargetType @CompileStatic class SchemaExportCommand implements ApplicationCommand { - final String description = "Creates a DDL file of the database schema" + final String description = 'Creates a DDL file of the database schema' Boolean skipBootstrap = true @Override @@ -56,7 +52,7 @@ class SchemaExportCommand implements ApplicationCommand { boolean stdout = false for (arg in commandLine.remainingArgs) { - switch(arg) { + switch (arg) { case 'export': export = true; break case 'generate': export = false; break case 'stdout': stdout = true; break @@ -70,10 +66,10 @@ class SchemaExportCommand implements ApplicationCommand { def file = new File(filename) file.parentFile.mkdirs() - HibernateDatastore hibernateDatastore = applicationContext.getBean("hibernateDatastore", HibernateDatastore) + HibernateDatastore hibernateDatastore = applicationContext.getBean('hibernateDatastore', HibernateDatastore) hibernateDatastore = hibernateDatastore.getDatastoreForConnection(dataSourceName) - def serviceRegistry = ((SessionFactoryImplementor)hibernateDatastore.sessionFactory).getServiceRegistry() + def serviceRegistry = ((SessionFactoryImplementor) hibernateDatastore.sessionFactory).getServiceRegistry() .getParentServiceRegistry() def metadata = hibernateDatastore.metadata @@ -82,13 +78,12 @@ class SchemaExportCommand implements ApplicationCommand { .setOutputFile(file.path) .setDelimiter(';') - - String action = export ? "Exporting" : "Generating script to ${file.path}" - String ds = argsMap.datasource ? "for DataSource '$argsMap.datasource'" : "for the default DataSource" - println "$action in environment '${Environment.current.name}' $ds" + String action = export ? 'Exporting' : "Generating script to ${file.path}" + String ds = argsMap.datasource ? "for DataSource '$argsMap.datasource'" : 'for the default DataSource' + println("$action in environment '${Environment.current.name}' $ds") EnumSet targetTypes - if(stdout) { + if (stdout) { targetTypes = EnumSet.of(TargetType.SCRIPT, TargetType.STDOUT) } else { @@ -98,7 +93,7 @@ class SchemaExportCommand implements ApplicationCommand { schemaExport.execute(targetTypes, HibernateSchemaExport.Action.CREATE, metadata, serviceRegistry) if (schemaExport.exceptions) { - def e = (Exception)schemaExport.exceptions[0] + def e = (Exception) schemaExport.exceptions[0] e.printStackTrace() return false } diff --git a/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/test/hibernate/HibernateSpec.groovy b/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/test/hibernate/HibernateSpec.groovy index 9d3c4acb2ac..d0ef4097220 100644 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/test/hibernate/HibernateSpec.groovy +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/grails/test/hibernate/HibernateSpec.groovy @@ -19,13 +19,14 @@ package grails.test.hibernate -import grails.config.Config import groovy.transform.CompileStatic -import org.grails.config.PropertySourcesConfig -import org.grails.orm.hibernate.HibernateDatastore -import org.grails.orm.hibernate.cfg.Settings + import org.hibernate.Session import org.hibernate.SessionFactory +import spock.lang.AutoCleanup +import spock.lang.Shared +import spock.lang.Specification + import org.springframework.boot.env.PropertySourceLoader import org.springframework.core.env.MapPropertySource import org.springframework.core.env.MutablePropertySources @@ -38,9 +39,11 @@ import org.springframework.core.io.support.SpringFactoriesLoader import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.TransactionStatus import org.springframework.transaction.interceptor.DefaultTransactionAttribute -import spock.lang.AutoCleanup -import spock.lang.Shared -import spock.lang.Specification + +import grails.config.Config +import org.grails.config.PropertySourcesConfig +import org.grails.orm.hibernate.HibernateDatastore +import org.grails.orm.hibernate.cfg.Settings /** * Specification for Hibernate tests @@ -56,22 +59,22 @@ abstract class HibernateSpec extends Specification { void setupSpec() { - List propertySourceLoaders = SpringFactoriesLoader.loadFactories(PropertySourceLoader.class, getClass().getClassLoader()) + List propertySourceLoaders = SpringFactoriesLoader.loadFactories(PropertySourceLoader, getClass().getClassLoader()) ResourceLoader resourceLoader = new DefaultResourceLoader() MutablePropertySources propertySources = new MutablePropertySources() - PropertySourceLoader ymlLoader = propertySourceLoaders.find { it.getFileExtensions().toList().contains("yml") } + PropertySourceLoader ymlLoader = propertySourceLoaders.find { it.getFileExtensions().toList().contains('yml') } if (ymlLoader) { - load(resourceLoader, ymlLoader, "application.yml").each { + load(resourceLoader, ymlLoader, 'application.yml').each { propertySources.addLast(it) } } - PropertySourceLoader groovyLoader = propertySourceLoaders.find { it.getFileExtensions().toList().contains("groovy") } + PropertySourceLoader groovyLoader = propertySourceLoaders.find { it.getFileExtensions().toList().contains('groovy') } if (groovyLoader) { - load(resourceLoader, groovyLoader, "application.groovy").each { + load(resourceLoader, groovyLoader, 'application.groovy').each { propertySources.addLast(it) } } - propertySources.addFirst(new MapPropertySource("defaults", getConfiguration())) + propertySources.addFirst(new MapPropertySource('defaults', getConfiguration())) Config config = new PropertySourcesConfig(propertySources) List domainClasses = getDomainClasses() String packageName = getPackageToScan(config) @@ -106,7 +109,7 @@ abstract class HibernateSpec extends Specification { * @return The configuration */ Map getConfiguration() { - Collections.singletonMap(Settings.SETTING_DB_CREATE, "create-drop") + Collections.singletonMap(Settings.SETTING_DB_CREATE, 'create-drop') } /** diff --git a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java index 92564870738..8fda4e23b4c 100644 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/AbstractMultipleDataSourceAggregatePersistenceContextInterceptor.java @@ -18,15 +18,16 @@ */ package org.grails.plugin.hibernate.support; +import java.util.ArrayList; +import java.util.List; + +import org.hibernate.SessionFactory; + import grails.persistence.support.PersistenceContextInterceptor; import org.grails.datastore.mapping.core.connections.ConnectionSource; import org.grails.datastore.mapping.core.connections.ConnectionSources; import org.grails.orm.hibernate.AbstractHibernateDatastore; import org.grails.orm.hibernate.connections.HibernateConnectionSourceSettings; -import org.hibernate.SessionFactory; - -import java.util.ArrayList; -import java.util.List; /** * Abstract implementation of the {@link grails.persistence.support.PersistenceContextInterceptor} interface that supports multiple data sources @@ -36,9 +37,7 @@ */ public abstract class AbstractMultipleDataSourceAggregatePersistenceContextInterceptor implements PersistenceContextInterceptor { - - - protected final List interceptors = new ArrayList(); + protected final List interceptors = new ArrayList<>(); protected final AbstractHibernateDatastore hibernateDatastore; public AbstractMultipleDataSourceAggregatePersistenceContextInterceptor(AbstractHibernateDatastore hibernateDatastore) { @@ -115,6 +114,6 @@ public void setReadWrite() { } } - protected abstract SessionFactoryAwarePersistenceContextInterceptor createPersistenceContextInterceptor(String dataSourceName); + protected abstract SessionFactoryAwarePersistenceContextInterceptor createPersistenceContextInterceptor(String dataSourceName); -} \ No newline at end of file +} diff --git a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java index 5a556b20dfa..62bc0fdf0db 100644 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/GrailsOpenSessionInViewInterceptor.java @@ -18,9 +18,9 @@ */ package org.grails.plugin.hibernate.support; -import org.grails.orm.hibernate.AbstractHibernateDatastore; import org.hibernate.FlushMode; import org.hibernate.Session; + import org.springframework.dao.DataAccessException; import org.springframework.dao.DataAccessResourceFailureException; import org.springframework.orm.hibernate5.SessionHolder; @@ -29,6 +29,7 @@ import org.springframework.ui.ModelMap; import org.springframework.web.context.request.WebRequest; +import org.grails.orm.hibernate.AbstractHibernateDatastore; /** * Extends the default spring OSIV and doesn't flush the session if it has been set @@ -54,14 +55,14 @@ protected void applyFlushMode(Session session) { @Override public void postHandle(WebRequest request, ModelMap model) throws DataAccessException { - SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(getSessionFactory()); + SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(getSessionFactory()); Session session = sessionHolder != null ? sessionHolder.getSession() : null; try { super.postHandle(request, model); FlushMode flushMode = session != null ? session.getHibernateFlushMode() : null; boolean isNotManual = flushMode != FlushMode.MANUAL && flushMode != FlushMode.COMMIT; if (session != null && isNotManual) { - if(logger.isDebugEnabled()) { + if (logger.isDebugEnabled()) { logger.debug("Eagerly flushing Hibernate session"); } session.flush(); @@ -76,7 +77,7 @@ public void postHandle(WebRequest request, ModelMap model) throws DataAccessExce public void setHibernateDatastore(AbstractHibernateDatastore hibernateDatastore) { String defaultFlushModeName = hibernateDatastore.getDefaultFlushModeName(); - if(hibernateDatastore.isOsivReadOnly()) { + if (hibernateDatastore.isOsivReadOnly()) { this.hibernateFlushMode = FlushMode.MANUAL; } else { diff --git a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java index aed44815d69..1dad3f08536 100644 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/HibernatePersistenceContextInterceptor.java @@ -19,26 +19,28 @@ package org.grails.plugin.hibernate.support; -import grails.persistence.support.PersistenceContextInterceptor; -import grails.validation.DeferredBindingActions; -import org.grails.core.lifecycle.ShutdownOperations; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.orm.hibernate.AbstractHibernateDatastore; -import org.grails.orm.hibernate.support.HibernateRuntimeUtils; +import java.sql.Connection; +import java.util.Deque; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.ConcurrentLinkedDeque; + import org.hibernate.FlushMode; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.orm.hibernate5.SessionFactoryUtils; import org.springframework.orm.hibernate5.SessionHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; -import java.sql.Connection; -import java.util.Deque; -import java.util.HashMap; -import java.util.Map; -import java.util.concurrent.ConcurrentLinkedDeque; +import grails.persistence.support.PersistenceContextInterceptor; +import grails.validation.DeferredBindingActions; +import org.grails.core.lifecycle.ShutdownOperations; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.orm.hibernate.AbstractHibernateDatastore; +import org.grails.orm.hibernate.support.HibernateRuntimeUtils; /** * @author Graeme Rocher @@ -49,12 +51,10 @@ public class HibernatePersistenceContextInterceptor implements PersistenceContex private static final Logger LOG = LoggerFactory.getLogger(HibernatePersistenceContextInterceptor.class); private AbstractHibernateDatastore hibernateDatastore; - private static ThreadLocal> participate = ThreadLocal.withInitial(HashMap::new); private static ThreadLocal> nestingCount = ThreadLocal.withInitial(HashMap::new); - private String dataSourceName; static { @@ -84,7 +84,7 @@ public HibernatePersistenceContextInterceptor(String dataSourceName) { */ public void destroy() { DeferredBindingActions.clear(); - if(!disconnected.isEmpty()) { + if (!disconnected.isEmpty()) { disconnected.pop(); } if (getSessionFactory() == null || decNestingCount() > 0 || getParticipate()) { @@ -119,24 +119,24 @@ public void disconnect() { public void reconnect() { if (getSessionFactory() == null) return; Session session = getSession(); - if(!session.isConnected() && !disconnected.isEmpty()) { + if (!session.isConnected() && !disconnected.isEmpty()) { try { Connection connection = disconnected.peekLast(); getSession().reconnect(connection); } catch (IllegalStateException e) { // cannot reconnect on different exception. ignore - LOG.debug(e.getMessage(),e); + LOG.debug(e.getMessage(), e); } } } public void flush() { if (getSessionFactory() == null) return; - if(!getParticipate()) { - if(!transactionRequired) { + if (!getParticipate()) { + if (!transactionRequired) { getSession().flush(); } - else if(TransactionSynchronizationManager.isSynchronizationActive()) { + else if (TransactionSynchronizationManager.isSynchronizationActive()) { getSession().flush(); } } diff --git a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java index 1e6381ec9e0..41ec12ebf9c 100644 --- a/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java +++ b/grails-data-hibernate5/grails-plugin/src/main/groovy/org/grails/plugin/hibernate/support/SessionFactoryAwarePersistenceContextInterceptor.java @@ -18,9 +18,10 @@ */ package org.grails.plugin.hibernate.support; -import grails.persistence.support.PersistenceContextInterceptor; import org.hibernate.SessionFactory; +import grails.persistence.support.PersistenceContextInterceptor; + /** * Interface for {@link grails.persistence.support.PersistenceContextInterceptor} instances that are aware of the {@link org.hibernate.SessionFactory} * diff --git a/grails-data-mongodb/boot-plugin/src/main/groovy/org/grails/datastore/gorm/mongodb/boot/autoconfigure/MongoDbGormAutoConfiguration.groovy b/grails-data-mongodb/boot-plugin/src/main/groovy/org/grails/datastore/gorm/mongodb/boot/autoconfigure/MongoDbGormAutoConfiguration.groovy index d54c4e4d21c..74334d467d8 100644 --- a/grails-data-mongodb/boot-plugin/src/main/groovy/org/grails/datastore/gorm/mongodb/boot/autoconfigure/MongoDbGormAutoConfiguration.groovy +++ b/grails-data-mongodb/boot-plugin/src/main/groovy/org/grails/datastore/gorm/mongodb/boot/autoconfigure/MongoDbGormAutoConfiguration.groovy @@ -15,13 +15,14 @@ package org.grails.datastore.gorm.mongodb.boot.autoconfigure +import java.beans.Introspector + +import groovy.transform.CompileStatic + import com.mongodb.MongoClientSettings import com.mongodb.client.MongoClient import com.mongodb.client.MongoClients -import groovy.transform.CompileStatic -import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher -import org.grails.datastore.mapping.mongo.MongoDatastore -import org.grails.datastore.mapping.services.Service + import org.springframework.beans.BeansException import org.springframework.beans.factory.annotation.Autowired import org.springframework.beans.factory.config.ConfigurableListableBeanFactory @@ -38,7 +39,9 @@ import org.springframework.context.annotation.Configuration import org.springframework.core.env.ConfigurableEnvironment import org.springframework.transaction.PlatformTransactionManager -import java.beans.Introspector +import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher +import org.grails.datastore.mapping.mongo.MongoDatastore +import org.grails.datastore.mapping.services.Service /** * @@ -51,7 +54,7 @@ import java.beans.Introspector @Configuration @ConditionalOnMissingBean(MongoDatastore) @AutoConfigureAfter(MongoAutoConfiguration) -class MongoDbGormAutoConfiguration implements ApplicationContextAware{ +class MongoDbGormAutoConfiguration implements ApplicationContextAware { @Autowired(required = false) private MongoProperties mongoProperties @@ -67,15 +70,15 @@ class MongoDbGormAutoConfiguration implements ApplicationContextAware{ @Bean MongoDatastore mongoDatastore() { ConfigurableApplicationContext context = applicationContext - if(!(context instanceof ConfigurableApplicationContext)) { - throw new IllegalArgumentException("MongoDbGormAutoConfiguration requires an instance of ConfigurableApplicationContext") + if (!(context instanceof ConfigurableApplicationContext)) { + throw new IllegalArgumentException('MongoDbGormAutoConfiguration requires an instance of ConfigurableApplicationContext') } ConfigurableListableBeanFactory beanFactory = context.beanFactory List packageNames = AutoConfigurationPackages.get(beanFactory) List packages = [] - for(name in packageNames) { + for (name in packageNames) { Package pkg = Package.getPackage(name) - if(pkg != null) { + if (pkg != null) { packages.add(pkg) } } @@ -83,25 +86,25 @@ class MongoDbGormAutoConfiguration implements ApplicationContextAware{ MongoDatastore datastore ConfigurableEnvironment environment = context.environment ConfigurableApplicationContextEventPublisher eventPublisher = new ConfigurableApplicationContextEventPublisher(context) - if(mongo != null) { - datastore = new MongoDatastore(mongo, environment,eventPublisher, packages as Package[]) + if (mongo != null) { + datastore = new MongoDatastore(mongo, environment, eventPublisher, packages as Package[]) } - else if(mongoProperties != null) { + else if (mongoProperties != null) { this.mongo = MongoClients.create(mongoOptions) - datastore = new MongoDatastore(mongo, environment,eventPublisher, packages as Package[]) + datastore = new MongoDatastore(mongo, environment, eventPublisher, packages as Package[]) } else { datastore = new MongoDatastore(environment, eventPublisher, packages as Package[]) } - for(Service service in datastore.getServices()) { + for (Service service in datastore.getServices()) { Class serviceClass = service.getClass() grails.gorm.services.Service ann = serviceClass.getAnnotation(grails.gorm.services.Service) String serviceName = ann?.name() - if(serviceName == null) { + if (serviceName == null) { serviceName = Introspector.decapitalize(serviceClass.simpleName) } - if(!context.containsBean(serviceName)) { + if (!context.containsBean(serviceName)) { context.beanFactory.registerSingleton( serviceName, service @@ -118,10 +121,10 @@ class MongoDbGormAutoConfiguration implements ApplicationContextAware{ @Override void setApplicationContext(ApplicationContext applicationContext) throws BeansException { - if(!(applicationContext instanceof ConfigurableApplicationContext)) { - throw new IllegalArgumentException("MongoDbGormAutoConfiguration requires an instance of ConfigurableApplicationContext") + if (!(applicationContext instanceof ConfigurableApplicationContext)) { + throw new IllegalArgumentException('MongoDbGormAutoConfiguration requires an instance of ConfigurableApplicationContext') } - this.applicationContext = (ConfigurableApplicationContext)applicationContext + this.applicationContext = (ConfigurableApplicationContext) applicationContext } } diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BigDecimalCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BigDecimalCodec.groovy index 532d2560d03..a913f3888af 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BigDecimalCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BigDecimalCodec.groovy @@ -20,6 +20,7 @@ package org.grails.datastore.bson.codecs import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec @@ -35,6 +36,7 @@ import org.bson.types.Decimal128 */ @CompileStatic class BigDecimalCodec implements Codec { + @Override BigDecimal decode(BsonReader reader, DecoderContext decoderContext) { return reader.readDecimal128().bigDecimalValue() diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BigIntegerCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BigIntegerCodec.groovy index d93241d5331..5b3763c8013 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BigIntegerCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BigIntegerCodec.groovy @@ -20,6 +20,7 @@ package org.grails.datastore.bson.codecs import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec @@ -35,6 +36,7 @@ import org.bson.types.Decimal128 */ @CompileStatic class BigIntegerCodec implements Codec { + @Override BigInteger decode(BsonReader reader, DecoderContext decoderContext) { return reader.readDecimal128().bigDecimalValue().toBigInteger() diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BsonPersistentEntityCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BsonPersistentEntityCodec.groovy index 48ba03a2e99..85c5295a6bf 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BsonPersistentEntityCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/BsonPersistentEntityCodec.groovy @@ -20,15 +20,34 @@ package org.grails.datastore.bson.codecs import groovy.transform.CompileStatic -import org.bson.* + +import org.bson.BsonDocument +import org.bson.BsonDocumentWriter +import org.bson.BsonReader +import org.bson.BsonType +import org.bson.BsonValue +import org.bson.BsonWriter import org.bson.codecs.BsonValueCodecProvider import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry import org.bson.conversions.Bson -import org.grails.datastore.bson.codecs.decoders.* -import org.grails.datastore.bson.codecs.encoders.* + +import org.grails.datastore.bson.codecs.decoders.BasicCollectionTypeDecoder +import org.grails.datastore.bson.codecs.decoders.CustomTypeDecoder +import org.grails.datastore.bson.codecs.decoders.EmbeddedCollectionDecoder +import org.grails.datastore.bson.codecs.decoders.EmbeddedDecoder +import org.grails.datastore.bson.codecs.decoders.IdentityDecoder +import org.grails.datastore.bson.codecs.decoders.SimpleDecoder +import org.grails.datastore.bson.codecs.decoders.TenantIdDecoder +import org.grails.datastore.bson.codecs.encoders.BasicCollectionTypeEncoder +import org.grails.datastore.bson.codecs.encoders.CustomTypeEncoder +import org.grails.datastore.bson.codecs.encoders.EmbeddedCollectionEncoder +import org.grails.datastore.bson.codecs.encoders.EmbeddedEncoder +import org.grails.datastore.bson.codecs.encoders.IdentityEncoder +import org.grails.datastore.bson.codecs.encoders.SimpleEncoder +import org.grails.datastore.bson.codecs.encoders.TenantIdEncoder import org.grails.datastore.gorm.schemaless.DynamicAttributes import org.grails.datastore.mapping.dirty.checking.DirtyCheckable import org.grails.datastore.mapping.engine.EntityAccess @@ -37,7 +56,14 @@ import org.grails.datastore.mapping.model.MappingContext import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.model.config.GormProperties -import org.grails.datastore.mapping.model.types.* +import org.grails.datastore.mapping.model.types.Basic +import org.grails.datastore.mapping.model.types.Custom +import org.grails.datastore.mapping.model.types.Embedded +import org.grails.datastore.mapping.model.types.EmbeddedCollection +import org.grails.datastore.mapping.model.types.Identity +import org.grails.datastore.mapping.model.types.Simple +import org.grails.datastore.mapping.model.types.TenantId + /** * Encodes and decodes {@link org.grails.datastore.mapping.model.PersistentEntity} objects from a BSON stream * @@ -46,6 +72,7 @@ import org.grails.datastore.mapping.model.types.* */ @CompileStatic class BsonPersistentEntityCodec implements Codec { + public static final EncoderContext DEFAULT_ENCODER_CONTEXT = EncoderContext.builder().build() public static final DecoderContext DEFAULT_DECODER_CONTEXT = DecoderContext.builder().build() private static final Map, PropertyEncoder> ENCODERS = [:] @@ -98,50 +125,50 @@ class BsonPersistentEntityCodec implements Codec { boolean abortReading = false final boolean hasDynamicAttributes = instance instanceof DynamicAttributes - while(bsonType != BsonType.END_OF_DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { def name = bsonReader.readName() - if(!abortReading) { + if (!abortReading) { - if(isDiscriminatorProperty(name)) { + if (isDiscriminatorProperty(name)) { def childEntity = mappingContext .getChildEntityByDiscriminator(persistentEntity.rootEntity, bsonReader.readString()) - if(childEntity != null) { + if (childEntity != null) { persistentEntity = childEntity instance = childEntity .newInstance() def newAccess = createEntityAccess(childEntity, instance) - newAccess.setIdentifierNoConversion( access.identifier ) + newAccess.setIdentifierNoConversion(access.identifier) access = newAccess } bsonType = bsonReader.readBsonType() continue } - if(isIdentifierProperty(name)) { - getPropertyDecoder(Identity).decode( bsonReader, (Identity)persistentEntity.identity, access, decoderContext, codecRegistry) + if (isIdentifierProperty(name)) { + getPropertyDecoder(Identity).decode(bsonReader, (Identity) persistentEntity.identity, access, decoderContext, codecRegistry) Object cachedInstance = retrieveCachedInstance(access) - if(cachedInstance != null) { + if (cachedInstance != null) { instance = cachedInstance abortReading = true } } else { PersistentProperty property = persistentEntity.getPropertyByName(name) - if(property && bsonType != BsonType.NULL) { + if (property && bsonType != BsonType.NULL) { def propKind = property.getClass().superclass - if(CharSequence.isAssignableFrom(property.type) && bsonType == BsonType.STRING) { + if (CharSequence.isAssignableFrom(property.type) && bsonType == BsonType.STRING) { access.setPropertyNoConversion(property.name, bsonReader.readString()) } else { - getPropertyDecoder((Class)propKind)?.decode(bsonReader, property, access, decoderContext, codecRegistry) + getPropertyDecoder((Class) propKind)?.decode(bsonReader, property, access, decoderContext, codecRegistry) } } - else if(!abortReading && hasDynamicAttributes) { - readSchemaless(bsonReader, ((DynamicAttributes)instance), name, decoderContext) + else if (!abortReading && hasDynamicAttributes) { + readSchemaless(bsonReader, ((DynamicAttributes) instance), name, decoderContext) } else { bsonReader.skipValue() @@ -149,8 +176,8 @@ class BsonPersistentEntityCodec implements Codec { } } - else if(!abortReading){ - readSchemaless(bsonReader, ((DynamicAttributes)instance), name, decoderContext) + else if (!abortReading) { + readSchemaless(bsonReader, ((DynamicAttributes) instance), name, decoderContext) } else { bsonReader.skipValue() @@ -161,11 +188,9 @@ class BsonPersistentEntityCodec implements Codec { readingComplete(access) - return instance } - void encode(BsonWriter writer, Object value, EncoderContext encoderContext = DEFAULT_ENCODER_CONTEXT) { encode(writer, value, encoderContext, true) } @@ -175,7 +200,7 @@ class BsonPersistentEntityCodec implements Codec { def access = createEntityAccess(value) def entity = access.persistentEntity - if(!entity.isRoot()) { + if (!entity.isRoot()) { def discriminatorName = getDiscriminatorAttributeName() def discriminator = entity.discriminator writer.writeName(discriminatorName) @@ -184,8 +209,8 @@ class BsonPersistentEntityCodec implements Codec { if (includeIdentifier) { def id = access.getIdentifier() - if(id != null) { - getPropertyEncoder(Identity).encode writer, (Identity)entity.identity, id, access, encoderContext, codecRegistry + if (id != null) { + getPropertyEncoder(Identity).encode(writer, (Identity) entity.identity, id, access, encoderContext, codecRegistry) } } @@ -193,17 +218,17 @@ class BsonPersistentEntityCodec implements Codec { def propKind = prop.getClass().superclass Object v = access.getProperty(prop.name) if (v != null) { - PropertyEncoder encoder = getPropertyEncoder((Class)propKind) + PropertyEncoder encoder = getPropertyEncoder((Class) propKind) encoder?.encode(writer, (PersistentProperty) prop, v, access, encoderContext, codecRegistry) } } - if(value instanceof DynamicAttributes) { + if (value instanceof DynamicAttributes) { def attributes = ((DynamicAttributes) value).attributes() writeAttributes(attributes, writer, encoderContext) } - beforeFinishDocument(writer,access) + beforeFinishDocument(writer, access) writer.writeEndDocument() writer.flush() writingComplete(access) @@ -219,77 +244,77 @@ class BsonPersistentEntityCodec implements Codec { def entity = access.persistentEntity def proxyFactory = mappingContext.proxyFactory - if( proxyFactory.isProxy(value) ) { + if (proxyFactory.isProxy(value)) { value = proxyFactory.unwrap(value) } - if(value instanceof DirtyCheckable) { + if (value instanceof DirtyCheckable) { BsonWriter writer = new BsonDocumentWriter(update) writer.writeStartDocument() - DirtyCheckable dirty = (DirtyCheckable)value + DirtyCheckable dirty = (DirtyCheckable) value Set processed = [] def dirtyProperties = new ArrayList(dirty.listDirtyPropertyNames()) boolean isNew = dirtyProperties.isEmpty() && dirty.hasChanged() def isVersioned = entity.isVersioned() - if(isNew) { + if (isNew) { // if it is new it can only be an embedded entity that has now been updated // so we get all properties dirtyProperties = entity.persistentPropertyNames - if(isVersioned) { + if (isVersioned) { EntityPersister.incrementEntityVersion(access) } } else { // schedule lastUpdated if necessary - if( entity.getPropertyByName(GormProperties.LAST_UPDATED) != null) { + if (entity.getPropertyByName(GormProperties.LAST_UPDATED) != null) { dirtyProperties.add(GormProperties.LAST_UPDATED) } } - for(propertyName in dirtyProperties) { + for (propertyName in dirtyProperties) { def prop = entity.getPropertyByName(propertyName) - if(prop != null) { + if (prop != null) { processed << propertyName Object v = access.getProperty(prop.name) if (v != null) { - if(prop instanceof Embedded) { + if (prop instanceof Embedded) { writer.writeName(prop.name) - encodeUpdate(v, createEntityAccess(((Embedded)prop).associatedEntity, v), encoderContext, true) + encodeUpdate(v, createEntityAccess(((Embedded) prop).associatedEntity, v), encoderContext, true) } - else if(prop instanceof EmbeddedCollection) { + else if (prop instanceof EmbeddedCollection) { // TODO: embedded collections } else { def propKind = prop.getClass().superclass if (prop instanceof PersistentProperty) { - PropertyEncoder propertyEncoder = getPropertyEncoder((Class)propKind) + PropertyEncoder propertyEncoder = getPropertyEncoder((Class) propKind) propertyEncoder?.encode(writer, prop, v, access, encoderContext, codecRegistry) } } } - else if(embedded || !isNew) { + else if (embedded || !isNew) { writer.writeName(propertyName) writer.writeNull() } } } - if(value instanceof DynamicAttributes) { + if (value instanceof DynamicAttributes) { Map attributes = ((DynamicAttributes) value).attributes() - for(attr in attributes.keySet()) { + for (attr in attributes.keySet()) { Object v = attributes.get(attr) - if(v == null) { + if (v == null) { writer.writeName(attr) writer.writeNull() } else { writer.writeName(attr) - Codec codec = (Codec)codecRegistry.get(v.getClass()) + Codec codec = (Codec) codecRegistry.get(v.getClass()) codec.encode(writer, v, encoderContext) } } @@ -314,9 +339,9 @@ class BsonPersistentEntityCodec implements Codec { */ protected void writeAttributes(Map attributes, BsonWriter writer, EncoderContext encoderContext) { for (name in attributes.keySet()) { - writer.writeName name + writer.writeName(name) Object v = attributes.get(name) - Codec codec = (Codec)codecRegistry.get(v.getClass()) + Codec codec = (Codec) codecRegistry.get(v.getClass()) codec.encode(writer, v, encoderContext) } } @@ -384,13 +409,13 @@ class BsonPersistentEntityCodec implements Codec { def codec = codecRegistry.get(targetClass) - BsonValue bsonValue = (BsonValue)codec.decode(bsonReader, decoderContext) - if(bsonValue != null) { + BsonValue bsonValue = (BsonValue) codec.decode(bsonReader, decoderContext) + if (bsonValue != null) { def converter = CodecExtensions.getBsonConverter(bsonValue.getClass()) dynamicAttributes.putAt( name, - converter != null ? converter.convert( bsonValue ) : bsonValue + converter != null ? converter.convert(bsonValue) : bsonValue ) } } @@ -416,7 +441,6 @@ class BsonPersistentEntityCodec implements Codec { return discriminatorName != null && name.equals(discriminatorName) } - /** * Obtains the property encoder for the given property type * diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecCustomTypeMarshaller.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecCustomTypeMarshaller.groovy index b2b6584fe4b..d6ad82634bd 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecCustomTypeMarshaller.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecCustomTypeMarshaller.groovy @@ -20,14 +20,11 @@ package org.grails.datastore.bson.codecs import groovy.transform.CompileStatic -import org.bson.BsonDocument -import org.bson.BsonDocumentWriter -import org.bson.BsonWriter + import org.bson.Document import org.bson.codecs.Codec -import org.bson.codecs.EncoderContext + import org.grails.datastore.mapping.core.Datastore -import org.grails.datastore.mapping.engine.internal.MappingUtils import org.grails.datastore.mapping.engine.types.CustomTypeMarshaller import org.grails.datastore.mapping.model.MappingContext import org.grails.datastore.mapping.model.PersistentProperty @@ -41,6 +38,7 @@ import org.grails.datastore.mapping.query.Query */ @CompileStatic class CodecCustomTypeMarshaller implements CustomTypeMarshaller { + final Codec codec final MappingContext mappingContext @@ -66,17 +64,17 @@ class CodecCustomTypeMarshaller implements CustomTypeMarshaller ADDITIONAL_CODECS = [:] private static final Map, List> BSON_VALUE_CONVERTERS = new LinkedHashMap, List>().withDefault { Class cls -> new ArrayList() as List } private static final Map> BSON_TYPE_CODECS = [ - (BsonType.ARRAY) : new ListCodec(), - (BsonType.DOCUMENT) : new DocumentCodec(), - (BsonType.BINARY) : new ByteArrayCodec(), - (BsonType.BOOLEAN) : new BooleanCodec(), - (BsonType.DATE_TIME) : new DateCodec(), - (BsonType.DOUBLE) : new DoubleCodec(), - (BsonType.INT32) : new IntegerCodec(), - (BsonType.INT64) : new LongCodec(), - (BsonType.STRING) : new StringCodec(), - (BsonType.OBJECT_ID) : new ObjectIdCodec() + (BsonType.ARRAY): new ListCodec(), + (BsonType.DOCUMENT): new DocumentCodec(), + (BsonType.BINARY): new ByteArrayCodec(), + (BsonType.BOOLEAN): new BooleanCodec(), + (BsonType.DATE_TIME): new DateCodec(), + (BsonType.DOUBLE): new DoubleCodec(), + (BsonType.INT32): new IntegerCodec(), + (BsonType.INT64): new LongCodec(), + (BsonType.STRING): new StringCodec(), + (BsonType.OBJECT_ID): new ObjectIdCodec() ] static { @@ -182,8 +185,8 @@ class CodecExtensions implements CodecProvider { @Override List convert(BsonArray source) { List list = [] - for(BsonValue v in source) { - if(v != null) { + for (BsonValue v in source) { + if (v != null) { def converter = BSON_VALUE_CONVERTERS[v.getClass()]?.first() list << (converter ? converter.convert(v) : v) } @@ -199,8 +202,8 @@ class CodecExtensions implements CodecProvider { Object[] convert(BsonArray source) { Object[] array = new Object[source.size()] int i = 0 - for(BsonValue v in source) { - if(v != null) { + for (BsonValue v in source) { + if (v != null) { def converter = BSON_VALUE_CONVERTERS[v.getClass()]?.first() array[i++] = (converter ? converter.convert(v) : v) } @@ -216,9 +219,9 @@ class CodecExtensions implements CodecProvider { Map convert(BsonDocument source) { Map map = [:] - for(key in source.keySet()) { + for (key in source.keySet()) { def v = source[key] - if(v != null) { + if (v != null) { def converter = BSON_VALUE_CONVERTERS[v.getClass()]?.first() map[key] = (converter ? converter.convert(v) : v) } @@ -240,22 +243,21 @@ class CodecExtensions implements CodecProvider { } static Collection getBsonConverters() { - return (Collection)BSON_VALUE_CONVERTERS.values().flatten() + return (Collection) BSON_VALUE_CONVERTERS.values().flatten() } static Converter getBsonConverter(Class type) { def converters = BSON_VALUE_CONVERTERS.get(type) - if(!converters.isEmpty()) { + if (!converters.isEmpty()) { return converters.first() } return null } - static Codec getCodecForBsonType(BsonType bsonType, CodecRegistry registry) { def codec = BSON_TYPE_CODECS.get(bsonType) - if(codec != null) { - if(codec instanceof CodecRegistryAware) { + if (codec != null) { + if (codec instanceof CodecRegistryAware) { codec.codecRegistry = registry } return codec @@ -266,8 +268,8 @@ class CodecExtensions implements CodecProvider { @Override def Codec get(Class clazz, CodecRegistry registry) { def codec = ADDITIONAL_CODECS.get(clazz) - if(codec != null) { - if(codec instanceof CodecRegistryAware) { + if (codec != null) { + if (codec instanceof CodecRegistryAware) { codec.codecRegistry = registry } return codec @@ -284,11 +286,11 @@ class CodecExtensions implements CodecProvider { Map map = [:] reader.readStartDocument() BsonType bsonType = reader.readBsonType() - while(bsonType != BsonType.END_OF_DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { def key = reader.readName() BsonValue bsonValue = readValue(reader, decoderContext) Object value = null - if(bsonValue != null) { + if (bsonValue != null) { def converter = BSON_VALUE_CONVERTERS.get(bsonValue.getClass())?.first() value = converter ? converter.convert(bsonValue) : bsonValue } @@ -302,14 +304,14 @@ class CodecExtensions implements CodecProvider { @Override void encode(BsonWriter writer, Map values, EncoderContext encoderContext) { writer.writeStartDocument() - for(entry in values) { + for (entry in values) { def v = entry.value writer.writeName(entry.key) - if(v == null) { + if (v == null) { writer.writeNull() } else { - Codec c = (Codec)codecRegistry.get( v.getClass() ) + Codec c = (Codec) codecRegistry.get(v.getClass()) c.encode(writer, v, encoderContext) } } @@ -322,7 +324,7 @@ class CodecExtensions implements CodecProvider { } protected BsonValue readValue(final BsonReader reader, final DecoderContext decoderContext) { - return codecRegistry.get(BsonValueCodecProvider.getClassForBsonType(reader.getCurrentBsonType())).decode(reader, decoderContext); + return codecRegistry.get(BsonValueCodecProvider.getClassForBsonType(reader.getCurrentBsonType())).decode(reader, decoderContext) } } static class ListCodec implements Codec, CodecRegistryAware { @@ -333,11 +335,11 @@ class CodecExtensions implements CodecProvider { List list = new ArrayList() reader.readStartArray() BsonType bsonType = reader.readBsonType() - while(bsonType != BsonType.END_OF_DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { BsonValue bsonValue = readValue(reader, decoderContext) Object value = null - if(bsonValue != null) { + if (bsonValue != null) { def converters = BSON_VALUE_CONVERTERS.get(bsonValue.getClass()) Converter converter = !converters.isEmpty() ? converters?.first() : null value = converter != null ? converter.convert(bsonValue) : bsonValue @@ -352,12 +354,12 @@ class CodecExtensions implements CodecProvider { @Override void encode(BsonWriter writer, List values, EncoderContext encoderContext) { writer.writeStartArray() - for(v in values) { - if(v == null) { + for (v in values) { + if (v == null) { writer.writeNull() } else { - Codec c = (Codec)codecRegistry.get( v.getClass() ) + Codec c = (Codec) codecRegistry.get(v.getClass()) c.encode(writer, v, encoderContext) } } @@ -374,17 +376,16 @@ class CodecExtensions implements CodecProvider { def targetClass = BsonValueCodecProvider.getClassForBsonType(currentBsonType) def codec = codecRegistry.get(targetClass) - return codec.decode(reader, decoderContext); + return codec.decode(reader, decoderContext) } } - static class IntRangeCodec implements Codec{ - + static class IntRangeCodec implements Codec { @Override void encode(BsonWriter writer, IntRange value, EncoderContext encoderContext) { - Integer from = (Integer)value.from - Integer to = (Integer)value.to + Integer from = (Integer) value.from + Integer to = (Integer) value.to writer.writeStartArray() writer.writeInt32(from) @@ -411,7 +412,7 @@ class CodecExtensions implements CodecProvider { @Override Locale decode(BsonReader reader, DecoderContext decoderContext) { - new Locale( reader.readString() ) + new Locale(reader.readString()) } @Override @@ -429,7 +430,7 @@ class CodecExtensions implements CodecProvider { @Override Currency decode(BsonReader reader, DecoderContext decoderContext) { - Currency.getInstance( reader.readString() ) + Currency.getInstance(reader.readString()) } @Override diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecRegistryAware.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecRegistryAware.groovy index b5150a1b6ec..293b78f5339 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecRegistryAware.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecRegistryAware.groovy @@ -28,5 +28,6 @@ import org.bson.codecs.configuration.CodecRegistry * @since 4.1 */ interface CodecRegistryAware { + void setCodecRegistry(CodecRegistry codecRegistry) -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecRegistryProvider.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecRegistryProvider.groovy index e60ef1ffdb0..3dc3f8d0952 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecRegistryProvider.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/CodecRegistryProvider.groovy @@ -28,5 +28,6 @@ import org.bson.codecs.configuration.CodecRegistry * @since 6.0 */ interface CodecRegistryProvider { + CodecRegistry getCodecRegistry() -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/InstantCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/InstantCodec.groovy index afe1d6c1f57..74f0078df3f 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/InstantCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/InstantCodec.groovy @@ -19,15 +19,17 @@ package org.grails.datastore.bson.codecs +import java.time.Instant + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext -import org.grails.datastore.bson.codecs.temporal.InstantBsonConverter -import java.time.Instant +import org.grails.datastore.bson.codecs.temporal.InstantBsonConverter /** * A class to translate a {@link java.time.Instant} in MongoDB @@ -49,4 +51,4 @@ class InstantCodec implements Codec, InstantBsonConverter { @Override Class getEncoderClass() { Instant } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalDateCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalDateCodec.groovy index fce3a6e5d7c..c99e9543ef0 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalDateCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalDateCodec.groovy @@ -19,15 +19,17 @@ package org.grails.datastore.bson.codecs +import java.time.LocalDate + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext -import org.grails.datastore.bson.codecs.temporal.LocalDateBsonConverter -import java.time.LocalDate +import org.grails.datastore.bson.codecs.temporal.LocalDateBsonConverter /** * A class to translate a {@link LocalDate} in MongoDB diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalDateTimeCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalDateTimeCodec.groovy index 22c9792c41e..01a3e4e600c 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalDateTimeCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalDateTimeCodec.groovy @@ -19,15 +19,17 @@ package org.grails.datastore.bson.codecs +import java.time.LocalDateTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext -import org.grails.datastore.bson.codecs.temporal.LocalDateTimeBsonConverter -import java.time.LocalDateTime +import org.grails.datastore.bson.codecs.temporal.LocalDateTimeBsonConverter /** * A class to translate a {@link LocalDateTime} in MongoDB diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalTimeCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalTimeCodec.groovy index 2e8bfa33328..d56ce8140e9 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalTimeCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/LocalTimeCodec.groovy @@ -19,15 +19,17 @@ package org.grails.datastore.bson.codecs +import java.time.LocalTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext -import org.grails.datastore.bson.codecs.temporal.LocalTimeBsonConverter -import java.time.LocalTime +import org.grails.datastore.bson.codecs.temporal.LocalTimeBsonConverter /** * A class to translate a {@link LocalTime} in MongoDB diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/OffsetDateTimeCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/OffsetDateTimeCodec.groovy index 5d36b649fe6..87f5312b7b6 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/OffsetDateTimeCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/OffsetDateTimeCodec.groovy @@ -19,15 +19,17 @@ package org.grails.datastore.bson.codecs +import java.time.OffsetDateTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext -import org.grails.datastore.bson.codecs.temporal.OffsetDateTimeBsonConverter -import java.time.OffsetDateTime +import org.grails.datastore.bson.codecs.temporal.OffsetDateTimeBsonConverter /** * A class to translate a {@link OffsetDateTime} in MongoDB diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/OffsetTimeCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/OffsetTimeCodec.groovy index 4bca198e0f4..fbcef9fff9a 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/OffsetTimeCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/OffsetTimeCodec.groovy @@ -19,15 +19,17 @@ package org.grails.datastore.bson.codecs +import java.time.OffsetTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext -import org.grails.datastore.bson.codecs.temporal.OffsetTimeBsonConverter -import java.time.OffsetTime +import org.grails.datastore.bson.codecs.temporal.OffsetTimeBsonConverter /** * A class to translate a {@link OffsetTime} in MongoDB diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PeriodCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PeriodCodec.groovy index 23b004cba04..e74fb4149aa 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PeriodCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PeriodCodec.groovy @@ -19,15 +19,17 @@ package org.grails.datastore.bson.codecs +import java.time.Period + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext -import org.grails.datastore.bson.codecs.temporal.PeriodBsonConverter -import java.time.Period +import org.grails.datastore.bson.codecs.temporal.PeriodBsonConverter /** * A class to translate a {@link java.time.Period} in MongoDB @@ -49,4 +51,4 @@ class PeriodCodec implements Codec, PeriodBsonConverter { @Override Class getEncoderClass() { Period } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PropertyDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PropertyDecoder.groovy index 5d437f87301..a2985cdd481 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PropertyDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PropertyDecoder.groovy @@ -22,6 +22,7 @@ package org.grails.datastore.bson.codecs import org.bson.BsonReader import org.bson.codecs.DecoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PropertyEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PropertyEncoder.groovy index 677fad71b35..56333d43256 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PropertyEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/PropertyEncoder.groovy @@ -22,6 +22,7 @@ package org.grails.datastore.bson.codecs import org.bson.BsonWriter import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/ZonedDateTimeCodec.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/ZonedDateTimeCodec.groovy index e2d4c30ea14..e22a879ddc4 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/ZonedDateTimeCodec.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/ZonedDateTimeCodec.groovy @@ -19,15 +19,17 @@ package org.grails.datastore.bson.codecs +import java.time.ZonedDateTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext -import org.grails.datastore.bson.codecs.temporal.ZonedDateTimeBsonConverter -import java.time.ZonedDateTime +import org.grails.datastore.bson.codecs.temporal.ZonedDateTimeBsonConverter /** * A class to translate a {@link ZonedDateTime} in MongoDB @@ -49,4 +51,4 @@ class ZonedDateTimeCodec implements Codec, ZonedDateTimeBsonConve @Override Class getEncoderClass() { ZonedDateTime } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/BasicCollectionTypeDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/BasicCollectionTypeDecoder.groovy index 197ce133d89..7572031ff01 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/BasicCollectionTypeDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/BasicCollectionTypeDecoder.groovy @@ -21,10 +21,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.PropertyDecoder import org.grails.datastore.mapping.dirty.checking.DirtyCheckable import org.grails.datastore.mapping.dirty.checking.DirtyCheckingMap @@ -44,7 +46,7 @@ class BasicCollectionTypeDecoder implements PropertyDecoder { void decode(BsonReader reader, Basic property, EntityAccess entityAccess, DecoderContext decoderContext, CodecRegistry codecRegistry) { CustomTypeMarshaller marshaller = property.customTypeMarshaller - if(marshaller) { + if (marshaller) { CustomTypeDecoder.decode(codecRegistry, reader, decoderContext, marshaller, property, entityAccess) } else { @@ -53,7 +55,7 @@ class BasicCollectionTypeDecoder implements PropertyDecoder { def collectionType = property.type Codec codec - if(Set.isAssignableFrom(collectionType)) { + if (Set.isAssignableFrom(collectionType)) { codec = codecRegistry.get(List) } else { @@ -61,26 +63,25 @@ class BasicCollectionTypeDecoder implements PropertyDecoder { } def value = codec.decode(reader, decoderContext) def entity = entityAccess.entity - if(value instanceof Collection) { + if (value instanceof Collection) { def converted = value.collect() { conversionService.convert(it, componentType) } - - if(entity instanceof DirtyCheckable) { + if (entity instanceof DirtyCheckable) { converted = DirtyCheckingSupport.wrap(converted, (DirtyCheckable) entity, property.name) } - entityAccess.setProperty( property.name, converted ) + entityAccess.setProperty(property.name, converted) } - else if(value instanceof Map) { + else if (value instanceof Map) { def converted = value.collectEntries() { Map.Entry entry -> def v = entry.value entry.value = conversionService.convert(v, componentType) return entry } - if(entity instanceof DirtyCheckable) { + if (entity instanceof DirtyCheckable) { converted = new DirtyCheckingMap(converted, (DirtyCheckable) entity, property.name) } - entityAccess.setProperty( property.name, converted) + entityAccess.setProperty(property.name, converted) } } } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/CustomTypeDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/CustomTypeDecoder.groovy index c9c7f3d89bc..a1f3cf1876e 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/CustomTypeDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/CustomTypeDecoder.groovy @@ -19,12 +19,12 @@ package org.grails.datastore.bson.codecs.decoders -import groovy.transform.PackageScope import org.bson.BsonReader import org.bson.Document import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.CodecCustomTypeMarshaller import org.grails.datastore.bson.codecs.CodecExtensions import org.grails.datastore.bson.codecs.PropertyDecoder @@ -34,7 +34,6 @@ import org.grails.datastore.mapping.engine.types.CustomTypeMarshaller import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.model.types.Custom - /** * A {@PropertyDecoder} capable of decoding {@Custom} types */ @@ -47,11 +46,10 @@ class CustomTypeDecoder implements PropertyDecoder { decode(codecRegistry, reader, decoderContext, marshaller, property, entityAccess) } - protected static void decode(CodecRegistry codecRegistry, BsonReader reader, DecoderContext decoderContext, CustomTypeMarshaller marshaller, PersistentProperty property, EntityAccess entityAccess) { def bsonType = reader.currentBsonType - if(marshaller instanceof CodecCustomTypeMarshaller) { + if (marshaller instanceof CodecCustomTypeMarshaller) { Codec codec = marshaller.codec def value = codec.decode(reader, decoderContext) if (value != null) { @@ -61,7 +59,7 @@ class CustomTypeDecoder implements PropertyDecoder { else { def codec = CodecExtensions.getCodecForBsonType(bsonType, codecRegistry) - if(codec != null) { + if (codec != null) { def decoded = codec.decode(reader, decoderContext) def value = marshaller.read(property, new Document( MappingUtils.getTargetKey(property), @@ -76,4 +74,4 @@ class CustomTypeDecoder implements PropertyDecoder { } } } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/EmbeddedCollectionDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/EmbeddedCollectionDecoder.groovy index 0986fa8bb99..dc708f33789 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/EmbeddedCollectionDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/EmbeddedCollectionDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.codecs.DecoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.BsonPersistentEntityCodec import org.grails.datastore.bson.codecs.PropertyDecoder import org.grails.datastore.mapping.dirty.checking.DirtyCheckable @@ -51,13 +53,13 @@ class EmbeddedCollectionDecoder implements PropertyDecoder { EntityReflector associationReflector = property.getAssociatedEntity().getReflector() def owningEntity = entityAccess.entity - if(Collection.isAssignableFrom(property.type)) { + if (Collection.isAssignableFrom(property.type)) { reader.readStartArray() def bsonType = reader.readBsonType() def collection = MappingUtils.createConcreteCollection(property.type) - while(bsonType != BsonType.END_OF_DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { def decoded = associationCodec.decode(reader, decoderContext) - if(isBidirectional) { + if (isBidirectional) { associationReflector.setProperty( decoded, inverseSide.name, @@ -73,14 +75,14 @@ class EmbeddedCollectionDecoder implements PropertyDecoder { DirtyCheckingSupport.wrap(collection, (DirtyCheckable) owningEntity, property.name) ) } - else if(Map.isAssignableFrom(property.type)) { + else if (Map.isAssignableFrom(property.type)) { reader.readStartDocument() def bsonType = reader.readBsonType() def map = [:] - while(bsonType != BsonType.END_OF_DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { def key = reader.readName() def decoded = associationCodec.decode(reader, decoderContext) - if(isBidirectional) { + if (isBidirectional) { associationReflector.setProperty( decoded, inverseSide.name, @@ -104,4 +106,4 @@ class EmbeddedCollectionDecoder implements PropertyDecoder { protected BsonPersistentEntityCodec createEmbeddedEntityCodec(CodecRegistry codecRegistry, PersistentEntity associatedEntity) { new BsonPersistentEntityCodec(codecRegistry, associatedEntity) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/EmbeddedDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/EmbeddedDecoder.groovy index b18c3d251c2..d2ce3c02609 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/EmbeddedDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/EmbeddedDecoder.groovy @@ -20,9 +20,11 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.codecs.DecoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.BsonPersistentEntityCodec import org.grails.datastore.bson.codecs.PropertyDecoder import org.grails.datastore.mapping.dirty.checking.DirtyCheckable @@ -44,11 +46,11 @@ class EmbeddedDecoder implements PropertyDecoder { BsonPersistentEntityCodec codec = createEmbeddedEntityCodec(codecRegistry, associatedEntity) def decoded = codec.decode(reader, decoderContext) - if(decoded instanceof DirtyCheckable) { + if (decoded instanceof DirtyCheckable) { decoded.trackChanges() } - if(property.isBidirectional()) { + if (property.isBidirectional()) { Association inverseSide = property.getInverseSide() EntityReflector associationReflector = property.getAssociatedEntity().getReflector() associationReflector.setProperty( @@ -68,4 +70,4 @@ class EmbeddedDecoder implements PropertyDecoder { protected BsonPersistentEntityCodec createEmbeddedEntityCodec(CodecRegistry codecRegistry, PersistentEntity associatedEntity) { new BsonPersistentEntityCodec(codecRegistry, associatedEntity) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/IdentityDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/IdentityDecoder.groovy index 01c381847ee..c9253606857 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/IdentityDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/IdentityDecoder.groovy @@ -20,16 +20,18 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.codecs.DecoderContext import org.bson.codecs.configuration.CodecRegistry import org.bson.types.ObjectId + +import org.springframework.dao.DataIntegrityViolationException + import org.grails.datastore.bson.codecs.PropertyDecoder import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.types.Identity -import org.springframework.dao.DataIntegrityViolationException - /** * A {@PropertyDecoder} capable of decoding the {@link org.grails.datastore.mapping.model.types.Identity} @@ -50,7 +52,7 @@ class IdentityDecoder implements PropertyDecoder { @Override void decode(BsonReader bsonReader, Identity property, EntityAccess access) { - access.setIdentifierNoConversion( bsonReader.readObjectId() ) + access.setIdentifierNoConversion(bsonReader.readObjectId()) } } IDENTITY_DECODERS[Long] = new IdentityTypeDecoder() { @@ -62,7 +64,7 @@ class IdentityDecoder implements PropertyDecoder { @Override void decode(BsonReader bsonReader, Identity property, EntityAccess access) { - access.setIdentifierNoConversion( bsonReader.readInt64() ) + access.setIdentifierNoConversion(bsonReader.readInt64()) } } @@ -75,7 +77,7 @@ class IdentityDecoder implements PropertyDecoder { @Override void decode(BsonReader bsonReader, Identity property, EntityAccess access) { - access.setIdentifierNoConversion( bsonReader.readInt32() ) + access.setIdentifierNoConversion(bsonReader.readInt32()) } } @@ -147,13 +149,13 @@ class IdentityDecoder implements PropertyDecoder { void decode(BsonReader bsonReader, Identity property, EntityAccess access, DecoderContext decoderContext, CodecRegistry codecRegistry) { BsonType bsonType = bsonReader.currentBsonType IdentityTypeDecoder decoder = IDENTITY_DECODERS.get(property.type) - if(decoder == null) { + if (decoder == null) { throw new IllegalStateException("Invalid identity type [$property.type}] for entity ${property.owner.name}") } - if(bsonType != decoder.bsonType()) { + if (bsonType != decoder.bsonType()) { decoder = DEFAULT_DECODERS.get(bsonType) - if(decoder == null) { + if (decoder == null) { throw new DataIntegrityViolationException("Invalid underlying identifier type [$bsonType] reading entity ${property.owner.name}. Please verify the integrity of your data.") } } @@ -166,4 +168,4 @@ class IdentityDecoder implements PropertyDecoder { void decode(BsonReader bsonReader, Identity property, EntityAccess access) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/InstantDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/InstantDecoder.groovy index 5c0bf06f33e..d43597722ed 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/InstantDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/InstantDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader + +import org.grails.datastore.bson.codecs.temporal.InstantBsonConverter import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.InstantBsonConverter import static org.grails.datastore.bson.codecs.decoders.SimpleDecoder.TypeDecoder diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalDateDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalDateDecoder.groovy index 6ed6b91b883..d47c85dbc97 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalDateDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalDateDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader + +import org.grails.datastore.bson.codecs.temporal.LocalDateBsonConverter import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.LocalDateBsonConverter import static org.grails.datastore.bson.codecs.decoders.SimpleDecoder.TypeDecoder diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalDateTimeDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalDateTimeDecoder.groovy index f6eefc8da1f..466d13f3dba 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalDateTimeDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalDateTimeDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader + +import org.grails.datastore.bson.codecs.temporal.LocalDateTimeBsonConverter import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.LocalDateTimeBsonConverter import static org.grails.datastore.bson.codecs.decoders.SimpleDecoder.TypeDecoder diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalTimeDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalTimeDecoder.groovy index fbe5aff5158..e8f44917c4d 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalTimeDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/LocalTimeDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader + +import org.grails.datastore.bson.codecs.temporal.LocalTimeBsonConverter import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.LocalTimeBsonConverter import static org.grails.datastore.bson.codecs.decoders.SimpleDecoder.TypeDecoder diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/OffsetDateTimeDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/OffsetDateTimeDecoder.groovy index 805128b5c57..09d8cd0a885 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/OffsetDateTimeDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/OffsetDateTimeDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader + +import org.grails.datastore.bson.codecs.temporal.OffsetDateTimeBsonConverter import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.OffsetDateTimeBsonConverter import static org.grails.datastore.bson.codecs.decoders.SimpleDecoder.TypeDecoder diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/OffsetTimeDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/OffsetTimeDecoder.groovy index aa430a20072..cc4e6adb4ad 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/OffsetTimeDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/OffsetTimeDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader + +import org.grails.datastore.bson.codecs.temporal.OffsetTimeBsonConverter import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.OffsetTimeBsonConverter import static org.grails.datastore.bson.codecs.decoders.SimpleDecoder.TypeDecoder diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/PeriodDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/PeriodDecoder.groovy index 52d3ce135c5..7bea99758b2 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/PeriodDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/PeriodDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader + +import org.grails.datastore.bson.codecs.temporal.PeriodBsonConverter import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.PeriodBsonConverter import static org.grails.datastore.bson.codecs.decoders.SimpleDecoder.TypeDecoder diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/SimpleDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/SimpleDecoder.groovy index 40a85afbd48..8e3c5dd7fe4 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/SimpleDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/SimpleDecoder.groovy @@ -19,7 +19,17 @@ package org.grails.datastore.bson.codecs.decoders +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.OffsetDateTime +import java.time.OffsetTime +import java.time.Period +import java.time.ZonedDateTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonRegularExpression import org.bson.BsonType @@ -28,33 +38,18 @@ import org.bson.codecs.configuration.CodecRegistry import org.bson.types.Binary import org.bson.types.Decimal128 import org.bson.types.ObjectId + import org.grails.datastore.bson.codecs.PropertyDecoder -import org.grails.datastore.bson.codecs.encoders.InstantEncoder -import org.grails.datastore.bson.codecs.encoders.LocalDateEncoder -import org.grails.datastore.bson.codecs.encoders.LocalDateTimeEncoder -import org.grails.datastore.bson.codecs.encoders.LocalTimeEncoder -import org.grails.datastore.bson.codecs.encoders.OffsetDateTimeEncoder -import org.grails.datastore.bson.codecs.encoders.OffsetTimeEncoder -import org.grails.datastore.bson.codecs.encoders.PeriodEncoder -import org.grails.datastore.bson.codecs.encoders.ZonedDateTimeEncoder import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.model.types.Simple -import java.time.Instant -import java.time.LocalDate -import java.time.LocalDateTime -import java.time.LocalTime -import java.time.OffsetDateTime -import java.time.OffsetTime -import java.time.Period -import java.time.ZonedDateTime - /** * A {@PropertyDecoder} capable of decoding {@link org.grails.datastore.mapping.model.types.Simple} properties */ @CompileStatic class SimpleDecoder implements PropertyDecoder { + public static final Map SIMPLE_TYPE_DECODERS public static final TypeDecoder DEFAULT_DECODER = new TypeDecoder() { @Override @@ -64,7 +59,7 @@ class SimpleDecoder implements PropertyDecoder { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { - entityAccess.setProperty( property.name, reader.readString()) + entityAccess.setProperty(property.name, reader.readString()) } } public static final Map DEFAULT_DECODERS = new HashMap().withDefault { Class -> @@ -93,7 +88,7 @@ class SimpleDecoder implements PropertyDecoder { void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { BsonRegularExpression regularExpression = reader.readRegularExpression() - entityAccess.setProperty( property.name, regularExpression.pattern ) + entityAccess.setProperty(property.name, regularExpression.pattern) } }) @@ -106,13 +101,13 @@ class SimpleDecoder implements PropertyDecoder { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { Decimal128 dec = reader.readDecimal128() - entityAccess.setProperty( property.name, dec ) + entityAccess.setProperty(property.name, dec) } }) def convertingIntReader = new TypeDecoder() { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { - entityAccess.setProperty( property.name, reader.readInt32() ) + entityAccess.setProperty(property.name, reader.readInt32()) } @Override @@ -128,11 +123,10 @@ class SimpleDecoder implements PropertyDecoder { SIMPLE_TYPE_DECODERS[Byte] = convertingIntReader SIMPLE_TYPE_DECODERS[byte.class] = convertingIntReader - def intDecoder = new TypeDecoder() { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { - entityAccess.setPropertyNoConversion( property.name, reader.readInt32() ) + entityAccess.setPropertyNoConversion(property.name, reader.readInt32()) } @Override @@ -147,7 +141,7 @@ class SimpleDecoder implements PropertyDecoder { def longDecoder = new TypeDecoder() { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { - entityAccess.setPropertyNoConversion( property.name, reader.readInt64() ) + entityAccess.setPropertyNoConversion(property.name, reader.readInt64()) } @Override @@ -159,7 +153,7 @@ class SimpleDecoder implements PropertyDecoder { def convertingLongDecoder = new TypeDecoder() { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { - entityAccess.setProperty( property.name, reader.readInt64() ) + entityAccess.setProperty(property.name, reader.readInt64()) } @Override @@ -176,7 +170,7 @@ class SimpleDecoder implements PropertyDecoder { def doubleDecoder = new TypeDecoder() { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { - entityAccess.setPropertyNoConversion( property.name, reader.readDouble() ) + entityAccess.setPropertyNoConversion(property.name, reader.readDouble()) } @Override @@ -188,7 +182,7 @@ class SimpleDecoder implements PropertyDecoder { def convertingDoubleDecoder = new TypeDecoder() { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { - entityAccess.setPropertyNoConversion( property.name, reader.readDouble() ) + entityAccess.setPropertyNoConversion(property.name, reader.readDouble()) } @Override @@ -205,7 +199,7 @@ class SimpleDecoder implements PropertyDecoder { def booleanDecoder = new TypeDecoder() { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { - entityAccess.setPropertyNoConversion( property.name, reader.readBoolean() ) + entityAccess.setPropertyNoConversion(property.name, reader.readBoolean()) } @Override @@ -218,7 +212,6 @@ class SimpleDecoder implements PropertyDecoder { SIMPLE_TYPE_DECODERS[Boolean] = booleanDecoder SIMPLE_TYPE_DECODERS[boolean.class] = booleanDecoder - def binaryDecoder = new TypeDecoder() { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { @@ -239,7 +232,7 @@ class SimpleDecoder implements PropertyDecoder { @Override void decode(BsonReader reader, PersistentProperty property, EntityAccess entityAccess) { def time = reader.readDateTime() - entityAccess.setPropertyNoConversion( property.name, new Date(time)) + entityAccess.setPropertyNoConversion(property.name, new Date(time)) } @Override @@ -259,7 +252,7 @@ class SimpleDecoder implements PropertyDecoder { def time = reader.readDateTime() def calendar = new GregorianCalendar() calendar.setTimeInMillis(time) - entityAccess.setPropertyNoConversion( property.name, calendar) + entityAccess.setPropertyNoConversion(property.name, calendar) } } @@ -302,7 +295,6 @@ class SimpleDecoder implements PropertyDecoder { reader.readObjectId() ) - } } @@ -329,9 +321,9 @@ class SimpleDecoder implements PropertyDecoder { TypeDecoder decoder = SIMPLE_TYPE_DECODERS[type] - if(type.isArray()) { - if(!decoder.is(DEFAULT_DECODER)) { - decoder.decode reader, property, entityAccess + if (type.isArray()) { + if (!decoder.is(DEFAULT_DECODER)) { + decoder.decode(reader, property, entityAccess) } else { def arrayDecoder = codecRegistry.get(List) @@ -341,11 +333,11 @@ class SimpleDecoder implements PropertyDecoder { } else { BsonType bsonType = reader.currentBsonType - if(bsonType != decoder.bsonType()) { + if (bsonType != decoder.bsonType()) { DEFAULT_DECODERS.get(bsonType).decode(reader, property, entityAccess) } else { - decoder.decode reader, property, entityAccess + decoder.decode(reader, property, entityAccess) } } } diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/TenantIdDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/TenantIdDecoder.groovy index 4694d2a3a9a..6ca5c18a66f 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/TenantIdDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/TenantIdDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.codecs.DecoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.PropertyDecoder import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.types.TenantId @@ -36,15 +38,16 @@ import org.grails.datastore.mapping.model.types.TenantId */ @CompileStatic class TenantIdDecoder implements PropertyDecoder { + @Override void decode(BsonReader reader, TenantId property, EntityAccess entityAccess, DecoderContext decoderContext, CodecRegistry codecRegistry) { BsonType bsonType = reader.currentBsonType def decoder = SimpleDecoder.SIMPLE_TYPE_DECODERS.get(property.type) - if(bsonType != decoder.bsonType()) { + if (bsonType != decoder.bsonType()) { SimpleDecoder.DEFAULT_DECODERS.get(bsonType).decode(reader, property, entityAccess) } else { - decoder.decode reader, property, entityAccess + decoder.decode(reader, property, entityAccess) } } } diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/ZonedDateTimeDecoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/ZonedDateTimeDecoder.groovy index 8e15924a4a3..783971440b3 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/ZonedDateTimeDecoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/decoders/ZonedDateTimeDecoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.decoders import groovy.transform.CompileStatic + import org.bson.BsonReader + +import org.grails.datastore.bson.codecs.temporal.ZonedDateTimeBsonConverter import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.ZonedDateTimeBsonConverter import static org.grails.datastore.bson.codecs.decoders.SimpleDecoder.TypeDecoder diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/BasicCollectionTypeEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/BasicCollectionTypeEncoder.groovy index 9edc29ec1f5..0693b776a3c 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/BasicCollectionTypeEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/BasicCollectionTypeEncoder.groovy @@ -20,11 +20,13 @@ package org.grails.datastore.bson.codecs.encoders import groovy.transform.CompileStatic + import org.bson.BsonWriter import org.bson.codecs.Codec import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry import org.bson.conversions.Bson + import org.grails.datastore.bson.codecs.PropertyEncoder import org.grails.datastore.mapping.dirty.checking.DirtyCheckable import org.grails.datastore.mapping.dirty.checking.DirtyCheckingMap @@ -42,34 +44,34 @@ class BasicCollectionTypeEncoder implements PropertyEncoder { @Override void encode(BsonWriter writer, Basic property, Object value, EntityAccess parentAccess, EncoderContext encoderContext, CodecRegistry codecRegistry) { def marshaller = property.customTypeMarshaller - if(marshaller) { + if (marshaller) { CustomTypeEncoder.encode(codecRegistry, encoderContext, writer, property, marshaller, value) } else { - writer.writeName( MappingUtils.getTargetKey(property) ) + writer.writeName(MappingUtils.getTargetKey(property)) def collectionType = property.type Codec codec final boolean isSet = Set.isAssignableFrom(collectionType) - if(isSet) { - codec = (Codec)codecRegistry.get(List) + if (isSet) { + codec = (Codec) codecRegistry.get(List) } else { - codec = (Codec)codecRegistry.get(collectionType) + codec = (Codec) codecRegistry.get(collectionType) } codec.encode(writer, isSet ? value as List : value, encoderContext) def parent = parentAccess.entity - if(parent instanceof DirtyCheckable) { - if(value instanceof Collection) { + if (parent instanceof DirtyCheckable) { + if (value instanceof Collection) { def propertyName = property.name parentAccess.setPropertyNoConversion( propertyName, DirtyCheckingSupport.wrap(value, parent, propertyName) ) } - else if(value instanceof Map && !(value instanceof Bson)) { + else if (value instanceof Map && !(value instanceof Bson)) { def propertyName = property.name parentAccess.setPropertyNoConversion( propertyName, diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/CustomTypeEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/CustomTypeEncoder.groovy index 27a3db74a51..6aac4642f3f 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/CustomTypeEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/CustomTypeEncoder.groovy @@ -20,11 +20,13 @@ package org.grails.datastore.bson.codecs.encoders import groovy.transform.CompileStatic + import org.bson.BsonWriter import org.bson.Document import org.bson.codecs.Codec import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.CodecCustomTypeMarshaller import org.grails.datastore.bson.codecs.PropertyEncoder import org.grails.datastore.mapping.engine.EntityAccess @@ -48,17 +50,17 @@ class CustomTypeEncoder implements PropertyEncoder { protected static void encode(CodecRegistry codecRegistry, EncoderContext encoderContext, BsonWriter writer, PersistentProperty property, CustomTypeMarshaller marshaller, value) { String targetName = MappingUtils.getTargetKey(property) - if(marshaller instanceof CodecCustomTypeMarshaller) { + if (marshaller instanceof CodecCustomTypeMarshaller) { writer.writeName(targetName) Codec codec = marshaller.codec - codec.encode(writer,value, encoderContext) + codec.encode(writer, value, encoderContext) } else { def document = new Document() marshaller.write(property, value, document) Object converted = document.get(targetName) - if(converted != null) { + if (converted != null) { Codec codec = (Codec) codecRegistry.get(converted.getClass()) if (codec) { writer.writeName(targetName) @@ -67,4 +69,4 @@ class CustomTypeEncoder implements PropertyEncoder { } } } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/EmbeddedCollectionEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/EmbeddedCollectionEncoder.groovy index 92db34380f2..e920ae7ac0c 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/EmbeddedCollectionEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/EmbeddedCollectionEncoder.groovy @@ -20,9 +20,11 @@ package org.grails.datastore.bson.codecs.encoders import groovy.transform.CompileStatic + import org.bson.BsonWriter import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.BsonPersistentEntityCodec import org.grails.datastore.bson.codecs.PropertyEncoder import org.grails.datastore.mapping.engine.EntityAccess @@ -32,7 +34,6 @@ import org.grails.datastore.mapping.model.types.Association import org.grails.datastore.mapping.model.types.EmbeddedCollection import org.grails.datastore.mapping.model.types.ToOne - /** * A {@PropertyEncoder} capable of encoding {@EmbeddedCollection} collection types * @@ -45,7 +46,7 @@ class EmbeddedCollectionEncoder implements PropertyEncoder { @Override void encode(BsonWriter writer, EmbeddedCollection property, Object value, EntityAccess parentAccess, EncoderContext encoderContext, CodecRegistry codecRegistry) { - writer.writeName MappingUtils.getTargetKey(property) + writer.writeName(MappingUtils.getTargetKey(property)) def associatedEntity = property.associatedEntity BsonPersistentEntityCodec associatedCodec = createEmbeddedEntityCodec(codecRegistry, associatedEntity) @@ -55,22 +56,22 @@ class EmbeddedCollectionEncoder implements PropertyEncoder { def isToOne = inverseSide instanceof ToOne def mappingContext = parentAccess.persistentEntity.mappingContext - if(Collection.isInstance(value)) { + if (Collection.isInstance(value)) { writer.writeStartArray() - for(v in value) { - if(v != null) { + for (v in value) { + if (v != null) { BsonPersistentEntityCodec codec = associatedCodec PersistentEntity entity = associatedEntity def cls = v.getClass() - if(cls != associatedEntity.javaClass) { + if (cls != associatedEntity.javaClass) { // try subclass def childEntity = mappingContext.getPersistentEntity(cls.name) - if(childEntity != null) { + if (childEntity != null) { entity = childEntity - codec = (BsonPersistentEntityCodec)codecRegistry.get(cls) + codec = (BsonPersistentEntityCodec) codecRegistry.get(cls) } else { continue @@ -79,8 +80,8 @@ class EmbeddedCollectionEncoder implements PropertyEncoder { def ea = mappingContext.getEntityReflector(entity) def id = ea.getIdentifier(v) - if(isBidirectional) { - if(isToOne) { + if (isBidirectional) { + if (isToOne) { ea.setProperty(v, inverseProperty, parentAccess.entity) } } @@ -90,14 +91,13 @@ class EmbeddedCollectionEncoder implements PropertyEncoder { } writer.writeEndArray() } - else if(Map.isInstance(value)) { + else if (Map.isInstance(value)) { writer.writeStartDocument() - for(e in value) { - Map.Entry entry = (Map.Entry)e - - writer.writeName entry.key + for (e in value) { + Map.Entry entry = (Map.Entry) e + writer.writeName(entry.key) def v = entry.value def ea = mappingContext.getEntityReflector(associatedEntity) @@ -109,10 +109,9 @@ class EmbeddedCollectionEncoder implements PropertyEncoder { writer.writeEndDocument() } - } protected BsonPersistentEntityCodec createEmbeddedEntityCodec(CodecRegistry codecRegistry, PersistentEntity associatedEntity) { new BsonPersistentEntityCodec(codecRegistry, associatedEntity) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/EmbeddedEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/EmbeddedEncoder.groovy index a4a436373a4..e2a5246eda2 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/EmbeddedEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/EmbeddedEncoder.groovy @@ -20,9 +20,11 @@ package org.grails.datastore.bson.codecs.encoders import groovy.transform.CompileStatic + import org.bson.BsonWriter import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.BsonPersistentEntityCodec import org.grails.datastore.bson.codecs.PropertyEncoder import org.grails.datastore.mapping.engine.EntityAccess @@ -38,20 +40,19 @@ class EmbeddedEncoder implements PropertyEncoder { @Override void encode(BsonWriter writer, Embedded property, Object value, EntityAccess parentAccess, EncoderContext encoderContext, CodecRegistry codecRegistry) { - if(value != null) { + if (value != null) { def mappingContext = parentAccess.persistentEntity.mappingContext PersistentEntity associatedEntity = mappingContext.getPersistentEntity(value.getClass().name) - if(associatedEntity == null) { + if (associatedEntity == null) { associatedEntity = property.associatedEntity } - writer.writeName MappingUtils.getTargetKey(property) + writer.writeName(MappingUtils.getTargetKey(property)) def reflector = mappingContext.getEntityReflector(associatedEntity) BsonPersistentEntityCodec codec = createEmbeddedEntityCodec(codecRegistry, associatedEntity) - def identifier = reflector.getIdentifier(value) def hasIdentifier = identifier != null @@ -62,4 +63,4 @@ class EmbeddedEncoder implements PropertyEncoder { protected BsonPersistentEntityCodec createEmbeddedEntityCodec(CodecRegistry codecRegistry, PersistentEntity associatedEntity) { new BsonPersistentEntityCodec(codecRegistry, associatedEntity) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/IdentityEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/IdentityEncoder.groovy index 2f5abb4f65c..48b86eb44f4 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/IdentityEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/IdentityEncoder.groovy @@ -20,10 +20,12 @@ package org.grails.datastore.bson.codecs.encoders import groovy.transform.CompileStatic + import org.bson.BsonWriter import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry import org.bson.types.ObjectId + import org.grails.datastore.bson.codecs.PropertyEncoder import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.model.config.GormProperties @@ -51,7 +53,7 @@ class IdentityEncoder implements PropertyEncoder { protected String getIdentifierName(Identity property) { String[] identifierName = property.getOwner().mapping.identifier?.identifierName - if(identifierName != null) { + if (identifierName != null) { return identifierName[0] } else { diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/InstantEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/InstantEncoder.groovy index 68f93c4cdf8..4b37bed8e65 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/InstantEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/InstantEncoder.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.Instant + import groovy.transform.CompileStatic + import org.bson.BsonWriter -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.InstantBsonConverter -import java.time.Instant +import org.grails.datastore.bson.codecs.temporal.InstantBsonConverter +import org.grails.datastore.mapping.model.PersistentProperty import static org.grails.datastore.bson.codecs.encoders.SimpleEncoder.TypeEncoder @@ -38,6 +40,6 @@ class InstantEncoder implements TypeEncoder, InstantBsonConverter { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - write(writer, (Instant)value) + write(writer, (Instant) value) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalDateEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalDateEncoder.groovy index ac7ef927104..82e09a56888 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalDateEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalDateEncoder.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.LocalDate + import groovy.transform.CompileStatic + import org.bson.BsonWriter -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.LocalDateBsonConverter -import java.time.LocalDate +import org.grails.datastore.bson.codecs.temporal.LocalDateBsonConverter +import org.grails.datastore.mapping.model.PersistentProperty import static org.grails.datastore.bson.codecs.encoders.SimpleEncoder.TypeEncoder @@ -38,6 +40,6 @@ class LocalDateEncoder implements TypeEncoder, LocalDateBsonConverter { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - write(writer, (LocalDate)value) + write(writer, (LocalDate) value) } } diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalDateTimeEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalDateTimeEncoder.groovy index 5a23bef942f..f5e30341af6 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalDateTimeEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalDateTimeEncoder.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.LocalDateTime + import groovy.transform.CompileStatic + import org.bson.BsonWriter -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.LocalDateTimeBsonConverter -import java.time.LocalDateTime +import org.grails.datastore.bson.codecs.temporal.LocalDateTimeBsonConverter +import org.grails.datastore.mapping.model.PersistentProperty import static org.grails.datastore.bson.codecs.encoders.SimpleEncoder.TypeEncoder @@ -38,6 +40,6 @@ class LocalDateTimeEncoder implements TypeEncoder, LocalDateTimeBsonConverter { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - write(writer, (LocalDateTime)value) + write(writer, (LocalDateTime) value) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalTimeEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalTimeEncoder.groovy index f4dc35dd93b..fbc0d4d6d7d 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalTimeEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/LocalTimeEncoder.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.LocalTime + import groovy.transform.CompileStatic + import org.bson.BsonWriter -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.LocalTimeBsonConverter -import java.time.LocalTime +import org.grails.datastore.bson.codecs.temporal.LocalTimeBsonConverter +import org.grails.datastore.mapping.model.PersistentProperty import static org.grails.datastore.bson.codecs.encoders.SimpleEncoder.TypeEncoder @@ -38,6 +40,6 @@ class LocalTimeEncoder implements TypeEncoder, LocalTimeBsonConverter { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - write(writer, (LocalTime)value) + write(writer, (LocalTime) value) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/OffsetDateTimeEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/OffsetDateTimeEncoder.groovy index e8f5b56d057..e459d6cb98e 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/OffsetDateTimeEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/OffsetDateTimeEncoder.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.OffsetDateTime + import groovy.transform.CompileStatic + import org.bson.BsonWriter -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.OffsetDateTimeBsonConverter -import java.time.OffsetDateTime +import org.grails.datastore.bson.codecs.temporal.OffsetDateTimeBsonConverter +import org.grails.datastore.mapping.model.PersistentProperty import static org.grails.datastore.bson.codecs.encoders.SimpleEncoder.TypeEncoder @@ -38,6 +40,6 @@ class OffsetDateTimeEncoder implements TypeEncoder, OffsetDateTimeBsonConverter @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - write(writer, (OffsetDateTime)value) + write(writer, (OffsetDateTime) value) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/OffsetTimeEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/OffsetTimeEncoder.groovy index 80ef0944e71..f690c06140a 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/OffsetTimeEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/OffsetTimeEncoder.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.OffsetTime + import groovy.transform.CompileStatic + import org.bson.BsonWriter -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.OffsetTimeBsonConverter -import java.time.OffsetTime +import org.grails.datastore.bson.codecs.temporal.OffsetTimeBsonConverter +import org.grails.datastore.mapping.model.PersistentProperty import static org.grails.datastore.bson.codecs.encoders.SimpleEncoder.TypeEncoder @@ -38,6 +40,6 @@ class OffsetTimeEncoder implements TypeEncoder, OffsetTimeBsonConverter { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - write(writer, (OffsetTime)value) + write(writer, (OffsetTime) value) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/PeriodEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/PeriodEncoder.groovy index b033b3cc9dc..6142fab5899 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/PeriodEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/PeriodEncoder.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.Period + import groovy.transform.CompileStatic + import org.bson.BsonWriter -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.PeriodBsonConverter -import java.time.Period +import org.grails.datastore.bson.codecs.temporal.PeriodBsonConverter +import org.grails.datastore.mapping.model.PersistentProperty import static org.grails.datastore.bson.codecs.encoders.SimpleEncoder.TypeEncoder @@ -38,6 +40,6 @@ class PeriodEncoder implements TypeEncoder, PeriodBsonConverter { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - write(writer, (Period)value) + write(writer, (Period) value) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/SimpleEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/SimpleEncoder.groovy index 2fbc85bcb24..f3060a9bd2a 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/SimpleEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/SimpleEncoder.groovy @@ -19,7 +19,17 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.OffsetDateTime +import java.time.OffsetTime +import java.time.Period +import java.time.ZonedDateTime + import groovy.transform.CompileStatic + import org.bson.BsonBinary import org.bson.BsonWriter import org.bson.codecs.EncoderContext @@ -27,21 +37,13 @@ import org.bson.codecs.configuration.CodecRegistry import org.bson.types.Binary import org.bson.types.Decimal128 import org.bson.types.ObjectId + import org.grails.datastore.bson.codecs.PropertyEncoder import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.engine.internal.MappingUtils import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.model.types.Simple -import java.time.Instant -import java.time.LocalDate -import java.time.LocalDateTime -import java.time.LocalTime -import java.time.OffsetDateTime -import java.time.OffsetTime -import java.time.Period -import java.time.ZonedDateTime - /** * An encoder for simple types persistable by MongoDB * @@ -59,13 +61,12 @@ class SimpleEncoder implements PropertyEncoder { public static final TypeEncoder DEFAULT_ENCODER = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeString( value.toString() ) + writer.writeString(value.toString()) } } static { - SIMPLE_TYPE_ENCODERS = new HashMap().withDefault { Class c -> DEFAULT_ENCODER } @@ -73,7 +74,7 @@ class SimpleEncoder implements PropertyEncoder { TypeEncoder smallNumberEncoder = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeInt32( ((Number)value).intValue() ) + writer.writeInt32(((Number) value).intValue()) } } SIMPLE_TYPE_ENCODERS[CharSequence] = DEFAULT_ENCODER @@ -89,7 +90,7 @@ class SimpleEncoder implements PropertyEncoder { TypeEncoder doubleEncoder = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeDouble( (Double)value ) + writer.writeDouble((Double) value) } } SIMPLE_TYPE_ENCODERS[Double] = doubleEncoder @@ -97,7 +98,7 @@ class SimpleEncoder implements PropertyEncoder { TypeEncoder longEncoder = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeInt64( (Long)value ) + writer.writeInt64((Long) value) } } SIMPLE_TYPE_ENCODERS[Long] = longEncoder @@ -105,7 +106,7 @@ class SimpleEncoder implements PropertyEncoder { TypeEncoder booleanEncoder = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeBoolean( (Boolean)value ) + writer.writeBoolean((Boolean) value) } } SIMPLE_TYPE_ENCODERS[Boolean] = booleanEncoder @@ -113,19 +114,19 @@ class SimpleEncoder implements PropertyEncoder { SIMPLE_TYPE_ENCODERS[Calendar] = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeDateTime( ((Calendar)value).timeInMillis ) + writer.writeDateTime(((Calendar) value).timeInMillis) } } SIMPLE_TYPE_ENCODERS[Date] = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeDateTime( ((Date)value).time ) + writer.writeDateTime(((Date) value).time) } } SIMPLE_TYPE_ENCODERS[TimeZone] = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeString( ((TimeZone)value).ID ) + writer.writeString(((TimeZone) value).ID) } } @@ -141,36 +142,35 @@ class SimpleEncoder implements PropertyEncoder { SIMPLE_TYPE_ENCODERS[([] as byte[]).getClass()] = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeBinaryData( new BsonBinary((byte[])value)) + writer.writeBinaryData(new BsonBinary((byte[]) value)) } } SIMPLE_TYPE_ENCODERS[Binary] = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeBinaryData( new BsonBinary(((Binary)value).data)) + writer.writeBinaryData(new BsonBinary(((Binary) value).data)) } } SIMPLE_TYPE_ENCODERS[ObjectId] = new TypeEncoder() { @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - writer.writeObjectId((ObjectId)value) + writer.writeObjectId((ObjectId) value) } } } - @Override void encode(BsonWriter writer, Simple property, Object value, EntityAccess parentAccess, EncoderContext encoderContext, CodecRegistry codecRegistry) { def type = property.type def encoder = SIMPLE_TYPE_ENCODERS[type] - writer.writeName( MappingUtils.getTargetKey(property) ) - if(type.isArray()) { - if(!encoder.is(DEFAULT_ENCODER)) { + writer.writeName(MappingUtils.getTargetKey(property)) + if (type.isArray()) { + if (!encoder.is(DEFAULT_ENCODER)) { encoder.encode(writer, property, value) } else { writer.writeStartArray() - for( o in value ) { + for (o in value) { encoder = SIMPLE_TYPE_ENCODERS[type.componentType] encoder.encode(writer, property, o) } @@ -200,4 +200,4 @@ class SimpleEncoder implements PropertyEncoder { } } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/TenantIdEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/TenantIdEncoder.groovy index b6e4fbc8678..1aa1c9d5fd8 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/TenantIdEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/TenantIdEncoder.groovy @@ -20,15 +20,14 @@ package org.grails.datastore.bson.codecs.encoders import groovy.transform.CompileStatic + import org.bson.BsonWriter import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry -import org.bson.types.ObjectId + import org.grails.datastore.bson.codecs.PropertyEncoder import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.engine.internal.MappingUtils -import org.grails.datastore.mapping.model.config.GormProperties -import org.grails.datastore.mapping.model.types.Identity import org.grails.datastore.mapping.model.types.TenantId /** @@ -42,7 +41,7 @@ class TenantIdEncoder implements PropertyEncoder { @Override void encode(BsonWriter writer, TenantId property, Object id, EntityAccess parentAccess, EncoderContext encoderContext, CodecRegistry codecRegistry) { - writer.writeName( MappingUtils.getTargetKey(property) ) + writer.writeName(MappingUtils.getTargetKey(property)) SimpleEncoder.SIMPLE_TYPE_ENCODERS.get(property.type).encode(writer, property, id) } diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/ZonedDateTimeEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/ZonedDateTimeEncoder.groovy index 590d719799d..aa9d90455df 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/ZonedDateTimeEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/encoders/ZonedDateTimeEncoder.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.bson.codecs.encoders +import java.time.ZonedDateTime + import groovy.transform.CompileStatic + import org.bson.BsonWriter -import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.bson.codecs.temporal.ZonedDateTimeBsonConverter -import java.time.ZonedDateTime +import org.grails.datastore.bson.codecs.temporal.ZonedDateTimeBsonConverter +import org.grails.datastore.mapping.model.PersistentProperty /** * A simple encoder for {@link java.time.ZonedDateTime} @@ -36,6 +38,6 @@ class ZonedDateTimeEncoder implements SimpleEncoder.TypeEncoder, ZonedDateTimeBs @Override void encode(BsonWriter writer, PersistentProperty property, Object value) { - write(writer, (ZonedDateTime)value) + write(writer, (ZonedDateTime) value) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/InstantBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/InstantBsonConverter.groovy index 7d348ffeac8..120170b8689 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/InstantBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/InstantBsonConverter.groovy @@ -19,13 +19,15 @@ package org.grails.datastore.bson.codecs.temporal +import java.time.Instant + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter -import grails.gorm.time.InstantConverter -import java.time.Instant +import grails.gorm.time.InstantConverter /** * A trait to read and write a {@link java.time.Instant} to MongoDB @@ -50,4 +52,4 @@ trait InstantBsonConverter implements TemporalBsonConverter, InstantCon BsonType.INT64 } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalDateBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalDateBsonConverter.groovy index f23479ef5e8..d853987f5b2 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalDateBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalDateBsonConverter.groovy @@ -19,13 +19,15 @@ package org.grails.datastore.bson.codecs.temporal +import java.time.LocalDate + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter -import grails.gorm.time.LocalDateConverter -import java.time.LocalDate +import grails.gorm.time.LocalDateConverter /** * A trait to read and write a {@link LocalDate} to MongoDB @@ -49,4 +51,4 @@ trait LocalDateBsonConverter implements TemporalBsonConverter, LocalD BsonType bsonType() { BsonType.DATE_TIME } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalDateTimeBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalDateTimeBsonConverter.groovy index 11b28d70336..77771e7e2b2 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalDateTimeBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalDateTimeBsonConverter.groovy @@ -19,13 +19,15 @@ package org.grails.datastore.bson.codecs.temporal +import java.time.LocalDateTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter -import grails.gorm.time.LocalDateTimeConverter -import java.time.LocalDateTime +import grails.gorm.time.LocalDateTimeConverter /** * A trait to read and write a {@link LocalDateTime} to MongoDB @@ -49,4 +51,4 @@ trait LocalDateTimeBsonConverter implements TemporalBsonConverter BsonType bsonType() { BsonType.DATE_TIME } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalTimeBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalTimeBsonConverter.groovy index b4f8ce1c262..315390d6ac3 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalTimeBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/LocalTimeBsonConverter.groovy @@ -19,13 +19,15 @@ package org.grails.datastore.bson.codecs.temporal +import java.time.LocalTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter -import grails.gorm.time.LocalTimeConverter -import java.time.LocalTime +import grails.gorm.time.LocalTimeConverter /** * A trait to read and write a {@link LocalTime} to MongoDB @@ -49,4 +51,4 @@ trait LocalTimeBsonConverter implements TemporalBsonConverter, LocalT BsonType bsonType() { BsonType.INT64 } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/OffsetDateTimeBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/OffsetDateTimeBsonConverter.groovy index 06a1f0ccb90..8995024b3b3 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/OffsetDateTimeBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/OffsetDateTimeBsonConverter.groovy @@ -19,13 +19,15 @@ package org.grails.datastore.bson.codecs.temporal +import java.time.OffsetDateTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter -import grails.gorm.time.OffsetDateTimeConverter -import java.time.OffsetDateTime +import grails.gorm.time.OffsetDateTimeConverter /** * A trait to read and write a {@link OffsetDateTime} to MongoDB diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/OffsetTimeBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/OffsetTimeBsonConverter.groovy index cb66e629778..5076befbd8f 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/OffsetTimeBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/OffsetTimeBsonConverter.groovy @@ -19,13 +19,15 @@ package org.grails.datastore.bson.codecs.temporal +import java.time.OffsetTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter -import grails.gorm.time.OffsetTimeConverter -import java.time.OffsetTime +import grails.gorm.time.OffsetTimeConverter /** * A trait to read and write a {@link OffsetTime} to MongoDB @@ -49,4 +51,4 @@ trait OffsetTimeBsonConverter implements TemporalBsonConverter, Offs BsonType bsonType() { BsonType.INT64 } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/PeriodBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/PeriodBsonConverter.groovy index e98fe33fb65..fa1cb1682f4 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/PeriodBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/PeriodBsonConverter.groovy @@ -19,13 +19,15 @@ package org.grails.datastore.bson.codecs.temporal -import grails.gorm.time.PeriodConverter +import java.time.Period + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter -import java.time.Period +import grails.gorm.time.PeriodConverter /** * A trait to read and write a {@link java.time.Period} to MongoDB @@ -50,4 +52,4 @@ trait PeriodBsonConverter implements TemporalBsonConverter, PeriodConver BsonType.STRING } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/TemporalBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/TemporalBsonConverter.groovy index b6032141c37..f85c55e36cc 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/TemporalBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/TemporalBsonConverter.groovy @@ -20,6 +20,7 @@ package org.grails.datastore.bson.codecs.temporal import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter @@ -37,4 +38,4 @@ trait TemporalBsonConverter { abstract T read(BsonReader reader) abstract BsonType bsonType() -} \ No newline at end of file +} diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/ZonedDateTimeBsonConverter.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/ZonedDateTimeBsonConverter.groovy index b11cfad1ba6..5fbdadec607 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/ZonedDateTimeBsonConverter.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/codecs/temporal/ZonedDateTimeBsonConverter.groovy @@ -19,13 +19,15 @@ package org.grails.datastore.bson.codecs.temporal -import grails.gorm.time.ZonedDateTimeConverter +import java.time.ZonedDateTime + import groovy.transform.CompileStatic + import org.bson.BsonReader import org.bson.BsonType import org.bson.BsonWriter -import java.time.ZonedDateTime +import grails.gorm.time.ZonedDateTimeConverter /** * A trait to read and write a {@link ZonedDateTime} to MongoDB diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonReader.java b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonReader.java index c4c072eb07b..b1533850974 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonReader.java +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonReader.java @@ -15,15 +15,23 @@ */ package org.grails.datastore.bson.json; -import org.bson.*; -import org.bson.json.JsonParseException; -import org.bson.types.Decimal128; -import org.bson.types.ObjectId; - import java.io.IOException; import java.io.Reader; import java.io.StringReader; +import org.bson.AbstractBsonReader; +import org.bson.BsonBinary; +import org.bson.BsonContextType; +import org.bson.BsonDbPointer; +import org.bson.BsonInvalidOperationException; +import org.bson.BsonReaderMark; +import org.bson.BsonRegularExpression; +import org.bson.BsonTimestamp; +import org.bson.BsonType; +import org.bson.json.JsonParseException; +import org.bson.types.Decimal128; +import org.bson.types.ObjectId; + /** * A simplified fork of {@link org.bson.json.JsonReader} that works with readers and removes processing related to MongoDB * @@ -221,7 +229,6 @@ protected void doReadEndArray() { } } - @Override protected void doReadEndDocument() { setContext(getContext().getParentContext()); @@ -486,7 +493,6 @@ public void reset() { } } - protected class Context extends AbstractBsonReader.Context { protected Context(final AbstractBsonReader.Context parentContext, final BsonContextType contextType) { super(parentContext, contextType); diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonScanner.java b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonScanner.java index a7bfb411762..ea55f0cd385 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonScanner.java +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonScanner.java @@ -15,14 +15,13 @@ */ package org.grails.datastore.bson.json; - -import org.bson.BsonRegularExpression; -import org.bson.json.JsonParseException; - import java.io.IOException; import java.io.PushbackReader; import java.io.Reader; +import org.bson.BsonRegularExpression; +import org.bson.json.JsonParseException; + /** * Parses the string representation of a JSON object into a set of {@link JsonToken}-derived objects. * @@ -35,7 +34,6 @@ class JsonScanner { final PushbackReader reader; int position; - /** * Constructs a a new {@code JSONScanner} that produces values scanned from specified {@code JSONBuffer}. * @@ -45,7 +43,6 @@ public JsonScanner(final Reader reader) { this.reader = new PushbackReader(reader); } - /** * Finds and returns the next complete token from this scanner. If scanner reached the end of the source, it will return a token with * {@code JSONTokenType.END_OF_FILE} type. @@ -89,7 +86,7 @@ public JsonToken nextToken() throws IOException { if (c == JsonToken.MINUS || Character.isDigit(c)) { return scanNumber((char) c); } else if (c == '$' || c == '_' || Character.isLetter(c)) { - return scanUnquotedString((char)c); + return scanUnquotedString((char) c); } else { reader.unread(c); throw new JsonParseException("Invalid JSON input. Position: %d. Character: '%c'.", position, c); @@ -129,17 +126,17 @@ private JsonToken scanRegularExpression() throws IOException { break; case JsonToken.BACK_SLASH: state = JsonScanner.RegularExpressionState.IN_ESCAPE_SEQUENCE; - regexBuilder.append((char)c); + regexBuilder.append((char) c); break; default: state = JsonScanner.RegularExpressionState.IN_PATTERN; - regexBuilder.append((char)c); + regexBuilder.append((char) c); break; } break; case IN_ESCAPE_SEQUENCE: state = RegularExpressionState.IN_PATTERN; - regexBuilder.append((char)c); + regexBuilder.append((char) c); break; case IN_OPTIONS: switch (c) { @@ -148,7 +145,7 @@ private JsonToken scanRegularExpression() throws IOException { case 'x': case 's': state = JsonScanner.RegularExpressionState.IN_OPTIONS; - optionsBuilder.append((char)c); + optionsBuilder.append((char) c); break; case JsonToken.COMMA: case JsonToken.CLOSE_BRACE: @@ -193,7 +190,7 @@ private JsonToken scanUnquotedString(char startChar) throws IOException { builder.append(startChar); int c = readCharacter(); while (c == '$' || c == '_' || Character.isLetterOrDigit(c)) { - builder.append((char)c); + builder.append((char) c); c = readCharacter(); } reader.unread(c); @@ -242,7 +239,6 @@ private JsonToken scanNumber(final char firstChar) throws IOException { JsonTokenType type = JsonTokenType.INT64; - while (true) { c = readCharacter(); @@ -250,15 +246,15 @@ private JsonToken scanNumber(final char firstChar) throws IOException { case SAW_LEADING_MINUS: switch (c) { case '0': - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_LEADING_ZERO; break; case 'I': - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_MINUS_I; break; default: - numberBuilder.append((char)c); + numberBuilder.append((char) c); if (Character.isDigit(c)) { state = JsonScanner.NumberState.SAW_INTEGER_DIGITS; } else { @@ -271,12 +267,12 @@ private JsonToken scanNumber(final char firstChar) throws IOException { case SAW_INTEGER_DIGITS: switch (c) { case '.': - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_DECIMAL_POINT; break; case 'e': case 'E': - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_EXPONENT_LETTER; break; case JsonToken.COMMA: @@ -288,7 +284,7 @@ private JsonToken scanNumber(final char firstChar) throws IOException { break; default: if (Character.isDigit(c)) { - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_INTEGER_DIGITS; } else if (Character.isWhitespace(c)) { state = JsonScanner.NumberState.DONE; @@ -301,7 +297,7 @@ private JsonToken scanNumber(final char firstChar) throws IOException { case SAW_DECIMAL_POINT: type = JsonTokenType.DOUBLE; if (Character.isDigit(c)) { - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_FRACTION_DIGITS; } else { state = JsonScanner.NumberState.INVALID; @@ -311,7 +307,7 @@ private JsonToken scanNumber(final char firstChar) throws IOException { switch (c) { case 'e': case 'E': - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_EXPONENT_LETTER; break; case JsonToken.COMMA: @@ -323,7 +319,7 @@ private JsonToken scanNumber(final char firstChar) throws IOException { break; default: if (Character.isDigit(c)) { - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_FRACTION_DIGITS; } else if (Character.isWhitespace(c)) { state = JsonScanner.NumberState.DONE; @@ -338,12 +334,12 @@ private JsonToken scanNumber(final char firstChar) throws IOException { switch (c) { case '+': case '-': - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_EXPONENT_SIGN; break; default: if (Character.isDigit(c)) { - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_EXPONENT_DIGITS; } else { state = JsonScanner.NumberState.INVALID; @@ -353,7 +349,7 @@ private JsonToken scanNumber(final char firstChar) throws IOException { break; case SAW_EXPONENT_SIGN: if (Character.isDigit(c)) { - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_EXPONENT_DIGITS; } else { state = JsonScanner.NumberState.INVALID; @@ -369,7 +365,7 @@ private JsonToken scanNumber(final char firstChar) throws IOException { break; default: if (Character.isDigit(c)) { - numberBuilder.append((char)c); + numberBuilder.append((char) c); state = JsonScanner.NumberState.SAW_EXPONENT_DIGITS; } else if (Character.isWhitespace(c)) { state = JsonScanner.NumberState.DONE; @@ -381,14 +377,14 @@ private JsonToken scanNumber(final char firstChar) throws IOException { break; case SAW_MINUS_I: boolean sawMinusInfinity = true; - numberBuilder.append((char)c); + numberBuilder.append((char) c); for (int i = 0; i < NFINITY.length; i++) { if (c != NFINITY[i]) { sawMinusInfinity = false; break; } c = readCharacter(); - numberBuilder.append((char)c); + numberBuilder.append((char) c); } if (sawMinusInfinity) { type = JsonTokenType.DOUBLE; diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonWriter.java b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonWriter.java index 94d8c3b5da4..7046ea364a7 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonWriter.java +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/json/JsonWriter.java @@ -16,11 +16,6 @@ package org.grails.datastore.bson.json; -import org.bson.*; -import org.bson.json.JsonWriterSettings; -import org.bson.types.Decimal128; -import org.bson.types.ObjectId; - import java.io.IOException; import java.io.Writer; import java.text.DateFormat; @@ -29,6 +24,17 @@ import java.util.Date; import java.util.TimeZone; +import org.bson.AbstractBsonWriter; +import org.bson.BSONException; +import org.bson.BsonBinary; +import org.bson.BsonContextType; +import org.bson.BsonDbPointer; +import org.bson.BsonRegularExpression; +import org.bson.BsonTimestamp; +import org.bson.json.JsonWriterSettings; +import org.bson.types.Decimal128; +import org.bson.types.ObjectId; + /** * Simplified fork of {@link org.bson.json.JsonWriter} that ignores behaviour specific to MongoDB and produces more compat output * @@ -95,6 +101,7 @@ protected void doWriteStartArray() { } } + @Override protected void doWriteEndArray() { try { @@ -137,7 +144,7 @@ protected void doWriteDateTime(long value) { writeNameHelper(getName()); writer.write(JsonToken.QUOTE); Date date = new Date(value); - writer.write( df.format(date) ); + writer.write(df.format(date)); writer.write(JsonToken.QUOTE); setState(getNextState()); } catch (IOException e) { @@ -260,7 +267,7 @@ protected void doWriteRegularExpression(BsonRegularExpression regularExpression) writer.write(escaped); writer.write(JsonToken.FORWARD_SLASH); writer.write(regularExpression.getOptions()); - break; + break; } } catch (IOException e) { throwBsonException(e); @@ -407,7 +414,6 @@ private void writeStringHelper(final String str) throws IOException { writer.write('"'); } - /** * The context for the writer, inheriting all the values from {@link org.bson.AbstractBsonWriter.Context}, and additionally providing * settings for the indentation level and whether there are any child elements at this level. diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/query/BsonQuery.java b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/query/BsonQuery.java index 15c2e9337a9..d59c991e447 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/query/BsonQuery.java +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/query/BsonQuery.java @@ -19,13 +19,24 @@ package org.grails.datastore.bson.query; -import grails.gorm.DetachedCriteria; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; + +import org.codehaus.groovy.runtime.NullObject; + import org.bson.BsonReader; import org.bson.BsonType; import org.bson.Document; import org.bson.codecs.EncoderContext; import org.bson.codecs.configuration.CodecRegistry; -import org.codehaus.groovy.runtime.NullObject; + +import org.springframework.dao.InvalidDataAccessResourceUsageException; + +import grails.gorm.DetachedCriteria; import org.grails.datastore.bson.codecs.CodecCustomTypeMarshaller; import org.grails.datastore.mapping.config.Property; import org.grails.datastore.mapping.core.Session; @@ -40,10 +51,6 @@ import org.grails.datastore.mapping.proxy.ProxyHandler; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.reflect.EntityReflector; -import org.springframework.dao.InvalidDataAccessResourceUsageException; - -import java.util.*; -import java.util.regex.Pattern; /** * A base class for Query implementations that create BSON queries based on MongoDB query format. See https://docs.mongodb.com/manual/tutorial/query-documents/ @@ -95,7 +102,7 @@ public void handle(EmbeddedQueryEncoder queryEncoder, IdEquals criterion, Docume Object converted = mappingContext.getConversionService().convert(value, identity.getType()); Property mappedForm = identity.getMapping().getMappedForm(); String targetProperty = mappedForm.getTargetName(); - if(targetProperty == null) { + if (targetProperty == null) { targetProperty = identity.getName(); } query.put(targetProperty, converted); @@ -284,7 +291,7 @@ public void handle(EmbeddedQueryEncoder queryEncoder, Negation criteria, Documen for (Criterion criterion : criteria.getCriteria()) { Document negatedQuery = new Document(); nor.add(negatedQuery); - if(criterion instanceof PropertyCriterion) { + if (criterion instanceof PropertyCriterion) { PropertyCriterion pc = (PropertyCriterion) criterion; PersistentProperty property = entity.getPropertyByName(pc.getProperty()); if (property instanceof Custom) { @@ -372,12 +379,11 @@ public void handle(EmbeddedQueryEncoder queryEncoder, SizeGreaterThanEquals crit } }); - operatorHandlers.put(GT_OPERATOR, new OperatorHandler() { @Override public void handle(Junction criteria, String attributeName, BsonReader queryReader) { Object value = readBsonValue(queryReader, queryReader.getCurrentBsonType()); - if(value != null && !(value instanceof NullObject)) { + if (value != null && !(value instanceof NullObject)) { criteria.add(new Query.GreaterThan(attributeName, value)); } } @@ -387,7 +393,7 @@ public void handle(Junction criteria, String attributeName, BsonReader queryRead @Override public void handle(Junction criteria, String attributeName, BsonReader queryReader) { Object value = readBsonValue(queryReader, queryReader.getCurrentBsonType()); - if(value != null && !(value instanceof NullObject)) { + if (value != null && !(value instanceof NullObject)) { criteria.add(new Query.GreaterThanEquals(attributeName, value)); } } @@ -397,7 +403,7 @@ public void handle(Junction criteria, String attributeName, BsonReader queryRead @Override public void handle(Junction criteria, String attributeName, BsonReader queryReader) { Object value = readBsonValue(queryReader, queryReader.getCurrentBsonType()); - if(value != null && !(value instanceof NullObject)) { + if (value != null && !(value instanceof NullObject)) { criteria.add(new Query.LessThan(attributeName, value)); } } @@ -406,7 +412,7 @@ public void handle(Junction criteria, String attributeName, BsonReader queryRead @Override public void handle(Junction criteria, String attributeName, BsonReader queryReader) { Object value = readBsonValue(queryReader, queryReader.getCurrentBsonType()); - if(value != null && !(value instanceof NullObject)) { + if (value != null && !(value instanceof NullObject)) { criteria.add(new Query.LessThanEquals(attributeName, value)); } } @@ -415,7 +421,7 @@ public void handle(Junction criteria, String attributeName, BsonReader queryRead @Override public void handle(Junction criteria, String attributeName, BsonReader queryReader) { Object value = readBsonValue(queryReader, queryReader.getCurrentBsonType()); - if(value != null && !(value instanceof NullObject)) { + if (value != null && !(value instanceof NullObject)) { criteria.add(new Query.NotEquals(attributeName, value)); } } @@ -424,7 +430,7 @@ public void handle(Junction criteria, String attributeName, BsonReader queryRead @Override public void handle(Junction criteria, String attributeName, BsonReader queryReader) { Object value = readBsonValue(queryReader, queryReader.getCurrentBsonType()); - if(value != null) { + if (value != null) { criteria.add(new Query.Equals(attributeName, value)); } } @@ -434,7 +440,7 @@ public void handle(Junction criteria, String attributeName, BsonReader queryRead @Override public void handle(Junction criteria, String attributeName, BsonReader queryReader) { Object value = readBsonValue(queryReader, queryReader.getCurrentBsonType()); - if(value != null && !(value instanceof NullObject)) { + if (value != null && !(value instanceof NullObject)) { criteria.add(new Query.RLike(attributeName, value.toString())); } } @@ -501,12 +507,12 @@ public void handle(Junction criteria, String attributeName, BsonReader queryRead private static List readArrayOfValues(BsonReader queryReader) { List values = new ArrayList(); BsonType bsonType = queryReader.getCurrentBsonType(); - if(bsonType == BsonType.ARRAY) { + if (bsonType == BsonType.ARRAY) { queryReader.readStartArray(); bsonType = queryReader.readBsonType(); - while(bsonType != BsonType.END_OF_DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { Object value = readBsonValue(queryReader, queryReader.getCurrentBsonType()); - if(value instanceof NullObject) { + if (value instanceof NullObject) { value = null; } values.add(value); @@ -519,8 +525,8 @@ private static List readArrayOfValues(BsonReader queryReader) { } private static void parseJunctionDocuments(Junction junction, String attributeName, BsonReader queryReader, BsonType bsonType) { - while(bsonType != BsonType.END_OF_DOCUMENT) { - if(bsonType == BsonType.DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { + if (bsonType == BsonType.DOCUMENT) { parseQueryAttributeValue(queryReader, bsonType, attributeName, junction); } else { @@ -562,7 +568,7 @@ public static Document createBsonQuery(CodecRegistry registry, PersistentEntity public static Document createBsonQuery(CodecRegistry registry, PersistentEntity entity, Junction junction) { EmbeddedQueryEncoder embeddedQueryEncoder = new CodecRegistryEmbeddedQueryEncoder(registry); Document query = new Document(); - if(junction instanceof Conjunction) { + if (junction instanceof Conjunction) { populateBsonQuery(embeddedQueryEncoder, query, junction.getCriteria(), entity); } else { @@ -609,11 +615,11 @@ public static DetachedCriteria parse(Class type, BsonReader queryReade criteria.add(junction); - if(isJunction) { + if (isJunction) { queryReader.readStartArray(); bsonType = queryReader.readBsonType(); - while(bsonType != BsonType.END_OF_DOCUMENT) { - if(bsonType == BsonType.DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { + if (bsonType == BsonType.DOCUMENT) { parseQueryAttributeValue(queryReader, queryReader.getCurrentBsonType(), attributeName, junction); } else { @@ -624,7 +630,7 @@ public static DetachedCriteria parse(Class type, BsonReader queryReade queryReader.readEndArray(); } else { - while(bsonType != BsonType.END_OF_DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { attributeName = queryReader.readName(); bsonType = queryReader.getCurrentBsonType(); parseQueryAttributeValue(queryReader, bsonType, attributeName, junction); @@ -641,10 +647,10 @@ private static BsonType parseQueryAttributeValue(BsonReader queryReader, BsonTyp if (bsonType == BsonType.DOCUMENT) { queryReader.readStartDocument(); bsonType = queryReader.getCurrentBsonType(); - while(bsonType != BsonType.END_OF_DOCUMENT) { + while (bsonType != BsonType.END_OF_DOCUMENT) { String operator = queryReader.readName(); OperatorHandler operatorHandler = operatorHandlers.get(operator); - if(operatorHandler != null) { + if (operatorHandler != null) { operatorHandler.handle(junction, attributeName, queryReader); } else { @@ -655,8 +661,8 @@ private static BsonType parseQueryAttributeValue(BsonReader queryReader, BsonTyp queryReader.readEndDocument(); } else { Object value = readBsonValue(queryReader, bsonType); - if(value != null) { - if(value instanceof NullObject) { + if (value != null) { + if (value instanceof NullObject) { junction.add(new IsNull(attributeName)); } else { @@ -758,14 +764,14 @@ private static void handleLike(PersistentEntity entity, Like like, Document quer * @return The list of native values suitable for passing to Mongo. */ protected static List getInListQueryValues(PersistentEntity entity, In in) { - List values = new ArrayList(in.getValues().size()); + List values = new ArrayList<>(in.getValues().size()); final MappingContext mappingContext = entity.getMappingContext(); for (Object value : in.getValues()) { if (mappingContext.isPersistentEntity(value)) { PersistentEntity pe = mappingContext.getPersistentEntity( value.getClass().getName()); ProxyHandler proxyHandler = mappingContext.getProxyHandler(); - if(proxyHandler.isProxy(value)) { + if (proxyHandler.isProxy(value)) { values.add(proxyHandler.getIdentifier(value)); } else { @@ -842,7 +848,7 @@ protected static void populateBsonQuery(final EmbeddedQueryEncoder queryEncoder, PersistentProperty property = entity.getPropertyByName(pc.getProperty()); if (property instanceof Custom) { CustomTypeMarshaller customTypeMarshaller = ((Custom) property).getCustomTypeMarshaller(); - if(!(customTypeMarshaller instanceof CodecCustomTypeMarshaller)) { + if (!(customTypeMarshaller instanceof CodecCustomTypeMarshaller)) { customTypeMarshaller.query(property, pc, query); continue; } diff --git a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/query/CodecRegistryEmbeddedQueryEncoder.groovy b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/query/CodecRegistryEmbeddedQueryEncoder.groovy index c434abba60e..299a8b47f1f 100644 --- a/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/query/CodecRegistryEmbeddedQueryEncoder.groovy +++ b/grails-data-mongodb/bson/src/main/groovy/org/grails/datastore/bson/query/CodecRegistryEmbeddedQueryEncoder.groovy @@ -23,6 +23,7 @@ import org.bson.BsonDocument import org.bson.BsonDocumentWriter import org.bson.codecs.Codec import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.bson.codecs.BsonPersistentEntityCodec import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.model.types.Embedded @@ -45,11 +46,11 @@ class CodecRegistryEmbeddedQueryEncoder implements EmbeddedQueryEncoder { Object encode(Embedded embedded, Object instance) { PersistentEntity associatedEntity = embedded.associatedEntity Codec codec = codecRegistry.get(associatedEntity.javaClass) - if(codec == null) { + if (codec == null) { codec = new BsonPersistentEntityCodec(codecRegistry, associatedEntity) } - final BsonDocument doc = new BsonDocument(); - codec.encode(new BsonDocumentWriter(doc), instance, BsonQuery.ENCODER_CONTEXT); - return doc; + final BsonDocument doc = new BsonDocument() + codec.encode(new BsonDocumentWriter(doc), instance, BsonQuery.ENCODER_CONTEXT) + return doc } } diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/MongoEntity.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/MongoEntity.groovy index 0dc9b11ef57..67bd62f51ae 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/MongoEntity.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/MongoEntity.groovy @@ -18,16 +18,20 @@ */ package grails.mongodb +import java.util.function.Function + +import groovy.transform.CompileStatic + import com.mongodb.ReadPreference import com.mongodb.client.AggregateIterable import com.mongodb.client.FindIterable import com.mongodb.client.MongoCollection import com.mongodb.client.MongoDatabase import com.mongodb.client.model.FindOneAndDeleteOptions -import grails.mongodb.api.MongoAllOperations -import groovy.transform.CompileStatic import org.bson.Document import org.bson.conversions.Bson + +import grails.mongodb.api.MongoAllOperations import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.GormEntity import org.grails.datastore.gorm.mongo.MongoCriteriaBuilder @@ -40,8 +44,6 @@ import org.grails.datastore.mapping.mongo.AbstractMongoSession import org.grails.datastore.mapping.mongo.MongoDatastore import org.grails.datastore.mapping.mongo.engine.MongoEntityPersister -import java.util.function.Function - /** * Enhances the default {@link GormEntity} class with MongoDB specific methods * @@ -51,7 +53,6 @@ import java.util.function.Function @CompileStatic trait MongoEntity implements GormEntity, DynamicAttributes { - /** * Allows accessing to dynamic properties with the dot operator * @@ -74,7 +75,6 @@ trait MongoEntity implements GormEntity, DynamicAttributes { DynamicAttributes.super.putAt(name, val) } - /** * Return the DBObject instance for the entity * @@ -84,12 +84,12 @@ trait MongoEntity implements GormEntity, DynamicAttributes { */ @Deprecated Document getDbo() { - AbstractMongoSession session = (AbstractMongoSession)AbstractDatastore.retrieveSession(MongoDatastore) + AbstractMongoSession session = (AbstractMongoSession) AbstractDatastore.retrieveSession(MongoDatastore) // check first for embedded cached entries - SessionImplementor si = (SessionImplementor) session; + SessionImplementor si = (SessionImplementor) session def persistentEntity = session.mappingContext.getPersistentEntity(getClass().name) - Document dbo = (Document)si.getCachedEntry(persistentEntity, MongoEntityPersister.createEmbeddedCacheEntryKey(this)) - if(dbo != null) return dbo + Document dbo = (Document) si.getCachedEntry(persistentEntity, MongoEntityPersister.createEmbeddedCacheEntryKey(this)) + if (dbo != null) return dbo // otherwise check if instance is contained within session if (!session.contains(this)) { dbo = new Document() @@ -97,12 +97,12 @@ trait MongoEntity implements GormEntity, DynamicAttributes { return dbo } - EntityPersister persister = (EntityPersister)session.getPersister(this) + EntityPersister persister = (EntityPersister) session.getPersister(this) def id = persister.getObjectIdentifier(this) - dbo = (Document)((SessionImplementor)session).getCachedEntry(persister.getPersistentEntity(), id) + dbo = (Document) ((SessionImplementor)session).getCachedEntry(persister.getPersistentEntity(), id) if (dbo == null) { MongoCollection coll = session.getCollection(persistentEntity) - dbo = coll.find((Bson)new Document(MongoEntityPersister.MONGO_ID_FIELD, id)) + dbo = coll.find((Bson) new Document(MongoEntityPersister.MONGO_ID_FIELD, id)) .limit(1) .first() @@ -280,14 +280,14 @@ trait MongoEntity implements GormEntity, DynamicAttributes { */ static T withConnection(String connectionName, @DelegatesTo(MongoAllOperations)Closure callable) { def staticApi = GormEnhancer.findStaticApi(this, connectionName) - return (T)staticApi.withNewSession { + return (T) staticApi.withNewSession { callable.setDelegate(staticApi) return callable.call() } } private static MongoStaticApi currentMongoStaticApi() { - (MongoStaticApi)GormEnhancer.findStaticApi(this) + (MongoStaticApi) GormEnhancer.findStaticApi(this) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoAllOperations.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoAllOperations.groovy index 6f0a6ad0bb0..2cf03b18811 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoAllOperations.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoAllOperations.groovy @@ -25,5 +25,4 @@ package grails.mongodb.api * @author Graeme Rocher * @since 6.0 */ -interface MongoAllOperations extends MongoInstanceOperations, MongoStaticOperations { -} \ No newline at end of file +interface MongoAllOperations extends MongoInstanceOperations, MongoStaticOperations {} diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoInstanceOperations.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoInstanceOperations.groovy index 9aaab8d0f40..61681a3cd42 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoInstanceOperations.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoInstanceOperations.groovy @@ -19,9 +19,10 @@ package grails.mongodb.api -import grails.gorm.api.GormInstanceOperations import org.bson.Document +import grails.gorm.api.GormInstanceOperations + /** * Instance methods for GORM for MongoDB * @author Graeme Rocher @@ -38,4 +39,4 @@ interface MongoInstanceOperations extends GormInstanceOperations { */ @Deprecated Document getDbo(D instance) -} \ No newline at end of file +} diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoStaticOperations.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoStaticOperations.groovy index 053d7707874..55817cdee31 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoStaticOperations.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/api/MongoStaticOperations.groovy @@ -19,18 +19,19 @@ package grails.mongodb.api +import java.util.function.Function + import com.mongodb.ReadPreference import com.mongodb.client.AggregateIterable import com.mongodb.client.FindIterable import com.mongodb.client.MongoCollection import com.mongodb.client.MongoDatabase import com.mongodb.client.model.FindOneAndDeleteOptions -import grails.gorm.api.GormStaticOperations import org.bson.Document import org.bson.conversions.Bson -import org.grails.datastore.gorm.mongo.MongoCriteriaBuilder -import java.util.function.Function +import grails.gorm.api.GormStaticOperations +import org.grails.datastore.gorm.mongo.MongoCriteriaBuilder /** * Static operations for GORM for MongoDB @@ -93,7 +94,7 @@ interface MongoStaticOperations extends GormStaticOperations { * @param callable The callable * @return The result of the closure */ - public T withCollection(String collectionName, Closure callable) + T withCollection(String collectionName, Closure callable) /** * Use the given collection for this entity for the scope of the session @@ -109,7 +110,7 @@ interface MongoStaticOperations extends GormStaticOperations { * @param callable The callable * @return The result of the closure */ - public T withDatabase(String databaseName, Closure callable) + T withDatabase(String databaseName, Closure callable) /** * Use the given database for this entity for the scope of the session @@ -189,5 +190,5 @@ interface MongoStaticOperations extends GormStaticOperations { * @param limit The maximum number of results. Defaults to 5. * @return The results */ - List searchTop(String query, int limit, Map options ) -} \ No newline at end of file + List searchTop(String query, int limit, Map options) +} diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/bootstrap/MongoDbDataStoreSpringInitializer.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/bootstrap/MongoDbDataStoreSpringInitializer.groovy index 4def13a68f3..46b39854444 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/bootstrap/MongoDbDataStoreSpringInitializer.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/bootstrap/MongoDbDataStoreSpringInitializer.groovy @@ -14,11 +14,20 @@ */ package grails.mongodb.bootstrap +import groovy.transform.CompileStatic +import groovy.transform.InheritConstructors + import com.mongodb.MongoClientSettings import com.mongodb.client.MongoClient + +import org.springframework.beans.factory.support.BeanDefinitionRegistry +import org.springframework.context.ApplicationContext +import org.springframework.context.ApplicationEventPublisher +import org.springframework.context.ConfigurableApplicationContext +import org.springframework.context.support.GenericApplicationContext +import org.springframework.util.ClassUtils + import grails.mongodb.MongoEntity -import groovy.transform.CompileStatic -import groovy.transform.InheritConstructors import org.grails.datastore.gorm.bootstrap.AbstractDatastoreInitializer import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher import org.grails.datastore.gorm.events.DefaultApplicationEventPublisher @@ -28,12 +37,6 @@ import org.grails.datastore.gorm.support.DatastorePersistenceContextInterceptor import org.grails.datastore.mapping.config.DatastoreServiceMethodInvokingFactoryBean import org.grails.datastore.mapping.mongo.MongoDatastore import org.grails.datastore.mapping.mongo.connections.MongoConnectionSourceFactory -import org.springframework.beans.factory.support.BeanDefinitionRegistry -import org.springframework.context.ApplicationContext -import org.springframework.context.ApplicationEventPublisher -import org.springframework.context.ConfigurableApplicationContext -import org.springframework.context.support.GenericApplicationContext -import org.springframework.util.ClassUtils /** * Used to initialize GORM for MongoDB outside of Grails @@ -44,11 +47,11 @@ import org.springframework.util.ClassUtils @InheritConstructors class MongoDbDataStoreSpringInitializer extends AbstractDatastoreInitializer { - public static final String DEFAULT_DATABASE_NAME = "test" + public static final String DEFAULT_DATABASE_NAME = 'test' - public static final String DATASTORE_TYPE = "mongo" - protected String mongoBeanName = "mongo" - protected String mongoOptionsBeanName = "mongoOptions" + public static final String DATASTORE_TYPE = 'mongo' + protected String mongoBeanName = 'mongo' + protected String mongoOptionsBeanName = 'mongoOptions' protected String databaseName = DEFAULT_DATABASE_NAME protected Closure defaultMapping protected MongoClientSettings mongoOptions @@ -83,57 +86,57 @@ class MongoDbDataStoreSpringInitializer extends AbstractDatastoreInitializer { @Override Closure getBeanDefinitions(BeanDefinitionRegistry beanDefinitionRegistry) { return { - def callable = getCommonConfiguration(beanDefinitionRegistry, "mongo") + def callable = getCommonConfiguration(beanDefinitionRegistry, 'mongo') callable.delegate = delegate callable.call() ApplicationEventPublisher eventPublisher - if(beanDefinitionRegistry instanceof ConfigurableApplicationContext){ - eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext)beanDefinitionRegistry) + if (beanDefinitionRegistry instanceof ConfigurableApplicationContext) { + eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext) beanDefinitionRegistry) } - else if(resourcePatternResolver.resourceLoader instanceof ConfigurableApplicationContext) { - eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext)resourcePatternResolver.resourceLoader) + else if (resourcePatternResolver.resourceLoader instanceof ConfigurableApplicationContext) { + eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext) resourcePatternResolver.resourceLoader) } else { eventPublisher = new DefaultApplicationEventPublisher() } - if(mongo == null) { + if (mongo == null) { mongoConnectionSourceFactory(MongoConnectionSourceFactory) { bean -> bean.autowire = true } mongoDatastore(MongoDatastore, configuration, ref('mongoConnectionSourceFactory'), eventPublisher, collectMappedClasses(DATASTORE_TYPE)) - mongo(mongoDatastore:"getMongoClient") + mongo(mongoDatastore: 'getMongoClient') } else { mongoDatastore(MongoDatastore, mongo, configuration, eventPublisher, collectMappedClasses(DATASTORE_TYPE)) } - mongoMappingContext(mongoDatastore:"getMappingContext") + mongoMappingContext(mongoDatastore: 'getMappingContext') if (!secondaryDatastore) { - registerAlias "mongoMappingContext", "grailsDomainClassMappingContext" + registerAlias('mongoMappingContext', 'grailsDomainClassMappingContext') } - mongoTransactionManager(mongoDatastore:"getTransactionManager") - mongoAutoTimestampEventListener(mongoDatastore:"getAutoTimestampEventListener") - mongoPersistenceInterceptor(getPersistenceInterceptorClass(), ref("mongoDatastore")) + mongoTransactionManager(mongoDatastore: 'getTransactionManager') + mongoAutoTimestampEventListener(mongoDatastore: 'getAutoTimestampEventListener') + mongoPersistenceInterceptor(getPersistenceInterceptorClass(), ref('mongoDatastore')) mongoPersistenceContextInterceptorAggregator(PersistenceContextInterceptorAggregator) def transactionManagerBeanName = TRANSACTION_MANAGER_BEAN if (!containsRegisteredBean(delegate, beanDefinitionRegistry, transactionManagerBeanName)) { - beanDefinitionRegistry.registerAlias("mongoTransactionManager", transactionManagerBeanName) + beanDefinitionRegistry.registerAlias('mongoTransactionManager', transactionManagerBeanName) } def classLoader = getClass().getClassLoader() if (beanDefinitionRegistry.containsBeanDefinition('dispatcherServlet') && ClassUtils.isPresent(OSIV_CLASS_NAME, classLoader)) { - String interceptorName = "mongoOpenSessionInViewInterceptor" + String interceptorName = 'mongoOpenSessionInViewInterceptor' "${interceptorName}"(ClassUtils.forName(OSIV_CLASS_NAME, classLoader)) { - datastore = ref("mongoDatastore") + datastore = ref('mongoDatastore') } } - loadDataServices(secondaryDatastore ? "mongo" : null) - .each {serviceName, serviceClass-> + loadDataServices(secondaryDatastore ? 'mongo' : null) + .each { serviceName, serviceClass -> "$serviceName"(DatastoreServiceMethodInvokingFactoryBean, serviceClass) { - targetObject = ref("mongoDatastore") + targetObject = ref('mongoDatastore') targetMethod = 'getService' arguments = [serviceClass] } @@ -142,8 +145,6 @@ class MongoDbDataStoreSpringInitializer extends AbstractDatastoreInitializer { } } - - /** * Sets the name of the Mongo bean to use */ diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Box.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Box.groovy index c8505b1bd2a..8c55d3e00a2 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Box.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Box.groovy @@ -25,7 +25,7 @@ import groovy.transform.EqualsAndHashCode */ @EqualsAndHashCode @CompileStatic -class Box extends Shape{ +class Box extends Shape { final Point lowerLeft, upperRight @@ -59,8 +59,8 @@ class Box extends Shape{ * @return A box */ static Box valueOf(List> coords) { - if(coords.size() != 2) throw new IllegalArgumentException("Coordinates should contain at least 2 entries for a Box") + if (coords.size() != 2) throw new IllegalArgumentException('Coordinates should contain at least 2 entries for a Box') - new Box( Point.getPointAtIndex(coords, 0), Point.getPointAtIndex(coords, 1) ) + new Box(Point.getPointAtIndex(coords, 0), Point.getPointAtIndex(coords, 1)) } } diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Circle.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Circle.groovy index e3706935d61..092f5be995b 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Circle.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Circle.groovy @@ -16,6 +16,7 @@ package grails.mongodb.geo import groovy.transform.CompileStatic import groovy.transform.EqualsAndHashCode + import org.springframework.util.Assert /** @@ -26,7 +27,8 @@ import org.springframework.util.Assert */ @EqualsAndHashCode @CompileStatic -class Circle extends Shape{ +class Circle extends Shape { + /** * The center of the circle */ @@ -42,7 +44,7 @@ class Circle extends Shape{ * @param radius The radius in meters */ Circle(Point center, double radius) { - Assert.notNull(center, "Argument center cannot be null") + Assert.notNull(center, 'Argument center cannot be null') this.center = center this.radius = radius } @@ -62,15 +64,15 @@ class Circle extends Shape{ * @return The Circle instance */ static Circle valueOf(List coords) { - if(coords.size() < 2) throw new IllegalArgumentException("Coordinates should contain at least 2 entries for a Circle: The center point and the radius") + if (coords.size() < 2) throw new IllegalArgumentException('Coordinates should contain at least 2 entries for a Circle: The center point and the radius') Point center = Point.getPointAtIndex(coords, 0) def ro = coords.get(1) Number radius = null - if(ro instanceof Number) + if (ro instanceof Number) radius = (Number) ro - if(center && radius != null) { + if (center && radius != null) { return new Circle(center, radius.doubleValue()) } else { diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/GeoJSON.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/GeoJSON.groovy index 5b3b6d403cc..1950bc989f3 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/GeoJSON.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/GeoJSON.groovy @@ -20,12 +20,12 @@ package grails.mongodb.geo * @author Graeme Rocher * @since 2.0 */ -public interface GeoJSON { +interface GeoJSON { /** * Converts the GeoJSON shape into a coordinate list * * @return The coordinate list */ - abstract List asList(); -} \ No newline at end of file + abstract List asList() +} diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/GeometryCollection.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/GeometryCollection.groovy index 9554dc4f850..475827b64cb 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/GeometryCollection.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/GeometryCollection.groovy @@ -14,7 +14,6 @@ */ package grails.mongodb.geo -import groovy.transform.CompileStatic import org.grails.datastore.gorm.mongo.geo.GeoJSONType /** @@ -25,11 +24,12 @@ import org.grails.datastore.gorm.mongo.geo.GeoJSONType */ class GeometryCollection extends ArrayList implements GeoJSON { + @Override List asList() { collect() { GeoJSON current -> GeoJSONType.convertToGeoDocument( - (Shape)current) + (Shape) current) } } @@ -37,11 +37,11 @@ class GeometryCollection extends ArrayList implements GeoJSON { def col = new GeometryCollection() def classLoader = GeometryCollection.classLoader - for(geo in geometries) { - if(geo instanceof Map) { + for (geo in geometries) { + if (geo instanceof Map) { String type = geo.type?.toString() def coordinates = geo.coordinates - if(type && coordinates) { + if (type && coordinates) { col << classLoader.loadClass("grails.mongodb.geo.$type").valueOf(coordinates) } } diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/LineString.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/LineString.groovy index b18f51fdc2f..6aa38cdbb51 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/LineString.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/LineString.groovy @@ -25,7 +25,8 @@ import groovy.transform.EqualsAndHashCode */ @CompileStatic @EqualsAndHashCode -class LineString extends Shape implements GeoJSON{ +class LineString extends Shape implements GeoJSON { + /** * The points that constitute the LineString */ @@ -37,8 +38,8 @@ class LineString extends Shape implements GeoJSON{ * @param points The {@link Point} instances. Must be at least 2 points. */ LineString(Point...points) { - if(points.size() < 2) - throw new IllegalArgumentException("At least 2 points required for a LineString") + if (points.size() < 2) + throw new IllegalArgumentException('At least 2 points required for a LineString') this.coordinates = points.toList() } @@ -49,7 +50,7 @@ class LineString extends Shape implements GeoJSON{ */ @Override List> asList() { - coordinates.collect() { Point p -> p.asList()} + coordinates.collect() { Point p -> p.asList() } } @Override @@ -62,14 +63,14 @@ class LineString extends Shape implements GeoJSON{ * @param coords The coordinates, which should be a list of {@link Point} instances or lists containing x and y values * @return A LineString */ - public static LineString valueOf(List coords) { - if(coords.size() < 2) throw new IllegalArgumentException("Coordinates should contain at least 2 entries for a LineString") + static LineString valueOf(List coords) { + if (coords.size() < 2) throw new IllegalArgumentException('Coordinates should contain at least 2 entries for a LineString') List points = (List) coords.collect() { - if(it instanceof Point) { + if (it instanceof Point) { return it } - else if(it instanceof List) { + else if (it instanceof List) { return Point.valueOf((List)it) } throw new IllegalArgumentException("Invalid coordinates: $coords") diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Metric.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Metric.groovy index 06d45d4b6be..05e53bfb303 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Metric.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Metric.groovy @@ -25,7 +25,8 @@ import groovy.transform.EqualsAndHashCode */ @EqualsAndHashCode @CompileStatic -public class Metric { +class Metric { + /** the radius of the earth in kilometers **/ static Metric KILOMETERS = new Metric(6378.137d) /** the radius of the earth in miles **/ @@ -42,4 +43,4 @@ public class Metric { Metric(double multiplier) { this.multiplier = multiplier } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiLineString.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiLineString.groovy index 40a2a6509a4..4fa48b43f19 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiLineString.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiLineString.groovy @@ -16,6 +16,7 @@ package grails.mongodb.geo import groovy.transform.CompileStatic import groovy.transform.EqualsAndHashCode + import org.springframework.util.Assert /** @@ -28,7 +29,8 @@ import org.springframework.util.Assert */ @CompileStatic @EqualsAndHashCode -class MultiLineString extends Shape implements GeoJSON{ +class MultiLineString extends Shape implements GeoJSON { + final List coordinates MultiLineString(LineString... coordinates) { @@ -52,10 +54,10 @@ class MultiLineString extends Shape implements GeoJSON{ static MultiLineString valueOf(List coords) { List lineStrings = (List) coords.collect() { - if(it instanceof LineString) { + if (it instanceof LineString) { return it } - else if(it instanceof List) { + else if (it instanceof List) { return LineString.valueOf((List)it) } throw new IllegalArgumentException("Invalid coordinates: $coords") diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiPoint.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiPoint.groovy index 4e88664acb4..ab729f8f589 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiPoint.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiPoint.groovy @@ -27,7 +27,8 @@ import groovy.transform.EqualsAndHashCode */ @CompileStatic @EqualsAndHashCode -class MultiPoint extends Shape implements GeoJSON{ +class MultiPoint extends Shape implements GeoJSON { + final List positions MultiPoint(Point... positions) { @@ -48,12 +49,12 @@ class MultiPoint extends Shape implements GeoJSON{ positions.toString() } - public static MultiPoint valueOf(List coords) { + static MultiPoint valueOf(List coords) { List points = (List) coords.collect() { - if(it instanceof Point) { + if (it instanceof Point) { return it } - else if(it instanceof List) { + else if (it instanceof List) { return Point.valueOf((List)it) } throw new IllegalArgumentException("Invalid coordinates: $coords") diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiPolygon.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiPolygon.groovy index b81fa9b4a2e..b0c194355b4 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiPolygon.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/MultiPolygon.groovy @@ -28,6 +28,7 @@ import groovy.transform.EqualsAndHashCode @CompileStatic @EqualsAndHashCode class MultiPolygon extends Shape implements GeoJSON { + final List polygons MultiPolygon(Polygon...polygons) { @@ -44,10 +45,10 @@ class MultiPolygon extends Shape implements GeoJSON { static MultiPolygon valueOf(List coords) { List polygons = (List) coords.collect() { - if(it instanceof Polygon) { + if (it instanceof Polygon) { return it } - else if(it instanceof List) { + else if (it instanceof List) { return Polygon.valueOf((List)it) } throw new IllegalArgumentException("Invalid coordinates: $coords") diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Point.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Point.groovy index bc76ba0beb9..71f0af692ea 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Point.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Point.groovy @@ -25,7 +25,8 @@ import groovy.transform.EqualsAndHashCode */ @EqualsAndHashCode @CompileStatic -class Point extends Shape implements GeoJSON{ +class Point extends Shape implements GeoJSON { + /** * The x and y values that indicate the location of the point */ @@ -44,7 +45,7 @@ class Point extends Shape implements GeoJSON{ /** * @return An array representation of the point */ - double[] asArray() { [x,y] as double[] } + double[] asArray() { [x, y] as double[] } /** * @return A list representation of the point @@ -72,10 +73,10 @@ class Point extends Shape implements GeoJSON{ * @return A Point */ static Point valueOf(List coords) { - if(coords.size() == 2) { + if (coords.size() == 2) { def x = coords.get(0) def y = coords.get(1) - if((x instanceof Number) && (y instanceof Number)) { + if ((x instanceof Number) && (y instanceof Number)) { return new Point(x.doubleValue(), y.doubleValue()) } } @@ -89,13 +90,13 @@ class Point extends Shape implements GeoJSON{ * @param index The index of the point * @return A Point */ - static Point getPointAtIndex( List coords, int index ) { + static Point getPointAtIndex(List coords, int index) { def coord = coords.get(index) - if(coord instanceof Point) { - return (Point)coord + if (coord instanceof Point) { + return (Point) coord } - else if(coord instanceof List) { - return valueOf( (List) coord ) + else if (coord instanceof List) { + return valueOf((List) coord) } throw new IllegalArgumentException("Invalid coordinates: $coords") } diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Polygon.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Polygon.groovy index b3df5ae04b1..02f99e2ddc4 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Polygon.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Polygon.groovy @@ -16,6 +16,7 @@ package grails.mongodb.geo import groovy.transform.CompileStatic import groovy.transform.EqualsAndHashCode + import org.springframework.util.Assert /** @@ -24,7 +25,7 @@ import org.springframework.util.Assert */ @CompileStatic @EqualsAndHashCode -class Polygon extends Shape implements GeoJSON{ +class Polygon extends Shape implements GeoJSON { /** * The {@link Point} instances that constitute the Polygon @@ -40,18 +41,18 @@ class Polygon extends Shape implements GeoJSON{ * @param others The remaining {@link Point} instances */ Polygon(Point x, Point y, Point z, Point...others) { - Assert.notNull(x, "Point x is required") - Assert.notNull(y, "Point y is required") - Assert.notNull(z, "Point z is required") - Assert.notNull(others, "Point others is required") + Assert.notNull(x, 'Point x is required') + Assert.notNull(y, 'Point y is required') + Assert.notNull(z, 'Point z is required') + Assert.notNull(others, 'Point others is required') List list = [] - list.addAll Arrays.asList(x, y, z) - list.addAll others + list.addAll(Arrays.asList(x, y, z)) + list.addAll(others) this.points = [list] } - private Polygon(List> points){ + private Polygon(List> points) { this.points = points } @@ -61,9 +62,9 @@ class Polygon extends Shape implements GeoJSON{ * * @return The list */ - public List>> asList() { - points.collect() { List ring -> - ring.collect { Point p -> + List>> asList() { + points.collect() { List ring -> + ring.collect { Point p -> p.asList() } } @@ -80,68 +81,66 @@ class Polygon extends Shape implements GeoJSON{ * @return A Polygon */ static Polygon valueOf(List coords) { - Assert.notNull(coords, "Argument coords cannot be null") - - + Assert.notNull(coords, 'Argument coords cannot be null') /* - * Search for list type - it could be + * Search for list type - it could be * (1) List - a single ring polygon * (2) List> - a single ring with list as long/lat/alt * (3) List - a multi-ring polygon * (4) List - a multi-ring polygon with list as long/lat/alt */ - try - { - if(coords[0] instanceof Point){ - return new Polygon( [fromSingleCoordsList(coords)] ) // case (1) above - } - else if(coords[0] instanceof List ) - { - if( ((List)coords[0])[0] instanceof Number) { - return new Polygon( [fromSingleCoordsList(coords)] ) // case (2) above + try + { + if (coords[0] instanceof Point) { + return new Polygon([fromSingleCoordsList(coords)]) // case (1) above + } + else if (coords[0] instanceof List) + { + if (((List) coords[0])[0] instanceof Number) { + return new Polygon([fromSingleCoordsList(coords)]) // case (2) above } - else if( ((List)coords[0])[0] instanceof Point){ - return new Polygon( coords.collect { poly_ring -> + else if (((List) coords[0])[0] instanceof Point) { + return new Polygon(coords.collect { poly_ring -> // each is a List - return fromSingleCoordsList((List)poly_ring) + return fromSingleCoordsList((List) poly_ring) }) // case (3) above } - else if( ((List)coords[0])[0] instanceof List && ((List)((List)coords[0])[0])[0] instanceof Number ){ - return new Polygon( coords.collect { poly_ring -> + else if (((List) coords[0])[0] instanceof List && ((List) ((List)coords[0])[0])[0] instanceof Number) { + return new Polygon(coords.collect { poly_ring -> // each is a List - return fromSingleCoordsList((List>)poly_ring) - } ) // case (4) above + return fromSingleCoordsList((List>) poly_ring) + }) // case (4) above } else { - throw new IllegalArgumentException("Coordinate list must be Points or number-lists") + throw new IllegalArgumentException('Coordinate list must be Points or number-lists') } - } - else { - throw new IllegalArgumentException("Coordinate list must be Points or number-lists") - } - } - catch(IndexOutOfBoundsException ioobe){ - throw new IllegalArgumentException("Coordinate lists cannot be empty") - } - + } + else { + throw new IllegalArgumentException('Coordinate list must be Points or number-lists') + } + } + catch (IndexOutOfBoundsException ioobe) { + throw new IllegalArgumentException('Coordinate lists cannot be empty') + } + } /** * A single ring. This could be a list of Point objects or a List points as number lists. - * E.g. List or List> + * E.g. List or List> */ private static List fromSingleCoordsList(List coords) { - Assert.notNull(coords, "Argument coords cannot be null") + Assert.notNull(coords, 'Argument coords cannot be null') - if(coords.size() < 4) throw new IllegalArgumentException("Coordinates should contain at least 4 entries for a Polygon") + if (coords.size() < 4) throw new IllegalArgumentException('Coordinates should contain at least 4 entries for a Polygon') return coords.collect { - if(it instanceof Point) { - return (Point)it + if (it instanceof Point) { + return (Point) it } - else if(it instanceof List) { - return Point.valueOf((List)it) + else if (it instanceof List) { + return Point.valueOf((List) it) } else { throw new IllegalArgumentException("Invalid coordinates: $coords") diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Shape.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Shape.groovy index b106c942de2..7820e2cda6a 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Shape.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Shape.groovy @@ -20,12 +20,12 @@ package grails.mongodb.geo * @author Graeme Rocher * @since 2.0 */ -public abstract class Shape { +abstract class Shape { /** * Converts the Shape into a coordinate list * * @return The coordinate list */ - abstract List asList(); -} \ No newline at end of file + abstract List asList() +} diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Sphere.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Sphere.groovy index a7f74e774be..52f02434761 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Sphere.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/geo/Sphere.groovy @@ -26,7 +26,7 @@ import groovy.transform.EqualsAndHashCode */ @EqualsAndHashCode @CompileStatic -class Sphere extends Shape{ +class Sphere extends Shape { /** * The center of there sphere @@ -55,7 +55,7 @@ class Sphere extends Shape{ */ @Override List asList() { - [ center.asList(), distance.inRadians() ] + [center.asList(), distance.inRadians()] } /** @@ -66,17 +66,17 @@ class Sphere extends Shape{ * * @return A Sphere */ - static Sphere valueOf( List coords, Metric metric = Metric.NEUTRAL) { - if(coords.size() < 2) throw new IllegalArgumentException("Coordinates should contain at least 2 entries for a Sphere: The center point and the distance") + static Sphere valueOf(List coords, Metric metric = Metric.NEUTRAL) { + if (coords.size() < 2) throw new IllegalArgumentException('Coordinates should contain at least 2 entries for a Sphere: The center point and the distance') Point center = Point.getPointAtIndex(coords, 0) def ro = coords.get(1) Double distance = null - if(ro instanceof Number) + if (ro instanceof Number) distance = ((Number) ro).doubleValue() - if(center && distance != null) { - return new Sphere(center, Distance.valueOf(distance, metric) ) + if (center && distance != null) { + return new Sphere(center, Distance.valueOf(distance, metric)) } else { throw new IllegalArgumentException("Invalid Sphere coordinates: $coords") diff --git a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/mapping/MappingBuilder.groovy b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/mapping/MappingBuilder.groovy index ddcaaaab892..5a197893987 100644 --- a/grails-data-mongodb/core/src/main/groovy/grails/mongodb/mapping/MappingBuilder.groovy +++ b/grails-data-mongodb/core/src/main/groovy/grails/mongodb/mapping/MappingBuilder.groovy @@ -20,6 +20,7 @@ package grails.mongodb.mapping import groovy.transform.CompileStatic + import org.grails.datastore.mapping.config.MappingDefinition import org.grails.datastore.mapping.mongo.config.MongoAttribute import org.grails.datastore.mapping.mongo.config.MongoCollection @@ -59,7 +60,7 @@ class MappingBuilder { @Override MongoCollection build() { - if(mapping == null) { + if (mapping == null) { MongoCollection nc = new MongoCollection() mapping = MongoCollection.configureExisting(nc, definition) } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/GeoIntersects.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/GeoIntersects.groovy index 9215291e997..50b5b80c225 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/GeoIntersects.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/GeoIntersects.groovy @@ -14,11 +14,12 @@ */ package org.grails.datastore.gorm.mongo +import org.springframework.util.Assert + import grails.mongodb.geo.GeoJSON import org.grails.datastore.gorm.finders.MethodExpression import org.grails.datastore.mapping.mongo.query.MongoQuery import org.grails.datastore.mapping.query.Query -import org.springframework.util.Assert /** * Dynamic finder extension for GeoIntersects style queries @@ -26,25 +27,25 @@ import org.springframework.util.Assert * @author Graeme Rocher * @since 2.0 */ -class GeoIntersects extends MethodExpression{ +class GeoIntersects extends MethodExpression { + GeoIntersects(Class targetClass, String propertyName) { super(targetClass, propertyName) } @Override Query.Criterion createCriterion() { - return new MongoQuery.GeoIntersects(propertyName, arguments[0]); + return new MongoQuery.GeoIntersects(propertyName, arguments[0]) } @Override void setArguments(Object[] arguments) { - Assert.isTrue arguments.length == 1, "Exactly 1 argument required to GeoWithin query" - + Assert.isTrue(arguments.length == 1, 'Exactly 1 argument required to GeoWithin query') def value = arguments[0] - Assert.isTrue( (value instanceof Map) || (( value instanceof GeoJSON) ), - "Argument must be either a Map or a GeoJSON shape (Polygon, LineString or Point)") + Assert.isTrue((value instanceof Map) || ((value instanceof GeoJSON)), + 'Argument must be either a Map or a GeoJSON shape (Polygon, LineString or Point)') super.setArguments(arguments) } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/GeoWithin.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/GeoWithin.groovy index 0bcc024434f..c4ae00b1685 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/GeoWithin.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/GeoWithin.groovy @@ -14,14 +14,16 @@ */ package org.grails.datastore.gorm.mongo +import groovy.transform.CompileStatic + +import org.springframework.util.Assert + import grails.mongodb.geo.LineString import grails.mongodb.geo.Point import grails.mongodb.geo.Shape -import groovy.transform.CompileStatic import org.grails.datastore.gorm.finders.MethodExpression import org.grails.datastore.mapping.mongo.query.MongoQuery import org.grails.datastore.mapping.query.Query -import org.springframework.util.Assert /** * Dynamic finder extension for GeoWithin style queries @@ -31,24 +33,24 @@ import org.springframework.util.Assert */ @CompileStatic class GeoWithin extends MethodExpression { + GeoWithin(Class targetClass, String propertyName) { super(targetClass, propertyName) } @Override Query.Criterion createCriterion() { - return new MongoQuery.GeoWithin(propertyName, arguments[0]); + return new MongoQuery.GeoWithin(propertyName, arguments[0]) } @Override void setArguments(Object[] arguments) { - Assert.isTrue arguments.length == 1, "Exactly 1 argument required to GeoWithin query" - + Assert.isTrue(arguments.length == 1, 'Exactly 1 argument required to GeoWithin query') def value = arguments[0] - Assert.isTrue( (value instanceof Map) || (( value instanceof Shape) && !((value instanceof LineString) || (value instanceof Point))), - "Argument must be either a Box, Circle, Polygon or Sphere") + Assert.isTrue((value instanceof Map) || ((value instanceof Shape) && !((value instanceof LineString) || (value instanceof Point))), + 'Argument must be either a Box, Circle, Polygon or Sphere') super.setArguments(arguments) } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoCriteriaBuilder.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoCriteriaBuilder.java index e4ba722c207..dfee8c48f0a 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoCriteriaBuilder.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoCriteriaBuilder.java @@ -15,11 +15,10 @@ package org.grails.datastore.gorm.mongo; -import grails.gorm.CriteriaBuilder; - import java.util.List; import java.util.Map; +import grails.gorm.CriteriaBuilder; import grails.mongodb.geo.Distance; import grails.mongodb.geo.GeoJSON; import grails.mongodb.geo.Point; @@ -28,8 +27,8 @@ import org.grails.datastore.mapping.mongo.query.MongoQuery; import org.grails.datastore.mapping.mongo.query.MongoQuery.Near; import org.grails.datastore.mapping.mongo.query.MongoQuery.WithinBox; -import org.grails.datastore.mapping.mongo.query.MongoQuery.WithinPolygon; import org.grails.datastore.mapping.mongo.query.MongoQuery.WithinCircle; +import org.grails.datastore.mapping.mongo.query.MongoQuery.WithinPolygon; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.api.Criteria; import org.grails.datastore.mapping.query.api.QueryArgumentsAware; @@ -206,6 +205,7 @@ public Criteria nearSphere(String property, Point value, Distance maxDistance) { addToCriteria(new MongoQuery.NearSphere(property, value, maxDistance)); return this; } + /** * Geospacial query for values within a given box. A box is defined as a multi-dimensional list in the form * @@ -278,7 +278,7 @@ public Criteria geoIntersects(String property, GeoJSON shape) { } public Criteria arguments(Map arguments) { - ((QueryArgumentsAware)this.query).setArguments(arguments); + ((QueryArgumentsAware) this.query).setArguments(arguments); return this; } } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoEntityTraitProvider.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoEntityTraitProvider.groovy index fa5aae32aa6..1fffb1ada87 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoEntityTraitProvider.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoEntityTraitProvider.groovy @@ -18,12 +18,12 @@ */ package org.grails.datastore.gorm.mongo -import grails.mongodb.MongoEntity import groovy.transform.CompileStatic + +import grails.mongodb.MongoEntity import org.grails.compiler.gorm.GormEntityTraitProvider import org.grails.datastore.mapping.reflect.ClassUtils - /** * Tells GORM to use the {@link MongoEntity} trait for Mongo entities * @@ -32,7 +32,8 @@ import org.grails.datastore.mapping.reflect.ClassUtils */ @CompileStatic class MongoEntityTraitProvider implements GormEntityTraitProvider { + final Class entityTrait = MongoEntity - final boolean available = ClassUtils.isPresent("com.mongodb.client.MongoClient") + final boolean available = ClassUtils.isPresent('com.mongodb.client.MongoClient') } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoGormEnhancer.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoGormEnhancer.groovy index 0c3b0a74b53..afe9b8e2aa4 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoGormEnhancer.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/MongoGormEnhancer.groovy @@ -19,12 +19,14 @@ package org.grails.datastore.gorm.mongo import groovy.transform.CompileStatic + +import org.springframework.transaction.PlatformTransactionManager + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.finders.DynamicFinder -import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.mongo.MongoDatastore import org.grails.datastore.mapping.mongo.connections.MongoConnectionSourceSettings -import org.springframework.transaction.PlatformTransactionManager + /** * GORM enhancer for Mongo. * diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/Near.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/Near.java index 585f5aca8e2..b6be51e17ae 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/Near.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/Near.java @@ -21,12 +21,13 @@ import java.util.List; import java.util.Map; +import org.springframework.util.Assert; + import grails.mongodb.geo.Distance; import grails.mongodb.geo.Point; import org.grails.datastore.gorm.finders.MethodExpression; import org.grails.datastore.mapping.mongo.query.MongoQuery; import org.grails.datastore.mapping.query.Query.Criterion; -import org.springframework.util.Assert; public class Near extends MethodExpression { @@ -38,13 +39,13 @@ public Near(Class targetClass, String propertyName) { public Criterion createCriterion() { MongoQuery.Near near = new MongoQuery.Near(propertyName, arguments[0]); - if(arguments.length > 1) { + if (arguments.length > 1) { Object o = arguments[1]; - if(o instanceof Number) { + if (o instanceof Number) { near.setMaxDistance(Distance.valueOf(((Number) o).doubleValue())); } else { - near.setMaxDistance((Distance)o); + near.setMaxDistance((Distance) o); } } return near; @@ -52,15 +53,15 @@ public Criterion createCriterion() { @Override public void setArguments(Object[] arguments) { - Assert.isTrue(arguments.length > 0 , + Assert.isTrue(arguments.length > 0, "Missing required arguments to findBy*Near query"); Object arg1 = arguments[0]; - Assert.isTrue(((arg1 instanceof Point) || (arg1 instanceof Map) || (arg1 instanceof List)) , + Assert.isTrue(((arg1 instanceof Point) || (arg1 instanceof Map) || (arg1 instanceof List)), "Argument to findBy*Near should either be a Point, coordinate List or a Map"); - if(arguments.length>1) { + if (arguments.length > 1) { Object arg2 = arguments[1]; Assert.isTrue(((arg2 instanceof Number) || (arg2 instanceof Distance)), "Second argument to findBy*Near should either the distance: either a number or an instanceof Distance"); diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/NearSphere.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/NearSphere.java index 9178fde6b72..48373173b23 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/NearSphere.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/NearSphere.java @@ -24,7 +24,7 @@ * @author Graeme Rocher * @since 2.0 */ -public class NearSphere extends Near{ +public class NearSphere extends Near { public NearSphere(Class targetClass, String propertyName) { super(targetClass, propertyName); } @@ -33,13 +33,13 @@ public NearSphere(Class targetClass, String propertyName) { public Query.Criterion createCriterion() { MongoQuery.NearSphere near = new MongoQuery.NearSphere(propertyName, arguments[0]); - if(arguments.length > 1) { + if (arguments.length > 1) { Object o = arguments[1]; - if(o instanceof Number) { + if (o instanceof Number) { near.setMaxDistance(Distance.valueOf(((Number) o).doubleValue())); } else { - near.setMaxDistance((Distance)o); + near.setMaxDistance((Distance) o); } } return near; diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinBox.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinBox.java index 2c47aa63f51..c5a45ef9ef8 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinBox.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinBox.java @@ -18,11 +18,12 @@ import java.util.Collection; import java.util.List; +import org.springframework.util.Assert; + import grails.mongodb.geo.Box; import org.grails.datastore.gorm.finders.MethodExpression; import org.grails.datastore.mapping.mongo.query.MongoQuery; import org.grails.datastore.mapping.query.Query.Criterion; -import org.springframework.util.Assert; /** * Dynamic finder expression for within box queries @@ -39,8 +40,8 @@ public WithinBox(Class targetClass, String propertyName) { @Override public Criterion createCriterion() { Object argument = arguments[0]; - if(argument instanceof Box) { - return new MongoQuery.WithinBox(propertyName, ((Box)argument).asList()); + if (argument instanceof Box) { + return new MongoQuery.WithinBox(propertyName, ((Box) argument).asList()); } else { return new MongoQuery.WithinBox(propertyName, (List) argument); @@ -58,7 +59,7 @@ public void setArguments(Object[] arguments) { Assert.isTrue((isList || (arg instanceof Box)), "Only a list of elements is supported in a 'withinBox' query"); - if(isList) { + if (isList) { Collection argument = (Collection) arg; Assert.isTrue(argument.size() == 2, "A 'withinBox' query requires a two dimensional list of values"); diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinCircle.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinCircle.java index 24f0d2cddbc..eb273eba4c4 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinCircle.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinCircle.java @@ -22,11 +22,12 @@ import java.util.Collection; import java.util.List; +import org.springframework.util.Assert; + import grails.mongodb.geo.Circle; import org.grails.datastore.gorm.finders.MethodExpression; import org.grails.datastore.mapping.mongo.query.MongoQuery; import org.grails.datastore.mapping.query.Query.Criterion; -import org.springframework.util.Assert; /** * A dynamic finder method expression that adds the ability to query within a circle @@ -43,8 +44,8 @@ public WithinCircle(Class targetClass, String propertyName) { @Override public Criterion createCriterion() { Object argument = arguments[0]; - if(argument instanceof Circle) { - return new MongoQuery.WithinCircle(propertyName, ((Circle)argument).asList()); + if (argument instanceof Circle) { + return new MongoQuery.WithinCircle(propertyName, ((Circle) argument).asList()); } else { return new MongoQuery.WithinCircle(propertyName, (List) argument); @@ -62,7 +63,7 @@ public void setArguments(Object[] arguments) { Assert.isTrue((isList || (arg instanceof Circle)), "Only a list of elements is supported in a 'withinBox' query"); - if(isList) { + if (isList) { Collection argument = (Collection) arguments[0]; Assert.isTrue(argument.size() == 2, "A 'WithinCircle' query requires a two dimensional list of values"); diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinPolygon.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinPolygon.java index a8c0721a98a..7b902cc6d14 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinPolygon.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/WithinPolygon.java @@ -22,10 +22,11 @@ import java.util.Collection; import java.util.List; +import org.springframework.util.Assert; + import org.grails.datastore.gorm.finders.MethodExpression; import org.grails.datastore.mapping.mongo.query.MongoQuery; import org.grails.datastore.mapping.query.Query.Criterion; -import org.springframework.util.Assert; /** * Dynamic finder expression for within polygon queries diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/api/MongoStaticApi.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/api/MongoStaticApi.groovy index f7bcca637c8..23bb598b3e0 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/api/MongoStaticApi.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/api/MongoStaticApi.groovy @@ -19,6 +19,10 @@ package org.grails.datastore.gorm.mongo.api +import java.util.function.Function + +import groovy.transform.CompileStatic + import com.mongodb.ReadPreference import com.mongodb.client.AggregateIterable import com.mongodb.client.FindIterable @@ -30,12 +34,14 @@ import com.mongodb.client.model.Filters import com.mongodb.client.model.FindOneAndDeleteOptions import com.mongodb.client.model.Projections import com.mongodb.client.model.TextSearchOptions +import org.bson.Document +import org.bson.conversions.Bson + +import org.springframework.transaction.PlatformTransactionManager + import grails.gorm.multitenancy.Tenants import grails.mongodb.MongoEntity import grails.mongodb.api.MongoAllOperations -import groovy.transform.CompileStatic -import org.bson.Document -import org.bson.conversions.Bson import org.grails.datastore.gorm.GormStaticApi import org.grails.datastore.gorm.finders.FinderMethod import org.grails.datastore.gorm.mongo.MongoCriteriaBuilder @@ -48,9 +54,6 @@ import org.grails.datastore.mapping.mongo.MongoCodecSession import org.grails.datastore.mapping.mongo.MongoDatastore import org.grails.datastore.mapping.mongo.query.MongoQuery import org.grails.datastore.mapping.multitenancy.MultiTenancySettings -import org.springframework.transaction.PlatformTransactionManager - -import java.util.function.Function /** * MongoDB static API implementation @@ -102,7 +105,7 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations + (MongoCriteriaBuilder) withSession { Session session -> def entity = session.mappingContext.getPersistentEntity(persistentClass.name) return new MongoCriteriaBuilder(entity.javaClass, session) } @@ -110,7 +113,7 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations + (MongoDatabase) withSession({ AbstractMongoSession session -> def databaseName = session.getDatabase(session.mappingContext.getPersistentEntity(persistentClass.name)) session.getNativeInterface() .getDatabase(databaseName) @@ -120,7 +123,7 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations + (String) withSession({ AbstractMongoSession session -> def entity = session.mappingContext.getPersistentEntity(persistentClass.name) return session.getCollectionName(entity) }) @@ -128,7 +131,7 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations getCollection() { - (MongoCollection)withSession { AbstractMongoSession session -> + (MongoCollection) withSession { AbstractMongoSession session -> def entity = session.mappingContext.getPersistentEntity(persistentClass.name) return session.getCollection(entity) } @@ -188,10 +191,10 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations aggregate(List pipeline, Function doWithAggregate = Function.identity()) { - (List)withSession( { AbstractMongoSession session -> + (List) withSession({ AbstractMongoSession session -> def persistentEntity = session.mappingContext.getPersistentEntity(persistentClass.name) def mongoCollection = session.getCollection(persistentEntity) - if(session instanceof MongoCodecSession) { + if (session instanceof MongoCodecSession) { MongoDatastore datastore = (MongoDatastore)session.getDatastore() mongoCollection = mongoCollection .withDocumentClass(persistentEntity.javaClass) @@ -204,13 +207,12 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations aggregate(List pipeline, Function doWithAggregate, ReadPreference readPreference) { - (List)withSession( { AbstractMongoSession session -> + (List) withSession({ AbstractMongoSession session -> def persistentEntity = session.mappingContext.getPersistentEntity(persistentClass.name) List newPipeline = preparePipeline(pipeline) def mongoCollection = session.getCollection(persistentEntity) @@ -220,22 +222,22 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations search(String query, Map options = Collections.emptyMap()) { - (List)withSession( { AbstractMongoSession session -> + (List) withSession({ AbstractMongoSession session -> def persistentEntity = session.mappingContext.getPersistentEntity(persistentClass.name) def coll = session.getCollection(persistentEntity) - if(session instanceof MongoCodecSession) { + if (session instanceof MongoCodecSession) { MongoDatastore datastore = (MongoDatastore)session.datastore coll = coll .withDocumentClass(persistentEntity.javaClass) .withCodecRegistry(datastore.codecRegistry) } Bson search - if(options.language) { + if (options.language) { search = Filters.text(query, new TextSearchOptions().language(options.language.toString())) } else { @@ -246,19 +248,19 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations 0) cursor.skip(offset) - if(max > -1) cursor.limit(max) + if (offset > 0) cursor.skip(offset) + if (max > -1) cursor.limit(max) new MongoQuery.MongoResultList(cursor.iterator(), offset, (EntityPersister)session.getPersister(persistentEntity)) - } ) + }) } @Override List searchTop(String query, int limit = 5, Map options = Collections.emptyMap()) { - (List)withSession( { AbstractMongoSession session -> + (List) withSession({ AbstractMongoSession session -> def persistentEntity = session.mappingContext.getPersistentEntity(persistentClass.name) MongoCollection coll = session.getCollection(persistentEntity) - if(session instanceof MongoCodecSession) { + if (session instanceof MongoCodecSession) { MongoDatastore datastore = (MongoDatastore)session.datastore coll = coll .withDocumentClass(persistentEntity.javaClass) @@ -267,15 +269,14 @@ class MongoStaticApi extends GormStaticApi implements MongoAllOperations extends GormStaticApi implements MongoAllOperations extends AbstractMappingAwareCustomTypeMarshaller{ +abstract class AbstractShapeCoordsType extends AbstractMappingAwareCustomTypeMarshaller { + AbstractShapeCoordsType(Class targetType) { super(targetType) } @Override boolean supports(MappingContext context) { - return context instanceof MongoMappingContext; + return context instanceof MongoMappingContext } @Override boolean supports(Datastore datastore) { - return datastore instanceof MongoDatastore; + return datastore instanceof MongoDatastore } @Override protected Object writeInternal(PersistentProperty property, String key, T value, Document nativeTarget) { - if(value) { + if (value) { def coords = value.asList() nativeTarget.put(key, coords) return coords } } - @Override protected void queryInternal(PersistentProperty property, String key, Query.PropertyCriterion criterion, Document nativeQuery) { - if(criterion instanceof Query.Equals) { + if (criterion instanceof Query.Equals) { def value = criterion.value - if(value instanceof Box) { + if (value instanceof Box) { nativeQuery.put(key, value.asList()) } } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/BoxType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/BoxType.groovy index 2efd27f37ad..927e0e9530c 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/BoxType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/BoxType.groovy @@ -14,10 +14,11 @@ */ package org.grails.datastore.gorm.mongo.geo -import com.mongodb.DBObject -import grails.mongodb.geo.Box import groovy.transform.CompileStatic + import org.bson.Document + +import grails.mongodb.geo.Box import org.grails.datastore.mapping.model.PersistentProperty /** @@ -27,7 +28,8 @@ import org.grails.datastore.mapping.model.PersistentProperty * @since 2.0 */ @CompileStatic -class BoxType extends AbstractShapeCoordsType{ +class BoxType extends AbstractShapeCoordsType { + BoxType() { super(Box) } @@ -35,7 +37,7 @@ class BoxType extends AbstractShapeCoordsType{ @Override protected Box readInternal(PersistentProperty property, String key, Document nativeSource) { def coords = nativeSource.get(key) - if(coords instanceof List) { + if (coords instanceof List) { return Box.valueOf(coords) } } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/CircleType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/CircleType.groovy index 60dda2a3981..a4ee1046d79 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/CircleType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/CircleType.groovy @@ -14,8 +14,9 @@ */ package org.grails.datastore.gorm.mongo.geo -import grails.mongodb.geo.Circle import org.bson.Document + +import grails.mongodb.geo.Circle import org.grails.datastore.mapping.model.PersistentProperty /** @@ -24,7 +25,8 @@ import org.grails.datastore.mapping.model.PersistentProperty * @author Graeme Rocher * @since 2.0 */ -class CircleType extends AbstractShapeCoordsType{ +class CircleType extends AbstractShapeCoordsType { + CircleType() { super(Circle) } @@ -32,7 +34,7 @@ class CircleType extends AbstractShapeCoordsType{ @Override protected Circle readInternal(PersistentProperty property, String key, Document nativeSource) { def coords = nativeSource.get(key) - if(coords instanceof List) { + if (coords instanceof List) { return Circle.valueOf(coords) } } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/GeoJSONType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/GeoJSONType.groovy index 7a38fcbce01..7ea12f66b72 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/GeoJSONType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/GeoJSONType.groovy @@ -14,10 +14,12 @@ */ package org.grails.datastore.gorm.mongo.geo -import grails.mongodb.geo.GeoJSON -import grails.mongodb.geo.Shape import groovy.transform.CompileStatic + import org.bson.Document + +import grails.mongodb.geo.GeoJSON +import grails.mongodb.geo.Shape import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.engine.types.AbstractMappingAwareCustomTypeMarshaller import org.grails.datastore.mapping.model.MappingContext @@ -35,8 +37,8 @@ import org.grails.datastore.mapping.query.Query @CompileStatic abstract class GeoJSONType extends AbstractMappingAwareCustomTypeMarshaller { - public static final String COORDINATES = "coordinates" - public static final String GEO_TYPE = "type" + public static final String COORDINATES = 'coordinates' + public static final String GEO_TYPE = 'type' GeoJSONType(Class targetType) { super(targetType) @@ -44,18 +46,18 @@ abstract class GeoJSONType extends AbstractMappingAwareCustomTy @Override boolean supports(MappingContext context) { - return context instanceof MongoMappingContext; + return context instanceof MongoMappingContext } @Override boolean supports(Datastore datastore) { - return datastore instanceof MongoDatastore; + return datastore instanceof MongoDatastore } @Override protected Object writeInternal(PersistentProperty property, String key, T value, Document nativeTarget) { - if(value != null) { - Document pointData = convertToGeoDocument((Shape)value) + if (value != null) { + Document pointData = convertToGeoDocument((Shape) value) nativeTarget.put(key, pointData) return pointData } @@ -71,11 +73,11 @@ abstract class GeoJSONType extends AbstractMappingAwareCustomTy @Override protected T readInternal(PersistentProperty property, String key, Document nativeSource) { def obj = nativeSource.get(key) - if(obj instanceof Document) { - Document pointData = (Document)obj + if (obj instanceof Document) { + Document pointData = (Document) obj def coords = pointData.get(COORDINATES) - if(coords instanceof List) { + if (coords instanceof List) { return createFromCoords(coords) } } @@ -86,15 +88,15 @@ abstract class GeoJSONType extends AbstractMappingAwareCustomTy @Override protected void queryInternal(PersistentProperty property, String key, Query.PropertyCriterion value, Document nativeQuery) { - if(value instanceof Query.Equals) { + if (value instanceof Query.Equals) { def v = value.getValue() - if(v instanceof GeoJSON) { + if (v instanceof GeoJSON) { Shape shape = (Shape) v def geoJson = convertToGeoDocument(shape) nativeQuery.put(key, geoJson) } - else if( v instanceof Shape) { + else if (v instanceof Shape) { nativeQuery.put(key, v.asList()) } else { diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/GeometryCollectionType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/GeometryCollectionType.groovy index e1a3db1a7b6..48dec8eb273 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/GeometryCollectionType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/GeometryCollectionType.groovy @@ -14,16 +14,14 @@ */ package org.grails.datastore.gorm.mongo.geo -import com.mongodb.BasicDBObject -import com.mongodb.DBObject -import grails.mongodb.geo.GeometryCollection import groovy.transform.CompileStatic + import org.bson.Document -import org.grails.datastore.mapping.core.Datastore + +import grails.mongodb.geo.GeometryCollection import org.grails.datastore.mapping.engine.types.AbstractMappingAwareCustomTypeMarshaller import org.grails.datastore.mapping.model.MappingContext import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.mapping.mongo.MongoDatastore import org.grails.datastore.mapping.mongo.config.MongoMappingContext /** @@ -33,9 +31,9 @@ import org.grails.datastore.mapping.mongo.config.MongoMappingContext * @since 3.0 */ @CompileStatic -class GeometryCollectionType extends AbstractMappingAwareCustomTypeMarshaller{ +class GeometryCollectionType extends AbstractMappingAwareCustomTypeMarshaller { - public static final String GEOMETRIES = "geometries" + public static final String GEOMETRIES = 'geometries' GeometryCollectionType() { super(GeometryCollection) @@ -43,12 +41,12 @@ class GeometryCollectionType extends AbstractMappingAwareCustomTypeMarshaller { + LineStringType() { super(LineString) } @Override LineString createFromCoords(List> coords) { - if(coords.size() < 2) throw new DataAccessResourceFailureException("Invalid polygon data returned: $coords") + if (coords.size() < 2) throw new DataAccessResourceFailureException("Invalid polygon data returned: $coords") def points = coords.collect() { List pos -> new Point(pos.get(0), pos.get(1)) } return new LineString(points as Point[]) diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiLineStringType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiLineStringType.groovy index d5824e1242d..08f9f7aa6e4 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiLineStringType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiLineStringType.groovy @@ -14,9 +14,10 @@ */ package org.grails.datastore.gorm.mongo.geo -import grails.mongodb.geo.MultiLineString import groovy.transform.CompileStatic +import grails.mongodb.geo.MultiLineString + /** * Adds support for the {@link grails.mongodb.geo.MultiLineString} type to GORM for MongoDB * @@ -24,7 +25,7 @@ import groovy.transform.CompileStatic * @since 3.0 */ @CompileStatic -class MultiLineStringType extends GeoJSONType{ +class MultiLineStringType extends GeoJSONType { MultiLineStringType() { super(MultiLineString) diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiPointType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiPointType.groovy index e5bd9a1b60c..0159dc15ea3 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiPointType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiPointType.groovy @@ -14,9 +14,10 @@ */ package org.grails.datastore.gorm.mongo.geo -import grails.mongodb.geo.MultiPoint import groovy.transform.CompileStatic +import grails.mongodb.geo.MultiPoint + /** * Adds support for the {@link grails.mongodb.geo.MultiPoint} type to GORM for MongoDB * @@ -34,4 +35,4 @@ class MultiPointType extends GeoJSONType { MultiPoint createFromCoords(List coords) { MultiPoint.valueOf(coords) } -} \ No newline at end of file +} diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiPolygonType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiPolygonType.groovy index a9e6f0db8ae..8b845f7e589 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiPolygonType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/MultiPolygonType.groovy @@ -22,7 +22,8 @@ import grails.mongodb.geo.MultiPolygon * @author Graeme Rocher * @since 3.0 */ -class MultiPolygonType extends GeoJSONType{ +class MultiPolygonType extends GeoJSONType { + MultiPolygonType() { super(MultiPolygon) } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/PointType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/PointType.groovy index 600625f2f14..4076e7f12fc 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/PointType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/PointType.groovy @@ -22,13 +22,13 @@ import grails.mongodb.geo.Point * @author Graeme Rocher * @since 2.4 */ -class PointType extends GeoJSONType{ +class PointType extends GeoJSONType { PointType() { super(Point) } @Override Point createFromCoords(List coords) { - return new Point((double)coords.get(0), (double)coords.get(1)) + return new Point((double) coords.get(0), (double) coords.get(1)) } } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/PolygonType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/PolygonType.groovy index 5659d41686e..d1179415f71 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/PolygonType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/PolygonType.groovy @@ -14,9 +14,10 @@ */ package org.grails.datastore.gorm.mongo.geo -import grails.mongodb.geo.Polygon import groovy.transform.CompileStatic +import grails.mongodb.geo.Polygon + /** * Adds support for the {@link Polygon} type to GORM for MongoDB * diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/ShapeType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/ShapeType.groovy index 5acf7a9108d..acc5bcc3ddb 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/ShapeType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/geo/ShapeType.groovy @@ -14,16 +14,17 @@ */ package org.grails.datastore.gorm.mongo.geo +import org.bson.Document + +import org.springframework.dao.DataAccessResourceFailureException +import org.springframework.dao.InvalidDataAccessResourceUsageException + import grails.mongodb.geo.GeoJSON import grails.mongodb.geo.LineString import grails.mongodb.geo.Point import grails.mongodb.geo.Polygon import grails.mongodb.geo.Shape -import groovy.transform.CompileStatic -import org.bson.Document import org.grails.datastore.mapping.model.PersistentProperty -import org.springframework.dao.DataAccessResourceFailureException -import org.springframework.dao.InvalidDataAccessResourceUsageException /** * @@ -32,7 +33,7 @@ import org.springframework.dao.InvalidDataAccessResourceUsageException * @author Graeme Rocher * @since 2.0 */ -class ShapeType extends GeoJSONType{ +class ShapeType extends GeoJSONType { static Map geoJsonTypeMap = [Polygon: Polygon, LineString: LineString, Point: Point] ShapeType() { @@ -41,23 +42,23 @@ class ShapeType extends GeoJSONType{ @Override protected Object writeInternal(PersistentProperty property, String key, Shape value, Document nativeTarget) { - if(value instanceof GeoJSON) { + if (value instanceof GeoJSON) { return super.writeInternal(property, key, value, nativeTarget) } else { - throw new InvalidDataAccessResourceUsageException("Only GeoJSON shapes can be persisted using Shape inheritance.") + throw new InvalidDataAccessResourceUsageException('Only GeoJSON shapes can be persisted using Shape inheritance.') } } @Override protected Shape readInternal(PersistentProperty property, String key, Document nativeSource) { def geoData = nativeSource.get(key) - if(geoData && (geoData instanceof Map) ) { + if (geoData && (geoData instanceof Map)) { def geoType = geoData.get(GEO_TYPE) def coords = geoData.get(COORDINATES) - if(geoType) { + if (geoType) { def cls = geoJsonTypeMap.get(geoType.toString()) - if(cls && coords) { + if (cls && coords) { return cls.valueOf(coords) } } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/simple/EnumType.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/simple/EnumType.groovy index 893881e6dfe..af13893bede 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/simple/EnumType.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/gorm/mongo/simple/EnumType.groovy @@ -14,9 +14,15 @@ */ package org.grails.datastore.gorm.mongo.simple +import java.lang.reflect.Array + import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + +import jakarta.persistence.EnumType as JEnumType + import org.bson.Document + import org.grails.datastore.bson.query.BsonQuery import org.grails.datastore.mapping.config.Property import org.grails.datastore.mapping.core.Datastore @@ -34,12 +40,10 @@ import org.grails.datastore.mapping.query.Query.Equals import org.grails.datastore.mapping.query.Query.In import org.grails.datastore.mapping.query.Query.NotEquals -import jakarta.persistence.EnumType as JEnumType -import java.lang.reflect.Array /** * A custom type for persisting Enum which have an id field in domain classes. * For example: To save identity instead of string in database for field type. - * + * *
  *      class User {
  *          UserType type
@@ -48,17 +52,17 @@ import java.lang.reflect.Array
  *
  *      enum UserType {
  *          A(1), B(2)
- *          
+ *
  *          final int id
  *          UserType(int id) {
  *              this.id = id
  *          }
  *      }
  * 
- * + * * @author Shashank Agrawal * @author Causecode Technologies - * + * * @since 3.1.3 * */ @@ -67,12 +71,12 @@ class EnumType extends AbstractMappingAwareCustomTypeMarshaller) value).each { Document queryObject -> @@ -242,7 +246,7 @@ class EnumType extends AbstractMappingAwareCustomTypeMarshaller { public static final String MONGO_SET_OPERATOR = "$set"; public static final String MONGO_UNSET_OPERATOR = "$unset"; - protected static final Map declaredWriteConcerns = new ConcurrentHashMap(); + protected static final Map declaredWriteConcerns = new ConcurrentHashMap<>(); protected final String defaultDatabase; protected MongoDatastore mongoDatastore; protected WriteConcern writeConcern = null; protected boolean errorOccured = false; - protected Map mongoCollections = new ConcurrentHashMap(); - protected Map mongoDatabases = new ConcurrentHashMap(); + protected Map mongoCollections = new ConcurrentHashMap<>(); + protected Map mongoDatabases = new ConcurrentHashMap<>(); public AbstractMongoSession(MongoDatastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher) { this(datastore, mappingContext, publisher, false); } + public AbstractMongoSession(MongoDatastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher, boolean stateless) { super(datastore, mappingContext, publisher, stateless); mongoDatastore = datastore; @@ -88,7 +91,7 @@ public String getDefaultDatabase() { public String getDatabase(PersistentEntity entity) { final String name = mongoDatabases.get(entity); - if(name != null) { + if (name != null) { return name; } return getDatastore().getDatabaseName(entity); @@ -135,7 +138,7 @@ private WriteConcern getDeclaredWriteConcern(WriteConcern defaultConcern, Persis } public MongoClient getNativeInterface() { - return ((MongoDatastore)getDatastore()).getMongoClient(); + return ((MongoDatastore) getDatastore()).getMongoClient(); } public DocumentMappingContext getDocumentMappingContext() { @@ -169,7 +172,7 @@ public String useCollection(PersistentEntity entity, String collectionName) { * @return The name of the previous database */ public String useDatabase(PersistentEntity entity, String databaseName) { - if(databaseName == null) { + if (databaseName == null) { return mongoDatabases.put(entity, getDefaultDatabase()); } else { @@ -178,7 +181,7 @@ public String useDatabase(PersistentEntity entity, String databaseName) { } public com.mongodb.client.MongoCollection getCollection(PersistentEntity entity) { - if(entity.isRoot()) { + if (entity.isRoot()) { final String database = getDatabase(entity); final String collectionName = getCollectionName(entity); return getNativeInterface() diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoCodecSession.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoCodecSession.groovy index c8f5c954b78..be03e0adb59 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoCodecSession.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoCodecSession.groovy @@ -17,6 +17,13 @@ * under the License. */ package org.grails.datastore.mapping.mongo + +import java.util.concurrent.ConcurrentHashMap + +import groovy.transform.CompileStatic + +import jakarta.persistence.FlushModeType + import com.mongodb.WriteConcern import com.mongodb.bulk.BulkWriteResult import com.mongodb.client.FindIterable @@ -30,12 +37,15 @@ import com.mongodb.client.model.UpdateOptions import com.mongodb.client.model.WriteModel import com.mongodb.client.result.DeleteResult import com.mongodb.client.result.UpdateResult -import groovy.transform.CompileStatic import org.bson.BsonDocumentReader import org.bson.BsonDocumentWrapper import org.bson.Document import org.bson.codecs.DecoderContext import org.bson.conversions.Bson + +import org.springframework.context.ApplicationEventPublisher +import org.springframework.dao.DataIntegrityViolationException + import org.grails.datastore.bson.query.BsonQuery import org.grails.datastore.mapping.core.OptimisticLockingException import org.grails.datastore.mapping.core.impl.PendingDelete @@ -58,11 +68,7 @@ import org.grails.datastore.mapping.query.Query import org.grails.datastore.mapping.query.api.QueryableCriteria import org.grails.datastore.mapping.transactions.SessionOnlyTransaction import org.grails.datastore.mapping.transactions.Transaction -import org.springframework.context.ApplicationEventPublisher -import org.springframework.dao.DataIntegrityViolationException -import jakarta.persistence.FlushModeType -import java.util.concurrent.ConcurrentHashMap /** * A MongoDB session for codec mapping style * @@ -71,84 +77,80 @@ import java.util.concurrent.ConcurrentHashMap */ @CompileStatic class MongoCodecSession extends AbstractMongoSession { + protected Map mongoCodecEntityPersisterMap = new ConcurrentHashMap().withDefault { Class type -> def context = getDocumentMappingContext() def entity = context.getPersistentEntity(type.name) - if(entity) { - return new MongoCodecEntityPersister(context, entity, this, publisher, cacheAdapterRepository ) + if (entity) { + return new MongoCodecEntityPersister(context, entity, this, publisher, cacheAdapterRepository) } throw new IllegalArgumentException("Type [$type] is not an entity") } - public MongoCodecSession(MongoDatastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher) { - this(datastore, mappingContext, publisher, false); + MongoCodecSession(MongoDatastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher) { + this(datastore, mappingContext, publisher, false) } - public MongoCodecSession(MongoDatastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher, boolean stateless) { - super(datastore, mappingContext, publisher, stateless); - + MongoCodecSession(MongoDatastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher, boolean stateless) { + super(datastore, mappingContext, publisher, stateless) FlushModeType defaultFlushMode = datastore.getDefaultFlushMode() - setFlushMode(defaultFlushMode); + setFlushMode(defaultFlushMode) } @Override MongoDatastore getDatastore() { - return (MongoDatastore)super.getDatastore() + return (MongoDatastore) super.getDatastore() } - @Override void flush(WriteConcern writeConcern) { - WriteConcern currentWriteConcern = this.getWriteConcern(); + WriteConcern currentWriteConcern = this.getWriteConcern() try { - this.writeConcern = writeConcern; - final Map> pendingUpdates = getPendingUpdates(); - final Map> pendingInserts = getPendingInserts(); - final Map> pendingDeletes = getPendingDeletes(); + this.writeConcern = writeConcern + final Map> pendingUpdates = getPendingUpdates() + final Map> pendingInserts = getPendingInserts() + final Map> pendingDeletes = getPendingDeletes() - if(pendingUpdates.isEmpty() && pendingInserts.isEmpty() && pendingDeletes.isEmpty()) { - return; + if (pendingUpdates.isEmpty() && pendingInserts.isEmpty() && pendingDeletes.isEmpty()) { + return } - Map numberOfOptimisticUpdates = [:].withDefault { 0 } Map numberOfPessimisticUpdates = [:].withDefault { 0 } Map>> writeModels = [:] for (PersistentEntity persistentEntity in pendingInserts.keySet()) { final Collection inserts = pendingInserts[persistentEntity] - if(inserts) { + if (inserts) { List> entityWrites = getWriteModelsForEntity(persistentEntity, writeModels) for (PendingInsert insert in inserts) { insert.run() - if(insert.vetoed) continue - + if (insert.vetoed) continue def object = insert.nativeEntry entityWrites << new InsertOneModel(object) final List cascadeOperations = insert.cascadeOperations - addPostFlushOperations cascadeOperations + addPostFlushOperations(cascadeOperations) } } } - for (PersistentEntity persistentEntity in pendingUpdates.keySet()) { final String name = persistentEntity.isRoot() ? persistentEntity.name : persistentEntity.rootEntity.name final Collection updates = pendingUpdates[persistentEntity] - if(updates) { - List> entityWrites = getWriteModelsForEntity(persistentEntity, writeModels); + if (updates) { + List> entityWrites = getWriteModelsForEntity(persistentEntity, writeModels) for (PendingUpdate update in updates) { update.run() - if(update.vetoed) continue + if (update.vetoed) continue DirtyCheckable changedObject = (DirtyCheckable) update.getNativeEntry() - PersistentEntityCodec codec = (PersistentEntityCodec)datastore.codecRegistry.get(changedObject.getClass()) + PersistentEntityCodec codec = (PersistentEntityCodec) datastore.codecRegistry.get(changedObject.getClass()) final Object nativeKey = update.nativeKey final Document id = new Document(MongoEntityPersister.MONGO_ID_FIELD, nativeKey) @@ -156,19 +158,19 @@ class MongoCodecSession extends AbstractMongoSession { EntityAccess entityAccess = update.entityAccess boolean isVersioned = persistentEntity.isVersioned() def currentVersion = null - if(isVersioned) { - currentVersion = entityAccess.getProperty( persistentEntity.version.name ) + if (isVersioned) { + currentVersion = entityAccess.getProperty(persistentEntity.version.name) } def updateDoc = codec.encodeUpdate(changedObject, entityAccess) - if(updateDoc) { + if (updateDoc) { - if(isVersioned) { + if (isVersioned) { // if the entity is versioned we add to the query the current version // if the query doesn't match a result this means the document has been updated by // another thread and an optimistic locking exception should be thrown - if(currentVersion == null) { - currentVersion = entityAccess.getProperty( persistentEntity.version.name ) + if (currentVersion == null) { + currentVersion = entityAccess.getProperty(persistentEntity.version.name) } id[GormProperties.VERSION] = currentVersion numberOfOptimisticUpdates[name]++ @@ -181,74 +183,72 @@ class MongoCodecSession extends AbstractMongoSession { entityWrites << new UpdateOneModel(id, updateDoc, options.upsert(false)) final List cascadeOperations = update.cascadeOperations - addPostFlushOperations cascadeOperations + addPostFlushOperations(cascadeOperations) } } } } - for (PersistentEntity persistentEntity in pendingDeletes.keySet()) { final Collection deletes = pendingDeletes[persistentEntity] - if(deletes) { + if (deletes) { List> entityWrites = getWriteModelsForEntity(persistentEntity, writeModels) List nativeKeys = [] for (PendingDelete delete in deletes) { delete.run() - if(delete.vetoed) continue + if (delete.vetoed) continue final Object k = delete.nativeKey - if(k) { + if (k) { nativeKeys << k final List cascadeOperations = delete.cascadeOperations - addPostFlushOperations cascadeOperations + addPostFlushOperations(cascadeOperations) } } - if(nativeKeys.size() == 1) { - entityWrites << new DeleteOneModel(new Document( MongoEntityPersister.MONGO_ID_FIELD, nativeKeys.get(0))) + if (nativeKeys.size() == 1) { + entityWrites << new DeleteOneModel(new Document(MongoEntityPersister.MONGO_ID_FIELD, nativeKeys.get(0))) } else { - entityWrites << new DeleteManyModel(new Document( MongoEntityPersister.MONGO_ID_FIELD, new Document(BsonQuery.IN_OPERATOR, nativeKeys))) + entityWrites << new DeleteManyModel(new Document(MongoEntityPersister.MONGO_ID_FIELD, new Document(BsonQuery.IN_OPERATOR, nativeKeys))) } } } - for (PersistentEntity persistentEntity : writeModels.keySet()) { MongoCollection collection = getCollection(persistentEntity) .withDocumentClass(persistentEntity.javaClass) WriteConcern wc = writeConcern - if(wc == null) { - org.grails.datastore.mapping.mongo.config.MongoCollection mapping = (org.grails.datastore.mapping.mongo.config.MongoCollection)persistentEntity.mapping.mappedForm + if (wc == null) { + org.grails.datastore.mapping.mongo.config.MongoCollection mapping = (org.grails.datastore.mapping.mongo.config.MongoCollection) persistentEntity.mapping.mappedForm wc = mapping.writeConcern } - if(wc != null) { + if (wc != null) { collection = collection.withWriteConcern(wc) } else { wc = collection.writeConcern } final List> writes = writeModels[persistentEntity] - if(writes) { + if (writes) { final BulkWriteResult bulkWriteResult = collection .bulkWrite(writes) final boolean isAcknowledged = wc.isAcknowledged() - if( !bulkWriteResult.wasAcknowledged() && isAcknowledged) { - errorOccured = true; - throw new DataIntegrityViolationException("Write operation was not acknowledged"); + if (!bulkWriteResult.wasAcknowledged() && isAcknowledged) { + errorOccured = true + throw new DataIntegrityViolationException('Write operation was not acknowledged') } - else if(isAcknowledged) { + else if (isAcknowledged) { final int matchedCount = bulkWriteResult.matchedCount final String name = persistentEntity.name final Integer numOptimistic = numberOfOptimisticUpdates[name] final Integer numPessimistic = numberOfPessimisticUpdates[name] - if((matchedCount - numPessimistic) != numOptimistic) { + if ((matchedCount - numPessimistic) != numOptimistic) { setFlushMode(FlushModeType.COMMIT) throw new OptimisticLockingException(persistentEntity, null) } @@ -257,13 +257,13 @@ class MongoCodecSession extends AbstractMongoSession { } for (Runnable postFlushOperation : postFlushOperations) { - postFlushOperation.run(); + postFlushOperation.run() } } finally { - clearPendingOperations(); - postFlushOperations.clear(); - firstLevelCollectionCache.clear(); - this.writeConcern = currentWriteConcern; + clearPendingOperations() + postFlushOperations.clear() + firstLevelCollectionCache.clear() + this.writeConcern = currentWriteConcern } } @@ -272,14 +272,14 @@ class MongoCodecSession extends AbstractMongoSession { return mongoDatastore.mongoClient } - public DocumentMappingContext getDocumentMappingContext() { + DocumentMappingContext getDocumentMappingContext() { return (DocumentMappingContext) getMappingContext() } protected List> getWriteModelsForEntity(PersistentEntity persistentEntity, Map>> writeModels) { PersistentEntity key = persistentEntity.root ? persistentEntity : persistentEntity.rootEntity List> entityWrites = writeModels[key] - if(entityWrites == null) { + if (entityWrites == null) { entityWrites = new ArrayList>() writeModels[key] = entityWrites } @@ -288,7 +288,7 @@ class MongoCodecSession extends AbstractMongoSession { @Override protected Transaction beginTransactionInternal() { - return new SessionOnlyTransaction(getNativeInterface(), this); + return new SessionOnlyTransaction(getNativeInterface(), this) } @Override @@ -298,12 +298,12 @@ class MongoCodecSession extends AbstractMongoSession { @Override long deleteAll(QueryableCriteria criteria) { - final PersistentEntity entity = criteria.getPersistentEntity(); - final Document nativeQuery = buildNativeDocumentQueryFromCriteria(criteria, entity); + final PersistentEntity entity = criteria.getPersistentEntity() + final Document nativeQuery = buildNativeDocumentQueryFromCriteria(criteria, entity) final MongoCollection collection = getCollection(entity) - final DeleteResult deleteResult = collection.deleteMany((Bson)nativeQuery) - if( deleteResult.wasAcknowledged() ) { + final DeleteResult deleteResult = collection.deleteMany((Bson) nativeQuery) + if (deleteResult.wasAcknowledged()) { return deleteResult.deletedCount } else { @@ -320,15 +320,15 @@ class MongoCodecSession extends AbstractMongoSession { updateOptions.upsert(false) for (Association association in entity.associations) { String associationName = association.name - if(association instanceof ToOne && properties.containsKey(associationName)) { + if (association instanceof ToOne && properties.containsKey(associationName)) { def value = properties.get(associationName) - if(value != null) { + if (value != null) { properties.put(associationName, association.associatedEntity.reflector.getIdentifier(value)) } } } final UpdateResult updateResult = collection.updateMany(nativeQuery, new Document(MONGO_SET_OPERATOR, properties), updateOptions) - if(updateResult.wasAcknowledged()) { + if (updateResult.wasAcknowledged()) { try { return updateResult.modifiedCount } catch (UnsupportedOperationException e) { @@ -343,10 +343,10 @@ class MongoCodecSession extends AbstractMongoSession { @Override Object decode(Class type, Object nativeObject) { - if(nativeObject instanceof FindIterable) { + if (nativeObject instanceof FindIterable) { return decode(type, ((FindIterable) nativeObject).first()) } - else if( nativeObject instanceof Document ) { + else if (nativeObject instanceof Document) { def registry = datastore.getCodecRegistry() def codec = registry.get(type) @@ -359,7 +359,7 @@ class MongoCodecSession extends AbstractMongoSession { private Document buildNativeDocumentQueryFromCriteria(QueryableCriteria criteria, PersistentEntity entity) { def mongoQuery = new MongoQuery(this, entity) - for(Query.Criterion c in criteria.criteria) { + for (Query.Criterion c in criteria.criteria) { mongoQuery.add(c) } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoConstants.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoConstants.groovy index 0191ce45e71..5cf13cce16e 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoConstants.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoConstants.groovy @@ -30,21 +30,21 @@ import groovy.transform.CompileStatic */ @CompileStatic class MongoConstants { - public static final String SET_OPERATOR = '$set'; - public static final String UNSET_OPERATOR = '$unset'; - public static final String CODEC_ENGINE = "codec"; - public static final String MONGO_ID_FIELD = "_id"; - public static final String MONGO_CLASS_FIELD = "_class"; - public static final String INC_OPERATOR = '$inc' - public static final String ASSIGNED_IDENTIFIER_MAPPING = "assigned" + public static final String SET_OPERATOR = '$set' + public static final String UNSET_OPERATOR = '$unset' + public static final String CODEC_ENGINE = 'codec' + public static final String MONGO_ID_FIELD = '_id' + public static final String MONGO_CLASS_FIELD = '_class' + public static final String INC_OPERATOR = '$inc' + public static final String ASSIGNED_IDENTIFIER_MAPPING = 'assigned' @CompileDynamic - public static T mapToObject(Class targetType, Map values) { + static T mapToObject(Class targetType, Map values) { T t = targetType.getDeclaredConstructor().newInstance() - for(String name in values.keySet()) { - if(t.respondsTo(name)) { - t."$name"( values.get(name) ) + for (String name in values.keySet()) { + if (t.respondsTo(name)) { + t."$name"(values.get(name)) } } return t diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoDatastore.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoDatastore.java index b15ac916faa..03c2c8979f1 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoDatastore.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoDatastore.java @@ -15,19 +15,39 @@ package org.grails.datastore.mapping.mongo; +import java.io.Closeable; +import java.io.IOException; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +import groovy.lang.Closure; + +import jakarta.annotation.PreDestroy; +import jakarta.persistence.FlushModeType; import com.mongodb.MongoClientSettings; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoIterable; import com.mongodb.client.model.IndexOptions; -import grails.gorm.multitenancy.Tenants; -import grails.util.GrailsMessageSourceUtils; -import groovy.lang.Closure; import org.bson.Document; import org.bson.codecs.Codec; import org.bson.codecs.configuration.CodecProvider; import org.bson.codecs.configuration.CodecRegistries; import org.bson.codecs.configuration.CodecRegistry; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.MessageSource; +import org.springframework.context.support.StaticMessageSource; +import org.springframework.core.env.PropertyResolver; +import org.springframework.transaction.PlatformTransactionManager; + +import grails.gorm.multitenancy.Tenants; +import grails.util.GrailsMessageSourceUtils; import org.grails.datastore.bson.codecs.CodecExtensions; import org.grails.datastore.gorm.GormEnhancer; import org.grails.datastore.gorm.GormInstanceApi; @@ -46,10 +66,27 @@ import org.grails.datastore.gorm.validation.listener.ValidationEventListener; import org.grails.datastore.gorm.validation.registry.support.ValidatorRegistries; import org.grails.datastore.mapping.config.Settings; -import org.grails.datastore.mapping.core.*; -import org.grails.datastore.mapping.core.connections.*; +import org.grails.datastore.mapping.core.AbstractDatastore; +import org.grails.datastore.mapping.core.Datastore; +import org.grails.datastore.mapping.core.DatastoreUtils; +import org.grails.datastore.mapping.core.Session; +import org.grails.datastore.mapping.core.StatelessDatastore; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSources; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesListener; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport; +import org.grails.datastore.mapping.core.connections.DefaultConnectionSource; +import org.grails.datastore.mapping.core.connections.InMemoryConnectionSources; +import org.grails.datastore.mapping.core.connections.MultipleConnectionSourceCapableDatastore; +import org.grails.datastore.mapping.core.connections.SingletonConnectionSources; import org.grails.datastore.mapping.core.exceptions.ConfigurationException; -import org.grails.datastore.mapping.model.*; +import org.grails.datastore.mapping.model.ClassMapping; +import org.grails.datastore.mapping.model.EmbeddedPersistentEntity; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.PersistentProperty; +import org.grails.datastore.mapping.model.PropertyMapping; import org.grails.datastore.mapping.mongo.config.MongoAttribute; import org.grails.datastore.mapping.mongo.config.MongoCollection; import org.grails.datastore.mapping.mongo.config.MongoMappingContext; @@ -66,19 +103,6 @@ import org.grails.datastore.mapping.transactions.DatastoreTransactionManager; import org.grails.datastore.mapping.transactions.TransactionCapableDatastore; import org.grails.datastore.mapping.validation.ValidatorRegistry; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.MessageSource; -import org.springframework.context.support.StaticMessageSource; -import org.springframework.core.env.PropertyResolver; -import org.springframework.transaction.PlatformTransactionManager; - -import jakarta.annotation.PreDestroy; -import jakarta.persistence.FlushModeType; -import java.io.Closeable; -import java.io.IOException; -import java.io.Serializable; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; /** * A Datastore implementation for the Mongo document store. @@ -128,10 +152,10 @@ public class MongoDatastore extends AbstractDatastore implements MappingContext. */ public MongoDatastore(final ConnectionSources connectionSources, final MongoMappingContext mappingContext, final ConfigurableApplicationEventPublisher eventPublisher) { super(mappingContext, connectionSources != null ? connectionSources.getBaseConfiguration() : null, null); - if(connectionSources == null) { + if (connectionSources == null) { throw new IllegalArgumentException("Argument [connectionSources] cannot be null"); } - if(mappingContext == null) { + if (mappingContext == null) { throw new IllegalArgumentException("Argument [mappingContext] cannot be null"); } @@ -157,7 +181,7 @@ public MongoDatastore(final ConnectionSources() { + connectionSources.addListener(new ConnectionSourcesListener<>() { public void newConnectionSource(final ConnectionSource connectionSource) { final SingletonConnectionSources singletonConnectionSources = new SingletonConnectionSources<>(connectionSource, connectionSources.getBaseConfiguration()); MongoDatastore childDatastore = createChildDatastore(mappingContext, eventPublisher, parent, singletonConnectionSources); @@ -245,7 +269,7 @@ public MongoDatastore getDatastoreForConnection(String connectionName) { * @param eventPublisher The Spring ApplicationContext * @param classes The persistent classes */ - public MongoDatastore(ConnectionSources connectionSources, ConfigurableApplicationEventPublisher eventPublisher, Class...classes) { + public MongoDatastore(ConnectionSources connectionSources, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { this(connectionSources, createMappingContext(connectionSources, classes), eventPublisher); } @@ -267,7 +291,7 @@ public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, M * @param eventPublisher The Spring ApplicationContext * @param classes The persistent classes */ - public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class...classes) { + public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { this(mongoClient, configuration, createMappingContext(configuration, classes), eventPublisher); } @@ -278,7 +302,7 @@ public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, C * @param eventPublisher The Spring ApplicationContext * @param packages The packages to scan */ - public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Package...packages) { + public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Package... packages) { this(mongoClient, configuration, createMappingContext(configuration, new ClasspathEntityScanner().scan(packages)), eventPublisher); } @@ -288,7 +312,7 @@ public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, C * @param mongoClient The {@link MongoClient} instance * @param classes The persistent classes */ - public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, Class...classes) { + public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, Class... classes) { this(mongoClient, configuration, createMappingContext(configuration, classes), new DefaultApplicationEventPublisher()); } @@ -298,18 +322,17 @@ public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, C * @param mongoClient The {@link MongoClient} instance * @param packages The packages to scan */ - public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, Package...packages) { + public MongoDatastore(MongoClient mongoClient, PropertyResolver configuration, Package... packages) { this(mongoClient, configuration, createMappingContext(configuration, new ClasspathEntityScanner().scan(packages)), new DefaultApplicationEventPublisher()); } - /** * Configures a new {@link MongoDatastore} for the given arguments * * @param mongoClient The {@link MongoClient} instance * @param classes The persistent classes */ - public MongoDatastore(MongoClient mongoClient, Class...classes) { + public MongoDatastore(MongoClient mongoClient, Class... classes) { this(mongoClient, mapToPropertyResolver(null), createMappingContext(mapToPropertyResolver(null), classes), new DefaultApplicationEventPublisher()); } @@ -322,10 +345,9 @@ public MongoDatastore(MongoClient mongoClient, Class...classes) { * @param mappingContext The mapping context */ public MongoDatastore(MongoClientSettings.Builder clientOptions, PropertyResolver configuration, MongoMappingContext mappingContext, ConfigurableApplicationEventPublisher eventPublisher) { - this(createMongoClient(configuration, clientOptions, mappingContext), configuration, mappingContext, eventPublisher); + this(createMongoClient(configuration, clientOptions, mappingContext), configuration, mappingContext, eventPublisher); } - /** * Configures a new {@link MongoDatastore} for the given arguments * @@ -334,7 +356,7 @@ public MongoDatastore(MongoClientSettings.Builder clientOptions, PropertyResolve * @param mappingContext The mapping context */ public MongoDatastore(MongoClientSettings.Builder clientOptions, PropertyResolver configuration, MongoMappingContext mappingContext) { - this(createMongoClient(configuration, clientOptions, mappingContext), configuration, mappingContext, new DefaultApplicationEventPublisher()); + this(createMongoClient(configuration, clientOptions, mappingContext), configuration, mappingContext, new DefaultApplicationEventPublisher()); } /** @@ -345,10 +367,9 @@ public MongoDatastore(MongoClientSettings.Builder clientOptions, PropertyResolve * @param mappingContext The mapping context */ public MongoDatastore(PropertyResolver configuration, MongoMappingContext mappingContext, ConfigurableApplicationEventPublisher eventPublisher) { - this(ConnectionSourcesInitializer.create(new MongoConnectionSourceFactory(), configuration), mappingContext, eventPublisher); + this(ConnectionSourcesInitializer.create(new MongoConnectionSourceFactory(), configuration), mappingContext, eventPublisher); } - /** * Configures a new {@link MongoDatastore} for the given arguments * @@ -357,9 +378,10 @@ public MongoDatastore(PropertyResolver configuration, MongoMappingContext mappin * @param connectionSourceFactory The connection source factory to use * @param classes The persistent classes */ - public MongoDatastore(PropertyResolver configuration, MongoConnectionSourceFactory connectionSourceFactory, ConfigurableApplicationEventPublisher eventPublisher, Class...classes) { + public MongoDatastore(PropertyResolver configuration, MongoConnectionSourceFactory connectionSourceFactory, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { this(ConnectionSourcesInitializer.create(connectionSourceFactory, configuration), eventPublisher, classes); } + /** * Configures a new {@link MongoDatastore} for the given arguments * @@ -367,7 +389,7 @@ public MongoDatastore(PropertyResolver configuration, MongoConnectionSourceFacto * @param eventPublisher The Spring ApplicationContext * @param classes The persistent classes */ - public MongoDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class...classes) { + public MongoDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { this(configuration, new MongoConnectionSourceFactory(), eventPublisher, classes); } @@ -387,11 +409,10 @@ public MongoDatastore(PropertyResolver configuration, MongoMappingContext mappin * @param configuration The configuration for the datastore * @param classes The persistent classes */ - public MongoDatastore(PropertyResolver configuration, Class...classes) { + public MongoDatastore(PropertyResolver configuration, Class... classes) { this(configuration, new DefaultApplicationEventPublisher(), classes); } - /** * Configures a new {@link MongoDatastore} for the given arguments * @@ -399,8 +420,8 @@ public MongoDatastore(PropertyResolver configuration, Class...classes) { * @param eventPublisher The event publisher * @param classes The persistent classes */ - public MongoDatastore(Map configuration, ConfigurableApplicationEventPublisher eventPublisher, Class...classes) { - this(mapToPropertyResolver(configuration),eventPublisher, classes); + public MongoDatastore(Map configuration, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { + this(mapToPropertyResolver(configuration), eventPublisher, classes); } /** @@ -409,8 +430,8 @@ public MongoDatastore(Map configuration, ConfigurableApplication * @param configuration The configuration * @param classes The persistent classes */ - public MongoDatastore(Map configuration, Class...classes) { - this(mapToPropertyResolver(configuration),new DefaultApplicationEventPublisher(), classes); + public MongoDatastore(Map configuration, Class... classes) { + this(mapToPropertyResolver(configuration), new DefaultApplicationEventPublisher(), classes); } /** @@ -418,7 +439,7 @@ public MongoDatastore(Map configuration, Class...classes) { * * @param configuration The configuration */ - public MongoDatastore(Map configuration ) { + public MongoDatastore(Map configuration) { this(configuration, new Class[0]); } @@ -447,7 +468,7 @@ public MongoDatastore(MongoMappingContext mappingContext) { * * @param classes The persistent classes */ - public MongoDatastore(Class...classes) { + public MongoDatastore(Class... classes) { this(mapToPropertyResolver(null), classes); } @@ -456,7 +477,7 @@ public MongoDatastore(Class...classes) { * * @param packagesToScan The packages to scan */ - public MongoDatastore(Package...packagesToScan) { + public MongoDatastore(Package... packagesToScan) { this(new ClasspathEntityScanner().scan(packagesToScan)); } @@ -468,13 +489,14 @@ public MongoDatastore(Package...packagesToScan) { public MongoDatastore(Package packageToScan) { this(new ClasspathEntityScanner().scan(packageToScan)); } + /** * Construct a Mongo datastore scanning the given packages * * @param configuration The configuration * @param packagesToScan The packages to scan */ - public MongoDatastore(PropertyResolver configuration, Package...packagesToScan) { + public MongoDatastore(PropertyResolver configuration, Package... packagesToScan) { this(configuration, new ClasspathEntityScanner().scan(packagesToScan)); } @@ -484,7 +506,7 @@ public MongoDatastore(PropertyResolver configuration, Package...packagesToScan) * @param configuration The configuration * @param packagesToScan The packages to scan */ - public MongoDatastore(Map configuration, Package...packagesToScan) { + public MongoDatastore(Map configuration, Package... packagesToScan) { this(DatastoreUtils.createPropertyResolver(configuration), packagesToScan); } @@ -495,7 +517,7 @@ public MongoDatastore(Map configuration, Package...packagesToScan * @param eventPublisher The event publisher * @param packagesToScan The packages to scan */ - public MongoDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Package...packagesToScan) { + public MongoDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Package... packagesToScan) { this(configuration, eventPublisher, new ClasspathEntityScanner().scan(packagesToScan)); } @@ -513,15 +535,13 @@ public void buildIndex() { for (PersistentEntity entity : this.mappingContext.getPersistentEntities()) { // Only create Mongo templates for entities that are mapped with Mongo if (!entity.isExternal()) { - if(entity.isMultiTenant() && multiTenancyMode == MultiTenancySettings.MultiTenancyMode.SCHEMA) continue; - + if (entity.isMultiTenant() && multiTenancyMode == MultiTenancySettings.MultiTenancyMode.SCHEMA) continue; initializeIndices(entity); } } } - /** * @return The default flush mode */ @@ -583,7 +603,7 @@ public void setMessageSource(List messageSources) { } public void setMessageSource(MessageSource messageSource) { - if(messageSource != null) { + if (messageSource != null) { configureValidatorRegistry(connectionSources.getDefaultConnectionSource().getSettings(), (MongoMappingContext) mappingContext, messageSource); } } @@ -651,12 +671,12 @@ public MongoClient getMongoClient() { } public String getDatabaseName(PersistentEntity entity) { - if(entity.isMultiTenant() && multiTenancyMode == MultiTenancySettings.MultiTenancyMode.SCHEMA) { + if (entity.isMultiTenant() && multiTenancyMode == MultiTenancySettings.MultiTenancyMode.SCHEMA) { return Tenants.currentId(getClass()).toString(); } else { final String databaseName = mongoDatabases.get(entity); - if(databaseName == null) { + if (databaseName == null) { mongoDatabases.put(entity, defaultDatabase); return defaultDatabase; } @@ -672,7 +692,7 @@ public String getDatabaseName(PersistentEntity entity) { */ public String getCollectionName(PersistentEntity entity) { final String collectionName = mongoCollections.get(entity); - if(collectionName == null) { + if (collectionName == null) { final String decapitalizedName = entity.isRoot() ? entity.getDecapitalizedName() : entity.getRootEntity().getDecapitalizedName(); mongoCollections.put(entity, decapitalizedName); return decapitalizedName; @@ -701,7 +721,6 @@ public MongoMappingContext getMappingContext() { return (MongoMappingContext) super.getMappingContext(); } - @Override public boolean isSchemaless() { return true; @@ -769,21 +788,21 @@ protected GormValidationApi getValidationApi(Class cls, String qualifi private MongoDatastore getDatastoreForQualifier(Class cls, String qualifier) { String defaultConnectionSourceName = ConnectionSourcesSupport.getDefaultConnectionSourceName(getMappingContext().getPersistentEntity(cls.getName())); - if(defaultConnectionSourceName.equals(ConnectionSource.ALL)) { + if (defaultConnectionSourceName.equals(ConnectionSource.ALL)) { defaultConnectionSourceName = ConnectionSource.DEFAULT; } boolean isDefaultQualifier = qualifier.equals(ConnectionSource.DEFAULT); - if(isDefaultQualifier && defaultConnectionSourceName.equals(ConnectionSource.DEFAULT)) { + if (isDefaultQualifier && defaultConnectionSourceName.equals(ConnectionSource.DEFAULT)) { return MongoDatastore.this; } else { - if(isDefaultQualifier) { + if (isDefaultQualifier) { qualifier = defaultConnectionSourceName; } ConnectionSource connectionSource = connectionSources.getConnectionSource(qualifier); - if(connectionSource == null) { - throw new ConfigurationException("Invalid connection ["+defaultConnectionSourceName+"] configured for class ["+cls+"]"); + if (connectionSource == null) { + throw new ConfigurationException("Invalid connection [" + defaultConnectionSourceName + "] configured for class [" + cls + "]"); } return datastoresByConnectionSource.get(qualifier); @@ -791,7 +810,6 @@ private MongoDatastore getDatastoreForQualifier(Class cls, String qualifi } }; - } @Override @@ -808,7 +826,7 @@ protected void registerEventListeners(ConfigurableApplicationEventPublisher even eventPublisher.addApplicationListener(autoTimestampEventListener); eventPublisher.addApplicationListener(new ValidationEventListener(this)); - if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { + if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { eventPublisher.addApplicationListener(new MultiTenantEventListener(this)); } } @@ -880,7 +898,6 @@ protected void initializeIndices(final PersistentEntity entity) { } } - } String getMongoFieldNameForProperty(PersistentProperty property) { @@ -895,7 +912,6 @@ String getMongoFieldNameForProperty(PersistentProperty property) return propKey; } - public void persistentEntityAdded(PersistentEntity entity) { initializeIndices(entity); } @@ -912,11 +928,11 @@ public void close() { if (connectionSources != null) { connectionSources.close(); } - } catch(IOException e) { + } catch (IOException e) { LOG.error("There was an error shutting down GORM for an entity: " + e.getMessage(), e); } finally { - if(gormEnhancer != null) { + if (gormEnhancer != null) { try { gormEnhancer.close(); } catch (Throwable e) { @@ -941,14 +957,12 @@ protected static ConnectionSources c return new InMemoryConnectionSources<>(defaultConnectionSource, new MongoConnectionSourceFactory(), configuration); } - protected static MongoClient createMongoClient(PropertyResolver configuration, MongoClientSettings.Builder mongoOptions, MongoMappingContext mappingContext) { MongoConnectionSourceFactory mongoConnectionSourceFactory = new MongoConnectionSourceFactory(); mongoConnectionSourceFactory.setClientOptionsBuilder(mongoOptions); return mongoConnectionSourceFactory.create(ConnectionSource.DEFAULT, configuration).getSource(); } - protected static MongoMappingContext createMappingContext(ConnectionSources connectionSources, Class... classes) { ConnectionSource defaultConnectionSource = connectionSources.getDefaultConnectionSource(); MongoMappingContext mongoMappingContext = new MongoMappingContext(defaultConnectionSource.getSettings(), classes); @@ -968,16 +982,16 @@ protected void registerEntity(PersistentEntity entity) { String collectionName = entity.isRoot() ? entity.getDecapitalizedName() : entity.getRootEntity().getDecapitalizedName(); String databaseName = this.defaultDatabase; - MongoCollection collectionMapping = (MongoCollection)entity.getMapping().getMappedForm(); - if(collectionMapping.getCollection() != null) { + MongoCollection collectionMapping = (MongoCollection) entity.getMapping().getMappedForm(); + if (collectionMapping.getCollection() != null) { collectionName = collectionMapping.getCollection(); } - if(collectionMapping.getDatabase() != null) { + if (collectionMapping.getDatabase() != null) { databaseName = collectionMapping.getDatabase(); } mongoCollections.put(entity, collectionName); - mongoDatabases.put(entity,databaseName); + mongoDatabases.put(entity, databaseName); } private static void configureValidationRegistry(MongoConnectionSourceSettings settings, MongoMappingContext mongoMappingContext) { @@ -987,8 +1001,8 @@ private static void configureValidationRegistry(MongoConnectionSourceSettings se private static void configureValidatorRegistry(MongoConnectionSourceSettings settings, MongoMappingContext mongoMappingContext, MessageSource messageSource) { ValidatorRegistry validatorRegistry = ValidatorRegistries.createValidatorRegistry(mongoMappingContext, settings, messageSource); - if(validatorRegistry instanceof ConstraintRegistry) { - ((ConstraintRegistry)validatorRegistry).addConstraintFactory( + if (validatorRegistry instanceof ConstraintRegistry) { + ((ConstraintRegistry) validatorRegistry).addConstraintFactory( new MappingContextAwareConstraintFactory(UniqueConstraint.class, messageSource, mongoMappingContext) ); } @@ -1009,7 +1023,7 @@ public TenantResolver getTenantResolver() { @Override public MongoDatastore getDatastoreForTenantId(Serializable tenantId) { - if(getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DATABASE) { + if (getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DATABASE) { return this.datastoresByConnectionSource.get(tenantId.toString()); } return this; @@ -1017,12 +1031,12 @@ public MongoDatastore getDatastoreForTenantId(Serializable tenantId) { @Override public Datastore getDatastoreForConnection(String connectionName) { - if(connectionName.equals(Settings.SETTING_DATASOURCE) || connectionName.equals(ConnectionSource.DEFAULT)) { + if (connectionName.equals(Settings.SETTING_DATASOURCE) || connectionName.equals(ConnectionSource.DEFAULT)) { return this; } else { MongoDatastore mongoDatastore = this.datastoresByConnectionSource.get(connectionName); - if(mongoDatastore == null) { - throw new ConfigurationException("DataSource not found for name ["+connectionName+"] in configuration. Please check your multiple data sources configuration and try again."); + if (mongoDatastore == null) { + throw new ConfigurationException("DataSource not found for name [" + connectionName + "] in configuration. Please check your multiple data sources configuration and try again."); } return mongoDatastore; } @@ -1043,7 +1057,7 @@ public T1 withNewSession(Serializable tenantId, Closure callable) { class PersistentEntityCodeRegistry implements CodecProvider { - Map codecs = new HashMap(); + Map codecs = new HashMap<>(); @Override public Codec get(Class clazz, CodecRegistry registry) { diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoSession.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoSession.java index 597d2d61e0d..a865f0ec8f0 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoSession.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/MongoSession.java @@ -18,16 +18,39 @@ */ package org.grails.datastore.mapping.mongo; -import com.mongodb.client.MongoClient; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import jakarta.persistence.FlushModeType; + import com.mongodb.WriteConcern; import com.mongodb.client.FindIterable; -import com.mongodb.client.model.*; +import com.mongodb.client.MongoClient; +import com.mongodb.client.model.DeleteManyModel; +import com.mongodb.client.model.InsertOneModel; +import com.mongodb.client.model.UpdateOneModel; +import com.mongodb.client.model.UpdateOptions; +import com.mongodb.client.model.WriteModel; import com.mongodb.client.result.DeleteResult; import com.mongodb.client.result.UpdateResult; import org.bson.Document; + +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.dao.DataIntegrityViolationException; + import org.grails.datastore.bson.query.BsonQuery; import org.grails.datastore.mapping.core.OptimisticLockingException; -import org.grails.datastore.mapping.core.impl.*; +import org.grails.datastore.mapping.core.impl.PendingDelete; +import org.grails.datastore.mapping.core.impl.PendingDeleteAdapter; +import org.grails.datastore.mapping.core.impl.PendingInsert; +import org.grails.datastore.mapping.core.impl.PendingOperation; +import org.grails.datastore.mapping.core.impl.PendingUpdate; import org.grails.datastore.mapping.engine.EntityAccess; import org.grails.datastore.mapping.engine.EntityPersister; import org.grails.datastore.mapping.engine.Persister; @@ -41,12 +64,6 @@ import org.grails.datastore.mapping.query.api.QueryableCriteria; import org.grails.datastore.mapping.transactions.SessionOnlyTransaction; import org.grails.datastore.mapping.transactions.Transaction; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.dao.DataIntegrityViolationException; - -import jakarta.persistence.FlushModeType; -import java.io.Serializable; -import java.util.*; /** * A {@link org.grails.datastore.mapping.core.Session} implementation for the Mongo document store. @@ -56,21 +73,19 @@ */ public class MongoSession extends AbstractMongoSession { - public MongoSession(MongoDatastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher) { this(datastore, mappingContext, publisher, false); } + public MongoSession(MongoDatastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher, boolean stateless) { super(datastore, mappingContext, publisher, stateless); } - @Override public Query createQuery(@SuppressWarnings("rawtypes") Class type) { return super.createQuery(type); } - @Override protected void cacheEntry(Serializable key, Object entry, Map entryCache, boolean forDirtyCheck) { entryCache.put(key, entry); @@ -84,25 +99,24 @@ public void flush(WriteConcern writeConcern) { final Map> pendingInserts = getPendingInserts(); final Map> pendingDeletes = getPendingDeletes(); - if(pendingUpdates.isEmpty() && pendingInserts.isEmpty() && pendingDeletes.isEmpty()) { + if (pendingUpdates.isEmpty() && pendingInserts.isEmpty() && pendingDeletes.isEmpty()) { return; } + Map numberOfOptimisticUpdates = new LinkedHashMap<>(); + Map numberOfPessimisticUpdates = new LinkedHashMap<>(); - Map numberOfOptimisticUpdates = new LinkedHashMap(); - Map numberOfPessimisticUpdates = new LinkedHashMap(); - - Map>> writeModels = new LinkedHashMap>>(); + Map>> writeModels = new LinkedHashMap<>(); for (PersistentEntity persistentEntity : pendingInserts.keySet()) { final Collection inserts = pendingInserts.get(persistentEntity); - if(inserts != null && !inserts.isEmpty()) { + if (inserts != null && !inserts.isEmpty()) { List> entityWrites = getWriteModelsForEntity(persistentEntity, writeModels); for (PendingInsert insert : inserts) { insert.run(); - if(insert.isVetoed()) continue; + if (insert.isVetoed()) continue; - entityWrites.add(new InsertOneModel((Document) insert.getNativeEntry())); + entityWrites.add(new InsertOneModel<>((Document) insert.getNativeEntry())); final List cascadeOperations = insert.getCascadeOperations(); addPostFlushOperations(cascadeOperations); @@ -110,7 +124,6 @@ public void flush(WriteConcern writeConcern) { } } - for (PersistentEntity persistentEntity : pendingUpdates.keySet()) { final String name = persistentEntity.isRoot() ? persistentEntity.getName() : persistentEntity.getRootEntity().getName(); @@ -118,12 +131,12 @@ public void flush(WriteConcern writeConcern) { int numberOfPessimistic = numberOfPessimisticUpdates.containsKey(name) ? numberOfPessimisticUpdates.get(name) : 0; final Collection updates = pendingUpdates.get(persistentEntity); - if(updates != null && !updates.isEmpty()) { + if (updates != null && !updates.isEmpty()) { List> entityWrites = getWriteModelsForEntity(persistentEntity, writeModels); for (PendingUpdate update : updates) { update.run(); - if(update.isVetoed()) continue; + if (update.isVetoed()) continue; Document updateDoc = (Document) update.getNativeEntry(); updateDoc.remove(MongoConstants.MONGO_ID_FIELD); @@ -132,7 +145,7 @@ public void flush(WriteConcern writeConcern) { final Document id = new Document(MongoConstants.MONGO_ID_FIELD, nativeKey); MongoEntityPersister documentEntityPersister = (MongoEntityPersister) getPersister(persistentEntity); final EntityAccess entityAccess = update.getEntityAccess(); - if(documentEntityPersister.isVersioned(entityAccess)) { + if (documentEntityPersister.isVersioned(entityAccess)) { Object currentVersion = documentEntityPersister.getCurrentVersion(entityAccess); documentEntityPersister.incrementVersion(entityAccess); @@ -147,7 +160,7 @@ public void flush(WriteConcern writeConcern) { } final UpdateOptions options = new UpdateOptions(); - entityWrites.add(new UpdateOneModel(id, updateDoc, options.upsert(false))); + entityWrites.add(new UpdateOneModel<>(id, updateDoc, options.upsert(false))); final List cascadeOperations = update.getCascadeOperations(); addPostFlushOperations(cascadeOperations); @@ -158,21 +171,20 @@ public void flush(WriteConcern writeConcern) { } - for (PersistentEntity persistentEntity : pendingDeletes.keySet()) { final Collection deletes = pendingDeletes.get(persistentEntity); - if(deletes != null && !deletes.isEmpty()) { + if (deletes != null && !deletes.isEmpty()) { List> entityWrites = getWriteModelsForEntity(persistentEntity, writeModels); - List nativeKeys = new ArrayList(); + List nativeKeys = new ArrayList<>(); for (PendingDelete delete : deletes) { delete.run(); - if(delete.isVetoed()) continue; + if (delete.isVetoed()) continue; final Object k = delete.getNativeKey(); - if(k != null) { - if(k instanceof Document) { - entityWrites.add(new DeleteManyModel((Document)k)); + if (k != null) { + if (k instanceof Document) { + entityWrites.add(new DeleteManyModel<>((Document) k)); } else { nativeKeys.add(k); @@ -182,24 +194,23 @@ public void flush(WriteConcern writeConcern) { final List cascadeOperations = delete.getCascadeOperations(); addPostFlushOperations(cascadeOperations); } - entityWrites.add(new DeleteManyModel(new Document( MongoConstants.MONGO_ID_FIELD, new Document(BsonQuery.IN_OPERATOR, nativeKeys)))); + entityWrites.add(new DeleteManyModel<>(new Document(MongoConstants.MONGO_ID_FIELD, new Document(BsonQuery.IN_OPERATOR, nativeKeys)))); } } - for (PersistentEntity persistentEntity : writeModels.keySet()) { com.mongodb.client.MongoCollection collection = getCollection(persistentEntity); final WriteConcern wc = getWriteConcern(); - if(wc != null) { + if (wc != null) { collection = collection.withWriteConcern(wc); } final List> writes = writeModels.get(persistentEntity); - if(!writes.isEmpty()) { + if (!writes.isEmpty()) { final com.mongodb.bulk.BulkWriteResult bulkWriteResult = collection .bulkWrite(writes); - if( !bulkWriteResult.wasAcknowledged() ) { + if (!bulkWriteResult.wasAcknowledged()) { errorOccured = true; throw new DataIntegrityViolationException("Write operation was not acknowledged"); } @@ -210,7 +221,7 @@ public void flush(WriteConcern writeConcern) { final Integer numPessimistic = numberOfPessimisticUpdates.get(name); final int no = numOptimistic != null ? numOptimistic : 0; final int pe = numPessimistic != null ? numPessimistic : 0; - if((matchedCount - pe) != no) { + if ((matchedCount - pe) != no) { setFlushMode(FlushModeType.COMMIT); throw new OptimisticLockingException(persistentEntity, null); } @@ -235,7 +246,7 @@ protected Document createSetAndUnsetDoc(Document updateDoc) { final Document unsets = new Document(); for (String key : keys) { final Object v = updateDoc.get(key); - if(v == null) { + if (v == null) { unsets.put(key, ""); } } @@ -243,7 +254,7 @@ protected Document createSetAndUnsetDoc(Document updateDoc) { updateDoc.remove(key); } updateDoc = new Document(MONGO_SET_OPERATOR, updateDoc); - if(!unsets.isEmpty()) { + if (!unsets.isEmpty()) { updateDoc.put(MONGO_UNSET_OPERATOR, unsets); } return updateDoc; @@ -252,8 +263,8 @@ protected Document createSetAndUnsetDoc(Document updateDoc) { protected List> getWriteModelsForEntity(PersistentEntity persistentEntity, Map>> writeModels) { PersistentEntity key = persistentEntity.isRoot() ? persistentEntity : persistentEntity.getRootEntity(); List> entityWrites = writeModels.get(key); - if(entityWrites == null) { - entityWrites = new ArrayList>(); + if (entityWrites == null) { + entityWrites = new ArrayList<>(); writeModels.put(key, entityWrites); } return entityWrites; @@ -264,13 +275,11 @@ protected void flushPendingUpdates(Map beginTransactionInternal() { - return new SessionOnlyTransaction(getNativeInterface(), this); + return new SessionOnlyTransaction<>(getNativeInterface(), this); } - @Override public void delete(Iterable objects) { final Map toDelete = getDeleteMap(objects); @@ -291,12 +299,12 @@ public void delete(Iterable objects) { final MongoQuery query = new MongoQuery(this, persistentEntity); query.in(MongoEntityPersister.MONGO_ID_FIELD, toDelete.get(persistentEntity)); final Document mongoQuery = query.getMongoQuery(); - final EntityPersister persister = (EntityPersister)getPersister(persistentEntity); + final EntityPersister persister = (EntityPersister) getPersister(persistentEntity); addPendingDelete(new PendingDeleteAdapter(persistentEntity, mongoQuery, null) { @Override public void run() { for (Object o : toDelete.get(persistentEntity)) { - if( !persister.cancelDelete(persistentEntity, createEntityAccess(persistentEntity, o)) ) { + if (!persister.cancelDelete(persistentEntity, createEntityAccess(persistentEntity, o))) { clear(o); } } @@ -306,10 +314,9 @@ public void run() { } - protected Map getDeleteMap(Iterable objects) { // sort the objects into sets by Persister, in case the objects are of different types. - Map toDelete = new HashMap(); + Map toDelete = new HashMap<>(); for (Object object : objects) { if (object == null) { continue; @@ -323,14 +330,13 @@ protected Map getDeleteMap(Iterable objects) { toDelete.put(p, listForPersister = new ArrayList()); } Serializable id = getObjectIdentifier(object); - if(id != null) { + if (id != null) { listForPersister.add(id); } } return toDelete; } - @Override public long deleteAll(QueryableCriteria criteria) { final PersistentEntity entity = criteria.getPersistentEntity(); @@ -338,7 +344,7 @@ public long deleteAll(QueryableCriteria criteria) { final com.mongodb.client.MongoCollection collection = getCollection(entity); final DeleteResult deleteResult = collection.deleteMany(nativeQuery); - if( deleteResult.wasAcknowledged() ) { + if (deleteResult.wasAcknowledged()) { return deleteResult.getDeletedCount(); } else { @@ -346,8 +352,6 @@ public long deleteAll(QueryableCriteria criteria) { } } - - @Override public long updateAll(QueryableCriteria criteria, Map properties) { final PersistentEntity entity = criteria.getPersistentEntity(); @@ -356,7 +360,7 @@ public long updateAll(QueryableCriteria criteria, Map properties final UpdateOptions updateOptions = new UpdateOptions(); updateOptions.upsert(false); final UpdateResult updateResult = collection.updateMany(nativeQuery, new Document("$set", properties), updateOptions); - if(updateResult.wasAcknowledged()) { + if (updateResult.wasAcknowledged()) { try { return updateResult.getModifiedCount(); } catch (UnsupportedOperationException e) { @@ -371,12 +375,12 @@ public long updateAll(QueryableCriteria criteria, Map properties @Override public Object decode(Class type, Object nativeObject) { - if(nativeObject instanceof FindIterable) { + if (nativeObject instanceof FindIterable) { return decode(type, ((FindIterable) nativeObject).first()); } - else if( nativeObject instanceof Document ){ + else if (nativeObject instanceof Document) { Document dbo = (Document) nativeObject; - Serializable key = (Serializable)dbo.get(AbstractMongoObectEntityPersister.MONGO_ID_FIELD); + Serializable key = (Serializable) dbo.get(AbstractMongoObectEntityPersister.MONGO_ID_FIELD); final Persister persister = getPersister(type); final MongoEntityPersister mongoEntityPersister = (MongoEntityPersister) persister; return mongoEntityPersister.createObjectFromNativeEntry(mongoEntityPersister.getPersistentEntity(), key, dbo); @@ -388,7 +392,7 @@ private Document buildNativeDocumentQueryFromCriteria(QueryableCriteria criteria MongoQuery mongoQuery = new MongoQuery(this, entity); List criteriaList = criteria.getCriteria(); - for(Query.Criterion c : criteriaList) { + for (Query.Criterion c : criteriaList) { mongoQuery.add(c); } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoAttribute.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoAttribute.groovy index edcec295f43..730de2e055b 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoAttribute.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoAttribute.groovy @@ -21,6 +21,7 @@ package org.grails.datastore.mapping.mongo.config import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + import org.grails.datastore.mapping.document.config.Attribute /** @@ -33,11 +34,11 @@ import org.grails.datastore.mapping.document.config.Attribute @Builder(builderStrategy = SimpleStrategy, prefix = '') class MongoAttribute extends Attribute { - public static final String INDEX_TYPE = "type" - public static final String INDEX_TYPE_2D = "2d" - public static final String INDEX_TYPE_2DSPHERE = "2dsphere" + public static final String INDEX_TYPE = 'type' + public static final String INDEX_TYPE_2D = '2d' + public static final String INDEX_TYPE_2DSPHERE = '2dsphere' - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') private Map indexAttributes /** @@ -66,7 +67,6 @@ class MongoAttribute extends Attribute { } } - /** * Configures the index attributes * @@ -109,7 +109,7 @@ class MongoAttribute extends Attribute { * @param indexType The geo index type */ void setGeoIndex(String indexType) { - if(Boolean.valueOf(indexType)) { + if (Boolean.valueOf(indexType)) { setIndex(true) initIndexAttributes() indexAttributes.put(INDEX_TYPE, INDEX_TYPE_2D) @@ -151,7 +151,7 @@ class MongoAttribute extends Attribute { return this } - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') void initIndexAttributes() { if (indexAttributes == null) { indexAttributes = new HashMap() diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoClientOptionsBuilder.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoClientOptionsBuilder.groovy index 26ac71aef04..7b28bbec152 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoClientOptionsBuilder.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoClientOptionsBuilder.groovy @@ -19,16 +19,19 @@ package org.grails.datastore.mapping.mongo.config -import com.mongodb.ConnectionString -import com.mongodb.MongoClientSettings -import com.mongodb.MongoCredential +import java.lang.reflect.Modifier + import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.util.logging.Slf4j + +import com.mongodb.ConnectionString +import com.mongodb.MongoClientSettings +import com.mongodb.MongoCredential + import org.springframework.core.env.PropertyResolver import org.springframework.util.ReflectionUtils -import java.lang.reflect.Modifier /** * Helper class for building {@link MongoClientSettings} from a {@link PropertyResolver} * @@ -38,6 +41,7 @@ import java.lang.reflect.Modifier @CompileStatic @Slf4j class MongoClientOptionsBuilder { + final PropertyResolver propertyResolver final String databaseName @@ -62,7 +66,7 @@ class MongoClientOptionsBuilder { username = propertyResolver.getProperty(MongoSettings.SETTING_USERNAME, '') password = propertyResolver.getProperty(MongoSettings.SETTING_PASSWORD, '') uAndP = username && password ? "$username:$password@" : '' - if(host) { + if (host) { def port = propertyResolver.getProperty(MongoSettings.SETTING_PORT, '') port = port ? ":$port" : '' connectionString = new ConnectionString("mongodb://${uAndP}${host}${port}/$databaseName") @@ -84,20 +88,20 @@ class MongoClientOptionsBuilder { def methods = builderClass.declaredMethods \ def applyConnectionStringMethod = ReflectionUtils.findMethod(builderClass, 'applyConnectionString', ConnectionString) - if(applyConnectionStringMethod != null) { + if (applyConnectionStringMethod != null) { applyConnectionStringMethod.invoke(builder, connectionString) } - if(mongoCredential != null) { + if (mongoCredential != null) { def credentialListMethod = ReflectionUtils.findMethod(builderClass, 'credentialList', List) - if(credentialListMethod != null) { + if (credentialListMethod != null) { credentialListMethod.invoke(builder, Arrays.asList(mongoCredential)) } } for (method in methods) { def methodName = method.name - if(!Modifier.isPublic(method.modifiers) || methodName.equals('applyConnectionString') || methodName.equals('credentialList')) { + if (!Modifier.isPublic(method.modifiers) || methodName.equals('applyConnectionString') || methodName.equals('credentialList')) { continue } @@ -110,17 +114,17 @@ class MongoClientOptionsBuilder { if (builderMethod != null && Modifier.isStatic(builderMethod.modifiers)) { if (propertyResolver.containsProperty(propertyPath)) { def newBuilder = builderMethod.invoke(argType) - if (newBuilder.respondsTo("applyConnectionString")) { + if (newBuilder.respondsTo('applyConnectionString')) { applyConnectionString(newBuilder, connectionString) } method.invoke(builder, buildInternal(newBuilder, propertyPath)) } } else { - if(argType.isEnum()) { - def value = propertyResolver.getProperty(propertyPath, "") + if (argType.isEnum()) { + def value = propertyResolver.getProperty(propertyPath, '') if (value) { try { - method.invoke(builder, Enum.valueOf((Class)argType, value)) + method.invoke(builder, Enum.valueOf((Class) argType, value)) } catch (Throwable e) { log.warn("Error occurred reading setting [$propertyPath]: ${e.message}", e) } @@ -130,8 +134,8 @@ class MongoClientOptionsBuilder { def valueOfMethod = ReflectionUtils.findMethod(argType, 'valueOf') if (valueOfMethod != null && Modifier.isStatic(valueOfMethod.modifiers)) { try { - def value = propertyResolver.getProperty(propertyPath, "") - if(value) { + def value = propertyResolver.getProperty(propertyPath, '') + if (value) { def converted = valueOfMethod.invoke(argType, value) method.invoke(builder, converted) } @@ -139,10 +143,10 @@ class MongoClientOptionsBuilder { log.warn("Error occurred reading setting [$propertyPath]: ${e.message}", e) } } - else if(!List.isAssignableFrom(argType)){ + else if (!List.isAssignableFrom(argType)) { try { def value = propertyResolver.getProperty(propertyPath, (Class) argType, null) - if(value != null) { + if (value != null) { method.invoke(builder, value) } } catch (Throwable e) { @@ -154,7 +158,7 @@ class MongoClientOptionsBuilder { } - if(!root) { + if (!root) { return doBuild(builder) } else { diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoCollection.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoCollection.groovy index da1f92827fb..80d4ab9a8de 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoCollection.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoCollection.groovy @@ -14,10 +14,12 @@ */ package org.grails.datastore.mapping.mongo.config -import com.mongodb.WriteConcern import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + +import com.mongodb.WriteConcern + import org.grails.datastore.mapping.config.Entity import org.grails.datastore.mapping.document.config.Attribute import org.grails.datastore.mapping.document.config.Collection @@ -28,7 +30,7 @@ import org.grails.datastore.mapping.query.Query * * @author Graeme Rocher */ -@SuppressWarnings("rawtypes") +@SuppressWarnings('rawtypes') @CompileStatic @Builder(builderStrategy = SimpleStrategy, prefix = '') class MongoCollection extends Collection { @@ -52,9 +54,8 @@ class MongoCollection extends Collection { return new MongoAttribute() } - Query.Order getSort() { - return (Query.Order)super.getSort() + return (Query.Order) super.getSort() } /** @@ -64,23 +65,23 @@ class MongoCollection extends Collection { */ MongoCollection setSort(Object s) { if (s instanceof Query.Order) { - super.setSort( (Query.Order) s ) + super.setSort((Query.Order) s) } if (s instanceof Map) { Map m = (Map) s if (!m.isEmpty()) { Map.Entry entry = (Map.Entry) m.entrySet().iterator().next() Object key = entry.getKey() - if ("desc".equalsIgnoreCase(entry.getValue().toString())) { - super.setSort( Query.Order.desc(key.toString()) ) + if ('desc'.equalsIgnoreCase(entry.getValue().toString())) { + super.setSort(Query.Order.desc(key.toString())) } else { - super.setSort( Query.Order.asc(key.toString()) ) + super.setSort(Query.Order.asc(key.toString())) } } } else { - super.setSort( Query.Order.asc(s.toString()) ) + super.setSort(Query.Order.asc(s.toString())) } return this } @@ -118,7 +119,7 @@ class MongoCollection extends Collection { * @param options The index options */ void index(Map definition, Map options) { - if(definition != null && !definition.isEmpty()) { + if (definition != null && !definition.isEmpty()) { indices.add(new Index(definition, options)) } } @@ -158,28 +159,28 @@ class MongoCollection extends Collection { } @Override - Entity property(String name, @DelegatesTo(MongoAttribute.class) Closure propertyConfig) { + Entity property(String name, @DelegatesTo(MongoAttribute) Closure propertyConfig) { return super.property(name, propertyConfig) } @Override - Entity id(@DelegatesTo(MongoAttribute.class) Closure identityConfig) { + Entity id(@DelegatesTo(MongoAttribute) Closure identityConfig) { return super.id(identityConfig) } @Override - Entity version(@DelegatesTo(MongoAttribute.class) Closure versionConfig) { + Entity version(@DelegatesTo(MongoAttribute) Closure versionConfig) { return super.version(versionConfig) } @Override - MongoAttribute property(@DelegatesTo(MongoAttribute.class) Closure propertyConfig) { - return (MongoAttribute)super.property(propertyConfig) + MongoAttribute property(@DelegatesTo(MongoAttribute) Closure propertyConfig) { + return (MongoAttribute) super.property(propertyConfig) } @Override MongoAttribute property(Map propertyConfig) { - return (MongoAttribute)super.property(propertyConfig) + return (MongoAttribute) super.property(propertyConfig) } /** * Definition of an index @@ -188,7 +189,6 @@ class MongoCollection extends Collection { Map definition = new HashMap() Map options = new HashMap() - Index(Map definition) { this.definition = definition } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoMappingContext.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoMappingContext.java index 36ca060a8d6..b2f82582a05 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoMappingContext.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoMappingContext.java @@ -18,25 +18,61 @@ */ package org.grails.datastore.mapping.mongo.config; -import com.mongodb.ConnectionString; -import groovy.lang.Closure; - import java.beans.PropertyDescriptor; import java.math.BigDecimal; import java.math.BigInteger; -import java.util.*; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Date; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.UUID; import java.util.regex.Pattern; +import groovy.lang.Closure; + +import com.mongodb.ConnectionString; import org.bson.Document; import org.bson.codecs.Codec; import org.bson.codecs.configuration.CodecConfigurationException; import org.bson.codecs.configuration.CodecRegistries; import org.bson.codecs.configuration.CodecRegistry; import org.bson.conversions.Bson; -import org.bson.types.*; -import org.grails.datastore.bson.codecs.*; +import org.bson.types.Binary; +import org.bson.types.Code; +import org.bson.types.Decimal128; +import org.bson.types.ObjectId; +import org.bson.types.Symbol; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.core.convert.converter.ConverterRegistry; +import org.springframework.core.env.PropertyResolver; + +import org.grails.datastore.bson.codecs.BigDecimalCodec; +import org.grails.datastore.bson.codecs.CodecCustomTypeMarshaller; +import org.grails.datastore.bson.codecs.CodecExtensions; +import org.grails.datastore.bson.codecs.InstantCodec; +import org.grails.datastore.bson.codecs.LocalDateCodec; +import org.grails.datastore.bson.codecs.LocalDateTimeCodec; +import org.grails.datastore.bson.codecs.LocalTimeCodec; +import org.grails.datastore.bson.codecs.OffsetDateTimeCodec; +import org.grails.datastore.bson.codecs.OffsetTimeCodec; +import org.grails.datastore.bson.codecs.PeriodCodec; +import org.grails.datastore.bson.codecs.ZonedDateTimeCodec; import org.grails.datastore.bson.codecs.encoders.SimpleEncoder; -import org.grails.datastore.gorm.mongo.geo.*; +import org.grails.datastore.gorm.mongo.geo.BoxType; +import org.grails.datastore.gorm.mongo.geo.CircleType; +import org.grails.datastore.gorm.mongo.geo.GeometryCollectionType; +import org.grails.datastore.gorm.mongo.geo.LineStringType; +import org.grails.datastore.gorm.mongo.geo.MultiLineStringType; +import org.grails.datastore.gorm.mongo.geo.MultiPointType; +import org.grails.datastore.gorm.mongo.geo.MultiPolygonType; +import org.grails.datastore.gorm.mongo.geo.PointType; +import org.grails.datastore.gorm.mongo.geo.PolygonType; +import org.grails.datastore.gorm.mongo.geo.ShapeType; import org.grails.datastore.gorm.mongo.simple.EnumType; import org.grails.datastore.mapping.config.AbstractGormMappingFactory; import org.grails.datastore.mapping.config.ConfigurationUtils; @@ -44,17 +80,19 @@ import org.grails.datastore.mapping.document.config.Attribute; import org.grails.datastore.mapping.document.config.Collection; import org.grails.datastore.mapping.document.config.DocumentMappingContext; -import org.grails.datastore.mapping.model.*; - +import org.grails.datastore.mapping.model.AbstractClassMapping; +import org.grails.datastore.mapping.model.ClassMapping; +import org.grails.datastore.mapping.model.EmbeddedPersistentEntity; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.MappingFactory; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.PropertyMapping; import org.grails.datastore.mapping.model.types.Custom; import org.grails.datastore.mapping.model.types.Identity; import org.grails.datastore.mapping.mongo.MongoConstants; import org.grails.datastore.mapping.mongo.MongoDatastore; import org.grails.datastore.mapping.mongo.connections.AbstractMongoConnectionSourceSettings; import org.grails.datastore.mapping.reflect.ClassUtils; -import org.springframework.core.convert.converter.Converter; -import org.springframework.core.convert.converter.ConverterRegistry; -import org.springframework.core.env.PropertyResolver; /** * Models a {@link org.grails.datastore.mapping.model.MappingContext} for Mongo. @@ -111,7 +149,7 @@ public MongoMappingContext(String defaultDatabaseName, Closure defaultMapping) { * @param defaultMapping The default database mapping configuration * @param classes The persistent classes */ - public MongoMappingContext(String defaultDatabaseName, Closure defaultMapping, Class...classes) { + public MongoMappingContext(String defaultDatabaseName, Closure defaultMapping, Class... classes) { super(defaultDatabaseName, defaultMapping); initialize(classes); @@ -126,7 +164,7 @@ public MongoMappingContext(String defaultDatabaseName, Closure defaultMapping, C * */ @Deprecated - public MongoMappingContext(PropertyResolver configuration, Class...classes) { + public MongoMappingContext(PropertyResolver configuration, Class... classes) { this(getDefaultDatabaseName(configuration), configuration.getProperty(MongoSettings.SETTING_DEFAULT_MAPPING, Closure.class, null), classes); } @@ -155,7 +193,7 @@ protected void initialize(ConnectionSourceSettings settings) { AbstractMongoConnectionSourceSettings mongoConnectionSourceSettings = (AbstractMongoConnectionSourceSettings) settings; List> codecClasses = mongoConnectionSourceSettings.getCodecs(); - if(mongoConnectionSourceSettings.isDecimalType() && ClassUtils.isPresent(DECIMAL_TYPE_CLASS_NAME)) { + if (mongoConnectionSourceSettings.isDecimalType() && ClassUtils.isPresent(DECIMAL_TYPE_CLASS_NAME)) { MONGO_NATIVE_TYPES.add(BigDecimal.class.getName()); MONGO_NATIVE_TYPES.add(BigInteger.class.getName()); SimpleEncoder.enableBigDecimalEncoding(); @@ -163,7 +201,6 @@ protected void initialize(ConnectionSourceSettings settings) { codecClasses.add(BigDecimalCodec.class); } - Iterable codecList = ConfigurationUtils.findServices(codecClasses, Codec.class); List> codecs = new ArrayList<>(); codecs.add(new InstantCodec()); @@ -179,7 +216,7 @@ protected void initialize(ConnectionSourceSettings settings) { codecs.add(codec); } - if(mongoConnectionSourceSettings.getCodecRegistry() != null) { + if (mongoConnectionSourceSettings.getCodecRegistry() != null) { this.codecRegistry = CodecRegistries.fromRegistries( mongoConnectionSourceSettings.getCodecRegistry(), CodecRegistries.fromCodecs(codecs) @@ -196,7 +233,7 @@ private void initialize(Class[] classes) { converterRegistry.addConverter(new Converter() { public ObjectId convert(String source) { - if(ObjectId.isValid(source)) { + if (ObjectId.isValid(source)) { return new ObjectId(source); } else { @@ -230,7 +267,7 @@ public BigDecimal convert(Decimal128 source) { } }); - converterRegistry.addConverter(new Converter() { + converterRegistry.addConverter(new Converter() { @Override public Decimal128 convert(BigDecimal source) { return new Decimal128(source); @@ -244,14 +281,13 @@ public BigInteger convert(Decimal128 source) { } }); - converterRegistry.addConverter(new Converter() { + converterRegistry.addConverter(new Converter() { @Override public Decimal128 convert(BigInteger source) { return new Decimal128(new BigDecimal(source.toString())); } }); - for (Converter converter : CodecExtensions.getBsonConverters()) { converterRegistry.addConverter(converter); } @@ -267,7 +303,7 @@ public Decimal128 convert(BigInteger source) { */ public static boolean isMongoNativeType(Class clazz) { return MongoMappingContext.MONGO_NATIVE_TYPES.contains(clazz.getName()) || - Bson.class.isAssignableFrom(clazz.getClass()) ; + Bson.class.isAssignableFrom(clazz.getClass()); } public static String getDefaultDatabaseName(PropertyResolver configuration) { @@ -275,7 +311,7 @@ public static String getDefaultDatabaseName(PropertyResolver configuration) { if (connectionString != null) { String database = new ConnectionString(connectionString).getDatabase(); - if(database != null) { + if (database != null) { return database; } } @@ -294,7 +330,6 @@ protected Class getEntityMappedFormType() { return MongoCollection.class; } - @Override public Identity createIdentity(PersistentEntity owner, MappingContext context, PropertyDescriptor pd) { Identity identity = super.createIdentity(owner, context, pd); @@ -309,10 +344,11 @@ public boolean isCustomType(Class propertyType) { @Override public Custom createCustom(PersistentEntity owner, MappingContext context, final PropertyDescriptor pd) { - if(hasCodecForType(pd.getPropertyType())) { + if (hasCodecForType(pd.getPropertyType())) { CodecCustomTypeMarshaller customTypeMarshaller = new CodecCustomTypeMarshaller(codecRegistry.get(pd.getPropertyType()), MongoMappingContext.this); - return new Custom(owner, context, pd, customTypeMarshaller) { + return new Custom<>(owner, context, pd, customTypeMarshaller) { PropertyMapping propertyMapping = createPropertyMapping(this, owner); + public PropertyMapping getMapping() { return propertyMapping; } @@ -329,12 +365,12 @@ public boolean isSimpleType(Class propType) { if (propType.isArray()) { return isSimpleType(propType.getComponentType()) || super.isSimpleType(propType); } - return isMongoNativeType(propType) || super.isSimpleType(propType); + return isMongoNativeType(propType) || super.isSimpleType(propType); } } private boolean hasCodecForType(Class propType) { - if(hasCodecCache.containsKey(propType)) { + if (hasCodecCache.containsKey(propType)) { return hasCodecCache.get(propType); } else { @@ -349,7 +385,6 @@ private boolean hasCodecForType(Class propType) { } } - protected void registerMongoTypes() { MappingFactory mappingFactory = getMappingFactory(); mappingFactory.registerCustomType(new GeometryCollectionType()); @@ -403,9 +438,10 @@ public DocumentCollectionMapping(PersistentEntity entity, MappingContext context super(entity, context); this.mappedForm = (Collection) context.getMappingFactory().createMappedForm(DocumentEmbeddedPersistentEntity.this); } + @Override public Collection getMappedForm() { - return mappedForm ; + return mappedForm; } } } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoSettings.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoSettings.groovy index 9ae721c2227..39684d3e9d1 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoSettings.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/config/MongoSettings.groovy @@ -28,70 +28,71 @@ import org.grails.datastore.mapping.config.Settings * @since 6.0 */ interface MongoSettings extends Settings { + /** * The default database name if none is specified */ - String DEFAULT_DATABASE_NAME = "test" + String DEFAULT_DATABASE_NAME = 'test' /** * The prefix */ - String PREFIX = "grails.mongodb" + String PREFIX = 'grails.mongodb' /** * The database name */ - String SETTING_DATABASE_NAME = "grails.mongodb.databaseName" + String SETTING_DATABASE_NAME = 'grails.mongodb.databaseName' /** * Whether to use the decimal type */ - String SETTING_DECIMAL_TYPE = "grails.mongodb.decimalType" + String SETTING_DECIMAL_TYPE = 'grails.mongodb.decimalType' /** * The connection string */ - String SETTING_CONNECTION_STRING = "grails.mongodb.connectionString" + String SETTING_CONNECTION_STRING = 'grails.mongodb.connectionString' /** * All MongoDB connections */ - String SETTING_CONNECTIONS = "grails.mongodb.connections" + String SETTING_CONNECTIONS = 'grails.mongodb.connections' /** * All MongoDB codecs */ - String SETTING_CODECS = "grails.mongodb.codecs" + String SETTING_CODECS = 'grails.mongodb.codecs' /** * The URL */ - String SETTING_URL = "grails.mongodb.url" + String SETTING_URL = 'grails.mongodb.url' /** * The default mapping */ - String SETTING_DEFAULT_MAPPING = "grails.mongodb.default.mapping" + String SETTING_DEFAULT_MAPPING = 'grails.mongodb.default.mapping' /** * The client options */ - String SETTING_OPTIONS = "grails.mongodb.options" + String SETTING_OPTIONS = 'grails.mongodb.options' /** * The host */ - String SETTING_HOST = "grails.mongodb.host" + String SETTING_HOST = 'grails.mongodb.host' /** * The port */ - String SETTING_PORT = "grails.mongodb.port" + String SETTING_PORT = 'grails.mongodb.port' /** * The username */ - String SETTING_USERNAME = "grails.mongodb.username" + String SETTING_USERNAME = 'grails.mongodb.username' /** * The password */ - String SETTING_PASSWORD = "grails.mongodb.password" + String SETTING_PASSWORD = 'grails.mongodb.password' - String SETTING_STATELESS = "grails.mongodb.stateless" + String SETTING_STATELESS = 'grails.mongodb.stateless' - String SETTING_ENGINE = "grails.mongodb.engine" + String SETTING_ENGINE = 'grails.mongodb.engine' -} \ No newline at end of file +} diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/AbstractMongoConnectionSourceSettings.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/AbstractMongoConnectionSourceSettings.groovy index c78dae6909b..1ec305b2d56 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/AbstractMongoConnectionSourceSettings.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/AbstractMongoConnectionSourceSettings.groovy @@ -19,14 +19,16 @@ package org.grails.datastore.mapping.mongo.connections -import com.mongodb.ConnectionString -import com.mongodb.ServerAddress import groovy.transform.AutoClone import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + +import com.mongodb.ConnectionString +import com.mongodb.ServerAddress import org.bson.codecs.Codec import org.bson.codecs.configuration.CodecRegistry + import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings import org.grails.datastore.mapping.mongo.MongoConstants import org.grails.datastore.mapping.mongo.config.MongoSettings @@ -50,11 +52,10 @@ abstract class AbstractMongoConnectionSourceSettings extends ConnectionSourceSet */ String databaseName = DEFAULT_DATABASE_NAME - /** * The host name to use */ - String host = ServerAddress.defaultHost(); + String host = ServerAddress.defaultHost() /** * The port to use @@ -89,7 +90,7 @@ abstract class AbstractMongoConnectionSourceSettings extends ConnectionSourceSet /** * The collection name to use to resolve connections when using {@link MongoConnectionSources} */ - String connectionsCollection = "mongo.connections" + String connectionsCollection = 'mongo.connections' /** * Custom MongoDB codecs @@ -105,7 +106,7 @@ abstract class AbstractMongoConnectionSourceSettings extends ConnectionSourceSet * @return Obtain the final URL whether from the connection string or the host/port setting */ ConnectionString getUrl() { - if(connectionString != null) { + if (connectionString != null) { return connectionString } else { @@ -126,7 +127,7 @@ abstract class AbstractMongoConnectionSourceSettings extends ConnectionSourceSet * @return Obtain the database name */ String getDatabase() { - if(connectionString != null) { + if (connectionString != null) { return connectionString.database ?: databaseName } else { diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceFactory.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceFactory.groovy index c8ab47eaaa5..4db4ddce546 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceFactory.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceFactory.groovy @@ -19,20 +19,23 @@ package org.grails.datastore.mapping.mongo.connections +import groovy.transform.CompileStatic + import com.mongodb.MongoClientSettings import com.mongodb.client.MongoClient import com.mongodb.client.MongoClients -import groovy.transform.CompileStatic import org.bson.codecs.Codec import org.bson.codecs.configuration.CodecRegistries import org.bson.codecs.configuration.CodecRegistry + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.core.env.PropertyResolver + import org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory import org.grails.datastore.mapping.core.connections.ConnectionSource import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings import org.grails.datastore.mapping.core.connections.DefaultConnectionSource import org.grails.datastore.mapping.mongo.config.MongoSettings -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.core.env.PropertyResolver /** * A factory for building {@link MongoClient} instances @@ -71,13 +74,13 @@ class MongoConnectionSourceFactory extends AbstractConnectionSourceFactory>) - if(this.codecRegistry != null) { + if (this.codecRegistry != null) { codecRegistry = CodecRegistries.fromRegistries(codecRegistry, this.codecRegistry) } settings.codecRegistry = codecRegistry @@ -101,10 +104,10 @@ class MongoConnectionSourceFactory extends AbstractConnectionSourceFactory MongoConnectionSourceSettings buildRuntimeSettings(String name, PropertyResolver configuration, F fallbackSettings) { - MongoConnectionSourceSettingsBuilder settingsBuilder = new MongoConnectionSourceSettingsBuilder(configuration, "", fallbackSettings) + MongoConnectionSourceSettingsBuilder settingsBuilder = new MongoConnectionSourceSettingsBuilder(configuration, '', fallbackSettings) MongoClientSettings.Builder builder = clientOptionsBuilder ?: settingsBuilder.clientOptionsBuilder MongoConnectionSourceSettings settings = settingsBuilder.build() - if(builder != null) { + if (builder != null) { settings.options = builder } return settings diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettings.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettings.groovy index 6832c49f34a..6615df74163 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettings.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettings.groovy @@ -19,11 +19,12 @@ package org.grails.datastore.mapping.mongo.connections -import com.mongodb.MongoClientSettings import groovy.transform.AutoClone import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy +import com.mongodb.MongoClientSettings + /** * Settings for MongoDB driver * diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettingsBuilder.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettingsBuilder.groovy index 560cbddef38..bb94825930d 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettingsBuilder.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/connections/MongoConnectionSourceSettingsBuilder.groovy @@ -19,15 +19,18 @@ package org.grails.datastore.mapping.mongo.connections +import groovy.transform.CompileStatic + import com.mongodb.ConnectionString import com.mongodb.MongoClientSettings import com.mongodb.MongoCredential -import groovy.transform.CompileStatic + +import org.springframework.core.env.PropertyResolver +import org.springframework.util.ReflectionUtils + import org.grails.datastore.mapping.config.ConfigurationBuilder import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings import org.grails.datastore.mapping.mongo.config.MongoSettings -import org.springframework.core.env.PropertyResolver -import org.springframework.util.ReflectionUtils /** * Creates MongoDB configuration @@ -36,7 +39,7 @@ import org.springframework.util.ReflectionUtils * @since 6.0 */ @CompileStatic -class MongoConnectionSourceSettingsBuilder extends ConfigurationBuilder{ +class MongoConnectionSourceSettingsBuilder extends ConfigurationBuilder { MongoClientSettings.Builder clientOptionsBuilder @@ -64,8 +67,8 @@ class MongoConnectionSourceSettingsBuilder extends ConfigurationBuilder { - private static final String CONNECTION_NAME = "name" + + private static final String CONNECTION_NAME = 'name' MongoConnectionSources(ConnectionSource defaultConnectionSource, ConnectionSourceFactory connectionSourceFactory, PropertyResolver configuration) { super(defaultConnectionSource, connectionSourceFactory, configuration) @@ -52,9 +56,9 @@ class MongoConnectionSources extends InMemoryConnectionSources)getSession()).getCachedEntry( - entity, (Serializable)entityAccess.getIdentifier(), true); + T cached = (T) ((SessionImplementor) getSession()).getCachedEntry( + entity, (Serializable) entityAccess.getIdentifier(), true); return !dbo.equals(cached); } @@ -133,7 +148,6 @@ protected void setEmbedded(T nativeEntry, String key, T embeddedEntry) { getValueRetrievalStrategy().setValue(nativeEntry, key, embeddedEntry); } - @Override protected void cascadeDeleteCollection(EntityAccess entityAccess, Association association) { Object propValue = entityAccess.getProperty(association.getName()); @@ -149,7 +163,7 @@ protected void cascadeDeleteCollection(EntityAccess entityAccess, Association as association.getReferencedPropertyName(), entityAccess.getEntity().getClass().getName(), entityAccess.getIdentifier()); continue; } - if(persister == null) { + if (persister == null) { persister = session.getPersister(child); } persister.delete(child); @@ -192,6 +206,7 @@ protected void setEmbeddedCollectionKeys(Association association, EntityAccess e } getValueRetrievalStrategy().setValue(embeddedEntry, association.getName(), dbRefs); } + /** * Implementors who want to support one-to-many associations embedded should implement this method * @@ -246,16 +261,16 @@ protected List retrieveAllEntities(PersistentEntity persistentEntity, query.in(identity.getName(), actualKeys); } else { - List keyList = new ArrayList(); + List keyList = new ArrayList<>(); for (Serializable key : keys) { keyList.add(key); } query.in(identity.getName(), keyList); } - List entityResults = new ArrayList(); + List entityResults = new ArrayList<>(); Iterator keyIterator = keys.iterator(); - Map resultMap = new HashMap(); + Map resultMap = new HashMap<>(); for (Object o : query.list()) { if (isEmbeddedEntry(o)) { final ValueRetrievalStrategy valueRetrievalStrategy = getValueRetrievalStrategy(); @@ -300,8 +315,6 @@ protected void refreshObjectStateFromNativeEntry(PersistentEntity persistentEnti } } - - @Override protected Object getEntryValue(T nativeEntry, String property) { Object value = getValueRetrievalStrategy().getValue(nativeEntry, property); @@ -341,7 +354,6 @@ protected PersistentEntity discriminatePersistentEntity(PersistentEntity persist return super.discriminatePersistentEntity(persistentEntity, nativeEntry); } - protected abstract String getCollectionName(PersistentEntity persistentEntity, T nativeEntry); protected boolean isReference(Association association) { @@ -358,7 +370,7 @@ protected boolean isReference(Association association) { @Override protected Collection getManyToManyKeys(PersistentEntity persistentEntity, Object object, Serializable nativeKey, T nativeEntry, ManyToMany manyToMany) { - return (Collection)getValueRetrievalStrategy().getValue(nativeEntry, manyToMany.getName() + "_$$manyToManyIds"); + return (Collection) getValueRetrievalStrategy().getValue(nativeEntry, manyToMany.getName() + "_$$manyToManyIds"); } @Override diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy index 9b3296c5d77..a4e7b7358c7 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoCodecEntityPersister.groovy @@ -18,14 +18,22 @@ */ package org.grails.datastore.mapping.mongo.engine +import groovy.transform.CompileStatic + +import jakarta.persistence.CascadeType + import com.mongodb.client.MongoClient import com.mongodb.client.MongoCollection import com.mongodb.client.model.FindOneAndUpdateOptions import com.mongodb.client.model.ReturnDocument -import grails.gorm.DetachedCriteria -import groovy.transform.CompileStatic import org.bson.Document import org.bson.types.ObjectId + +import org.springframework.context.ApplicationEventPublisher +import org.springframework.dao.CannotAcquireLockException +import org.springframework.dao.DataIntegrityViolationException + +import grails.gorm.DetachedCriteria import org.grails.datastore.mapping.cache.TPCacheAdapterRepository import org.grails.datastore.mapping.config.Property import org.grails.datastore.mapping.core.IdentityGenerationException @@ -41,8 +49,16 @@ import org.grails.datastore.mapping.dirty.checking.DirtyCheckingSupport import org.grails.datastore.mapping.engine.EntityAccess import org.grails.datastore.mapping.engine.ThirdPartyCacheEntityPersister import org.grails.datastore.mapping.engine.internal.MappingUtils -import org.grails.datastore.mapping.model.* -import org.grails.datastore.mapping.model.types.* +import org.grails.datastore.mapping.model.ClassMapping +import org.grails.datastore.mapping.model.IdentityMapping +import org.grails.datastore.mapping.model.MappingContext +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.model.PersistentProperty +import org.grails.datastore.mapping.model.types.Basic +import org.grails.datastore.mapping.model.types.Embedded +import org.grails.datastore.mapping.model.types.ManyToMany +import org.grails.datastore.mapping.model.types.OneToMany +import org.grails.datastore.mapping.model.types.ToOne import org.grails.datastore.mapping.mongo.MongoCodecSession import org.grails.datastore.mapping.mongo.MongoConstants import org.grails.datastore.mapping.mongo.MongoDatastore @@ -51,11 +67,6 @@ import org.grails.datastore.mapping.proxy.ProxyFactory import org.grails.datastore.mapping.query.Query import org.grails.datastore.mapping.reflect.EntityReflector import org.grails.datastore.mapping.reflect.FieldEntityAccess -import org.springframework.context.ApplicationEventPublisher -import org.springframework.dao.CannotAcquireLockException -import org.springframework.dao.DataIntegrityViolationException - -import jakarta.persistence.CascadeType /** * An {@org.grails.datastore.mapping.engine.EntityPersister} that uses the MongoDB 3.0 {@link org.bson.codecs.configuration.CodecRegistry} infrastructure @@ -66,15 +77,14 @@ import jakarta.persistence.CascadeType @CompileStatic class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { - public static final String INSTANCE_PREFIX = "instance:" + public static final String INSTANCE_PREFIX = 'instance:' public static final String MONGO_ID_FIELD = MongoConstants.MONGO_ID_FIELD public static final String MONGO_CLASS_FIELD = MongoConstants.MONGO_CLASS_FIELD - protected static final String NEXT_ID = "next_id" + protected static final String NEXT_ID = 'next_id' protected static final String NEXT_ID_SUFFIX = ".$NEXT_ID" public static final String INC_OPERATOR = MongoConstants.INC_OPERATOR public static final String ASSIGNED_IDENTIFIER_MAPPING = MongoConstants.ASSIGNED_IDENTIFIER_MAPPING - protected final MongoCodecSession mongoSession protected final MongoDatastore mongoDatastore protected boolean hasNumericalIdentifier = false @@ -88,8 +98,8 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { this.fastClassData = FieldEntityAccess.getOrIntializeReflector(entity) PersistentProperty identity = entity.identity if (identity != null) { - hasNumericalIdentifier = Long.class.isAssignableFrom(identity.type) - hasStringIdentifier = String.class.isAssignableFrom(identity.type) + hasNumericalIdentifier = Long.isAssignableFrom(identity.type) + hasStringIdentifier = String.isAssignableFrom(identity.type) } } @@ -108,7 +118,7 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { @Override protected List retrieveAllEntities(PersistentEntity pe, Serializable[] keys) { - retrieveAllEntities pe, Arrays.asList(keys) + retrieveAllEntities(pe, Arrays.asList(keys)) } @Override @@ -126,7 +136,7 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { } @Override - protected List persistEntities(PersistentEntity pe, @SuppressWarnings("rawtypes") Iterable objs) { + protected List persistEntities(PersistentEntity pe, @SuppressWarnings('rawtypes') Iterable objs) { objs.collect() { persistEntity(pe, it) } @@ -168,7 +178,6 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { @Override protected Serializable persistEntity(PersistentEntity entity, Object obj, boolean isInsert) { - ProxyFactory proxyFactory = getProxyFactory() // if called internally, obj can potentially be a proxy, which won't work. obj = proxyFactory.unwrap(obj) @@ -181,7 +190,6 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { return (Serializable) id } - final boolean idIsNull = id == null boolean isUpdate = !idIsNull && !isInsert def mongoCodecSession = mongoSession @@ -408,14 +416,13 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { ObjectId objectId = ObjectId.get() def identityType = persistentEntity.identity.type - if (ObjectId.class.isAssignableFrom(identityType)) { + if (ObjectId.isAssignableFrom(identityType)) { return objectId } return objectId.toString() } - @Override protected void deleteEntity(PersistentEntity pe, Object obj) { @@ -439,7 +446,7 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { addCascadeOperation(new PendingOperationAdapter(pe, id, obj) { @Override void run() { - self.firePostDeleteEvent pe, entityAccess + self.firePostDeleteEvent(pe, entityAccess) } }) } else { @@ -473,7 +480,7 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { } @Override - protected void deleteEntities(PersistentEntity pe, @SuppressWarnings("rawtypes") Iterable objects) { + protected void deleteEntities(PersistentEntity pe, @SuppressWarnings('rawtypes') Iterable objects) { def criteria = new DetachedCriteria(pe.javaClass) criteria.in(pe.identity.name, objects.collect() { getObjectIdentifier(it) }.findAll() { it != null }) mongoSession.deleteAll( @@ -488,27 +495,27 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { @Override Serializable refresh(Object o) { - throw new UnsupportedOperationException("Refresh not supported by codec entity persistence engine") + throw new UnsupportedOperationException('Refresh not supported by codec entity persistence engine') } @Override Object lock(Serializable id) throws CannotAcquireLockException { - throw new UnsupportedOperationException("Pessimistic locks not supported by MongoDB") + throw new UnsupportedOperationException('Pessimistic locks not supported by MongoDB') } @Override Object lock(Serializable id, int timeout) throws CannotAcquireLockException { - throw new UnsupportedOperationException("Pessimistic locks not supported by MongoDB") + throw new UnsupportedOperationException('Pessimistic locks not supported by MongoDB') } @Override boolean isLocked(Object o) { - throw new UnsupportedOperationException("Pessimistic locks not supported by MongoDB") + throw new UnsupportedOperationException('Pessimistic locks not supported by MongoDB') } @Override void unlock(Object o) { - throw new UnsupportedOperationException("Pessimistic locks not supported by MongoDB") + throw new UnsupportedOperationException('Pessimistic locks not supported by MongoDB') } @Override @@ -534,7 +541,6 @@ class MongoCodecEntityPersister extends ThirdPartyCacheEntityPersister { return mongoCollection } - protected String getCollectionName(PersistentEntity pe) { mongoSession.getCollectionName(pe) } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoEntityPersister.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoEntityPersister.java index f988327b2d9..1b025f8f2c0 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoEntityPersister.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/MongoEntityPersister.java @@ -27,13 +27,18 @@ import java.util.List; import java.util.Map; -import com.mongodb.*; +import com.mongodb.DBObject; import com.mongodb.client.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.model.FindOneAndUpdateOptions; import com.mongodb.client.model.ReturnDocument; import org.bson.Document; import org.bson.types.ObjectId; + +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.TypeDescriptor; + import org.grails.datastore.mapping.core.IdentityGenerationException; import org.grails.datastore.mapping.core.SessionImplementor; import org.grails.datastore.mapping.core.impl.PendingDeleteAdapter; @@ -46,9 +51,6 @@ import org.grails.datastore.mapping.mongo.config.MongoMappingContext; import org.grails.datastore.mapping.mongo.query.MongoQuery; import org.grails.datastore.mapping.query.Query; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.core.convert.ConversionService; -import org.springframework.core.convert.TypeDescriptor; /** * A {@link org.grails.datastore.mapping.engine.EntityPersister} implementation for the Mongo document store @@ -59,7 +61,7 @@ @SuppressWarnings({"rawtypes", "unchecked"}) public class MongoEntityPersister extends AbstractMongoObectEntityPersister { - public static final ValueRetrievalStrategy VALUE_RETRIEVAL_STRATEGY = new ValueRetrievalStrategy() { + public static final ValueRetrievalStrategy VALUE_RETRIEVAL_STRATEGY = new ValueRetrievalStrategy<>() { @Override public Object getValue(Document document, String name) { return document.get(name); @@ -76,22 +78,21 @@ public MongoEntityPersister(MappingContext mappingContext, PersistentEntity enti super(mappingContext, entity, mongoSession, publisher); } - @Override protected void loadEmbeddedCollection(EmbeddedCollection embeddedCollection, EntityAccess ea, Object embeddedInstances, String propertyKey) { - if(Map.class.isAssignableFrom(embeddedCollection.getType())) { - if(embeddedInstances instanceof Document) { + if (Map.class.isAssignableFrom(embeddedCollection.getType())) { + if (embeddedInstances instanceof Document) { Map instances = new HashMap(); - Document embedded = (Document)embeddedInstances; + Document embedded = (Document) embeddedInstances; for (String key : embedded.keySet()) { Object o = embedded.get(key); - if(o instanceof Document) { + if (o instanceof Document) { Document nativeEntry = (Document) o; Object instance = createObjectFromEmbeddedNativeEntry(embeddedCollection.getAssociatedEntity(), nativeEntry); - SessionImplementor si = (SessionImplementor)getSession(); + SessionImplementor si = (SessionImplementor) getSession(); si.cacheEntry(embeddedCollection.getAssociatedEntity(), createEmbeddedCacheEntryKey(instance), nativeEntry); instances.put(key, instance); } @@ -104,13 +105,13 @@ protected void loadEmbeddedCollection(EmbeddedCollection embeddedCollection, Collection instances = MappingUtils.createConcreteCollection(embeddedCollection.getType()); if (embeddedInstances instanceof Collection) { - Collection coll = (Collection)embeddedInstances; + Collection coll = (Collection) embeddedInstances; for (Object dbo : coll) { if (dbo instanceof Document) { - Document nativeEntry = (Document)dbo; + Document nativeEntry = (Document) dbo; Object instance = createObjectFromEmbeddedNativeEntry(embeddedCollection.getAssociatedEntity(), nativeEntry); - SessionImplementor si = (SessionImplementor)getSession(); + SessionImplementor si = (SessionImplementor) getSession(); si.cacheEntry(embeddedCollection.getAssociatedEntity(), createEmbeddedCacheEntryKey(instance), nativeEntry); instances.add(instance); } @@ -130,20 +131,17 @@ public Query createQuery() { return new MongoQuery((MongoSession) getSession(), getPersistentEntity()); } - @Override protected void deleteEntry(String family, final Object key, final Object entry) { final MongoSession session = (MongoSession) getSession(); - session. - addPendingDelete(new PendingDeleteAdapter(getPersistentEntity(), key, entry) { + session.addPendingDelete(new PendingDeleteAdapter(getPersistentEntity(), key, entry) { public void run() { - session.clear(entry); - } - }); + session.clear(entry); + } + }); } - @Override protected Object generateIdentifier(final PersistentEntity persistentEntity, final Document nativeEntry) { @@ -156,11 +154,10 @@ protected Object generateIdentifier(final PersistentEntity persistentEntity, fin final MongoClient client = mongoSession .getNativeInterface(); - final MongoCollection dbCollection = client + final MongoCollection dbCollection = client .getDatabase(mongoSession.getDatabase(persistentEntity)) .getCollection(collectionName + NEXT_ID_SUFFIX); - int attempts = 0; while (true) { @@ -175,7 +172,7 @@ protected Object generateIdentifier(final PersistentEntity persistentEntity, fin } else { attempts++; if (attempts > 3) { - throw new IdentityGenerationException("Unable to generate identity for ["+persistentEntity.getName()+"] using findAndModify after 3 attempts"); + throw new IdentityGenerationException("Unable to generate identity for [" + persistentEntity.getName() + "] using findAndModify after 3 attempts"); } } } @@ -194,13 +191,12 @@ protected Object generateIdentifier(final PersistentEntity persistentEntity, fin return stringId; } - @Override protected Document createNewEntry(String family, Object instance) { - SessionImplementor si = (SessionImplementor)getSession(); + SessionImplementor si = (SessionImplementor) getSession(); Document dbo = si.getCachedEntry(getPersistentEntity(), createInstanceCacheEntryKey(instance)); - if(dbo != null) { + if (dbo != null) { return dbo; } else { @@ -208,7 +204,6 @@ protected Document createNewEntry(String family, Object instance) { } } - @Override protected Document createNewEntry(String family) { Document dbo = new Document(); @@ -220,14 +215,12 @@ protected Document createNewEntry(String family) { return dbo; } - @Override protected void setEntryValue(Document nativeEntry, String key, Object value) { MappingContext mappingContext = getMappingContext(); setDBObjectValue(nativeEntry, key, value, mappingContext); } - public static void setDBObjectValue(Document nativeEntry, String key, Object value, MappingContext mappingContext) { Object nativeValue = getSimpleNativePropertyValue(value, mappingContext); nativeEntry.put(key, nativeValue); @@ -252,21 +245,21 @@ public static Object getSimpleNativePropertyValue(Object value, MappingContext m nativeValue = value; } else if (value.getClass().isArray()) { Object[] array = (Object[]) value; - List nativeColl = new ArrayList(array.length); + List nativeColl = new ArrayList<>(array.length); for (Object item : array) { nativeColl.add(getSimpleNativePropertyValue(item, mappingContext)); } nativeValue = nativeColl; } else if (value instanceof Collection) { - Collection existingColl = (Collection)value; - List nativeColl = new ArrayList(existingColl.size()); + Collection existingColl = (Collection) value; + List nativeColl = new ArrayList<>(existingColl.size()); for (Object item : existingColl) { nativeColl.add(getSimpleNativePropertyValue(item, mappingContext)); } nativeValue = nativeColl; } else if (value instanceof Map) { - Map existingMap = (Map)value; - Map newMap = new LinkedHashMap(); + Map existingMap = (Map) value; + Map newMap = new LinkedHashMap<>(); for (Map.Entry entry :existingMap.entrySet()) { newMap.put(entry.getKey(), getSimpleNativePropertyValue(entry.getValue(), mappingContext)); } @@ -298,7 +291,6 @@ private static Object convertPrimitiveToNative(Object item, MappingContext mappi return nativeValue; } - @Override protected Document retrieveEntry(final PersistentEntity persistentEntity, String family, final Serializable key) { @@ -306,30 +298,30 @@ protected Document retrieveEntry(final PersistentEntity persistentEntity, final MongoCollection collection = mongoSession .getNativeInterface() - .getDatabase( mongoSession.getDatabase(persistentEntity)) - .getCollection( mongoSession.getCollectionName(persistentEntity )); + .getDatabase(mongoSession.getDatabase(persistentEntity)) + .getCollection(mongoSession.getCollectionName(persistentEntity)); return collection.find(createDBObjectWithKey(key)).limit(1).first(); } private Document removeNullEntries(Document nativeEntry) { - for (String key : new HashSet(nativeEntry.keySet())) { + for (String key : new HashSet<>(nativeEntry.keySet())) { Object o = nativeEntry.get(key); if (o == null) { nativeEntry.remove(key); } else if (o instanceof Object[]) { - for (Object o2 : (Object[])o) { + for (Object o2 : (Object[]) o) { if (o2 instanceof Document) { - removeNullEntries((Document)o2); + removeNullEntries((Document) o2); } } } else if (o instanceof List) { - for (Object o2 : (List)o) { + for (Object o2 : (List) o) { if (o2 instanceof Document) { - removeNullEntries((Document)o2); + removeNullEntries((Document) o2); } } } else if (o instanceof Document) { - removeNullEntries((Document)o); + removeNullEntries((Document) o); } } return nativeEntry; @@ -366,20 +358,20 @@ private Document modifyNullsToUnsets(Document nativeEntry) { } else if ("_id".equals(key)) { } else if (o instanceof Object[]) { sets.put(key, o); - for (Object o2 : (Object[])o) { + for (Object o2 : (Object[]) o) { if (o2 instanceof Document) { - removeNullEntries((Document)o2); + removeNullEntries((Document) o2); } } } else if (o instanceof List) { sets.put(key, o); - for (Object o2 : (List)o) { + for (Object o2 : (List) o) { if (o2 instanceof Document) { - removeNullEntries((Document)o2); + removeNullEntries((Document) o2); } } } else if (o instanceof DBObject) { - sets.put(key, removeNullEntries((Document)o)); + sets.put(key, removeNullEntries((Document) o)); } else { sets.put(key, o); } @@ -408,7 +400,7 @@ protected void deleteEntries(String family, final List keys) { final MongoCollection dbCollection = getMongoSession().getCollection(getPersistentEntity()); MongoSession mongoSession = (MongoSession) getSession(); - MongoQuery query = (MongoQuery)mongoSession.createQuery(getPersistentEntity().getJavaClass()); + MongoQuery query = (MongoQuery) mongoSession.createQuery(getPersistentEntity().getJavaClass()); query.in(getPersistentEntity().getIdentity().getName(), keys); dbCollection.deleteMany(query.getMongoQuery()); @@ -431,5 +423,4 @@ protected Document createDBObjectWithKey(Object key) { return dbo; } - } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/codecs/PersistentEntityCodec.groovy b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/codecs/PersistentEntityCodec.groovy index 170385af534..bb0303fd247 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/codecs/PersistentEntityCodec.groovy +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/engine/codecs/PersistentEntityCodec.groovy @@ -18,15 +18,27 @@ */ package org.grails.datastore.mapping.mongo.engine.codecs -import com.mongodb.DBRef import groovy.transform.CompileStatic -import org.bson.* + +import jakarta.persistence.FetchType + +import com.mongodb.DBRef +import org.bson.BsonArray +import org.bson.BsonDocument +import org.bson.BsonDocumentWriter +import org.bson.BsonReader +import org.bson.BsonString +import org.bson.BsonType +import org.bson.BsonValue +import org.bson.BsonWriter +import org.bson.Document import org.bson.codecs.Codec import org.bson.codecs.DecoderContext import org.bson.codecs.EncoderContext import org.bson.codecs.configuration.CodecRegistry import org.bson.conversions.Bson import org.bson.types.ObjectId + import org.grails.datastore.bson.codecs.BsonPersistentEntityCodec import org.grails.datastore.bson.codecs.PropertyDecoder import org.grails.datastore.bson.codecs.PropertyEncoder @@ -52,9 +64,16 @@ import org.grails.datastore.mapping.engine.internal.MappingUtils import org.grails.datastore.mapping.model.EmbeddedPersistentEntity import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.model.PersistentProperty -import org.grails.datastore.mapping.model.PropertyMapping import org.grails.datastore.mapping.model.config.GormProperties -import org.grails.datastore.mapping.model.types.* +import org.grails.datastore.mapping.model.types.Association +import org.grails.datastore.mapping.model.types.Embedded +import org.grails.datastore.mapping.model.types.EmbeddedCollection +import org.grails.datastore.mapping.model.types.Identity +import org.grails.datastore.mapping.model.types.ManyToMany +import org.grails.datastore.mapping.model.types.ManyToOne +import org.grails.datastore.mapping.model.types.OneToMany +import org.grails.datastore.mapping.model.types.OneToOne +import org.grails.datastore.mapping.model.types.ToOne import org.grails.datastore.mapping.mongo.MongoCodecSession import org.grails.datastore.mapping.mongo.MongoConstants import org.grails.datastore.mapping.mongo.MongoDatastore @@ -63,7 +82,6 @@ import org.grails.datastore.mapping.mongo.engine.MongoCodecEntityPersister import org.grails.datastore.mapping.query.Query import org.grails.datastore.mapping.reflect.FieldEntityAccess -import jakarta.persistence.FetchType /** * A MongoDB codec for persisting {@link PersistentEntity} instances * @@ -72,12 +90,13 @@ import jakarta.persistence.FetchType */ @CompileStatic class PersistentEntityCodec extends BsonPersistentEntityCodec { - private static final String BLANK_STRING = "" + + private static final String BLANK_STRING = '' public static final String MONGO_SET_OPERATOR = '$set' public static final String MONGO_UNSET_OPERATOR = '$unset' public static final String DB_REF_ID_FIELD = '$id' - public static final String SCHEMALESS_ATTRIBUTES = "schemaless.attributes" + public static final String SCHEMALESS_ATTRIBUTES = 'schemaless.attributes' static { registerEncoder(Identity, (PropertyEncoder) new IdentityEncoder() { @@ -117,10 +136,10 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { registerEncoder(OneToOne, new ToOneEncoder()) registerDecoder(OneToOne, new ToOneDecoder()) - registerEncoder(ManyToOne,new ToOneEncoder()) - registerDecoder(ManyToOne,new ToOneDecoder()) + registerEncoder(ManyToOne, new ToOneEncoder()) + registerDecoder(ManyToOne, new ToOneDecoder()) registerEncoder(OneToMany, new OneToManyEncoder()) - registerDecoder(OneToMany,new OneToManyDecoder()) + registerDecoder(OneToMany, new OneToManyDecoder()) registerEncoder(ManyToMany, new OneToManyEncoder()) registerDecoder(ManyToMany, new OneToManyDecoder()) } @@ -139,11 +158,11 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { Closure callback = { Session session -> decodeAssociations(session, access) } - if(entity instanceof EmbeddedPersistentEntity) { - callback( AbstractDatastore.retrieveSession(MongoDatastore) ) + if (entity instanceof EmbeddedPersistentEntity) { + callback(AbstractDatastore.retrieveSession(MongoDatastore)) } else { - GormEnhancer.findStaticApi(entity.javaClass).withSession callback + GormEnhancer.findStaticApi(entity.javaClass).withSession(callback) } } @@ -156,11 +175,11 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { } return cachedInstance } - if(entity instanceof EmbeddedPersistentEntity) { - callback( AbstractDatastore.retrieveSession(MongoDatastore) ) + if (entity instanceof EmbeddedPersistentEntity) { + callback(AbstractDatastore.retrieveSession(MongoDatastore)) } else { - GormEnhancer.findStaticApi(entity.javaClass).withSession callback + GormEnhancer.findStaticApi(entity.javaClass).withSession(callback) } } @@ -179,7 +198,6 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { query.eq(association.inverseSide.name, access.identifier) .projections().id() - def id = query.singleResult() boolean lazy = ((Property) association.mapping.mappedForm).fetchStrategy == FetchType.LAZY access.setPropertyNoConversion( @@ -204,77 +222,76 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { def entity = access.persistentEntity def proxyFactory = mappingContext.proxyFactory - if( proxyFactory.isProxy(value) ) { + if (proxyFactory.isProxy(value)) { value = proxyFactory.unwrap(value) } - if(value instanceof DirtyCheckable) { + if (value instanceof DirtyCheckable) { def sets = new BsonDocument() def unsets = new Document() BsonWriter writer = new BsonDocumentWriter(sets) writer.writeStartDocument() - DirtyCheckable dirty = (DirtyCheckable)value + DirtyCheckable dirty = (DirtyCheckable) value Set processed = [] def dirtyProperties = new ArrayList(dirty.listDirtyPropertyNames()) boolean isNew = dirtyProperties.isEmpty() && dirty.hasChanged() def isVersioned = entity.isVersioned() - if(isNew) { + if (isNew) { // if it is new it can only be an embedded entity that has now been updated // so we get all properties dirtyProperties = entity.persistentPropertyNames - if(!entity.isRoot()) { + if (!entity.isRoot()) { sets.put(MongoConstants.MONGO_CLASS_FIELD, new BsonString(entity.discriminator)) } - if(isVersioned) { + if (isVersioned) { EntityPersister.incrementEntityVersion(access) } } else { // schedule lastUpdated if necessary - if( entity.getPropertyByName(GormProperties.LAST_UPDATED) != null) { + if (entity.getPropertyByName(GormProperties.LAST_UPDATED) != null) { dirtyProperties.add(GormProperties.LAST_UPDATED) } } - - for(propertyName in dirtyProperties) { + for (propertyName in dirtyProperties) { def prop = entity.getPropertyByName(propertyName) - if(prop != null) { + if (prop != null) { processed << propertyName Object v = access.getProperty(prop.name) if (v != null) { - if(prop instanceof Embedded) { - encodeEmbeddedUpdate(sets,unsets, (Association)prop, v) + if (prop instanceof Embedded) { + encodeEmbeddedUpdate(sets, unsets, (Association) prop, v) } - else if(prop instanceof EmbeddedCollection) { - encodeEmbeddedCollectionUpdate(access, sets, unsets, (Association)prop, v) + else if (prop instanceof EmbeddedCollection) { + encodeEmbeddedCollectionUpdate(access, sets, unsets, (Association) prop, v) } else { def propKind = prop.getClass().superclass - PropertyEncoder propertyEncoder = getPropertyEncoder((Class)propKind) + PropertyEncoder propertyEncoder = getPropertyEncoder((Class) propKind) propertyEncoder?.encode(writer, prop, v, access, encoderContext, codecRegistry) } } - else if(embedded || !isNew) { + else if (embedded || !isNew) { unsets[prop.name] = BLANK_STRING } } } - if(value instanceof DynamicAttributes) { + if (value instanceof DynamicAttributes) { Map attributes = ((DynamicAttributes) value).attributes() - for(attr in attributes.keySet()) { + for (attr in attributes.keySet()) { Object v = attributes.get(attr) - if(v == null) { - unsets.put(attr,BLANK_STRING) + if (v == null) { + unsets.put(attr, BLANK_STRING) } else { writer.writeName(attr) - Codec codec = (Codec)codecRegistry.get(v.getClass()) + Codec codec = (Codec) codecRegistry.get(v.getClass()) codec.encode(writer, v, encoderContext) } } @@ -282,17 +299,17 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { else { GormEnhancer.findStaticApi(entity.javaClass).withSession { Session mongoSession -> - if(mongoSession != null) { - Document schemaless = (Document)mongoSession.getAttribute(value, SCHEMALESS_ATTRIBUTES) - if(schemaless != null) { - for(name in schemaless.keySet()) { + if (mongoSession != null) { + Document schemaless = (Document) mongoSession.getAttribute(value, SCHEMALESS_ATTRIBUTES) + if (schemaless != null) { + for (name in schemaless.keySet()) { def v = schemaless.get(name) - if(v == null) { - unsets.put(name,BLANK_STRING) + if (v == null) { + unsets.put(name, BLANK_STRING) } else { writer.writeName(name) - Codec codec = (Codec)codecRegistry.get(v.getClass()) + Codec codec = (Codec) codecRegistry.get(v.getClass()) codec.encode(writer, v, encoderContext) } } @@ -302,39 +319,38 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { } - for(association in entity.associations) { - if(processed.contains( association.name )) continue - if(association instanceof OneToMany) { + for (association in entity.associations) { + if (processed.contains(association.name)) continue + if (association instanceof OneToMany) { def v = access.getProperty(association.name) if (v != null) { // TODO: handle unprocessed association } } - else if(association instanceof ToOne) { + else if (association instanceof ToOne) { def v = access.getProperty(association.name) - if( v instanceof DirtyCheckable ) { - if(((DirtyCheckable)v).hasChanged()) { - if(association instanceof Embedded) { + if (v instanceof DirtyCheckable) { + if (((DirtyCheckable) v).hasChanged()) { + if (association instanceof Embedded) { encodeEmbeddedUpdate(sets, unsets, association, v) } } } } - else if(association instanceof EmbeddedCollection) { + else if (association instanceof EmbeddedCollection) { def v = access.getProperty(association.name) - if( v instanceof DirtyCheckableCollection ) { - if(((DirtyCheckableCollection)v).hasChanged()) { + if (v instanceof DirtyCheckableCollection) { + if (((DirtyCheckableCollection) v).hasChanged()) { encodeEmbeddedCollectionUpdate(access, sets, unsets, association, v) } } } } - boolean hasSets = !sets.isEmpty() boolean hasUnsets = !unsets.isEmpty() - if(hasSets && isVersioned) { + if (hasSets && isVersioned) { def version = entity.version def propKind = version.getClass().superclass MongoCodecEntityPersister.incrementEntityVersion(access) @@ -344,11 +360,11 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { writer.writeEndDocument() - if(hasSets) { + if (hasSets) { update.put(MONGO_SET_OPERATOR, sets) } - if(hasUnsets) { - update.put(MONGO_UNSET_OPERATOR,unsets) + if (hasUnsets) { + update.put(MONGO_UNSET_OPERATOR, unsets) } } else { @@ -364,13 +380,13 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { } protected void encodeEmbeddedCollectionUpdate(EntityAccess parentAccess, BsonDocument sets, Document unsets, Association association, Object v) { - if(v instanceof Collection) { - if((v instanceof DirtyCheckableCollection) && !((DirtyCheckableCollection)v).hasChangedSize()) { + if (v instanceof Collection) { + if ((v instanceof DirtyCheckableCollection) && !((DirtyCheckableCollection) v).hasChangedSize()) { int i = 0 - for(o in (v as Collection)) { + for (o in (v as Collection)) { def embeddedUpdate = encodeUpdate(o, createEntityAccess(o), EncoderContext.builder().build(), true) def embeddedSets = embeddedUpdate.get(MONGO_SET_OPERATOR) - if(embeddedSets != null) { + if (embeddedSets != null) { def map = (Map) embeddedSets for (key in map.keySet()) { @@ -378,7 +394,7 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { } } def embeddedUnsets = embeddedUpdate.get(MONGO_UNSET_OPERATOR) - if(embeddedUnsets) { + if (embeddedUnsets) { def map = (Map) embeddedUnsets for (key in map.keySet()) { unsets.put("${association.name}.${i}.$key".toString(), BLANK_STRING) @@ -392,11 +408,11 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { // set so we overwrite existing def associatedEntity = association.associatedEntity def rootClass = associatedEntity.javaClass - PersistentEntityCodec entityCodec = (PersistentEntityCodec)codecRegistry.get(rootClass) + PersistentEntityCodec entityCodec = (PersistentEntityCodec) codecRegistry.get(rootClass) def inverseProperty = association.inverseSide - List documents =[] - for(o in v) { - if(o == null) { + List documents = [] + for (o in v) { + if (o == null) { documents << null continue } @@ -404,28 +420,28 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { PersistentEntityCodec codec = entityCodec def cls = o.getClass() - if(rootClass != cls) { + if (rootClass != cls) { // a subclass, so lookup correct codec entity = mappingContext.getPersistentEntity(cls.name) - if(entity == null) { - throw new DatastoreException("Value [$o] is not a valid type for association [$association]" ) + if (entity == null) { + throw new DatastoreException("Value [$o] is not a valid type for association [$association]") } - codec = (PersistentEntityCodec)codecRegistry.get(cls) + codec = (PersistentEntityCodec) codecRegistry.get(cls) } def ea = createEntityAccess(entity, o) - if(inverseProperty != null) { - if(inverseProperty instanceof ToOne) { - ea.setPropertyNoConversion( inverseProperty.name, parentAccess.entity) + if (inverseProperty != null) { + if (inverseProperty instanceof ToOne) { + ea.setPropertyNoConversion(inverseProperty.name, parentAccess.entity) } } def doc = new BsonDocument() def id = ea.identifier - codec.encode( new BsonDocumentWriter(doc), o, DEFAULT_ENCODER_CONTEXT, id != null ) - documents.add( doc ) + codec.encode(new BsonDocumentWriter(doc), o, DEFAULT_ENCODER_CONTEXT, id != null) + documents.add(doc) } def bsonArray = new BsonArray(documents) - sets.put( association.name, bsonArray) + sets.put(association.name, bsonArray) } } else { @@ -435,13 +451,13 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { } protected void encodeEmbeddedUpdate(BsonDocument sets, Document unsets, Association association, v) { - if (v instanceof DirtyCheckable ) { + if (v instanceof DirtyCheckable) { v.markDirty() } def embeddedUpdate = encodeUpdate(v, createEntityAccess(v), DEFAULT_ENCODER_CONTEXT, true) def embeddedSets = embeddedUpdate.get(MONGO_SET_OPERATOR) - if(embeddedSets != null) { + if (embeddedSets != null) { def map = (Map) embeddedSets for (key in map.keySet()) { @@ -450,7 +466,7 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { } def embeddedUnsets = embeddedUpdate.get(MONGO_UNSET_OPERATOR) - if(embeddedUnsets) { + if (embeddedUnsets) { def map = (Map) embeddedUnsets for (key in map.keySet()) { unsets.put("${association.name}.$key".toString(), BLANK_STRING) @@ -462,7 +478,7 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { @Override void decode(BsonReader reader, Association property, EntityAccess entityAccess, DecoderContext decoderContext, CodecRegistry codecRegistry) { def session = AbstractDatastore.retrieveSession(MongoDatastore) - if(property.isBidirectional() && !(property instanceof ManyToMany)) { + if (property.isBidirectional() && !(property instanceof ManyToMany)) { initializePersistentCollection(session, entityAccess, property) } @@ -472,35 +488,35 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { def listCodec = codecRegistry.get(List) def identifiers = listCodec.decode(reader, decoderContext) - MongoAttribute attr = (MongoAttribute)property.mapping.mappedForm - if(attr?.isReference()) { + MongoAttribute attr = (MongoAttribute) property.mapping.mappedForm + if (attr?.isReference()) { identifiers = identifiers.collect { - if(it instanceof DBRef) { - return ((DBRef)it).id + if (it instanceof DBRef) { + return ((DBRef) it).id } - else if(it instanceof Map) { - return ((Map)it).get(DB_REF_ID_FIELD) + else if (it instanceof Map) { + return ((Map) it).get(DB_REF_ID_FIELD) } return it } } def associatedType = property.associatedEntity.javaClass - if(SortedSet.isAssignableFrom(type)) { + if (SortedSet.isAssignableFrom(type)) { entityAccess.setPropertyNoConversion( propertyName, - new PersistentSortedSet( identifiers, associatedType, session) + new PersistentSortedSet(identifiers, associatedType, session) ) } - else if(Set.isAssignableFrom(type)) { + else if (Set.isAssignableFrom(type)) { entityAccess.setPropertyNoConversion( propertyName, - new PersistentSet( identifiers, associatedType, session) + new PersistentSet(identifiers, associatedType, session) ) } else { entityAccess.setPropertyNoConversion( propertyName, - new PersistentList( identifiers, associatedType, session) + new PersistentList(identifiers, associatedType, session) ) } } @@ -511,22 +527,22 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { def propertyName = property.name def identifier = (Serializable) entityAccess.identifier - if(SortedSet.isAssignableFrom(type)) { + if (SortedSet.isAssignableFrom(type)) { entityAccess.setPropertyNoConversion( propertyName, - new PersistentSortedSet( property, identifier, session) + new PersistentSortedSet(property, identifier, session) ) } - else if(Set.isAssignableFrom(type)) { + else if (Set.isAssignableFrom(type)) { entityAccess.setPropertyNoConversion( propertyName, - new PersistentSet( property, identifier, session) + new PersistentSet(property, identifier, session) ) } else { entityAccess.setPropertyNoConversion( propertyName, - new PersistentList( property, identifier, session) + new PersistentList(property, identifier, session) ) } } @@ -536,15 +552,15 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { @Override void encode(BsonWriter writer, Association property, Object value, EntityAccess parentAccess, EncoderContext encoderContext, CodecRegistry codecRegistry) { boolean shouldEncodeIds = !property.isBidirectional() || (property instanceof ManyToMany) - MongoCodecSession mongoSession = (MongoCodecSession)AbstractDatastore.retrieveSession(MongoDatastore) - if(shouldEncodeIds) { + MongoCodecSession mongoSession = (MongoCodecSession) AbstractDatastore.retrieveSession(MongoDatastore) + if (shouldEncodeIds) { // if it is unidirectional we encode the values inside the current // document, otherwise nothing to do, encoding foreign key stored in inverse side def associatedEntity = property.associatedEntity - if(value instanceof Collection) { + if (value instanceof Collection) { boolean updateCollection = false - if((value instanceof DirtyCheckableCollection)) { + if ((value instanceof DirtyCheckableCollection)) { def persistentCollection = (DirtyCheckableCollection) value updateCollection = persistentCollection.hasChanged() } @@ -553,27 +569,27 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { updateCollection = true } - if(updateCollection) { + if (updateCollection) { // update existing collection - Collection identifiers = (Collection)mongoSession.getAttribute(parentAccess.entity, "${property}.ids") - if(identifiers == null) { + Collection identifiers = (Collection) mongoSession.getAttribute(parentAccess.entity, "${property}.ids") + if (identifiers == null) { def entityReflector = FieldEntityAccess.getOrIntializeReflector(associatedEntity) - identifiers = ((Collection)value).collect() { + identifiers = ((Collection) value).collect() { entityReflector.getIdentifier(it) } } - writer.writeName MappingUtils.getTargetKey((PersistentProperty)property) + writer.writeName(MappingUtils.getTargetKey((PersistentProperty) property)) def listCodec = codecRegistry.get(List) def identifierList = identifiers.toList() - MongoAttribute attr = (MongoAttribute)property.mapping.mappedForm - if(attr?.isReference()) { + MongoAttribute attr = (MongoAttribute) property.mapping.mappedForm + if (attr?.isReference()) { def collectionName = mongoSession.getCollectionName(property.associatedEntity) - identifierList = identifierList.findAll(){ it != null }.collect { + identifierList = identifierList.findAll() { it != null }.collect { new DBRef(collectionName, it) } } - listCodec.encode writer, identifierList, encoderContext + listCodec.encode(writer, identifierList, encoderContext) } } } @@ -588,33 +604,33 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { @Override void encode(BsonWriter writer, ToOne property, Object value, EntityAccess parentAccess, EncoderContext encoderContext, CodecRegistry codecRegistry) { - if(value) { + if (value) { def associatedEntity = property.associatedEntity Object associationId - if(!property.isForeignKeyInChild()) { + if (!property.isForeignKeyInChild()) { def mappingContext = parentAccess.persistentEntity.mappingContext def proxyFactory = mappingContext.proxyFactory - if(proxyFactory.isProxy(value)) { + if (proxyFactory.isProxy(value)) { associationId = proxyFactory.getIdentifier(value) } else { def associationAccess = mappingContext.getEntityReflector(associatedEntity) associationId = associationAccess.getIdentifier(value) } - if(associationId != null) { - writer.writeName MappingUtils.getTargetKey(property) - MongoAttribute attr = (MongoAttribute)property.mapping.mappedForm - if(attr?.isReference()) { + if (associationId != null) { + writer.writeName(MappingUtils.getTargetKey(property)) + MongoAttribute attr = (MongoAttribute) property.mapping.mappedForm + if (attr?.isReference()) { def identityEncoder = codecRegistry.get(DBRef) - MongoCodecSession mongoSession = (MongoCodecSession)AbstractDatastore.retrieveSession(MongoDatastore) - def ref = new DBRef(mongoSession.getCollectionName( associatedEntity),associationId) - identityEncoder.encode writer, ref, encoderContext + MongoCodecSession mongoSession = (MongoCodecSession) AbstractDatastore.retrieveSession(MongoDatastore) + def ref = new DBRef(mongoSession.getCollectionName(associatedEntity), associationId) + identityEncoder.encode(writer, ref, encoderContext) } else { Codec identityEncoder = (Codec) codecRegistry.get((Class) associationId.getClass()) - identityEncoder.encode writer, associationId, encoderContext + identityEncoder.encode(writer, associationId, encoderContext) } } } @@ -629,49 +645,48 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { @Override void decode(BsonReader bsonReader, ToOne property, EntityAccess entityAccess, DecoderContext decoderContext, CodecRegistry codecRegistry) { - MongoCodecSession mongoSession = (MongoCodecSession)AbstractDatastore.retrieveSession(MongoDatastore) - MongoAttribute attr = (MongoAttribute)property.mapping.mappedForm + MongoCodecSession mongoSession = (MongoCodecSession) AbstractDatastore.retrieveSession(MongoDatastore) + MongoAttribute attr = (MongoAttribute) property.mapping.mappedForm boolean isLazy = isLazyAssociation(attr) def associatedEntity = property.associatedEntity - if(associatedEntity == null) { + if (associatedEntity == null) { bsonReader.skipValue() return } Serializable associationId - if(attr.reference && bsonReader.currentBsonType == BsonType.DOCUMENT) { + if (attr.reference && bsonReader.currentBsonType == BsonType.DOCUMENT) { def dbRefCodec = codecRegistry.get(Document) def dBRef = dbRefCodec.decode(bsonReader, decoderContext) - associationId = (Serializable)dBRef.get(DB_REF_ID_FIELD) + associationId = (Serializable) dBRef.get(DB_REF_ID_FIELD) } else { - switch(associatedEntity.identity.type) { + switch (associatedEntity.identity.type) { case ObjectId: associationId = bsonReader.readObjectId() break case Long: - associationId = (Long)bsonReader.readInt64() + associationId = (Long) bsonReader.readInt64() break case Integer: - associationId = (Integer)bsonReader.readInt32() + associationId = (Integer) bsonReader.readInt32() break default: associationId = bsonReader.readString() } } - - if(isLazy) { + if (isLazy) { entityAccess.setPropertyNoConversion( property.name, - mongoSession.proxy(associatedEntity.javaClass, associationId ) + mongoSession.proxy(associatedEntity.javaClass, associationId) ) } else { entityAccess.setPropertyNoConversion( property.name, - mongoSession.retrieve(associatedEntity.javaClass, associationId ) + mongoSession.retrieve(associatedEntity.javaClass, associationId) ) } @@ -687,7 +702,4 @@ class PersistentEntityCodec extends BsonPersistentEntityCodec { } - - - } diff --git a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/query/MongoQuery.java b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/query/MongoQuery.java index dfc5cc6747f..e0e8eebf94a 100644 --- a/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/query/MongoQuery.java +++ b/grails-data-mongodb/core/src/main/groovy/org/grails/datastore/mapping/mongo/query/MongoQuery.java @@ -14,19 +14,44 @@ */ package org.grails.datastore.mapping.mongo.query; +import java.io.Closeable; +import java.io.IOException; +import java.io.Serializable; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; +import java.util.Map; + +import groovy.lang.Closure; +import org.codehaus.groovy.runtime.DefaultGroovyMethods; + import com.mongodb.ReadConcern; import com.mongodb.client.AggregateIterable; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoIterable; -import grails.mongodb.geo.*; -import groovy.lang.Closure; import org.bson.BsonDocument; import org.bson.BsonDocumentReader; import org.bson.BsonDocumentWriter; import org.bson.Document; import org.bson.codecs.configuration.CodecRegistry; -import org.codehaus.groovy.runtime.DefaultGroovyMethods; + +import org.springframework.dao.InvalidDataAccessResourceUsageException; +import org.springframework.transaction.support.TransactionSynchronizationManager; + +import grails.mongodb.geo.Box; +import grails.mongodb.geo.Circle; +import grails.mongodb.geo.Distance; +import grails.mongodb.geo.GeoJSON; +import grails.mongodb.geo.Point; +import grails.mongodb.geo.Polygon; +import grails.mongodb.geo.Shape; +import grails.mongodb.geo.Sphere; import org.grails.datastore.bson.codecs.CodecCustomTypeMarshaller; import org.grails.datastore.bson.query.BsonQuery; import org.grails.datastore.bson.query.EmbeddedQueryEncoder; @@ -40,7 +65,12 @@ import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; -import org.grails.datastore.mapping.model.types.*; +import org.grails.datastore.mapping.model.types.Association; +import org.grails.datastore.mapping.model.types.Basic; +import org.grails.datastore.mapping.model.types.Custom; +import org.grails.datastore.mapping.model.types.Embedded; +import org.grails.datastore.mapping.model.types.EmbeddedCollection; +import org.grails.datastore.mapping.model.types.ToOne; import org.grails.datastore.mapping.mongo.AbstractMongoSession; import org.grails.datastore.mapping.mongo.MongoCodecSession; import org.grails.datastore.mapping.mongo.MongoDatastore; @@ -52,13 +82,6 @@ import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.api.QueryArgumentsAware; import org.grails.datastore.mapping.query.projections.ManualProjections; -import org.springframework.dao.InvalidDataAccessResourceUsageException; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import java.io.Closeable; -import java.io.IOException; -import java.io.Serializable; -import java.util.*; /** * A {@link org.grails.datastore.mapping.query.Query} implementation for the Mongo document store. @@ -143,10 +166,6 @@ public void handle(EmbeddedQueryEncoder queryEncoder, AssociationQuery criterion } }); - - - - queryHandlers.put(WithinBox.class, new QueryHandler() { public void handle(EmbeddedQueryEncoder queryEncoder, WithinBox withinBox, Document query, PersistentEntity entity) { Document nearQuery = new Document(); @@ -180,7 +199,7 @@ public void handle(EmbeddedQueryEncoder queryEncoder, WithinCircle withinCentre, } }); - QueryHandler nearHandler = new QueryHandler() { + QueryHandler nearHandler = new QueryHandler<>() { public void handle(EmbeddedQueryEncoder queryEncoder, Near near, Document query, PersistentEntity entity) { Document nearQuery = new Document(); Object value = near.getValue(); @@ -365,7 +384,7 @@ private static Document getIdObjectForGroupBy(Document groupBy) { private static String addProjectionToGroupBy(Document projectObject, Document groupBy, PropertyProjection projection, String operator, String prefix) { projectObject.put(projection.getPropertyName(), 1); String property = projection.getPropertyName(); - String projectionValueKey = prefix + property.replace('.','_'); + String projectionValueKey = prefix + property.replace('.', '_'); Document averageProjection = new Document(operator, "$" + property); groupBy.put(projectionValueKey, averageProjection); return projectionValueKey; @@ -380,10 +399,10 @@ public MongoQuery(AbstractMongoSession session, PersistentEntity entity) { super(session, entity); this.mongoSession = session; this.manualProjections = new ManualProjections(entity); - if(session != null) { + if (session != null) { this.mongoEntityPersister = (EntityPersister) session.getPersister(entity); - if(this.mongoEntityPersister instanceof MongoCodecEntityPersister) { + if (this.mongoEntityPersister instanceof MongoCodecEntityPersister) { this.isCodecPersister = true; } } @@ -418,7 +437,7 @@ protected List executeQuery(final PersistentEntity entity, final Junction criter final List projectionList = projections().getProjectionList(); if (uniqueResult && projectionList.isEmpty()) { - if(isCodecPersister) { + if (isCodecPersister) { collection = collection .withDocumentClass(entity.getJavaClass()); } @@ -435,11 +454,11 @@ protected List executeQuery(final PersistentEntity entity, final Junction criter dbObject = ((FindIterable) setHint(cursor)).limit(1) .first(); } - if(dbObject == null) { + if (dbObject == null) { return wrapObjectResultInList(dbObject); } - if(isCodecPersister) { - if(!mongoSession.contains(dbObject)) { + if (isCodecPersister) { + if (!mongoSession.contains(dbObject)) { final EntityAccess entityAccess = mongoSession.createEntityAccess(entity, dbObject); mongoEntityPersister.firePostLoadEvent(entity, entityAccess); mongoSession.cacheInstance(dbObject.getClass(), (Serializable) entityAccess.getIdentifier(), dbObject); @@ -447,19 +466,18 @@ protected List executeQuery(final PersistentEntity entity, final Junction criter return wrapObjectResultInList(dbObject); } else { - return wrapObjectResultInList(createObjectFromDBObject((Document)dbObject)); + return wrapObjectResultInList(createObjectFromDBObject((Document) dbObject)); } } MongoCursor cursor; Document query = createQueryObject(entity); - if (projectionList.isEmpty()) { - if(isCodecPersister) { + if (isCodecPersister) { collection = collection .withDocumentClass(entity.getJavaClass()) - .withCodecRegistry( mongoSession.getDatastore().getCodecRegistry()); + .withCodecRegistry(mongoSession.getDatastore().getCodecRegistry()); } cursor = executeQuery(entity, criteria, collection, query); return new MongoResultList(cursor, offset, mongoEntityPersister); @@ -472,7 +490,6 @@ protected List executeQuery(final PersistentEntity entity, final Junction criter List projectedKeys = aggregatePipeline.getProjectedKeys(); List projectedResults = new ArrayList(); - AggregateIterable aggregatedResults = collection.aggregate(aggregationPipeline); aggregatedResults = (AggregateIterable) setHint(aggregatedResults); final MongoCursor aggregateCursor = aggregatedResults.iterator(); @@ -500,7 +517,6 @@ protected List executeQuery(final PersistentEntity entity, final Junction criter return projectedResults; - } protected AggregatePipeline buildAggregatePipeline(PersistentEntity entity, Document query, List projectionList) { @@ -551,7 +567,7 @@ private MongoIterable setHint(MongoIterable cursor) { protected FindIterable executeQueryAndApplyPagination(com.mongodb.client.MongoCollection collection, Document query) { Object readConcernObject = queryArguments.get(READ_CONCERN_ARGUMENT); - if(readConcernObject instanceof ReadConcern) { + if (readConcernObject instanceof ReadConcern) { collection = collection.withReadConcern( (ReadConcern) readConcernObject ); @@ -564,7 +580,7 @@ protected FindIterable executeQueryAndApplyPagination(com.mongodb.clie if (max > -1) { iterable.limit(max); } - if(uniqueResult) { + if (uniqueResult) { iterable.limit(1); } @@ -598,7 +614,7 @@ private Document getClassFieldDocument(final PersistentEntity entity) { HashMap classValue = new HashMap<>(); ArrayList classes = new ArrayList<>(); classes.add(entity.getDiscriminator()); - for(PersistentEntity childEntity: childEntities) { + for (PersistentEntity childEntity: childEntities) { classes.add(childEntity.getDiscriminator()); } classValue.put(MONGO_IN_OPERATOR, classes); @@ -621,7 +637,7 @@ protected Document createQueryObject(PersistentEntity persistentEntity) { public static void populateMongoQuery(final AbstractMongoSession session, Document query, Junction criteria, final PersistentEntity entity) { EmbeddedQueryEncoder queryEncoder; - if(session instanceof MongoCodecSession) { + if (session instanceof MongoCodecSession) { final MongoDatastore datastore = session.getDatastore(); final CodecRegistry codecRegistry = datastore.getCodecRegistry(); queryEncoder = new EmbeddedQueryEncoder() { @@ -639,7 +655,7 @@ public Object encode(Embedded embedded, Object instance) { @Override public Object encode(Embedded embedded, Object instance) { MongoEntityPersister persister = (MongoEntityPersister) session.getPersister(entity.getJavaClass()); - return persister.createNativeObjectForEmbedded(embedded, instance); + return persister.createNativeObjectForEmbedded(embedded, instance); } }; @@ -676,7 +692,7 @@ public static void populateMongoQuery(final EmbeddedQueryEncoder queryEncoder, D PersistentProperty property = entity.getPropertyByName(pc.getProperty()); if (property instanceof Custom) { CustomTypeMarshaller customTypeMarshaller = ((Custom) property).getCustomTypeMarshaller(); - if(!(customTypeMarshaller instanceof CodecCustomTypeMarshaller)) { + if (!(customTypeMarshaller instanceof CodecCustomTypeMarshaller)) { customTypeMarshaller.query(property, pc, query); continue; } @@ -689,14 +705,13 @@ public static void populateMongoQuery(final EmbeddedQueryEncoder queryEncoder, D } } - private Object createObjectFromDBObject(Document dbObject) { // we always use the session cached version where available. final Object id = dbObject.get(MongoEntityPersister.MONGO_ID_FIELD); Class type = mongoEntityPersister.getPersistentEntity().getJavaClass(); Object instance = mongoSession.getCachedInstance(type, (Serializable) id); if (instance == null) { - instance = ((MongoEntityPersister)mongoEntityPersister).createObjectFromNativeEntry( + instance = ((MongoEntityPersister) mongoEntityPersister).createObjectFromNativeEntry( mongoEntityPersister.getPersistentEntity(), (Serializable) id, dbObject); mongoSession.cacheInstance(type, (Serializable) id, instance); } @@ -735,7 +750,6 @@ public Query near(String property, Point value) { return this; } - /** * Geospacial query for values near the given two dimensional list * @@ -760,7 +774,6 @@ public Query near(String property, Point value, Distance maxDistance) { return this; } - /** * Geospacial query for values near the given two dimensional list * @@ -809,7 +822,6 @@ public Query nearSphere(String property, Point value) { return this; } - /** * Geospacial query for values near the given two dimensional list * @@ -834,7 +846,6 @@ public Query nearSphere(String property, Point value, Distance maxDistance) { return this; } - /** * Geospacial query for values near the given two dimensional list * @@ -958,7 +969,6 @@ public void setMaxDistance(Distance maxDistance) { } } - /** * Used for Geospacial querying with the $nearSphere operator * @@ -1061,7 +1071,6 @@ public GeoIntersects(String name, Object value) { } } - public static class AggregatedResultList extends AbstractList implements Closeable { private MongoCursor cursor; @@ -1110,7 +1119,6 @@ public Object get(int index) { throw new ArrayIndexOutOfBoundsException("Index value " + index + " exceeds size of aggregate list"); } - @Override public Object set(int index, Object element) { initializeFully(); @@ -1134,7 +1142,7 @@ protected void initializeFully() { if (projectedProperties.size() == 1) { ProjectedProperty projectedProperty = projectedProperties.get(0); PersistentProperty property = projectedProperty.property; - List identifiers = new ArrayList(); + List identifiers = new ArrayList<>(); boolean hasResults = false; while (cursor.hasNext()) { hasResults = true; @@ -1145,14 +1153,14 @@ protected void initializeFully() { if (!hasResults) { handleNoResults(); } - else if(property instanceof Embedded) { - Embedded embedded = (Embedded)property; + else if (property instanceof Embedded) { + Embedded embedded = (Embedded) property; List embeddedList = new ArrayList(); CodecRegistry codecRegistry = session.getDatastore().getCodecRegistry(); PersistentEntityCodec codec = new PersistentEntityCodec(codecRegistry, embedded.getAssociatedEntity()); for (Serializable embeddedDoc : identifiers) { - if(embeddedDoc instanceof Document) { + if (embeddedDoc instanceof Document) { Document documentObject = (Document) embeddedDoc; Object decoded = codec.decode(new BsonDocumentReader(documentObject.toBsonDocument(Document.class, codecRegistry))); @@ -1174,13 +1182,13 @@ else if(property instanceof Embedded) { while (cursor.hasNext()) { hasResults = true; Document dbo = (Document) cursor.next(); - List projectedResult = new ArrayList(); + List projectedResult = new ArrayList<>(); int index = 0; for (ProjectedProperty projectedProperty : projectedProperties) { PersistentProperty property = projectedProperty.property; Object value = getProjectedValue(dbo, projectedProperty.projectionKey); if (property instanceof Association) { - if( (!(property instanceof Embedded) && !(property instanceof EmbeddedCollection) && !(property instanceof Basic))) { + if ((!(property instanceof Embedded) && !(property instanceof EmbeddedCollection) && !(property instanceof Basic))) { Map> identifierMap = associationMap.get(index); Class type = ((Association) property).getAssociatedEntity().getJavaClass(); identifierMap.get(type).add((Serializable) value); @@ -1198,7 +1206,7 @@ else if(property instanceof Embedded) { return; } - Map finalResults = new HashMap(); + Map finalResults = new HashMap<>(); for (Integer index : associationMap.keySet()) { Map> associatedEntityIdentifiers = associationMap.get(index); for (Class associationClass : associatedEntityIdentifiers.keySet()) { @@ -1242,10 +1250,10 @@ protected void handleNoResults() { } private Map>> createAssociationMap() { - Map>> associationMap = new HashMap>>(); + Map>> associationMap = new HashMap<>(); associationMap = DefaultGroovyMethods.withDefault(associationMap, new Closure(this) { public Object doCall(Object o) { - Map> subMap = new HashMap>(); + Map> subMap = new HashMap<>(); subMap = DefaultGroovyMethods.withDefault(subMap, new Closure(this) { public Object doCall(Object o) { return new ArrayList(); @@ -1293,7 +1301,7 @@ public void remove() { private Object addInitializedObject(Document dbo) { if (projectedProperties.size() > 1) { - List projected = new ArrayList(); + List projected = new ArrayList<>(); for (ProjectedProperty projectedProperty : projectedProperties) { Object value; value = getProjectedValue(dbo, projectedProperty.projectionKey); @@ -1336,8 +1344,6 @@ public void close() throws IOException { } } - - @SuppressWarnings("serial") public static class MongoResultList extends AbstractResultList { @@ -1347,14 +1353,12 @@ public static class MongoResultList extends AbstractResultList { @SuppressWarnings("unchecked") public MongoResultList(MongoCursor cursor, int offset, EntityPersister mongoEntityPersister) { - super(offset,cursor); + super(offset, cursor); this.cursor = cursor; this.mongoEntityPersister = mongoEntityPersister; this.isCodecPersister = mongoEntityPersister instanceof MongoCodecEntityPersister; } - - @Override public void close() throws IOException { cursor.close(); @@ -1376,13 +1380,13 @@ public MongoCursor getCursor() { @Override protected Object nextDecoded() { final Object o = cursor.next(); - if(isCodecPersister) { + if (isCodecPersister) { final AbstractMongoSession session = (AbstractMongoSession) mongoEntityPersister.getSession(); - if(!session.contains(o)) { + if (!session.contains(o)) { final PersistentEntity entity = mongoEntityPersister.getPersistentEntity(); final EntityAccess entityAccess = session.createEntityAccess(entity, o); final Object id = entityAccess.getIdentifier(); - if(id != null) { + if (id != null) { session.cacheInstance(entity.getJavaClass(), (Serializable) id, o); } mongoEntityPersister.firePostLoadEvent(entity, entityAccess); @@ -1417,8 +1421,6 @@ protected Object convertDBObject(Object object) { } - - public static class ProjectedProperty { public Projection projection; public String projectionKey; @@ -1441,7 +1443,6 @@ public AggregatePipeline(MongoQuery mongoQuery, PersistentEntity entity, Documen this.projectionList = projectionList; } - public List getAggregationPipeline() { return aggregationPipeline; } @@ -1455,7 +1456,7 @@ public boolean isSingleResult() { } public AggregatePipeline build() { - aggregationPipeline = new ArrayList(); + aggregationPipeline = new ArrayList<>(); if (!query.keySet().isEmpty()) { aggregationPipeline.add(new Document(MATCH_OPERATOR, query)); @@ -1481,18 +1482,15 @@ public AggregatePipeline build() { aggregationPipeline.add(new Document("$skip", offset)); } - - projectedKeys = new ArrayList(); + projectedKeys = new ArrayList<>(); singleResult = true; Document projectObject = new Document(); - Document groupByObject = new Document(); groupByObject.put(MongoEntityPersister.MONGO_ID_FIELD, 0); Document additionalGroupBy = null; - for (Projection projection : projectionList) { ProjectionHandler projectionHandler = projectProjectionHandlers.get(projection.getClass()); ProjectedProperty projectedProperty = new ProjectedProperty(); @@ -1504,7 +1502,7 @@ public AggregatePipeline build() { PersistentProperty property = entity.getPropertyByName(propertyName); if (property != null) { projectedProperty.property = property; - } else if(!propertyName.contains(".")) { + } else if (!propertyName.contains(".")) { throw new InvalidDataAccessResourceUsageException("Attempt to project on a non-existent project [" + propertyName + "]"); } } diff --git a/grails-data-mongodb/ext/src/main/groovy/org/grails/datastore/gorm/mongo/extensions/MongoExtensions.groovy b/grails-data-mongodb/ext/src/main/groovy/org/grails/datastore/gorm/mongo/extensions/MongoExtensions.groovy index 17cb020a1bc..c1b4b9e00cb 100644 --- a/grails-data-mongodb/ext/src/main/groovy/org/grails/datastore/gorm/mongo/extensions/MongoExtensions.groovy +++ b/grails-data-mongodb/ext/src/main/groovy/org/grails/datastore/gorm/mongo/extensions/MongoExtensions.groovy @@ -18,19 +18,37 @@ */ package org.grails.datastore.gorm.mongo.extensions +import groovy.transform.CompileStatic + import com.mongodb.BasicDBObject import com.mongodb.DBObject import com.mongodb.ReadPreference import com.mongodb.WriteConcern -import com.mongodb.client.* -import com.mongodb.client.model.* +import com.mongodb.client.AggregateIterable +import com.mongodb.client.ChangeStreamIterable +import com.mongodb.client.DistinctIterable +import com.mongodb.client.FindIterable +import com.mongodb.client.MongoCollection +import com.mongodb.client.MongoDatabase +import com.mongodb.client.MongoIterable +import com.mongodb.client.model.CountOptions +import com.mongodb.client.model.CreateCollectionOptions +import com.mongodb.client.model.DeleteOptions +import com.mongodb.client.model.DropIndexOptions +import com.mongodb.client.model.FindOneAndDeleteOptions +import com.mongodb.client.model.FindOneAndReplaceOptions +import com.mongodb.client.model.FindOneAndUpdateOptions +import com.mongodb.client.model.IndexOptions +import com.mongodb.client.model.InsertManyOptions +import com.mongodb.client.model.ReplaceOptions +import com.mongodb.client.model.UpdateOptions import com.mongodb.client.result.DeleteResult import com.mongodb.client.result.UpdateResult import com.mongodb.lang.Nullable -import groovy.transform.CompileStatic import org.bson.Document import org.bson.conversions.Bson import org.bson.types.ObjectId + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.mapping.mongo.AbstractMongoSession import org.grails.datastore.mapping.mongo.MongoConstants @@ -51,19 +69,18 @@ import static java.util.Arrays.asList @CompileStatic class MongoExtensions { - static T asType(Document document, Class cls) { - if(Document.isAssignableFrom(cls)) { - return (T)document + if (Document.isAssignableFrom(cls)) { + return (T) document } else { def datastore = GormEnhancer.findDatastore(cls) - AbstractMongoSession session = (AbstractMongoSession)datastore.currentSession + AbstractMongoSession session = (AbstractMongoSession) datastore.currentSession if (session != null) { return session.decode(cls, document) } - else if(cls.name == 'grails.converters.JSON') { - return cls.newInstance( document ) + else if (cls.name == 'grails.converters.JSON') { + return cls.newInstance(document) } else { throw new IllegalArgumentException("Cannot convert DBOject [$document] to writer type $cls. Type is not a persistent entity") @@ -72,12 +89,12 @@ class MongoExtensions { } static T asType(FindIterable iterable, Class cls) { - if(FindIterable.isAssignableFrom(cls)) { - return (T)iterable + if (FindIterable.isAssignableFrom(cls)) { + return (T) iterable } else { def datastore = GormEnhancer.findDatastore(cls) - AbstractMongoSession session = (AbstractMongoSession)datastore.currentSession + AbstractMongoSession session = (AbstractMongoSession) datastore.currentSession if (session != null) { return session.decode(cls, iterable) @@ -90,11 +107,11 @@ class MongoExtensions { static List toList(FindIterable iterable, Class cls) { def datastore = GormEnhancer.findDatastore(cls) - AbstractMongoSession session = (AbstractMongoSession)datastore.currentSession + AbstractMongoSession session = (AbstractMongoSession) datastore.currentSession - MongoEntityPersister p = (MongoEntityPersister)session.getPersister(cls) + MongoEntityPersister p = (MongoEntityPersister) session.getPersister(cls) if (p) - return new MongoQuery.MongoResultList(((FindIterable)iterable).iterator(),0,p) + return new MongoQuery.MongoResultList(((FindIterable) iterable).iterator(), 0, p) else { throw new IllegalArgumentException("Cannot convert DBCursor [$iterable] to writer type $cls. Type is not a persistent entity") } @@ -103,17 +120,17 @@ class MongoExtensions { @CompileStatic static DBObject toDBObject(Document document) { def object = new BasicDBObject() - for(key in document.keySet()) { + for (key in document.keySet()) { def value = document.get(key) - if(value instanceof Document) { - value = toDBObject((Document)value) + if (value instanceof Document) { + value = toDBObject((Document) value) } - else if(value instanceof Collection) { - Collection col = (Collection)value + else if (value instanceof Collection) { + Collection col = (Collection) value Collection newCol = [] - for(i in col) { - if(i instanceof Document) { - newCol << toDBObject((Document)i) + for (i in col) { + if (i instanceof Document) { + newCol << toDBObject((Document) i) } else { newCol << i @@ -162,7 +179,6 @@ class MongoExtensions { list.collect { toBson(it) } } - /************** FindIterable Extensions *************/ static FindIterable filter(FindIterable iterable, @Nullable Map filter) { @@ -245,7 +261,7 @@ class MongoExtensions { static Document findOne(MongoCollection collection, ObjectId id) { def query = new Document() query.put(AbstractMongoObectEntityPersister.MONGO_ID_FIELD, id) - collection.find((Bson)query) + collection.find((Bson) query) .limit(1) .first() } @@ -253,7 +269,7 @@ class MongoExtensions { static Document findOne(MongoCollection collection, CharSequence id) { def query = new Document() query.put(AbstractMongoObectEntityPersister.MONGO_ID_FIELD, id) - collection.find((Bson)query) + collection.find((Bson) query) .limit(1) .first() } @@ -262,7 +278,7 @@ class MongoExtensions { def query = new Document() query.put(AbstractMongoObectEntityPersister.MONGO_ID_FIELD, id) collection - .find((Bson)query, type) + .find((Bson) query, type) .limit(1) .first() } @@ -374,11 +390,11 @@ class MongoExtensions { } static DeleteResult remove(final MongoCollection collection, final Map query) { - deleteMany collection, query + deleteMany(collection, query) } static MongoCollection rightShift(final MongoCollection collection, final Map query) { - deleteMany collection, query + deleteMany(collection, query) return collection } @@ -519,11 +535,11 @@ class MongoExtensions { } static MongoCollection insert(final MongoCollection collection, final Map document, final WriteConcern writeConcern) { - insert(collection, asList(document), writeConcern); + insert(collection, asList(document), writeConcern) } static void insert(final MongoCollection collection, final Map... documents) { - collection.insertMany documents.collect() { Map m -> new Document(m) } as List + collection.insertMany(documents.collect() { Map m -> new Document(m) } as List) } static MongoCollection leftShift(final MongoCollection collection, final Map... documents) { @@ -532,40 +548,40 @@ class MongoExtensions { } static MongoCollection insert(final MongoCollection collection, final WriteConcern writeConcern, final Map... documents) { - insert(collection, documents, writeConcern); + insert(collection, documents, writeConcern) } static MongoCollection insert(final MongoCollection collection, final Map[] documents, final WriteConcern writeConcern) { - insert(collection, asList(documents), writeConcern); + insert(collection, asList(documents), writeConcern) } static MongoCollection insert(final MongoCollection collection, final List> documents) { - collection.insertMany documents.collect() { Map m -> new Document(m) } as List + collection.insertMany(documents.collect() { Map m -> new Document(m) } as List) return collection } static MongoCollection insert(final MongoCollection collection, final List> documents, final WriteConcern aWriteConcern) { - return insert(collection, documents, aWriteConcern, null); + return insert(collection, documents, aWriteConcern, null) } static MongoCollection insert(final MongoCollection collection, final List> documents, final WriteConcern writeConcern, final InsertManyOptions insertOptions) { collection .withWriteConcern(writeConcern) - .insertMany documents.collect() { Map m -> new Document(m) } as List, insertOptions + .insertMany(documents.collect() { Map m -> new Document(m) } as List, insertOptions) return collection } static MongoCollection insert(final MongoCollection collection, final List documents, final InsertManyOptions insertOptions) { - collection.insertMany documents.collect() { Map m -> new Document(m) } as List, insertOptions + collection.insertMany(documents.collect() { Map m -> new Document(m) } as List, insertOptions) return collection } static MongoCollection save(final MongoCollection collection, final Map document) { - insert collection, document + insert(collection, document) } static MongoCollection save(final MongoCollection collection, final Map document, final WriteConcern writeConcern) { - insert collection, document, writeConcern + insert(collection, document, writeConcern) } static UpdateResult replaceOne(MongoCollection collection, Map filter, Document replacement) { @@ -580,27 +596,27 @@ class MongoExtensions { } static Document findOneAndDelete(MongoCollection collection, Map filter) { - collection.findOneAndDelete( toBson(filter) ) + collection.findOneAndDelete(toBson(filter)) } static Document findOneAndDelete(MongoCollection collection, Map filter, Map options) { - collection.findOneAndDelete( toBson(filter), MongoConstants.mapToObject(FindOneAndDeleteOptions, options) ) + collection.findOneAndDelete(toBson(filter), MongoConstants.mapToObject(FindOneAndDeleteOptions, options)) } static Document findOneAndReplace(MongoCollection collection, Map filter, Map replacement) { - collection.findOneAndReplace( toBson(filter), new Document(replacement) ) + collection.findOneAndReplace(toBson(filter), new Document(replacement)) } static Document findOneAndReplace(MongoCollection collection, Map filter, Map replacement, Map options) { - collection.findOneAndReplace( toBson(filter), new Document(replacement), MongoConstants.mapToObject(FindOneAndReplaceOptions, options) ) + collection.findOneAndReplace(toBson(filter), new Document(replacement), MongoConstants.mapToObject(FindOneAndReplaceOptions, options)) } static Document findOneAndUpdate(MongoCollection collection, Map filter, Map update) { - collection.findOneAndUpdate( toBson(filter), new Document(update) ) + collection.findOneAndUpdate(toBson(filter), new Document(update)) } static Document findOneAndUpdate(MongoCollection collection, Map filter, Map update, Map options) { - collection.findOneAndUpdate( toBson(filter), new Document(update), MongoConstants.mapToObject(FindOneAndUpdateOptions, options) ) + collection.findOneAndUpdate(toBson(filter), new Document(update), MongoConstants.mapToObject(FindOneAndUpdateOptions, options)) } } diff --git a/grails-data-mongodb/grails-plugin/src/main/groovy/grails/plugins/mongodb/MongodbGrailsPlugin.groovy b/grails-data-mongodb/grails-plugin/src/main/groovy/grails/plugins/mongodb/MongodbGrailsPlugin.groovy index f46c8bcbb58..f4a5f86f83c 100644 --- a/grails-data-mongodb/grails-plugin/src/main/groovy/grails/plugins/mongodb/MongodbGrailsPlugin.groovy +++ b/grails-data-mongodb/grails-plugin/src/main/groovy/grails/plugins/mongodb/MongodbGrailsPlugin.groovy @@ -19,21 +19,24 @@ package grails.plugins.mongodb +import groovy.transform.CompileStatic + +import org.springframework.beans.factory.support.BeanDefinitionRegistry +import org.springframework.context.ConfigurableApplicationContext +import org.springframework.core.env.PropertyResolver +import org.springframework.transaction.PlatformTransactionManager + import grails.core.GrailsClass import grails.mongodb.bootstrap.MongoDbDataStoreSpringInitializer import grails.plugins.GrailsPlugin import grails.plugins.Plugin import grails.util.Metadata -import groovy.transform.CompileStatic import org.grails.core.artefact.DomainClassArtefactHandler import org.grails.datastore.gorm.plugin.support.ConfigSupport import org.grails.datastore.mapping.mongo.MongoDatastore -import org.springframework.beans.factory.support.BeanDefinitionRegistry -import org.springframework.context.ConfigurableApplicationContext -import org.springframework.core.env.PropertyResolver -import org.springframework.transaction.PlatformTransactionManager class MongodbGrailsPlugin extends Plugin { + def license = 'Apache 2.0 License' def organization = [name: 'Grails', url: 'https://grails.apache.org/'] def issueManagement = [system: 'Github', url: 'https://github.com/apache/grails-core/issues'] @@ -53,17 +56,17 @@ class MongodbGrailsPlugin extends Plugin { initializer.registerApplicationIfNotPresent = false def applicationName = Metadata.getCurrent().getApplicationName() - if(!applicationName.contains('@')) { + if (!applicationName.contains('@')) { initializer.databaseName = applicationName } initializer.setSecondaryDatastore(hasHibernatePlugin()) - return initializer.getBeanDefinitions((BeanDefinitionRegistry)applicationContext) + return initializer.getBeanDefinitions((BeanDefinitionRegistry) applicationContext) } @CompileStatic protected boolean hasHibernatePlugin() { - manager.allPlugins.any() { GrailsPlugin plugin -> plugin.name ==~ /hibernate\d*/} + manager.allPlugins.any() { GrailsPlugin plugin -> plugin.name ==~ /hibernate\d*/ } } @Override diff --git a/grails-data-mongodb/grails-plugin/src/testFixtures/groovy/grails/test/mongodb/MongoSpec.groovy b/grails-data-mongodb/grails-plugin/src/testFixtures/groovy/grails/test/mongodb/MongoSpec.groovy index 200b0203813..5cf8534fcdc 100644 --- a/grails-data-mongodb/grails-plugin/src/testFixtures/groovy/grails/test/mongodb/MongoSpec.groovy +++ b/grails-data-mongodb/grails-plugin/src/testFixtures/groovy/grails/test/mongodb/MongoSpec.groovy @@ -18,15 +18,13 @@ */ package grails.test.mongodb -import com.mongodb.client.MongoClient -import grails.config.Config import groovy.transform.CompileStatic -import org.grails.config.PropertySourcesConfig -import org.grails.datastore.mapping.core.DatastoreUtils -import org.grails.datastore.mapping.core.Session -import org.grails.datastore.mapping.core.exceptions.ConfigurationException -import org.grails.datastore.mapping.model.MappingContext -import org.grails.datastore.mapping.mongo.MongoDatastore + +import com.mongodb.client.MongoClient +import spock.lang.AutoCleanup +import spock.lang.Shared +import spock.lang.Specification + import org.springframework.boot.env.PropertySourceLoader import org.springframework.core.env.PropertyResolver import org.springframework.core.env.PropertySource @@ -35,9 +33,14 @@ import org.springframework.core.io.Resource import org.springframework.core.io.ResourceLoader import org.springframework.core.io.support.SpringFactoriesLoader import org.springframework.transaction.support.TransactionSynchronizationManager -import spock.lang.AutoCleanup -import spock.lang.Shared -import spock.lang.Specification + +import grails.config.Config +import org.grails.config.PropertySourcesConfig +import org.grails.datastore.mapping.core.DatastoreUtils +import org.grails.datastore.mapping.core.Session +import org.grails.datastore.mapping.core.exceptions.ConfigurationException +import org.grails.datastore.mapping.model.MappingContext +import org.grails.datastore.mapping.mongo.MongoDatastore /** * Base class for MongoDB tests @@ -75,18 +78,18 @@ abstract class MongoSpec extends Specification { protected List getDomainClasses() { [] } void setupSpec() { - List propertySourceLoaders = SpringFactoriesLoader.loadFactories(PropertySourceLoader.class, getClass().getClassLoader()); + List propertySourceLoaders = SpringFactoriesLoader.loadFactories(PropertySourceLoader, getClass().getClassLoader()) ResourceLoader resourceLoader = new DefaultResourceLoader() List propertySources = [] - PropertySourceLoader ymlLoader = propertySourceLoaders.find { it.getFileExtensions().toList().contains("yml") } + PropertySourceLoader ymlLoader = propertySourceLoaders.find { it.getFileExtensions().toList().contains('yml') } if (ymlLoader) { - propertySources.addAll(load(resourceLoader, ymlLoader, "application.yml")) + propertySources.addAll(load(resourceLoader, ymlLoader, 'application.yml')) } - PropertySourceLoader groovyLoader = propertySourceLoaders.find { it.getFileExtensions().toList().contains("groovy") } + PropertySourceLoader groovyLoader = propertySourceLoaders.find { it.getFileExtensions().toList().contains('groovy') } if (groovyLoader) { - propertySources.addAll(load(resourceLoader, groovyLoader, "application.groovy")) + propertySources.addAll(load(resourceLoader, groovyLoader, 'application.groovy')) } Map mapPropertySource = propertySources diff --git a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/SimpleMapDatastore.java b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/SimpleMapDatastore.java index 9094cdb0541..76d40b3154e 100644 --- a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/SimpleMapDatastore.java +++ b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/SimpleMapDatastore.java @@ -27,11 +27,21 @@ import java.util.concurrent.ConcurrentHashMap; import groovy.lang.Closure; + +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.env.PropertyResolver; +import org.springframework.transaction.PlatformTransactionManager; + import org.grails.datastore.gorm.GormEnhancer; import org.grails.datastore.gorm.GormInstanceApi; import org.grails.datastore.gorm.GormStaticApi; import org.grails.datastore.gorm.GormValidationApi; -import org.grails.datastore.gorm.events.*; +import org.grails.datastore.gorm.events.AutoTimestampEventListener; +import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher; +import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher; +import org.grails.datastore.gorm.events.DefaultApplicationEventPublisher; +import org.grails.datastore.gorm.events.DomainEventListener; import org.grails.datastore.gorm.multitenancy.MultiTenantEventListener; import org.grails.datastore.gorm.utils.ClasspathEntityScanner; import org.grails.datastore.mapping.config.Settings; @@ -39,7 +49,17 @@ import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.DatastoreUtils; import org.grails.datastore.mapping.core.Session; -import org.grails.datastore.mapping.core.connections.*; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSourceFactory; +import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings; +import org.grails.datastore.mapping.core.connections.ConnectionSources; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesSupport; +import org.grails.datastore.mapping.core.connections.DefaultConnectionSource; +import org.grails.datastore.mapping.core.connections.InMemoryConnectionSources; +import org.grails.datastore.mapping.core.connections.MultipleConnectionSourceCapableDatastore; +import org.grails.datastore.mapping.core.connections.SingletonConnectionSources; import org.grails.datastore.mapping.core.exceptions.ConfigurationException; import org.grails.datastore.mapping.keyvalue.mapping.config.KeyValueMappingContext; import org.grails.datastore.mapping.model.MappingContext; @@ -50,10 +70,6 @@ import org.grails.datastore.mapping.simple.connections.SimpleMapConnectionSourceFactory; import org.grails.datastore.mapping.transactions.DatastoreTransactionManager; import org.grails.datastore.mapping.transactions.TransactionCapableDatastore; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.env.PropertyResolver; -import org.springframework.transaction.PlatformTransactionManager; /** * A simple implementation of the {@link org.grails.datastore.mapping.core.Datastore} interface that backs onto an in-memory map. @@ -63,19 +79,19 @@ * @since 1.0 */ @SuppressWarnings("rawtypes") -public class SimpleMapDatastore extends AbstractDatastore implements Closeable, TransactionCapableDatastore, MultipleConnectionSourceCapableDatastore, SchemaMultiTenantCapableDatastore, ConnectionSourceSettings>, ConnectionSourcesProvider, ConnectionSourceSettings> { +public class SimpleMapDatastore extends AbstractDatastore implements Closeable, TransactionCapableDatastore, MultipleConnectionSourceCapableDatastore, SchemaMultiTenantCapableDatastore, ConnectionSourceSettings>, ConnectionSourcesProvider, ConnectionSourceSettings> { private final Map inmemoryData; private final TenantResolver tenantResolver; protected final GormEnhancer gormEnhancer; private final ConfigurableApplicationEventPublisher eventPublisher; private Map indices = new ConcurrentHashMap(); private final PlatformTransactionManager transactionManager; - private final ConnectionSources, ConnectionSourceSettings> connectionSources; + private final ConnectionSources, ConnectionSourceSettings> connectionSources; private final MultiTenancySettings.MultiTenancyMode multiTenancyMode; protected final Map datastoresByConnectionSource = new LinkedHashMap<>(); protected final boolean failOnError; - public SimpleMapDatastore(ConnectionSources, ConnectionSourceSettings> connectionSources, MappingContext mappingContext, ConfigurableApplicationEventPublisher eventPublisher) { + public SimpleMapDatastore(ConnectionSources, ConnectionSourceSettings> connectionSources, MappingContext mappingContext, ConfigurableApplicationEventPublisher eventPublisher) { super(mappingContext); this.connectionSources = connectionSources; ConnectionSource, ConnectionSourceSettings> defaultConnectionSource = connectionSources.getDefaultConnectionSource(); @@ -88,14 +104,14 @@ public SimpleMapDatastore(ConnectionSources, ConnectionSourceSet this.tenantResolver = multiTenancy.getTenantResolver(); PropertyResolver config = connectionSources.getBaseConfiguration(); this.failOnError = config.getProperty(Settings.SETTING_FAIL_ON_ERROR, Boolean.class, false); - if(!(connectionSources instanceof SingletonConnectionSources)) { + if (!(connectionSources instanceof SingletonConnectionSources)) { - Iterable, ConnectionSourceSettings>> allConnectionSources = connectionSources.getAllConnectionSources(); - for (ConnectionSource, ConnectionSourceSettings> connectionSource : allConnectionSources) { + Iterable, ConnectionSourceSettings>> allConnectionSources = connectionSources.getAllConnectionSources(); + for (ConnectionSource, ConnectionSourceSettings> connectionSource : allConnectionSources) { SingletonConnectionSources singletonConnectionSources = new SingletonConnectionSources(connectionSource, connectionSources.getBaseConfiguration()); SimpleMapDatastore childDatastore; - if(ConnectionSource.DEFAULT.equals(connectionSource.getName())) { + if (ConnectionSource.DEFAULT.equals(connectionSource.getName())) { childDatastore = this; } else { @@ -113,11 +129,11 @@ protected GormEnhancer initialize(ConnectionSourceSettings settings) { this.gormEnhancer = initialize(defaultConnectionSource.getSettings()); } - public SimpleMapDatastore(ConnectionSources, ConnectionSourceSettings> connectionSources, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { - this(connectionSources, createMappingContext(connectionSources,classes), eventPublisher); + public SimpleMapDatastore(ConnectionSources, ConnectionSourceSettings> connectionSources, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { + this(connectionSources, createMappingContext(connectionSources, classes), eventPublisher); } - public SimpleMapDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class...classes) { + public SimpleMapDatastore(PropertyResolver configuration, ConfigurableApplicationEventPublisher eventPublisher, Class... classes) { this(ConnectionSourcesInitializer.create(new SimpleMapConnectionSourceFactory(), configuration), eventPublisher, classes); } @@ -125,34 +141,32 @@ public SimpleMapDatastore() { this(DatastoreUtils.createPropertyResolver(null), new DefaultApplicationEventPublisher()); } - public SimpleMapDatastore(final Iterable dataSourceNames, Class...classes) { - this(createMultipleDataSources(dataSourceNames, DatastoreUtils.createPropertyResolver(null)),new DefaultApplicationEventPublisher(), classes); + public SimpleMapDatastore(final Iterable dataSourceNames, Class... classes) { + this(createMultipleDataSources(dataSourceNames, DatastoreUtils.createPropertyResolver(null)), new DefaultApplicationEventPublisher(), classes); } - public SimpleMapDatastore(Class...classes) { - this(DatastoreUtils.createPropertyResolver(null),new DefaultApplicationEventPublisher(), classes); + public SimpleMapDatastore(Class... classes) { + this(DatastoreUtils.createPropertyResolver(null), new DefaultApplicationEventPublisher(), classes); } - - public SimpleMapDatastore(PropertyResolver configuration, final Iterable dataSourceNames, Class...classes) { - this(createMultipleDataSources(dataSourceNames, configuration),new DefaultApplicationEventPublisher(), classes); + public SimpleMapDatastore(PropertyResolver configuration, final Iterable dataSourceNames, Class... classes) { + this(createMultipleDataSources(dataSourceNames, configuration), new DefaultApplicationEventPublisher(), classes); } - public SimpleMapDatastore(PropertyResolver configuration, final Iterable dataSourceNames, Package...packages) { - this(createMultipleDataSources(dataSourceNames, configuration),new DefaultApplicationEventPublisher(), new ClasspathEntityScanner().scan(packages)); + public SimpleMapDatastore(PropertyResolver configuration, final Iterable dataSourceNames, Package... packages) { + this(createMultipleDataSources(dataSourceNames, configuration), new DefaultApplicationEventPublisher(), new ClasspathEntityScanner().scan(packages)); } - - public SimpleMapDatastore(Map configuration, final Iterable dataSourceNames, Package...packages) { - this(createMultipleDataSources(dataSourceNames, DatastoreUtils.createPropertyResolver(configuration)),new DefaultApplicationEventPublisher(), new ClasspathEntityScanner().scan(packages)); + public SimpleMapDatastore(Map configuration, final Iterable dataSourceNames, Package... packages) { + this(createMultipleDataSources(dataSourceNames, DatastoreUtils.createPropertyResolver(configuration)), new DefaultApplicationEventPublisher(), new ClasspathEntityScanner().scan(packages)); } - public SimpleMapDatastore(Map configuration, Package...packages) { - this(DatastoreUtils.createPropertyResolver(configuration),new DefaultApplicationEventPublisher(), new ClasspathEntityScanner().scan(packages)); + public SimpleMapDatastore(Map configuration, Package... packages) { + this(DatastoreUtils.createPropertyResolver(configuration), new DefaultApplicationEventPublisher(), new ClasspathEntityScanner().scan(packages)); } public SimpleMapDatastore(PropertyResolver configuration, final Iterable dataSourceNames, Package packageToScan) { - this(createMultipleDataSources(dataSourceNames, configuration),new DefaultApplicationEventPublisher(), new ClasspathEntityScanner().scan(packageToScan)); + this(createMultipleDataSources(dataSourceNames, configuration), new DefaultApplicationEventPublisher(), new ClasspathEntityScanner().scan(packageToScan)); } /** @@ -201,7 +215,7 @@ protected static KeyValueMappingContext createMappingContext(ConnectionSources, ConnectionSourceSettings> createMultipleDataSources(final Iterable dataSourceNames, PropertyResolver propertyResolver) { SimpleMapConnectionSourceFactory simpleMapConnectionSourceFactory = new SimpleMapConnectionSourceFactory(); - return new InMemoryConnectionSources, ConnectionSourceSettings>( + return new InMemoryConnectionSources<>( simpleMapConnectionSourceFactory.create(ConnectionSource.DEFAULT, propertyResolver), simpleMapConnectionSourceFactory, propertyResolver @@ -248,16 +262,16 @@ protected GormInstanceApi getInstanceApi(Class cls, String qualifier) private SimpleMapDatastore getDatastoreForQualifier(Class cls, String qualifier) { String defaultConnectionSourceName = ConnectionSourcesSupport.getDefaultConnectionSourceName(getMappingContext().getPersistentEntity(cls.getName())); boolean isDefaultQualifier = qualifier.equals(ConnectionSource.DEFAULT); - if(isDefaultQualifier && defaultConnectionSourceName.equals(ConnectionSource.DEFAULT)) { + if (isDefaultQualifier && defaultConnectionSourceName.equals(ConnectionSource.DEFAULT)) { return SimpleMapDatastore.this; } else { - if(isDefaultQualifier) { + if (isDefaultQualifier) { qualifier = defaultConnectionSourceName; } - ConnectionSource, ConnectionSourceSettings> connectionSource = connectionSources.getConnectionSource(qualifier); - if(connectionSource == null) { - throw new ConfigurationException("Invalid connection ["+defaultConnectionSourceName+"] configured for class ["+cls+"]"); + ConnectionSource, ConnectionSourceSettings> connectionSource = connectionSources.getConnectionSource(qualifier); + if (connectionSource == null) { + throw new ConfigurationException("Invalid connection [" + defaultConnectionSourceName + "] configured for class [" + cls + "]"); } return SimpleMapDatastore.this.datastoresByConnectionSource.get(qualifier); } @@ -268,7 +282,7 @@ private SimpleMapDatastore getDatastoreForQualifier(Class cls, String qua protected void registerEventListeners(ConfigurableApplicationEventPublisher eventPublisher) { eventPublisher.addApplicationListener(new DomainEventListener(this)); eventPublisher.addApplicationListener(new AutoTimestampEventListener(this)); - if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { + if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { eventPublisher.addApplicationListener(new MultiTenantEventListener(this)); } } @@ -318,10 +332,10 @@ public TenantResolver getTenantResolver() { @Override public Datastore getDatastoreForTenantId(Serializable tenantId) { - if(multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { + if (multiTenancyMode == MultiTenancySettings.MultiTenancyMode.DISCRIMINATOR) { return this; } - if(tenantId != null) { + if (tenantId != null) { return getDatastoreForConnection(tenantId.toString()); } return this; @@ -344,8 +358,8 @@ public T1 withNewSession(Serializable tenantId, Closure callable) { public Datastore getDatastoreForConnection(String connectionName) { SimpleMapDatastore childDatastore = datastoresByConnectionSource.get(connectionName); - if(childDatastore == null) { - throw new ConfigurationException("No datastore found for connection named ["+connectionName+"]"); + if (childDatastore == null) { + throw new ConfigurationException("No datastore found for connection named [" + connectionName + "]"); } return childDatastore; } @@ -366,7 +380,7 @@ public void addTenantForSchema(String schemaName) { SingletonConnectionSources singletonConnectionSources = new SingletonConnectionSources(connectionSource, connectionSources.getBaseConfiguration()); SimpleMapDatastore childDatastore; - if(ConnectionSource.DEFAULT.equals(connectionSource.getName())) { + if (ConnectionSource.DEFAULT.equals(connectionSource.getName())) { childDatastore = this; } else { diff --git a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/SimpleMapSession.java b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/SimpleMapSession.java index 47c3575656e..8e28415f5a7 100644 --- a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/SimpleMapSession.java +++ b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/SimpleMapSession.java @@ -21,6 +21,7 @@ import java.util.Map; import org.springframework.context.ApplicationEventPublisher; + import org.grails.datastore.mapping.core.AbstractSession; import org.grails.datastore.mapping.engine.Persister; import org.grails.datastore.mapping.model.MappingContext; diff --git a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/connections/SimpleMapConnectionSourceFactory.groovy b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/connections/SimpleMapConnectionSourceFactory.groovy index 25d27e8fa49..40797bd3a5f 100644 --- a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/connections/SimpleMapConnectionSourceFactory.groovy +++ b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/connections/SimpleMapConnectionSourceFactory.groovy @@ -19,11 +19,17 @@ package org.grails.datastore.mapping.simple.connections +import java.util.concurrent.ConcurrentHashMap + import groovy.transform.CompileStatic -import org.grails.datastore.mapping.core.connections.* + import org.springframework.core.env.PropertyResolver -import java.util.concurrent.ConcurrentHashMap +import org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory +import org.grails.datastore.mapping.core.connections.ConnectionSource +import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings +import org.grails.datastore.mapping.core.connections.ConnectionSourceSettingsBuilder +import org.grails.datastore.mapping.core.connections.DefaultConnectionSource /** * Simple implementation that just builds {@link ConnectionSource} instances from Maps @@ -33,13 +39,14 @@ import java.util.concurrent.ConcurrentHashMap */ @CompileStatic class SimpleMapConnectionSourceFactory extends AbstractConnectionSourceFactory, ConnectionSourceSettings> { + @Override ConnectionSource, ConnectionSourceSettings> create(String name, ConnectionSourceSettings settings) { return new DefaultConnectionSource, ConnectionSourceSettings>(name, new ConcurrentHashMap(), settings) } @Override Serializable getConnectionSourcesConfigurationKey() { - return PREFIX + ".connections" + return PREFIX + '.connections' } @Override diff --git a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/engine/SimpleMapEntityPersister.groovy b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/engine/SimpleMapEntityPersister.groovy index 707c5429348..a4b0c8a9dfe 100644 --- a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/engine/SimpleMapEntityPersister.groovy +++ b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/engine/SimpleMapEntityPersister.groovy @@ -18,6 +18,8 @@ */ package org.grails.datastore.mapping.simple.engine +import org.springframework.context.ApplicationEventPublisher + import org.grails.datastore.mapping.config.Property import org.grails.datastore.mapping.core.IdentityGenerationException import org.grails.datastore.mapping.core.OptimisticLockingException @@ -35,7 +37,6 @@ import org.grails.datastore.mapping.model.types.ManyToMany import org.grails.datastore.mapping.query.Query import org.grails.datastore.mapping.simple.SimpleMapDatastore import org.grails.datastore.mapping.simple.query.SimpleMapQuery -import org.springframework.context.ApplicationEventPublisher /** * A simple implementation of the {@link org.grails.datastore.mapping.engine.EntityPersister} abstract class that backs onto an in-memory map. @@ -146,7 +147,7 @@ class SimpleMapEntityPersister extends AbstractKeyValueEntityPersister + (AssociationQuery): { allEntities, Association association, AssociationQuery aq -> Query.Junction queryCriteria = aq.criteria - return executeAssociationSubQuery(datastore[getFamily(association.associatedEntity)], association.associatedEntity,queryCriteria, aq.association) + return executeAssociationSubQuery(datastore[getFamily(association.associatedEntity)], association.associatedEntity, queryCriteria, aq.association) }, (FunctionCallingCriterion): { allEntities, Association association, FunctionCallingCriterion fcc -> @@ -191,9 +192,9 @@ class SimpleMapQuery extends Query { def function = functionHandlers[fcc.functionName] if (handler != null && function != null) { try { - return handler.call(allEntities, association,criterion, function) + return handler.call(allEntities, association, criterion, function) } - catch(MissingMethodException ignored) { + catch (MissingMethodException ignored) { throw new InvalidDataAccessResourceUsageException("Unsupported function '$function' used in query") } } @@ -231,18 +232,18 @@ class SimpleMapQuery extends Query { function(resolveIfEmbedded(eq.property, it)) == null } }, - (Query.NotEquals): { allEntities, Association association, Query.NotEquals eq , Closure function = {it}-> + (Query.NotEquals): { allEntities, Association association, Query.NotEquals eq , Closure function = {it} -> queryAssociation(allEntities, association) { final value = subqueryIfNecessary(eq) function(resolveIfEmbedded(eq.property, it)) != value } }, - (Query.IsNotNull): { allEntities, Association association, Query.IsNotNull eq , Closure function = {it}-> + (Query.IsNotNull): { allEntities, Association association, Query.IsNotNull eq , Closure function = {it} -> queryAssociation(allEntities, association) { function(resolveIfEmbedded(eq.property, it)) != null } }, - (Query.IdEquals): { allEntities, Association association, Query.IdEquals eq , Closure function = {it}-> + (Query.IdEquals): { allEntities, Association association, Query.IdEquals eq , Closure function = {it} -> queryAssociation(allEntities, association) { function(resolveIfEmbedded(eq.property, it)) == eq.value } @@ -254,33 +255,33 @@ class SimpleMapQuery extends Query { function(resolveIfEmbedded(between.property, it)) >= from && function(resolveIfEmbedded(between.property, it)) <= to } }, - (Query.GreaterThan):{ allEntities, Association association, Query.GreaterThan gt, Closure function = {it} -> + (Query.GreaterThan): { allEntities, Association association, Query.GreaterThan gt, Closure function = {it} -> queryAssociation(allEntities, association) { final value = subqueryIfNecessary(gt) function(resolveIfEmbedded(gt.property, it)) > value } }, - (Query.LessThan):{ allEntities, Association association, Query.LessThan lt, Closure function = {it} -> + (Query.LessThan): { allEntities, Association association, Query.LessThan lt, Closure function = {it} -> queryAssociation(allEntities, association) { final value = subqueryIfNecessary(lt) function(resolveIfEmbedded(lt.property, it)) < value } }, - (Query.GreaterThanEquals):{ allEntities, Association association, Query.GreaterThanEquals gt, Closure function = {it} -> + (Query.GreaterThanEquals): { allEntities, Association association, Query.GreaterThanEquals gt, Closure function = {it} -> queryAssociation(allEntities, association) { final value = subqueryIfNecessary(gt) function(resolveIfEmbedded(gt.property, it)) >= value } }, - (Query.LessThanEquals):{ allEntities, Association association, Query.LessThanEquals lt, Closure function = {it} -> + (Query.LessThanEquals): { allEntities, Association association, Query.LessThanEquals lt, Closure function = {it} -> queryAssociation(allEntities, association) { final value = subqueryIfNecessary(lt) function(resolveIfEmbedded(lt.property, it)) <= value } }, - (Query.In):{ allEntities, Association association, Query.In inList, Closure function = {it} -> + (Query.In): { allEntities, Association association, Query.In inList, Closure function = {it} -> queryAssociation(allEntities, association) { - inList.values?.contains function(resolveIfEmbedded(inList.property, it)) + inList.values?.contains(function(resolveIfEmbedded(inList.property, it))) } } ] @@ -294,7 +295,7 @@ class SimpleMapQuery extends Query { // If the entity isn't mocked properly this will happen and can cause a NPE. PersistentEntity associatedEntity = association.associatedEntity - if( associatedEntity == null ) { + if (associatedEntity == null) { throw new IllegalStateException("No associated entity found for ${association.owner}.${association.name}") } @@ -332,7 +333,7 @@ class SimpleMapQuery extends Query { } else if (criterion instanceof Query.Junction) { Query.Junction junction = criterion - resultList << executeAssociationSubQuery(allEntities,associatedEntity, junction, property) + resultList << executeAssociationSubQuery(allEntities, associatedEntity, junction, property) } } return applyJunctionToResults(queryCriteria, resultList) @@ -359,7 +360,7 @@ class SimpleMapQuery extends Query { try { handler.call(criterion, property, function, fcc.onValue) } - catch(MissingMethodException e) { + catch (MissingMethodException e) { throw new InvalidDataAccessResourceUsageException("Unsupported function '$function' used in query") } } @@ -371,7 +372,7 @@ class SimpleMapQuery extends Query { Query.Junction queryCriteria = aq.criteria return executeAssociationSubQuery(datastore[family], aq.association.associatedEntity, queryCriteria, property) }, - (Query.EqualsAll):{ Query.EqualsAll equalsAll, PersistentProperty property, Closure function=null, boolean onValue = false -> + (Query.EqualsAll): { Query.EqualsAll equalsAll, PersistentProperty property, Closure function=null, boolean onValue = false -> def name = equalsAll.property final values = subqueryIfNecessary(equalsAll, false) Assert.isTrue(values.every { property.type.isInstance(it) }, "Subquery returned values that are not compatible with the type of property '$name': $values") @@ -381,7 +382,7 @@ class SimpleMapQuery extends Query { } .collect { it.key } }, - (Query.NotEqualsAll):{ Query.NotEqualsAll notEqualsAll, PersistentProperty property, Closure function=null, boolean onValue = false -> + (Query.NotEqualsAll): { Query.NotEqualsAll notEqualsAll, PersistentProperty property, Closure function=null, boolean onValue = false -> def name = notEqualsAll.property final values = subqueryIfNecessary(notEqualsAll, false) Assert.isTrue(values.every { property.type.isInstance(it) }, "Subquery returned values that are not compatible with the type of property '$name': $values") @@ -391,7 +392,7 @@ class SimpleMapQuery extends Query { } .collect { it.key } }, - (Query.GreaterThanAll):{ Query.GreaterThanAll greaterThanAll, PersistentProperty property, Closure function=null, boolean onValue = false -> + (Query.GreaterThanAll): { Query.GreaterThanAll greaterThanAll, PersistentProperty property, Closure function=null, boolean onValue = false -> def name = greaterThanAll.property final values = subqueryIfNecessary(greaterThanAll, false) Assert.isTrue(values.every { property.type.isInstance(it) }, "Subquery returned values that are not compatible with the type of property '$name': $values") @@ -401,7 +402,7 @@ class SimpleMapQuery extends Query { } .collect { it.key } }, - (Query.LessThanAll):{ Query.LessThanAll lessThanAll, PersistentProperty property, Closure function=null, boolean onValue = false -> + (Query.LessThanAll): { Query.LessThanAll lessThanAll, PersistentProperty property, Closure function=null, boolean onValue = false -> def name = lessThanAll.property final values = subqueryIfNecessary(lessThanAll, false) Assert.isTrue(values.every { property.type.isInstance(it) }, "Subquery returned values that are not compatible with the type of property '$name': $values") @@ -411,7 +412,7 @@ class SimpleMapQuery extends Query { } .collect { it.key } }, - (Query.LessThanEqualsAll):{ Query.LessThanEqualsAll lessThanEqualsAll, PersistentProperty property, Closure function=null, boolean onValue = false -> + (Query.LessThanEqualsAll): { Query.LessThanEqualsAll lessThanEqualsAll, PersistentProperty property, Closure function=null, boolean onValue = false -> def name = lessThanEqualsAll.property final values = subqueryIfNecessary(lessThanEqualsAll, false) Assert.isTrue(values.every { property.type.isInstance(it) }, "Subquery returned values that are not compatible with the type of property '$name': $values") @@ -421,7 +422,7 @@ class SimpleMapQuery extends Query { } .collect { it.key } }, - (Query.GreaterThanEqualsAll):{ Query.GreaterThanEqualsAll greaterThanAll, PersistentProperty property, Closure function=null, boolean onValue = false -> + (Query.GreaterThanEqualsAll): { Query.GreaterThanEqualsAll greaterThanAll, PersistentProperty property, Closure function=null, boolean onValue = false -> def name = greaterThanAll.property final values = subqueryIfNecessary(greaterThanAll, false) Assert.isTrue(values.every { property.type.isInstance(it) }, "Subquery returned values that are not compatible with the type of property '$name': $values") @@ -435,7 +436,7 @@ class SimpleMapQuery extends Query { def indexer = entityPersister.getPropertyIndexer(property) def value = subqueryIfNecessary(equals) - if(value && property instanceof ToOne && property.type.isInstance(value)) { + if (value && property instanceof ToOne && property.type.isInstance(value)) { value = entityPersister.getObjectIdentifier(value) } @@ -456,7 +457,7 @@ class SimpleMapQuery extends Query { } } }, - (Query.IsNull): { Query.IsNull equals, PersistentProperty property, Closure function = null , boolean onValue = false-> + (Query.IsNull): { Query.IsNull equals, PersistentProperty property, Closure function = null , boolean onValue = false -> handlers[Query.Equals].call(new Query.Equals(equals.property, null), property, function) }, (Query.IdEquals): { Query.IdEquals equals, PersistentProperty property -> @@ -642,7 +643,7 @@ class SimpleMapQuery extends Query { * @return */ protected resolveIfEmbedded(propertyName, obj) { - if( propertyName.contains('.') ) { + if (propertyName.contains('.')) { def (embeddedProperty, nestedProperty) = propertyName.tokenize('.') obj?."${embeddedProperty}"?."${nestedProperty}" } @@ -706,7 +707,7 @@ class SimpleMapQuery extends Query { } } } - return applyJunctionToResults(criteria,resultList.results) + return applyJunctionToResults(criteria, resultList.results) } private List applyJunctionToResults(Query.Junction criteria, List resultList) { @@ -752,7 +753,7 @@ class SimpleMapQuery extends Query { def identity = entity.identity if (identity.name == criterion.property) return identity else { - throw new InvalidDataAccessResourceUsageException("Cannot query [" + entity + "] on non-existent property: " + criterion.property) + throw new InvalidDataAccessResourceUsageException('Cannot query [' + entity + '] on non-existent property: ' + criterion.property) } } return property diff --git a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/query/SimpleMapResultList.groovy b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/query/SimpleMapResultList.groovy index 561fc584f2c..d8c22e6251f 100644 --- a/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/query/SimpleMapResultList.groovy +++ b/grails-data-simple/src/main/groovy/org/grails/datastore/mapping/simple/query/SimpleMapResultList.groovy @@ -22,7 +22,8 @@ package org.grails.datastore.mapping.simple.query * @author Graeme Rocher * @since 1.0 */ -class SimpleMapResultList{ +class SimpleMapResultList { + SimpleMapQuery query List results = [] diff --git a/grails-databinding-core/src/main/groovy/grails/databinding/BindUsing.java b/grails-databinding-core/src/main/groovy/grails/databinding/BindUsing.java index c4583bd2115..7a7da5e9d5a 100755 --- a/grails-databinding-core/src/main/groovy/grails/databinding/BindUsing.java +++ b/grails-databinding-core/src/main/groovy/grails/databinding/BindUsing.java @@ -18,9 +18,6 @@ */ package grails.databinding; -import grails.databinding.BindingHelper; -import grails.databinding.DataBindingSource; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; diff --git a/grails-databinding-core/src/main/groovy/grails/databinding/DataBinder.java b/grails-databinding-core/src/main/groovy/grails/databinding/DataBinder.java index 9d49609721c..c4a8fec5452 100644 --- a/grails-databinding-core/src/main/groovy/grails/databinding/DataBinder.java +++ b/grails-databinding-core/src/main/groovy/grails/databinding/DataBinder.java @@ -18,10 +18,11 @@ */ package grails.databinding; -import grails.databinding.events.DataBindingListener; +import java.util.List; + import groovy.xml.slurpersupport.GPathResult; -import java.util.List; +import grails.databinding.events.DataBindingListener; /** * @author Jeff Brown diff --git a/grails-databinding-core/src/main/groovy/grails/databinding/SimpleDataBinder.groovy b/grails-databinding-core/src/main/groovy/grails/databinding/SimpleDataBinder.groovy index 50e1973e0f5..3f3ed13bae3 100755 --- a/grails-databinding-core/src/main/groovy/grails/databinding/SimpleDataBinder.groovy +++ b/grails-databinding-core/src/main/groovy/grails/databinding/SimpleDataBinder.groovy @@ -18,28 +18,33 @@ */ package grails.databinding -import grails.databinding.converters.FormattedValueConverter -import grails.databinding.converters.ValueConverter -import grails.databinding.events.DataBindingListener -import grails.databinding.initializers.ValueInitializer +import java.lang.annotation.Annotation +import java.lang.reflect.Array +import java.lang.reflect.Field +import java.lang.reflect.Modifier +import java.lang.reflect.ParameterizedType +import java.security.ProtectionDomain + import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode import groovy.xml.slurpersupport.GPathResult import org.codehaus.groovy.reflection.CachedMethod + +import grails.databinding.converters.FormattedValueConverter +import grails.databinding.converters.ValueConverter +import grails.databinding.events.DataBindingListener +import grails.databinding.initializers.ValueInitializer import org.grails.databinding.ClosureValueConverter import org.grails.databinding.ClosureValueInitializer import org.grails.databinding.IndexedPropertyReferenceDescriptor -import org.grails.databinding.converters.* +import org.grails.databinding.converters.ConversionService +import org.grails.databinding.converters.FormattedDateValueConverter +import org.grails.databinding.converters.StructuredCalendarBindingEditor +import org.grails.databinding.converters.StructuredDateBindingEditor +import org.grails.databinding.converters.StructuredSqlDateBindingEditor import org.grails.databinding.errors.SimpleBindingError import org.grails.databinding.xml.GPathResultMap -import java.lang.annotation.Annotation -import java.lang.reflect.Array -import java.lang.reflect.Field -import java.lang.reflect.Modifier -import java.lang.reflect.ParameterizedType -import java.security.ProtectionDomain - /** * A data binder that will bind nested Maps to an object. * @@ -92,11 +97,11 @@ class SimpleDataBinder implements DataBinder { int autoGrowCollectionLimit = 256 SimpleDataBinder() { - registerStructuredEditor Date, new StructuredDateBindingEditor() - registerStructuredEditor java.sql.Date, new StructuredSqlDateBindingEditor() - registerStructuredEditor Calendar, new StructuredCalendarBindingEditor() + registerStructuredEditor(Date, new StructuredDateBindingEditor()) + registerStructuredEditor(java.sql.Date, new StructuredSqlDateBindingEditor()) + registerStructuredEditor(Calendar, new StructuredCalendarBindingEditor()) - registerFormattedValueConverter new FormattedDateValueConverter() + registerFormattedValueConverter(new FormattedDateValueConverter()) } void registerStructuredEditor(Class clazz, StructuredBindingEditor editor) { @@ -111,17 +116,17 @@ class SimpleDataBinder implements DataBinder { } /** - * + * * @param obj The object being bound to * @param source The data binding source * @see DataBindingSource */ void bind(obj, DataBindingSource source) { - bind obj, source, null, null, null, null + bind(obj, source, null, null, null, null) } /** - * + * * @param obj The object being bound to * @param source The data binding source * @param listener A listener which will be notified of data binding events triggered @@ -130,49 +135,49 @@ class SimpleDataBinder implements DataBinder { * @see DataBindingListener */ void bind(obj, DataBindingSource source, DataBindingListener listener) { - bind obj, source, null, null, null, listener + bind(obj, source, null, null, null, listener) } /** - * + * * @param obj The object being bound to * @param source The data binding source - * @param whiteList A list of property names to be included during this - * data binding. All other properties represented in the binding source + * @param whiteList A list of property names to be included during this + * data binding. All other properties represented in the binding source * will be ignored * @see DataBindingSource */ void bind(obj, DataBindingSource source, List whiteList) { - bind obj, source, null, whiteList, null, null + bind(obj, source, null, whiteList, null, null) } /** - * + * * @param obj The object being bound to * @param source The data binding source - * @param whiteList A list of property names to be included during this - * data binding. All other properties represented in the binding source + * @param whiteList A list of property names to be included during this + * data binding. All other properties represented in the binding source * will be ignored * @param blackList A list of properties names to be excluded during - * this data binding. + * this data binding. * @see DataBindingSource */ void bind(obj, DataBindingSource source, List whiteList, List blackList) { - bind obj, source, null, whiteList, blackList, null + bind(obj, source, null, whiteList, blackList, null) } /** - * + * * @param obj The object being bound to - * @param gpath A GPathResult which represents the data being bound. + * @param gpath A GPathResult which represents the data being bound. * @see DataBindingSource */ void bind(obj, GPathResult gpath) { - bind obj, new SimpleMapDataBindingSource(new GPathResultMap(gpath)) + bind(obj, new SimpleMapDataBindingSource(new GPathResultMap(gpath))) } /** - * + * * @param obj The object being bound to * @param source The data binding source * @param filter Only properties beginning with filter will be included in the @@ -180,19 +185,19 @@ class SimpleDataBinder implements DataBinder { * source contains data for properties "person.name" and "author.name" * the value of "person.name" will be bound to obj.name. The value of * "author.name" will be ignored. - * @param whiteList A list of property names to be included during this - * data binding. All other properties represented in the binding source + * @param whiteList A list of property names to be included during this + * data binding. All other properties represented in the binding source * will be ignored * @param blackList A list of properties names to be excluded during - * this data binding. + * this data binding. * @see DataBindingSource */ void bind(obj, DataBindingSource source, String filter, List whiteList, List blackList) { - bind obj, source, filter, whiteList, blackList, null + bind(obj, source, filter, whiteList, blackList, null) } /** - * + * * @param obj The object being bound to * @param source The data binding source * @param filter Only properties beginning with filter will be included in the @@ -200,18 +205,18 @@ class SimpleDataBinder implements DataBinder { * source contains data for properties "person.name" and "author.name" * the value of "person.name" will be bound to obj.name. The value of * "author.name" will be ignored. - * @param whiteList A list of property names to be included during this - * data binding. All other properties represented in the binding source + * @param whiteList A list of property names to be included during this + * data binding. All other properties represented in the binding source * will be ignored * @param blackList A list of properties names to be excluded during - * this data binding. + * this data binding. * @param listener A listener which will be notified of data binding events triggered * by this binding * @see DataBindingSource * @see DataBindingListener */ void bind(obj, DataBindingSource source, String filter, List whiteList, List blackList, DataBindingListener listener) { - doBind obj, source, filter, whiteList, blackList, listener, null + doBind(obj, source, filter, whiteList, blackList, listener, null) } protected void doBind(obj, DataBindingSource source, String filter, List whiteList, List blackList, DataBindingListener listener, errors) { @@ -221,39 +226,39 @@ class SimpleDataBinder implements DataBinder { if (!filter || key.startsWith(filter + '.')) { String propName = key if (filter) { - propName = key[(1+filter.size())..-1] + propName = key[(1 + filter.size())..-1] } - def metaProperty = obj.metaClass.getMetaProperty propName + def metaProperty = obj.metaClass.getMetaProperty(propName) if (metaProperty) { // normal property if (isOkToBind(metaProperty, whiteList, blackList)) { def val = source[key] try { def converter = getValueConverter(obj, metaProperty.name) - if(converter) { - bindProperty obj, source, metaProperty, converter.convert(source), listener, errors + if (converter) { + bindProperty(obj, source, metaProperty, converter.convert(source), listener, errors) } else { - processProperty obj, metaProperty, preprocessValue(val), source, listener, errors + processProperty(obj, metaProperty, preprocessValue(val), source, listener, errors) } } catch (Exception e) { addBindingError(obj, propName, val, e, listener, errors) } } } else { - def descriptor = getIndexedPropertyReferenceDescriptor propName + def descriptor = getIndexedPropertyReferenceDescriptor(propName) if (descriptor) { // indexed property - metaProperty = obj.metaClass.getMetaProperty descriptor.propertyName + metaProperty = obj.metaClass.getMetaProperty(descriptor.propertyName) if (metaProperty && isOkToBind(metaProperty, whiteList, blackList)) { - def val = source.getPropertyValue key - processIndexedProperty obj, metaProperty, descriptor, val, source, listener, errors + def val = source.getPropertyValue(key) + processIndexedProperty(obj, metaProperty, descriptor, val, source, listener, errors) } } else if (propName.startsWith('_') && propName.length() > 1) { // boolean special handling def restOfPropertyName = propName[1..-1] if (!source.containsProperty(restOfPropertyName)) { - metaProperty = obj.metaClass.getMetaProperty restOfPropertyName + metaProperty = obj.metaClass.getMetaProperty(restOfPropertyName) if (metaProperty && isOkToBind(metaProperty, whiteList, blackList)) { if ((Boolean == metaProperty.type || Boolean.TYPE == metaProperty.type)) { - bindProperty obj, source, metaProperty, false, listener, errors + bindProperty(obj, source, metaProperty, false, listener, errors) } } } @@ -264,14 +269,14 @@ class SimpleDataBinder implements DataBinder { } protected boolean isOkToBind(String propName, List whiteList, List blackList) { - 'class' != propName && 'classLoader' != propName && 'protectionDomain' != propName && 'metaClass' != propName && 'metaPropertyValues' != propName && 'properties' != propName && !blackList?.contains(propName) && (!whiteList || whiteList.contains(propName) || whiteList.find { it -> it?.toString()?.startsWith(propName + '.')}) + 'class' != propName && 'classLoader' != propName && 'protectionDomain' != propName && 'metaClass' != propName && 'metaPropertyValues' != propName && 'properties' != propName && !blackList?.contains(propName) && (!whiteList || whiteList.contains(propName) || whiteList.find { it -> it?.toString()?.startsWith(propName + '.') }) } protected boolean isOkToBind(MetaProperty property, List whitelist, List blacklist) { isOkToBind(property.name, whitelist, blacklist) && (property.type != null) && !Modifier.isStatic(property.modifiers) && - !(ClassLoader.class.isAssignableFrom(property.type) || ProtectionDomain.class.isAssignableFrom(property.type) || MetaProperty.class.isAssignableFrom(property.type) || CachedMethod.class.isAssignableFrom(property.type)) + !(ClassLoader.isAssignableFrom(property.type) || ProtectionDomain.isAssignableFrom(property.type) || MetaProperty.isAssignableFrom(property.type) || CachedMethod.isAssignableFrom(property.type)) } protected IndexedPropertyReferenceDescriptor getIndexedPropertyReferenceDescriptor(propName) { @@ -293,9 +298,9 @@ class SimpleDataBinder implements DataBinder { def propertyType = metaProperty.type if (structuredEditors.containsKey(propertyType) && ('struct' == val || 'date.struct' == val)) { def structuredEditor = structuredEditors[propertyType] - val = structuredEditor.getPropertyValue obj, propName, source + val = structuredEditor.getPropertyValue(obj, propName, source) } - bindProperty obj, source, metaProperty, val, listener, errors + bindProperty(obj, source, metaProperty, val, listener, errors) } protected SimpleMapDataBindingSource splitIndexedStruct(IndexedPropertyReferenceDescriptor indexedPropertyReferenceDescriptor, DataBindingSource source) { @@ -324,60 +329,60 @@ class SimpleDataBinder implements DataBinder { if (structuredEditors.containsKey(genericType) && ('struct' == val || 'date.struct' == val)) { def structuredEditor = structuredEditors[genericType] - val = structuredEditor.getPropertyValue obj, propName, splitIndexedStruct(indexedPropertyReferenceDescriptor, source) + val = structuredEditor.getPropertyValue(obj, propName, splitIndexedStruct(indexedPropertyReferenceDescriptor, source)) } if (propertyType.isArray()) { def index = Integer.parseInt(indexedPropertyReferenceDescriptor.index) def array = initializeArray(obj, propName, propertyType.componentType, index) if (array != null) { - addElementToArrayAt array, index, val + addElementToArrayAt(array, index, val) } } else if (Collection.isAssignableFrom(propertyType)) { def index = Integer.parseInt(indexedPropertyReferenceDescriptor.index) - Collection collectionInstance = initializeCollection obj, propName, propertyType + Collection collectionInstance = initializeCollection(obj, propName, propertyType) def indexedInstance = null - if(!(Set.isAssignableFrom(propertyType))) { + if (!(Set.isAssignableFrom(propertyType))) { indexedInstance = collectionInstance[index] } if (indexedInstance == null) { if (genericType) { if (genericType.isAssignableFrom(val?.getClass())) { - addElementToCollectionAt obj, propName, collectionInstance, index, val + addElementToCollectionAt(obj, propName, collectionInstance, index, val) } else if (isBasicType(genericType)) { - addElementToCollectionAt obj, propName, collectionInstance, index, convert(genericType, val) - } else if (val instanceof Map){ + addElementToCollectionAt(obj, propName, collectionInstance, index, convert(genericType, val)) + } else if (val instanceof Map) { indexedInstance = genericType.getDeclaredConstructor().newInstance() - bind indexedInstance, new SimpleMapDataBindingSource(val), listener - addElementToCollectionAt obj, propName, collectionInstance, index, indexedInstance + bind(indexedInstance, new SimpleMapDataBindingSource(val), listener) + addElementToCollectionAt(obj, propName, collectionInstance, index, indexedInstance) } else if (val instanceof DataBindingSource) { indexedInstance = genericType.getDeclaredConstructor().newInstance() - bind indexedInstance, val, listener - addElementToCollectionAt obj, propName, collectionInstance, index, indexedInstance - } else if(genericType.isEnum() && val instanceof CharSequence) { + bind(indexedInstance, val, listener) + addElementToCollectionAt(obj, propName, collectionInstance, index, indexedInstance) + } else if (genericType.isEnum() && val instanceof CharSequence) { def enumValue = convertStringToEnum(genericType, val.toString()) - addElementToCollectionAt obj, propName, collectionInstance, index, enumValue + addElementToCollectionAt(obj, propName, collectionInstance, index, enumValue) } else { - addElementToCollectionAt obj, propName, collectionInstance, index, convert(genericType, val) + addElementToCollectionAt(obj, propName, collectionInstance, index, convert(genericType, val)) } } else { - addElementToCollectionAt obj, propName, collectionInstance, index, val + addElementToCollectionAt(obj, propName, collectionInstance, index, val) } } else { if (val instanceof Map) { - bind indexedInstance, new SimpleMapDataBindingSource(val), listener + bind(indexedInstance, new SimpleMapDataBindingSource(val), listener) } else if (val instanceof DataBindingSource) { - bind indexedInstance, val, listener + bind(indexedInstance, val, listener) } else if (val == null && indexedInstance != null) { - addElementToCollectionAt obj, propName, collectionInstance, index, null + addElementToCollectionAt(obj, propName, collectionInstance, index, null) } } } else if (Map.isAssignableFrom(propertyType)) { - Map mapInstance = initializeMap obj, propName + Map mapInstance = initializeMap(obj, propName) if (mapInstance.size() < autoGrowCollectionLimit || mapInstance.containsKey(indexedPropertyReferenceDescriptor.index)) { - def referencedType = getReferencedTypeForCollection propName, obj + def referencedType = getReferencedTypeForCollection(propName, obj) if (referencedType != null) { - if(val instanceof Map) { + if (val instanceof Map) { mapInstance[indexedPropertyReferenceDescriptor.index] = referencedType.newInstance(val) } else { mapInstance[indexedPropertyReferenceDescriptor.index] = convert(referencedType, val) @@ -389,7 +394,6 @@ class SimpleDataBinder implements DataBinder { } } - @CompileStatic(TypeCheckingMode.SKIP) protected initializeArray(obj, String propertyName, Class arrayType, int index) { Object[] array = obj[propertyName] @@ -408,17 +412,16 @@ class SimpleDataBinder implements DataBinder { protected boolean isBasicType(Class c) { BASIC_TYPES.contains(c) || c.isPrimitive() } - - + protected Class getReferencedTypeForCollectionInClass(String propertyName, Class clazz) { Class referencedType def field = getField(clazz, propertyName) - if(field) { + if (field) { def genericType = field.genericType if (genericType instanceof ParameterizedType) { - ParameterizedType pt = (ParameterizedType)genericType + ParameterizedType pt = (ParameterizedType) genericType Class rawType = pt.getRawType() - if(Map.isAssignableFrom(rawType)) { + if (Map.isAssignableFrom(rawType)) { referencedType = pt.getActualTypeArguments()[1] } else { referencedType = pt.getActualTypeArguments()[0] @@ -429,7 +432,7 @@ class SimpleDataBinder implements DataBinder { } protected Class getReferencedTypeForCollection(String propertyName, Object obj) { - getReferencedTypeForCollectionInClass propertyName, obj.getClass() + getReferencedTypeForCollectionInClass(propertyName, obj.getClass()) } protected boolean isOkToAddElementAt(Collection collection, int index) { @@ -446,7 +449,7 @@ class SimpleDataBinder implements DataBinder { protected addElementToCollectionAt(obj, String propertyName, Collection collection, index, val) { if (isOkToAddElementAt(collection, index)) { if (collection instanceof Set) { - collection.add val + collection.add(val) } else { collection[index] = val } @@ -464,21 +467,21 @@ class SimpleDataBinder implements DataBinder { if (obj[propertyName] == null) { obj[propertyName] = [:] } - return (Map)obj[propertyName] + return (Map) obj[propertyName] } protected Collection initializeCollection(obj, String propertyName, Class type, boolean reuseExistingCollectionIfExists = true) { def val = null - if(reuseExistingCollectionIfExists) { + if (reuseExistingCollectionIfExists) { val = obj[propertyName] } if (val == null) { val = getDefaultCollectionInstanceForType(type) obj[propertyName] = val } - return (Collection)val + return (Collection) val } - + protected getDefaultCollectionInstanceForType(Class type) { def val if (List.isAssignableFrom(type)) { @@ -508,8 +511,8 @@ class SimpleDataBinder implements DataBinder { converter = { SimpleMapDataBindingSource source -> def value = preprocessValue(source.getPropertyValue(field.name)) def convertedValue = null - if(value != null) { - convertedValue = formattedConverter.convert (value, formattingValue) + if (value != null) { + convertedValue = formattedConverter.convert(value, formattingValue) } convertedValue } as ValueConverter @@ -523,7 +526,7 @@ class SimpleDataBinder implements DataBinder { field = clazz.getDeclaredField(fieldName) } catch (NoSuchFieldException ignored) { def superClass = clazz.getSuperclass() - if(superClass != Object) { + if (superClass != Object) { field = getField(superClass, fieldName) } } @@ -539,13 +542,13 @@ class SimpleDataBinder implements DataBinder { if (annotation) { def valueClass = getValueOfBindUsing(annotation) if (Closure.isAssignableFrom(valueClass)) { - Closure closure = (Closure)valueClass.newInstance(null, null) + Closure closure = (Closure) valueClass.newInstance(null, null) converter = new ClosureValueConverter(converterClosure: closure.curry(obj), targetType: field.type) } } else { annotation = field.getAnnotation(BindingFormat) if (annotation) { - converter = getFormattedConverter field, getFormatString(annotation) + converter = getFormattedConverter(field, getFormatString(annotation)) } } } @@ -553,7 +556,7 @@ class SimpleDataBinder implements DataBinder { } catch (Exception ignored) { } } - + /** * @param annotation An instance of grails.databinding.BindingUsing or org.grails.databinding.BindingUsing * @return the value Class of the annotation @@ -564,7 +567,7 @@ class SimpleDataBinder implements DataBinder { return ((BindUsing) annotation).value() } } - + /** * @param annotation An instance of grails.databinding.BindingFormat or org.grails.databinding.BindingFormat * @return the value String of the annotation @@ -591,9 +594,9 @@ class SimpleDataBinder implements DataBinder { } protected ValueConverter getValueConverter(obj, String propName) { - def converter = getValueConverterForField obj, propName + def converter = getValueConverterForField(obj, propName) if (!converter) { - converter = getValueConverterForClass obj, propName + converter = getValueConverterForClass(obj, propName) } converter } @@ -604,41 +607,41 @@ class SimpleDataBinder implements DataBinder { enumClass.valueOf(value) } catch (IllegalArgumentException iae) {} } - + protected preprocessValue(propertyValue) { propertyValue } protected setPropertyValue(obj, DataBindingSource source, MetaProperty metaProperty, propertyValue, DataBindingListener listener) { def convertCollectionElements = false - if(propertyValue instanceof Collection) { + if (propertyValue instanceof Collection) { def referencedType = getReferencedTypeForCollection(metaProperty.name, obj) - if(referencedType) { - def nonAssignableValue = propertyValue.find { it != null && !(referencedType.isAssignableFrom(it.getClass()))} - if(nonAssignableValue != null) { + if (referencedType) { + def nonAssignableValue = propertyValue.find { it != null && !(referencedType.isAssignableFrom(it.getClass())) } + if (nonAssignableValue != null) { convertCollectionElements = true } } } - - setPropertyValue obj, source, metaProperty, propertyValue, listener, convertCollectionElements + + setPropertyValue(obj, source, metaProperty, propertyValue, listener, convertCollectionElements) } - + protected setPropertyValue(obj, DataBindingSource source, MetaProperty metaProperty, propertyValue, DataBindingListener listener, boolean convertCollectionElements) { def propName = metaProperty.name def propertyType def propertyGetter if (metaProperty instanceof MetaBeanProperty) { - def mbp = (MetaBeanProperty)metaProperty + def mbp = (MetaBeanProperty) metaProperty propertyType = mbp.getter?.returnType ?: mbp.field?.type - if(propertyType && (propertyType.interface || Modifier.isAbstract(propertyType.modifiers))) { + if (propertyType && (propertyType.interface || Modifier.isAbstract(propertyType.modifiers))) { propertyType = mbp.field?.type } propertyGetter = mbp.getter } if (propertyType == null || propertyType == Object) { propertyType = metaProperty.type - if(propertyType == null || propertyType == Object) { + if (propertyType == null || propertyType == Object) { propertyType = getField(obj.getClass(), propName)?.type ?: Object } } @@ -656,35 +659,35 @@ class SimpleDataBinder implements DataBinder { if (propertyValue instanceof Map) { if (Collection.isAssignableFrom(propertyType) && propertyValue.size() == 1 && - ((Map)propertyValue)[propertyValue.keySet()[0]] instanceof List) { + ((Map) propertyValue)[propertyValue.keySet()[0]] instanceof List) { def key = propertyValue.keySet()[0] - List list = (List)((Map)propertyValue)[key] + List list = (List) ((Map)propertyValue)[key] addElementsToCollection(obj, propName, list) } else { if (obj[propName] == null) { initializeProperty(obj, propName, propertyType, source) } - bind obj[propName], new SimpleMapDataBindingSource(propertyValue), listener + bind(obj[propName], new SimpleMapDataBindingSource(propertyValue), listener) } } else if (propertyValue instanceof DataBindingSource) { if (Collection.isAssignableFrom(propertyType) && propertyValue.size() == 1 && - ((Map)propertyValue)[propertyValue.getPropertyNames()[0]] instanceof List) { + ((Map) propertyValue)[propertyValue.getPropertyNames()[0]] instanceof List) { def key = propertyValue.getPropertyNames()[0] - List list = (List)((Map)propertyValue)[key] + List list = (List) ((Map)propertyValue)[key] addElementsToCollection(obj, propName, list) } else { if (obj[propName] == null) { initializeProperty(obj, propName, propertyType, source) } - bind obj[propName], propertyValue, listener + bind(obj[propName], propertyValue, listener) } - } else if(Collection.isAssignableFrom(propertyType) && propertyValue instanceof String) { - addElementToCollection obj, propName, propertyType, propertyValue, true - } else if(Collection.isAssignableFrom(propertyType) && propertyValue instanceof Number) { - addElementToCollection obj, propName, propertyType, propertyValue, true - } else if(Collection.isAssignableFrom(propertyType) && propertyValue.getClass().isArray()) { - addElementsToCollection obj, propName, propertyValue as Collection, true + } else if (Collection.isAssignableFrom(propertyType) && propertyValue instanceof String) { + addElementToCollection(obj, propName, propertyType, propertyValue, true) + } else if (Collection.isAssignableFrom(propertyType) && propertyValue instanceof Number) { + addElementToCollection(obj, propName, propertyType, propertyValue, true) + } else if (Collection.isAssignableFrom(propertyType) && propertyValue.getClass().isArray()) { + addElementsToCollection(obj, propName, propertyValue as Collection, true) } else { obj[propName] = convert(propertyType, propertyValue) } @@ -692,12 +695,12 @@ class SimpleDataBinder implements DataBinder { } protected addElementToCollection(obj, String propName, Class propertyType, propertyValue, boolean clearCollection) { boolean isSet = false - def coll = initializeCollection obj, propName, propertyType + def coll = initializeCollection(obj, propName, propertyType) if (coll != null) { if (clearCollection) { coll.clear() } - def referencedType = getReferencedTypeForCollection propName, obj + def referencedType = getReferencedTypeForCollection(propName, obj) if (referencedType != null) { if (propertyValue == null || referencedType.isAssignableFrom(propertyValue.getClass())) { coll << propertyValue @@ -715,20 +718,20 @@ class SimpleDataBinder implements DataBinder { def propName = metaProperty.name if (listener == null || listener.beforeBinding(obj, propName, propertyValue, errors) != false) { try { - setPropertyValue obj, source, metaProperty, propertyValue, listener + setPropertyValue(obj, source, metaProperty, propertyValue, listener) } catch (Exception e) { addBindingError(obj, propName, propertyValue, e, listener, errors) } } else if (listener != null && propertyValue instanceof Map && obj[propName] != null) { - bind obj[propName], new SimpleMapDataBindingSource(propertyValue) + bind(obj[propName], new SimpleMapDataBindingSource(propertyValue)) } - listener?.afterBinding obj, propName, errors + listener?.afterBinding(obj, propName, errors) } protected addBindingError(obj, String propName, propertyValue, Exception e, DataBindingListener listener, errors) { if (listener) { def error = new SimpleBindingError(obj, propName, propertyValue, e.cause ?: e) - listener.bindingError error, errors + listener.bindingError(error, errors) } } @@ -739,7 +742,7 @@ class SimpleDataBinder implements DataBinder { if (removeExistingElements == true) { coll.clear() } - for(element in collection) { + for (element in collection) { if (element == null || referencedType == null || referencedType.isAssignableFrom(element.getClass())) { coll << element } else { @@ -750,17 +753,17 @@ class SimpleDataBinder implements DataBinder { } protected initializeProperty(obj, String propName, Class propertyType, DataBindingSource source) { - def initializer = getPropertyInitializer(obj,propName) - if(initializer){ + def initializer = getPropertyInitializer(obj, propName) + if (initializer) { obj[propName] = initializer.initialize() } - else{ + else { obj[propName] = propertyType.getDeclaredConstructor().newInstance() - } + } } - - protected ValueInitializer getPropertyInitializer(obj, String propName){ - def initializer = getValueInitializerForField obj, propName + + protected ValueInitializer getPropertyInitializer(obj, String propName) { + def initializer = getValueInitializerForField(obj, propName) initializer } @@ -773,7 +776,7 @@ class SimpleDataBinder implements DataBinder { if (annotation) { def valueClass = getValueOfBindInitializer(annotation) if (Closure.isAssignableFrom(valueClass)) { - Closure closure = (Closure)valueClass.newInstance(null, null) + Closure closure = (Closure) valueClass.newInstance(null, null) initializer = new ClosureValueInitializer(initializerClosure: closure.curry(obj), targetType: field.type) } } @@ -783,18 +786,18 @@ class SimpleDataBinder implements DataBinder { initializer } /** - * @param annotation An instance of grails.databinding.BindInitializer + * @param annotation An instance of grails.databinding.BindInitializer * @return the value Class of the annotation */ protected Class getValueOfBindInitializer(Annotation annotation) { assert annotation instanceof BindInitializer def value - if(annotation instanceof BindInitializer) { - value = ((BindInitializer)annotation).value() + if (annotation instanceof BindInitializer) { + value = ((BindInitializer) annotation).value() } value } - + protected convert(Class typeToConvertTo, value) { if (value == null || typeToConvertTo.isAssignableFrom(value?.getClass())) { return value @@ -819,12 +822,12 @@ class SimpleDataBinder implements DataBinder { return value } else if (value instanceof Map) { def obj = typeToConvertTo.getDeclaredConstructor().newInstance() - bind obj, new SimpleMapDataBindingSource(value) + bind(obj, new SimpleMapDataBindingSource(value)) return obj } else if (Enum.isAssignableFrom(typeToConvertTo) && value instanceof String) { return convertStringToEnum((Class) typeToConvertTo, value) } - typeToConvertTo.newInstance value + typeToConvertTo.newInstance(value) } protected ValueConverter getConverter(Class typeToConvertTo, value) { diff --git a/grails-databinding-core/src/main/groovy/grails/databinding/SimpleMapDataBindingSource.groovy b/grails-databinding-core/src/main/groovy/grails/databinding/SimpleMapDataBindingSource.groovy index 421bd3b9340..480c8e68f7d 100644 --- a/grails-databinding-core/src/main/groovy/grails/databinding/SimpleMapDataBindingSource.groovy +++ b/grails-databinding-core/src/main/groovy/grails/databinding/SimpleMapDataBindingSource.groovy @@ -35,15 +35,15 @@ class SimpleMapDataBindingSource implements DataBindingSource { } Object getPropertyValue(String propertyName) { - map.get propertyName + map.get(propertyName) } Object getAt(String propertyName) { - getPropertyValue propertyName + getPropertyValue(propertyName) } boolean containsProperty(String propertyName) { - map.containsKey propertyName + map.containsKey(propertyName) } boolean hasIdentifier() { diff --git a/grails-databinding-core/src/main/groovy/grails/databinding/StructuredBindingEditor.java b/grails-databinding-core/src/main/groovy/grails/databinding/StructuredBindingEditor.java index e11cf70325b..c22b4d135e9 100644 --- a/grails-databinding-core/src/main/groovy/grails/databinding/StructuredBindingEditor.java +++ b/grails-databinding-core/src/main/groovy/grails/databinding/StructuredBindingEditor.java @@ -18,7 +18,6 @@ */ package grails.databinding; - /** * StructuredBindingEditors convert structured data in a Map * into an object. Typically a structured editor will pull diff --git a/grails-databinding-core/src/main/groovy/grails/databinding/TypedStructuredBindingEditor.java b/grails-databinding-core/src/main/groovy/grails/databinding/TypedStructuredBindingEditor.java index d4b946f1881..0fae027798f 100644 --- a/grails-databinding-core/src/main/groovy/grails/databinding/TypedStructuredBindingEditor.java +++ b/grails-databinding-core/src/main/groovy/grails/databinding/TypedStructuredBindingEditor.java @@ -18,7 +18,6 @@ */ package grails.databinding; - /** * * @since 3.0 diff --git a/grails-databinding-core/src/main/groovy/grails/databinding/converters/ValueConverter.java b/grails-databinding-core/src/main/groovy/grails/databinding/converters/ValueConverter.java index 0e8d5871f9f..5bcaf19e252 100755 --- a/grails-databinding-core/src/main/groovy/grails/databinding/converters/ValueConverter.java +++ b/grails-databinding-core/src/main/groovy/grails/databinding/converters/ValueConverter.java @@ -24,6 +24,8 @@ */ public interface ValueConverter { boolean canConvert(Object value); + Object convert(Object value); + Class getTargetType(); } diff --git a/grails-databinding-core/src/main/groovy/grails/databinding/initializers/ValueInitializer.java b/grails-databinding-core/src/main/groovy/grails/databinding/initializers/ValueInitializer.java index 7e3b82f2ebd..3fbf53b003f 100644 --- a/grails-databinding-core/src/main/groovy/grails/databinding/initializers/ValueInitializer.java +++ b/grails-databinding-core/src/main/groovy/grails/databinding/initializers/ValueInitializer.java @@ -19,8 +19,8 @@ package grails.databinding.initializers; - public interface ValueInitializer { Object initialize(); + Class getTargetType(); } diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/ClosureValueConverter.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/ClosureValueConverter.groovy index 3e67d8b9d2e..54513da73b1 100755 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/ClosureValueConverter.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/ClosureValueConverter.groovy @@ -18,9 +18,10 @@ */ package org.grails.databinding -import grails.databinding.converters.ValueConverter; import groovy.transform.CompileStatic +import grails.databinding.converters.ValueConverter + /** * @author Jeff Brown * @since 2.3 @@ -32,7 +33,7 @@ class ClosureValueConverter implements ValueConverter { Class targetType Object convert(value) { - converterClosure value + converterClosure(value) } Class getTargetType() { diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/ClosureValueInitializer.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/ClosureValueInitializer.groovy index a3674d0d8fe..e17467b3e4e 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/ClosureValueInitializer.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/ClosureValueInitializer.groovy @@ -19,18 +19,18 @@ package org.grails.databinding -import grails.databinding.initializers.ValueInitializer import groovy.transform.CompileStatic +import grails.databinding.initializers.ValueInitializer + @CompileStatic class ClosureValueInitializer implements ValueInitializer { Closure initializerClosure Class targetType - @Override Object initialize() { initializerClosure.call() } -} \ No newline at end of file +} diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/IndexedPropertyReferenceDescriptor.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/IndexedPropertyReferenceDescriptor.groovy index d0a4ef1c731..6441f35695c 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/IndexedPropertyReferenceDescriptor.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/IndexedPropertyReferenceDescriptor.groovy @@ -23,6 +23,7 @@ package org.grails.databinding * @since 2.3 */ class IndexedPropertyReferenceDescriptor { + String propertyName String index diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/compiler/BindingFormatASTTransformation.java b/grails-databinding-core/src/main/groovy/org/grails/databinding/compiler/BindingFormatASTTransformation.java index 48afe367ba8..f946e2d36ce 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/compiler/BindingFormatASTTransformation.java +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/compiler/BindingFormatASTTransformation.java @@ -21,7 +21,6 @@ import java.util.Map; -import org.apache.grails.common.compiler.GroovyTransformOrder; import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.AnnotationNode; import org.codehaus.groovy.ast.FieldNode; @@ -34,37 +33,39 @@ import org.codehaus.groovy.transform.GroovyASTTransformation; import org.codehaus.groovy.transform.TransformWithPriority; +import org.apache.grails.common.compiler.GroovyTransformOrder; + @GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS) public class BindingFormatASTTransformation implements ASTTransformation, TransformWithPriority { - @Override - public void visit(final ASTNode[] astNodes, final SourceUnit source) { - if (!(astNodes[0] instanceof AnnotationNode) || !(astNodes[1] instanceof FieldNode)) { - throw new RuntimeException("Internal error: wrong types: $node.class / $parent.class"); - } + @Override + public void visit(final ASTNode[] astNodes, final SourceUnit source) { + if (!(astNodes[0] instanceof AnnotationNode) || !(astNodes[1] instanceof FieldNode)) { + throw new RuntimeException("Internal error: wrong types: $node.class / $parent.class"); + } - final AnnotationNode annotationNode = (AnnotationNode) astNodes[0]; - final FieldNode fieldNode = (FieldNode) astNodes[1]; - final Map members = annotationNode.getMembers(); - if(members == null || (!members.containsKey("code") && !members.containsKey("value"))) { - final String message = "The @BindingFormat annotation on the field [" - + fieldNode.getName() + - "] in class [" + - fieldNode.getDeclaringClass().getName() + - "] must provide a value for either the value() or code() attribute."; - - error(source, fieldNode, message); - } - } - - protected void error(final SourceUnit sourceUnit, final ASTNode astNode, final String message) { - final SyntaxException syntaxException = new SyntaxException(message, astNode.getLineNumber(), astNode.getColumnNumber()); - final SyntaxErrorMessage syntaxErrorMessage = new SyntaxErrorMessage(syntaxException, sourceUnit); - sourceUnit.getErrorCollector().addError(syntaxErrorMessage, false); - } + final AnnotationNode annotationNode = (AnnotationNode) astNodes[0]; + final FieldNode fieldNode = (FieldNode) astNodes[1]; + final Map members = annotationNode.getMembers(); + if (members == null || (!members.containsKey("code") && !members.containsKey("value"))) { + final String message = "The @BindingFormat annotation on the field [" + + fieldNode.getName() + + "] in class [" + + fieldNode.getDeclaringClass().getName() + + "] must provide a value for either the value() or code() attribute."; + + error(source, fieldNode, message); + } + } + + protected void error(final SourceUnit sourceUnit, final ASTNode astNode, final String message) { + final SyntaxException syntaxException = new SyntaxException(message, astNode.getLineNumber(), astNode.getColumnNumber()); + final SyntaxErrorMessage syntaxErrorMessage = new SyntaxErrorMessage(syntaxException, sourceUnit); + sourceUnit.getErrorCollector().addError(syntaxErrorMessage, false); + } - @Override - public int priority() { - return GroovyTransformOrder.BINDING_FORMAT_ORDER; - } + @Override + public int priority() { + return GroovyTransformOrder.BINDING_FORMAT_ORDER; + } } diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/AbstractStructuredDateBindingEditor.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/AbstractStructuredDateBindingEditor.groovy index aad5ce9c1ff..0b06640d2da 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/AbstractStructuredDateBindingEditor.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/AbstractStructuredDateBindingEditor.groovy @@ -18,10 +18,11 @@ */ package org.grails.databinding.converters -import grails.databinding.DataBindingSource; -import grails.databinding.StructuredBindingEditor; import groovy.transform.CompileStatic +import grails.databinding.DataBindingSource +import grails.databinding.StructuredBindingEditor + /** * @author Jeff Brown * @since 2.3 @@ -29,15 +30,15 @@ import groovy.transform.CompileStatic @CompileStatic abstract class AbstractStructuredDateBindingEditor implements StructuredBindingEditor { - public T assemble(String propertyName, DataBindingSource fieldValues) throws IllegalArgumentException { + T assemble(String propertyName, DataBindingSource fieldValues) throws IllegalArgumentException { final prefix = propertyName + '_' - assert fieldValues.containsProperty(prefix + "year"), "Can't populate a date without a year" + assert fieldValues.containsProperty(prefix + 'year'), "Can't populate a date without a year" - def yearString = (String)fieldValues.getPropertyValue(prefix + "year") - def monthString = (String) fieldValues.getPropertyValue(prefix + "month") - def dayString = (String) fieldValues.getPropertyValue(prefix + "day") - def hourString = (String) fieldValues.getPropertyValue(prefix + "hour") - def minuteString = (String) fieldValues.getPropertyValue(prefix + "minute") + def yearString = (String) fieldValues.getPropertyValue(prefix + 'year') + def monthString = (String) fieldValues.getPropertyValue(prefix + 'month') + def dayString = (String) fieldValues.getPropertyValue(prefix + 'day') + def hourString = (String) fieldValues.getPropertyValue(prefix + 'hour') + def minuteString = (String) fieldValues.getPropertyValue(prefix + 'minute') if (!yearString && !monthString && !dayString && @@ -51,16 +52,16 @@ abstract class AbstractStructuredDateBindingEditor implements StructuredBindi year = Integer.parseInt(yearString) - int month = getIntegerValue(fieldValues, prefix + "month", 1) - int day = getIntegerValue(fieldValues, prefix + "day", 1) - int hour = getIntegerValue(fieldValues, prefix + "hour", 0) - int minute = getIntegerValue(fieldValues, prefix + "minute", 0) + int month = getIntegerValue(fieldValues, prefix + 'month', 1) + int day = getIntegerValue(fieldValues, prefix + 'day', 1) + int hour = getIntegerValue(fieldValues, prefix + 'hour', 0) + int minute = getIntegerValue(fieldValues, prefix + 'minute', 0) - def c = new GregorianCalendar(year,month - 1,day,hour,minute) + def c = new GregorianCalendar(year, month - 1, day, hour, minute) return getDate(c) } catch (NumberFormatException nfe) { - throw new IllegalArgumentException("Unable to parse structured date from request for date [\"+propertyName+\"]\"") + throw new IllegalArgumentException("Unable to parse structured date from request for date [$propertyName]") } } @@ -72,7 +73,7 @@ abstract class AbstractStructuredDateBindingEditor implements StructuredBindi ['month', 'day', 'hour', 'minute'] } - public T getPropertyValue(obj, String propertyName, DataBindingSource source) { + T getPropertyValue(obj, String propertyName, DataBindingSource source) { assemble(propertyName, source) } diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/ConversionService.java b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/ConversionService.java index fe16f0b7e90..7bb155ced12 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/ConversionService.java +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/ConversionService.java @@ -23,6 +23,8 @@ * @since 2.3 */ public interface ConversionService { + boolean canConvert(Class source, Class target); + Object convert(Object objet, Class targetType); } diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/CurrencyValueConverter.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/CurrencyValueConverter.groovy index 664e42d7ffb..9be23edce45 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/CurrencyValueConverter.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/CurrencyValueConverter.groovy @@ -18,13 +18,14 @@ */ package org.grails.databinding.converters -import grails.databinding.converters.ValueConverter import groovy.transform.CompileStatic +import grails.databinding.converters.ValueConverter + /** - * + * * A ValueConverter for converting String to Currency. - * + * * @see ValueConverter * @since 2.3.10 * @@ -33,17 +34,17 @@ import groovy.transform.CompileStatic class CurrencyValueConverter implements ValueConverter { @Override - public boolean canConvert(Object value) { + boolean canConvert(Object value) { value instanceof String } @Override - public Object convert(Object value) { + Object convert(Object value) { Currency.getInstance(value as String) } @Override - public Class getTargetType() { + Class getTargetType() { Currency } diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/DateConversionHelper.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/DateConversionHelper.groovy index 32b317eeeb4..b6a7223a454 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/DateConversionHelper.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/DateConversionHelper.groovy @@ -18,12 +18,13 @@ */ package org.grails.databinding.converters -import grails.databinding.converters.ValueConverter; -import groovy.transform.CompileStatic - import java.text.DateFormat import java.text.SimpleDateFormat +import groovy.transform.CompileStatic + +import grails.databinding.converters.ValueConverter + /** * @author Jeff Brown * @since 2.3 @@ -46,7 +47,7 @@ class DateConversionHelper implements ValueConverter { Object convert(value) { Date dateValue if (value instanceof String) { - if(!value) { + if (!value) { return null } Exception firstException @@ -55,13 +56,13 @@ class DateConversionHelper implements ValueConverter { DateFormat formatter = new SimpleDateFormat(format) try { formatter.lenient = dateParsingLenient - dateValue = formatter.parse((String)value) + dateValue = formatter.parse((String) value) } catch (Exception e) { firstException = firstException ?: e } } } - if(dateValue == null && firstException) { + if (dateValue == null && firstException) { throw firstException } } diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/FormattedDateValueConverter.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/FormattedDateValueConverter.groovy index a80f3467911..3bccfc153f4 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/FormattedDateValueConverter.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/FormattedDateValueConverter.groovy @@ -18,10 +18,11 @@ */ package org.grails.databinding.converters -import grails.databinding.converters.FormattedValueConverter; +import java.text.SimpleDateFormat + import groovy.transform.CompileStatic -import java.text.SimpleDateFormat +import grails.databinding.converters.FormattedValueConverter /** * @author Jeff Brown @@ -31,12 +32,12 @@ import java.text.SimpleDateFormat class FormattedDateValueConverter implements FormattedValueConverter { def convert(value, String format) { - if(value instanceof Date) { + if (value instanceof Date) { return value } - else if(value instanceof CharSequence) { + else if (value instanceof CharSequence) { String dateStr = value.toString() - if(!dateStr) { + if (!dateStr) { return null } else { diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/FormattedLocalDateTimeValueConverter.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/FormattedLocalDateTimeValueConverter.groovy index 9793a8d6a09..e6acfe833f7 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/FormattedLocalDateTimeValueConverter.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/FormattedLocalDateTimeValueConverter.groovy @@ -18,10 +18,11 @@ */ package org.grails.databinding.converters -import grails.databinding.converters.FormattedValueConverter; +import java.time.LocalDateTime + import groovy.transform.CompileStatic -import java.time.LocalDateTime +import grails.databinding.converters.FormattedValueConverter /** * @author Emma Richardson @@ -31,12 +32,12 @@ import java.time.LocalDateTime class FormattedLocalDateTimeValueConverter implements FormattedValueConverter { def convert(value, String format) { - if(value instanceof LocalDateTime) { + if (value instanceof LocalDateTime) { return value } - else if(value instanceof CharSequence) { + else if (value instanceof CharSequence) { String dateStr = value.toString() - if(!dateStr) { + if (!dateStr) { return null } else { diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/LocalDateTimeConverter.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/LocalDateTimeConverter.groovy index 3c63c59b372..c6c8d954d77 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/LocalDateTimeConverter.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/LocalDateTimeConverter.groovy @@ -18,10 +18,11 @@ */ package org.grails.databinding.converters -import grails.databinding.converters.ValueConverter +import java.time.LocalDateTime + import groovy.transform.CompileStatic -import java.time.LocalDateTime +import grails.databinding.converters.ValueConverter /** * This class is a {@link ValueConverter} for {@link LocalDateTime} target type. @@ -31,6 +32,7 @@ import java.time.LocalDateTime */ @CompileStatic class LocalDateTimeConverter implements ValueConverter { + @Override boolean canConvert(Object value) { return value instanceof String || value instanceof LocalDateTime diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/StructuredCalendarBindingEditor.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/StructuredCalendarBindingEditor.groovy index 2058bc906e3..03ee4e2b3b7 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/StructuredCalendarBindingEditor.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/StructuredCalendarBindingEditor.groovy @@ -18,8 +18,6 @@ */ package org.grails.databinding.converters -import java.util.Calendar; - /** * @author Jeff Brown * @since 2.3 diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/StructuredSqlDateBindingEditor.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/StructuredSqlDateBindingEditor.groovy index d9a98fd293a..738e4bab0e8 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/StructuredSqlDateBindingEditor.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/StructuredSqlDateBindingEditor.groovy @@ -18,10 +18,10 @@ */ package org.grails.databinding.converters -import groovy.transform.CompileStatic - import java.sql.Date +import groovy.transform.CompileStatic + /** * @author Jeff Brown * @since 2.3 diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/TimeZoneConverter.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/TimeZoneConverter.groovy index 2c9ebf9aa14..36112e86fdc 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/TimeZoneConverter.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/TimeZoneConverter.groovy @@ -18,9 +18,10 @@ */ package org.grails.databinding.converters -import grails.databinding.converters.ValueConverter; import groovy.transform.CompileStatic +import grails.databinding.converters.ValueConverter + /** * @since 2.3.6 * @@ -35,7 +36,7 @@ class TimeZoneConverter implements ValueConverter { @Override def convert(value) { - TimeZone.getTimeZone((String)value) + TimeZone.getTimeZone((String) value) } @Override diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/UUIDConverter.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/UUIDConverter.groovy index 6991d1b677b..a3bc2da4299 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/UUIDConverter.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/converters/UUIDConverter.groovy @@ -18,9 +18,10 @@ */ package org.grails.databinding.converters -import grails.databinding.converters.ValueConverter; import groovy.transform.CompileStatic +import grails.databinding.converters.ValueConverter + @CompileStatic class UUIDConverter implements ValueConverter { @@ -31,10 +32,10 @@ class UUIDConverter implements ValueConverter { @Override def convert(value) { - if(value) { + if (value) { try { return UUID.fromString(value as String) - } catch(IllegalArgumentException ignore) { + } catch (IllegalArgumentException ignore) { return null } } diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/xml/GPathResultCollectionDataBindingSource.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/xml/GPathResultCollectionDataBindingSource.groovy index 7ea03f0b246..b09c38ea13d 100644 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/xml/GPathResultCollectionDataBindingSource.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/xml/GPathResultCollectionDataBindingSource.groovy @@ -18,12 +18,13 @@ */ package org.grails.databinding.xml -import grails.databinding.CollectionDataBindingSource; -import grails.databinding.DataBindingSource; -import grails.databinding.SimpleMapDataBindingSource; import groovy.transform.CompileStatic import groovy.xml.slurpersupport.GPathResult +import grails.databinding.CollectionDataBindingSource +import grails.databinding.DataBindingSource +import grails.databinding.SimpleMapDataBindingSource + @CompileStatic class GPathResultCollectionDataBindingSource implements CollectionDataBindingSource { @@ -31,7 +32,7 @@ class GPathResultCollectionDataBindingSource implements CollectionDataBindingSou GPathResultCollectionDataBindingSource(GPathResult gpath) { dataBindingSources = gpath?.children()?.collect { child -> - def map = new GPathResultMap((GPathResult)child) + def map = new GPathResultMap((GPathResult) child) DataBindingSource bindingSource = new SimpleMapDataBindingSource(map) bindingSource } diff --git a/grails-databinding-core/src/main/groovy/org/grails/databinding/xml/GPathResultMap.groovy b/grails-databinding-core/src/main/groovy/org/grails/databinding/xml/GPathResultMap.groovy index de779e104a3..c66ade9893a 100755 --- a/grails-databinding-core/src/main/groovy/org/grails/databinding/xml/GPathResultMap.groovy +++ b/grails-databinding-core/src/main/groovy/org/grails/databinding/xml/GPathResultMap.groovy @@ -27,6 +27,7 @@ import groovy.xml.slurpersupport.NodeChild * @since 2.3 */ class GPathResultMap implements Map { + protected GPathResult gpath protected id @@ -44,7 +45,7 @@ class GPathResultMap implements Map { } boolean containsKey(key) { - if(key == 'id') { + if (key == 'id') { return this.@id != null || gpath['id'].size() } gpath[key].size() @@ -57,33 +58,33 @@ class GPathResultMap implements Map { uniqueChildNames << getPropertyNameForNode(childNode) } uniqueChildNames.each { name -> - def value = get name + def value = get(name) entries << new AbstractMap.SimpleImmutableEntry(name, value) } - if(this.@id != null) { + if (this.@id != null) { entries << new AbstractMap.SimpleImmutableEntry('id', this.@id) } return entries } Object get(key) { - if('id' == key && this.@id) { + if ('id' == key && this.@id) { return this.@id } def value = gpath.children().findAll { it.name() == key } - if(value.size() == 0) { + if (value.size() == 0) { return null } - if(value.size() > 1) { + if (value.size() > 1) { def list = [] value.iterator().each { def theId = it.@id.text() - if(!''.equals(theId)) { + if (!''.equals(theId)) { def theMap = new GPathResultMap(it) list << theMap } else { - if(it.children().size() > 0) { + if (it.children().size() > 0) { def theMap = new GPathResultMap(it) list << theMap } else { @@ -93,8 +94,8 @@ class GPathResultMap implements Map { } return list } - if(value.children().size() == 0) { - if(value.@id.text()) { + if (value.children().size() == 0) { + if (value.@id.text()) { return [id: value.@id.text()] } return value.text() @@ -104,9 +105,9 @@ class GPathResultMap implements Map { Set keySet() { def keys = gpath.children().collect { - getPropertyNameForNodeChild it + getPropertyNameForNodeChild(it) } as Set - if(this.@id != null) { + if (this.@id != null) { keys << 'id' } keys diff --git a/grails-databinding/src/main/groovy/org/grails/databinding/converters/DefaultConvertersConfiguration.java b/grails-databinding/src/main/groovy/org/grails/databinding/converters/DefaultConvertersConfiguration.java index 9db779b110b..44e6099b7fc 100644 --- a/grails-databinding/src/main/groovy/org/grails/databinding/converters/DefaultConvertersConfiguration.java +++ b/grails-databinding/src/main/groovy/org/grails/databinding/converters/DefaultConvertersConfiguration.java @@ -18,6 +18,14 @@ */ package org.grails.databinding.converters; +import java.math.BigDecimal; +import java.math.BigInteger; + +import org.springframework.beans.factory.NoSuchBeanDefinitionException; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.LocaleResolver; + import grails.core.GrailsApplication; import grails.databinding.TypedStructuredBindingEditor; import grails.databinding.converters.FormattedValueConverter; @@ -25,13 +33,6 @@ import org.grails.databinding.converters.web.LocaleAwareBigDecimalConverter; import org.grails.databinding.converters.web.LocaleAwareNumberConverter; import org.grails.plugins.databinding.DataBindingConfigurationProperties; -import org.springframework.beans.factory.NoSuchBeanDefinitionException; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.LocaleResolver; - -import java.math.BigDecimal; -import java.math.BigInteger; /** * Default converters configuration. diff --git a/grails-databinding/src/main/groovy/org/grails/databinding/converters/Jsr310ConvertersConfiguration.groovy b/grails-databinding/src/main/groovy/org/grails/databinding/converters/Jsr310ConvertersConfiguration.groovy index 9ec59aa59c3..ca8f0cf556b 100644 --- a/grails-databinding/src/main/groovy/org/grails/databinding/converters/Jsr310ConvertersConfiguration.groovy +++ b/grails-databinding/src/main/groovy/org/grails/databinding/converters/Jsr310ConvertersConfiguration.groovy @@ -17,18 +17,27 @@ * under the License. */ -package org.grails.databinding.converters; +package org.grails.databinding.converters + +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.OffsetDateTime +import java.time.OffsetTime +import java.time.Period +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter + +import jakarta.inject.Inject + +import org.springframework.context.annotation.Bean +import org.springframework.context.annotation.Configuration import grails.databinding.TypedStructuredBindingEditor import grails.databinding.converters.FormattedValueConverter import grails.databinding.converters.ValueConverter import org.grails.plugins.databinding.DataBindingConfigurationProperties -import org.springframework.context.annotation.Bean -import org.springframework.context.annotation.Configuration - -import jakarta.inject.Inject -import java.time.* -import java.time.format.DateTimeFormatter @Configuration class Jsr310ConvertersConfiguration { @@ -48,7 +57,7 @@ class Jsr310ConvertersConfiguration { new FormattedValueConverter() { @Override Object convert(Object value, String format) { - OffsetDateTime.parse((CharSequence)value, DateTimeFormatter.ofPattern(format)) + OffsetDateTime.parse((CharSequence) value, DateTimeFormatter.ofPattern(format)) } @Override @@ -64,7 +73,7 @@ class Jsr310ConvertersConfiguration { @Override OffsetDateTime convert(Object value) { convert(value) { String format -> - OffsetDateTime.parse((CharSequence)value, DateTimeFormatter.ofPattern(format)) + OffsetDateTime.parse((CharSequence) value, DateTimeFormatter.ofPattern(format)) } } @@ -111,7 +120,7 @@ class Jsr310ConvertersConfiguration { @Override OffsetTime convert(Object value) { convert(value) { String format -> - OffsetTime.parse((CharSequence)value, DateTimeFormatter.ofPattern(format)) + OffsetTime.parse((CharSequence) value, DateTimeFormatter.ofPattern(format)) } } @@ -158,7 +167,7 @@ class Jsr310ConvertersConfiguration { @Override LocalDateTime convert(Object value) { convert(value) { String format -> - LocalDateTime.parse((CharSequence)value, DateTimeFormatter.ofPattern(format)) + LocalDateTime.parse((CharSequence) value, DateTimeFormatter.ofPattern(format)) } } @@ -205,7 +214,7 @@ class Jsr310ConvertersConfiguration { @Override LocalDate convert(Object value) { convert(value) { String format -> - LocalDate.parse((CharSequence)value, DateTimeFormatter.ofPattern(format)) + LocalDate.parse((CharSequence) value, DateTimeFormatter.ofPattern(format)) } } @@ -221,7 +230,7 @@ class Jsr310ConvertersConfiguration { new CustomDateBindingEditor() { @Override LocalDate getDate(Calendar c) { - LocalDate.of(c.get(Calendar.YEAR), c.get(Calendar.MONTH)+1, c.get(Calendar.DAY_OF_MONTH)) + LocalDate.of(c.get(Calendar.YEAR), c.get(Calendar.MONTH) + 1, c.get(Calendar.DAY_OF_MONTH)) } @Override @@ -252,7 +261,7 @@ class Jsr310ConvertersConfiguration { @Override LocalTime convert(Object value) { convert(value) { String format -> - LocalTime.parse((CharSequence)value, DateTimeFormatter.ofPattern(format)) + LocalTime.parse((CharSequence) value, DateTimeFormatter.ofPattern(format)) } } @@ -283,7 +292,7 @@ class Jsr310ConvertersConfiguration { new FormattedValueConverter() { @Override Object convert(Object value, String format) { - ZonedDateTime.parse((CharSequence)value, DateTimeFormatter.ofPattern(format)) + ZonedDateTime.parse((CharSequence) value, DateTimeFormatter.ofPattern(format)) } @Override @@ -299,7 +308,7 @@ class Jsr310ConvertersConfiguration { @Override ZonedDateTime convert(Object value) { convert(value) { String format -> - ZonedDateTime.parse((CharSequence)value, DateTimeFormatter.ofPattern(format)) + ZonedDateTime.parse((CharSequence) value, DateTimeFormatter.ofPattern(format)) } } @@ -389,20 +398,20 @@ class Jsr310ConvertersConfiguration { T convert(Object value, Closure callable) { T dateValue if (value instanceof String) { - if(!value) { + if (!value) { return null } def firstException formatStrings.each { String format -> if (dateValue == null) { try { - dateValue = (T)callable.call(format) + dateValue = (T) callable.call(format) } catch (Exception e) { firstException = firstException ?: e } } } - if(dateValue == null && firstException) { + if (dateValue == null && firstException) { throw firstException } } @@ -416,4 +425,4 @@ class Jsr310ConvertersConfiguration { abstract class CustomDateBindingEditor extends AbstractStructuredDateBindingEditor implements TypedStructuredBindingEditor { } -} \ No newline at end of file +} diff --git a/grails-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareBigDecimalConverter.groovy b/grails-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareBigDecimalConverter.groovy index 661cfa7efe6..82e2963e780 100644 --- a/grails-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareBigDecimalConverter.groovy +++ b/grails-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareBigDecimalConverter.groovy @@ -18,11 +18,11 @@ */ package org.grails.databinding.converters.web -import groovy.transform.CompileStatic - import java.text.DecimalFormat import java.text.NumberFormat +import groovy.transform.CompileStatic + /** * A ValueConverter that knows how to convert a String to a BigDecimal or a BigInteger and is Locale aware. The * converter will use the Locale of the current request if being invoked as part of a @@ -38,10 +38,10 @@ class LocaleAwareBigDecimalConverter extends LocaleAwareNumberConverter { protected NumberFormat getNumberFormatter() { def nf = super.getNumberFormatter() if (!(nf instanceof DecimalFormat)) { - throw new IllegalStateException("Cannot support non-DecimalFormat: " + nf) + throw new IllegalStateException('Cannot support non-DecimalFormat: ' + nf) } - ((DecimalFormat)nf).setParseBigDecimal(true) + ((DecimalFormat) nf).setParseBigDecimal(true) nf } } diff --git a/grails-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareNumberConverter.groovy b/grails-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareNumberConverter.groovy index efbab1ad7fd..407c946cb8c 100644 --- a/grails-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareNumberConverter.groovy +++ b/grails-databinding/src/main/groovy/org/grails/databinding/converters/web/LocaleAwareNumberConverter.groovy @@ -18,24 +18,24 @@ */ package org.grails.databinding.converters.web -import grails.databinding.converters.ValueConverter; -import groovy.transform.CompileStatic - import java.text.NumberFormat import java.text.ParsePosition +import groovy.transform.CompileStatic + import jakarta.servlet.http.HttpServletRequest -import org.grails.web.servlet.mvc.GrailsWebRequest import org.springframework.beans.factory.annotation.Autowired import org.springframework.web.servlet.LocaleResolver +import grails.databinding.converters.ValueConverter +import org.grails.web.servlet.mvc.GrailsWebRequest /** * A ValueConverter that knows how to convert a String to any numeric type and is Locale aware. The * converter will use the Locale of the current request if being invoked as part of a * request, otherwise will use Locale.getDefault() - * + * * @author Jeff Brown * @since 2.3 * @@ -44,21 +44,21 @@ import org.springframework.web.servlet.LocaleResolver class LocaleAwareNumberConverter implements ValueConverter { Class targetType - + @Autowired(required=false) LocaleResolver localeResolver @Override - public boolean canConvert(Object value) { + boolean canConvert(Object value) { value instanceof String } @Override - public Object convert(Object value) { + Object convert(Object value) { def trimmedValue = value.toString().trim() def parsePosition = new ParsePosition(0) - def result = numberFormatter.parse((String)value, parsePosition).asType(getTargetType()) - if(parsePosition.index != trimmedValue.size()) { + def result = numberFormatter.parse((String) value, parsePosition).asType(getTargetType()) + if (parsePosition.index != trimmedValue.size()) { throw new NumberFormatException("Unable to parse number [${value}]") } result @@ -71,10 +71,10 @@ class LocaleAwareNumberConverter implements ValueConverter { protected Locale getLocale() { def locale def request = GrailsWebRequest.lookup()?.currentRequest - if(request instanceof HttpServletRequest) { + if (request instanceof HttpServletRequest) { locale = localeResolver?.resolveLocale(request) } - if(locale == null) { + if (locale == null) { locale = Locale.default } return locale diff --git a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy index f31a70a1dd2..30caf8383ab 100644 --- a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy +++ b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/AbstractDataBindingGrailsPlugin.groovy @@ -23,8 +23,13 @@ import grails.plugins.Plugin import grails.util.GrailsUtil import grails.web.databinding.DataBindingUtils import grails.web.databinding.GrailsWebDataBinder +import org.grails.databinding.converters.CurrencyValueConverter +import org.grails.databinding.converters.DateConversionHelper import org.grails.databinding.converters.Jsr310ConvertersConfiguration +import org.grails.databinding.converters.TimeZoneConverter import org.grails.databinding.converters.UUIDConverter +import org.grails.databinding.converters.web.LocaleAwareBigDecimalConverter +import org.grails.databinding.converters.web.LocaleAwareNumberConverter import org.grails.web.databinding.bindingsource.DataBindingSourceRegistry import org.grails.web.databinding.bindingsource.DefaultDataBindingSourceRegistry import org.grails.web.databinding.bindingsource.HalJsonDataBindingSourceCreator @@ -32,11 +37,6 @@ import org.grails.web.databinding.bindingsource.HalXmlDataBindingSourceCreator import org.grails.web.databinding.bindingsource.JsonApiDataBindingSourceCreator import org.grails.web.databinding.bindingsource.JsonDataBindingSourceCreator import org.grails.web.databinding.bindingsource.XmlDataBindingSourceCreator -import org.grails.databinding.converters.CurrencyValueConverter -import org.grails.databinding.converters.DateConversionHelper -import org.grails.databinding.converters.TimeZoneConverter -import org.grails.databinding.converters.web.LocaleAwareBigDecimalConverter -import org.grails.databinding.converters.web.LocaleAwareNumberConverter /** * Plugin for configuring the data binding features of Grails @@ -49,72 +49,73 @@ import org.grails.databinding.converters.web.LocaleAwareNumberConverter abstract class AbstractDataBindingGrailsPlugin extends Plugin { public static final String DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ssZ" - public static final String DEFAULT_JSR310_OFFSET_TIME_FORMAT = "HH:mm:ssZ" + public static final String DEFAULT_JSR310_OFFSET_TIME_FORMAT = 'HH:mm:ssZ' public static final String DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT = "yyyy-MM-dd'T'HH:mm:ss" - public static final String DEFAULT_JSR310_LOCAL_DATE_FORMAT = "yyyy-MM-dd" - public static final String DEFAULT_JSR310_LOCAL_TIME_FORMAT = "HH:mm:ss" - public static final List DEFAULT_DATE_FORMATS = ['yyyy-MM-dd HH:mm:ss.S',"yyyy-MM-dd'T'HH:mm:ss'Z'","yyyy-MM-dd HH:mm:ss.S z","yyyy-MM-dd'T'HH:mm:ss.SSSX", DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT, DEFAULT_JSR310_OFFSET_TIME_FORMAT, DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT, DEFAULT_JSR310_LOCAL_DATE_FORMAT, DEFAULT_JSR310_LOCAL_TIME_FORMAT] + public static final String DEFAULT_JSR310_LOCAL_DATE_FORMAT = 'yyyy-MM-dd' + public static final String DEFAULT_JSR310_LOCAL_TIME_FORMAT = 'HH:mm:ss' + public static final List DEFAULT_DATE_FORMATS = ['yyyy-MM-dd HH:mm:ss.S', "yyyy-MM-dd'T'HH:mm:ss'Z'", 'yyyy-MM-dd HH:mm:ss.S z', "yyyy-MM-dd'T'HH:mm:ss.SSSX", DEFAULT_JSR310_OFFSET_ZONED_DATE_TIME_FORMAT, DEFAULT_JSR310_OFFSET_TIME_FORMAT, DEFAULT_JSR310_LOCAL_DATE_TIME_FORMAT, DEFAULT_JSR310_LOCAL_DATE_FORMAT, DEFAULT_JSR310_LOCAL_TIME_FORMAT] def version = GrailsUtil.getGrailsVersion() @Override - Closure doWithSpring() {{-> - def application = grailsApplication - def config = application.config - boolean trimStringsSetting = config.getProperty(Settings.TRIM_STRINGS, Boolean, true) - boolean convertEmptyStringsToNullSetting = config.getProperty(Settings.CONVERT_EMPTY_STRINGS_TO_NULL, Boolean, true) - boolean dateParsingLenientSetting = config.getProperty(Settings.DATE_LENIENT_PARSING, Boolean, false) - Integer autoGrowCollectionLimitSetting = config.getProperty(Settings.AUTO_GROW_COLLECTION_LIMIT, Integer, 256) - List dateFormats = config.getProperty(Settings.DATE_FORMATS, List, DEFAULT_DATE_FORMATS) - + Closure doWithSpring() { + { -> + def application = grailsApplication + def config = application.config + boolean trimStringsSetting = config.getProperty(Settings.TRIM_STRINGS, Boolean, true) + boolean convertEmptyStringsToNullSetting = config.getProperty(Settings.CONVERT_EMPTY_STRINGS_TO_NULL, Boolean, true) + boolean dateParsingLenientSetting = config.getProperty(Settings.DATE_LENIENT_PARSING, Boolean, false) + Integer autoGrowCollectionLimitSetting = config.getProperty(Settings.AUTO_GROW_COLLECTION_LIMIT, Integer, 256) + List dateFormats = config.getProperty(Settings.DATE_FORMATS, List, DEFAULT_DATE_FORMATS) - "${DataBindingUtils.DATA_BINDER_BEAN_NAME}"(GrailsWebDataBinder, grailsApplication) { - // trimStrings defaults to TRUE - trimStrings = trimStringsSetting - // convertEmptyStringsToNull defaults to TRUE - convertEmptyStringsToNull = convertEmptyStringsToNullSetting - // autoGrowCollectionLimit defaults to 256 - autoGrowCollectionLimit = autoGrowCollectionLimitSetting - } + "${DataBindingUtils.DATA_BINDER_BEAN_NAME}"(GrailsWebDataBinder, grailsApplication) { + // trimStrings defaults to TRUE + trimStrings = trimStringsSetting + // convertEmptyStringsToNull defaults to TRUE + convertEmptyStringsToNull = convertEmptyStringsToNullSetting + // autoGrowCollectionLimit defaults to 256 + autoGrowCollectionLimit = autoGrowCollectionLimitSetting + } - dataBindingConfigurationProperties(DataBindingConfigurationProperties) - timeZoneConverter(TimeZoneConverter) - uuidConverter(UUIDConverter) + dataBindingConfigurationProperties(DataBindingConfigurationProperties) + timeZoneConverter(TimeZoneConverter) + uuidConverter(UUIDConverter) - defaultDateConverter(DateConversionHelper) { - formatStrings = dateFormats - // dateParsingLenient defaults to false - dateParsingLenient = dateParsingLenientSetting - } - [Short, Short.TYPE, - Integer, Integer.TYPE, - Float, Float.TYPE, - Long, Long.TYPE, - Double, Double.TYPE].each { numberType -> - "defaultGrails${numberType.simpleName}Converter"(LocaleAwareNumberConverter) { - targetType = numberType + defaultDateConverter(DateConversionHelper) { + formatStrings = dateFormats + // dateParsingLenient defaults to false + dateParsingLenient = dateParsingLenientSetting + } + [Short, Short.TYPE, + Integer, Integer.TYPE, + Float, Float.TYPE, + Long, Long.TYPE, + Double, Double.TYPE].each { numberType -> + "defaultGrails${numberType.simpleName}Converter"(LocaleAwareNumberConverter) { + targetType = numberType + } + } + defaultGrailsBigDecimalConverter(LocaleAwareBigDecimalConverter) { + targetType = BigDecimal + } + defaultGrailsBigIntegerConverter(LocaleAwareBigDecimalConverter) { + targetType = BigInteger } - } - defaultGrailsBigDecimalConverter(LocaleAwareBigDecimalConverter) { - targetType = BigDecimal - } - defaultGrailsBigIntegerConverter(LocaleAwareBigDecimalConverter) { - targetType = BigInteger - } - jsr310DataBinding(Jsr310ConvertersConfiguration) { - formatStrings = dateFormats - } + jsr310DataBinding(Jsr310ConvertersConfiguration) { + formatStrings = dateFormats + } - "${DataBindingSourceRegistry.BEAN_NAME}"(DefaultDataBindingSourceRegistry) + "${DataBindingSourceRegistry.BEAN_NAME}"(DefaultDataBindingSourceRegistry) - xmlDataBindingSourceCreator(XmlDataBindingSourceCreator) - jsonDataBindingSourceCreator(JsonDataBindingSourceCreator) - halJsonDataBindingSourceCreator(HalJsonDataBindingSourceCreator) - halXmlDataBindingSourceCreator(HalXmlDataBindingSourceCreator) - jsonApiDataBindingSourceCreator(JsonApiDataBindingSourceCreator) + xmlDataBindingSourceCreator(XmlDataBindingSourceCreator) + jsonDataBindingSourceCreator(JsonDataBindingSourceCreator) + halJsonDataBindingSourceCreator(HalJsonDataBindingSourceCreator) + halXmlDataBindingSourceCreator(HalXmlDataBindingSourceCreator) + jsonApiDataBindingSourceCreator(JsonApiDataBindingSourceCreator) - defaultCurrencyConverter CurrencyValueConverter - }} + defaultCurrencyConverter(CurrencyValueConverter) + } + } } diff --git a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfiguration.java b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfiguration.java index ad5cf12154f..8bc31ca4c9a 100644 --- a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfiguration.java +++ b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfiguration.java @@ -19,16 +19,6 @@ package org.grails.plugins.databinding; -import grails.core.GrailsApplication; -import grails.databinding.TypedStructuredBindingEditor; -import grails.databinding.converters.FormattedValueConverter; -import grails.databinding.converters.ValueConverter; -import grails.databinding.events.DataBindingListener; -import grails.util.GrailsArrayUtils; -import grails.web.databinding.GrailsWebDataBinder; -import org.grails.databinding.bindingsource.DataBindingSourceCreator; -import org.grails.databinding.converters.DefaultConvertersConfiguration; -import org.grails.web.databinding.bindingsource.*; import org.springframework.boot.autoconfigure.AutoConfiguration; import org.springframework.boot.autoconfigure.AutoConfigureOrder; import org.springframework.boot.autoconfigure.ImportAutoConfiguration; @@ -39,6 +29,23 @@ import org.springframework.context.annotation.Lazy; import org.springframework.core.annotation.AnnotationAwareOrderComparator; +import grails.core.GrailsApplication; +import grails.databinding.TypedStructuredBindingEditor; +import grails.databinding.converters.FormattedValueConverter; +import grails.databinding.converters.ValueConverter; +import grails.databinding.events.DataBindingListener; +import grails.util.GrailsArrayUtils; +import grails.web.databinding.GrailsWebDataBinder; +import org.grails.databinding.bindingsource.DataBindingSourceCreator; +import org.grails.databinding.converters.DefaultConvertersConfiguration; +import org.grails.web.databinding.bindingsource.DataBindingSourceRegistry; +import org.grails.web.databinding.bindingsource.DefaultDataBindingSourceRegistry; +import org.grails.web.databinding.bindingsource.HalJsonDataBindingSourceCreator; +import org.grails.web.databinding.bindingsource.HalXmlDataBindingSourceCreator; +import org.grails.web.databinding.bindingsource.JsonApiDataBindingSourceCreator; +import org.grails.web.databinding.bindingsource.JsonDataBindingSourceCreator; +import org.grails.web.databinding.bindingsource.XmlDataBindingSourceCreator; + @AutoConfiguration @AutoConfigureOrder @EnableConfigurationProperties(DataBindingConfigurationProperties.class) @@ -84,7 +91,7 @@ protected GrailsWebDataBinder grailsWebDataBinder( dataBinder.setStructuredBindingEditors(GrailsArrayUtils.concat(structuredBindingEditors, mainContextStructuredBindingEditors)); final DataBindingListener[] mainContextDataBindingListeners = mainContext .getBeansOfType(DataBindingListener.class).values().toArray(new DataBindingListener[0]); - dataBinder.setDataBindingListeners(GrailsArrayUtils.concat(dataBindingListeners,mainContextDataBindingListeners)); + dataBinder.setDataBindingListeners(GrailsArrayUtils.concat(dataBindingListeners, mainContextDataBindingListeners)); dataBinder.setMessageSource(mainContext.getBean("messageSource", MessageSource.class)); return dataBinder; } diff --git a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfigurationProperties.java b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfigurationProperties.java index 76013269061..f152c0b211e 100644 --- a/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfigurationProperties.java +++ b/grails-databinding/src/main/groovy/org/grails/plugins/databinding/DataBindingConfigurationProperties.java @@ -18,10 +18,10 @@ */ package org.grails.plugins.databinding; -import org.springframework.boot.context.properties.ConfigurationProperties; - import java.util.List; +import org.springframework.boot.context.properties.ConfigurationProperties; + /** * Data binding configuration. * diff --git a/grails-datamapping-async/src/main/groovy/grails/gorm/async/AsyncEntity.groovy b/grails-datamapping-async/src/main/groovy/grails/gorm/async/AsyncEntity.groovy index 0d8fcfcca3b..508582e6d4a 100644 --- a/grails-datamapping-async/src/main/groovy/grails/gorm/async/AsyncEntity.groovy +++ b/grails-datamapping-async/src/main/groovy/grails/gorm/async/AsyncEntity.groovy @@ -20,6 +20,7 @@ package grails.gorm.async import groovy.transform.CompileStatic + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.GormEntity import org.grails.datastore.gorm.async.GormAsyncStaticApi @@ -32,10 +33,11 @@ import org.grails.datastore.gorm.async.GormAsyncStaticApi */ @CompileStatic trait AsyncEntity extends GormEntity { + /** * @return The async version of the GORM static API */ static GormAsyncStaticApi getAsync() { return new GormAsyncStaticApi(GormEnhancer.findStaticApi(this)) } -} \ No newline at end of file +} diff --git a/grails-datamapping-async/src/main/groovy/org/grails/datastore/gorm/async/AsyncQuery.groovy b/grails-datamapping-async/src/main/groovy/org/grails/datastore/gorm/async/AsyncQuery.groovy index 6486a6fe9fa..84ddbb2bb24 100644 --- a/grails-datamapping-async/src/main/groovy/org/grails/datastore/gorm/async/AsyncQuery.groovy +++ b/grails-datamapping-async/src/main/groovy/org/grails/datastore/gorm/async/AsyncQuery.groovy @@ -40,7 +40,6 @@ class AsyncQuery implements PromiseDecoratorProvider { } } as PromiseDecorator ] - AsyncQuery(GormOperations gormOperations) { this.gormOperations = gormOperations } diff --git a/grails-datamapping-async/src/main/groovy/org/grails/datastore/gorm/async/GormAsyncStaticApi.groovy b/grails-datamapping-async/src/main/groovy/org/grails/datastore/gorm/async/GormAsyncStaticApi.groovy index 627c2e81551..7687d42faf5 100644 --- a/grails-datamapping-async/src/main/groovy/org/grails/datastore/gorm/async/GormAsyncStaticApi.groovy +++ b/grails-datamapping-async/src/main/groovy/org/grails/datastore/gorm/async/GormAsyncStaticApi.groovy @@ -14,12 +14,13 @@ */ package org.grails.datastore.gorm.async +import groovy.transform.CompileStatic + import grails.async.Promise import grails.async.Promises import grails.async.decorator.PromiseDecorator import grails.async.decorator.PromiseDecoratorProvider import grails.gorm.api.GormStaticOperations -import groovy.transform.CompileStatic import org.grails.datastore.gorm.GormStaticApi import org.grails.datastore.gorm.async.transform.DelegateAsync @@ -29,7 +30,7 @@ import org.grails.datastore.gorm.async.transform.DelegateAsync * @author Graeme Rocher * @since 2.3 */ -class GormAsyncStaticApi implements PromiseDecoratorProvider{ +class GormAsyncStaticApi implements PromiseDecoratorProvider { @DelegateAsync GormStaticOperations staticApi @@ -37,7 +38,7 @@ class GormAsyncStaticApi implements PromiseDecoratorProvider{ * Wraps each promise in a new persistence session */ private List decorators = [ { Closure callable -> - return { args -> staticApi.withNewSession{ callable.call(*args) } } + return { args -> staticApi.withNewSession { callable.call(*args) } } } as PromiseDecorator ] GormAsyncStaticApi(GormStaticApi staticApi) { @@ -56,8 +57,8 @@ class GormAsyncStaticApi implements PromiseDecoratorProvider{ * @return The promise */ @CompileStatic - public Promise task(Closure callable) { + Promise task(Closure callable) { callable.delegate = staticApi.gormPersistentEntity.javaClass - (Promise)Promises.createPromise(callable, decorators) + (Promise) Promises.createPromise(callable, decorators) } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/CriteriaBuilder.java b/grails-datamapping-core/src/main/groovy/grails/gorm/CriteriaBuilder.java index 480978c83e8..f5458518a72 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/CriteriaBuilder.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/CriteriaBuilder.java @@ -19,8 +19,15 @@ package grails.gorm; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + import groovy.lang.Closure; import groovy.lang.DelegatesTo; + +import jakarta.persistence.criteria.JoinType; + import org.grails.datastore.gorm.query.criteria.AbstractCriteriaBuilder; import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.model.MappingContext; @@ -30,11 +37,6 @@ import org.grails.datastore.mapping.query.api.Criteria; import org.grails.datastore.mapping.query.api.ProjectionList; -import jakarta.persistence.criteria.JoinType; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; - import static org.grails.datastore.gorm.finders.DynamicFinder.populateArgumentsForCriteria; /** @@ -166,11 +168,9 @@ public Number count(Closure callable) { query.projections().count(); return (Number) query.singleResult(); } - + @Override public Object scroll(@DelegatesTo(Criteria.class) Closure c) { return invokeMethod(SCROLL_CALL, new Object[]{c}); } - - } diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/DetachedCriteria.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/DetachedCriteria.groovy index 9c2a621b218..85a2f2e8120 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/DetachedCriteria.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/DetachedCriteria.groovy @@ -20,7 +20,9 @@ package grails.gorm import groovy.transform.CompileStatic -import groovy.transform.TypeCheckingMode + +import jakarta.persistence.criteria.JoinType + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.GormStaticApi import org.grails.datastore.gorm.finders.DynamicFinder @@ -28,14 +30,11 @@ import org.grails.datastore.gorm.query.GormOperations import org.grails.datastore.gorm.query.criteria.AbstractDetachedCriteria import org.grails.datastore.mapping.core.Session import org.grails.datastore.mapping.query.Query -import org.grails.datastore.mapping.query.api.Criteria import org.grails.datastore.mapping.query.api.ProjectionList import org.grails.datastore.mapping.query.api.QueryAliasAwareSession import org.grails.datastore.mapping.query.api.QueryArgumentsAware import org.grails.datastore.mapping.query.api.QueryableCriteria -import jakarta.persistence.criteria.JoinType - /** * Represents criteria that is not bound to the current connection and can be built up and re-used at a later date. * @@ -54,7 +53,6 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe super(targetClass, alias) } - /** * Where method derives a new query from this query. This method will not mutate the original query, but instead return a new one. * @@ -69,7 +67,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe @Override DetachedCriteria withConnection(String name) { - return (DetachedCriteria)super.withConnection(name) + return (DetachedCriteria) super.withConnection(name) } /** * Where method derives a new query from this query. This method will not mutate the original query, but instead return a new one. @@ -116,7 +114,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return A single entity */ T get(Map args = Collections.emptyMap(), @DelegatesTo(DetachedCriteria) Closure additionalCriteria = null) { - (T)withPopulatedQuery(args, additionalCriteria) { Query query -> + (T) withPopulatedQuery(args, additionalCriteria) { Query query -> query.singleResult() } } @@ -136,7 +134,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return A list of matching instances */ List list(Map args = Collections.emptyMap(), @DelegatesTo(DetachedCriteria) Closure additionalCriteria = null) { - (List)withPopulatedQuery(args, additionalCriteria) { Query query -> + (List) withPopulatedQuery(args, additionalCriteria) { Query query -> if (args?.max) { return new PagedResultList(query) } @@ -160,352 +158,352 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe @Override DetachedCriteria join(String property) { - return (DetachedCriteria)super.join(property) + return (DetachedCriteria) super.join(property) } @Override DetachedCriteria join(String property, JoinType joinType) { - return (DetachedCriteria)super.join(property, joinType) + return (DetachedCriteria) super.join(property, joinType) } @Override DetachedCriteria select(String property) { - return (DetachedCriteria)super.select(property) + return (DetachedCriteria) super.select(property) } @Override DetachedCriteria and(@DelegatesTo(AbstractDetachedCriteria) Closure callable) { - return (DetachedCriteria)super.and(callable) + return (DetachedCriteria) super.and(callable) } @Override DetachedCriteria or(@DelegatesTo(AbstractDetachedCriteria) Closure callable) { - return (DetachedCriteria)super.or(callable) + return (DetachedCriteria) super.or(callable) } @Override DetachedCriteria not(@DelegatesTo(AbstractDetachedCriteria) Closure callable) { - return (DetachedCriteria)super.not(callable) + return (DetachedCriteria) super.not(callable) } @Override DetachedCriteria "in"(String propertyName, Collection values) { - return (DetachedCriteria)super.in(propertyName, values) + return (DetachedCriteria) super.in(propertyName, values) } @Override DetachedCriteria "in"(String propertyName, QueryableCriteria subquery) { - return (DetachedCriteria)super.in(propertyName, subquery) + return (DetachedCriteria) super.in(propertyName, subquery) } @Override DetachedCriteria inList(String propertyName, QueryableCriteria subquery) { - return (DetachedCriteria)super.inList(propertyName, subquery) + return (DetachedCriteria) super.inList(propertyName, subquery) } @Override DetachedCriteria "in"(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure subquery) { - return (DetachedCriteria)super.in(propertyName, subquery) + return (DetachedCriteria) super.in(propertyName, subquery) } @Override DetachedCriteria inList(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure subquery) { - return (DetachedCriteria)super.inList(propertyName, subquery) + return (DetachedCriteria) super.inList(propertyName, subquery) } @Override DetachedCriteria "in"(String propertyName, Object[] values) { - return (DetachedCriteria)super.in(propertyName, values) + return (DetachedCriteria) super.in(propertyName, values) } @Override DetachedCriteria notIn(String propertyName, QueryableCriteria subquery) { - return (DetachedCriteria)super.notIn(propertyName, subquery) + return (DetachedCriteria) super.notIn(propertyName, subquery) } @Override DetachedCriteria notIn(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure subquery) { - return (DetachedCriteria)super.notIn(propertyName, subquery) + return (DetachedCriteria) super.notIn(propertyName, subquery) } @Override DetachedCriteria order(String propertyName) { - return (DetachedCriteria)super.order(propertyName) + return (DetachedCriteria) super.order(propertyName) } @Override DetachedCriteria order(Query.Order o) { - return (DetachedCriteria)super.order(o) + return (DetachedCriteria) super.order(o) } @Override DetachedCriteria order(String propertyName, String direction) { - return (DetachedCriteria)super.order(propertyName, direction) + return (DetachedCriteria) super.order(propertyName, direction) } @Override DetachedCriteria inList(String propertyName, Collection values) { - return (DetachedCriteria)super.inList(propertyName, values) + return (DetachedCriteria) super.inList(propertyName, values) } @Override DetachedCriteria inList(String propertyName, Object[] values) { - return (DetachedCriteria)super.inList(propertyName, values) + return (DetachedCriteria) super.inList(propertyName, values) } @Override DetachedCriteria sizeEq(String propertyName, int size) { - return (DetachedCriteria)super.sizeEq(propertyName, size) + return (DetachedCriteria) super.sizeEq(propertyName, size) } @Override DetachedCriteria sizeGt(String propertyName, int size) { - return (DetachedCriteria)super.sizeGt(propertyName, size) + return (DetachedCriteria) super.sizeGt(propertyName, size) } @Override DetachedCriteria sizeGe(String propertyName, int size) { - return (DetachedCriteria)super.sizeGe(propertyName, size) + return (DetachedCriteria) super.sizeGe(propertyName, size) } @Override DetachedCriteria sizeLe(String propertyName, int size) { - return (DetachedCriteria)super.sizeLe(propertyName, size) + return (DetachedCriteria) super.sizeLe(propertyName, size) } @Override DetachedCriteria sizeLt(String propertyName, int size) { - return (DetachedCriteria)super.sizeLt(propertyName, size) + return (DetachedCriteria) super.sizeLt(propertyName, size) } @Override DetachedCriteria sizeNe(String propertyName, int size) { - return (DetachedCriteria)super.sizeNe(propertyName, size) + return (DetachedCriteria) super.sizeNe(propertyName, size) } @Override DetachedCriteria eqProperty(String propertyName, String otherPropertyName) { - return (DetachedCriteria)super.eqProperty(propertyName, otherPropertyName) + return (DetachedCriteria) super.eqProperty(propertyName, otherPropertyName) } @Override DetachedCriteria neProperty(String propertyName, String otherPropertyName) { - return (DetachedCriteria)super.neProperty(propertyName, otherPropertyName) + return (DetachedCriteria) super.neProperty(propertyName, otherPropertyName) } @Override DetachedCriteria allEq(Map propertyValues) { - return (DetachedCriteria)super.allEq(propertyValues) + return (DetachedCriteria) super.allEq(propertyValues) } @Override DetachedCriteria gtProperty(String propertyName, String otherPropertyName) { - return (DetachedCriteria)super.gtProperty(propertyName, otherPropertyName) + return (DetachedCriteria) super.gtProperty(propertyName, otherPropertyName) } @Override DetachedCriteria geProperty(String propertyName, String otherPropertyName) { - return (DetachedCriteria)super.geProperty(propertyName, otherPropertyName) + return (DetachedCriteria) super.geProperty(propertyName, otherPropertyName) } @Override DetachedCriteria ltProperty(String propertyName, String otherPropertyName) { - return (DetachedCriteria)super.ltProperty(propertyName, otherPropertyName) + return (DetachedCriteria) super.ltProperty(propertyName, otherPropertyName) } @Override DetachedCriteria leProperty(String propertyName, String otherPropertyName) { - return (DetachedCriteria)super.leProperty(propertyName, otherPropertyName) + return (DetachedCriteria) super.leProperty(propertyName, otherPropertyName) } @Override DetachedCriteria idEquals(Object value) { - return (DetachedCriteria)super.idEquals(value) + return (DetachedCriteria) super.idEquals(value) } @Override DetachedCriteria exists(QueryableCriteria subquery) { - return (DetachedCriteria)super.exists(subquery) + return (DetachedCriteria) super.exists(subquery) } @Override DetachedCriteria notExists(QueryableCriteria subquery) { - return (DetachedCriteria)super.notExists(subquery) + return (DetachedCriteria) super.notExists(subquery) } @Override DetachedCriteria isEmpty(String propertyName) { - return (DetachedCriteria)super.isEmpty(propertyName) + return (DetachedCriteria) super.isEmpty(propertyName) } @Override DetachedCriteria isNotEmpty(String propertyName) { - return (DetachedCriteria)super.isNotEmpty(propertyName) + return (DetachedCriteria) super.isNotEmpty(propertyName) } @Override DetachedCriteria isNull(String propertyName) { - return (DetachedCriteria)super.isNull(propertyName) + return (DetachedCriteria) super.isNull(propertyName) } @Override DetachedCriteria isNotNull(String propertyName) { - return (DetachedCriteria)super.isNotNull(propertyName) + return (DetachedCriteria) super.isNotNull(propertyName) } @Override DetachedCriteria eq(String propertyName, Object propertyValue) { - return (DetachedCriteria)super.eq(propertyName, propertyValue) + return (DetachedCriteria) super.eq(propertyName, propertyValue) } @Override DetachedCriteria idEq(Object propertyValue) { - return (DetachedCriteria)super.idEq(propertyValue) + return (DetachedCriteria) super.idEq(propertyValue) } @Override DetachedCriteria ne(String propertyName, Object propertyValue) { - return (DetachedCriteria)super.ne(propertyName, propertyValue) + return (DetachedCriteria) super.ne(propertyName, propertyValue) } @Override DetachedCriteria between(String propertyName, Object start, Object finish) { - return (DetachedCriteria)super.between(propertyName, start, finish) + return (DetachedCriteria) super.between(propertyName, start, finish) } @Override DetachedCriteria gte(String property, Object value) { - return (DetachedCriteria)super.gte(property, value) + return (DetachedCriteria) super.gte(property, value) } @Override DetachedCriteria ge(String property, Object value) { - return (DetachedCriteria)super.ge(property, value) + return (DetachedCriteria) super.ge(property, value) } @Override DetachedCriteria gt(String property, Object value) { - return (DetachedCriteria)super.gt(property, value) + return (DetachedCriteria) super.gt(property, value) } @Override DetachedCriteria lte(String property, Object value) { - return (DetachedCriteria)super.lte(property, value) + return (DetachedCriteria) super.lte(property, value) } @Override DetachedCriteria le(String property, Object value) { - return (DetachedCriteria)super.le(property, value) + return (DetachedCriteria) super.le(property, value) } @Override DetachedCriteria lt(String property, Object value) { - return (DetachedCriteria)super.lt(property, value) + return (DetachedCriteria) super.lt(property, value) } @Override DetachedCriteria like(String propertyName, Object propertyValue) { - return (DetachedCriteria)super.like(propertyName, propertyValue) + return (DetachedCriteria) super.like(propertyName, propertyValue) } @Override DetachedCriteria ilike(String propertyName, Object propertyValue) { - return (DetachedCriteria)super.ilike(propertyName, propertyValue) + return (DetachedCriteria) super.ilike(propertyName, propertyValue) } @Override DetachedCriteria rlike(String propertyName, Object propertyValue) { - return (DetachedCriteria)super.rlike(propertyName, propertyValue) + return (DetachedCriteria) super.rlike(propertyName, propertyValue) } @Override DetachedCriteria eqAll(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.eqAll(propertyName, propertyValue) + return (DetachedCriteria) super.eqAll(propertyName, propertyValue) } @Override DetachedCriteria gtAll(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.gtAll(propertyName, propertyValue) + return (DetachedCriteria) super.gtAll(propertyName, propertyValue) } @Override DetachedCriteria ltAll(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.ltAll(propertyName, propertyValue) + return (DetachedCriteria) super.ltAll(propertyName, propertyValue) } @Override DetachedCriteria geAll(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.geAll(propertyName, propertyValue) + return (DetachedCriteria) super.geAll(propertyName, propertyValue) } @Override DetachedCriteria leAll(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.leAll(propertyName, propertyValue) + return (DetachedCriteria) super.leAll(propertyName, propertyValue) } @Override DetachedCriteria eqAll(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.eqAll(propertyName, propertyValue) + return (DetachedCriteria) super.eqAll(propertyName, propertyValue) } @Override DetachedCriteria gtAll(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.gtAll(propertyName, propertyValue) + return (DetachedCriteria) super.gtAll(propertyName, propertyValue) } @Override DetachedCriteria gtSome(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.gtSome(propertyName, propertyValue) + return (DetachedCriteria) super.gtSome(propertyName, propertyValue) } @Override DetachedCriteria gtSome(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.gtSome(propertyName, propertyValue) + return (DetachedCriteria) super.gtSome(propertyName, propertyValue) } @Override DetachedCriteria geSome(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.geSome(propertyName, propertyValue) + return (DetachedCriteria) super.geSome(propertyName, propertyValue) } @Override DetachedCriteria geSome(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.geSome(propertyName, propertyValue) + return (DetachedCriteria) super.geSome(propertyName, propertyValue) } @Override DetachedCriteria ltSome(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.ltSome(propertyName, propertyValue) + return (DetachedCriteria) super.ltSome(propertyName, propertyValue) } @Override DetachedCriteria ltSome(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.ltSome(propertyName, propertyValue) + return (DetachedCriteria) super.ltSome(propertyName, propertyValue) } @Override DetachedCriteria leSome(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.leSome(propertyName, propertyValue) + return (DetachedCriteria) super.leSome(propertyName, propertyValue) } @Override DetachedCriteria leSome(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - return (DetachedCriteria)super.leSome(propertyName, propertyValue) + return (DetachedCriteria) super.leSome(propertyName, propertyValue) } @Override DetachedCriteria ltAll(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.ltAll(propertyName, propertyValue) + return (DetachedCriteria) super.ltAll(propertyName, propertyValue) } @Override DetachedCriteria geAll(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.geAll(propertyName, propertyValue) + return (DetachedCriteria) super.geAll(propertyName, propertyValue) } @Override DetachedCriteria leAll(String propertyName, QueryableCriteria propertyValue) { - return (DetachedCriteria)super.leAll(propertyName, propertyValue) + return (DetachedCriteria) super.leAll(propertyName, propertyValue) } /** * Counts the number of records returned by the query @@ -514,7 +512,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return The count */ Number count(Map args = Collections.emptyMap(), @DelegatesTo(DetachedCriteria) Closure additionalCriteria = null) { - (Number)withPopulatedQuery(args, additionalCriteria) { Query query -> + (Number) withPopulatedQuery(args, additionalCriteria) { Query query -> query.projections().count() query.singleResult() } @@ -527,7 +525,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return The count */ Number count(@DelegatesTo(DetachedCriteria) Closure additionalCriteria) { - (Number)withPopulatedQuery(Collections.emptyMap(), additionalCriteria) { Query query -> + (Number) withPopulatedQuery(Collections.emptyMap(), additionalCriteria) { Query query -> query.projections().count() query.singleResult() } @@ -548,7 +546,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe */ boolean asBoolean(@DelegatesTo(DetachedCriteria) Closure additionalCriteria = null) { - (Boolean)withPopulatedQuery(Collections.emptyMap(), additionalCriteria) { Query query -> + (Boolean) withPopulatedQuery(Collections.emptyMap(), additionalCriteria) { Query query -> query.projections().count() ((Number)query.singleResult()) > 0 } @@ -586,7 +584,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe */ @Override DetachedCriteria build(@DelegatesTo(DetachedCriteria) Closure callable) { - (DetachedCriteria)super.build(callable) + (DetachedCriteria) super.build(callable) } /** @@ -597,7 +595,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe */ @Override DetachedCriteria buildLazy(@DelegatesTo(DetachedCriteria) Closure callable) { - (DetachedCriteria)super.buildLazy(callable) + (DetachedCriteria) super.buildLazy(callable) } /** @@ -608,7 +606,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe */ @Override DetachedCriteria max(int max) { - (DetachedCriteria)super.max(max) + (DetachedCriteria) super.max(max) } /** @@ -619,7 +617,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe */ @Override DetachedCriteria offset(int offset) { - (DetachedCriteria)super.offset(offset) + (DetachedCriteria) super.offset(offset) } /** @@ -629,7 +627,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria sort(String property) { - (DetachedCriteria)super.sort(property) + (DetachedCriteria) super.sort(property) } /** @@ -640,7 +638,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria sort(String property, String direction) { - (DetachedCriteria)super.sort(property,direction) + (DetachedCriteria) super.sort(property, direction) } /** @@ -650,7 +648,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria property(String property) { - (DetachedCriteria)super.property(property) + (DetachedCriteria) super.property(property) } /** @@ -660,7 +658,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria id() { - (DetachedCriteria)super.id() + (DetachedCriteria) super.id() } /** @@ -670,7 +668,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria avg(String property) { - (DetachedCriteria)super.avg(property) + (DetachedCriteria) super.avg(property) } /** @@ -680,7 +678,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria sum(String property) { - (DetachedCriteria)super.sum(property) + (DetachedCriteria) super.sum(property) } /** @@ -690,7 +688,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria min(String property) { - (DetachedCriteria)super.min(property) + (DetachedCriteria) super.min(property) } /** @@ -700,7 +698,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria max(String property) { - (DetachedCriteria)super.max(property) + (DetachedCriteria) super.max(property) } /** @@ -710,10 +708,9 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe * @return This criteria instance */ DetachedCriteria distinct(String property) { - (DetachedCriteria)super.distinct(property) + (DetachedCriteria) super.distinct(property) } - @Override protected DetachedCriteria newInstance() { new DetachedCriteria(targetClass, alias) @@ -721,7 +718,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe @Override protected DetachedCriteria clone() { - return (DetachedCriteria)super.clone() + return (DetachedCriteria) super.clone() } protected void handleJunction(Closure callable) { @@ -732,7 +729,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe } finally { def lastJunction = junctions.remove(junctions.size() - 1) - add lastJunction + add(lastJunction) } } @@ -746,7 +743,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe staticApi.withDatastoreSession { Session session -> applyLazyCriteria() Query query - if(alias && (session instanceof QueryAliasAwareSession)) { + if (alias && (session instanceof QueryAliasAwareSession)) { query = session.createQuery(targetClass, alias) } else { @@ -761,8 +758,8 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe } DynamicFinder.applyDetachedCriteria(query, this) - if(query instanceof QueryArgumentsAware) { - ((QueryArgumentsAware)query).arguments = args + if (query instanceof QueryArgumentsAware) { + ((QueryArgumentsAware) query).arguments = args } if (additionalCriteria != null) { @@ -783,7 +780,7 @@ class DetachedCriteria extends AbstractDetachedCriteria implements GormOpe def criteria = lazyQuery lazyQuery = null - this.with criteria + this.with(criteria) } } diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/Entity.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/Entity.groovy index 4e6c46e19d1..9813742cc6a 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/Entity.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/Entity.groovy @@ -18,7 +18,6 @@ */ package grails.gorm - /** * Trait added to all domain classes * @@ -27,4 +26,4 @@ package grails.gorm */ trait Entity { -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/MultiTenant.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/MultiTenant.groovy index 8f179e517be..5e8053bc4e1 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/MultiTenant.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/MultiTenant.groovy @@ -19,8 +19,9 @@ package grails.gorm -import grails.gorm.api.GormAllOperations import groovy.transform.CompileStatic + +import grails.gorm.api.GormAllOperations import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.mapping.core.connections.ConnectionSource @@ -41,7 +42,7 @@ trait MultiTenant extends Entity { * @return The result of the closure */ static T withTenant(Serializable tenantId, Closure callable) { - GormEnhancer.findStaticApi(this).withTenant tenantId, callable + GormEnhancer.findStaticApi(this).withTenant(tenantId, callable) } /** @@ -51,7 +52,7 @@ trait MultiTenant extends Entity { * @return The result of the closure */ static GormAllOperations eachTenant(Closure callable) { - GormEnhancer.findStaticApi(this, ConnectionSource.DEFAULT).eachTenant callable + GormEnhancer.findStaticApi(this, ConnectionSource.DEFAULT).eachTenant(callable) } /** @@ -61,6 +62,6 @@ trait MultiTenant extends Entity { * @return The operations */ static GormAllOperations withTenant(Serializable tenantId) { - (GormAllOperations)GormEnhancer.findStaticApi(this).withTenant(tenantId) + (GormAllOperations) GormEnhancer.findStaticApi(this).withTenant(tenantId) } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/PagedResultList.java b/grails-datamapping-core/src/main/groovy/grails/gorm/PagedResultList.java index f6767b9d15c..c41ed3908db 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/PagedResultList.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/PagedResultList.java @@ -21,7 +21,11 @@ import java.io.IOException; import java.io.ObjectOutputStream; import java.io.Serializable; -import java.util.*; +import java.util.Collection; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; import org.grails.datastore.mapping.query.Query; @@ -35,7 +39,6 @@ @SuppressWarnings({"rawtypes", "unchecked"}) public class PagedResultList implements Serializable, List { - private static final long serialVersionUID = -5820655628956173929L; private final Query query; @@ -105,7 +108,7 @@ protected void initialize() { if (query == null) { totalCount = 0; } else { - Query newQuery = (Query)query.clone(); + Query newQuery = (Query) query.clone(); newQuery.projections().count(); Number result = (Number) newQuery.singleResult(); totalCount = result == null ? 0 : result.intValue(); diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/annotation/JpaEntity.java b/grails-datamapping-core/src/main/groovy/grails/gorm/annotation/JpaEntity.java index bc59f9cefce..da1619ebdef 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/annotation/JpaEntity.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/annotation/JpaEntity.java @@ -18,13 +18,13 @@ */ package grails.gorm.annotation; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; + /** * A class annotation used to make a class into a GORM domain class. * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormAllOperations.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormAllOperations.groovy index ccd7fa21645..28577b9dd7a 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormAllOperations.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormAllOperations.groovy @@ -27,4 +27,4 @@ package grails.gorm.api */ interface GormAllOperations extends GormStaticOperations, GormInstanceOperations { -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormInstanceOperations.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormInstanceOperations.groovy index bf46951760e..1eab8d89e5f 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormInstanceOperations.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormInstanceOperations.groovy @@ -19,7 +19,6 @@ package grails.gorm.api - /** * Instance methods of the GORM API. * @@ -27,6 +26,7 @@ package grails.gorm.api * @param the entity/domain class */ interface GormInstanceOperations { + /** * Allow access to datasource by name * @@ -53,7 +53,7 @@ interface GormInstanceOperations { * @param callable The closure * @return The result of the closure */ - public T mutex(D instance, Closure callable) + T mutex(D instance, Closure callable) /** * Refreshes the state of the current instance @@ -61,7 +61,6 @@ interface GormInstanceOperations { */ D refresh(D instance) - /** * Saves an object the datastore * @return Returns the instance @@ -138,4 +137,4 @@ interface GormInstanceOperations { * Deletes an instance from the datastore */ void delete(D instance, Map params) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormStaticOperations.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormStaticOperations.groovy index 79b6d8034d8..667488b481e 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormStaticOperations.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/api/GormStaticOperations.groovy @@ -19,13 +19,13 @@ package grails.gorm.api +import org.springframework.transaction.TransactionDefinition + import grails.gorm.DetachedCriteria import org.grails.datastore.gorm.finders.FinderMethod -import org.grails.datastore.gorm.query.GormQueryOperations import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.query.api.BuildableCriteria import org.grails.datastore.mapping.query.api.Criteria -import org.springframework.transaction.TransactionDefinition /** * Interface for the default static methods in GORM @@ -91,7 +91,6 @@ interface GormStaticOperations { */ D find(Closure callable) - /** * Saves a list of objects in one go * @param objectsToSave The objects to save @@ -174,12 +173,12 @@ interface GormStaticOperations { /** * Creates a criteria builder instance */ - public T withCriteria(@DelegatesTo(Criteria) Closure callable) + T withCriteria(@DelegatesTo(Criteria) Closure callable) /** * Creates a criteria builder instance */ - public T withCriteria(Map builderArgs, @DelegatesTo(Criteria) Closure callable) + T withCriteria(Map builderArgs, @DelegatesTo(Criteria) Closure callable) /** * Locks an instance for an update @@ -414,7 +413,7 @@ interface GormStaticOperations { * @param callable the closure * @return The result of the closure */ - public T withSession(Closure callable) + T withSession(Closure callable) /** * Same as withSession, but present for the case where withSession is overridden to use the Hibernate session @@ -422,7 +421,7 @@ interface GormStaticOperations { * @param callable the closure * @return The result of the closure */ - public T withDatastoreSession(Closure callable) + T withDatastoreSession(Closure callable) /** * Executes the closure within the context of a transaction, creating one if none is present or joining @@ -434,7 +433,7 @@ interface GormStaticOperations { * @see #withNewTransaction(Closure) * @see #withNewTransaction(Map, Closure) */ - public T withTransaction(Closure callable) + T withTransaction(Closure callable) /** * Executes the closure within the context of a new transaction @@ -445,7 +444,7 @@ interface GormStaticOperations { * @see #withTransaction(Map, Closure) * @see #withNewTransaction(Map, Closure) */ - public T withNewTransaction(Closure callable) + T withNewTransaction(Closure callable) /** * Executes the closure within the context of a transaction which is @@ -470,7 +469,7 @@ interface GormStaticOperations { * @see #withNewTransaction(Map, Closure) * @see #withTransaction(Closure) */ - public T withTransaction(Map transactionProperties, Closure callable) + T withTransaction(Map transactionProperties, Closure callable) /** * Executes the closure within the context of a new transaction which is @@ -497,7 +496,7 @@ interface GormStaticOperations { * @see #withTransaction(Closure) * @see #withTransaction(Map, Closure) */ - public T withNewTransaction(Map transactionProperties, Closure callable) + T withNewTransaction(Map transactionProperties, Closure callable) /** * Executes the closure within the context of a transaction for the given {@link org.springframework.transaction.TransactionDefinition} @@ -505,18 +504,17 @@ interface GormStaticOperations { * @param callable The closure to call * @return The result of the closure execution */ - public T withTransaction(TransactionDefinition definition, Closure callable) + T withTransaction(TransactionDefinition definition, Closure callable) /** * Creates and binds a new session for the scope of the given closure */ - public T withNewSession(Closure callable) + T withNewSession(Closure callable) /** * Creates and binds a new session for the scope of the given closure */ - public T withStatelessSession(Closure callable) - + T withStatelessSession(Closure callable) /** * Executes a query for the given String @@ -772,7 +770,6 @@ interface GormStaticOperations { */ List findAll(CharSequence query, Collection params, Map args) - /** * Execute the closure with the given tenantId * @@ -782,7 +779,6 @@ interface GormStaticOperations { */ def T withTenant(Serializable tenantId, Closure callable) - /** * Execute the closure for each tenant * @@ -798,4 +794,4 @@ interface GormStaticOperations { * @return The operations */ GormAllOperations withTenant(Serializable tenantId) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/dirty/checking/DirtyCheck.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/dirty/checking/DirtyCheck.groovy index ae340a91a5d..ccfb2f8e696 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/dirty/checking/DirtyCheck.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/dirty/checking/DirtyCheck.groovy @@ -18,13 +18,13 @@ */ package grails.gorm.dirty.checking -import org.codehaus.groovy.transform.GroovyASTTransformationClass - import java.lang.annotation.ElementType import java.lang.annotation.Retention import java.lang.annotation.RetentionPolicy import java.lang.annotation.Target +import org.codehaus.groovy.transform.GroovyASTTransformationClass + /** * Apply to enhance an entity with dirty checking support * @@ -33,7 +33,7 @@ import java.lang.annotation.Target */ @Retention(RetentionPolicy.RUNTIME) @Target([ElementType.TYPE]) -@GroovyASTTransformationClass("org.grails.compiler.gorm.DirtyCheckTransformation") -public @interface DirtyCheck { +@GroovyASTTransformationClass('org.grails.compiler.gorm.DirtyCheckTransformation') +@interface DirtyCheck { -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/dirty/checking/DirtyCheckedProperty.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/dirty/checking/DirtyCheckedProperty.groovy index f60299e8f69..68c5d126fe3 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/dirty/checking/DirtyCheckedProperty.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/dirty/checking/DirtyCheckedProperty.groovy @@ -32,5 +32,4 @@ import java.lang.annotation.Target */ @Retention(RetentionPolicy.RUNTIME) @Target([ElementType.METHOD]) -@interface DirtyCheckedProperty { -} \ No newline at end of file +@interface DirtyCheckedProperty {} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/CurrentTenant.java b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/CurrentTenant.java index 6b955d8d50a..d1fd7772ad4 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/CurrentTenant.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/CurrentTenant.java @@ -18,12 +18,18 @@ */ package grails.gorm.multitenancy; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + import org.codehaus.groovy.transform.GroovyASTTransformationClass; + import org.grails.datastore.gorm.transform.GormASTTransformationClass; import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; -import java.lang.annotation.*; - /** *

An AST transformation that makes a particular class or method applicable to the tenant id returned by the passed closure. For example:

* diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/Tenant.java b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/Tenant.java index 63a64422f39..922c8f806be 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/Tenant.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/Tenant.java @@ -18,12 +18,18 @@ */ package grails.gorm.multitenancy; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + import org.codehaus.groovy.transform.GroovyASTTransformationClass; + import org.grails.datastore.gorm.transform.GormASTTransformationClass; import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; -import java.lang.annotation.*; - /** *

An AST transformation that makes a particular class or method applicable to the tenant id returned by the passed closure. For example:

* diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/TenantService.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/TenantService.groovy index 9875013d273..ba14b0af598 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/TenantService.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/TenantService.groovy @@ -34,7 +34,6 @@ interface TenantService { */ void eachTenant(Closure callable) - /** * @return The current tenant id * @@ -49,7 +48,7 @@ interface TenantService { * @param callable The closure * @return The result of the closure */ - public T withoutId(Closure callable) + T withoutId(Closure callable) /** * Execute the given closure with the current tenant. This method will create a new datastore session for the scope of the call and hence is designed to be used to manage the connection life cycle @@ -57,7 +56,7 @@ interface TenantService { * @param callable The closure * @return The result of the closure */ - public T withCurrent(Closure callable) + T withCurrent(Closure callable) /** * Execute the given closure with given tenant id. This method will create a new datastore session for the scope of the call and hence is designed to be used to manage the connection life cycle @@ -66,5 +65,5 @@ interface TenantService { * @param callable The closure * @return The result of the closure */ - public T withId(Serializable tenantId, Closure callable) -} \ No newline at end of file + T withId(Serializable tenantId, Closure callable) +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/Tenants.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/Tenants.groovy index d52d0eb0bb1..abbfb17ce9c 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/Tenants.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/Tenants.groovy @@ -21,6 +21,7 @@ package grails.gorm.multitenancy import groovy.transform.CompileStatic import groovy.util.logging.Slf4j + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.core.connections.ConnectionSource @@ -39,6 +40,7 @@ import org.grails.datastore.mapping.multitenancy.TenantResolver @CompileStatic @Slf4j class Tenants { + /** * Execute the given closure for each tenant. * @@ -67,12 +69,12 @@ class Tenants { */ static Serializable currentId() { Datastore datastore = GormEnhancer.findSingleDatastore() - if(datastore instanceof MultiTenantCapableDatastore) { - MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore)datastore + if (datastore instanceof MultiTenantCapableDatastore) { + MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) datastore return currentId(multiTenantCapableDatastore) } else { - throw new UnsupportedOperationException("Datastore implementation does not support multi-tenancy") + throw new UnsupportedOperationException('Datastore implementation does not support multi-tenancy') } } @@ -85,12 +87,12 @@ class Tenants { static Serializable currentId(MultiTenantCapableDatastore multiTenantCapableDatastore) { def tenantId = CurrentTenant.get() if (tenantId != null) { - log.debug "Found tenant id [$tenantId] bound to thread local" + log.debug('Found tenant id [{}] bound to thread local', tenantId) return tenantId } else { TenantResolver tenantResolver = multiTenantCapableDatastore.getTenantResolver() Serializable tenantIdentifier = tenantResolver.resolveTenantIdentifier() - log.debug "Resolved tenant id [$tenantIdentifier] from resolver [${tenantResolver.getClass().simpleName}]" + log.debug('Resolved tenant id [{}] from resolver [{}]', tenantIdentifier, tenantResolver.getClass().simpleName) return tenantIdentifier } } @@ -102,22 +104,22 @@ class Tenants { */ static Serializable currentId(Class datastoreClass) { Datastore datastore = GormEnhancer.findDatastoreByType(datastoreClass) - if(datastore instanceof MultiTenantCapableDatastore) { - MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore)datastore + if (datastore instanceof MultiTenantCapableDatastore) { + MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) datastore def tenantId = CurrentTenant.get() - if(tenantId != null) { - log.debug "Found tenant id [$tenantId] bound to thread local" + if (tenantId != null) { + log.debug('Found tenant id [{}] bound to thread local', tenantId) return tenantId } else { TenantResolver tenantResolver = multiTenantCapableDatastore.getTenantResolver() def tenantIdentifier = tenantResolver.resolveTenantIdentifier() - log.debug "Resolved tenant id [$tenantIdentifier] from resolver [${tenantResolver.getClass().simpleName}]" + log.debug('Resolved tenant id [{}] from resolver [{}]', tenantIdentifier, tenantResolver.getClass().simpleName) return tenantIdentifier } } else { - throw new UnsupportedOperationException("Datastore implementation does not support multi-tenancy") + throw new UnsupportedOperationException('Datastore implementation does not support multi-tenancy') } } @@ -130,11 +132,11 @@ class Tenants { */ static T withoutId(Closure callable) { Datastore datastore = GormEnhancer.findSingleDatastore() - if(datastore instanceof MultiTenantCapableDatastore) { - MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore)datastore + if (datastore instanceof MultiTenantCapableDatastore) { + MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) datastore return withoutId(multiTenantCapableDatastore, callable) } else { - throw new UnsupportedOperationException("Datastore implementation does not support multi-tenancy") + throw new UnsupportedOperationException('Datastore implementation does not support multi-tenancy') } } @@ -147,12 +149,12 @@ class Tenants { static T withCurrent(Closure callable) { Serializable tenantIdentifier = currentId() Datastore datastore = GormEnhancer.findSingleDatastore() - if(datastore instanceof MultiTenantCapableDatastore) { - MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore)datastore + if (datastore instanceof MultiTenantCapableDatastore) { + MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) datastore return withId(multiTenantCapableDatastore, tenantIdentifier, callable) } else { - throw new UnsupportedOperationException("Datastore implementation does not support multi-tenancy") + throw new UnsupportedOperationException('Datastore implementation does not support multi-tenancy') } } @@ -166,12 +168,12 @@ class Tenants { static T withCurrent(Class datastoreClass, Closure callable) { Serializable tenantIdentifier = currentId(datastoreClass) Datastore datastore = GormEnhancer.findDatastoreByType(datastoreClass) - if(datastore instanceof MultiTenantCapableDatastore) { - MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore)datastore + if (datastore instanceof MultiTenantCapableDatastore) { + MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) datastore return withId(multiTenantCapableDatastore, tenantIdentifier, callable) } else { - throw new UnsupportedOperationException("Datastore implementation does not support multi-tenancy") + throw new UnsupportedOperationException('Datastore implementation does not support multi-tenancy') } } @@ -183,12 +185,12 @@ class Tenants { */ static T withId(Serializable tenantId, Closure callable) { Datastore datastore = GormEnhancer.findSingleDatastore() - if(datastore instanceof MultiTenantCapableDatastore) { - MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore)datastore + if (datastore instanceof MultiTenantCapableDatastore) { + MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) datastore return withId(multiTenantCapableDatastore, tenantId, callable) } else { - throw new UnsupportedOperationException("Datastore implementation does not support multi-tenancy") + throw new UnsupportedOperationException('Datastore implementation does not support multi-tenancy') } } /** @@ -199,12 +201,12 @@ class Tenants { */ static T withId(Class datastoreClass, Serializable tenantId, Closure callable) { Datastore datastore = GormEnhancer.findDatastoreByType(datastoreClass) - if(datastore instanceof MultiTenantCapableDatastore) { - MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore)datastore + if (datastore instanceof MultiTenantCapableDatastore) { + MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) datastore return withId(multiTenantCapableDatastore, tenantId, callable) } else { - throw new UnsupportedOperationException("Datastore implementation does not support multi-tenancy") + throw new UnsupportedOperationException('Datastore implementation does not support multi-tenancy') } } @@ -217,7 +219,7 @@ class Tenants { return CurrentTenant.withoutTenant { if (multiTenantCapableDatastore.getMultiTenancyMode().isSharedConnection()) { def i = callable.parameterTypes.length - if(i == 0 ) { + if (i == 0) { return callable.call() } else { return multiTenantCapableDatastore.withSession { session -> @@ -237,7 +239,7 @@ class Tenants { case 2: return callable.call(ConnectionSource.DEFAULT, session) default: - throw new IllegalArgumentException("Provided closure accepts too many arguments") + throw new IllegalArgumentException('Provided closure accepts too many arguments') } } @@ -253,9 +255,9 @@ class Tenants { */ static T withId(MultiTenantCapableDatastore multiTenantCapableDatastore, Serializable tenantId, Closure callable) { return CurrentTenant.withTenant(tenantId) { - if(multiTenantCapableDatastore.getMultiTenancyMode().isSharedConnection()) { + if (multiTenantCapableDatastore.getMultiTenancyMode().isSharedConnection()) { def i = callable.parameterTypes.length - if(i == 2) { + if (i == 2) { return multiTenantCapableDatastore.withSession { session -> return callable.call(tenantId, session) } @@ -269,7 +271,7 @@ class Tenants { return callable.call(tenantId) break default: - throw new IllegalArgumentException("Provided closure accepts too many arguments") + throw new IllegalArgumentException('Provided closure accepts too many arguments') } } } @@ -286,7 +288,7 @@ class Tenants { case 2: return callable.call(tenantId, session) default: - throw new IllegalArgumentException("Provided closure accepts too many arguments") + throw new IllegalArgumentException('Provided closure accepts too many arguments') } } @@ -335,7 +337,7 @@ class Tenants { MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) datastore eachTenant(multiTenantCapableDatastore, callable) } else { - throw new UnsupportedOperationException("Datastore implementation does not support multi-tenancy") + throw new UnsupportedOperationException('Datastore implementation does not support multi-tenancy') } } @@ -376,7 +378,7 @@ class Tenants { set(tenantId) callable.call(tenantId) } finally { - if(previous == null) { + if (previous == null) { remove() } else { @@ -385,7 +387,6 @@ class Tenants { } } - /** * Execute without current tenant * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/WithoutTenant.java b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/WithoutTenant.java index 449347b82f4..d9c3d8c9e2c 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/WithoutTenant.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/multitenancy/WithoutTenant.java @@ -18,13 +18,18 @@ */ package grails.gorm.multitenancy; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + import org.codehaus.groovy.transform.GroovyASTTransformationClass; + import org.grails.datastore.gorm.transform.GormASTTransformationClass; import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; -import java.lang.annotation.*; - - /** *

An AST transformation that makes a particular class or method execute without a tenant id. For example:

* diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/services/Join.java b/grails-datamapping-core/src/main/groovy/grails/gorm/services/Join.java index 704494a16a2..03fff68508f 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/services/Join.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/services/Join.java @@ -19,12 +19,13 @@ package grails.gorm.services; -import jakarta.persistence.criteria.JoinType; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import jakarta.persistence.criteria.JoinType; + /** * Allow specifying the join to services * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/services/Query.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/services/Query.groovy index 0a307210be5..099605ac71f 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/services/Query.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/services/Query.groovy @@ -33,5 +33,6 @@ import java.lang.annotation.Target @Retention(RetentionPolicy.SOURCE) @Target(ElementType.METHOD) @interface Query { + String value() -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/services/Service.java b/grails-datamapping-core/src/main/groovy/grails/gorm/services/Service.java index ee45e30c89d..d783367816e 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/services/Service.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/services/Service.java @@ -19,15 +19,16 @@ package grails.gorm.services; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; -import org.grails.datastore.gorm.services.ServiceImplementer; -import org.grails.datastore.gorm.services.ServiceImplementerAdapter; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; + +import org.grails.datastore.gorm.services.ServiceImplementer; +import org.grails.datastore.gorm.services.ServiceImplementerAdapter; + /** * Makes any class into a GORM {@link org.grails.datastore.mapping.services.Service} * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/time/InstantConverter.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/time/InstantConverter.groovy index aa85bd93b1c..938cec5747f 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/time/InstantConverter.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/time/InstantConverter.groovy @@ -19,10 +19,10 @@ package grails.gorm.time -import groovy.transform.CompileStatic - import java.time.Instant +import groovy.transform.CompileStatic + /** * A trait to convert a {@link java.time.Instant} to and from a long * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalDateConverter.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalDateConverter.groovy index 84ae6f88f1b..e613f3441fe 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalDateConverter.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalDateConverter.groovy @@ -19,9 +19,14 @@ package grails.gorm.time -import groovy.transform.CompileStatic +import java.time.Instant +import java.time.LocalDate +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.ZoneId +import java.time.ZoneOffset -import java.time.* +import groovy.transform.CompileStatic /** * A trait to convert a {@link LocalDate} to and from a long @@ -42,4 +47,4 @@ trait LocalDateConverter extends TemporalConverter { Instant instant = Instant.ofEpochMilli(value) LocalDateTime.ofInstant(instant, ZoneId.of('UTC')).toLocalDate() } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalDateTimeConverter.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalDateTimeConverter.groovy index 995e03fa9bb..02998a1df29 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalDateTimeConverter.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalDateTimeConverter.groovy @@ -19,13 +19,13 @@ package grails.gorm.time -import groovy.transform.CompileStatic - import java.time.Instant import java.time.LocalDateTime import java.time.ZoneId import java.time.ZoneOffset +import groovy.transform.CompileStatic + /** * A trait to convert a {@link java.time.LocalDateTime} to and from a long * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalTimeConverter.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalTimeConverter.groovy index d1c83b6c021..91c092098c1 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalTimeConverter.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/time/LocalTimeConverter.groovy @@ -19,10 +19,10 @@ package grails.gorm.time -import groovy.transform.CompileStatic - import java.time.LocalTime +import groovy.transform.CompileStatic + /** * A trait to convert a {@link LocalTime} to and from a long * @@ -40,4 +40,4 @@ trait LocalTimeConverter implements TemporalConverter { LocalTime convert(Long value) { LocalTime.ofNanoOfDay(value) } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/time/OffsetDateTimeConverter.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/time/OffsetDateTimeConverter.groovy index d8e76386d0b..751b068927c 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/time/OffsetDateTimeConverter.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/time/OffsetDateTimeConverter.groovy @@ -19,11 +19,11 @@ package grails.gorm.time -import groovy.transform.CompileStatic - import java.time.Instant import java.time.OffsetDateTime +import groovy.transform.CompileStatic + /** * A trait to convert a {@link java.time.OffsetDateTime} to and from a long * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/time/OffsetTimeConverter.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/time/OffsetTimeConverter.groovy index 96831b12e97..0fed43f99d1 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/time/OffsetTimeConverter.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/time/OffsetTimeConverter.groovy @@ -19,12 +19,12 @@ package grails.gorm.time -import groovy.transform.CompileStatic - import java.time.LocalTime import java.time.OffsetTime import java.time.ZoneOffset +import groovy.transform.CompileStatic + /** * A trait to convert a {@link java.time.OffsetTime} to and from a long * @@ -42,4 +42,4 @@ trait OffsetTimeConverter implements TemporalConverter { OffsetTime convert(Long value) { OffsetTime.of(LocalTime.ofNanoOfDay(value), ZoneOffset.UTC).withOffsetSameInstant(systemOffset) } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/time/PeriodConverter.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/time/PeriodConverter.groovy index db2accd2241..6e3e68efaf5 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/time/PeriodConverter.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/time/PeriodConverter.groovy @@ -19,10 +19,10 @@ package grails.gorm.time -import groovy.transform.CompileStatic - import java.time.Period +import groovy.transform.CompileStatic + /** * A trait to convert a {@link java.time.Period} to and from a String * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/time/ZonedDateTimeConverter.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/time/ZonedDateTimeConverter.groovy index dc383b161c8..4da0c6e3d94 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/time/ZonedDateTimeConverter.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/time/ZonedDateTimeConverter.groovy @@ -19,11 +19,11 @@ package grails.gorm.time -import groovy.transform.CompileStatic - import java.time.Instant import java.time.ZonedDateTime +import groovy.transform.CompileStatic + /** * A trait to convert a {@link java.time.ZonedDateTime} to and from a long * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/GrailsTransactionAttribute.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/GrailsTransactionAttribute.groovy index 5dd521d22f2..505392eddf3 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/GrailsTransactionAttribute.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/GrailsTransactionAttribute.groovy @@ -21,13 +21,12 @@ package grails.gorm.transactions import groovy.transform.CompileStatic import groovy.transform.InheritConstructors import groovy.util.logging.Slf4j + import org.springframework.transaction.TransactionDefinition import org.springframework.transaction.interceptor.NoRollbackRuleAttribute import org.springframework.transaction.interceptor.RollbackRuleAttribute import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute - - /** * Used to configure a {@link GrailsTransactionTemplate} * @@ -38,11 +37,12 @@ import org.springframework.transaction.interceptor.RuleBasedTransactionAttribute @InheritConstructors @Slf4j class GrailsTransactionAttribute extends RuleBasedTransactionAttribute { - private static final long serialVersionUID = 1L; - private boolean inheritRollbackOnly = true; - public GrailsTransactionAttribute(org.springframework.transaction.interceptor.TransactionAttribute other) { - super(); + private static final long serialVersionUID = 1L + private boolean inheritRollbackOnly = true + + GrailsTransactionAttribute(org.springframework.transaction.interceptor.TransactionAttribute other) { + super() propagationBehavior = other.propagationBehavior isolationLevel = other.isolationLevel timeout = other.timeout @@ -50,8 +50,8 @@ class GrailsTransactionAttribute extends RuleBasedTransactionAttribute { name = other.name } - public GrailsTransactionAttribute(TransactionDefinition other) { - super(); + GrailsTransactionAttribute(TransactionDefinition other) { + super() propagationBehavior = other.propagationBehavior isolationLevel = other.isolationLevel timeout = other.timeout @@ -59,26 +59,24 @@ class GrailsTransactionAttribute extends RuleBasedTransactionAttribute { name = other.name } - public GrailsTransactionAttribute(GrailsTransactionAttribute other) { - this((RuleBasedTransactionAttribute)other); + GrailsTransactionAttribute(GrailsTransactionAttribute other) { + this((RuleBasedTransactionAttribute) other) } - public GrailsTransactionAttribute(RuleBasedTransactionAttribute other) { + GrailsTransactionAttribute(RuleBasedTransactionAttribute other) { super(other) - if(other instanceof GrailsTransactionAttribute) { - this.inheritRollbackOnly = ((GrailsTransactionAttribute)other).inheritRollbackOnly + if (other instanceof GrailsTransactionAttribute) { + this.inheritRollbackOnly = ((GrailsTransactionAttribute) other).inheritRollbackOnly } } - public boolean isInheritRollbackOnly() { - return inheritRollbackOnly; + boolean isInheritRollbackOnly() { + return inheritRollbackOnly } @Override boolean rollbackOn(Throwable ex) { - if (log.isTraceEnabled()) { - log.trace("Applying rules to determine whether transaction should rollback on $ex"); - } + log.trace('Applying rules to determine whether transaction should rollback on {}', ex.toString()) RollbackRuleAttribute winner = null int deepest = Integer.MAX_VALUE @@ -94,13 +92,11 @@ class GrailsTransactionAttribute extends RuleBasedTransactionAttribute { } } - if (log.isTraceEnabled()) { - log.trace("Winning rollback rule is: $winner" ); - } + log.trace('Winning rollback rule is: {}', winner) // User superclass behavior (rollback on unchecked) if no rule matches. if (winner == null) { - log.trace("No relevant rollback rule found: applying default rules") + log.trace('No relevant rollback rule found: applying default rules') // always rollback regardless if it is a checked or unchecked exception since Groovy doesn't differentiate those return true @@ -109,7 +105,7 @@ class GrailsTransactionAttribute extends RuleBasedTransactionAttribute { return !(winner instanceof NoRollbackRuleAttribute) } - public void setInheritRollbackOnly(boolean inheritRollbackOnly) { - this.inheritRollbackOnly = inheritRollbackOnly; + void setInheritRollbackOnly(boolean inheritRollbackOnly) { + this.inheritRollbackOnly = inheritRollbackOnly } } diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/GrailsTransactionTemplate.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/GrailsTransactionTemplate.groovy index cb0f2fae0cc..24592a175bc 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/GrailsTransactionTemplate.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/GrailsTransactionTemplate.groovy @@ -21,7 +21,7 @@ package grails.gorm.transactions import groovy.transform.CompileStatic import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType -import org.grails.datastore.mapping.transactions.CustomizableRollbackTransactionAttribute + import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.TransactionDefinition import org.springframework.transaction.TransactionException @@ -29,6 +29,8 @@ import org.springframework.transaction.TransactionStatus import org.springframework.transaction.interceptor.TransactionAttribute import org.springframework.transaction.support.TransactionCallback +import org.grails.datastore.mapping.transactions.CustomizableRollbackTransactionAttribute + /** * Template class that simplifies programmatic transaction demarcation and * transaction exception handling. @@ -50,19 +52,19 @@ class GrailsTransactionTemplate { } GrailsTransactionTemplate(PlatformTransactionManager transactionManager, TransactionDefinition transactionDefinition) { - this(transactionManager, transactionDefinition instanceof TransactionAttribute ? (TransactionAttribute)transactionDefinition : new GrailsTransactionAttribute(transactionDefinition)); + this(transactionManager, transactionDefinition instanceof TransactionAttribute ? (TransactionAttribute) transactionDefinition : new GrailsTransactionAttribute(transactionDefinition)) } GrailsTransactionTemplate(PlatformTransactionManager transactionManager, TransactionAttribute transactionAttribute) { - this(transactionManager, transactionAttribute instanceof CustomizableRollbackTransactionAttribute ? (CustomizableRollbackTransactionAttribute)transactionAttribute : new CustomizableRollbackTransactionAttribute(transactionAttribute)); + this(transactionManager, transactionAttribute instanceof CustomizableRollbackTransactionAttribute ? (CustomizableRollbackTransactionAttribute) transactionAttribute : new CustomizableRollbackTransactionAttribute(transactionAttribute)) } GrailsTransactionTemplate(PlatformTransactionManager transactionManager, CustomizableRollbackTransactionAttribute transactionAttribute) { - this.transactionAttribute = transactionAttribute; + this.transactionAttribute = transactionAttribute this.transactionTemplate = new org.springframework.transaction.support.TransactionTemplate(transactionManager, this.transactionAttribute) } - public T executeAndRollback(@ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure action) throws TransactionException { + T executeAndRollback(@ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure action) throws TransactionException { try { Object result = transactionTemplate.execute(new TransactionCallback() { Object doInTransaction(TransactionStatus status) { @@ -88,7 +90,7 @@ class GrailsTransactionTemplate { } } - public T execute(@ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure action) throws TransactionException { + T execute(@ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure action) throws TransactionException { try { Object result = transactionTemplate.execute(new TransactionCallback() { Object doInTransaction(TransactionStatus status) { @@ -107,10 +109,10 @@ class GrailsTransactionTemplate { } } finally { boolean inheritRollbackOnly = true - if(transactionAttribute instanceof CustomizableRollbackTransactionAttribute) { + if (transactionAttribute instanceof CustomizableRollbackTransactionAttribute) { inheritRollbackOnly = transactionAttribute.isInheritRollbackOnly() } - if(inheritRollbackOnly && status.isRollbackOnly()) { + if (inheritRollbackOnly && status.isRollbackOnly()) { status.setRollbackOnly() } } @@ -120,7 +122,7 @@ class GrailsTransactionTemplate { if (result instanceof ThrowableHolder) { throw result.getThrowable() } else { - return (T)result + return (T) result } } catch (ThrowableHolderException e) { @@ -134,14 +136,14 @@ class GrailsTransactionTemplate { */ private static class ThrowableHolder { - private final Throwable throwable; + private final Throwable throwable ThrowableHolder(Throwable throwable) { - this.throwable = throwable; + this.throwable = throwable } Throwable getThrowable() { - return this.throwable; + return this.throwable } } @@ -152,12 +154,12 @@ class GrailsTransactionTemplate { private static class ThrowableHolderException extends RuntimeException { ThrowableHolderException(Throwable throwable) { - super(throwable); + super(throwable) } @Override - public String toString() { - return getCause().toString(); + String toString() { + return getCause().toString() } } } diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/NotTransactional.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/NotTransactional.groovy index 9e2fc53c135..2678c3a248c 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/NotTransactional.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/NotTransactional.groovy @@ -17,14 +17,14 @@ * under the License. */ -package grails.gorm.transactions; +package grails.gorm.transactions -import java.lang.annotation.Documented; -import java.lang.annotation.ElementType; -import java.lang.annotation.Inherited; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; +import java.lang.annotation.Documented +import java.lang.annotation.ElementType +import java.lang.annotation.Inherited +import java.lang.annotation.Retention +import java.lang.annotation.RetentionPolicy +import java.lang.annotation.Target /** * @@ -39,6 +39,6 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented -public @interface NotTransactional { +@interface NotTransactional { } diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/ReadOnly.java b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/ReadOnly.java index 9a9dc5e4039..b3a2b636afe 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/ReadOnly.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/ReadOnly.java @@ -18,15 +18,22 @@ */ package grails.gorm.transactions; +import java.lang.annotation.Documented; +import java.lang.annotation.ElementType; +import java.lang.annotation.Inherited; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + import org.codehaus.groovy.transform.GroovyASTTransformationClass; -import org.grails.datastore.gorm.transform.GormASTTransformationClass; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; + import org.springframework.transaction.TransactionDefinition; import org.springframework.transaction.annotation.Isolation; import org.springframework.transaction.annotation.Propagation; -import java.lang.annotation.*; +import org.grails.datastore.gorm.transform.GormASTTransformationClass; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; /** * Define a read-only transaction @@ -118,7 +125,6 @@ */ String[] noRollbackForClassName() default {}; - /** * In Spring, when there are nested transaction calls, the execution of the outermost callback will throw UnexpectedRollbackException if TransactionStatus.setRollbackOnly() was called in a nested transaction callback. * diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/Rollback.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/Rollback.groovy index c695a446b4a..6dd29cc91c4 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/Rollback.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/Rollback.groovy @@ -19,10 +19,6 @@ package grails.gorm.transactions -import org.codehaus.groovy.transform.GroovyASTTransformationClass -import org.grails.datastore.gorm.transactions.transform.RollbackTransform -import org.grails.datastore.gorm.transform.GormASTTransformationClass - import java.lang.annotation.Documented import java.lang.annotation.ElementType import java.lang.annotation.Inherited @@ -30,6 +26,10 @@ import java.lang.annotation.Retention import java.lang.annotation.RetentionPolicy import java.lang.annotation.Target +import org.codehaus.groovy.transform.GroovyASTTransformationClass + +import org.grails.datastore.gorm.transform.GormASTTransformationClass + /** * A transforms that applies a transaction that always rolls back. Useful for testing. See {@link Transactional} * @@ -40,11 +40,12 @@ import java.lang.annotation.Target @Retention(RetentionPolicy.RUNTIME) @Inherited @Documented -@GroovyASTTransformationClass("org.grails.datastore.gorm.transform.OrderedGormTransformation") -@GormASTTransformationClass("org.grails.datastore.gorm.transactions.transform.RollbackTransform") +@GroovyASTTransformationClass('org.grails.datastore.gorm.transform.OrderedGormTransformation') +@GormASTTransformationClass('org.grails.datastore.gorm.transactions.transform.RollbackTransform') @interface Rollback { + /** * The connection to rollback for */ - String value() default "" -} \ No newline at end of file + String value() default '' +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/TransactionService.groovy b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/TransactionService.groovy index 8aa0039df5a..faf8db67657 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/TransactionService.groovy +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/TransactionService.groovy @@ -21,6 +21,7 @@ package grails.gorm.transactions import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType + import org.springframework.transaction.TransactionDefinition /** @@ -37,7 +38,7 @@ interface TransactionService { * @param callable The callable * @return The result */ - public T withTransaction(@ClosureParams(value=SimpleType.class, options="org.springframework.transaction.TransactionStatus") Closure callable) + T withTransaction(@ClosureParams(value=SimpleType, options='org.springframework.transaction.TransactionStatus') Closure callable) /** * Executes the given callable within the context of a transaction that is automatically rolled back with the default attributes @@ -45,14 +46,14 @@ interface TransactionService { * @param callable The callable * @return The result */ - public T withRollback(@ClosureParams(value=SimpleType.class, options="org.springframework.transaction.TransactionStatus") Closure callable) + T withRollback(@ClosureParams(value=SimpleType, options='org.springframework.transaction.TransactionStatus') Closure callable) /** * Executes the given callable within the context of a new transaction with the default attributes * * @param callable The callable * @return The result */ - public T withNewTransaction(@ClosureParams(value=SimpleType.class, options="org.springframework.transaction.TransactionStatus") Closure callable) + T withNewTransaction(@ClosureParams(value=SimpleType, options='org.springframework.transaction.TransactionStatus') Closure callable) /** * Executes the given callable within the context of a transaction with the given definition @@ -61,7 +62,7 @@ interface TransactionService { * @param callable The callable The callable * @return The result of the callable */ - public T withTransaction(TransactionDefinition definition, @ClosureParams(value=SimpleType.class, options="org.springframework.transaction.TransactionStatus") Closure callable) + T withTransaction(TransactionDefinition definition, @ClosureParams(value=SimpleType, options='org.springframework.transaction.TransactionStatus') Closure callable) /** * Executes the given callable within the context of a transaction with the given definition @@ -70,7 +71,7 @@ interface TransactionService { * @param callable The callable The callable * @return The result of the callable */ - public T withTransaction(Map definition, @ClosureParams(value=SimpleType.class, options="org.springframework.transaction.TransactionStatus") Closure callable) + T withTransaction(Map definition, @ClosureParams(value=SimpleType, options='org.springframework.transaction.TransactionStatus') Closure callable) /** * Executes the given callable within the context of a transaction that is automatically rolled back with the default attributes @@ -79,7 +80,7 @@ interface TransactionService { * @param callable The callable * @return The result */ - public T withRollback(TransactionDefinition definition, @ClosureParams(value=SimpleType.class, options="org.springframework.transaction.TransactionStatus") Closure callable) + T withRollback(TransactionDefinition definition, @ClosureParams(value=SimpleType, options='org.springframework.transaction.TransactionStatus') Closure callable) /** * Executes the given callable within the context of a new transaction with the default attributes * @@ -87,5 +88,5 @@ interface TransactionService { * @param callable The callable * @return The result */ - public T withNewTransaction(TransactionDefinition definition, @ClosureParams(value=SimpleType.class, options="org.springframework.transaction.TransactionStatus") Closure callable) -} \ No newline at end of file + T withNewTransaction(TransactionDefinition definition, @ClosureParams(value=SimpleType, options='org.springframework.transaction.TransactionStatus') Closure callable) +} diff --git a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/Transactional.java b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/Transactional.java index b72009cbeb0..4ec0dd8c340 100644 --- a/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/Transactional.java +++ b/grails-datamapping-core/src/main/groovy/grails/gorm/transactions/Transactional.java @@ -18,14 +18,6 @@ */ package grails.gorm.transactions; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; -import org.grails.datastore.gorm.transform.GormASTTransformationClass; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.annotation.Isolation; -import org.springframework.transaction.annotation.Propagation; - import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Inherited; @@ -33,6 +25,16 @@ import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; + +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.annotation.Isolation; +import org.springframework.transaction.annotation.Propagation; + +import org.grails.datastore.gorm.transform.GormASTTransformationClass; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; + /** * * Describes transaction attributes on a method or class. @@ -150,7 +152,6 @@ */ String[] noRollbackForClassName() default {}; - /** * In Spring, when there are nested transaction calls, the execution of the outermost callback will throw UnexpectedRollbackException if TransactionStatus.setRollbackOnly() was called in a nested transaction callback. * @@ -172,4 +173,4 @@ */ String connection() default ConnectionSource.DEFAULT; -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/AdditionalGormEntityTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/AdditionalGormEntityTransformation.groovy index 22058ff21d8..4ab8204fb17 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/AdditionalGormEntityTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/AdditionalGormEntityTransformation.groovy @@ -45,4 +45,4 @@ interface AdditionalGormEntityTransformation extends ASTTransformation, Compilat * @param sourceUnit The source unit */ void visit(ClassNode classNode, SourceUnit sourceUnit) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/DirtyCheckTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/DirtyCheckTransformation.groovy index daeda85dd59..e798dac7790 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/DirtyCheckTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/DirtyCheckTransformation.groovy @@ -19,10 +19,8 @@ package org.grails.compiler.gorm -import grails.gorm.dirty.checking.DirtyCheck import groovy.transform.CompilationUnitAware import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.ast.AnnotatedNode import org.codehaus.groovy.ast.AnnotationNode @@ -34,6 +32,9 @@ import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.GroovyASTTransformation import org.codehaus.groovy.transform.TransformWithPriority +import grails.gorm.dirty.checking.DirtyCheck +import org.apache.grails.common.compiler.GroovyTransformOrder + /** * Applies the DirtyCheck transformation * @@ -43,8 +44,8 @@ import org.codehaus.groovy.transform.TransformWithPriority @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) class DirtyCheckTransformation implements ASTTransformation, CompilationUnitAware, TransformWithPriority { - private static final ClassNode MY_TYPE = new ClassNode(DirtyCheck.class); - private static final String MY_TYPE_NAME = "@" + MY_TYPE.getNameWithoutPackage(); + private static final ClassNode MY_TYPE = new ClassNode(DirtyCheck) + private static final String MY_TYPE_NAME = '@' + MY_TYPE.getNameWithoutPackage() CompilationUnit compilationUnit @@ -52,19 +53,18 @@ class DirtyCheckTransformation implements ASTTransformation, CompilationUnitAwar @CompileStatic void visit(ASTNode[] astNodes, SourceUnit source) { - AnnotatedNode parent = (AnnotatedNode) astNodes[1]; - AnnotationNode node = (AnnotationNode) astNodes[0]; + AnnotatedNode parent = (AnnotatedNode) astNodes[1] + AnnotationNode node = (AnnotationNode) astNodes[0] if (!(astNodes[0] instanceof AnnotationNode) || !(astNodes[1] instanceof AnnotatedNode)) { - throw new RuntimeException("Internal error: wrong types: ${node.getClass()} / ${parent.getClass()}"); + throw new RuntimeException("Internal error: wrong types: ${node.getClass()} / ${parent.getClass()}") } if (!MY_TYPE.equals(node.getClassNode()) || !(parent instanceof ClassNode)) { - return; + return } - ClassNode cNode = (ClassNode) parent; - + ClassNode cNode = (ClassNode) parent def dirtyCheckingTransformer = new DirtyCheckingTransformer() dirtyCheckingTransformer.compilationUnit = compilationUnit diff --git a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/DirtyCheckingTransformer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/DirtyCheckingTransformer.groovy index e414a48475f..752298a5639 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/DirtyCheckingTransformer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/DirtyCheckingTransformer.groovy @@ -19,11 +19,19 @@ package org.grails.compiler.gorm -import grails.gorm.dirty.checking.DirtyCheck -import grails.gorm.dirty.checking.DirtyCheckedProperty +import java.lang.reflect.Modifier + import groovy.transform.CompilationUnitAware import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.* +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassHelper +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.FieldNode +import org.codehaus.groovy.ast.GenericsType +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.Parameter +import org.codehaus.groovy.ast.PropertyNode +import org.codehaus.groovy.ast.Variable import org.codehaus.groovy.ast.expr.ConstantExpression import org.codehaus.groovy.ast.expr.ListExpression import org.codehaus.groovy.ast.expr.MethodCallExpression @@ -33,19 +41,37 @@ import org.codehaus.groovy.classgen.GeneratorContext import org.codehaus.groovy.control.CompilationUnit import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.sc.StaticCompilationVisitor + +import org.springframework.validation.annotation.Validated + +import grails.gorm.dirty.checking.DirtyCheck +import grails.gorm.dirty.checking.DirtyCheckedProperty import org.grails.datastore.mapping.dirty.checking.DirtyCheckable import org.grails.datastore.mapping.model.config.GormProperties import org.grails.datastore.mapping.reflect.AstUtils import org.grails.datastore.mapping.reflect.ClassUtils import org.grails.datastore.mapping.reflect.NameUtils import org.grails.datastore.mapping.reflect.ReflectionUtils -import org.springframework.validation.annotation.Validated -import java.lang.reflect.Modifier - -import static java.lang.reflect.Modifier.* -import static org.codehaus.groovy.ast.tools.GeneralUtils.* -import static org.grails.datastore.mapping.reflect.AstUtils.* +import static java.lang.reflect.Modifier.PUBLIC +import static java.lang.reflect.Modifier.isFinal +import static java.lang.reflect.Modifier.isTransient +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.param +import static org.codehaus.groovy.ast.tools.GeneralUtils.params +import static org.codehaus.groovy.ast.tools.GeneralUtils.propX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.grails.datastore.mapping.reflect.AstUtils.OBJECT_CLASS_NODE +import static org.grails.datastore.mapping.reflect.AstUtils.ZERO_PARAMETERS +import static org.grails.datastore.mapping.reflect.AstUtils.addAnnotationIfNecessary +import static org.grails.datastore.mapping.reflect.AstUtils.hasAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.isDomainClass /** * @@ -57,21 +83,22 @@ import static org.grails.datastore.mapping.reflect.AstUtils.* */ @CompileStatic class DirtyCheckingTransformer implements CompilationUnitAware { - private static final String VOID = "void"; - private static final Class[] EMPTY_JAVA_CLASS_ARRAY = []; - private static final Class[] OBJECT_CLASS_ARG = [Object.class]; + + private static final String VOID = 'void' + private static final Class[] EMPTY_JAVA_CLASS_ARRAY = [] + private static final Class[] OBJECT_CLASS_ARG = [Object] private static final ClassNode VALIDATION_CONSTRAINT_NODE - public static final String METHOD_NAME_MARK_DIRTY = "markDirty" + public static final String METHOD_NAME_MARK_DIRTY = 'markDirty' public static final ConstantExpression CONSTANT_NULL = new ConstantExpression(null) public static final ClassNode DIRTY_CHECKED_PROPERTY_CLASS_NODE = ClassHelper.make(DirtyCheckedProperty) public static final ClassNode DIRTY_CHECK_CLASS_NODE = ClassHelper.make(DirtyCheck) public static final AnnotationNode DIRTY_CHECKED_PROPERTY_ANNOTATION_NODE = new AnnotationNode(DIRTY_CHECKED_PROPERTY_CLASS_NODE) static { - if(ClassUtils.isPresent("jakarta.validation.Constraint")) { + if (ClassUtils.isPresent('jakarta.validation.Constraint')) { try { - VALIDATION_CONSTRAINT_NODE = ClassHelper.make(Class.forName("jakarta.validation.Constraint")) + VALIDATION_CONSTRAINT_NODE = ClassHelper.make(Class.forName('jakarta.validation.Constraint')) } catch (Throwable e) { VALIDATION_CONSTRAINT_NODE = null } @@ -81,7 +108,6 @@ class DirtyCheckingTransformer implements CompilationUnitAware { } } - protected CompilationUnit compilationUnit void setCompilationUnit(CompilationUnit compilationUnit) { @@ -95,8 +121,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { if (traitToInject != DirtyCheckable) { changeTrackableClassNode.setSuperClass(new ClassNode(DirtyCheckable).getPlainNodeReference()) } - final MethodNode markDirtyMethodNode = changeTrackableClassNode.getMethod(METHOD_NAME_MARK_DIRTY, new Parameter(ClassHelper.STRING_TYPE, "propertyName"), new Parameter(ClassHelper.OBJECT_TYPE, "newValue")) - + final MethodNode markDirtyMethodNode = changeTrackableClassNode.getMethod(METHOD_NAME_MARK_DIRTY, new Parameter(ClassHelper.STRING_TYPE, 'propertyName'), new Parameter(ClassHelper.OBJECT_TYPE, 'newValue')) ClassNode superClass = classNode.getSuperClass() boolean shouldWeave = superClass.equals(OBJECT_CLASS_NODE) @@ -105,28 +130,28 @@ class DirtyCheckingTransformer implements CompilationUnitAware { if (traitToInject != DirtyCheckable) { dirtyCheckableTrait.setSuperClass(new ClassNode(DirtyCheckable).getPlainNodeReference()) } - - while(!shouldWeave) { - if(isDomainClass(superClass) || !superClass.getAnnotations(DIRTY_CHECK_CLASS_NODE).isEmpty()) { + + while (!shouldWeave) { + if (isDomainClass(superClass) || !superClass.getAnnotations(DIRTY_CHECK_CLASS_NODE).isEmpty()) { break } superClass = superClass.getSuperClass() - if(superClass == null || superClass.equals(OBJECT_CLASS_NODE)) { + if (superClass == null || superClass.equals(OBJECT_CLASS_NODE)) { shouldWeave = true break } } - if(shouldWeave ) { + if (shouldWeave) { classNode.addInterface(dirtyCheckableTrait) - if(compilationUnit != null) { - org.codehaus.groovy.transform.trait.TraitComposer.doExtendTraits(classNode, source, compilationUnit); + if (compilationUnit != null) { + org.codehaus.groovy.transform.trait.TraitComposer.doExtendTraits(classNode, source, compilationUnit) } } - PropertyNode transientPropertyNode = classNode.getProperty("transients") + PropertyNode transientPropertyNode = classNode.getProperty('transients') // Now we go through all the properties, if the property is a persistent property and change tracking has been initiated then we add to the setter of the property // code that will mark the property as dirty. Note that if the property has no getter we have to add one, since only adding the setter results in a read-only property @@ -137,7 +162,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { for (MethodNode mn in classNode.methods) { final methodName = mn.name - if(!mn.isPublic() || mn.isStatic() || mn.isSynthetic() || mn.isAbstract()) continue + if (!mn.isPublic() || mn.isStatic() || mn.isSynthetic() || mn.isAbstract()) continue if (isSetter(methodName, mn)) { String propertyName = NameUtils.getPropertyNameForGetterOrSetter(methodName) @@ -148,7 +173,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { // if there are any jakarta.validation constraints present def annotationNodes = mn.annotations - if(!isJavaValidateable && isAnnotatedWithJavaValidationApi(annotationNodes)) { + if (!isJavaValidateable && isAnnotatedWithJavaValidationApi(annotationNodes)) { addAnnotationIfNecessary(classNode, Validated) isJavaValidateable = true } @@ -162,13 +187,13 @@ class DirtyCheckingTransformer implements CompilationUnitAware { for (PropertyNode pn in propertyNodes) { final propertyName = pn.name if (!pn.isStatic() && pn.isPublic() && !NameUtils.isConfigurational(propertyName)) { - if(isTransient(pn.modifiers) || isDefinedInTransientsNode(propertyName, transientPropertyNode) || isFinal(pn.modifiers)) continue + if (isTransient(pn.modifiers) || isDefinedInTransientsNode(propertyName, transientPropertyNode) || isFinal(pn.modifiers)) continue // don't dirty check id or version - if(propertyName == GormProperties.IDENTITY) { + if (propertyName == GormProperties.IDENTITY) { continue } - else if(propertyName == GormProperties.VERSION) { + else if (propertyName == GormProperties.VERSION) { hasVersion = true continue } @@ -176,17 +201,16 @@ class DirtyCheckingTransformer implements CompilationUnitAware { final GetterAndSetter getterAndSetter = gettersAndSetters[propertyName] final FieldNode propertyField = pn.getField() final List allAnnotationNodes = pn.annotations + propertyField.annotations - if(getterAndSetter?.getter != null) { + if (getterAndSetter?.getter != null) { allAnnotationNodes.addAll(getterAndSetter.getter.annotations) } - - if(hasAnnotation(allAnnotationNodes, GormEntityTransformation.JPA_ID_ANNOTATION_NODE)) { - if(!propertyName.equals(GormProperties.IDENTITY) ) { + if (hasAnnotation(allAnnotationNodes, GormEntityTransformation.JPA_ID_ANNOTATION_NODE)) { + if (!propertyName.equals(GormProperties.IDENTITY)) { // if the property is a JPA @Id but the property name is not id add a transient getter to retrieve the id called getId - if(classNode.getField(GormProperties.IDENTITY) == null && gettersAndSetters[GormProperties.IDENTITY] == null) { + if (classNode.getField(GormProperties.IDENTITY) == null && gettersAndSetters[GormProperties.IDENTITY] == null) { def getIdMethod = new MethodNode( - "getId", + 'getId', Modifier.PUBLIC, pn.type.plainNodeReference, ZERO_PARAMETERS, @@ -201,12 +225,12 @@ class DirtyCheckingTransformer implements CompilationUnitAware { // skip dirty checking for JPA @Id continue } - if(hasAnnotation( allAnnotationNodes, GormEntityTransformation.JPA_VERSION_ANNOTATION_NODE)) { + if (hasAnnotation(allAnnotationNodes, GormEntityTransformation.JPA_VERSION_ANNOTATION_NODE)) { hasVersion = true // if the property is a JPA @Version but the property name is not version add a transient getter to retrieve the version called getVersion - if(classNode.getField(GormProperties.VERSION) == null && gettersAndSetters[GormProperties.VERSION] == null) { + if (classNode.getField(GormProperties.VERSION) == null && gettersAndSetters[GormProperties.VERSION] == null) { def getVersionMethod = new MethodNode( - "getVersion", + 'getVersion', Modifier.PUBLIC, pn.type.plainNodeReference, ZERO_PARAMETERS, @@ -221,14 +245,13 @@ class DirtyCheckingTransformer implements CompilationUnitAware { } // if there is no explicit getter and setter then one will be generated by Groovy, so we must add these to track changes - if(getterAndSetter == null) { + if (getterAndSetter == null) { - if(!isJavaValidateable && isAnnotatedWithJavaValidationApi(allAnnotationNodes)) { + if (!isJavaValidateable && isAnnotatedWithJavaValidationApi(allAnnotationNodes)) { addAnnotationIfNecessary(classNode, Validated) isJavaValidateable = true } - // first add the getter ClassNode returnType = resolvePropertyReturnType(pn, classNode) boolean booleanProperty = ClassHelper.boolean_TYPE.getName().equals(returnType.getName()) || ClassHelper.Boolean_TYPE.getName().equals(returnType.getName()) @@ -236,7 +259,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { String getterName = NameUtils.getGetterName(propertyName, false) MethodNode getter = classNode.getMethod(getterName, ZERO_PARAMETERS) - if(getter == null) { + if (getter == null) { getter = classNode.addMethod(getterName, PUBLIC, returnType, ZERO_PARAMETERS, null, returnS(varX(fieldName))) @@ -244,7 +267,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { staticCompilationVisitor.visitMethod( getter ) - if(booleanProperty) { + if (booleanProperty) { classNode.addMethod(NameUtils.getGetterName(propertyName, true), PUBLIC, returnType, ZERO_PARAMETERS, null, returnS(varX(fieldName))) } } @@ -253,18 +276,18 @@ class DirtyCheckingTransformer implements CompilationUnitAware { // void setFoo(String foo) { markDirty("foo", foo); this.foo = foo } addDirtyCheckingSetter(classNode, propertyName, fieldName, returnType, markDirtyMethodNode, staticCompilationVisitor) } - else if(getterAndSetter.hasBoth()) { + else if (getterAndSetter.hasBoth()) { // if both a setter and getter are present, we get hold of the setter and weave the markDirty method call into it weaveIntoExistingSetter(propertyName, getterAndSetter, markDirtyMethodNode) gettersAndSetters.remove(propertyName) } else { - if(getterAndSetter.setter != null) { + if (getterAndSetter.setter != null) { weaveIntoExistingSetter(propertyName, getterAndSetter, markDirtyMethodNode) // there isn't both a getter and a setter then this is not a candidate for persistence, so we eliminate it from change tracking gettersAndSetters.remove(propertyName) } - else if(getterAndSetter.getter != null) { + else if (getterAndSetter.getter != null) { String fieldName = propertyField.getName() ClassNode returnType = resolvePropertyReturnType(pn, classNode) addDirtyCheckingSetter(classNode, propertyName, fieldName, returnType, markDirtyMethodNode, staticCompilationVisitor) @@ -276,10 +299,10 @@ class DirtyCheckingTransformer implements CompilationUnitAware { } } - if(!hasVersion && ClassUtils.isPresent("grails.artefact.Artefact") && !classNode.getAnnotations(GormEntityTransformation.JPA_ENTITY_CLASS_NODE).isEmpty()) { + if (!hasVersion && ClassUtils.isPresent('grails.artefact.Artefact') && !classNode.getAnnotations(GormEntityTransformation.JPA_ENTITY_CLASS_NODE).isEmpty()) { // if the entity is a JPA and has no version property then add a transient one as a stub, this is more to satisfy Grails def getVersionMethod = new MethodNode( - "getVersion", + 'getVersion', Modifier.PUBLIC, ClassHelper.make(Long), ZERO_PARAMETERS, @@ -292,7 +315,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { // We also need to search properties that are represented as getters with setters. This requires going through all the methods and finding getter/setter pairs that are public gettersAndSetters.each { String propertyName, GetterAndSetter getterAndSetter -> - if(!NameUtils.isConfigurational(propertyName) && getterAndSetter.hasBoth()) { + if (!NameUtils.isConfigurational(propertyName) && getterAndSetter.hasBoth()) { weaveIntoExistingSetter(propertyName, getterAndSetter, markDirtyMethodNode) } } @@ -320,7 +343,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { if (ClassHelper.isPrimitiveType(originalReturnType.redirect())) { returnType = originalReturnType.getPlainNodeReference() } else { - returnType = alignReturnType(classNode, originalReturnType); + returnType = alignReturnType(classNode, originalReturnType) } } else { returnType = originalReturnType @@ -336,7 +359,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { final BlockStatement setterBody = new BlockStatement() MethodCallExpression markDirtyMethodCall = createMarkDirtyMethodCall(markDirtyMethodNode, propertyName, setterParameter) setterBody.addStatement(stmt(markDirtyMethodCall)) - setterBody.addStatement(assignS(propX(varX("this"), fieldName), varX(setterParameter))) + setterBody.addStatement(assignS(propX(varX('this'), fieldName), varX(setterParameter))) setter = classNode.addMethod(setterName, PUBLIC, ClassHelper.VOID_TYPE, params(setterParameter), null, setterBody) setter.addAnnotation(DIRTY_CHECKED_PROPERTY_ANNOTATION_NODE) @@ -351,7 +374,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { } void performInjection(SourceUnit source, GeneratorContext context, ClassNode classNode) { - if (classNode.annotations.any { AnnotationNode an -> an.classNode.name == 'grails.artefact.Artefact'}) return; + if (classNode.annotations.any { AnnotationNode an -> an.classNode.name == 'grails.artefact.Artefact' }) return performInjectionOnAnnotatedClass(source, classNode) } @@ -360,31 +383,30 @@ class DirtyCheckingTransformer implements CompilationUnitAware { performInjection(source, null, classNode) } - public boolean shouldInject(URL url) { - return AstUtils.isDomainClass(url); + boolean shouldInject(URL url) { + return AstUtils.isDomainClass(url) } void performInjectionOnAnnotatedEntity(ClassNode classNode) { performInjectionOnAnnotatedClass(null, classNode) } - private static ClassNode alignReturnType(final ClassNode receiver, final ClassNode originalReturnType) { ClassNode copiedReturnType - if(originalReturnType.isGenericsPlaceHolder()) { - copiedReturnType = originalReturnType.getPlainNodeReference(); - copiedReturnType.setName( originalReturnType.getName() ) + if (originalReturnType.isGenericsPlaceHolder()) { + copiedReturnType = originalReturnType.getPlainNodeReference() + copiedReturnType.setName(originalReturnType.getName()) copiedReturnType.setGenericsPlaceHolder(true) } else { - copiedReturnType = originalReturnType.getPlainNodeReference(); + copiedReturnType = originalReturnType.getPlainNodeReference() } final genericTypes = originalReturnType.getGenericsTypes() if (genericTypes) { List newGenericTypes = [] - for(GenericsType gt in genericTypes) { + for (GenericsType gt in genericTypes) { ClassNode[] upperBounds = null if (gt.upperBounds) { upperBounds = gt.upperBounds.collect { ClassNode cn -> cn.plainNodeReference } as ClassNode[] @@ -397,9 +419,9 @@ class DirtyCheckingTransformer implements CompilationUnitAware { } protected void weaveIntoExistingSetter(String propertyName, GetterAndSetter getterAndSetter, MethodNode markDirtyMethodNode) { final MethodNode setterMethod = getterAndSetter.setter - if(setterMethod.annotations.any { AnnotationNode an -> an.classNode.name == 'grails.persistence.PersistenceMethod'} ) return + if (setterMethod.annotations.any { AnnotationNode an -> an.classNode.name == 'grails.persistence.PersistenceMethod' }) return - if(!setterMethod.getAnnotations(DIRTY_CHECKED_PROPERTY_CLASS_NODE)) { + if (!setterMethod.getAnnotations(DIRTY_CHECKED_PROPERTY_CLASS_NODE)) { setterMethod.addAnnotation(DIRTY_CHECKED_PROPERTY_ANNOTATION_NODE) } else { @@ -407,14 +429,14 @@ class DirtyCheckingTransformer implements CompilationUnitAware { return } MethodNode getter = getterAndSetter.getter - if(getter != null && !getter.getAnnotations(DIRTY_CHECKED_PROPERTY_CLASS_NODE)) { + if (getter != null && !getter.getAnnotations(DIRTY_CHECKED_PROPERTY_CLASS_NODE)) { getter.addAnnotation(DIRTY_CHECKED_PROPERTY_ANNOTATION_NODE) } final currentBody = setterMethod.code final setterParameter = setterMethod.getParameters()[0] MethodCallExpression markDirtyMethodCall = createMarkDirtyMethodCall(markDirtyMethodNode, propertyName, setterParameter) final newBody = block( - stmt( markDirtyMethodCall ), + stmt(markDirtyMethodCall), currentBody ) setterMethod.code = newBody @@ -422,7 +444,7 @@ class DirtyCheckingTransformer implements CompilationUnitAware { protected MethodCallExpression createMarkDirtyMethodCall(MethodNode markDirtyMethodNode, String propertyName, Variable value) { def args = args(constX(propertyName), varX(value)) - final markDirtyMethodCall = callX(varX("this"), markDirtyMethodNode.name, args) + final markDirtyMethodCall = callX(varX('this'), markDirtyMethodNode.name, args) markDirtyMethodCall.methodTarget = markDirtyMethodNode return markDirtyMethodCall } @@ -436,18 +458,16 @@ class DirtyCheckingTransformer implements CompilationUnitAware { return getterAndSetter } - - private boolean isSetter(String methodName, MethodNode declaredMethod) { - return declaredMethod.getParameters().length == 1 && ReflectionUtils.isSetter(methodName, OBJECT_CLASS_ARG); + return declaredMethod.getParameters().length == 1 && ReflectionUtils.isSetter(methodName, OBJECT_CLASS_ARG) } private boolean isGetter(String methodName, MethodNode declaredMethod) { - return declaredMethod.getParameters().length == 0 && ReflectionUtils.isGetter(methodName, EMPTY_JAVA_CLASS_ARRAY); + return declaredMethod.getParameters().length == 0 && ReflectionUtils.isGetter(methodName, EMPTY_JAVA_CLASS_ARRAY) } String[] getArtefactTypes() { - return ["Domain"] as String[]; + return ['Domain'] as String[] } @CompileStatic diff --git a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GlobalJpaEntityTransform.groovy b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GlobalJpaEntityTransform.groovy index d66e0410a4f..1b3d00a42a7 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GlobalJpaEntityTransform.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GlobalJpaEntityTransform.groovy @@ -21,7 +21,6 @@ package org.grails.compiler.gorm import groovy.transform.CompilationUnitAware import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode @@ -32,9 +31,11 @@ import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.AbstractASTTransformation import org.codehaus.groovy.transform.GroovyASTTransformation +import org.codehaus.groovy.transform.TransformWithPriority import jakarta.persistence.Entity -import org.codehaus.groovy.transform.TransformWithPriority + +import org.apache.grails.common.compiler.GroovyTransformOrder /** * Makes all entities annotated with @Entity JPA into GORM entities @@ -50,15 +51,15 @@ class GlobalJpaEntityTransform extends AbstractASTTransformation implements ASTT @Override void visit(ASTNode[] astNodes, SourceUnit source) { - ModuleNode ast = source.getAST(); - List classes = ast.getClasses(); + ModuleNode ast = source.getAST() + List classes = ast.getClasses() for (ClassNode aClass : classes) { visitClass(aClass, source) } } void visitClass(ClassNode classNode, SourceUnit source) { - if(hasAnnotation(classNode, ClassHelper.make(Entity))) { + if (hasAnnotation(classNode, ClassHelper.make(Entity))) { def jpaEntityTransformation = new JpaGormEntityTransformation() jpaEntityTransformation.compilationUnit = compilationUnit jpaEntityTransformation.visit(classNode, source) diff --git a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTraitProvider.groovy b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTraitProvider.groovy index 5b712dc8e95..70f52f6a6a1 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTraitProvider.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTraitProvider.groovy @@ -32,4 +32,4 @@ interface GormEntityTraitProvider { * @return Whether this trait provided is available */ boolean isAvailable() -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTransformation.groovy index f11bda27d5a..451f66d23ba 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/GormEntityTransformation.groovy @@ -18,12 +18,13 @@ */ package org.grails.compiler.gorm -import grails.gorm.annotation.Entity +import java.lang.annotation.Annotation +import java.lang.reflect.Modifier + import groovy.transform.CompilationUnitAware import groovy.transform.CompileStatic import groovy.transform.Memoized import groovy.transform.ToString -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.ast.AnnotatedNode import org.codehaus.groovy.ast.AnnotationNode @@ -51,7 +52,6 @@ import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.ExpressionStatement import org.codehaus.groovy.ast.stmt.ReturnStatement import org.codehaus.groovy.ast.stmt.Statement -import org.codehaus.groovy.ast.tools.GeneralUtils import org.codehaus.groovy.control.CompilationUnit import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit @@ -59,6 +59,16 @@ import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.AbstractASTTransformation import org.codehaus.groovy.transform.GroovyASTTransformation import org.codehaus.groovy.transform.TransformWithPriority + +import jakarta.persistence.Embeddable +import jakarta.persistence.Id +import jakarta.persistence.ManyToMany +import jakarta.persistence.OneToMany +import jakarta.persistence.Transient +import jakarta.persistence.Version + +import grails.gorm.annotation.Entity +import org.apache.grails.common.compiler.GroovyTransformOrder import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.GormEntity import org.grails.datastore.gorm.GormEntityDirtyCheckable @@ -67,16 +77,12 @@ import org.grails.datastore.mapping.model.config.GormProperties import org.grails.datastore.mapping.reflect.AstUtils import org.grails.datastore.mapping.reflect.ClassUtils import org.grails.datastore.mapping.reflect.NameUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* -import jakarta.persistence.Embeddable -import jakarta.persistence.Id -import jakarta.persistence.ManyToMany -import jakarta.persistence.OneToMany -import jakarta.persistence.Transient -import jakarta.persistence.Version -import java.lang.annotation.Annotation -import java.lang.reflect.Modifier +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS /** * An AST transformation that adds the following features:

@@ -94,22 +100,23 @@ import java.lang.reflect.Modifier @CompileStatic @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) class GormEntityTransformation extends AbstractASTTransformation implements CompilationUnitAware, ASTTransformation, TransformWithPriority { - private static final ClassNode MY_TYPE = new ClassNode(Entity.class); + + private static final ClassNode MY_TYPE = new ClassNode(Entity) protected static final ClassNode JPA_ENTITY_CLASS_NODE = ClassHelper.make(jakarta.persistence.Entity) public static final AnnotationNode JPA_ENTITY_ANNOTATION_NODE = new AnnotationNode(JPA_ENTITY_CLASS_NODE) public static final AnnotationNode JPA_VERSION_ANNOTATION_NODE = new AnnotationNode(ClassHelper.make(Version)) public static final AnnotationNode JPA_ID_ANNOTATION_NODE = new AnnotationNode(ClassHelper.make(Id)) public static final AnnotationNode JPA_TRANSIENT_ANNOTATION_NODE = new AnnotationNode(ClassHelper.make(Transient)) - private static final String CREATE_NAMED_QUERY = "createNamedQuery" + private static final String CREATE_NAMED_QUERY = 'createNamedQuery' private static ClassNode GORM_ENTITY_CLASS_NODE = ClassHelper.make(GormEntity) - private static MethodNode ADD_TO_METHOD_NODE = GORM_ENTITY_CLASS_NODE.getMethods("addTo").get(0) - private static MethodNode REMOVE_FROM_METHOD_NODE = GORM_ENTITY_CLASS_NODE.getMethods("removeFrom").get(0) - private static MethodNode GET_ASSOCIATION_ID_METHOD_NODE = GORM_ENTITY_CLASS_NODE.getMethods("getAssociationId").get(0) - public static final Parameter[] ADD_TO_PARAMETERS = [new Parameter(AstUtils.OBJECT_CLASS_NODE, "obj")] as Parameter[] + private static MethodNode ADD_TO_METHOD_NODE = GORM_ENTITY_CLASS_NODE.getMethods('addTo').get(0) + private static MethodNode REMOVE_FROM_METHOD_NODE = GORM_ENTITY_CLASS_NODE.getMethods('removeFrom').get(0) + private static MethodNode GET_ASSOCIATION_ID_METHOD_NODE = GORM_ENTITY_CLASS_NODE.getMethods('getAssociationId').get(0) + public static final Parameter[] ADD_TO_PARAMETERS = [new Parameter(AstUtils.OBJECT_CLASS_NODE, 'obj')] as Parameter[] public static final ClassNode SERIALIZABLE_CLASS_NODE = ClassHelper.make(Serializable).getPlainNodeReference() - private static final Object APPLIED_MARKER = new Object(); - private static final ListExpression IGNORED_PROPERTIES = new ListExpression(); + private static final Object APPLIED_MARKER = new Object() + private static final ListExpression IGNORED_PROPERTIES = new ListExpression() static { IGNORED_PROPERTIES.addExpression(constX(GormProperties.DIRTY_PROPERTY_NAMES)) @@ -121,7 +128,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp IGNORED_PROPERTIES.addExpression(constX(GormProperties.META_CLASS)) IGNORED_PROPERTIES.addExpression(constX(GormProperties.TENANT_IDENTITY)) // GORM for mongodb ignores - IGNORED_PROPERTIES.addExpression(constX("dbo")) + IGNORED_PROPERTIES.addExpression(constX('dbo')) } protected CompilationUnit compilationUnit @@ -132,18 +139,18 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp @Override void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { - AnnotatedNode parent = (AnnotatedNode) astNodes[1]; - AnnotationNode node = (AnnotationNode) astNodes[0]; + AnnotatedNode parent = (AnnotatedNode) astNodes[1] + AnnotationNode node = (AnnotationNode) astNodes[0] if (!(astNodes[0] instanceof AnnotationNode) || !(astNodes[1] instanceof AnnotatedNode)) { - throw new RuntimeException("Internal error: wrong types: ${node.getClass()} / ${parent.getClass()}"); + throw new RuntimeException("Internal error: wrong types: ${node.getClass()} / ${parent.getClass()}") } if (!MY_TYPE.equals(node.getClassNode()) || !(parent instanceof ClassNode)) { - return; + return } - ClassNode cNode = (ClassNode) parent; + ClassNode cNode = (ClassNode) parent visit(cNode, sourceUnit) } @@ -170,7 +177,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp classNode.setUsingGenerics(true) if (!isJpaEntity) { - AstUtils.addAnnotationIfNecessary(classNode, Entity.class) + AstUtils.addAnnotationIfNecessary(classNode, Entity) try { AstUtils.addAnnotationIfNecessary(classNode, (Class) getClass().classLoader.loadClass('grails.persistence.Entity')) } catch (Throwable e) { @@ -185,11 +192,11 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp // Add the Jackson @JsonIgnoreProperties if Jackson is present // Add @JsonIgnoreProperties(['dirtyPropertyNames', 'errors', 'dirty', 'attached', 'version']) - if (ClassUtils.isPresent("com.fasterxml.jackson.annotation.JsonIgnoreProperties")) { + if (ClassUtils.isPresent('com.fasterxml.jackson.annotation.JsonIgnoreProperties')) { AnnotationNode ignorePropertiesAnn = AstUtils.addAnnotationOrGetExisting(classNode, (Class) getClass().classLoader.loadClass('com.fasterxml.jackson.annotation.JsonIgnoreProperties')) - Expression existing = ignorePropertiesAnn.getMember("value") + Expression existing = ignorePropertiesAnn.getMember('value') if (existing == null) { - ignorePropertiesAnn.setMember("value", IGNORED_PROPERTIES) + ignorePropertiesAnn.setMember('value', IGNORED_PROPERTIES) } else { if (existing instanceof ListExpression) { ListExpression listExpression = (ListExpression) existing @@ -200,8 +207,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp } } - - def rxEntityClassNode = AstUtils.findInterface(classNode, "grails.gorm.rx.RxEntity") + def rxEntityClassNode = AstUtils.findInterface(classNode, 'grails.gorm.rx.RxEntity') boolean isRxEntity = rxEntityClassNode != null if (!isJpaEntity) { @@ -228,9 +234,9 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp def classGormEntityTrait = pickGormEntityTrait(classNode, sourceUnit) AstUtils.injectTrait(classNode, classGormEntityTrait) } else { - addToMethodNode = rxEntityClassNode.getMethods("addTo").get(0) - removeFromMethodNode = rxEntityClassNode.getMethods("removeFrom").get(0) - getAssociationMethodNode = rxEntityClassNode.getMethods("getAssociationId").get(0) + addToMethodNode = rxEntityClassNode.getMethods('addTo').get(0) + removeFromMethodNode = rxEntityClassNode.getMethods('removeFrom').get(0) + getAssociationMethodNode = rxEntityClassNode.getMethods('getAssociationId').get(0) } // inject associations @@ -244,13 +250,12 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp def dirtyCheckTransformer = new DirtyCheckingTransformer() dirtyCheckTransformer.performInjectionOnAnnotatedClass(sourceUnit, classNode, GormEntityDirtyCheckable) - // convert the methodMissing and propertyMissing implementations to $static_methodMissing and $static_propertyMissing for the static versions def methodMissingBody = new BlockStatement() - def methodNameParam = new Parameter(ClassHelper.make(String), "name") - def methodArgsParam = new Parameter(AstUtils.OBJECT_CLASS_NODE, "args") + def methodNameParam = new Parameter(ClassHelper.make(String), 'name') + def methodArgsParam = new Parameter(AstUtils.OBJECT_CLASS_NODE, 'args') def methodMissingArgs = new ArgumentListExpression(methodNameParam, methodArgsParam) - def methodMissingMethodCall = new MethodCallExpression(new VariableExpression("this"), "staticMethodMissing", methodMissingArgs) + def methodMissingMethodCall = new MethodCallExpression(new VariableExpression('this'), 'staticMethodMissing', methodMissingArgs) methodMissingBody.addStatement( new ExpressionStatement(methodMissingMethodCall) ) @@ -258,13 +263,12 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp def methodMissingParameters = [methodNameParam, methodArgsParam] as Parameter[] classNode.addMethod('$static_methodMissing', Modifier.PUBLIC | Modifier.STATIC, AstUtils.OBJECT_CLASS_NODE, methodMissingParameters, null, methodMissingBody) - // $static_propertyMissing setter def propertyMissingSetBody = new BlockStatement() - def propertyMissingSetNameParam = new Parameter(ClassHelper.make(String), "name") - def propertyMissingSetValueParam = new Parameter(AstUtils.OBJECT_CLASS_NODE, "value") + def propertyMissingSetNameParam = new Parameter(ClassHelper.make(String), 'name') + def propertyMissingSetValueParam = new Parameter(AstUtils.OBJECT_CLASS_NODE, 'value') def propertyMissingSetArgs = new ArgumentListExpression(propertyMissingSetNameParam, propertyMissingSetValueParam) - def propertyMissingSetMethodCall = new MethodCallExpression(new VariableExpression("this"), "staticPropertyMissing", propertyMissingSetArgs) + def propertyMissingSetMethodCall = new MethodCallExpression(new VariableExpression('this'), 'staticPropertyMissing', propertyMissingSetArgs) propertyMissingSetBody.addStatement( new ExpressionStatement(propertyMissingSetMethodCall) ) @@ -273,16 +277,15 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp // $static_propertyMissing getter def propertyMissingGetBody = new BlockStatement() - def propertyMissingGetNameParam = new Parameter(ClassHelper.make(String), "name") + def propertyMissingGetNameParam = new Parameter(ClassHelper.make(String), 'name') def propertyMissingGetArgs = new ArgumentListExpression(propertyMissingGetNameParam) - def propertyMissingGetMethodCall = new MethodCallExpression(new VariableExpression("this"), "staticPropertyMissing", propertyMissingGetArgs) + def propertyMissingGetMethodCall = new MethodCallExpression(new VariableExpression('this'), 'staticPropertyMissing', propertyMissingGetArgs) propertyMissingGetBody.addStatement( new ExpressionStatement(propertyMissingGetMethodCall) ) def propertyMissingGetParameters = [propertyMissingGetNameParam] as Parameter[] classNode.addMethod('$static_propertyMissing', Modifier.PUBLIC | Modifier.STATIC, AstUtils.OBJECT_CLASS_NODE, propertyMissingGetParameters, null, propertyMissingGetBody) - // now process named query associations // see https://docs.grails.org/latest/ref/Domain%20Classes/namedQueries.html @@ -323,7 +326,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp final Map parameterNameToParameterValue = new LinkedHashMap() if (genericsTypes != null) { for (GenericsType gt : genericsTypes) { - parameterNameToParameterValue.put(gt.getName(), thisClassNode.getPlainNodeReference()); + parameterNameToParameterValue.put(gt.getName(), thisClassNode.getPlainNodeReference()) } } AstUtils.replaceGenericsPlaceholders(queryOperationsClassNode, parameterNameToParameterValue) @@ -372,7 +375,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp } if (compilationUnit != null && !isRxEntity) { - org.codehaus.groovy.transform.trait.TraitComposer.doExtendTraits(classNode, sourceUnit, compilationUnit); + org.codehaus.groovy.transform.trait.TraitComposer.doExtendTraits(classNode, sourceUnit, compilationUnit) } classNode.putNodeMetaData(AstUtils.TRANSFORM_APPLIED_MARKER, APPLIED_MARKER) } @@ -380,7 +383,6 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp protected Class pickGormEntityTrait(ClassNode classNode, SourceUnit source) { def classLoader = getClass().classLoader - // first try the `mapWithValue` def mapWith = AstUtils.getPropertyFromHierarchy(classNode, GormProperties.MAPPING_STRATEGY) String mapWithValue = mapWith?.initialExpression?.text @@ -395,7 +397,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp } else { if (mapWithValue == null) { if (allTraitProviders.size() > 1) { - AstUtils.warning(source, classNode, "There are multiple GORM implementations on the classpath. GORM cannot choose automatically which implementation to use. Please use 'mapWith' on your entity to avoid this conflict and warning.") + AstUtils.warning(source, classNode, 'There are multiple GORM implementations on the classpath. GORM cannot choose automatically which implementation to use. Please use \'mapWith\' on your entity to avoid this conflict and warning.') gormEntityTrait = GormEntity } else { gormEntityTrait = allTraitProviders.get(0).entityTrait @@ -437,7 +439,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp @Memoized private boolean isHibernatePresent(ClassLoader classLoader) { try { - return Class.forName("org.hibernate.Hibernate", false, classLoader) != null + return Class.forName('org.hibernate.Hibernate', false, classLoader) != null } catch (Throwable e) { return false } @@ -447,19 +449,19 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp final boolean hasVersion = AstUtils.hasOrInheritsProperty(classNode, GormProperties.VERSION) if (!hasVersion) { - ClassNode parent = AstUtils.getFurthestUnresolvedParent(classNode); - parent.addProperty(GormProperties.VERSION, Modifier.PUBLIC, new ClassNode(Long.class), null, null, null); + ClassNode parent = AstUtils.getFurthestUnresolvedParent(classNode) + parent.addProperty(GormProperties.VERSION, Modifier.PUBLIC, new ClassNode(Long), null, null, null) } } protected void injectIdProperty(ClassNode classNode) { - final boolean hasId = AstUtils.hasOrInheritsProperty(classNode, GormProperties.IDENTITY); + final boolean hasId = AstUtils.hasOrInheritsProperty(classNode, GormProperties.IDENTITY) if (!hasId) { // inject into furthest relative - ClassNode parent = AstUtils.getFurthestUnresolvedParent(classNode); + ClassNode parent = AstUtils.getFurthestUnresolvedParent(classNode) - parent.addProperty(GormProperties.IDENTITY, Modifier.PUBLIC, new ClassNode(Long.class), null, null, null); + parent.addProperty(GormProperties.IDENTITY, Modifier.PUBLIC, new ClassNode(Long), null, null, null) } } @@ -486,17 +488,17 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp Expression e = propertyNode.initialExpression propertiesToAdd.addAll(createPropertiesForHasManyExpression(e, classNode)) } - final boolean isBelongsToOrHasOne = name.equals(GormProperties.BELONGS_TO) || name.equals(GormProperties.HAS_ONE); + final boolean isBelongsToOrHasOne = name.equals(GormProperties.BELONGS_TO) || name.equals(GormProperties.HAS_ONE) if (isBelongsToOrHasOne) { Expression initialExpression = propertyNode.getInitialExpression() if ((!(initialExpression instanceof MapExpression)) && (!(initialExpression instanceof ClassExpression))) { if (name.equals(GormProperties.HAS_ONE)) { - final String message = "WARNING: The hasOne property in class [" + classNode.getName() + "] should have an initial expression of type Map or Class."; - System.err.println(message); + final String message = 'WARNING: The hasOne property in class [' + classNode.getName() + '] should have an initial expression of type Map or Class.' + System.err.println(message) } else if (!(initialExpression instanceof ListExpression)) { - final String message = "WARNING: The belongsTo property in class [" + classNode.getName() + "] should have an initial expression of type List, Map or Class."; - System.err.println(message); + final String message = 'WARNING: The belongsTo property in class [' + classNode.getName() + '] should have an initial expression of type List, Map or Class.' + System.err.println(message) } } propertiesToAdd.addAll(createPropertiesForBelongsToOrHasOneExpression(initialExpression, classNode)) @@ -504,7 +506,6 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp } injectAssociationProperties(classNode, propertiesToAdd) - ListExpression listExpression = getOrCreateListProperty(classNode, GormProperties.TRANSIENT) for (PropertyNode pn in classNode.getProperties()) { def type = pn.getType() @@ -545,7 +546,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp private Collection createPropertiesForBelongsToOrHasOneExpression(Expression e, ClassNode classNode) { List properties = [] if (e instanceof MapExpression) { - MapExpression me = (MapExpression) e; + MapExpression me = (MapExpression) e for (MapEntryExpression mme in me.mapEntryExpressions) { String propertyName = mme.keyExpression.text final Expression expression = mme.valueExpression @@ -556,7 +557,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp type = ClassHelper.make(expression.text) } - properties.add(new PropertyNode(propertyName, Modifier.PUBLIC, type.getPlainNodeReference(), classNode, null, null, null)); + properties.add(new PropertyNode(propertyName, Modifier.PUBLIC, type.getPlainNodeReference(), classNode, null, null, null)) } } return properties @@ -571,7 +572,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp def args = new ArgumentListExpression() args.addExpression(new ConstantExpression(propertyName)) - def methodCall = new MethodCallExpression(new VariableExpression("this"), "getAssociationId", args) + def methodCall = new MethodCallExpression(new VariableExpression('this'), 'getAssociationId', args) methodCall.setMethodTarget( getAssociationMethodNode ) @@ -587,7 +588,7 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp private void injectAssociationProperties(ClassNode classNode, List propertiesToAdd) { for (PropertyNode pn : propertiesToAdd) { if (!AstUtils.hasProperty(classNode, pn.getName())) { - classNode.addProperty(pn); + classNode.addProperty(pn) } } @@ -596,15 +597,14 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp private List createPropertiesForHasManyExpression(Expression e, ClassNode classNode) { List properties = [] if (e instanceof MapExpression) { - MapExpression me = (MapExpression) e; + MapExpression me = (MapExpression) e for (MapEntryExpression mee in me.mapEntryExpressions) { String propertyName = mee.keyExpression.text addAssociationForKey(propertyName, properties, classNode, findPropertyType(mee.valueExpression)) } - } - return properties; + return properties } private void addRelationshipManagementMethods(String propertyName, ClassNode classNode, MethodNode addToMethodNode, MethodNode removeFromMethodNode) { @@ -615,9 +615,9 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp def args = new ArgumentListExpression() args.addExpression(new ConstantExpression(propertyName)) - args.addExpression(new VariableExpression("obj")) + args.addExpression(new VariableExpression('obj')) - def methodCall = new MethodCallExpression(new VariableExpression("this"), "addTo", args) + def methodCall = new MethodCallExpression(new VariableExpression('this'), 'addTo', args) methodCall.setMethodTarget( addToMethodNode ) @@ -636,9 +636,9 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp def args = new ArgumentListExpression() args.addExpression(new ConstantExpression(propertyName)) - args.addExpression(new VariableExpression("obj")) + args.addExpression(new VariableExpression('obj')) - def methodCall = new MethodCallExpression(new VariableExpression("this"), "removeFrom", args) + def methodCall = new MethodCallExpression(new VariableExpression('this'), 'removeFrom', args) methodCall.setMethodTarget( removeFromMethodNode ) @@ -658,29 +658,29 @@ class GormEntityTransformation extends AbstractASTTransformation implements Comp * @return A {@link ClassNode} of type {@link Set} that is possibly parameterized by the expression that is passed in. */ private ClassNode findPropertyType(Expression expression) { - ClassNode setNode = ClassHelper.make(Set.class).getPlainNodeReference() + ClassNode setNode = ClassHelper.make(Set).getPlainNodeReference() if (expression instanceof ClassExpression) { - setNode.setGenericsTypes([new GenericsType(AstUtils.nonGeneric(expression.type))] as GenericsType[]); + setNode.setGenericsTypes([new GenericsType(AstUtils.nonGeneric(expression.type))] as GenericsType[]) } return setNode } private void addAssociationForKey(String key, List properties, ClassNode declaringType, ClassNode propertyType) { - properties.add(new PropertyNode(key, Modifier.PUBLIC, propertyType, declaringType, null, null, null)); + properties.add(new PropertyNode(key, Modifier.PUBLIC, propertyType, declaringType, null, null, null)) } private void injectToStringMethod(ClassNode classNode) { - final boolean hasToString = AstUtils.implementsOrInheritsZeroArgMethod(classNode, "toString") - final boolean hasToStringAnnotation = AstUtils.findAnnotation(classNode, ToString.class) != null; + final boolean hasToString = AstUtils.implementsOrInheritsZeroArgMethod(classNode, 'toString') + final boolean hasToStringAnnotation = AstUtils.findAnnotation(classNode, ToString) != null final boolean isEnum = AstUtils.isEnum(classNode) if (!hasToString && !hasToStringAnnotation && !isEnum) { - GStringExpression ge = new GStringExpression(classNode.getName() + ' : ${id != null ? id : \'(unsaved)\'}'); - ge.addString(new ConstantExpression(classNode.getName() + " : ")); - VariableExpression idVariable = new VariableExpression("id"); - ge.addValue(new TernaryExpression(new BooleanExpression(idVariable), idVariable, new ConstantExpression("(unsaved)"))); - Statement s = new ReturnStatement(ge); - MethodNode mn = new MethodNode("toString", Modifier.PUBLIC, new ClassNode(String.class), new Parameter[0], new ClassNode[0], s); + GStringExpression ge = new GStringExpression(classNode.getName() + ' : ${id != null ? id : \'(unsaved)\'}') + ge.addString(new ConstantExpression(classNode.getName() + ' : ')) + VariableExpression idVariable = new VariableExpression('id') + ge.addValue(new TernaryExpression(new BooleanExpression(idVariable), idVariable, new ConstantExpression('(unsaved)'))) + Statement s = new ReturnStatement(ge) + MethodNode mn = new MethodNode('toString', Modifier.PUBLIC, new ClassNode(String), new Parameter[0], new ClassNode[0], s) classNode.addMethod(mn) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/JpaGormEntityTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/JpaGormEntityTransformation.groovy index 38a43475346..2bf087c120e 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/JpaGormEntityTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/compiler/gorm/JpaGormEntityTransformation.groovy @@ -19,19 +19,17 @@ package org.grails.compiler.gorm -import grails.gorm.annotation.Entity -import grails.gorm.annotation.JpaEntity import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.ast.AnnotatedNode import org.codehaus.groovy.ast.AnnotationNode -import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.GroovyASTTransformation -import org.grails.datastore.mapping.reflect.AstUtils + +import grails.gorm.annotation.JpaEntity +import org.apache.grails.common.compiler.GroovyTransformOrder /** * Enhanced GORM entity annotated with JPA annotations @@ -42,29 +40,30 @@ import org.grails.datastore.mapping.reflect.AstUtils @CompileStatic @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) class JpaGormEntityTransformation extends GormEntityTransformation { - private static final ClassNode MY_TYPE = new ClassNode(JpaEntity.class); + + private static final ClassNode MY_TYPE = new ClassNode(JpaEntity) @Override void visit(ASTNode[] astNodes, SourceUnit sourceUnit) { - AnnotatedNode parent = (AnnotatedNode) astNodes[1]; - AnnotationNode node = (AnnotationNode) astNodes[0]; + AnnotatedNode parent = (AnnotatedNode) astNodes[1] + AnnotationNode node = (AnnotationNode) astNodes[0] if (!(astNodes[0] instanceof AnnotationNode) || !(astNodes[1] instanceof AnnotatedNode)) { - throw new RuntimeException("Internal error: wrong types: ${node.getClass()} / ${parent.getClass()}"); + throw new RuntimeException("Internal error: wrong types: ${node.getClass()} / ${parent.getClass()}") } if (!MY_TYPE.equals(node.getClassNode()) || !(parent instanceof ClassNode)) { - return; + return } - ClassNode cNode = (ClassNode) parent; + ClassNode cNode = (ClassNode) parent visit(cNode, sourceUnit) } @Override void visit(ClassNode classNode, SourceUnit sourceUnit) { - if(!hasAnnotation(classNode, JPA_ENTITY_CLASS_NODE)) { + if (!hasAnnotation(classNode, JPA_ENTITY_CLASS_NODE)) { classNode.addAnnotation(JPA_ENTITY_ANNOTATION_NODE) } super.visit(classNode, sourceUnit) diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/AbstractDatastoreApi.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/AbstractDatastoreApi.groovy index 90c1d3ef88e..eb92f493fae 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/AbstractDatastoreApi.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/AbstractDatastoreApi.groovy @@ -18,7 +18,7 @@ */ package org.grails.datastore.gorm -import groovy.transform.CompileStatic; +import groovy.transform.CompileStatic import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.core.DatastoreUtils @@ -38,22 +38,22 @@ abstract class AbstractDatastoreApi { } protected T execute(SessionCallback callback) { - if(datastore == null) { - throw new IllegalStateException("Cannot execute session callback with null datastore") + if (datastore == null) { + throw new IllegalStateException('Cannot execute session callback with null datastore') } - DatastoreUtils.execute datastore, callback + DatastoreUtils.execute(datastore, callback) } protected void execute(VoidSessionCallback callback) { - if(datastore == null) { - throw new IllegalStateException("Cannot execute session callback with null datastore") + if (datastore == null) { + throw new IllegalStateException('Cannot execute session callback with null datastore') } - DatastoreUtils.execute datastore, callback + DatastoreUtils.execute(datastore, callback) } Datastore getDatastore() { - if(datastore == null) { - throw new IllegalStateException("No datastore configured in stateless mode") + if (datastore == null) { + throw new IllegalStateException('No datastore configured in stateless mode') } return datastore } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/AbstractGormApi.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/AbstractGormApi.groovy index a613ba251f8..c43d1665463 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/AbstractGormApi.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/AbstractGormApi.groovy @@ -18,17 +18,15 @@ */ package org.grails.datastore.gorm -import groovy.transform.CompileDynamic -import groovy.transform.CompileStatic -import groovy.transform.TypeChecked -import groovy.transform.TypeCheckingMode -import org.grails.datastore.mapping.model.MappingContext - import java.lang.reflect.Method import java.lang.reflect.Modifier +import groovy.transform.CompileDynamic +import groovy.transform.CompileStatic + import org.grails.datastore.gorm.utils.ReflectionUtils import org.grails.datastore.mapping.core.Datastore +import org.grails.datastore.mapping.model.MappingContext import org.grails.datastore.mapping.model.PersistentEntity /** @@ -84,10 +82,10 @@ abstract class AbstractGormApi extends AbstractDatastoreApi { !m.isSynthetic() && !Modifier.isStatic(mods) && Modifier.isPublic(mods) && !AbstractGormApi.EXCLUDES.contains(m.name) } - methods.addAll methodsToAdd - if (clazz != GormStaticApi.class && clazz != GormInstanceApi && clazz != GormValidationApi && clazz != AbstractGormApi) { - def extendedMethodsToAdd = methodsToAdd.findAll { Method m -> !ReflectionUtils.isMethodOverriddenFromParent(m)} - extendedMethods.addAll extendedMethodsToAdd + methods.addAll(methodsToAdd) + if (clazz != GormStaticApi && clazz != GormInstanceApi && clazz != GormValidationApi && clazz != AbstractGormApi) { + def extendedMethodsToAdd = methodsToAdd.findAll { Method m -> !ReflectionUtils.isMethodOverriddenFromParent(m) } + extendedMethods.addAll(extendedMethodsToAdd) } clazz = clazz.getSuperclass() } @@ -95,14 +93,14 @@ abstract class AbstractGormApi extends AbstractDatastoreApi { } List getMethods() { - if(methods == null) { + if (methods == null) { initializeMethods(getClass()) } return methods } List getExtendedMethods() { - if(extendedMethods == null) { + if (extendedMethods == null) { initializeMethods(getClass()) } return extendedMethods diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/CurrentTenant.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/CurrentTenant.groovy index d2d2257816a..c081e3737b9 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/CurrentTenant.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/CurrentTenant.groovy @@ -60,7 +60,7 @@ class CurrentTenant { * @param callable The closure * @return The result of the closure */ - public static T withTenant(Serializable tenantId, Closure callable) { + static T withTenant(Serializable tenantId, Closure callable) { try { set(tenantId) callable.call() diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEnhancer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEnhancer.groovy index 9adea3a65e4..e430ff05b52 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEnhancer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEnhancer.groovy @@ -14,15 +14,31 @@ */ package org.grails.datastore.gorm -import grails.gorm.MultiTenant -import grails.gorm.multitenancy.Tenants +import java.lang.reflect.Method +import java.lang.reflect.Modifier +import java.util.concurrent.ConcurrentHashMap + import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.util.logging.Slf4j import org.codehaus.groovy.reflection.CachedMethod import org.codehaus.groovy.runtime.metaclass.ClosureStaticMetaMethod import org.codehaus.groovy.runtime.metaclass.MethodSelectionException -import org.grails.datastore.gorm.finders.* + +import org.springframework.transaction.PlatformTransactionManager +import org.springframework.transaction.TransactionSystemException + +import grails.gorm.MultiTenant +import grails.gorm.multitenancy.Tenants +import org.grails.datastore.gorm.finders.CountByFinder +import org.grails.datastore.gorm.finders.FindAllByBooleanFinder +import org.grails.datastore.gorm.finders.FindAllByFinder +import org.grails.datastore.gorm.finders.FindByBooleanFinder +import org.grails.datastore.gorm.finders.FindByFinder +import org.grails.datastore.gorm.finders.FindOrCreateByFinder +import org.grails.datastore.gorm.finders.FindOrSaveByFinder +import org.grails.datastore.gorm.finders.FinderMethod +import org.grails.datastore.gorm.finders.ListOrderByFinder import org.grails.datastore.gorm.internal.InstanceMethodInvokingClosure import org.grails.datastore.gorm.internal.StaticMethodInvokingClosure import org.grails.datastore.gorm.query.GormQueryOperations @@ -43,12 +59,6 @@ import org.grails.datastore.mapping.reflect.ClassUtils import org.grails.datastore.mapping.reflect.MetaClassUtils import org.grails.datastore.mapping.reflect.NameUtils import org.grails.datastore.mapping.transactions.TransactionCapableDatastore -import org.springframework.transaction.PlatformTransactionManager -import org.springframework.transaction.TransactionSystemException - -import java.lang.reflect.Method -import java.lang.reflect.Modifier -import java.util.concurrent.ConcurrentHashMap /** * Enhances a class with GORM behavior @@ -91,7 +101,6 @@ class GormEnhancer implements Closeable { */ final boolean dynamicEnhance - GormEnhancer(Datastore datastore) { this(datastore, null) } @@ -114,13 +123,13 @@ class GormEnhancer implements Closeable { this.markDirty = markDirty == null ? true : markDirty this.transactionManager = transactionManager this.dynamicEnhance = false - if(datastore != null) { + if (datastore != null) { registerConstraints(datastore) } NAMED_QUERIES.clear() DATASTORES_BY_TYPE.put(datastore.getClass(), datastore) - for(entity in datastore.mappingContext.persistentEntities) { + for (entity in datastore.mappingContext.persistentEntities) { registerEntity(entity) } } @@ -136,7 +145,7 @@ class GormEnhancer implements Closeable { def cls = entity.javaClass List qualifiers = allQualifiers(this.datastore, entity) - if(!qualifiers.contains(ConnectionSource.DEFAULT)) { + if (!qualifiers.contains(ConnectionSource.DEFAULT)) { def firstQualifier = qualifiers.first() def staticApi = getStaticApi(cls, firstQualifier) def name = entity.name @@ -170,15 +179,15 @@ class GormEnhancer implements Closeable { */ List allQualifiers(Datastore datastore, PersistentEntity entity) { List qualifiers = new ArrayList<>() - qualifiers.addAll ConnectionSourcesSupport.getConnectionSourceNames(entity) - if((MultiTenant.isAssignableFrom(entity.javaClass) || qualifiers.contains(ConnectionSource.ALL)) && (datastore instanceof ConnectionSourcesProvider)) { + qualifiers.addAll(ConnectionSourcesSupport.getConnectionSourceNames(entity)) + if ((MultiTenant.isAssignableFrom(entity.javaClass) || qualifiers.contains(ConnectionSource.ALL)) && (datastore instanceof ConnectionSourcesProvider)) { qualifiers.clear() qualifiers.add(ConnectionSource.DEFAULT) Iterable allConnectionSources = ((ConnectionSourcesProvider) datastore).getConnectionSources().allConnectionSources Collection allConnectionSourceNames = allConnectionSources.findAll() { ConnectionSource connectionSource -> connectionSource.name != ConnectionSource.DEFAULT } - .collect() { ((ConnectionSource)it).name } - qualifiers.addAll allConnectionSourceNames + .collect() { ((ConnectionSource) it).name } + qualifiers.addAll(allConnectionSourceNames) } return qualifiers } @@ -214,15 +223,15 @@ class GormEnhancer implements Closeable { static GormQueryOperations createNamedQuery(Class entity, String queryName, Object... args) { def className = entity.getName() def namedQueries = NAMED_QUERIES.get(className) - if(namedQueries == null) { + if (namedQueries == null) { synchronized (NAMED_QUERIES) { namedQueries = NAMED_QUERIES.get(className) - if(namedQueries == null) { + if (namedQueries == null) { ClassPropertyFetcher cpf = ClassPropertyFetcher.forClass(entity) - Closure closure = cpf.getStaticPropertyValue(GormProperties.NAMED_QUERIES, Closure.class) - if(closure != null) { - closure = (Closure)closure.clone() + Closure closure = cpf.getStaticPropertyValue(GormProperties.NAMED_QUERIES, Closure) + if (closure != null) { + closure = (Closure) closure.clone() def evaluator = new NamedQueriesBuilder() namedQueries = evaluator.evaluate(closure) NAMED_QUERIES.put(className, namedQueries) @@ -232,8 +241,8 @@ class GormEnhancer implements Closeable { return null } } - } - } + } + } return buildNamedCriteriaProxy(entity, namedQueries, queryName, args) } @@ -257,25 +266,25 @@ class GormEnhancer implements Closeable { * @return */ protected static String findTenantId(Class entity) { - if(MultiTenant.isAssignableFrom(entity)) { + if (MultiTenant.isAssignableFrom(entity)) { Datastore defaultDatastore = findDatastore(entity, ConnectionSource.DEFAULT) - if((defaultDatastore instanceof MultiTenantCapableDatastore)) { + if ((defaultDatastore instanceof MultiTenantCapableDatastore)) { - MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore)defaultDatastore - if(multiTenantCapableDatastore.getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DATABASE) { - return Tenants.currentId( multiTenantCapableDatastore ) + MultiTenantCapableDatastore multiTenantCapableDatastore = (MultiTenantCapableDatastore) defaultDatastore + if (multiTenantCapableDatastore.getMultiTenancyMode() == MultiTenancySettings.MultiTenancyMode.DATABASE) { + return Tenants.currentId(multiTenantCapableDatastore) } else { return ConnectionSource.DEFAULT } } else { - log.debug("Return default tenant id for non-multitenant capable datastore") + log.debug('Return default tenant id for non-multitenant capable datastore') return ConnectionSource.DEFAULT } } else { - log.debug "Returning default tenant id for non-multitenant class [$entity]" + log.debug('Returning default tenant id for non-multitenant class [{}]', entity) return ConnectionSource.DEFAULT } } @@ -292,7 +301,7 @@ class GormEnhancer implements Closeable { static GormStaticApi findStaticApi(Class entity, String qualifier = findTenantId(entity)) { String className = NameUtils.getClassName(entity) def staticApi = STATIC_APIS.get(qualifier)?.get(className) - if(staticApi == null) { + if (staticApi == null) { throw stateException(entity) } return staticApi @@ -309,7 +318,7 @@ class GormEnhancer implements Closeable { */ static GormInstanceApi findInstanceApi(Class entity, String qualifier = findTenantId(entity)) { def instanceApi = INSTANCE_APIS.get(qualifier)?.get(NameUtils.getClassName(entity)) - if(instanceApi == null) { + if (instanceApi == null) { throw stateException(entity) } return instanceApi @@ -326,7 +335,7 @@ class GormEnhancer implements Closeable { */ static GormValidationApi findValidationApi(Class entity, String qualifier = findTenantId(entity)) { def instanceApi = VALIDATION_APIS.get(qualifier)?.get(NameUtils.getClassName(entity)) - if(instanceApi == null) { + if (instanceApi == null) { throw stateException(entity) } return instanceApi @@ -343,7 +352,7 @@ class GormEnhancer implements Closeable { */ static Datastore findDatastore(Class entity, String qualifier = findTenantId(entity)) { def datastore = DATASTORES.get(qualifier)?.get(entity.name) - if(datastore == null) { + if (datastore == null) { throw stateException(entity) } return datastore @@ -359,7 +368,7 @@ class GormEnhancer implements Closeable { */ static Datastore findDatastoreByType(Class datastoreType) { Datastore datastore = DATASTORES_BY_TYPE.get(datastoreType) - if(datastore == null) { + if (datastore == null) { throw new IllegalStateException("No GORM implementation configured for type [$datastoreType]. Ensure GORM has been initialized correctly") } return datastore @@ -372,11 +381,11 @@ class GormEnhancer implements Closeable { */ static Datastore findSingleDatastore() { Collection allDatastores = DATASTORES_BY_TYPE.values() - if(allDatastores.isEmpty()) { - throw new IllegalStateException("No GORM implementations configured. Ensure GORM has been initialized correctly") + if (allDatastores.isEmpty()) { + throw new IllegalStateException('No GORM implementations configured. Ensure GORM has been initialized correctly') } - else if(allDatastores.size() > 1) { - throw new IllegalStateException("More than one GORM implementation is configured. Specific the datastore type!") + else if (allDatastores.size() > 1) { + throw new IllegalStateException('More than one GORM implementation is configured. Specific the datastore type!') } else { return allDatastores.first() @@ -433,12 +442,12 @@ class GormEnhancer implements Closeable { removeConstraints() DATASTORES_BY_TYPE.clear() def registry = GroovySystem.metaClassRegistry - for(entity in datastore.mappingContext.persistentEntities) { + for (entity in datastore.mappingContext.persistentEntities) { List qualifiers = allQualifiers(datastore, entity) def cls = entity.javaClass def className = cls.name - for(q in qualifiers) { + for (q in qualifiers) { NAMED_QUERIES.remove(className) STATIC_APIS.get(q)?.remove(className) INSTANCE_APIS.get(q)?.remove(className) @@ -468,9 +477,9 @@ class GormEnhancer implements Closeable { @CompileDynamic protected void removeConstraints() { try { - String className = "org.apache.groovy.grails.validation.ConstrainedProperty" + String className = 'org.apache.groovy.grails.validation.ConstrainedProperty' ClassLoader classLoader = getClass().getClassLoader() - if(ClassUtils.isPresent(className, classLoader)) { + if (ClassUtils.isPresent(className, classLoader)) { classLoader.loadClass(className).removeConstraint('unique') } } catch (Throwable e) { @@ -480,9 +489,9 @@ class GormEnhancer implements Closeable { protected void registerConstraints(Datastore datastore) { try { - String className = "org.grails.datastore.gorm.support.ConstraintRegistrar" + String className = 'org.grails.datastore.gorm.support.ConstraintRegistrar' ClassLoader classLoader = getClass().getClassLoader() - if(ClassUtils.isPresent(className, classLoader)) { + if (ClassUtils.isPresent(className, classLoader)) { classLoader.loadClass(className).newInstance(datastore) } } catch (Throwable e) { @@ -505,10 +514,10 @@ class GormEnhancer implements Closeable { */ @CompileStatic void enhance(boolean onlyExtendedMethods = false) { - if(dynamicEnhance) { + if (dynamicEnhance) { for (PersistentEntity e in datastore.mappingContext.persistentEntities) { - if(e.external && !includeExternal) continue - enhance e, onlyExtendedMethods + if (e.external && !includeExternal) continue + enhance(e, onlyExtendedMethods) } } } @@ -523,7 +532,7 @@ class GormEnhancer implements Closeable { void enhance(PersistentEntity e, boolean onlyExtendedMethods = false) { registerEntity(e) - if(!(GroovyObject.isAssignableFrom(e.javaClass) ) || dynamicEnhance) { + if (!(GroovyObject.isAssignableFrom(e.javaClass)) || dynamicEnhance) { addInstanceMethods(e, onlyExtendedMethods) addStaticMethods(e, onlyExtendedMethods) @@ -542,7 +551,7 @@ class GormEnhancer implements Closeable { def parameterTypes = method.parameterTypes if (parameterTypes != null) { boolean realMethodExists = doesRealMethodExist(mc, methodName, parameterTypes, true) - if(!realMethodExists) { + if (!realMethodExists) { registerStaticMethod(mc, methodName, parameterTypes, staticApiProvider) } } @@ -560,8 +569,6 @@ class GormEnhancer implements Closeable { !entity.isExternal() } - - @CompileDynamic protected List> getInstanceMethodApiProviders(Class cls) { [getInstanceApi(cls), getValidationApi(cls)] @@ -582,7 +589,7 @@ class GormEnhancer implements Closeable { boolean realMethodExists = doesRealMethodExist(mc, methodName, parameterTypes, false) - if(!realMethodExists) { + if (!realMethodExists) { registerInstanceMethod(cls, mc, apiProvider, methodName, parameterTypes) } } @@ -596,9 +603,9 @@ class GormEnhancer implements Closeable { def pt = parameterTypes // Hack to workaround http://jira.codehaus.org/browse/GROOVY-4720 final closureMethod = new ClosureStaticMetaMethod(methodName, cls, tooCall, pt) { - @Override - int getModifiers() { Modifier.PUBLIC } - } + @Override + int getModifiers() { Modifier.PUBLIC } + } mc.registerInstanceMethod(closureMethod) } @@ -607,13 +614,13 @@ class GormEnhancer implements Closeable { boolean realMethodExists = false try { MetaMethod existingMethod = mc.pickMethod(methodName, parameterTypes) - if(existingMethod && existingMethod.isStatic()==staticScope && isRealMethod(existingMethod) && parameterTypes.length==existingMethod.parameterTypes.length) { + if (existingMethod && existingMethod.isStatic() == staticScope && isRealMethod(existingMethod) && parameterTypes.length == existingMethod.parameterTypes.length) { realMethodExists = true } } catch (MethodSelectionException mse) { // the metamethod already exists with multiple signatures, must check if the exact method exists realMethodExists = mc.methods.contains { MetaMethod existingMethod -> - existingMethod.name == methodName && existingMethod.isStatic()==staticScope && isRealMethod(existingMethod) && ((!parameterTypes && !existingMethod.parameterTypes) || parameterTypes==existingMethod.parameterTypes) + existingMethod.name == methodName && existingMethod.isStatic() == staticScope && isRealMethod(existingMethod) && ((!parameterTypes && !existingMethod.parameterTypes) || parameterTypes == existingMethod.parameterTypes) } } return realMethodExists diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntity.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntity.groovy index 2c73f46f568..93b9cf670a7 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntity.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntity.groovy @@ -18,9 +18,14 @@ */ package org.grails.datastore.gorm -import grails.gorm.DetachedCriteria import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + +import jakarta.persistence.Transient + +import org.springframework.transaction.TransactionDefinition + +import grails.gorm.DetachedCriteria import org.grails.datastore.gorm.finders.FinderMethod import org.grails.datastore.gorm.query.GormQueryOperations import org.grails.datastore.mapping.dirty.checking.DirtyCheckable @@ -34,9 +39,6 @@ import org.grails.datastore.mapping.model.types.ToOne import org.grails.datastore.mapping.query.api.BuildableCriteria import org.grails.datastore.mapping.query.api.Criteria import org.grails.datastore.mapping.reflect.EntityReflector -import org.springframework.transaction.TransactionDefinition - -import jakarta.persistence.Transient /** * @@ -49,7 +51,6 @@ import jakarta.persistence.Transient @CompileStatic trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi { - /** * Allow access to datasource by name * @@ -66,7 +67,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi where(Closure callable) { - currentGormStaticApi().where callable + currentGormStaticApi().where(callable) } /** @@ -447,7 +447,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi whereLazy(Closure callable) { - currentGormStaticApi().whereLazy callable + currentGormStaticApi().whereLazy(callable) } /** @@ -456,7 +456,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi whereAny(Closure callable) { - currentGormStaticApi().whereAny callable + currentGormStaticApi().whereAny(callable) } /** @@ -466,7 +466,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(Closure callable) { - currentGormStaticApi().findAll callable + currentGormStaticApi().findAll(callable) } /** @@ -477,7 +477,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(Map args, Closure callable) { - currentGormStaticApi().findAll args, callable + currentGormStaticApi().findAll(args, callable) } /** @@ -487,17 +487,16 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi saveAll(Object... objectsToSave) { - currentGormStaticApi().saveAll objectsToSave + currentGormStaticApi().saveAll(objectsToSave) } /** @@ -506,7 +505,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi saveAll(Iterable objectsToSave) { - currentGormStaticApi().saveAll objectsToSave + currentGormStaticApi().saveAll(objectsToSave) } /** @@ -514,7 +513,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi getAll(Iterable ids) { - currentGormStaticApi().getAll ids + currentGormStaticApi().getAll(ids) } /** @@ -595,7 +594,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi getAll(Serializable... ids) { - currentGormStaticApi().getAll ids + currentGormStaticApi().getAll(ids) } /** @@ -616,14 +615,14 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi list(Map params) { - currentGormStaticApi().list params + currentGormStaticApi().list(params) } /** @@ -691,7 +690,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(Map params = Collections.emptyMap()) { - currentGormStaticApi().findAll params + currentGormStaticApi().findAll(params) } /** @@ -701,7 +700,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(D example) { - currentGormStaticApi().findAll example + currentGormStaticApi().findAll(example) } /** @@ -713,7 +712,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(D example, Map args) { - currentGormStaticApi().findAll example, args + currentGormStaticApi().findAll(example, args) } /** @@ -733,7 +732,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi findAllWhere(Map queryMap) { - currentGormStaticApi().findAllWhere queryMap + currentGormStaticApi().findAllWhere(queryMap) } /** @@ -841,7 +840,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAllWhere(Map queryMap, Map args) { - currentGormStaticApi().findAllWhere queryMap, args + currentGormStaticApi().findAllWhere(queryMap, args) } /** @@ -851,7 +850,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi T withSession(Closure callable) { - currentGormStaticApi().withSession callable + currentGormStaticApi().withSession(callable) } /** @@ -927,7 +926,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi T withDatastoreSession(Closure callable) { - currentGormStaticApi().withDatastoreSession callable + currentGormStaticApi().withDatastoreSession(callable) } /** @@ -941,7 +940,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi T withTransaction(Closure callable) { - currentGormStaticApi().withTransaction callable + currentGormStaticApi().withTransaction(callable) } /** @@ -954,7 +953,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi T withNewTransaction(Closure callable) { - currentGormStaticApi().withNewTransaction callable + currentGormStaticApi().withNewTransaction(callable) } /** @@ -981,7 +980,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi T withTransaction(Map transactionProperties, Closure callable) { - currentGormStaticApi().withTransaction transactionProperties, callable + currentGormStaticApi().withTransaction(transactionProperties, callable) } /** @@ -1010,7 +1009,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi T withNewTransaction(Map transactionProperties, Closure callable) { - currentGormStaticApi().withNewTransaction transactionProperties, callable + currentGormStaticApi().withNewTransaction(transactionProperties, callable) } /** @@ -1020,24 +1019,23 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi T withTransaction(TransactionDefinition definition, Closure callable) { - currentGormStaticApi().withTransaction definition, callable + currentGormStaticApi().withTransaction(definition, callable) } /** * Creates and binds a new session for the scope of the given closure */ static T withNewSession(Closure callable) { - currentGormStaticApi().withNewSession callable + currentGormStaticApi().withNewSession(callable) } /** * Creates and binds a new session for the scope of the given closure */ static T withStatelessSession(Closure callable) { - currentGormStaticApi().withStatelessSession callable + currentGormStaticApi().withStatelessSession(callable) } - /** * Executes a query for the given String * @@ -1045,7 +1043,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi implements GormValidateable, DirtyCheckable, GormEntityApi findAll(CharSequence query) { - currentGormStaticApi().findAll query + currentGormStaticApi().findAll(query) } /** @@ -1287,7 +1285,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(CharSequence query, Map params) { - currentGormStaticApi().findAll query, params + currentGormStaticApi().findAll(query, params) } /** @@ -1300,7 +1298,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(CharSequence query, Map params, Map args) { - currentGormStaticApi().findAll query, params, args + currentGormStaticApi().findAll(query, params, args) } /** @@ -1312,7 +1310,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(CharSequence query, Collection params) { - currentGormStaticApi().findAll query, params + currentGormStaticApi().findAll(query, params) } /** @@ -1324,7 +1322,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(CharSequence query, Object[] params) { - currentGormStaticApi().findAll query, params + currentGormStaticApi().findAll(query, params) } /** @@ -1337,7 +1335,7 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi findAll(CharSequence query, Collection params, Map args) { - currentGormStaticApi().findAll query, params, args + currentGormStaticApi().findAll(query, params, args) } /** @@ -1366,10 +1364,10 @@ trait GormEntity implements GormValidateable, DirtyCheckable, GormEntityApi currentGormInstanceApi() { - (GormInstanceApi)GormEnhancer.findInstanceApi(getClass()) + (GormInstanceApi) GormEnhancer.findInstanceApi(getClass()) } private static GormStaticApi currentGormStaticApi() { - (GormStaticApi)GormEnhancer.findStaticApi(this) + (GormStaticApi) GormEnhancer.findStaticApi(this) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntityApi.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntityApi.groovy index 8768b56631e..0fe3489576f 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntityApi.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntityApi.groovy @@ -28,6 +28,7 @@ package org.grails.datastore.gorm * @param The entity type */ trait GormEntityApi { + /** * Proxy aware instanceOf implementation. */ @@ -130,4 +131,4 @@ trait GormEntityApi { * @return true if it is dirty */ abstract boolean isDirty() -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntityDirtyCheckable.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntityDirtyCheckable.groovy index fdbd91796b4..2de81cfa794 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntityDirtyCheckable.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormEntityDirtyCheckable.groovy @@ -19,14 +19,14 @@ package org.grails.datastore.gorm import groovy.transform.CompileStatic -import groovy.util.logging.Slf4j + +import jakarta.annotation.Generated + import org.grails.datastore.mapping.config.Property import org.grails.datastore.mapping.dirty.checking.DirtyCheckable import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.model.PersistentProperty -import jakarta.annotation.Generated - /** * * Special trait meant only for GORM entities to override default behaviour of DirtyCheckable. @@ -36,19 +36,19 @@ import jakarta.annotation.Generated */ @CompileStatic trait GormEntityDirtyCheckable extends DirtyCheckable { - + @Override @Generated boolean hasChanged(String propertyName) { PersistentEntity entity = currentGormInstanceApi().persistentEntity - + PersistentProperty persistentProperty = entity.getPropertyByName(propertyName) if (!persistentProperty) { - // Not persistent property, transient. We don't track changes for transients + // Not persistent property, transient. We don't track changes for transients return false } - - Property propertyMapping = persistentProperty.getMapping().getMappedForm() + + Property propertyMapping = persistentProperty.getMapping().getMappedForm() if (propertyMapping.derived) { // Derived property cannot be changed, ex. sql formula return false diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormInstanceApi.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormInstanceApi.groovy index aade41b2898..24f2bbeb6a4 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormInstanceApi.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormInstanceApi.groovy @@ -18,18 +18,18 @@ */ package org.grails.datastore.gorm -import grails.gorm.api.GormInstanceOperations import groovy.transform.CompileStatic - import org.codehaus.groovy.runtime.InvokerHelper -import org.grails.datastore.mapping.core.connections.ConnectionSource -import org.grails.datastore.mapping.core.connections.ConnectionSources -import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider -import org.grails.datastore.mapping.dirty.checking.DirtyCheckingSupport + +import grails.gorm.api.GormInstanceOperations import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.core.Session import org.grails.datastore.mapping.core.SessionCallback +import org.grails.datastore.mapping.core.connections.ConnectionSource +import org.grails.datastore.mapping.core.connections.ConnectionSources +import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider import org.grails.datastore.mapping.dirty.checking.DirtyCheckable +import org.grails.datastore.mapping.dirty.checking.DirtyCheckingSupport import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.proxy.EntityProxy import org.grails.datastore.mapping.reflect.EntityReflector @@ -68,7 +68,7 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera */ boolean instanceOf(D o, Class cls) { if (o instanceof EntityProxy) { - o = (D)((EntityProxy)o).getTarget() + o = (D) ((EntityProxy)o).getTarget() } return o in cls } @@ -90,7 +90,7 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera * @param callable The closure * @return The result of the closure */ - public T mutex(D instance, Closure callable) { + T mutex(D instance, Closure callable) { execute({ Session session -> try { session.lock(instance) @@ -109,7 +109,7 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera */ D refresh(D instance) { execute({ Session session -> - session.refresh instance + session.refresh(instance) return instance } as SessionCallback) } @@ -139,7 +139,7 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera */ D insert(D instance, Map params) { execute({ Session session -> - doSave instance, params, session, true + doSave(instance, params, session, true) } as SessionCallback) } @@ -181,7 +181,7 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera */ D save(D instance, Map params) { execute({ Session session -> - doSave instance, params, session + doSave(instance, params, session) } as SessionCallback) } @@ -190,22 +190,22 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera */ Serializable ident(D instance) { PersistentProperty identity = persistentEntity.getIdentity() - if(identity != null) { - return (Serializable)instance[identity.name] + if (identity != null) { + return (Serializable) instance[identity.name] } else { PersistentProperty[] idProperties = persistentEntity.getCompositeIdentity() - if(idProperties != null) { + if (idProperties != null) { EntityReflector entityReflector = persistentEntity.getReflector() def idInstance = persistentEntity.newInstance() - if(idInstance instanceof Serializable) { - for(prop in idProperties) { + if (idInstance instanceof Serializable) { + for (prop in idProperties) { String propertName = prop.name entityReflector.setProperty( idInstance, propertName, entityReflector.getProperty(instance, propertName) ) } - return (Serializable)idInstance + return (Serializable) idInstance } } } @@ -272,8 +272,8 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera * @return true if the field is dirty */ boolean isDirty(D instance, String fieldName) { - if(instance instanceof DirtyCheckable) { - return ((DirtyCheckable)instance).hasChanged(fieldName) + if (instance instanceof DirtyCheckable) { + return ((DirtyCheckable) instance).hasChanged(fieldName) } return true } @@ -285,8 +285,8 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera * @return true if it is dirty */ boolean isDirty(D instance) { - if(instance instanceof DirtyCheckable) { - return ((DirtyCheckable)instance).hasChanged() || DirtyCheckingSupport.areAssociationsDirty(persistentEntity, instance) + if (instance instanceof DirtyCheckable) { + return ((DirtyCheckable) instance).hasChanged() || DirtyCheckingSupport.areAssociationsDirty(persistentEntity, instance) } return true } @@ -298,8 +298,8 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera * @return A list of property names that are dirty */ List getDirtyPropertyNames(D instance) { - if(instance instanceof DirtyCheckable) { - return ((DirtyCheckable)instance).listDirtyPropertyNames() + if (instance instanceof DirtyCheckable) { + return ((DirtyCheckable) instance).listDirtyPropertyNames() } return [] } @@ -311,27 +311,27 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera * @return The original persisted value */ Object getPersistentValue(D instance, String fieldName) { - if(instance instanceof DirtyCheckable) { - return ((DirtyCheckable)instance).getOriginalValue(fieldName) + if (instance instanceof DirtyCheckable) { + return ((DirtyCheckable) instance).getOriginalValue(fieldName) } return null } protected D doSave(D instance, Map params, Session session, boolean isInsert = false) { boolean hasErrors = false - boolean validate = params?.containsKey("validate") ? params.validate : true + boolean validate = params?.containsKey('validate') ? params.validate : true boolean shouldFlush = params?.flush ? params.flush : false - if(instance instanceof GormValidateable) { + if (instance instanceof GormValidateable) { def validateable = (GormValidateable) instance if (validate) { validateable.skipValidation(false) - if(datastore instanceof ConnectionSourcesProvider) { + if (datastore instanceof ConnectionSourcesProvider) { ConnectionSources connectionSources = ((ConnectionSourcesProvider) datastore).connectionSources String connectionSourceName = connectionSources.defaultConnectionSource.name - if(connectionSourceName != ConnectionSource.DEFAULT) { - GormValidationApi validationApi = GormEnhancer.findValidationApi((Class)instance.getClass(), connectionSourceName) - hasErrors = !validationApi.validate((D)instance, params) + if (connectionSourceName != ConnectionSource.DEFAULT) { + GormValidationApi validationApi = GormEnhancer.findValidationApi((Class) instance.getClass(), connectionSourceName) + hasErrors = !validationApi.validate((D) instance, params) } else { hasErrors = !validateable.validate(params) @@ -341,7 +341,7 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera hasErrors = !validateable.validate(params) } // don't revalidate - if(shouldFlush) { + if (shouldFlush) { validateable.skipValidation(true) } @@ -352,9 +352,9 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera } if (hasErrors) { - boolean failOnErrorEnabled = params?.containsKey("failOnError") ? params.failOnError : failOnError + boolean failOnErrorEnabled = params?.containsKey('failOnError') ? params.failOnError : failOnError if (failOnErrorEnabled) { - throw validationException.newInstance("Validation error occurred during call to save()", InvokerHelper.getProperty(instance, "errors")) + throw validationException.newInstance('Validation error occurred during call to save()', InvokerHelper.getProperty(instance, 'errors')) } return null } @@ -362,7 +362,7 @@ class GormInstanceApi extends AbstractGormApi implements GormInstanceOpera session.insert(instance) } else { - if(instance instanceof DirtyCheckable && markDirty) { + if (instance instanceof DirtyCheckable && markDirty) { // since this is an explicit call to save() we mark the instance as dirty to ensure it happens instance.markDirty() } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormStaticApi.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormStaticApi.groovy index 2f147443fa3..9b8f1eee0e0 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormStaticApi.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/GormStaticApi.groovy @@ -18,6 +18,18 @@ */ package org.grails.datastore.gorm +import groovy.transform.CompileDynamic +import groovy.transform.CompileStatic +import groovy.transform.TypeCheckingMode +import org.codehaus.groovy.runtime.InvokerHelper + +import org.springframework.beans.PropertyAccessorFactory +import org.springframework.beans.factory.config.AutowireCapableBeanFactory +import org.springframework.transaction.PlatformTransactionManager +import org.springframework.transaction.TransactionDefinition +import org.springframework.transaction.support.DefaultTransactionDefinition +import org.springframework.util.Assert + import grails.gorm.CriteriaBuilder import grails.gorm.DetachedCriteria import grails.gorm.MultiTenant @@ -25,11 +37,6 @@ import grails.gorm.PagedResultList import grails.gorm.api.GormAllOperations import grails.gorm.multitenancy.Tenants import grails.gorm.transactions.GrailsTransactionTemplate -import groovy.transform.CompileDynamic -import groovy.transform.CompileStatic -import groovy.transform.TypeCheckingMode - -import org.codehaus.groovy.runtime.InvokerHelper import org.grails.datastore.gorm.finders.DynamicFinder import org.grails.datastore.gorm.finders.FinderMethod import org.grails.datastore.gorm.multitenancy.TenantDelegatingGormOperations @@ -50,12 +57,6 @@ import org.grails.datastore.mapping.multitenancy.MultiTenancySettings.MultiTenan import org.grails.datastore.mapping.query.Query import org.grails.datastore.mapping.query.api.BuildableCriteria import org.grails.datastore.mapping.query.api.Criteria -import org.springframework.beans.PropertyAccessorFactory -import org.springframework.beans.factory.config.AutowireCapableBeanFactory -import org.springframework.transaction.PlatformTransactionManager -import org.springframework.transaction.TransactionDefinition -import org.springframework.transaction.support.DefaultTransactionDefinition -import org.springframework.util.Assert /** * Static methods of the GORM API. @@ -82,7 +83,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations defaultConnectionSource = connectionSources.defaultConnectionSource qualifier = defaultConnectionSource.name @@ -113,7 +114,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations f.isMethodMatch(methodName) } if (!method) { - if(args && args[-1] instanceof Closure) { + if (args && args[-1] instanceof Closure) { NamedCriteriaProxy proxy = GormEnhancer.createNamedQuery(persistentClass, methodName) - if(proxy != null) { + if (proxy != null) { return proxy.call(args) } else { @@ -157,7 +158,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations whereAny(Closure callable) { - (DetachedCriteria)new DetachedCriteria(persistentClass).or(callable) + (DetachedCriteria) new DetachedCriteria(persistentClass).or(callable) } /** @@ -256,8 +257,8 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations saveAll(Object... objectsToSave) { - (List)execute({ Session session -> - session.persist Arrays.asList(objectsToSave) + (List) execute({ Session session -> + session.persist(Arrays.asList(objectsToSave)) } as SessionCallback) } @@ -267,8 +268,8 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations saveAll(Iterable objectsToSave) { - (List)execute({ Session session -> - session.persist objectsToSave + (List) execute({ Session session -> + session.persist(objectsToSave) } as SessionCallback) } @@ -278,7 +279,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations - session.delete Arrays.asList(objectsToDelete) + session.delete(Arrays.asList(objectsToDelete)) } as SessionCallback) } @@ -288,8 +289,8 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations - session.delete Arrays.asList(objectsToDelete) - if(params?.flush) { + session.delete(Arrays.asList(objectsToDelete)) + if (params?.flush) { session.flush() } } as SessionCallback) @@ -301,7 +302,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations - session.delete objectToDelete + session.delete(objectToDelete) } as SessionCallback) } @@ -311,8 +312,8 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations - session.delete objectToDelete - if(params?.flush) { + session.delete(objectToDelete) + if (params?.flush) { session.flush() } } as SessionCallback) @@ -328,7 +329,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations + (D) execute({ Session session -> session.retrieve((Class)persistentClass, id) } as SessionCallback) } @@ -352,7 +353,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations + (D) execute({ Session session -> session.retrieve((Class)persistentClass, id) } as SessionCallback) } @@ -361,7 +362,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations + (D) execute({ Session session -> session.proxy((Class)persistentClass, id) } as SessionCallback) } @@ -388,7 +389,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations getAll(Serializable... ids) { - (List)execute ({ Session session -> + (List) execute({ Session session -> session.retrieveAll(persistentClass, ids.flatten()) } as SessionCallback) } @@ -413,7 +414,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations InvokerHelper.invokeMethod(createCriteria(), 'call', callable) - } as SessionCallback ) + } as SessionCallback) } /** @@ -429,16 +430,16 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations InvokerHelper.invokeMethod(criteriaBuilder, 'get', callable) - } as SessionCallback ) + } as SessionCallback) } else { execute({ Session session -> InvokerHelper.invokeMethod(criteriaBuilder, 'list', callable) - } as SessionCallback ) + } as SessionCallback) } } @@ -449,7 +450,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations + (D) execute({ Session session -> session.lock((Class)persistentClass, id) } as SessionCallback) } @@ -466,7 +467,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations + execute({ Session session -> session.persist(d) return d } as SessionCallback) @@ -555,7 +556,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations + (Integer) execute({ Session session -> def q = session.createQuery(persistentClass) q.projections().count() @@ -593,7 +594,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations list(Map params) { - (List)execute ({ Session session -> + (List) execute({ Session session -> Query q = session.createQuery(persistentClass) DynamicFinder.populateArgumentsForCriteria(persistentClass, q, params) if (params?.max) { @@ -609,7 +610,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations list() { - (List)execute ({ Session session -> + (List) execute({ Session session -> session.createQuery(persistentClass).list() } as SessionCallback) } @@ -753,14 +754,14 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations findAllWhere(Map queryMap, Map args) { - (List)execute ({ Session session -> + (List) execute({ Session session -> Query q = session.createQuery(persistentClass) Map processedQueryMap = [:] - queryMap.each{ key, value -> processedQueryMap[key.toString()] = value } + queryMap.each { key, value -> processedQueryMap[key.toString()] = value } q.allEq(processedQueryMap) - DynamicFinder.populateArgumentsForCriteria persistentClass, q, args + DynamicFinder.populateArgumentsForCriteria(persistentClass, q, args) q.list() } as SessionCallback) } @@ -814,10 +815,10 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations processedQueryMap = [:] - queryMap.each{ key, value -> processedQueryMap[key.toString()] = value } + queryMap.each { key, value -> processedQueryMap[key.toString()] = value } q.allEq(processedQueryMap) } - DynamicFinder.populateArgumentsForCriteria persistentClass, q, args + DynamicFinder.populateArgumentsForCriteria(persistentClass, q, args) q.singleResult() } as SessionCallback) } @@ -850,9 +851,9 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations T withSession(Closure callable) { - execute ({ Session session -> - callable.call session + T withSession(Closure callable) { + execute({ Session session -> + callable.call(session) } as SessionCallback) } @@ -862,9 +863,9 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations T withDatastoreSession(Closure callable) { - execute ({ Session session -> - callable.call session + T withDatastoreSession(Closure callable) { + execute({ Session session -> + callable.call(session) } as SessionCallback) } @@ -878,17 +879,17 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations T withTransaction(Closure callable) { + T withTransaction(Closure callable) { withTransaction(new DefaultTransactionDefinition(), callable) } @Override def T withTenant(Serializable tenantId, Closure callable) { - if(multiTenancyMode == MultiTenancyMode.DATABASE) { - Tenants.withId((Class)GormEnhancer.findDatastore(persistentClass, tenantId.toString()).getClass(), tenantId, callable) + if (multiTenancyMode == MultiTenancyMode.DATABASE) { + Tenants.withId((Class) GormEnhancer.findDatastore(persistentClass, tenantId.toString()).getClass(), tenantId, callable) } - else if(multiTenancyMode.isSharedConnection()) { - Tenants.withId((Class)GormEnhancer.findDatastore(persistentClass, ConnectionSource.DEFAULT).getClass(), tenantId, callable) + else if (multiTenancyMode.isSharedConnection()) { + Tenants.withId((Class) GormEnhancer.findDatastore(persistentClass, ConnectionSource.DEFAULT).getClass(), tenantId, callable) } else { throw new UnsupportedOperationException("Method not supported in multi tenancy mode $multiTenancyMode") @@ -897,8 +898,8 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations eachTenant(Closure callable) { - if(multiTenancyMode != MultiTenancyMode.NONE) { - Tenants.eachTenant callable + if (multiTenancyMode != MultiTenancyMode.NONE) { + Tenants.eachTenant(callable) return this } else { @@ -908,10 +909,10 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations withTenant(Serializable tenantId) { - if(multiTenancyMode == MultiTenancyMode.DATABASE) { + if (multiTenancyMode == MultiTenancyMode.DATABASE) { return GormEnhancer.findStaticApi(persistentClass, tenantId.toString()) } - else if(multiTenancyMode.isSharedConnection()) { + else if (multiTenancyMode.isSharedConnection()) { def staticApi = GormEnhancer.findStaticApi(persistentClass, ConnectionSource.DEFAULT) return new TenantDelegatingGormOperations(datastore, tenantId, staticApi) } @@ -928,7 +929,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations T withNewTransaction(Closure callable) { + T withNewTransaction(Closure callable) { withTransaction([propagationBehavior: TransactionDefinition.PROPAGATION_REQUIRES_NEW], callable) } @@ -955,10 +956,10 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations T withTransaction(Map transactionProperties, Closure callable) { + T withTransaction(Map transactionProperties, Closure callable) { def transactionDefinition = new DefaultTransactionDefinition() transactionProperties.each { k, v -> - if(v instanceof CharSequence && !(v instanceof String)) { + if (v instanceof CharSequence && !(v instanceof String)) { v = v.toString() } try { @@ -996,9 +997,9 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations T withNewTransaction(Map transactionProperties, Closure callable) { + T withNewTransaction(Map transactionProperties, Closure callable) { def props = new HashMap(transactionProperties) - props.remove 'propagationName' + props.remove('propagationName') props.propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRES_NEW withTransaction(props, callable) } @@ -1009,8 +1010,8 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations T withTransaction(TransactionDefinition definition, Closure callable) { - Assert.notNull transactionManager, "No transactionManager bean configured" + T withTransaction(TransactionDefinition definition, Closure callable) { + Assert.notNull(transactionManager, 'No transactionManager bean configured') if (!callable) { return @@ -1022,33 +1023,33 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations T withNewSession(Closure callable) { + T withNewSession(Closure callable) { def session = datastore.connect() try { - DatastoreUtils.bindNewSession session + DatastoreUtils.bindNewSession(session) return callable?.call(session) } finally { - DatastoreUtils.unbindSession session + DatastoreUtils.unbindSession(session) } } /** * Creates and binds a new session for the scope of the given closure */ - public T withStatelessSession(Closure callable) { - if(datastore instanceof StatelessDatastore) { + T withStatelessSession(Closure callable) { + if (datastore instanceof StatelessDatastore) { def session = datastore.connectStateless() try { - DatastoreUtils.bindNewSession session + DatastoreUtils.bindNewSession(session) return callable?.call(session) } finally { - DatastoreUtils.unbindSession session + DatastoreUtils.unbindSession(session) } } else { - throw new UnsupportedOperationException("Stateless sessions not supported by implementation") + throw new UnsupportedOperationException('Stateless sessions not supported by implementation') } } @@ -1064,7 +1065,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations extends AbstractGormApi implements GormAllOperations findAll(CharSequence query, Map params, Map args) { - unsupported("findAll") + unsupported('findAll') return null } @@ -1176,7 +1177,7 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations findAll(CharSequence query, Collection params, Map args) { - unsupported("findAll") + unsupported('findAll') return null } @@ -1203,9 +1204,9 @@ class GormStaticApi extends AbstractGormApi implements GormAllOperations extends AbstractGormApi { - public static final String ARGUMENT_DEEP_VALIDATE = "deepValidate"; + public static final String ARGUMENT_DEEP_VALIDATE = 'deepValidate' private Validator internalValidator BeforeValidateHelper beforeValidateHelper @@ -73,10 +75,10 @@ class GormValidationApi extends AbstractGormApi { Validator getValidator() { if (!internalValidator) { - if(persistentEntity instanceof ValidatorProvider) { - internalValidator = ((ValidatorProvider)persistentEntity).validator + if (persistentEntity instanceof ValidatorProvider) { + internalValidator = ((ValidatorProvider) persistentEntity).validator } - if(!internalValidator) { + if (!internalValidator) { internalValidator = mappingContext.getEntityValidator(persistentEntity) } } @@ -96,17 +98,17 @@ class GormValidationApi extends AbstractGormApi { deepValidate = ClassUtils.getBooleanFromMap(ARGUMENT_DEEP_VALIDATE, arguments) } - if(hasDatastore) { + if (hasDatastore) { currentSession = datastore.currentSession previousFlushMode = currentSession.flushMode currentSession.setFlushMode(FlushModeType.COMMIT) } try { - beforeValidateHelper.invokeBeforeValidate instance, fields + beforeValidateHelper.invokeBeforeValidate(instance, fields) fireEvent(instance, fields) Validator validator = getValidator() - if(validator == null) { + if (validator == null) { return true } @@ -116,20 +118,20 @@ class GormValidationApi extends AbstractGormApi { for (error in errors.allErrors) { if (error instanceof FieldError) { - if (((FieldError)error).bindingFailure) { - localErrors.addError error + if (((FieldError) error).bindingFailure) { + localErrors.addError(error) } } else { - localErrors.addError error + localErrors.addError(error) } } if (validator instanceof CascadingValidator) { - ((CascadingValidator)validator).validate instance, localErrors, deepValidate + ((CascadingValidator) validator).validate(instance, localErrors, deepValidate) } else if (validator instanceof org.grails.datastore.gorm.validation.CascadingValidator) { - ((org.grails.datastore.gorm.validation.CascadingValidator) validator).validate instance, localErrors, deepValidate + ((org.grails.datastore.gorm.validation.CascadingValidator) validator).validate(instance, localErrors, deepValidate) } else { - validator.validate instance, localErrors + validator.validate(instance, localErrors) } if (fields) { @@ -140,7 +142,7 @@ class GormValidationApi extends AbstractGormApi { return !getErrors(instance).hasErrors() } finally { - if(previousFlushMode != null) { + if (previousFlushMode != null) { currentSession.setFlushMode(previousFlushMode) } } @@ -154,7 +156,7 @@ class GormValidationApi extends AbstractGormApi { * @return True if the instance is valid */ boolean validate(D instance, Map arguments) { - doValidate instance, arguments, (List)null + doValidate(instance, arguments, (List) null) } /** @@ -165,7 +167,7 @@ class GormValidationApi extends AbstractGormApi { * @return True if the instance is valid */ boolean validate(D instance, List fields) { - doValidate instance, (Map)null, fields + doValidate(instance, (Map) null, fields) } private ValidationErrors filterErrors(ValidationErrors errors, Set validatedFields, Object target) { @@ -176,7 +178,7 @@ class GormValidationApi extends AbstractGormApi { for (ObjectError error : errors.getAllErrors()) { if (error instanceof FieldError) { - FieldError fieldError = (FieldError)error + FieldError fieldError = (FieldError) error if (!validatedFields.contains(fieldError.getField())) continue } @@ -208,18 +210,17 @@ class GormValidationApi extends AbstractGormApi { * @return True if the instance is valid */ boolean validate(D instance) { - doValidate instance, (Map)null, (List)null + doValidate(instance, (Map) null, (List) null) } - /** * Obtains the errors for an instance * @param instance The instance to obtain errors for * @return The {@link Errors} instance */ Errors getErrors(D instance) { - if(instance instanceof GormValidateable) { - GormValidateable gv = (GormValidateable)instance + if (instance instanceof GormValidateable) { + GormValidateable gv = (GormValidateable) instance def errors = gv.errors if (errors == null) { errors = resetErrors(instance) @@ -228,7 +229,7 @@ class GormValidationApi extends AbstractGormApi { } else { - Errors errors = (Errors)datastore.currentSession.getAttribute(instance, GormProperties.ERRORS) + Errors errors = (Errors) datastore.currentSession.getAttribute(instance, GormProperties.ERRORS) if (errors == null) { errors = resetErrors(instance) } @@ -248,7 +249,7 @@ class GormValidationApi extends AbstractGormApi { * @param errors The errors */ void setErrors(D instance, Errors errors) { - if(instance instanceof GormValidateable) { + if (instance instanceof GormValidateable) { GormValidateable gv = (GormValidateable) instance gv.errors = errors } @@ -271,12 +272,12 @@ class GormValidationApi extends AbstractGormApi { * @return True if errors exist */ boolean hasErrors(D instance) { - if(instance instanceof GormValidateable) { + if (instance instanceof GormValidateable) { GormValidateable gv = (GormValidateable) instance return gv.hasErrors() } else { - Errors errors = (Errors)datastore.currentSession.getAttribute(instance, GormProperties.ERRORS) + Errors errors = (Errors) datastore.currentSession.getAttribute(instance, GormProperties.ERRORS) errors?.hasErrors() } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/AbstractDatastoreInitializer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/AbstractDatastoreInitializer.groovy index c7b391537c3..112f993c091 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/AbstractDatastoreInitializer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/AbstractDatastoreInitializer.groovy @@ -19,9 +19,30 @@ package org.grails.datastore.gorm.bootstrap -import grails.gorm.annotation.Entity +import java.beans.Introspector + import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + +import org.springframework.beans.factory.support.BeanDefinitionRegistry +import org.springframework.context.ApplicationContext +import org.springframework.context.ApplicationEventPublisher +import org.springframework.context.ConfigurableApplicationContext +import org.springframework.context.MessageSource +import org.springframework.context.ResourceLoaderAware +import org.springframework.context.support.GenericApplicationContext +import org.springframework.context.support.StaticMessageSource +import org.springframework.core.env.ConfigurableEnvironment +import org.springframework.core.env.PropertyResolver +import org.springframework.core.env.StandardEnvironment +import org.springframework.core.io.Resource +import org.springframework.core.io.ResourceLoader +import org.springframework.core.io.support.PathMatchingResourcePatternResolver +import org.springframework.core.io.support.ResourcePatternResolver +import org.springframework.core.type.classreading.CachingMetadataReaderFactory +import org.springframework.util.ClassUtils + +import grails.gorm.annotation.Entity import org.grails.datastore.gorm.events.ConfigurableApplicationContextEventPublisher import org.grails.datastore.gorm.events.DefaultApplicationEventPublisher import org.grails.datastore.gorm.plugin.support.PersistenceContextInterceptorAggregator @@ -37,21 +58,6 @@ import org.grails.datastore.mapping.services.Service import org.grails.datastore.mapping.services.ServiceDefinition import org.grails.datastore.mapping.services.SoftServiceLoader import org.grails.datastore.mapping.transactions.DatastoreTransactionManager -import org.springframework.beans.factory.support.BeanDefinitionRegistry -import org.springframework.context.* -import org.springframework.context.support.GenericApplicationContext -import org.springframework.context.support.StaticMessageSource -import org.springframework.core.env.ConfigurableEnvironment -import org.springframework.core.env.PropertyResolver -import org.springframework.core.env.StandardEnvironment -import org.springframework.core.io.Resource -import org.springframework.core.io.ResourceLoader -import org.springframework.core.io.support.PathMatchingResourcePatternResolver -import org.springframework.core.io.support.ResourcePatternResolver -import org.springframework.core.type.classreading.CachingMetadataReaderFactory -import org.springframework.util.ClassUtils - -import java.beans.Introspector /** * Abstract class for datastore initializers to implement @@ -60,13 +66,12 @@ import java.beans.Introspector * @since 3.0.3 */ @CompileStatic -abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ +abstract class AbstractDatastoreInitializer implements ResourceLoaderAware { public static final String TRANSACTION_MANAGER_BEAN = 'transactionManager' - public static final String ENTITY_CLASS_RESOURCE_PATTERN = "/**/*.class" + public static final String ENTITY_CLASS_RESOURCE_PATTERN = '/**/*.class' public static final String OSIV_CLASS_NAME = 'org.grails.datastore.mapping.web.support.OpenSessionInViewInterceptor' - PathMatchingResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver() Collection persistentClasses = [] Collection packages = [] @@ -127,11 +132,11 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ */ ApplicationEventPublisher findEventPublisher(BeanDefinitionRegistry beanDefinitionRegistry) { ApplicationEventPublisher eventPublisher - if(beanDefinitionRegistry instanceof ConfigurableApplicationContext){ - eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext)beanDefinitionRegistry) + if (beanDefinitionRegistry instanceof ConfigurableApplicationContext) { + eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext) beanDefinitionRegistry) } - else if(resourcePatternResolver.resourceLoader instanceof ConfigurableApplicationContext) { - eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext)resourcePatternResolver.resourceLoader) + else if (resourcePatternResolver.resourceLoader instanceof ConfigurableApplicationContext) { + eventPublisher = new ConfigurableApplicationContextEventPublisher((ConfigurableApplicationContext) resourcePatternResolver.resourceLoader) } else { eventPublisher = new DefaultApplicationEventPublisher() @@ -146,11 +151,11 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ */ MessageSource findMessageSource(BeanDefinitionRegistry beanDefinitionRegistry) { MessageSource messageSource - if(beanDefinitionRegistry instanceof MessageSource){ - messageSource = (MessageSource)beanDefinitionRegistry + if (beanDefinitionRegistry instanceof MessageSource) { + messageSource = (MessageSource) beanDefinitionRegistry } - else if(resourcePatternResolver.resourceLoader instanceof MessageSource) { - messageSource = (MessageSource)resourcePatternResolver.resourceLoader + else if (resourcePatternResolver.resourceLoader instanceof MessageSource) { + messageSource = (MessageSource) resourcePatternResolver.resourceLoader } else { messageSource = new StaticMessageSource() @@ -190,14 +195,13 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ def readerFactory = new CachingMetadataReaderFactory(resourcePatternResolver) for (pkg in packages) { String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + - ClassUtils.convertClassNameToResourcePath(pkg) + ENTITY_CLASS_RESOURCE_PATTERN; + ClassUtils.convertClassNameToResourcePath(pkg) + ENTITY_CLASS_RESOURCE_PATTERN scanUsingPattern(pattern, readerFactory) } - def entityNames = AstUtils.getKnownEntityNames() - if(entityNames) { + if (entityNames) { // only works at development time for (entityName in entityNames) { try { @@ -209,7 +213,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ } else { // try the default package in case of a script without recursing into subpackages - String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + "*.class" + String pattern = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX + '*.class' scanUsingPattern(pattern, readerFactory) } } @@ -220,7 +224,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ for (Resource res in resources) { def reader = readerFactory.getMetadataReader(res) def annotationMetadata = reader.annotationMetadata - if (annotationMetadata.hasAnnotation("grails.persistence.Entity") || annotationMetadata.hasAnnotation(Entity.name) || annotationMetadata.hasAnnotation(jakarta.persistence.Entity.name)) { + if (annotationMetadata.hasAnnotation('grails.persistence.Entity') || annotationMetadata.hasAnnotation(Entity.name) || annotationMetadata.hasAnnotation(jakarta.persistence.Entity.name)) { persistentClasses << classLoader.loadClass(reader.classMetadata.className) } } @@ -234,7 +238,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ @CompileStatic void configureForBeanDefinitionRegistry(BeanDefinitionRegistry beanDefinitionRegistry) { - if(configuration instanceof ConfigurableEnvironment && beanDefinitionRegistry instanceof ConfigurableApplicationContext) { + if (configuration instanceof ConfigurableEnvironment && beanDefinitionRegistry instanceof ConfigurableApplicationContext) { def env = (ConfigurableEnvironment) configuration def conversionService = ((ConfigurableApplicationContext) beanDefinitionRegistry).getEnvironment().getConversionService() @@ -246,14 +250,14 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ scanForPersistentClasses() - if( GroovyBeanReaderInit.isAvailable() ) { + if (GroovyBeanReaderInit.isAvailable()) { GroovyBeanReaderInit.registerBeans(beanDefinitionRegistry, getBeanDefinitions(beanDefinitionRegistry)) } - else if (GrailsBeanBuilderInit.isAvailable() ) { + else if (GrailsBeanBuilderInit.isAvailable()) { GrailsBeanBuilderInit.registerBeans(beanDefinitionRegistry, getBeanDefinitions(beanDefinitionRegistry)) } else { - throw new IllegalStateException("Neither Spring 4.0+ nor grails-spring dependency found on classpath to enable GORM configuration. If you are using an earlier version of Spring please add the grails-spring dependency to your classpath.") + throw new IllegalStateException('Neither Spring 4.0+ nor grails-spring dependency found on classpath to enable GORM configuration. If you are using an earlier version of Spring please add the grails-spring dependency to your classpath.') } } @@ -262,7 +266,6 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ return {} } - protected Collection collectMappedClasses(String datastoreType) { def classes = !secondaryDatastore ? persistentClasses : persistentClasses.findAll() { Class cls -> isMappedClass(datastoreType, cls) @@ -274,8 +277,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ datastoreType.equals(ClassPropertyFetcher.getStaticPropertyValue(cls, GormProperties.MAPPING_STRATEGY, String)) } - - abstract public Closure getBeanDefinitions(BeanDefinitionRegistry beanDefinitionRegistry) + abstract Closure getBeanDefinitions(BeanDefinitionRegistry beanDefinitionRegistry) /** * Internal method aiding in datastore configuration. @@ -287,7 +289,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ */ @CompileDynamic Closure getAdditionalBeansConfiguration(BeanDefinitionRegistry registry, String type) { - {-> + { -> "${type}TransactionManager"(DatastoreTransactionManager) { datastore = ref("${type}Datastore") } @@ -301,7 +303,6 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ "${type}PersistenceContextInterceptorAggregator"(PersistenceContextInterceptorAggregator) - def classLoader = Thread.currentThread().contextClassLoader if (registry.containsBeanDefinition('dispatcherServlet') && ClassUtils.isPresent(OSIV_CLASS_NAME, classLoader)) { String interceptorName = "${type}OpenSessionInViewInterceptor" @@ -310,13 +311,13 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ } } loadDataServices(null) - .each {serviceName, serviceClass-> - "$serviceName"(DatastoreServiceMethodInvokingFactoryBean, serviceClass) { - targetObject = ref("${type}Datastore") - targetMethod = 'getService' - arguments = [serviceClass] - } - } + .each { serviceName, serviceClass -> + "$serviceName"(DatastoreServiceMethodInvokingFactoryBean, serviceClass) { + targetObject = ref("${type}Datastore") + targetMethod = 'getService' + arguments = [serviceClass] + } + } } } @@ -336,7 +337,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ if (secondaryDatastore) { serviceName = secondaryDatastore + NameUtils.capitalize(serviceName) } - if (serviceClass != null && serviceClass != Object.class) { + if (serviceClass != null && serviceClass != Object) { services.put(serviceName, serviceClass) } } @@ -367,16 +368,16 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ @CompileStatic protected Class getGrailsApplicationClass() { ClassLoader cl = getClass().getClassLoader() - if(ClassUtils.isPresent("grails.core.DefaultGrailsApplication", cl)) { - return ClassUtils.forName("grails.core.DefaultGrailsApplication", cl) + if (ClassUtils.isPresent('grails.core.DefaultGrailsApplication', cl)) { + return ClassUtils.forName('grails.core.DefaultGrailsApplication', cl) } - throw new IllegalStateException("No version of Grails found on classpath") + throw new IllegalStateException('No version of Grails found on classpath') } protected boolean isGrailsPresent() { ClassLoader cl = getClass().getClassLoader() - if(ClassUtils.isPresent("grails.core.DefaultGrailsApplication", cl)) { + if (ClassUtils.isPresent('grails.core.DefaultGrailsApplication', cl)) { return true } return false @@ -384,7 +385,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ @CompileStatic protected Class getGrailsValidatorClass() { - throw new UnsupportedOperationException("Method getGrailsValidatorClass no longer supported") + throw new UnsupportedOperationException('Method getGrailsValidatorClass no longer supported') } @CompileDynamic @@ -400,7 +401,7 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ static void registerBeans(BeanDefinitionRegistry registry, Closure beanDefinitions) { def classLoader = Thread.currentThread().contextClassLoader def beanReader = classLoader.loadClass('org.springframework.beans.factory.groovy.GroovyBeanDefinitionReader').newInstance(registry) - beanReader.beans beanDefinitions + beanReader.beans(beanDefinitions) } } @@ -418,8 +419,8 @@ abstract class AbstractDatastoreInitializer implements ResourceLoaderAware{ static void registerBeans(BeanDefinitionRegistry registry, Closure beanDefinitions) { def classLoader = Thread.currentThread().contextClassLoader def beanBuilder = classLoader.loadClass('grails.spring.BeanBuilder').newInstance() - beanBuilder.beans beanDefinitions - beanBuilder.registerBeans registry + beanBuilder.beans(beanDefinitions) + beanBuilder.registerBeans(registry) } } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/support/InstanceFactoryBean.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/support/InstanceFactoryBean.java index ebc362ac5af..3a50eec93e0 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/support/InstanceFactoryBean.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/support/InstanceFactoryBean.java @@ -55,7 +55,6 @@ public T getObject() { return object; } - public void setObject(T object) { this.object = object; } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/support/ServiceRegistryFactoryBean.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/support/ServiceRegistryFactoryBean.groovy index 2aacd11e46c..2977a9e5df7 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/support/ServiceRegistryFactoryBean.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/bootstrap/support/ServiceRegistryFactoryBean.groovy @@ -19,24 +19,21 @@ package org.grails.datastore.gorm.bootstrap.support -import grails.gorm.services.Service +import java.beans.Introspector + import groovy.transform.CompileStatic -import org.grails.datastore.mapping.core.Datastore -import org.grails.datastore.mapping.reflect.NameUtils -import org.grails.datastore.mapping.services.ServiceRegistry + import org.springframework.beans.BeansException import org.springframework.beans.factory.BeanFactory import org.springframework.beans.factory.BeanFactoryAware import org.springframework.beans.factory.FactoryBean -import org.springframework.beans.factory.InitializingBean import org.springframework.beans.factory.config.AutowireCapableBeanFactory -import org.springframework.beans.factory.config.ConfigurableBeanFactory import org.springframework.beans.factory.config.ConfigurableListableBeanFactory -import org.springframework.context.ApplicationContext -import org.springframework.context.ApplicationContextAware -import org.springframework.context.ConfigurableApplicationContext -import java.beans.Introspector +import grails.gorm.services.Service +import org.grails.datastore.mapping.core.Datastore +import org.grails.datastore.mapping.reflect.NameUtils +import org.grails.datastore.mapping.services.ServiceRegistry /** * @author Graeme Rocher @@ -44,6 +41,7 @@ import java.beans.Introspector */ @CompileStatic class ServiceRegistryFactoryBean implements FactoryBean, BeanFactoryAware { + final Datastore datastore ServiceRegistryFactoryBean(Datastore datastore) { @@ -67,27 +65,27 @@ class ServiceRegistryFactoryBean implements FactoryBean, BeanFa @Override void setBeanFactory(BeanFactory beanFactory) throws BeansException { - if(beanFactory instanceof ConfigurableListableBeanFactory) { - AutowireCapableBeanFactory autowireCapableBeanFactory = beanFactory instanceof AutowireCapableBeanFactory ? (AutowireCapableBeanFactory)beanFactory : null - ConfigurableListableBeanFactory configurableListableBeanFactory = (ConfigurableListableBeanFactory)beanFactory + if (beanFactory instanceof ConfigurableListableBeanFactory) { + AutowireCapableBeanFactory autowireCapableBeanFactory = beanFactory instanceof AutowireCapableBeanFactory ? (AutowireCapableBeanFactory) beanFactory : null + ConfigurableListableBeanFactory configurableListableBeanFactory = (ConfigurableListableBeanFactory) beanFactory - for(org.grails.datastore.mapping.services.Service service in datastore.services) { + for (org.grails.datastore.mapping.services.Service service in datastore.services) { def serviceClass = service.getClass() Service ann = serviceClass.getAnnotation(Service) String serviceName = ann?.name() - if(serviceName == null) { + if (serviceName == null) { serviceName = Introspector.decapitalize(serviceClass.simpleName) } - if(!configurableListableBeanFactory.containsBean(serviceName)) { + if (!configurableListableBeanFactory.containsBean(serviceName)) { autowireCapableBeanFactory?.autowireBean(service) service.setDatastore(datastore) configurableListableBeanFactory.registerSingleton(serviceName, service) } else { - String root = Introspector.decapitalize( datastore.getClass().simpleName - 'Datastore' ) + String root = Introspector.decapitalize(datastore.getClass().simpleName - 'Datastore') serviceName = "${root}${NameUtils.capitalize(serviceName)}" - if(!configurableListableBeanFactory.containsBean(serviceName)) { + if (!configurableListableBeanFactory.containsBean(serviceName)) { autowireCapableBeanFactory?.autowireBean(service) service.setDatastore(datastore) configurableListableBeanFactory.registerSingleton(serviceName, service) diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/AutoTimestampEventListener.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/AutoTimestampEventListener.java index bdf25e622d8..8da88a0b34e 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/AutoTimestampEventListener.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/AutoTimestampEventListener.java @@ -18,6 +18,21 @@ */ package org.grails.datastore.gorm.events; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.ApplicationEvent; + import grails.gorm.annotation.AutoTimestamp; import org.grails.datastore.gorm.timestamp.DefaultTimestampProvider; import org.grails.datastore.gorm.timestamp.TimestampProvider; @@ -25,18 +40,15 @@ import org.grails.datastore.mapping.config.Settings; import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.engine.EntityAccess; -import org.grails.datastore.mapping.engine.event.*; +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener; +import org.grails.datastore.mapping.engine.event.EventType; +import org.grails.datastore.mapping.engine.event.PreInsertEvent; +import org.grails.datastore.mapping.engine.event.PreUpdateEvent; import org.grails.datastore.mapping.model.ClassMapping; import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.ApplicationEvent; - -import java.lang.reflect.Field; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; /** * An event listener that adds support for GORM-style auto-timestamping @@ -198,7 +210,7 @@ protected void storeDateCreatedAndLastUpdatedInfo(PersistentEntity persistentEnt protected void storeTimestampAvailability(Map>> timestampAvailabilityMap, PersistentEntity persistentEntity, PersistentProperty property) { if (property != null && timestampProvider.supportsCreating(property.getType())) { Optional> timestampProperties = timestampAvailabilityMap.computeIfAbsent(persistentEntity.getName(), k -> Optional.of(new HashSet<>())); - if(timestampProperties.isPresent()) { + if (timestampProperties.isPresent()) { timestampProperties.get().add(property.getName()); } else { @@ -219,7 +231,7 @@ public void setTimestampProvider(TimestampProvider timestampProvider) { this.timestampProvider = timestampProvider; } - private void processAllEntries(final Set>>> entries, final Runnable runnable) { + private void processAllEntries(final Set>>> entries, final Runnable runnable) { Map>> originalValues = new LinkedHashMap<>(); for (Map.Entry>> entry: entries) { originalValues.put(entry.getKey(), entry.getValue()); @@ -247,10 +259,10 @@ private void processEntries(final List classes, Map classes, final Runnable runnable) { + public void withoutLastUpdated(final List classes, final Runnable runnable) { processEntries(classes, entitiesWithLastUpdated, runnable); } @@ -270,7 +282,7 @@ public void withoutLastUpdated(final List classes, final Runnable runnabl * @param clazz Which class to disable the last updated processing for * @param runnable The code to execute while the last updated listener is disabled */ - public void withoutLastUpdated(final Class clazz, final Runnable runnable) { + public void withoutLastUpdated(final Class clazz, final Runnable runnable) { ArrayList list = new ArrayList<>(1); list.add(clazz); withoutLastUpdated(list, runnable); @@ -281,7 +293,7 @@ public void withoutLastUpdated(final Class clazz, final Runnable runnable) { * * @param runnable The code to execute while the date created listener is disabled */ - public void withoutDateCreated(final Runnable runnable) { + public void withoutDateCreated(final Runnable runnable) { processAllEntries(entitiesWithDateCreated.entrySet(), runnable); } @@ -291,7 +303,7 @@ public void withoutDateCreated(final Runnable runnable) { * @param classes Which classes to disable the date created processing for * @param runnable The code to execute while the date created listener is disabled */ - public void withoutDateCreated(final List classes, final Runnable runnable) { + public void withoutDateCreated(final List classes, final Runnable runnable) { processEntries(classes, entitiesWithDateCreated, runnable); } @@ -301,7 +313,7 @@ public void withoutDateCreated(final List classes, final Runnable runnabl * @param clazz Which class to disable the date created processing for * @param runnable The code to execute while the date created listener is disabled */ - public void withoutDateCreated(final Class clazz, final Runnable runnable) { + public void withoutDateCreated(final Class clazz, final Runnable runnable) { ArrayList list = new ArrayList<>(1); list.add(clazz); withoutDateCreated(list, runnable); @@ -312,7 +324,7 @@ public void withoutDateCreated(final Class clazz, final Runnable runnable) { * * @param runnable The code to execute while the timestamp listeners are disabled */ - public void withoutTimestamps(final Runnable runnable) { + public void withoutTimestamps(final Runnable runnable) { withoutDateCreated(() -> withoutLastUpdated(runnable)); } @@ -322,7 +334,7 @@ public void withoutTimestamps(final Runnable runnable) { * @param classes Which classes to disable the timestamp processing for * @param runnable The code to execute while the timestamp listeners are disabled */ - public void withoutTimestamps(final List classes, final Runnable runnable) { + public void withoutTimestamps(final List classes, final Runnable runnable) { withoutDateCreated(classes, () -> withoutLastUpdated(classes, runnable)); } @@ -332,7 +344,7 @@ public void withoutTimestamps(final List classes, final Runnable runnable * @param clazz Which class to disable the timestamp processing for * @param runnable The code to execute while the timestamp listeners are disabled */ - public void withoutTimestamps(final Class clazz, final Runnable runnable) { + public void withoutTimestamps(final Class clazz, final Runnable runnable) { withoutDateCreated(clazz, () -> withoutLastUpdated(clazz, runnable)); } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/ConfigurableApplicationContextEventPublisher.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/ConfigurableApplicationContextEventPublisher.groovy index 98ad2319cef..91073cd1c07 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/ConfigurableApplicationContextEventPublisher.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/ConfigurableApplicationContextEventPublisher.groovy @@ -20,6 +20,7 @@ package org.grails.datastore.gorm.events import groovy.transform.CompileStatic + import org.springframework.context.ApplicationEvent import org.springframework.context.ApplicationListener import org.springframework.context.ConfigurableApplicationContext diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/ConfigurableApplicationEventPublisher.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/ConfigurableApplicationEventPublisher.groovy index 868d557cbb5..57ea9a82440 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/ConfigurableApplicationEventPublisher.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/ConfigurableApplicationEventPublisher.groovy @@ -36,4 +36,4 @@ interface ConfigurableApplicationEventPublisher extends ApplicationEventPublishe * @param listener The application listener */ void addApplicationListener(ApplicationListener listener) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DefaultApplicationEventPublisher.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DefaultApplicationEventPublisher.groovy index 99681514320..4101072e38f 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DefaultApplicationEventPublisher.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DefaultApplicationEventPublisher.groovy @@ -20,6 +20,7 @@ package org.grails.datastore.gorm.events import groovy.transform.CompileStatic + import org.springframework.context.ApplicationEvent import org.springframework.context.ApplicationListener import org.springframework.context.PayloadApplicationEvent @@ -37,13 +38,13 @@ class DefaultApplicationEventPublisher implements ConfigurableApplicationEventPu private List applicationListeners = [] @Override void publishEvent(ApplicationEvent event) { - for(listener in applicationListeners) { - if(listener instanceof SmartApplicationListener) { + for (listener in applicationListeners) { + if (listener instanceof SmartApplicationListener) { SmartApplicationListener smartApplicationListener = (SmartApplicationListener) listener - if( !smartApplicationListener.supportsEventType((Class)event.getClass()) ) { + if (!smartApplicationListener.supportsEventType((Class) event.getClass())) { continue } - else if(!smartApplicationListener.supportsSourceType(event.source.getClass())) { + else if (!smartApplicationListener.supportsSourceType(event.source.getClass())) { continue } } @@ -53,14 +54,14 @@ class DefaultApplicationEventPublisher implements ConfigurableApplicationEventPu @Override void publishEvent(Object event) { - for(listener in applicationListeners) { + for (listener in applicationListeners) { def eventObject = new PayloadApplicationEvent(this, event) - if(listener instanceof SmartApplicationListener) { + if (listener instanceof SmartApplicationListener) { SmartApplicationListener smartApplicationListener = (SmartApplicationListener) listener - if( !smartApplicationListener.supportsEventType((Class)eventObject.getClass()) ) { + if (!smartApplicationListener.supportsEventType((Class) eventObject.getClass())) { continue } - else if(!smartApplicationListener.supportsSourceType(eventObject.source.getClass())) { + else if (!smartApplicationListener.supportsSourceType(eventObject.source.getClass())) { continue } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DomainEventListener.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DomainEventListener.java index 13371dc5ae7..4f800d779bd 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DomainEventListener.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/events/DomainEventListener.java @@ -26,18 +26,28 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import org.springframework.beans.factory.config.AutowireCapableBeanFactory; +import org.springframework.context.ApplicationEvent; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.util.ReflectionUtils; + import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider; import org.grails.datastore.mapping.dirty.checking.DirtyCheckable; import org.grails.datastore.mapping.engine.EntityAccess; -import org.grails.datastore.mapping.engine.event.*; +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener; +import org.grails.datastore.mapping.engine.event.PostDeleteEvent; +import org.grails.datastore.mapping.engine.event.PostInsertEvent; +import org.grails.datastore.mapping.engine.event.PostLoadEvent; +import org.grails.datastore.mapping.engine.event.PostUpdateEvent; +import org.grails.datastore.mapping.engine.event.PreDeleteEvent; +import org.grails.datastore.mapping.engine.event.PreInsertEvent; +import org.grails.datastore.mapping.engine.event.PreLoadEvent; +import org.grails.datastore.mapping.engine.event.PreUpdateEvent; import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.config.GormProperties; -import org.springframework.beans.factory.config.AutowireCapableBeanFactory; -import org.springframework.context.ApplicationEvent; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.util.ReflectionUtils; /** * An event listener that provides support for GORM domain events. @@ -48,18 +58,18 @@ public class DomainEventListener extends AbstractPersistenceEventListener implements MappingContext.Listener { - private Map> entityEvents = new ConcurrentHashMap>(); + private Map> entityEvents = new ConcurrentHashMap<>(); @SuppressWarnings("rawtypes") public static final Class[] ZERO_PARAMS = {}; - public static final String EVENT_BEFORE_INSERT = "beforeInsert"; + public static final String EVENT_BEFORE_INSERT = "beforeInsert"; private static final String EVENT_BEFORE_UPDATE = "beforeUpdate"; private static final String EVENT_BEFORE_DELETE = "beforeDelete"; - private static final String EVENT_BEFORE_LOAD = "beforeLoad"; - private static final String EVENT_AFTER_INSERT = "afterInsert"; - private static final String EVENT_AFTER_UPDATE = "afterUpdate"; - private static final String EVENT_AFTER_DELETE = "afterDelete"; - private static final String EVENT_AFTER_LOAD = "afterLoad"; + private static final String EVENT_BEFORE_LOAD = "beforeLoad"; + private static final String EVENT_AFTER_INSERT = "afterInsert"; + private static final String EVENT_AFTER_UPDATE = "afterUpdate"; + private static final String EVENT_AFTER_DELETE = "afterDelete"; + private static final String EVENT_AFTER_LOAD = "afterLoad"; private static final List REFRESH_EVENTS = Arrays.asList( EVENT_BEFORE_INSERT, EVENT_BEFORE_UPDATE, EVENT_BEFORE_DELETE); @@ -74,15 +84,14 @@ public DomainEventListener(final Datastore datastore) { } datastore.getMappingContext().addMappingContextListener(this); - if(datastore instanceof ConnectionSourcesProvider) { - autowireEntities = ((ConnectionSourcesProvider)datastore).getConnectionSources().getDefaultConnectionSource().getSettings().isAutowire(); + if (datastore instanceof ConnectionSourcesProvider) { + autowireEntities = ((ConnectionSourcesProvider) datastore).getConnectionSources().getDefaultConnectionSource().getSettings().isAutowire(); } else { autowireEntities = false; } } - protected DomainEventListener(ConnectionSourcesProvider connectionSourcesProvider, final MappingContext mappingContext) { super(null); @@ -93,12 +102,11 @@ protected DomainEventListener(ConnectionSourcesProvider connectionSourcesProvide mappingContext.addMappingContextListener(this); } - @Override protected void onPersistenceEvent(final AbstractPersistenceEvent event) { - switch(event.getEventType()) { + switch (event.getEventType()) { case PreInsert: - if( !beforeInsert(event.getEntity(), event.getEntityAccess(), (PreInsertEvent) event) ) { + if (!beforeInsert(event.getEntity(), event.getEntityAccess(), (PreInsertEvent) event)) { event.cancel(); } break; @@ -106,7 +114,7 @@ protected void onPersistenceEvent(final AbstractPersistenceEvent event) { afterInsert(event.getEntity(), event.getEntityAccess(), (PostInsertEvent) event); break; case PreUpdate: - if( !beforeUpdate(event.getEntity(), event.getEntityAccess(), (PreUpdateEvent) event) ) { + if (!beforeUpdate(event.getEntity(), event.getEntityAccess(), (PreUpdateEvent) event)) { event.cancel(); } break; @@ -114,7 +122,7 @@ protected void onPersistenceEvent(final AbstractPersistenceEvent event) { afterUpdate(event.getEntity(), event.getEntityAccess(), (PostUpdateEvent) event); break; case PreDelete: - if( ! beforeDelete(event.getEntity(), event.getEntityAccess(), (PreDeleteEvent) event) ) { + if (!beforeDelete(event.getEntity(), event.getEntityAccess(), (PreDeleteEvent) event)) { event.cancel(); } break; @@ -156,7 +164,7 @@ public boolean beforeInsert(final PersistentEntity entity, final EntityAccess ea } return invokeEvent(EVENT_BEFORE_INSERT, entity, ea, event); - } + } protected void setVersion(final EntityAccess ea) { final Class versionType = ea.getPersistentEntity().getVersion().getType(); @@ -177,7 +185,7 @@ public boolean beforeUpdate(final PersistentEntity entity, final EntityAccess ea public boolean beforeUpdate(final PersistentEntity entity, final EntityAccess ea, PreUpdateEvent event) { return invokeEvent(EVENT_BEFORE_UPDATE, entity, ea, event); - } + } public boolean beforeDelete(final PersistentEntity entity, final EntityAccess ea) { return invokeEvent(EVENT_BEFORE_DELETE, entity, ea, null); @@ -185,7 +193,7 @@ public boolean beforeDelete(final PersistentEntity entity, final EntityAccess ea public boolean beforeDelete(final PersistentEntity entity, final EntityAccess ea, PreDeleteEvent event) { return invokeEvent(EVENT_BEFORE_DELETE, entity, ea, event); - } + } public void beforeLoad(final PersistentEntity entity, final EntityAccess ea) { beforeLoad(entity, ea, null); @@ -201,7 +209,7 @@ public void afterDelete(final PersistentEntity entity, final EntityAccess ea) { public void afterDelete(final PersistentEntity entity, final EntityAccess ea, PostDeleteEvent event) { invokeEvent(EVENT_AFTER_DELETE, entity, ea, event); - } + } public void afterInsert(final PersistentEntity entity, final EntityAccess ea) { afterInsert(entity, ea, null); @@ -214,7 +222,7 @@ public void afterInsert(final PersistentEntity entity, final EntityAccess ea, Po private void activateDirtyChecking(EntityAccess ea) { Object e = ea.getEntity(); - if(e instanceof DirtyCheckable) { + if (e instanceof DirtyCheckable) { ((DirtyCheckable) e).trackChanges(); } } @@ -234,7 +242,7 @@ public void afterLoad(final PersistentEntity entity, final EntityAccess ea) { public void afterLoad(final PersistentEntity entity, final EntityAccess ea, PostLoadEvent event) { activateDirtyChecking(ea); - if (autowireEntities || ( entity != null && entity.getMapping().getMappedForm().isAutowire() )) { + if (autowireEntities || (entity != null && entity.getMapping().getMappedForm().isAutowire())) { autowireBeanProperties(ea.getEntity()); } invokeEvent(EVENT_AFTER_LOAD, entity, ea, event); @@ -242,7 +250,7 @@ public void afterLoad(final PersistentEntity entity, final EntityAccess ea, Post protected void autowireBeanProperties(final Object entity) { ConfigurableApplicationContext applicationContext = datastore.getApplicationContext(); - if(applicationContext != null) { + if (applicationContext != null) { applicationContext.getAutowireCapableBeanFactory().autowireBeanProperties( entity, AutowireCapableBeanFactory.AUTOWIRE_BY_NAME, false); } @@ -277,9 +285,8 @@ private boolean invokeEvent(String eventName, PersistentEntity entity, EntityAcc return true; } - final Object result; - if(ea != null) { + if (ea != null) { final Object o = ea.getEntity(); if (eventMethod.getParameterTypes().length == 1) { @@ -293,7 +300,7 @@ private boolean invokeEvent(String eventName, PersistentEntity entity, EntityAcc result = null; } - boolean booleanResult = (result instanceof Boolean) ? (Boolean)result : true; + boolean booleanResult = (result instanceof Boolean) ? (Boolean) result : true; if (booleanResult && REFRESH_EVENTS.contains(eventName)) { ea.refresh(); } @@ -302,17 +309,17 @@ private boolean invokeEvent(String eventName, PersistentEntity entity, EntityAcc private void createEventCaches(PersistentEntity entity) { Class javaClass = entity.getJavaClass(); - final ConcurrentHashMap events = new ConcurrentHashMap(); + final ConcurrentHashMap events = new ConcurrentHashMap<>(); entityEvents.put(entity, events); findAndCacheEvent(EVENT_BEFORE_INSERT, javaClass, events); findAndCacheEvent(EVENT_BEFORE_UPDATE, javaClass, events); findAndCacheEvent(EVENT_BEFORE_DELETE, javaClass, events); - findAndCacheEvent(EVENT_BEFORE_LOAD, javaClass, events); - findAndCacheEvent(EVENT_AFTER_INSERT, javaClass, events); - findAndCacheEvent(EVENT_AFTER_UPDATE, javaClass, events); - findAndCacheEvent(EVENT_AFTER_DELETE, javaClass, events); - findAndCacheEvent(EVENT_AFTER_LOAD, javaClass, events); + findAndCacheEvent(EVENT_BEFORE_LOAD, javaClass, events); + findAndCacheEvent(EVENT_AFTER_INSERT, javaClass, events); + findAndCacheEvent(EVENT_AFTER_UPDATE, javaClass, events); + findAndCacheEvent(EVENT_AFTER_DELETE, javaClass, events); + findAndCacheEvent(EVENT_AFTER_LOAD, javaClass, events); } private void findAndCacheEvent(String event, Class javaClass, Map events) { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/AbstractFindByFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/AbstractFindByFinder.java index aab25a7d63a..ce3f1710c91 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/AbstractFindByFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/AbstractFindByFinder.java @@ -42,7 +42,7 @@ protected AbstractFindByFinder(Pattern pattern, MappingContext mappingContext) { @Override protected Object doInvokeInternal(final DynamicFinderInvocation invocation) { - return execute(new SessionCallback() { + return execute(new SessionCallback<>() { public Object doInSession(final Session session) { return invokeQuery(buildQuery(invocation, session)); } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/AbstractFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/AbstractFinder.java index 5c0347d891f..fc23f59795a 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/AbstractFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/AbstractFinder.java @@ -18,9 +18,9 @@ */ package org.grails.datastore.gorm.finders; -import grails.gorm.CriteriaBuilder; import groovy.lang.Closure; +import grails.gorm.CriteriaBuilder; import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.DatastoreUtils; import org.grails.datastore.mapping.core.SessionCallback; @@ -42,7 +42,7 @@ public AbstractFinder(final Datastore datastore) { } protected T execute(final SessionCallback callback) { - if(datastore != null) { + if (datastore != null) { return DatastoreUtils.execute(datastore, callback); } else { @@ -51,7 +51,7 @@ protected T execute(final SessionCallback callback) { } protected void execute(final VoidSessionCallback callback) { - if(datastore != null) { + if (datastore != null) { DatastoreUtils.execute(datastore, callback); } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/CountByFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/CountByFinder.java index b07eefaf7a8..a2679def639 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/CountByFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/CountByFinder.java @@ -47,7 +47,7 @@ public CountByFinder(MappingContext mappingContext) { @Override protected Object doInvokeInternal(final DynamicFinderInvocation invocation) { - return execute(new SessionCallback() { + return execute(new SessionCallback<>() { public Object doInSession(final Session session) { Query q = buildQuery(invocation, session); return invokeQuery(q); @@ -79,7 +79,7 @@ protected Query buildQuery(DynamicFinderInvocation invocation, Class clazz, Q } else { for (MethodExpression expression : invocation.getExpressions()) { - q.add( expression.createCriterion() ); + q.add(expression.createCriterion()); } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/DynamicFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/DynamicFinder.java index 17bd93ca0bf..3fd36088ecd 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/DynamicFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/DynamicFinder.java @@ -14,26 +14,33 @@ */ package org.grails.datastore.gorm.finders; -import grails.gorm.DetachedCriteria; -import groovy.lang.Closure; -import groovy.lang.MissingMethodException; - import java.lang.reflect.Constructor; -import java.util.*; +import java.util.ArrayList; +import java.util.Collections; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import groovy.lang.Closure; +import groovy.lang.MissingMethodException; +import org.codehaus.groovy.runtime.DefaultGroovyMethods; + import jakarta.persistence.FetchType; import jakarta.persistence.criteria.JoinType; -import org.codehaus.groovy.runtime.DefaultGroovyMethods; +import org.springframework.core.convert.ConversionException; +import org.springframework.core.convert.ConversionService; +import org.springframework.util.StringUtils; + +import grails.gorm.DetachedCriteria; import org.grails.datastore.gorm.finders.MethodExpression.Between; import org.grails.datastore.gorm.finders.MethodExpression.Equal; import org.grails.datastore.gorm.finders.MethodExpression.GreaterThan; import org.grails.datastore.gorm.finders.MethodExpression.GreaterThanEquals; import org.grails.datastore.gorm.finders.MethodExpression.Ilike; import org.grails.datastore.gorm.finders.MethodExpression.InList; -import org.grails.datastore.gorm.finders.MethodExpression.NotInList; import org.grails.datastore.gorm.finders.MethodExpression.InRange; import org.grails.datastore.gorm.finders.MethodExpression.IsEmpty; import org.grails.datastore.gorm.finders.MethodExpression.IsNotEmpty; @@ -43,6 +50,7 @@ import org.grails.datastore.gorm.finders.MethodExpression.LessThanEquals; import org.grails.datastore.gorm.finders.MethodExpression.Like; import org.grails.datastore.gorm.finders.MethodExpression.NotEqual; +import org.grails.datastore.gorm.finders.MethodExpression.NotInList; import org.grails.datastore.gorm.finders.MethodExpression.Rlike; import org.grails.datastore.gorm.query.criteria.AbstractDetachedCriteria; import org.grails.datastore.mapping.core.Datastore; @@ -54,9 +62,7 @@ import org.grails.datastore.mapping.query.api.QueryArgumentsAware; import org.grails.datastore.mapping.reflect.ClassUtils; import org.grails.datastore.mapping.reflect.NameUtils; -import org.springframework.core.convert.ConversionException; -import org.springframework.core.convert.ConversionService; -import org.springframework.util.StringUtils; + /** * Abstract base class for dynamic finders. * @@ -94,7 +100,7 @@ public abstract class DynamicFinder extends AbstractFinder implements QueryBuild private static final Object[] EMPTY_OBJECT_ARRAY = {}; private static final String NOT = "Not"; - private static final Map methodExpressions = new LinkedHashMap(); + private static final Map methodExpressions = new LinkedHashMap<>(); protected final MappingContext mappingContext; static { @@ -107,10 +113,11 @@ public abstract class DynamicFinder extends AbstractFinder implements QueryBuild // populate the default method expressions try { Class[] classes = { - Equal.class, NotEqual.class, NotInList.class, InList.class, InRange.class, Between.class, Like.class, Ilike.class, Rlike.class, - GreaterThanEquals.class, LessThanEquals.class, GreaterThan.class, - LessThan.class, IsNull.class, IsNotNull.class, IsEmpty.class, - IsEmpty.class, IsNotEmpty.class }; + Equal.class, NotEqual.class, NotInList.class, InList.class, InRange.class, Between.class, Like.class, Ilike.class, Rlike.class, + GreaterThanEquals.class, LessThanEquals.class, GreaterThan.class, + LessThan.class, IsNull.class, IsNotNull.class, IsEmpty.class, + IsEmpty.class, IsNotEmpty.class + }; Class[] constructorParamTypes = { Class.class, String.class }; for (Class c : classes) { methodExpressions.put(c.getSimpleName(), c.getConstructor(constructorParamTypes)); @@ -173,9 +180,9 @@ public static void registerNewMethodExpression(Class methodExpression) { * @return The match specification */ public static MatchSpec buildMatchSpec(String prefix, String methodName, int parameterCount) { - String methodPattern = "("+prefix+")([A-Z]\\w*)"; + String methodPattern = "(" + prefix + ")([A-Z]\\w*)"; Matcher matcher = Pattern.compile(methodPattern).matcher(methodName); - if(matcher.find()) { + if (matcher.find()) { int totalRequiredArguments = 0; List expressions = new ArrayList<>(); if (matcher.groupCount() == 2) { @@ -204,10 +211,10 @@ public static MatchSpec buildMatchSpec(String prefix, String methodName, int par // otherwise there is only one expression if (!containsOperator && querySequence != null) { - MethodExpression solo =findMethodExpression(querySequence); + MethodExpression solo = findMethodExpression(querySequence); final int requiredArguments = solo.getArgumentsRequired(); - if (requiredArguments > parameterCount) { + if (requiredArguments > parameterCount) { return null; } @@ -221,7 +228,7 @@ public static MatchSpec buildMatchSpec(String prefix, String methodName, int par return null; } else { - return new MatchSpec(methodName,prefix, querySequence, totalRequiredArguments, expressions); + return new MatchSpec(methodName, prefix, querySequence, totalRequiredArguments, expressions); } } } @@ -246,7 +253,6 @@ public boolean isMethodMatch(String methodName) { return pattern.matcher(methodName.subSequence(0, methodName.length())).find(); } - public Object invoke(final Class clazz, String methodName, Closure additionalCriteria, Object[] arguments) { DynamicFinderInvocation invocation = createFinderInvocation(clazz, methodName, additionalCriteria, arguments); return doInvokeInternal(invocation); @@ -254,7 +260,7 @@ public Object invoke(final Class clazz, String methodName, Closure additionalCri public Object invoke(final Class clazz, String methodName, DetachedCriteria detachedCriteria, Object[] arguments) { DynamicFinderInvocation invocation = createFinderInvocation(clazz, methodName, null, arguments); - if (detachedCriteria != null ) { + if (detachedCriteria != null) { invocation.setDetachedCriteria(detachedCriteria); } return doInvokeInternal(invocation); @@ -267,7 +273,7 @@ public DynamicFinderInvocation createFinderInvocation(Class clazz, String method if (arguments == null) arguments = EMPTY_OBJECT_ARRAY; else { Object[] tmp = new Object[arguments.length]; - System.arraycopy(arguments,0,tmp, 0, arguments.length); + System.arraycopy(arguments, 0, tmp, 0, arguments.length); arguments = tmp; } Matcher match = pattern.matcher(methodName); @@ -346,11 +352,11 @@ public DynamicFinderInvocation createFinderInvocation(Class clazz, String method } // otherwise there is only one expression if (!containsOperator && querySequence != null) { - MethodExpression solo =findMethodExpression(clazz,querySequence); + MethodExpression solo = findMethodExpression(clazz, querySequence); final int requiredArguments = solo.getArgumentsRequired(); - if (requiredArguments > arguments.length) { - throw new MissingMethodException(methodName,clazz,arguments); + if (requiredArguments > arguments.length) { + throw new MissingMethodException(methodName, clazz, arguments); } totalRequiredArguments += requiredArguments; @@ -371,13 +377,13 @@ public DynamicFinderInvocation createFinderInvocation(Class clazz, String method // if the total of all the arguments necessary does not equal the number of arguments // throw exception if (totalRequiredArguments > arguments.length) { - throw new MissingMethodException(methodName,clazz,arguments); + throw new MissingMethodException(methodName, clazz, arguments); } // calculate the remaining arguments Object[] remainingArguments = new Object[arguments.length - totalRequiredArguments]; if (remainingArguments.length > 0) { - for (int i = 0, j = totalRequiredArguments; i < remainingArguments.length; i++,j++) { + for (int i = 0, j = totalRequiredArguments; i < remainingArguments.length; i++, j++) { remainingArguments[i] = arguments[j]; } } @@ -387,7 +393,7 @@ public DynamicFinderInvocation createFinderInvocation(Class clazz, String method } public Object invoke(final Class clazz, String methodName, Object[] arguments) { - return invoke(clazz, methodName, (Closure)null, arguments); + return invoke(clazz, methodName, (Closure) null, arguments); } /** @@ -399,20 +405,20 @@ public static void populateArgumentsForCriteria(BuildableCriteria query, Map arg if (argMap == null) { return; } - String orderParam = (String)argMap.get(ARGUMENT_ORDER); + String orderParam = (String) argMap.get(ARGUMENT_ORDER); Object fetchObj = argMap.get(ARGUMENT_FETCH); if (fetchObj instanceof Map) { - Map fetch = (Map)fetchObj; + Map fetch = (Map) fetchObj; for (Object o : fetch.keySet()) { String associationName = (String) o; Object fetchValue = fetch.get(associationName); - if(fetchValue instanceof FetchType) { - FetchType fetchType = (FetchType)fetchValue; + if (fetchValue instanceof FetchType) { + FetchType fetchType = (FetchType) fetchValue; handleFetchType(query, associationName, fetchType); } - else if(fetchValue instanceof JoinType) { - JoinType joinType = (JoinType)fetchValue; + else if (fetchValue instanceof JoinType) { + JoinType joinType = (JoinType) fetchValue; query.join(associationName, joinType); } else { FetchType fetchType = getFetchMode(fetchValue); @@ -421,30 +427,29 @@ else if(fetchValue instanceof JoinType) { } } - if(argMap.containsKey(ARGUMENT_CACHE)) { + if (argMap.containsKey(ARGUMENT_CACHE)) { query.cache(ClassUtils.getBooleanFromMap(ARGUMENT_CACHE, argMap)); } Object sortObject = argMap.get(ARGUMENT_SORT); boolean ignoreCase = !argMap.containsKey(ARGUMENT_IGNORE_CASE) || ClassUtils.getBooleanFromMap(ARGUMENT_IGNORE_CASE, argMap); - if (sortObject != null) { - if(sortObject instanceof CharSequence) { + if (sortObject instanceof CharSequence) { final String sort = sortObject.toString(); final Query.Order order = ORDER_DESC.equalsIgnoreCase(orderParam) ? Query.Order.desc(sort) : Query.Order.asc(sort); - if(ignoreCase) { + if (ignoreCase) { order.ignoreCase(); } query.order(order); } - else if(sortObject instanceof Map) { - Map sortMap = (Map)sortObject; + else if (sortObject instanceof Map) { + Map sortMap = (Map) sortObject; for (Object key : sortMap.keySet()) { Object value = sortMap.get(key); String sort = key.toString(); final Query.Order order = ORDER_DESC.equalsIgnoreCase(orderParam) ? Query.Order.desc(sort) : Query.Order.asc(sort); - if(ignoreCase) { + if (ignoreCase) { order.ignoreCase(); } query.order(order); @@ -453,9 +458,8 @@ else if(sortObject instanceof Map) { } } - if (query instanceof QueryArgumentsAware) { - ((QueryArgumentsAware)query).setArguments(argMap); + ((QueryArgumentsAware) query).setArguments(argMap); } } @@ -479,20 +483,20 @@ public static void populateArgumentsForCriteria(Class targetCl if (argMap.containsKey(ARGUMENT_OFFSET)) { offsetParam = conversionService.convert(argMap.get(ARGUMENT_OFFSET), Integer.class); } - String orderParam = (String)argMap.get(ARGUMENT_ORDER); + String orderParam = (String) argMap.get(ARGUMENT_ORDER); Object fetchObj = argMap.get(ARGUMENT_FETCH); if (fetchObj instanceof Map) { - Map fetch = (Map)fetchObj; + Map fetch = (Map) fetchObj; for (Object o : fetch.keySet()) { String associationName = (String) o; Object fetchValue = fetch.get(associationName); - if(fetchValue instanceof FetchType) { - FetchType fetchType = (FetchType)fetchValue; + if (fetchValue instanceof FetchType) { + FetchType fetchType = (FetchType) fetchValue; handleFetchType(query, associationName, fetchType); } - else if(fetchValue instanceof JoinType) { - JoinType joinType = (JoinType)fetchValue; + else if (fetchValue instanceof JoinType) { + JoinType joinType = (JoinType) fetchValue; query.join(associationName, joinType); } else { FetchType fetchType = getFetchMode(fetchValue); @@ -501,10 +505,10 @@ else if(fetchValue instanceof JoinType) { } } - if(argMap.containsKey(ARGUMENT_CACHE)) { + if (argMap.containsKey(ARGUMENT_CACHE)) { query.cache(ClassUtils.getBooleanFromMap(ARGUMENT_CACHE, argMap)); } - if(argMap.containsKey(ARGUMENT_LOCK)) { + if (argMap.containsKey(ARGUMENT_LOCK)) { query.lock(ClassUtils.getBooleanFromMap(ARGUMENT_LOCK, argMap)); } @@ -520,20 +524,20 @@ else if(fetchValue instanceof JoinType) { boolean ignoreCase = !argMap.containsKey(ARGUMENT_IGNORE_CASE) || ClassUtils.getBooleanFromMap(ARGUMENT_IGNORE_CASE, argMap); if (sortObject != null) { - if(sortObject instanceof CharSequence) { + if (sortObject instanceof CharSequence) { final String sort = sortObject.toString(); final String order = ORDER_DESC.equalsIgnoreCase(orderParam) ? ORDER_DESC : ORDER_ASC; addSimpleSort(query, sort, order, ignoreCase); } - else if(sortObject instanceof Map) { - Map sortMap = (Map)sortObject; + else if (sortObject instanceof Map) { + Map sortMap = (Map) sortObject; applySortForMap(query, sortMap, ignoreCase); } } if (query instanceof QueryArgumentsAware) { - ((QueryArgumentsAware)query).setArguments(argMap); + ((QueryArgumentsAware) query).setArguments(argMap); } } @@ -581,10 +585,10 @@ public static void applyDetachedCriteria(Query query, AbstractDetachedCriteria d Map fetchStrategies = detachedCriteria.getFetchStrategies(); for (Map.Entry entry : fetchStrategies.entrySet()) { String property = entry.getKey(); - switch(entry.getValue()) { + switch (entry.getValue()) { case EAGER: JoinType joinType = (JoinType) detachedCriteria.getJoinTypes().get(property); - if(joinType != null) { + if (joinType != null) { query.join(property, joinType); } else { @@ -612,9 +616,8 @@ public static void applyDetachedCriteria(Query query, AbstractDetachedCriteria d protected abstract Object doInvokeInternal(DynamicFinderInvocation invocation); - private static void handleFetchType(Query q, String associationName, FetchType fetchType) { - switch(fetchType) { + switch (fetchType) { case LAZY: q.select(associationName); break; @@ -640,7 +643,7 @@ private static MethodExpression findMethodExpressionInternal(final Class clazz, if (matcher.find()) { clause = matcher.group(1); methodExpressionConstructor = methodExpressions.get(clause); - if(methodExpressionConstructor != null) { + if (methodExpressionConstructor != null) { methodExpressionClass = methodExpressionConstructor.getDeclaringClass(); } } @@ -658,7 +661,7 @@ private static MethodExpression findMethodExpressionInternal(final Class clazz, } propertyName = NameUtils.decapitalizeFirstChar(propertyName); - if(methodExpressionConstructor != null) { + if (methodExpressionConstructor != null) { try { me = (MethodExpression) methodExpressionConstructor.newInstance(clazz, propertyName); } catch (Exception e) { @@ -668,7 +671,7 @@ private static MethodExpression findMethodExpressionInternal(final Class clazz, if (me == null) { me = new Equal(clazz, propertyName); } - if(negation) { + if (negation) { final MethodExpression finalMe = me; return new MethodExpression(clazz, propertyName) { @Override @@ -696,7 +699,7 @@ public Object[] getArguments() { } private static void handleFetchType(BuildableCriteria q, String associationName, FetchType fetchType) { - switch(fetchType) { + switch (fetchType) { case LAZY: q.select(associationName); break; @@ -706,7 +709,7 @@ private static void handleFetchType(BuildableCriteria q, String associationName, } private static void resetMethodExpressionPattern() { - String expressionPattern = DefaultGroovyMethods.join((Iterable)methodExpressions.keySet(), "|"); + String expressionPattern = DefaultGroovyMethods.join((Iterable) methodExpressions.keySet(), "|"); methodExpressinPattern = Pattern.compile("\\p{Upper}[\\p{Lower}\\d]+(" + expressionPattern + ")"); } @@ -719,7 +722,7 @@ private static void addSimpleSort(Query q, String sort, String order, boolean ig o = Query.Order.asc(sort); } - if(ignoreCase) o = o.ignoreCase(); + if (ignoreCase) o = o.ignoreCase(); q.order(o); } @@ -736,16 +739,15 @@ protected void configureQueryWithArguments(Class clazz, Query query, Object[] ar return; } - Map argMap = (Map)arguments[0]; + Map argMap = (Map) arguments[0]; populateArgumentsForCriteria(clazz, query, argMap); } - private static String calcPropertyName(String queryParameter, String clause) { String propName; if (clause != null && !clause.equals(Equal.class.getSimpleName())) { int i = queryParameter.indexOf(clause); - propName = queryParameter.substring(0,i); + propName = queryParameter.substring(0, i); } else { propName = queryParameter; @@ -764,13 +766,15 @@ private static String calcPropertyName(String queryParameter, String clause) { * @return the initialized expression */ private MethodExpression getInitializedExpression(MethodExpression expression, Object[] arguments) { -// if (expression instanceof Equal && arguments.length == 1 && arguments[0] == null) { // logic moved directly to Equal.createCriterion -// expression = new IsNull(expression.propertyName); -// } else { + /* + if (expression instanceof Equal && arguments.length == 1 && arguments[0] == null) { // logic moved directly to Equal.createCriterion + expression = new IsNull(expression.propertyName); + } else { + */ expression.setArguments(arguments); -// } + /* + } + */ return expression; } - - } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/DynamicFinderInvocation.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/DynamicFinderInvocation.java index a46642c0caa..c8b8a68dc03 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/DynamicFinderInvocation.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/DynamicFinderInvocation.java @@ -18,10 +18,11 @@ */ package org.grails.datastore.gorm.finders; -import grails.gorm.DetachedCriteria; +import java.util.List; + import groovy.lang.Closure; -import java.util.List; +import grails.gorm.DetachedCriteria; /** * Value object used to construct all the information necessary to invoke a dynamic finder. diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindAllByBooleanFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindAllByBooleanFinder.java index b4ee31bf69d..ce3e03aa1dd 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindAllByBooleanFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindAllByBooleanFinder.java @@ -36,8 +36,9 @@ * @author Jeff Brown * @author Graeme Rocher */ -public class FindAllByBooleanFinder extends FindAllByFinder{ +public class FindAllByBooleanFinder extends FindAllByFinder { public static final String METHOD_PATTERN = "(findAll)((\\w+)(By)([A-Z]\\w*)|(\\w+))"; + public FindAllByBooleanFinder(Datastore datastore) { super(datastore); setPattern(METHOD_PATTERN); diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindAllByFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindAllByFinder.java index abdeabe4abe..b44facd67f8 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindAllByFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindAllByFinder.java @@ -46,7 +46,7 @@ public FindAllByFinder(final MappingContext mappingContext) { @Override protected Object doInvokeInternal(final DynamicFinderInvocation invocation) { - return execute(new SessionCallback() { + return execute(new SessionCallback<>() { public Object doInSession(final Session session) { Query q = buildQuery(invocation, session); return invokeQuery(q); @@ -87,7 +87,7 @@ protected Query buildQuery(DynamicFinderInvocation invocation, Class clazz, Q } else { for (MethodExpression expression : invocation.getExpressions()) { - query.add( expression.createCriterion() ); + query.add(expression.createCriterion()); } } query.projections().distinct(); diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindByBooleanFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindByBooleanFinder.java index 023f016e802..c1591f9398e 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindByBooleanFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindByBooleanFinder.java @@ -40,7 +40,7 @@ * @author Graeme Rocher * @author Jeff Brown */ -public class FindByBooleanFinder extends FindByFinder{ +public class FindByBooleanFinder extends FindByFinder { public static final String METHOD_PATTERN = "(find)((\\w+)(By)([A-Z]\\w*)|(\\w++))"; public FindByBooleanFinder(Datastore datastore) { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindOrCreateByFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindOrCreateByFinder.java index aaa7647bae9..4be6ea82379 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindOrCreateByFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindOrCreateByFinder.java @@ -18,18 +18,19 @@ */ package org.grails.datastore.gorm.finders; -import groovy.lang.GroovySystem; -import groovy.lang.MetaClass; -import groovy.lang.MissingMethodException; - import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; +import groovy.lang.GroovySystem; +import groovy.lang.MetaClass; +import groovy.lang.MissingMethodException; + +import org.springframework.core.convert.ConversionException; + import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.model.MappingContext; -import org.springframework.core.convert.ConversionException; /** * Finder used to return a single result @@ -46,7 +47,6 @@ public FindOrCreateByFinder(final Datastore datastore) { this(METHOD_PATTERN, datastore); } - public FindOrCreateByFinder(MappingContext mappingContext) { super(Pattern.compile(METHOD_PATTERN), mappingContext); } @@ -55,7 +55,6 @@ public FindOrCreateByFinder(final String methodPattern, MappingContext mappingCo super(Pattern.compile(methodPattern), mappingContext); } - @Override @SuppressWarnings({"rawtypes", "unchecked"}) protected Object doInvokeInternal(final DynamicFinderInvocation invocation) { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindOrSaveByFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindOrSaveByFinder.java index 2459b1a3b31..3552214b8f9 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindOrSaveByFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/FindOrSaveByFinder.java @@ -18,14 +18,14 @@ */ package org.grails.datastore.gorm.finders; -import groovy.lang.GroovySystem; -import groovy.lang.MetaClass; -import groovy.lang.MissingMethodException; - import java.util.HashMap; import java.util.List; import java.util.Map; +import groovy.lang.GroovySystem; +import groovy.lang.MetaClass; +import groovy.lang.MissingMethodException; + import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.model.MappingContext; diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/ListOrderByFinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/ListOrderByFinder.java index 6bc095db804..1f522b95543 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/ListOrderByFinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/ListOrderByFinder.java @@ -18,13 +18,13 @@ */ package org.grails.datastore.gorm.finders; -import groovy.lang.Closure; - import java.util.LinkedHashMap; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; +import groovy.lang.Closure; + import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.core.SessionCallback; @@ -66,22 +66,22 @@ public Object invoke(final Class clazz, final String methodName, final Closure a String nameInSignature = match.group(2); final String propertyName = NameUtils.decapitalizeFirstChar(nameInSignature); - return execute(new SessionCallback() { + return execute(new SessionCallback<>() { public Object doInSession(final Session session) { Query q = session.createQuery(clazz); applyAdditionalCriteria(q, additionalCriteria); boolean ascending = true; if (arguments.length > 0 && (arguments[0] instanceof Map)) { - final Map args = new LinkedHashMap( (Map) arguments[0] ); + final Map args = new LinkedHashMap((Map) arguments[0]); final Object order = args.remove(DynamicFinder.ARGUMENT_ORDER); - if(order != null && "desc".equalsIgnoreCase(order.toString())) { + if (order != null && "desc".equalsIgnoreCase(order.toString())) { ascending = false; } DynamicFinder.populateArgumentsForCriteria(clazz, q, args); } - q.order( ascending ? Query.Order.asc(propertyName) : Query.Order.desc(propertyName)); + q.order(ascending ? Query.Order.asc(propertyName) : Query.Order.desc(propertyName)); q.projections().distinct(); return invokeQuery(q); } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/MatchSpec.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/MatchSpec.groovy index 8c73f0ff5ba..2457244ff91 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/MatchSpec.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/MatchSpec.groovy @@ -20,7 +20,6 @@ package org.grails.datastore.gorm.finders import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.expr.MethodCallExpression /** * A match spec details a matched finder @@ -30,6 +29,7 @@ import org.codehaus.groovy.ast.expr.MethodCallExpression */ @CompileStatic class MatchSpec { + /** * The full method name */ diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/MethodExpression.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/MethodExpression.java index 549d7dae76d..ea1c597f28c 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/MethodExpression.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/finders/MethodExpression.java @@ -18,18 +18,23 @@ */ package org.grails.datastore.gorm.finders; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; + import groovy.lang.Range; -import java.util.*; +import org.springframework.core.convert.ConversionService; +import org.springframework.core.convert.TypeDescriptor; +import org.springframework.util.Assert; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.Query.Criterion; import org.grails.datastore.mapping.query.Restrictions; -import org.springframework.core.convert.ConversionService; -import org.springframework.core.convert.TypeDescriptor; -import org.springframework.util.Assert; /** * Method expression used to evaluate a dynamic finder. @@ -75,10 +80,10 @@ public void convertArguments(PersistentEntity persistentEntity) { Object arg = arguments[i]; if (arg != null && !type.isAssignableFrom(arg.getClass())) { // Add special handling for GStringImpl - if(arg instanceof CharSequence && arg.getClass() != String.class) { + if (arg instanceof CharSequence && arg.getClass() != String.class) { arg = arg.toString(); arguments[i] = arg; - if(type.isAssignableFrom(arg.getClass())) { + if (type.isAssignableFrom(arg.getClass())) { break; } } @@ -87,7 +92,7 @@ public void convertArguments(PersistentEntity persistentEntity) { // skip converting argument to collection/array type if argument is correct instance of element type break; } - if(conversionService.canConvert(arg.getClass(), type)) { + if (conversionService.canConvert(arg.getClass(), type)) { arguments[i] = conversionService.convert(arg, type); } } @@ -234,7 +239,7 @@ public void setArguments(Object[] arguments) { "Only a collection of elements is supported in an 'in' query"); Object arg = arguments[0]; - Assert.isTrue( (arg instanceof Collection) || arg == null, "Only a collection of elements is supported in an 'in' query"); + Assert.isTrue((arg instanceof Collection) || arg == null, "Only a collection of elements is supported in an 'in' query"); super.setArguments(arguments); } @@ -256,6 +261,7 @@ public static class InList extends MethodExpression { public InList(Class targetClass, String propertyName) { super(targetClass, propertyName); } + public InList(String propertyName) { super(propertyName); } @@ -271,7 +277,7 @@ public void setArguments(Object[] arguments) { "Only a collection of elements is supported in an 'in' query"); Object arg = arguments[0]; - Assert.isTrue( (arg instanceof Collection) || arg == null, "Only a collection of elements is supported in an 'in' query"); + Assert.isTrue((arg instanceof Collection) || arg == null, "Only a collection of elements is supported in an 'in' query"); super.setArguments(arguments); } @@ -286,12 +292,14 @@ public void convertArguments(PersistentEntity persistentEntity) { } } + public static class Between extends MethodExpression { public Between(Class targetClass, String propertyName) { super(targetClass, propertyName); argumentsRequired = 2; } + public Between(String propertyName) { super(propertyName); argumentsRequired = 2; @@ -312,12 +320,14 @@ public void setArguments(Object[] arguments) { } } + public static class InRange extends MethodExpression { public InRange(Class targetClass, String propertyName) { super(targetClass, propertyName); argumentsRequired = 1; } + public InRange(String propertyName) { super(propertyName); argumentsRequired = 1; @@ -344,12 +354,14 @@ public void setArguments(Object[] arguments) { } } + public static class IsNull extends MethodExpression { public IsNull(Class targetClass, String propertyName) { super(targetClass, propertyName); argumentsRequired = 0; } + public IsNull(String propertyName) { super(propertyName); argumentsRequired = 0; @@ -361,6 +373,7 @@ public Criterion createCriterion() { } } + public static class IsNotNull extends MethodExpression { public IsNotNull(Class targetClass, String propertyName) { @@ -379,12 +392,14 @@ public Criterion createCriterion() { } } + public static class IsEmpty extends MethodExpression { public IsEmpty(Class targetClass, String propertyName) { super(targetClass, propertyName); argumentsRequired = 0; } + public IsEmpty(String propertyName) { super(propertyName); argumentsRequired = 0; @@ -396,6 +411,7 @@ public Criterion createCriterion() { } } + public static class IsNotEmpty extends MethodExpression { public IsNotEmpty(Class targetClass, String propertyName) { @@ -413,13 +429,14 @@ public Criterion createCriterion() { return Restrictions.isNotEmpty(propertyName); } - } + public static class Equal extends MethodExpression { public Equal(Class targetClass, String propertyName) { super(targetClass, propertyName); } + public Equal(String propertyName) { super(propertyName); } @@ -435,11 +452,13 @@ public Query.Criterion createCriterion() { } } + public static class NotEqual extends MethodExpression { public NotEqual(Class targetClass, String propertyName) { super(targetClass, propertyName); } + public NotEqual(String propertyName) { super(propertyName); } @@ -455,6 +474,7 @@ public Query.Criterion createCriterion() { } } + private static void convertArgumentsForProp(PersistentEntity persistentEntity, PersistentProperty prop, String propertyName, Object[] arguments, ConversionService conversionService) { if (prop == null) { if (propertyName.equals(persistentEntity.getIdentity().getName())) { @@ -465,7 +485,7 @@ private static void convertArgumentsForProp(PersistentEntity persistentEntity, P Class type = prop.getType(); Collection collection = (Collection) arguments[0]; List converted; - if(collection == null) { + if (collection == null) { converted = Collections.emptyList(); } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/InstanceMethodInvokingClosure.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/InstanceMethodInvokingClosure.groovy index b5fe4a8df04..0ab6cdbd411 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/InstanceMethodInvokingClosure.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/InstanceMethodInvokingClosure.groovy @@ -16,13 +16,13 @@ package org.grails.datastore.gorm.internal import groovy.transform.CompileStatic - /** * Not public API. Used by GormEnhancer */ -@SuppressWarnings("rawtypes") +@SuppressWarnings('rawtypes') @CompileStatic class InstanceMethodInvokingClosure extends MethodInvokingClosure { + InstanceMethodInvokingClosure(apiDelegate, Class persistentClass, String methodName, Class[] parameterTypes) { super(apiDelegate, methodName, parameterTypes) List params = parameterTypes.toList() @@ -36,7 +36,7 @@ class InstanceMethodInvokingClosure extends MethodInvokingClosure { Object call(Object[] args) { def delegateArg = Collections.singletonList(delegate).toArray() Object[] arguments - if(args) { + if (args) { def argList = [] argList.add(delegate) argList.addAll(Arrays.asList(args)) @@ -47,4 +47,4 @@ class InstanceMethodInvokingClosure extends MethodInvokingClosure { } metaMethod.invoke(apiDelegate, arguments) } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/MethodInvokingClosure.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/MethodInvokingClosure.groovy index dfdadad7bc8..e729e4cdfb2 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/MethodInvokingClosure.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/MethodInvokingClosure.groovy @@ -15,20 +15,20 @@ package org.grails.datastore.gorm.internal import groovy.transform.CompileStatic - import org.codehaus.groovy.runtime.metaclass.MethodSelectionException /** * Not public API. Used by GormEnhancer */ -@SuppressWarnings("rawtypes") +@SuppressWarnings('rawtypes') @CompileStatic abstract class MethodInvokingClosure extends Closure { + protected String methodName protected apiDelegate protected Class[] parameterTypes protected MetaMethod metaMethod - + MethodInvokingClosure(apiDelegate, String methodName, Class[] parameterTypes) { super(apiDelegate, apiDelegate) this.apiDelegate = apiDelegate @@ -37,7 +37,7 @@ abstract class MethodInvokingClosure extends Closure { } @Override - abstract Object call(Object[] args); + abstract Object call(Object[] args) Object doCall(Object[] args) { call(args) @@ -50,11 +50,11 @@ abstract class MethodInvokingClosure extends Closure { int getMaximumNumberOfParameters() { parameterTypes.length } - + /** - * Utility method for choosing matching metamethod, handles MethodSelectionException - * - * + * Utility method for choosing matching metamethod, handles MethodSelectionException + * + * * @param theMetaClass * @param methodName * @param parameterTypes @@ -67,8 +67,8 @@ abstract class MethodInvokingClosure extends Closure { } catch (MethodSelectionException mse) { // the metamethod already exists with multiple signatures, pick the most specific return theMetaClass.methods.find { MetaMethod existingMethod -> - existingMethod.name == methodName && existingMethod.isStatic()==staticScope && ((!parameterTypes && !existingMethod.parameterTypes) || parameterTypes==existingMethod.parameterTypes) + existingMethod.name == methodName && existingMethod.isStatic() == staticScope && ((!parameterTypes && !existingMethod.parameterTypes) || parameterTypes == existingMethod.parameterTypes) } } } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/RuntimeSupport.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/RuntimeSupport.groovy index b7347b276ef..6524852193a 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/RuntimeSupport.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/RuntimeSupport.groovy @@ -20,6 +20,7 @@ package org.grails.datastore.gorm.internal import groovy.transform.CompileStatic + import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.core.connections.ConnectionSource import org.grails.datastore.mapping.core.connections.ConnectionSourcesProvider @@ -41,17 +42,17 @@ class RuntimeSupport { * @return */ static Datastore findDefaultDatastore(Datastore[] datastores) { - for(Datastore d in datastores) { - if( d instanceof ConnectionSourcesProvider) { - ConnectionSourcesProvider provider = (ConnectionSourcesProvider)d - if(ConnectionSource.DEFAULT == provider.getConnectionSources().defaultConnectionSource.name) { + for (Datastore d in datastores) { + if (d instanceof ConnectionSourcesProvider) { + ConnectionSourcesProvider provider = (ConnectionSourcesProvider) d + if (ConnectionSource.DEFAULT == provider.getConnectionSources().defaultConnectionSource.name) { return d } } } - if(datastores) { + if (datastores) { return datastores[0] } - throw new DatastoreConfigurationException("No default datastore configured") + throw new DatastoreConfigurationException('No default datastore configured') } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/StaticMethodInvokingClosure.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/StaticMethodInvokingClosure.groovy index 2ee3485ea86..8ca72876f0e 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/StaticMethodInvokingClosure.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/internal/StaticMethodInvokingClosure.groovy @@ -19,14 +19,15 @@ import groovy.transform.CompileStatic /** * Not public API. Used by GormEnhancer */ -@SuppressWarnings("rawtypes") +@SuppressWarnings('rawtypes') @CompileStatic class StaticMethodInvokingClosure extends MethodInvokingClosure { + StaticMethodInvokingClosure(apiDelegate, String methodName, Class[] parameterTypes) { super(apiDelegate, methodName, parameterTypes) super.metaMethod = pickMetaMethod(apiDelegate.getMetaClass(), methodName, parameterTypes, true) } - + @Override Object call(Object[] args) { metaMethod.invoke(apiDelegate, args) diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/DataSourceBuilder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/DataSourceBuilder.java index b7d6d0d9f08..e1c349a48a3 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/DataSourceBuilder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/DataSourceBuilder.java @@ -18,7 +18,6 @@ */ package org.grails.datastore.gorm.jdbc; - import java.sql.Connection; import java.sql.SQLException; import java.util.HashMap; @@ -27,12 +26,13 @@ import javax.sql.DataSource; -import org.grails.datastore.mapping.core.exceptions.ConfigurationException; import org.springframework.beans.BeanUtils; import org.springframework.beans.MutablePropertyValues; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.util.ClassUtils; +import org.grails.datastore.mapping.core.exceptions.ConfigurationException; + /** * NOTE: Forked from Spring Boot logic to avoid hard dependency on Boot. * @@ -52,11 +52,12 @@ public class DataSourceBuilder { private static final String[] DATA_SOURCE_TYPE_NAMES = new String[] { - "org.apache.tomcat.jdbc.pool.DataSource", - "com.zaxxer.hikari.HikariDataSource", - "org.apache.commons.dbcp.BasicDataSource", - "org.apache.commons.dbcp2.BasicDataSource", - "org.springframework.jdbc.datasource.DriverManagerDataSource"}; + "org.apache.tomcat.jdbc.pool.DataSource", + "com.zaxxer.hikari.HikariDataSource", + "org.apache.commons.dbcp.BasicDataSource", + "org.apache.commons.dbcp2.BasicDataSource", + "org.springframework.jdbc.datasource.DriverManagerDataSource" + }; private Class type; @@ -87,8 +88,8 @@ public DataSource build() { } private void maybeGetDriverClassName() { - if (!this.properties.containsKey("driverClassName") - && this.properties.containsKey("url")) { + if (!this.properties.containsKey("driverClassName") && + this.properties.containsKey("url")) { String url = this.properties.get("url"); String driverClass = DatabaseDriver.fromJdbcUrl(url).getDriverClassName(); this.properties.put("driverClassName", driverClass); @@ -97,7 +98,7 @@ private void maybeGetDriverClassName() { } private void bind(DataSource result) { - if(properties.containsKey("dbProperties")) { + if (properties.containsKey("dbProperties")) { coerceDbProperties(); } MutablePropertyValues properties = new MutablePropertyValues(this.properties); @@ -105,7 +106,7 @@ private void bind(DataSource result) { .withAlias("username", "user").bind(properties); } - public DataSourceBuilder properties( Map properties) { + public DataSourceBuilder properties(Map properties) { this.properties.putAll(properties); return this; } @@ -113,12 +114,12 @@ public DataSourceBuilder properties( Map properties) { private void coerceDbProperties() { Map propertiesMap = this.properties; Object dbPropertiesObject = propertiesMap.get("dbProperties"); - if(dbPropertiesObject instanceof Map) { + if (dbPropertiesObject instanceof Map) { Map dbProperties = (Map) dbPropertiesObject; Properties properties = new Properties(); for (Object key : dbProperties.keySet()) { Object value = dbProperties.get(key); - if(value != null) { + if (value != null) { properties.put(key.toString(), value.toString()); } } @@ -157,8 +158,8 @@ public Class findType() { if (this.type != null) { return this.type; } - else if(!pooled) { - if(this.readOnly) { + else if (!pooled) { + if (this.readOnly) { return ReadOnlyDriverManagerDataSource.class; } else { @@ -203,4 +204,4 @@ protected Connection getConnectionFromDriverManager(final String url, final Prop return connection; } } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/DatabaseDriver.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/DatabaseDriver.java index 7c449e4c1f0..f79da0b794e 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/DatabaseDriver.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/DatabaseDriver.java @@ -18,8 +18,6 @@ */ package org.grails.datastore.gorm.jdbc; - - import org.springframework.util.Assert; import org.springframework.util.StringUtils; @@ -112,8 +110,8 @@ public enum DatabaseDriver { @Override protected boolean matchProductName(String productName) { - return super.matchProductName(productName) - || productName.toLowerCase().startsWith("firebird"); + return super.matchProductName(productName) || + productName.toLowerCase().startsWith("firebird"); } }, @@ -125,8 +123,8 @@ protected boolean matchProductName(String productName) { @Override protected boolean matchProductName(String productName) { - return super.matchProductName(productName) - || productName.toLowerCase().startsWith("db2/"); + return super.matchProductName(productName) || + productName.toLowerCase().startsWith("db2/"); } }, @@ -139,8 +137,8 @@ protected boolean matchProductName(String productName) { @Override protected boolean matchProductName(String productName) { - return super.matchProductName(productName) - || productName.toLowerCase().contains("as/400"); + return super.matchProductName(productName) || + productName.toLowerCase().contains("as/400"); } }, @@ -242,4 +240,4 @@ public static DatabaseDriver fromProductName(String productName) { return UNKNOWN; } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/MultiTenantConnection.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/MultiTenantConnection.groovy index e76ba509ea7..ccc7983879d 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/MultiTenantConnection.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/MultiTenantConnection.groovy @@ -19,13 +19,13 @@ package org.grails.datastore.gorm.jdbc -import groovy.transform.CompileStatic -import org.grails.datastore.gorm.jdbc.schema.SchemaHandler - -import javax.sql.DataSource import java.sql.Connection import java.sql.SQLException +import groovy.transform.CompileStatic + +import org.grails.datastore.gorm.jdbc.schema.SchemaHandler + /** * Allows restoring the target schema prior to releasing the connection to the pool in Multi-Tenant environment * @@ -46,7 +46,7 @@ class MultiTenantConnection implements Connection { @Override void close() throws SQLException { try { - if(!isClosed()) { + if (!isClosed()) { schemaHandler.useDefaultSchema(this) } } finally { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/MultiTenantDataSource.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/MultiTenantDataSource.groovy index b1d57796d7b..a82118f9976 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/MultiTenantDataSource.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/MultiTenantDataSource.groovy @@ -19,11 +19,11 @@ package org.grails.datastore.gorm.jdbc +import javax.sql.DataSource + import groovy.transform.CompileStatic import groovy.transform.EqualsAndHashCode -import javax.sql.DataSource - /** * A data source that wraps a target datasource for multi-tenancy * diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/OriginCapablePropertyValue.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/OriginCapablePropertyValue.java index 58e414bfe17..8e3218a4e61 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/OriginCapablePropertyValue.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/OriginCapablePropertyValue.java @@ -49,8 +49,7 @@ private PropertyOrigin getOrigin() { @Override public String toString() { String name = this.origin != null ? this.origin.getName() : this.getName(); - String source = this.origin.getSource() != null - ? this.origin.getSource().getName() : "unknown"; + String source = this.origin.getSource() != null ? this.origin.getSource().getName() : "unknown"; return "'" + name + "' from '" + source + "'"; } @@ -61,4 +60,4 @@ static PropertyOrigin getOrigin(PropertyValue propertyValue) { return new OriginCapablePropertyValue(propertyValue).getOrigin(); } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/PropertyOrigin.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/PropertyOrigin.java index 679d5c9f46f..ab410b8d486 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/PropertyOrigin.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/PropertyOrigin.java @@ -47,4 +47,4 @@ public String getName() { return this.name; } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedConversionService.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedConversionService.java index 7dfbf9a55eb..81e806ae7a8 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedConversionService.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedConversionService.java @@ -19,6 +19,9 @@ package org.grails.datastore.gorm.jdbc; +import java.util.EnumSet; +import java.util.Set; + import org.springframework.core.convert.ConversionFailedException; import org.springframework.core.convert.ConversionService; import org.springframework.core.convert.TypeDescriptor; @@ -28,9 +31,6 @@ import org.springframework.core.convert.support.GenericConversionService; import org.springframework.util.Assert; -import java.util.EnumSet; -import java.util.Set; - /** * Internal {@link ConversionService} used by {@link RelaxedDataBinder} to support * additional relaxed conversion. @@ -60,16 +60,16 @@ class RelaxedConversionService implements ConversionService { @Override public boolean canConvert(Class sourceType, Class targetType) { - return (this.conversionService != null - && this.conversionService.canConvert(sourceType, targetType)) - || this.additionalConverters.canConvert(sourceType, targetType); + return (this.conversionService != null && + this.conversionService.canConvert(sourceType, targetType)) || + this.additionalConverters.canConvert(sourceType, targetType); } @Override public boolean canConvert(TypeDescriptor sourceType, TypeDescriptor targetType) { - return (this.conversionService != null - && this.conversionService.canConvert(sourceType, targetType)) - || this.additionalConverters.canConvert(sourceType, targetType); + return (this.conversionService != null && + this.conversionService.canConvert(sourceType, targetType)) || + this.additionalConverters.canConvert(sourceType, targetType); } @Override @@ -108,8 +108,8 @@ public Converter getConverter(Class targetType) { while (enumType != null && !enumType.isEnum()) { enumType = enumType.getSuperclass(); } - Assert.notNull(enumType, "The target type " + targetType.getName() - + " does not refer to an enum"); + Assert.notNull(enumType, "The target type " + targetType.getName() + + " does not refer to an enum"); return new StringToEnum(enumType); } @@ -128,7 +128,7 @@ public T convert(String source) { return null; } source = source.trim(); - for (T candidate : (Set)EnumSet.allOf(this.enumType)) { + for (T candidate : (Set) EnumSet.allOf(this.enumType)) { RelaxedNames names = new RelaxedNames( candidate.name().replace("_", "-").toLowerCase()); for (String name : names) { @@ -140,8 +140,8 @@ public T convert(String source) { return candidate; } } - throw new IllegalArgumentException("No enum constant " - + this.enumType.getCanonicalName() + "." + source); + throw new IllegalArgumentException("No enum constant " + + this.enumType.getCanonicalName() + "." + source); } } @@ -154,4 +154,4 @@ public char[] convert(String source) { return source.toCharArray(); } } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedDataBinder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedDataBinder.java index d399dcf50e4..3bbea856ee4 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedDataBinder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedDataBinder.java @@ -19,15 +19,28 @@ package org.grails.datastore.gorm.jdbc; -import org.springframework.beans.*; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; +import java.util.LinkedHashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.Set; + +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; +import org.springframework.beans.InvalidPropertyException; +import org.springframework.beans.MutablePropertyValues; +import org.springframework.beans.PropertyValue; import org.springframework.core.convert.TypeDescriptor; import org.springframework.util.LinkedMultiValueMap; import org.springframework.util.MultiValueMap; import org.springframework.util.StringUtils; import org.springframework.validation.DataBinder; -import java.util.*; - /** * Binder implementation that allows caller to bind to maps and also allows property names * to match a bit loosely (if underscores or dashes are removed and replaced with camel @@ -157,8 +170,7 @@ private MutablePropertyValues getPropertyValuesForNamePrefix( String name = value.getName(); for (String prefix : new RelaxedNames(stripLastDot(this.namePrefix))) { for (String separator : new String[] { ".", "_" }) { - String candidate = (StringUtils.hasLength(prefix) ? prefix + separator - : prefix); + String candidate = (StringUtils.hasLength(prefix) ? prefix + separator : prefix); if (name.startsWith(candidate)) { name = name.substring(candidate.length()); if (!(this.ignoreNestedProperties && name.contains("."))) { @@ -220,8 +232,7 @@ private String initializePath(BeanWrapper wrapper, BeanPath path, int index) { String name = path.prefix(index); TypeDescriptor descriptor = wrapper.getPropertyTypeDescriptor(name); if (descriptor == null || descriptor.isMap()) { - if (isMapValueStringType(descriptor) - || isBlanked(wrapper, name, path.name(index))) { + if (isMapValueStringType(descriptor) || isBlanked(wrapper, name, path.name(index))) { path.collapseKeys(index); } path.mapIndex(index); @@ -263,8 +274,7 @@ private boolean isMapValueStringType(TypeDescriptor descriptor) { @SuppressWarnings("rawtypes") private boolean isBlanked(BeanWrapper wrapper, String propertyName, String key) { - Object value = (wrapper.isReadableProperty(propertyName) - ? wrapper.getPropertyValue(propertyName) : null); + Object value = (wrapper.isReadableProperty(propertyName) ? wrapper.getPropertyValue(propertyName) : null); if (value instanceof Map) { if (((Map) value).get(key) == BLANK) { return true; @@ -278,8 +288,8 @@ private void extendCollectionIfNecessary(BeanWrapper wrapper, BeanPath path, String name = path.prefix(index); TypeDescriptor elementDescriptor = wrapper.getPropertyTypeDescriptor(name) .getElementTypeDescriptor(); - if (!elementDescriptor.isMap() && !elementDescriptor.isCollection() - && !elementDescriptor.getType().equals(Object.class)) { + if (!elementDescriptor.isMap() && !elementDescriptor.isCollection() && + !elementDescriptor.getType().equals(Object.class)) { return; } Object extend = new LinkedHashMap(); @@ -299,15 +309,14 @@ private void extendMapIfNecessary(BeanWrapper wrapper, BeanPath path, int index) if (descriptor == null) { descriptor = TypeDescriptor.valueOf(Object.class); } - if (!descriptor.isMap() && !descriptor.isCollection() - && !descriptor.getType().equals(Object.class)) { + if (!descriptor.isMap() && !descriptor.isCollection() && !descriptor.getType().equals(Object.class)) { return; } String extensionName = path.prefix(index + 1); if (wrapper.isReadableProperty(extensionName)) { Object currentValue = wrapper.getPropertyValue(extensionName); - if ((descriptor.isCollection() && currentValue instanceof Collection) - || (!descriptor.isCollection() && currentValue instanceof Map)) { + if ((descriptor.isCollection() && currentValue instanceof Collection) || + (!descriptor.isCollection() && currentValue instanceof Map)) { return; } } @@ -380,7 +389,7 @@ private Iterable getNameAndAliases(String name) { return Collections.singleton(name); } List nameAndAliases; - nameAndAliases = new ArrayList(aliases.size() + 1); + nameAndAliases = new ArrayList<>(aliases.size() + 1); nameAndAliases.add(name); nameAndAliases.addAll(aliases); return nameAndAliases; @@ -428,7 +437,7 @@ private static class BeanPath { } List prefixes() { - List prefixes = new ArrayList(); + List prefixes = new ArrayList<>(); for (int index = 1; index < this.nodes.size(); index++) { prefixes.add(prefix(index)); } @@ -591,4 +600,4 @@ public String toString() { } } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedNames.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedNames.java index 017074556d6..87fe47cc50e 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedNames.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/RelaxedNames.java @@ -19,15 +19,13 @@ package org.grails.datastore.gorm.jdbc; -import org.springframework.util.StringUtils; - - import java.util.Iterator; import java.util.LinkedHashSet; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; +import org.springframework.util.StringUtils; /** * Generates relaxed name variations from a given source. @@ -146,8 +144,8 @@ public String apply(String value) { Matcher matcher = CAMEL_CASE_PATTERN.matcher(value); StringBuffer result = new StringBuffer(); while (matcher.find()) { - matcher.appendReplacement(result, matcher.group(1) + '_' - + StringUtils.uncapitalize(matcher.group(2))); + matcher.appendReplacement(result, matcher.group(1) + '_' + + StringUtils.uncapitalize(matcher.group(2))); } matcher.appendTail(result); return result.toString(); @@ -160,8 +158,8 @@ public String apply(String value) { Matcher matcher = CAMEL_CASE_PATTERN.matcher(value); StringBuffer result = new StringBuffer(); while (matcher.find()) { - matcher.appendReplacement(result, matcher.group(1) + '-' - + StringUtils.uncapitalize(matcher.group(2))); + matcher.appendReplacement(result, matcher.group(1) + '-' + + StringUtils.uncapitalize(matcher.group(2))); } matcher.appendTail(result); return result.toString(); @@ -201,6 +199,4 @@ private static String separatedToCamelCase(String value, } } - - -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/CachedDataSourceConnectionSourceFactory.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/CachedDataSourceConnectionSourceFactory.java index 92456d2ef6e..aaeca9841a2 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/CachedDataSourceConnectionSourceFactory.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/CachedDataSourceConnectionSourceFactory.java @@ -19,13 +19,15 @@ package org.grails.datastore.gorm.jdbc.connections; -import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.springframework.core.env.PropertyResolver; - -import javax.sql.DataSource; import java.util.LinkedHashMap; import java.util.Map; +import javax.sql.DataSource; + +import org.springframework.core.env.PropertyResolver; + +import org.grails.datastore.mapping.core.connections.ConnectionSource; + /** * Extends {@link DataSourceConnectionSourceFactory} and caches the created {@link DataSourceConnectionSource} instances ensuring they are singletons * @@ -37,7 +39,7 @@ public class CachedDataSourceConnectionSourceFactory extends DataSourceConnectio @Override public ConnectionSource create(String name, PropertyResolver configuration) { - if(dataSources.containsKey(name)) { + if (dataSources.containsKey(name)) { return dataSources.get(name); } else { @@ -49,7 +51,7 @@ public ConnectionSource create(String name, Prop @Override public ConnectionSource create(String name, DataSourceSettings settings) { - if(dataSources.containsKey(name)) { + if (dataSources.containsKey(name)) { return dataSources.get(name); } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSource.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSource.java index 911bc3f266f..026edda9044 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSource.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSource.java @@ -19,15 +19,18 @@ package org.grails.datastore.gorm.jdbc.connections; -import org.grails.datastore.mapping.core.connections.DefaultConnectionSource; +import java.io.IOException; +import java.lang.reflect.Method; + +import javax.sql.DataSource; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import org.springframework.jdbc.datasource.DelegatingDataSource; import org.springframework.util.ReflectionUtils; -import javax.sql.DataSource; -import java.io.IOException; -import java.lang.reflect.Method; +import org.grails.datastore.mapping.core.connections.DefaultConnectionSource; /** * A {@link org.grails.datastore.mapping.core.connections.ConnectionSource} for JDBC {@link DataSource} objects. Attempts to close the pool if a "close" method is provided. @@ -45,7 +48,7 @@ public DataSourceConnectionSource(String name, DataSource source, DataSourceSett @Override public void close() throws IOException { super.close(); - if(!closed) { + if (!closed) { DataSource source = getSource(); Method closeMethod = ReflectionUtils.findMethod(source.getClass(), "close"); @@ -55,7 +58,7 @@ public void close() throws IOException { closeMethod = ReflectionUtils.findMethod(source.getClass(), "close"); } - if(closeMethod != null) { + if (closeMethod != null) { try { ReflectionUtils.invokeMethod(closeMethod, source); this.closed = true; diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSourceFactory.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSourceFactory.java index d471157a5f1..2408400f47e 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSourceFactory.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceConnectionSourceFactory.java @@ -19,23 +19,28 @@ package org.grails.datastore.gorm.jdbc.connections; -import org.grails.datastore.mapping.config.Settings; -import org.grails.datastore.mapping.core.connections.*; -import org.grails.datastore.gorm.jdbc.DataSourceBuilder; -import org.grails.datastore.mapping.core.exceptions.ConfigurationException; +import java.io.Serializable; +import java.util.Collections; +import java.util.Map; + +import javax.naming.NamingException; +import javax.sql.DataSource; + import org.springframework.core.env.PropertyResolver; import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; import org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy; import org.springframework.jndi.JndiObjectFactoryBean; -import javax.naming.NamingException; -import javax.sql.DataSource; -import java.io.Serializable; -import java.util.Collections; -import java.util.Map; +import org.grails.datastore.gorm.jdbc.DataSourceBuilder; +import org.grails.datastore.mapping.config.Settings; +import org.grails.datastore.mapping.core.connections.AbstractConnectionSourceFactory; +import org.grails.datastore.mapping.core.connections.ConnectionSource; +import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings; +import org.grails.datastore.mapping.core.connections.DefaultConnectionSource; +import org.grails.datastore.mapping.core.exceptions.ConfigurationException; /** - * A {@link ConnectionSourceFactory} for creating JDBC {@link DataSource} connections + * A {@link org.grails.datastore.mapping.core.connections.ConnectionSourceFactory} for creating JDBC {@link DataSource} connections * * @author Graeme Rocher * @since 6.0 @@ -45,10 +50,10 @@ public class DataSourceConnectionSourceFactory extends AbstractConnectionSourceF protected DataSourceSettings buildSettings(String name, PropertyResolver configuration, F fallbackSettings, boolean isDefaultDataSource) { String configurationPrefix = isDefaultDataSource ? Settings.SETTING_DATASOURCE : Settings.SETTING_DATASOURCES + '.' + name; DataSourceSettingsBuilder builder; - if(isDefaultDataSource) { + if (isDefaultDataSource) { String qualified = Settings.SETTING_DATASOURCES + '.' + Settings.SETTING_DATASOURCE; Map config = configuration.getProperty(qualified, Map.class, Collections.emptyMap()); - if(!config.isEmpty()) { + if (!config.isEmpty()) { builder = new DataSourceSettingsBuilder(configuration, qualified); } else { @@ -66,7 +71,7 @@ protected DataSourceSettings buildSettings( public ConnectionSource create(String name, DataSourceSettings settings) { DataSource dataSource; - if(settings.getJndiName() != null && !settings.getJndiName().isEmpty()) { + if (settings.getJndiName() != null && !settings.getJndiName().isEmpty()) { JndiObjectFactoryBean jndiObjectFactoryBean = new JndiObjectFactoryBean(); jndiObjectFactoryBean.setExpectedType(DataSource.class); jndiObjectFactoryBean.setJndiName(settings.getJndiName()); @@ -75,7 +80,7 @@ public ConnectionSource create(String name, Data } catch (NamingException e) { throw new ConfigurationException("Unable to configure JNDI data source: " + e.getMessage(), e); } - dataSource = (DataSource)jndiObjectFactoryBean.getObject(); + dataSource = (DataSource) jndiObjectFactoryBean.getObject(); dataSource = proxy(dataSource, settings); return new DefaultConnectionSource<>(name, dataSource, settings); } @@ -91,15 +96,15 @@ public ConnectionSource create(String name, Data String url = settings.getUrl(); Class type = settings.getType(); - if(properties != null && !properties.isEmpty()) { + if (properties != null && !properties.isEmpty()) { dataSourceBuilder.properties(settings.toProperties()); } dataSourceBuilder.url(url); - if(driverClassName != null) { + if (driverClassName != null) { dataSourceBuilder.driverClassName(driverClassName); } - if(username != null && password != null) { + if (username != null && password != null) { dataSourceBuilder.username(username); dataSourceBuilder.password(password); } @@ -115,10 +120,10 @@ public ConnectionSource create(String name, Data } protected DataSource proxy(DataSource dataSource, DataSourceSettings settings) { - if(settings.isLazy()) { + if (settings.isLazy()) { dataSource = new LazyConnectionDataSourceProxy(dataSource); } - if(settings.isTransactionAware()) { + if (settings.isTransactionAware()) { dataSource = new TransactionAwareDataSourceProxy(dataSource); } return dataSource; diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceSettings.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceSettings.groovy index c4b11aeeeed..8c4d0339943 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceSettings.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceSettings.groovy @@ -19,16 +19,17 @@ package org.grails.datastore.gorm.jdbc.connections +import javax.sql.DataSource + import groovy.transform.AutoClone import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + import org.grails.datastore.gorm.jdbc.schema.DefaultSchemaHandler import org.grails.datastore.gorm.jdbc.schema.SchemaHandler import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings -import javax.sql.DataSource - /** * DataSource settings * @@ -37,10 +38,11 @@ import javax.sql.DataSource @Builder(builderStrategy = SimpleStrategy, prefix = '') @AutoClone class DataSourceSettings extends ConnectionSourceSettings { + /** * The data source URL, defaults to an H2 in-memory database */ - String url = "jdbc:h2:mem:grailsDB;LOCK_TIMEOUT=10000" + String url = 'jdbc:h2:mem:grailsDB;LOCK_TIMEOUT=10000' /** * The driver class name @@ -102,7 +104,7 @@ class DataSourceSettings extends ConnectionSourceSettings { /** * The default value for `hibernate.hbm2ddl.auto` */ - String dbCreate = "none" + String dbCreate = 'none' /** * The data source properties @@ -122,11 +124,11 @@ class DataSourceSettings extends ConnectionSourceSettings { @CompileStatic Properties toHibernateProperties() { Properties props = new Properties() - props.put("hibernate.hbm2ddl.auto", dbCreate) - props.put("hibernate.show_sql", String.valueOf(logSql)) - props.put("hibernate.format_sql", String.valueOf(formatSql)) - if(dialect != null) { - props.put("hibernate.dialect", dialect.name) + props.put('hibernate.hbm2ddl.auto', dbCreate) + props.put('hibernate.show_sql', String.valueOf(logSql)) + props.put('hibernate.format_sql', String.valueOf(formatSql)) + if (dialect != null) { + props.put('hibernate.dialect', dialect.name) } return props } @@ -138,19 +140,19 @@ class DataSourceSettings extends ConnectionSourceSettings { Map toProperties() { Map properties = new LinkedHashMap<>() properties.putAll(this.properties) - properties.put("url", url) - if(driverClassName) { - properties.put("driverClassName", driverClassName) + properties.put('url', url) + if (driverClassName) { + properties.put('driverClassName', driverClassName) } - if(username) { - properties.put("username", username) + if (username) { + properties.put('username', username) } - if(password) { - properties.put("username", password) + if (password) { + properties.put('username', password) } - if(readOnly) { - properties.put("defaultReadOnly", String.valueOf(readOnly)) + if (readOnly) { + properties.put('defaultReadOnly', String.valueOf(readOnly)) } return properties } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceSettingsBuilder.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceSettingsBuilder.groovy index a71e080ebf0..e0c50bfc463 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceSettingsBuilder.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/DataSourceSettingsBuilder.groovy @@ -20,9 +20,11 @@ package org.grails.datastore.gorm.jdbc.connections import groovy.transform.CompileStatic + +import org.springframework.core.env.PropertyResolver + import org.grails.datastore.mapping.config.ConfigurationBuilder import org.grails.datastore.mapping.config.Settings -import org.springframework.core.env.PropertyResolver /** * Settings builder for {@link DataSourceSettings} @@ -32,6 +34,7 @@ import org.springframework.core.env.PropertyResolver */ @CompileStatic class DataSourceSettingsBuilder extends ConfigurationBuilder { + DataSourceSettingsBuilder(PropertyResolver propertyResolver, String configurationPrefix = Settings.SETTING_DATASOURCE, Object fallBackSettings = null) { super(propertyResolver, configurationPrefix, fallBackSettings) } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/SpringDataSourceConnectionSourceFactory.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/SpringDataSourceConnectionSourceFactory.java index d12c2ced887..19c89c2441b 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/SpringDataSourceConnectionSourceFactory.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/connections/SpringDataSourceConnectionSourceFactory.java @@ -19,14 +19,15 @@ package org.grails.datastore.gorm.jdbc.connections; -import org.grails.datastore.mapping.config.Settings; -import org.grails.datastore.mapping.core.connections.ConnectionSource; +import javax.sql.DataSource; + import org.springframework.beans.BeansException; import org.springframework.beans.factory.NoSuchBeanDefinitionException; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; -import javax.sql.DataSource; +import org.grails.datastore.mapping.config.Settings; +import org.grails.datastore.mapping.core.connections.ConnectionSource; /** * A {@link DataSourceConnectionSourceFactory} for building data sources that could come from spring diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/schema/DefaultSchemaHandler.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/schema/DefaultSchemaHandler.groovy index e946bb30b98..1ce878dc21d 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/schema/DefaultSchemaHandler.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/schema/DefaultSchemaHandler.groovy @@ -19,13 +19,14 @@ package org.grails.datastore.gorm.jdbc.schema -import groovy.transform.CompileStatic -import groovy.util.logging.Slf4j - -import javax.sql.DataSource import java.sql.Connection import java.sql.ResultSet +import javax.sql.DataSource + +import groovy.transform.CompileStatic +import groovy.util.logging.Slf4j + /** * Resolves the schema names * @@ -41,9 +42,9 @@ class DefaultSchemaHandler implements SchemaHandler { final String defaultSchemaName DefaultSchemaHandler() { - useSchemaStatement = "SET SCHEMA %s" - createSchemaStatement = "CREATE SCHEMA %s" - defaultSchemaName = "PUBLIC" + useSchemaStatement = 'SET SCHEMA %s' + createSchemaStatement = 'CREATE SCHEMA %s' + defaultSchemaName = 'PUBLIC' } DefaultSchemaHandler(String useSchemaStatement, String createSchemaStatement, String defaultSchemaName) { @@ -55,7 +56,7 @@ class DefaultSchemaHandler implements SchemaHandler { @Override void useSchema(Connection connection, String name) { String useStatement = String.format(useSchemaStatement, name) - log.debug("Executing SQL Set Schema Statement: ${useStatement}") + log.debug('Executing SQL Set Schema Statement: {}', useStatement) connection .createStatement() .execute(useStatement) @@ -69,7 +70,7 @@ class DefaultSchemaHandler implements SchemaHandler { @Override void createSchema(Connection connection, String name) { String schemaCreateStatement = String.format(createSchemaStatement, name) - log.debug("Executing SQL Create Schema Statement: ${schemaCreateStatement}") + log.debug('Executing SQL Create Schema Statement: {}', schemaCreateStatement) connection .createStatement() .execute(schemaCreateStatement) @@ -82,8 +83,8 @@ class DefaultSchemaHandler implements SchemaHandler { try { connection = dataSource.getConnection() ResultSet schemas = connection.getMetaData().getSchemas() - while(schemas.next()) { - schemaNames.add(schemas.getString("TABLE_SCHEM")) + while (schemas.next()) { + schemaNames.add(schemas.getString('TABLE_SCHEM')) } } finally { try { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/schema/SchemaHandler.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/schema/SchemaHandler.groovy index e2bf2cdcf6d..b67b821d1a1 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/schema/SchemaHandler.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/jdbc/schema/SchemaHandler.groovy @@ -19,9 +19,10 @@ package org.grails.datastore.gorm.jdbc.schema -import javax.sql.DataSource import java.sql.Connection +import javax.sql.DataSource + /** * A resolver that helps resolve information about the database schema. Required by multi tenancy support * @@ -49,4 +50,4 @@ interface SchemaHandler { * Creates the given schema. Defaults to "CREATE SCHEMA %s" */ void createSchema(Connection connection, String name) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/MultiTenantEventListener.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/MultiTenantEventListener.java index 5e397c828c7..b95d62fbaae 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/MultiTenantEventListener.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/MultiTenantEventListener.java @@ -19,22 +19,27 @@ package org.grails.datastore.gorm.multitenancy; +import java.io.Serializable; +import java.util.Arrays; +import java.util.List; + +import org.springframework.context.ApplicationEvent; + import grails.gorm.multitenancy.Tenants; import org.grails.datastore.gorm.GormEnhancer; import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.connections.ConnectionSource; -import org.grails.datastore.mapping.engine.event.*; +import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent; +import org.grails.datastore.mapping.engine.event.PersistenceEventListener; +import org.grails.datastore.mapping.engine.event.PreInsertEvent; +import org.grails.datastore.mapping.engine.event.PreUpdateEvent; +import org.grails.datastore.mapping.engine.event.ValidationEvent; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.types.TenantId; import org.grails.datastore.mapping.multitenancy.MultiTenantCapableDatastore; import org.grails.datastore.mapping.multitenancy.exceptions.TenantException; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.event.PreQueryEvent; -import org.springframework.context.ApplicationEvent; - -import java.io.Serializable; -import java.util.Arrays; -import java.util.List; /** * An event listener that hooks into persistence events to enable discriminator based multi tenancy (ie {@link org.grails.datastore.mapping.multitenancy.MultiTenancySettings.MultiTenancyMode#DISCRIMINATOR} @@ -63,58 +68,58 @@ public boolean supportsSourceType(Class sourceType) { @Override public void onApplicationEvent(ApplicationEvent event) { Class eventClass = event.getClass(); - if(supportsEventType(eventClass)) { + if (supportsEventType(eventClass)) { Datastore datastore = (Datastore) event.getSource(); - if(event instanceof PreQueryEvent) { + if (event instanceof PreQueryEvent) { PreQueryEvent preQueryEvent = (PreQueryEvent) event; Query query = preQueryEvent.getQuery(); PersistentEntity entity = query.getEntity(); - if(entity.isMultiTenant()) { - if(datastore == null) { + if (entity.isMultiTenant()) { + if (datastore == null) { datastore = GormEnhancer.findDatastore(entity.getJavaClass()); } - if(supportsSourceType(datastore.getClass()) && this.datastore.equals(datastore)) { + if (supportsSourceType(datastore.getClass()) && this.datastore.equals(datastore)) { TenantId tenantId = entity.getTenantId(); - if(tenantId != null) { + if (tenantId != null) { Serializable currentId; - if(datastore instanceof MultiTenantCapableDatastore) { + if (datastore instanceof MultiTenantCapableDatastore) { currentId = Tenants.currentId((MultiTenantCapableDatastore) datastore); } else { currentId = Tenants.currentId(datastore.getClass()); } - query.eq(tenantId.getName(), currentId ); + query.eq(tenantId.getName(), currentId); } } } } - else if((event instanceof ValidationEvent) || (event instanceof PreInsertEvent) || (event instanceof PreUpdateEvent)) { + else if ((event instanceof ValidationEvent) || (event instanceof PreInsertEvent) || (event instanceof PreUpdateEvent)) { AbstractPersistenceEvent preInsertEvent = (AbstractPersistenceEvent) event; PersistentEntity entity = preInsertEvent.getEntity(); - if(entity.isMultiTenant()) { + if (entity.isMultiTenant()) { TenantId tenantId = entity.getTenantId(); - if(datastore == null) { + if (datastore == null) { datastore = GormEnhancer.findDatastore(entity.getJavaClass()); } - if(supportsSourceType(datastore.getClass()) && this.datastore.equals(datastore)) { + if (supportsSourceType(datastore.getClass()) && this.datastore.equals(datastore)) { Serializable currentId; - if(datastore instanceof MultiTenantCapableDatastore) { + if (datastore instanceof MultiTenantCapableDatastore) { currentId = Tenants.currentId((MultiTenantCapableDatastore) datastore); } else { currentId = Tenants.currentId(datastore.getClass()); } - if(currentId != null) { + if (currentId != null) { try { - if(currentId == ConnectionSource.DEFAULT) { + if (currentId == ConnectionSource.DEFAULT) { currentId = (Serializable) preInsertEvent.getEntityAccess().getProperty(tenantId.getName()); } preInsertEvent.getEntityAccess().setProperty(tenantId.getName(), currentId); } catch (Exception e) { - throw new TenantException("Could not assigned tenant id ["+currentId+"] to property ["+tenantId+"], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: " + e.getMessage(), e); + throw new TenantException("Could not assigned tenant id [" + currentId + "] to property [" + tenantId + "], probably due to a type mismatch. You should return a type from the tenant resolver that matches the property type of the tenant id!: " + e.getMessage(), e); } } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.groovy index 158c8113e05..fb01893dc4d 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/TenantDelegatingGormOperations.groovy @@ -19,16 +19,18 @@ package org.grails.datastore.gorm.multitenancy +import groovy.transform.CompileStatic + +import org.springframework.transaction.TransactionDefinition + import grails.gorm.DetachedCriteria import grails.gorm.api.GormAllOperations import grails.gorm.multitenancy.Tenants -import groovy.transform.CompileStatic import org.grails.datastore.gorm.finders.FinderMethod import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.query.api.BuildableCriteria import org.grails.datastore.mapping.query.api.Criteria -import org.springframework.transaction.TransactionDefinition /** * Wraps each method call in the the given tenant id @@ -38,6 +40,7 @@ import org.springframework.transaction.TransactionDefinition */ @CompileStatic class TenantDelegatingGormOperations implements GormAllOperations { + final Datastore datastore final Serializable tenantId final GormAllOperations allOperations @@ -50,119 +53,119 @@ class TenantDelegatingGormOperations implements GormAllOperations { @Override def propertyMissing(D instance, String name) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.propertyMissing(instance, name) } } @Override boolean instanceOf(D instance, Class cls) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.instanceOf(instance, cls) } } @Override D lock(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.lock(instance) } } @Override def T mutex(D instance, Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.mutex(instance, callable) } } @Override D refresh(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.refresh(instance) } } @Override D save(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.save(instance) } } @Override D insert(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.insert(instance) } } @Override D insert(D instance, Map params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.insert(instance, params) } } @Override D merge(D instance, Map params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.merge(instance, params) } } @Override D save(D instance, boolean validate) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.save(instance, validate) } } @Override D save(D instance, Map params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.save(instance, params) } } @Override Serializable ident(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.ident(instance) } } @Override D attach(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.attach(instance) } } @Override boolean isAttached(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.isAttached(instance) } } @Override void discard(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.discard(instance) } } @Override void delete(D instance) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.delete(instance) } } @Override void delete(D instance, Map params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.save(instance, params) } } @@ -179,70 +182,70 @@ class TenantDelegatingGormOperations implements GormAllOperations { @Override DetachedCriteria where(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.where(callable) } } @Override DetachedCriteria whereLazy(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.whereLazy(callable) } } @Override DetachedCriteria whereAny(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.whereAny(callable) } } @Override List findAll(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(callable) } } @Override List findAll(Map args, Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(args, callable) } } @Override D find(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(callable) } } @Override List saveAll(Object... objectsToSave) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.saveAll(objectsToSave) } } @Override List saveAll(Iterable objectsToSave) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.saveAll(objectsToSave) } } @Override void deleteAll(Object... objectsToDelete) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.deleteAll(objectsToDelete) } } @Override void deleteAll(Iterable objectsToDelete) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.deleteAll(objectsToDelete) } } @@ -254,497 +257,497 @@ class TenantDelegatingGormOperations implements GormAllOperations { @Override D get(Serializable id) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.get(id) } } @Override D read(Serializable id) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.read(id) } } @Override D load(Serializable id) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.load(id) } } @Override D proxy(Serializable id) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.proxy(id) } } @Override List getAll(Iterable ids) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.getAll(ids) } } @Override List getAll(Serializable... ids) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.getAll(ids) } } @Override List getAll() { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.getAll() } } @Override BuildableCriteria createCriteria() { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.createCriteria() } } @Override def T withCriteria(@DelegatesTo(Criteria) Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withCriteria callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withCriteria(callable) } } @Override def T withCriteria(Map builderArgs, @DelegatesTo(Criteria) Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withCriteria builderArgs, callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withCriteria(builderArgs, callable) } } @Override D lock(Serializable id) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.lock(id) } } @Override D merge(D d) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.merge(d) } } @Override Integer count() { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.count() } } @Override Integer getCount() { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.getCount() } } @Override boolean exists(Serializable id) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.exists(id) } } @Override List list(Map params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.list(params) } } @Override List list() { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.list() } } @Override List findAll(Map params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(params) } } @Override List findAll() { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll() } } @Override List findAll(D example) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(example) } } @Override List findAll(D example, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(example, args) } } @Override D first() { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.first() } } @Override D first(String propertyName) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.first(propertyName) } } @Override D first(Map queryParams) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.first(queryParams) } } @Override D last() { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.last() } } @Override D last(String propertyName) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.last(propertyName) } } @Override Object methodMissing(String methodName, Object arg) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.methodMissing(methodName, arg) } } @Override Object propertyMissing(String property) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.propertyMissing(property) } } @Override void propertyMissing(String property, Object value) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.propertyMissing(property, value) } } @Override D last(Map queryParams) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.last(queryParams) } } @Override List findAllWhere(Map queryMap) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAllWhere(queryMap) } } @Override List findAllWhere(Map queryMap, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAllWhere(queryMap, args) } } @Override D find(D example) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(example) } } @Override D find(D example, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(example, args) } } @Override D findWhere(Map queryMap) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findWhere(queryMap) } } @Override D findWhere(Map queryMap, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findWhere(queryMap, args) } } @Override D findOrCreateWhere(Map queryMap) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findOrCreateWhere(queryMap) } } @Override D findOrSaveWhere(Map queryMap) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findOrSaveWhere(queryMap) } } @Override def T withSession(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withSession callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withSession(callable) } } @Override def T withDatastoreSession(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withDatastoreSession callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withDatastoreSession(callable) } } @Override def T withTransaction(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withTransaction callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withTransaction(callable) } } @Override def T withNewTransaction(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withNewTransaction callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withNewTransaction(callable) } } @Override def T withTransaction(Map transactionProperties, Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withTransaction transactionProperties, callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withTransaction(transactionProperties, callable) } } @Override def T withNewTransaction(Map transactionProperties, Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withNewTransaction transactionProperties, callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withNewTransaction(transactionProperties, callable) } } @Override def T withTransaction(TransactionDefinition definition, Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withTransaction definition, callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withTransaction(definition, callable) } } @Override def T withNewSession(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withNewSession callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withNewSession(callable) } } @Override def T withStatelessSession(Closure callable) { - Tenants.withId((Class)datastore.getClass(), tenantId) { - allOperations.withStatelessSession callable + Tenants.withId((Class) datastore.getClass(), tenantId) { + allOperations.withStatelessSession(callable) } } @Override List executeQuery(CharSequence query) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeQuery(query) } } @Override List executeQuery(CharSequence query, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeQuery(query, args) } } @Override List executeQuery(CharSequence query, Map params, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeQuery(query, params, args) } } @Override List executeQuery(CharSequence query, Collection params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeQuery(query, params) } } @Override List executeQuery(CharSequence query, Object... params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeQuery(query, params) } } @Override List executeQuery(CharSequence query, Collection params, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeQuery(query, params, args) } } @Override Integer executeUpdate(CharSequence query) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeUpdate(query) } } @Override Integer executeUpdate(CharSequence query, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeUpdate(query, args) } } @Override Integer executeUpdate(CharSequence query, Map params, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeUpdate(query, params, args) } } @Override Integer executeUpdate(CharSequence query, Collection params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeUpdate(query, params) } } @Override Integer executeUpdate(CharSequence query, Object... params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeUpdate(query, params) } } @Override Integer executeUpdate(CharSequence query, Collection params, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.executeUpdate(query, params, args) } } @Override D find(CharSequence query) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(query) } } @Override D find(CharSequence query, Map params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(query, params) } } @Override D find(CharSequence query, Map params, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(query, params, args) } } @Override D find(CharSequence query, Collection params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(query, params) } } @Override D find(CharSequence query, Object[] params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(query, params) } } @Override D find(CharSequence query, Collection params, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.find(query, params, args) } } @Override List findAll(CharSequence query) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(query) } } @Override List findAll(CharSequence query, Map params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(query, params) } } @Override List findAll(CharSequence query, Map params, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(query, params, args) } } @Override List findAll(CharSequence query, Collection params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(query, params) } } @Override List findAll(CharSequence query, Object[] params) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(query, params) } } @Override List findAll(CharSequence query, Collection params, Map args) { - Tenants.withId((Class)datastore.getClass(), tenantId) { + Tenants.withId((Class) datastore.getClass(), tenantId) { allOperations.findAll(query, params, args) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/transform/TenantTransform.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/transform/TenantTransform.groovy index f7fca8a9108..0e6b15ff602 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/transform/TenantTransform.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/multitenancy/transform/TenantTransform.groovy @@ -18,13 +18,13 @@ */ package org.grails.datastore.gorm.multitenancy.transform -import grails.gorm.multitenancy.CurrentTenant -import grails.gorm.multitenancy.Tenant -import grails.gorm.multitenancy.TenantService -import grails.gorm.multitenancy.WithoutTenant import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder -import org.codehaus.groovy.ast.* +import org.codehaus.groovy.ast.AnnotatedNode +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.Parameter +import org.codehaus.groovy.ast.VariableScope import org.codehaus.groovy.ast.expr.ClassExpression import org.codehaus.groovy.ast.expr.ClosureExpression import org.codehaus.groovy.ast.expr.Expression @@ -34,7 +34,12 @@ import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.GroovyASTTransformation -import org.grails.datastore.gorm.transactions.transform.TransactionalTransform + +import grails.gorm.multitenancy.CurrentTenant +import grails.gorm.multitenancy.Tenant +import grails.gorm.multitenancy.TenantService +import grails.gorm.multitenancy.WithoutTenant +import org.apache.grails.common.compiler.GroovyTransformOrder import org.grails.datastore.gorm.transform.AbstractDatastoreMethodDecoratingTransformation import org.grails.datastore.mapping.multitenancy.exceptions.TenantNotFoundException import org.grails.datastore.mapping.reflect.AstUtils @@ -42,7 +47,20 @@ import org.grails.datastore.mapping.services.ServiceRegistry import static org.codehaus.groovy.ast.ClassHelper.CLOSURE_TYPE import static org.codehaus.groovy.ast.ClassHelper.make -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.castX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.equalsNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.param +import static org.codehaus.groovy.ast.tools.GeneralUtils.params +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.throwS +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callD import static org.grails.datastore.mapping.reflect.AstUtils.copyParameters import static org.grails.datastore.mapping.reflect.AstUtils.varThis @@ -56,6 +74,7 @@ import static org.grails.datastore.mapping.reflect.AstUtils.varThis @CompileStatic @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) class TenantTransform extends AbstractDatastoreMethodDecoratingTransformation { + private static final Object APPLIED_MARKER = new Object() private static final ClassExpression CURRENT_TENANT_ANNOTATION_TYPE_EXPR = classX(CurrentTenant) private static final ClassExpression TENANT_ANNOTATION_TYPE_EXPR = classX(Tenant) @@ -66,7 +85,7 @@ class TenantTransform extends AbstractDatastoreMethodDecoratingTransformation { public static final ClassNode WITHOUT_TENANT_ANNOTATION_TYPE = WITHOUT_TENANT_ANNOTATION_TYPE_EXPR.getType() public static final String RENAMED_METHOD_PREFIX = '$mt__' - public static final String VAR_TENANT_ID = "tenantId" + public static final String VAR_TENANT_ID = 'tenantId' private static final Parameter[] N0_PARAMETER = null @@ -80,52 +99,52 @@ class TenantTransform extends AbstractDatastoreMethodDecoratingTransformation { ClassNode tenantServiceClassNode = make(TenantService) VariableScope variableScope = methodNode.getVariableScope() VariableExpression tenantServiceVar = varX('$tenantService', tenantServiceClassNode) - variableScope.putDeclaredVariable( tenantServiceVar ) + variableScope.putDeclaredVariable(tenantServiceVar) newMethodBody.addStatement( - declS(tenantServiceVar, callD(ServiceRegistry, "targetDatastore", "getService", classX(tenantServiceClassNode) ) ) + declS(tenantServiceVar, callD(ServiceRegistry, 'targetDatastore', 'getService', classX(tenantServiceClassNode))) ) ClassNode serializableClassNode = make(Serializable) ClassNode annotationClassNode = annotationNode.classNode if (CURRENT_TENANT_ANNOTATION_TYPE.equals(annotationClassNode)) { - return makeDelegatingClosureCall(tenantServiceVar, "withCurrent", params(param(serializableClassNode, VAR_TENANT_ID)), originalMethodCallExpr, variableScope) + return makeDelegatingClosureCall(tenantServiceVar, 'withCurrent', params(param(serializableClassNode, VAR_TENANT_ID)), originalMethodCallExpr, variableScope) } else if (WITHOUT_TENANT_ANNOTATION_TYPE.equals(annotationClassNode)) { - return makeDelegatingClosureCall(tenantServiceVar, "withoutId", N0_PARAMETER, originalMethodCallExpr, variableScope) + return makeDelegatingClosureCall(tenantServiceVar, 'withoutId', N0_PARAMETER, originalMethodCallExpr, variableScope) } else { // must be @Tenant - Expression annValue = annotationNode.getMember("value") - if(annValue instanceof ClosureExpression) { + Expression annValue = annotationNode.getMember('value') + if (annValue instanceof ClosureExpression) { VariableExpression closureVar = varX('$tenantResolver', CLOSURE_TYPE) VariableExpression tenantIdVar = varX('$tenantId', serializableClassNode) tenantIdVar.setClosureSharedVariable(true) - variableScope.putDeclaredVariable( closureVar ) - variableScope.putReferencedLocalVariable( tenantIdVar ) - variableScope.putDeclaredVariable( tenantIdVar ) + variableScope.putDeclaredVariable(closureVar) + variableScope.putReferencedLocalVariable(tenantIdVar) + variableScope.putDeclaredVariable(tenantIdVar) // Generates: // Closure $tenantResolver = ... // $tenantResolver = $tenantResolver.clone() // $tenantResolver.setDelegate(this) // Serializable $tenantId = (Serializable)$tenantResolver.call() // if($tenantId == null) throw new TenantNotFoundException(..) - newMethodBody.addStatement declS( closureVar, annValue) - newMethodBody.addStatement assignS( closureVar, callD( closureVar, "clone")) - newMethodBody.addStatement stmt( callD( closureVar, "setDelegate", varThis() ) ) - newMethodBody.addStatement declS( tenantIdVar, castX( serializableClassNode, callD( closureVar, "call") )) - newMethodBody.addStatement ifS( equalsNullX(tenantIdVar), - throwS( ctorX( make(TenantNotFoundException), constX("Tenant id resolved from @Tenant is null")) ) - ) - return makeDelegatingClosureCall( tenantServiceVar, "withId", args(tenantIdVar), params( param(serializableClassNode, VAR_TENANT_ID)), originalMethodCallExpr, variableScope) + newMethodBody.addStatement(declS(closureVar, annValue)) + newMethodBody.addStatement(assignS(closureVar, callD(closureVar, 'clone'))) + newMethodBody.addStatement(stmt(callD(closureVar, 'setDelegate', varThis()))) + newMethodBody.addStatement(declS(tenantIdVar, castX(serializableClassNode, callD(closureVar, 'call')))) + newMethodBody.addStatement(ifS(equalsNullX(tenantIdVar), + throwS(ctorX(make(TenantNotFoundException), constX('Tenant id resolved from @Tenant is null'))) + )) + return makeDelegatingClosureCall(tenantServiceVar, 'withId', args(tenantIdVar), params(param(serializableClassNode, VAR_TENANT_ID)), originalMethodCallExpr, variableScope) } else { - addError("@Tenant value should be a closure", annotationNode) - return makeDelegatingClosureCall( tenantServiceVar, "withCurrent", params( param(serializableClassNode, VAR_TENANT_ID)), originalMethodCallExpr, variableScope) + addError('@Tenant value should be a closure', annotationNode) + return makeDelegatingClosureCall(tenantServiceVar, 'withCurrent', params(param(serializableClassNode, VAR_TENANT_ID)), originalMethodCallExpr, variableScope) } } } @Override protected Parameter[] prepareNewMethodParameters(MethodNode methodNode, Map genericsSpec, ClassNode classNode = null) { - if(methodNode.getAnnotations(WITHOUT_TENANT_ANNOTATION_TYPE).isEmpty() && (!classNode || classNode.getAnnotations(WITHOUT_TENANT_ANNOTATION_TYPE).isEmpty())) { + if (methodNode.getAnnotations(WITHOUT_TENANT_ANNOTATION_TYPE).isEmpty() && (!classNode || classNode.getAnnotations(WITHOUT_TENANT_ANNOTATION_TYPE).isEmpty())) { final Parameter tenantIdParameter = param(make(Serializable), VAR_TENANT_ID) Parameter[] parameters = methodNode.getParameters() Parameter[] newParameters = parameters.length > 0 ? (copyParameters(((parameters as List) + [tenantIdParameter]) as Parameter[], genericsSpec)) : [tenantIdParameter] as Parameter[] @@ -160,19 +179,19 @@ class TenantTransform extends AbstractDatastoreMethodDecoratingTransformation { */ static boolean hasTenantAnnotation(AnnotatedNode node) { ClassNode classNode - if(node instanceof MethodNode) { - if(AstUtils.findAnnotation(node, WithoutTenant)) { + if (node instanceof MethodNode) { + if (AstUtils.findAnnotation(node, WithoutTenant)) { return false } - classNode = ((MethodNode)node).getDeclaringClass() + classNode = ((MethodNode) node).getDeclaringClass() } - else if(node instanceof ClassNode) { - classNode = ((ClassNode)node) + else if (node instanceof ClassNode) { + classNode = ((ClassNode) node) } - if(classNode != null) { + if (classNode != null) { - for(ann in [CurrentTenant, Tenant]) { - if(AstUtils.findAnnotation(classNode, ann) || AstUtils.findAnnotation(node, ann)) { + for (ann in [CurrentTenant, Tenant]) { + if (AstUtils.findAnnotation(classNode, ann) || AstUtils.findAnnotation(node, ann)) { return true } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/plugin/support/PersistenceContextInterceptorAggregator.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/plugin/support/PersistenceContextInterceptorAggregator.groovy index 305ab3f02ac..75f9d111f55 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/plugin/support/PersistenceContextInterceptorAggregator.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/plugin/support/PersistenceContextInterceptorAggregator.groovy @@ -18,7 +18,10 @@ */ package org.grails.datastore.gorm.plugin.support +import java.util.regex.Pattern + import groovy.transform.CompileStatic + import org.springframework.beans.factory.config.BeanDefinition import org.springframework.beans.factory.config.ConfigurableListableBeanFactory import org.springframework.beans.factory.config.ConstructorArgumentValues @@ -29,12 +32,11 @@ import org.springframework.beans.factory.support.ManagedList import org.springframework.core.Ordered import org.springframework.util.ClassUtils -import java.util.regex.Pattern /** * BeanDefinitionRegistryPostProcessor that replaces multiple discovered PersistenceContextInterceptor beans with * a single aggregating instance. The previous multiple PersistenceContextInterceptor beans will be removed from * the context and re-added as inner beans of the new AggregatePersistenceContextInterceptor bean. - * + * * PersistenceContextInterceptor beans are discovered by the bean name. The default pattern used for matching * the beans is ^.*[pP]ersistenceInterceptor$ * @@ -43,9 +45,10 @@ import java.util.regex.Pattern */ @CompileStatic class PersistenceContextInterceptorAggregator implements BeanDefinitionRegistryPostProcessor, Ordered { + Pattern persistenceInterceptorBeanNamePattern = ~/^.*[pP]ersistenceInterceptor$/ String aggregatorBeanName = 'persistenceInterceptor' - Class aggregatorBeanClass = ClassUtils.forName("org.grails.datastore.gorm.support.AggregatePersistenceContextInterceptor", Thread.currentThread().contextClassLoader) + Class aggregatorBeanClass = ClassUtils.forName('org.grails.datastore.gorm.support.AggregatePersistenceContextInterceptor', Thread.currentThread().contextClassLoader) int order = 500 void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) { @@ -54,12 +57,12 @@ class PersistenceContextInterceptorAggregator implements BeanDefinitionRegistryP protected createAggregatePersistenceContextInterceptorOnDemand(BeanDefinitionRegistry registry) { Collection persistenceInterceptorBeanNames = findPersistenceInterceptorBeanNames(registry) - if(persistenceInterceptorBeanNames.size() > 1) { + if (persistenceInterceptorBeanNames.size() > 1) { ManagedList interceptorBeans = moveInterceptorBeansToManagedList(registry, persistenceInterceptorBeanNames) registry.registerBeanDefinition(aggregatorBeanName, createAggregateBeanDefinition(interceptorBeans)) } } - + protected Collection findPersistenceInterceptorBeanNames(BeanDefinitionRegistry registry) { // assume that all persistenceInterceptor beans match the defined pattern // checking for type (class) would require instantiating classes @@ -69,7 +72,7 @@ class PersistenceContextInterceptorAggregator implements BeanDefinitionRegistryP protected ManagedList moveInterceptorBeansToManagedList(BeanDefinitionRegistry registry, Collection persistenceInterceptorBeanNames) { ManagedList list = new ManagedList() persistenceInterceptorBeanNames.each { String beanName -> - list.add registry.getBeanDefinition(beanName) + list.add(registry.getBeanDefinition(beanName)) registry.removeBeanDefinition(beanName) } return list @@ -86,6 +89,6 @@ class PersistenceContextInterceptorAggregator implements BeanDefinitionRegistryP } void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) { - + } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/proxy/GroovyProxyFactory.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/proxy/GroovyProxyFactory.groovy index d980c806bc3..e7345a10d3d 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/proxy/GroovyProxyFactory.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/proxy/GroovyProxyFactory.groovy @@ -19,8 +19,8 @@ package org.grails.datastore.gorm.proxy import groovy.transform.CompileStatic - import org.codehaus.groovy.runtime.HandleMetaClass + import org.grails.datastore.mapping.core.Session import org.grails.datastore.mapping.engine.AssociationQueryExecutor import org.grails.datastore.mapping.engine.EntityPersister @@ -35,6 +35,7 @@ import org.grails.datastore.mapping.reflect.ClassPropertyFetcher */ @CompileStatic class GroovyProxyFactory implements ProxyFactory { + /** * Check our object has the correct meta class to be a proxy of this type. * @param object The object. @@ -47,8 +48,8 @@ class GroovyProxyFactory implements ProxyFactory { @Override @Override - public Class getProxiedClass(Object o) { - if(isProxy(o)) { + Class getProxiedClass(Object o) { + if (isProxy(o)) { return o.getClass().getSuperclass() } return o.getClass() @@ -60,11 +61,11 @@ class GroovyProxyFactory implements ProxyFactory { } protected ProxyInstanceMetaClass getProxyInstanceMetaClass(object) { - if(object == null) { + if (object == null) { return null } - MetaClass mc = unwrapHandleMetaClass(object instanceof GroovyObject ? ((GroovyObject)object).getMetaClass() : object.metaClass) - mc instanceof ProxyInstanceMetaClass ? (ProxyInstanceMetaClass)mc : null + MetaClass mc = unwrapHandleMetaClass(object instanceof GroovyObject ? ((GroovyObject) object).getMetaClass() : object.metaClass) + mc instanceof ProxyInstanceMetaClass ? (ProxyInstanceMetaClass) mc : null } @Override @@ -92,15 +93,15 @@ class GroovyProxyFactory implements ProxyFactory { * @return A proxy instance */ @Override - public T createProxy(Session session, Class type, Serializable key) { + T createProxy(Session session, Class type, Serializable key) { EntityPersister persister = (EntityPersister) session.getPersister(type) T proxy = type.newInstance() persister.setObjectIdentifier(proxy, key) MetaClass metaClass = new ProxyInstanceMetaClass(resolveTargetMetaClass(proxy, type), session, key) - if(proxy instanceof GroovyObject) { + if (proxy instanceof GroovyObject) { // direct assignment of MetaClass to GroovyObject - ((GroovyObject)proxy).setMetaClass(metaClass) + ((GroovyObject) proxy).setMetaClass(metaClass) } else { // call DefaultGroovyMethods.setMetaClass proxy.metaClass = metaClass @@ -110,15 +111,15 @@ class GroovyProxyFactory implements ProxyFactory { @Override def T createProxy(Session session, AssociationQueryExecutor executor, K associationKey) { - throw new UnsupportedOperationException("Association proxies are not currently supported by the Groovy project factory") + throw new UnsupportedOperationException('Association proxies are not currently supported by the Groovy project factory') } protected MetaClass resolveTargetMetaClass(T proxy, Class type) { unwrapHandleMetaClass(proxy.getMetaClass()) } - + private MetaClass unwrapHandleMetaClass(MetaClass metaClass) { - (metaClass instanceof HandleMetaClass) ? ((HandleMetaClass)metaClass).getAdaptee() : metaClass + (metaClass instanceof HandleMetaClass) ? ((HandleMetaClass) metaClass).getAdaptee() : metaClass } @Override @@ -131,7 +132,7 @@ class GroovyProxyFactory implements ProxyFactory { } @Override - public boolean isInitialized(Object object, String associationName) { + boolean isInitialized(Object object, String associationName) { final Object value = ClassPropertyFetcher.getInstancePropertyValue(object, associationName) return value == null || isInitialized(value) } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/proxy/ProxyInstanceMetaClass.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/proxy/ProxyInstanceMetaClass.java index 99c6d565c6a..36d5b841d6f 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/proxy/ProxyInstanceMetaClass.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/proxy/ProxyInstanceMetaClass.java @@ -18,13 +18,14 @@ */ package org.grails.datastore.gorm.proxy; +import java.io.Serializable; + import groovy.lang.DelegatingMetaClass; import groovy.lang.MetaClass; -import java.io.Serializable; +import org.springframework.dao.DataIntegrityViolationException; import org.grails.datastore.mapping.core.Session; -import org.springframework.dao.DataIntegrityViolationException; /** * Per-instance metaclass to use for proxied GORM domain objects. It auto-retrieves the associated entity when @@ -101,7 +102,7 @@ public Object invokeMethod(Object o, String methodName, Object[] arguments) { } else if (methodName.equals("getClass") || methodName.equals("getDomainClass")) { // return correct class only if loaded, otherwise hope for the best resolveTarget = isProxyInitiated(); - } else if (methodName.equals("setMetaClass") && arguments.length == 1 && (arguments[0]==null || arguments[0] instanceof MetaClass)) { + } else if (methodName.equals("setMetaClass") && arguments.length == 1 && (arguments[0] == null || arguments[0] instanceof MetaClass)) { resolveTarget = false; } return delegate.invokeMethod(resolveTarget ? getProxyTarget() : o, methodName, arguments); @@ -138,9 +139,9 @@ public Object getProperty(Object object, String property) { @Override public void setProperty(Object object, String property, Object newValue) { boolean resolveTarget = true; - if(property.equals("metaClass") && (newValue == null || newValue instanceof MetaClass)) { + if (property.equals("metaClass") && (newValue == null || newValue instanceof MetaClass)) { resolveTarget = false; - } + } delegate.setProperty(resolveTarget ? getProxyTarget() : object, property, newValue); } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/AbstractResultList.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/AbstractResultList.java index d47e5f3dc9d..bc879b79e46 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/AbstractResultList.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/AbstractResultList.java @@ -19,7 +19,11 @@ package org.grails.datastore.gorm.query; import java.io.Closeable; -import java.util.*; +import java.util.AbstractList; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; /** * An abstract result list for initializing objects lazily from a cursor @@ -42,7 +46,7 @@ public AbstractResultList(int offset, Iterator cursor) { public AbstractResultList(int offset, Integer size, Iterator cursor) { this.offset = offset; boolean hasSize = size != null && size > -1; - if(hasSize) { + if (hasSize) { this.size = size; } this.cursor = cursor; @@ -54,7 +58,6 @@ public Iterator getCursor() { return cursor; } - protected void initializeFully() { if (initialized) return; @@ -64,7 +67,6 @@ protected void initializeFully() { initialized = true; } - @Override public boolean isEmpty() { if (initialized) { @@ -88,7 +90,7 @@ public Object get(int index) { if (index == internalIndex) { return o; } - else if(index < initializedSize) { + else if (index < initializedSize) { return initializedObjects.get(index); } @@ -100,7 +102,7 @@ else if(index < initializedSize) { protected Object convertObject() { final Object next = convertObject(nextDecoded()); - if(!cursor.hasNext()) { + if (!cursor.hasNext()) { initialized = true; } initializedObjects.add(next); @@ -152,21 +154,20 @@ public ListIterator listIterator(int index) { @Override public Iterator iterator() { if (initialized || !initializedObjects.isEmpty()) { - if(!initialized) { + if (!initialized) { initializeFully(); } return initializedObjects.iterator(); } - return new Iterator() { int iteratorIndex = 0; Object current; public boolean hasNext() { - if(iteratorIndex < internalIndex) { + if (iteratorIndex < internalIndex) { return true; } - else if(!initialized) { + else if (!initialized) { boolean hasMore = cursor.hasNext(); if (!hasMore) { @@ -179,7 +180,7 @@ else if(!initialized) { @SuppressWarnings("unchecked") public Object next() { - if(iteratorIndex < internalIndex) { + if (iteratorIndex < internalIndex) { current = initializedObjects.get(iteratorIndex); } else { @@ -193,7 +194,7 @@ public Object next() { } public void remove() { - if(current != null) { + if (current != null) { initializedObjects.remove(current); } } @@ -211,6 +212,4 @@ else if (this.size == null) { } return size; } - - } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/GormOperations.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/GormOperations.groovy index b249279b599..848f50b4462 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/GormOperations.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/GormOperations.groovy @@ -27,7 +27,6 @@ interface GormOperations extends GormQueryOperations { */ T getPersistentClass() - /** * Deletes all entities matching this criteria * diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/GormQueryOperations.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/GormQueryOperations.groovy index 4417c5d1cd7..5725bc2c654 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/GormQueryOperations.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/GormQueryOperations.groovy @@ -18,8 +18,6 @@ */ package org.grails.datastore.gorm.query - - /** * Interface defining all typical query GORM operations on class * diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedCriteriaProxy.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedCriteriaProxy.groovy index 0d8aea23fd0..8c28361399f 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedCriteriaProxy.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedCriteriaProxy.groovy @@ -23,13 +23,6 @@ import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.finders.DynamicFinder import org.grails.datastore.gorm.finders.FinderMethod import org.grails.datastore.mapping.model.PersistentEntity -import org.grails.datastore.mapping.query.api.BuildableCriteria -import org.grails.datastore.mapping.reflect.NameUtils -import org.springframework.util.ReflectionUtils - -import java.lang.reflect.Modifier - - /** * Handles named queries @@ -51,9 +44,8 @@ class NamedCriteriaProxy implements GormQueryOperations { private previousInChain private queryBuilder - NamedCriteriaProxy(Closure criteriaClosure, PersistentEntity entity, List finders) { - this.criteriaClosure = (Closure)criteriaClosure.clone() + this.criteriaClosure = (Closure) criteriaClosure.clone() this.criteriaClosure.delegate = this this.entity = entity this.finders = finders @@ -66,14 +58,14 @@ class NamedCriteriaProxy implements GormQueryOperations { def call(Object[] params) { if (params && params[-1] instanceof Closure) { - Closure additionalCriteriaClosure = (Closure)params[-1] + Closure additionalCriteriaClosure = (Closure) params[-1] params = params.length > 1 ? params[0..-2] : [:] if (params) { if (params[-1] instanceof Map) { if (params.length > 1) { namedCriteriaParams = params[0..-2] as Object[] } - return list((Map)params[-1], additionalCriteriaClosure) + return list((Map) params[-1], additionalCriteriaClosure) } else { namedCriteriaParams = params return list(Collections.emptyMap(), additionalCriteriaClosure) @@ -90,11 +82,11 @@ class NamedCriteriaProxy implements GormQueryOperations { } D get(Serializable id) { - id = (Serializable)entity.mappingContext.conversionService.convert(id, entity.identity.type) + id = (Serializable) entity.mappingContext.conversionService.convert(id, entity.identity.type) def getClosure = { queryBuilder = delegate invokeCriteriaClosure() - eq 'id', id + eq('id', id) uniqueResult = true } return entity.javaClass.createCriteria().get(getClosure) @@ -116,18 +108,17 @@ class NamedCriteriaProxy implements GormQueryOperations { @Override D get(Map paramsMap = Collections.emptyMap(), Closure additionalCriteria = null) { def conversionService = entity.mappingContext.conversionService - return (D) entity.javaClass.createCriteria().get( { + return (D) entity.javaClass.createCriteria().get({ queryBuilder = delegate - maxResults 1 + maxResults(1) uniqueResult = true invokeCriteriaClosure(additionalCriteria) if (paramsMap && queryBuilder instanceof CriteriaBuilder) { DynamicFinder.populateArgumentsForCriteria(entity.javaClass, queryBuilder.query, paramsMap) } - } ) + }) } - List list(Closure additionalCriteria) { list(Collections.emptyMap(), additionalCriteria) } @@ -139,7 +130,7 @@ class NamedCriteriaProxy implements GormQueryOperations { queryBuilder = delegate invokeCriteriaClosure(additionalCriteria) } - if(paramsMap.isEmpty()) { + if (paramsMap.isEmpty()) { return entity.javaClass.createCriteria().list(callable) } else { @@ -160,10 +151,10 @@ class NamedCriteriaProxy implements GormQueryOperations { } invokeCriteriaClosure(additionalCriteria) if (paramsMap?.max) { - maxResults conversionService.convert(paramsMap.max, Integer) + maxResults(conversionService.convert(paramsMap.max, Integer)) } if (paramsMap?.offset) { - firstResult conversionService.convert(paramsMap.offset, Integer) + firstResult(conversionService.convert(paramsMap.offset, Integer)) } if (paramsMap && queryBuilder instanceof CriteriaBuilder) { DynamicFinder.populateArgumentsForCriteria(entity.javaClass, queryBuilder.query, paramsMap) @@ -180,19 +171,18 @@ class NamedCriteriaProxy implements GormQueryOperations { entity.javaClass.createCriteria().count(countClosure) } - Number count(Closure additionalCriteria ) { + Number count(Closure additionalCriteria) { count(Collections.emptyMap(), additionalCriteria) } - D findWhere(Map params) { def queryClosure = { queryBuilder = delegate invokeCriteriaClosure() - params.each {key, val -> - eq key, val + params.each { key, val -> + eq(key, val) } - maxResults 1 + maxResults(1) uniqueResult = true } entity.javaClass.withCriteria(queryClosure) @@ -202,8 +192,8 @@ class NamedCriteriaProxy implements GormQueryOperations { def queryClosure = { queryBuilder = delegate invokeCriteriaClosure() - params.each {key, val -> - eq key, val + params.each { key, val -> + eq(key, val) } } entity.javaClass.withCriteria(queryClosure) @@ -235,7 +225,7 @@ class NamedCriteriaProxy implements GormQueryOperations { if (queryBuilder == null) { NamedCriteriaProxy nextInChain = GormEnhancer.createNamedQuery(javaClass, methodName) - if(nextInChain != null) { + if (nextInChain != null) { nextInChain.previousInChain = this return nextInChain.call(args) } @@ -293,5 +283,4 @@ class NamedCriteriaProxy implements GormQueryOperations { return c } - } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedQueriesBuilder.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedQueriesBuilder.groovy index 3b8dde59f58..adbf3624d56 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedQueriesBuilder.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/NamedQueriesBuilder.groovy @@ -20,9 +20,7 @@ package org.grails.datastore.gorm.query import groovy.transform.CompileStatic -import org.grails.datastore.gorm.finders.FinderMethod -import org.grails.datastore.mapping.model.PersistentEntity -import org.grails.datastore.mapping.reflect.NameUtils + /** * Handles creation of named queries * @@ -36,7 +34,7 @@ class NamedQueriesBuilder { @CompileStatic Map evaluate(Closure namedQueriesClosure) { - Closure closure = (Closure)namedQueriesClosure.clone() + Closure closure = (Closure) namedQueriesClosure.clone() closure.resolveStrategy = Closure.DELEGATE_ONLY closure.delegate = this closure.call() @@ -46,7 +44,7 @@ class NamedQueriesBuilder { def methodMissing(String name, args) { if (args && args[0] instanceof Closure && !initialized) { - Closure criteriaClosure = (Closure)args[0] + Closure criteriaClosure = (Closure) args[0] namedQueries.put(name, criteriaClosure) return null diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.java index 6ebd22a57ff..50e79439149 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/AbstractCriteriaBuilder.java @@ -19,9 +19,23 @@ package org.grails.datastore.gorm.query.criteria; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +import groovy.lang.Closure; +import groovy.lang.GroovyObjectSupport; +import groovy.lang.GroovySystem; +import groovy.lang.MetaMethod; +import groovy.lang.MetaObjectProtocol; +import groovy.lang.MissingMethodException; + +import org.springframework.util.Assert; + import grails.gorm.CriteriaBuilder; import grails.gorm.DetachedCriteria; -import groovy.lang.*; import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; @@ -33,9 +47,6 @@ import org.grails.datastore.mapping.query.api.Criteria; import org.grails.datastore.mapping.query.api.ProjectionList; import org.grails.datastore.mapping.query.api.QueryableCriteria; -import org.springframework.util.Assert; - -import java.util.*; /** * Abstract criteria builder implementation @@ -56,13 +67,12 @@ public abstract class AbstractCriteriaBuilder extends GroovyObjectSupport implem protected Query query; protected boolean uniqueResult = false; protected boolean paginationEnabledList; - protected List orderEntries = new ArrayList(); - protected MetaObjectProtocol queryMetaClass; - protected Query.ProjectionList projectionList; + protected List orderEntries = new ArrayList<>(); + protected MetaObjectProtocol queryMetaClass; + protected Query.ProjectionList projectionList; protected PersistentEntity persistentEntity; protected boolean readOnly; - private List logicalExpressionStack = new ArrayList(); - + private List logicalExpressionStack = new ArrayList<>(); public AbstractCriteriaBuilder(final Class targetClass, QueryCreator queryCreator, final MappingContext mappingContext) { Assert.notNull(targetClass, "Argument [targetClass] cannot be null"); @@ -79,43 +89,41 @@ public AbstractCriteriaBuilder(final Class targetClass, QueryCreator queryCreato this.queryCreator = queryCreator; } - - public Class getTargetClass() { return this.targetClass; } public void setUniqueResult(boolean uniqueResult) { this.uniqueResult = uniqueResult; - } + } @Override - public Criteria cache(boolean cache) { - query.cache(cache); - return this; - } + public Criteria cache(boolean cache) { + query.cache(cache); + return this; + } @Override - public Criteria readOnly(boolean readOnly) { - this.readOnly = readOnly; - return this; - } + public Criteria readOnly(boolean readOnly) { + this.readOnly = readOnly; + return this; + } public Criteria join(String property) { - query.join(property); - return this; - } + query.join(property); + return this; + } public Criteria select(String property) { - query.select(property); - return this; - } + query.select(property); + return this; + } public Query.ProjectionList id() { - if (projectionList != null) { - projectionList.id(); - } - return projectionList; + if (projectionList != null) { + projectionList.id(); + } + return projectionList; } /** @@ -249,20 +257,19 @@ public ProjectionList max(String name) { * @return The PropertyProjection instance */ public ProjectionList avg(String name) { - if (projectionList != null) { - projectionList.avg(name); - } - return projectionList; + if (projectionList != null) { + projectionList.avg(name); + } + return projectionList; } @Override public Object invokeMethod(String name, Object obj) { - Object[] args = obj.getClass().isArray() ? (Object[])obj : new Object[]{obj}; + Object[] args = obj.getClass().isArray() ? (Object[]) obj : new Object[]{obj}; ensureQueryIsInitialized(); if (isCriteriaConstructionMethod(name, args)) { - uniqueResult = false; invokeClosureNode(args[0]); @@ -305,7 +312,7 @@ public Object invokeMethod(String name, Object obj) { } query = associationQuery; persistentEntity = association.getAssociatedEntity(); - logicalExpressionStack = new ArrayList(); + logicalExpressionStack = new ArrayList<>(); invokeClosureNode(args[0]); return query; } @@ -422,7 +429,7 @@ public Criteria eq(String propertyName, Object propertyValue) { public Criteria allEq(Map propertyValues) { Query.Conjunction conjunction = new Query.Conjunction(); for (String property : propertyValues.keySet()) { - conjunction.add( Restrictions.eq(property, propertyValues.get(property))); + conjunction.add(Restrictions.eq(property, propertyValues.get(property))); } addToCriteria(conjunction); return this; @@ -1053,12 +1060,12 @@ protected void validatePropertyName(String propertyName, String methodName) { } protected void ensureQueryIsInitialized() { - if(query == null) { - query = queryCreator.createQuery(targetClass); - } - if(queryMetaClass == null) { - queryMetaClass = GroovySystem.getMetaClassRegistry().getMetaClass(query.getClass()); - } + if (query == null) { + query = queryCreator.createQuery(targetClass); + } + if (queryMetaClass == null) { + queryMetaClass = GroovySystem.getMetaClassRegistry().getMetaClass(query.getClass()); + } } private boolean isCriteriaConstructionMethod(String name, Object[] args) { @@ -1069,7 +1076,7 @@ private boolean isCriteriaConstructionMethod(String name, Object[] args) { protected void invokeClosureNode(Object args) { if (args instanceof Closure) { - Closure callable = (Closure)args; + Closure callable = (Closure) args; callable.setDelegate(this); callable.setResolveStrategy(Closure.DELEGATE_FIRST); callable.call(); @@ -1083,7 +1090,7 @@ private void handleJunction(Query.Junction junction, Closure callable) { invokeClosureNode(callable); } } finally { - Query.Junction logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size()-1); + Query.Junction logicalExpression = logicalExpressionStack.remove(logicalExpressionStack.size() - 1); addToCriteria(logicalExpression); } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/AbstractDetachedCriteria.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/AbstractDetachedCriteria.groovy index 7fdb442884a..f04fd50c55d 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/AbstractDetachedCriteria.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/AbstractDetachedCriteria.groovy @@ -22,6 +22,10 @@ package org.grails.datastore.gorm.query.criteria import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.transform.TypeCheckingMode + +import jakarta.persistence.FetchType +import jakarta.persistence.criteria.JoinType + import org.grails.datastore.gorm.finders.DynamicFinder import org.grails.datastore.gorm.finders.FinderMethod import org.grails.datastore.mapping.core.connections.ConnectionSource @@ -35,9 +39,6 @@ import org.grails.datastore.mapping.query.api.Criteria import org.grails.datastore.mapping.query.api.ProjectionList import org.grails.datastore.mapping.query.api.QueryableCriteria -import jakarta.persistence.FetchType -import jakarta.persistence.criteria.JoinType - /** * Abstract super class for DetachedCriteria implementations * @@ -60,14 +61,12 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { protected Map fetchStrategies = [:] protected Map joinTypes = [:] protected Closure lazyQuery - protected String alias; + protected String alias protected String connectionName = ConnectionSource.DEFAULT protected Map associationCriteriaMap = [:] - ProjectionList projectionList = new DetachedProjections(projections) - /** * Constructs a DetachedCriteria instance target the given class and alias for the name * @param targetClass The target class @@ -82,14 +81,14 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @return Obtain the fetch strategies for each property */ Map getFetchStrategies() { - return Collections.unmodifiableMap( fetchStrategies ) + return Collections.unmodifiableMap(fetchStrategies) } /** * @return Obtain the join types */ Map getJoinTypes() { - return Collections.unmodifiableMap( joinTypes ) + return Collections.unmodifiableMap(joinTypes) } /** * @return The root alias to be used for the query @@ -118,16 +117,16 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { Criteria createAlias(String associationPath, String alias) { initialiseIfNecessary(targetClass) PersistentProperty prop - if(associationPath.contains('.')) { + if (associationPath.contains('.')) { def tokens = associationPath.split(/\./) def entity = this.persistentEntity - for(t in tokens) { + for (t in tokens) { prop = entity.getPropertyByName(t) if (!(prop instanceof Association)) { throw new IllegalArgumentException("Argument [$associationPath] is not an association") } else { - entity = ((Association)prop).associatedEntity + entity = ((Association) prop).associatedEntity } } } @@ -138,12 +137,12 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { throw new IllegalArgumentException("Argument [$associationPath] is not an association") } - Association a = (Association)prop + Association a = (Association) prop DetachedAssociationCriteria associationCriteria = associationCriteriaMap[associationPath] - if(associationCriteria == null) { + if (associationCriteria == null) { associationCriteria = new DetachedAssociationCriteria(a.associatedEntity.javaClass, a, associationPath, alias) associationCriteriaMap[associationPath] = associationCriteria - add associationCriteria + add(associationCriteria) } else { associationCriteria.setAlias(alias) @@ -162,7 +161,6 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { return this } - /** * Specifies whether a join query should be used (if join queries are supported by the underlying datastore) * @@ -188,7 +186,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { } T getPersistentClass() { - (T)getPersistentEntity().getJavaClass() + (T) getPersistentEntity().getJavaClass() } PersistentEntity getPersistentEntity() { @@ -214,11 +212,11 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { applyLazyCriteria() if (criterion instanceof Query.PropertyCriterion) { if (criterion.value instanceof Closure) { - criterion.value = buildQueryableCriteria((Closure)criterion.value) + criterion.value = buildQueryableCriteria((Closure) criterion.value) } } if (junctions) { - junctions[-1].add criterion + junctions[-1].add(criterion) } else { criteria << criterion @@ -292,18 +290,18 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { @Override Criteria inList(String propertyName, QueryableCriteria subquery) { - add Restrictions.in(propertyName, subquery) + add(Restrictions.in(propertyName, subquery)) return this } @Override - Criteria "in"(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure subquery) { - inList propertyName, buildQueryableCriteria(subquery) + Criteria 'in'(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure subquery) { + inList(propertyName, buildQueryableCriteria(subquery)) } @Override Criteria inList(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure subquery) { - inList propertyName, buildQueryableCriteria(subquery) + inList(propertyName, buildQueryableCriteria(subquery)) } /** @@ -315,13 +313,13 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { @Override Criteria notIn(String propertyName, QueryableCriteria subquery) { - add Restrictions.notIn(propertyName, subquery) + add(Restrictions.notIn(propertyName, subquery)) return this } @Override Criteria notIn(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure subquery) { - notIn propertyName, buildQueryableCriteria(subquery) + notIn(propertyName, buildQueryableCriteria(subquery)) } /** @@ -350,25 +348,25 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria inList(String propertyName, Collection values) { - add Restrictions.in(propertyName, convertArgumentList(values)) + add(Restrictions.in(propertyName, convertArgumentList(values))) return this } protected List convertArgumentList(Collection argList) { - List convertedList = new ArrayList(argList.size()); + List convertedList = new ArrayList(argList.size()) for (Object item : argList) { - if(item instanceof CharSequence) { - item = item.toString(); + if (item instanceof CharSequence) { + item = item.toString() } - convertedList.add(item); + convertedList.add(item) } - return convertedList; + return convertedList } /** * @see Criteria */ Criteria inList(String propertyName, Object[] values) { - add Restrictions.in(propertyName, convertArgumentList(Arrays.asList(values))) + add(Restrictions.in(propertyName, convertArgumentList(Arrays.asList(values)))) return this } @@ -376,7 +374,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria sizeEq(String propertyName, int size) { - add Restrictions.sizeEq(propertyName, size) + add(Restrictions.sizeEq(propertyName, size)) return this } @@ -384,7 +382,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria sizeGt(String propertyName, int size) { - add Restrictions.sizeGt(propertyName, size) + add(Restrictions.sizeGt(propertyName, size)) return this } @@ -392,7 +390,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria sizeGe(String propertyName, int size) { - add Restrictions.sizeGe(propertyName, size) + add(Restrictions.sizeGe(propertyName, size)) return this } @@ -400,7 +398,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria sizeLe(String propertyName, int size) { - add Restrictions.sizeLe(propertyName, size) + add(Restrictions.sizeLe(propertyName, size)) return this } @@ -408,7 +406,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria sizeLt(String propertyName, int size) { - add Restrictions.sizeLt(propertyName, size) + add(Restrictions.sizeLt(propertyName, size)) return this } @@ -416,7 +414,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria sizeNe(String propertyName, int size) { - add Restrictions.sizeNe(propertyName, size) + add(Restrictions.sizeNe(propertyName, size)) return this } @@ -424,7 +422,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria eqProperty(String propertyName, String otherPropertyName) { - add Restrictions.eqProperty(propertyName,otherPropertyName) + add(Restrictions.eqProperty(propertyName, otherPropertyName)) return this } @@ -432,7 +430,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria#neProperty(java.lang.String, java.lang.String) */ Criteria neProperty(String propertyName, String otherPropertyName) { - add Restrictions.neProperty(propertyName,otherPropertyName) + add(Restrictions.neProperty(propertyName, otherPropertyName)) return this } @@ -443,9 +441,9 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { Criteria allEq(Map propertyValues) { Query.Conjunction conjunction = new Query.Conjunction() for (property in propertyValues.keySet()) { - conjunction.add Restrictions.eq(property, propertyValues.get(property)) + conjunction.add(Restrictions.eq(property, propertyValues.get(property))) } - add conjunction + add(conjunction) return this } @@ -453,7 +451,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria gtProperty(String propertyName, String otherPropertyName) { - add Restrictions.gtProperty(propertyName,otherPropertyName) + add(Restrictions.gtProperty(propertyName, otherPropertyName)) return this } @@ -461,7 +459,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria geProperty(String propertyName, String otherPropertyName) { - add Restrictions.geProperty(propertyName,otherPropertyName) + add(Restrictions.geProperty(propertyName, otherPropertyName)) return this } @@ -469,7 +467,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria ltProperty(String propertyName, String otherPropertyName) { - add Restrictions.ltProperty(propertyName,otherPropertyName) + add(Restrictions.ltProperty(propertyName, otherPropertyName)) return this } @@ -477,7 +475,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria leProperty(String propertyName, String otherPropertyName) { - add Restrictions.leProperty(propertyName,otherPropertyName) + add(Restrictions.leProperty(propertyName, otherPropertyName)) return this } @@ -485,7 +483,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria idEquals(Object value) { - add Restrictions.idEq(value) + add(Restrictions.idEq(value)) return this } @@ -494,8 +492,8 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { */ @Override Criteria exists(QueryableCriteria subquery) { - add new Query.Exists(subquery); - return this; + add(new Query.Exists(subquery)) + return this } /** @@ -503,15 +501,15 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { */ @Override Criteria notExists(QueryableCriteria subquery) { - add new Query.NotExists(subquery); - return this; + add(new Query.NotExists(subquery)) + return this } /** * @see Criteria */ Criteria isEmpty(String propertyName) { - add Restrictions.isEmpty(propertyName) + add(Restrictions.isEmpty(propertyName)) return this } @@ -519,7 +517,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria isNotEmpty(String propertyName) { - add Restrictions.isNotEmpty(propertyName) + add(Restrictions.isNotEmpty(propertyName)) return this } @@ -527,7 +525,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria isNull(String propertyName) { - add Restrictions.isNull(propertyName) + add(Restrictions.isNull(propertyName)) return this } @@ -535,7 +533,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria isNotNull(String propertyName) { - add Restrictions.isNotNull(propertyName) + add(Restrictions.isNotNull(propertyName)) return this } @@ -543,7 +541,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria eq(String propertyName, Object propertyValue) { - add Restrictions.eq(propertyName,propertyValue) + add(Restrictions.eq(propertyName, propertyValue)) return this } @@ -551,7 +549,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria idEq(Object propertyValue) { - add Restrictions.idEq(propertyValue) + add(Restrictions.idEq(propertyValue)) return this } @@ -559,7 +557,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria ne(String propertyName, Object propertyValue) { - add Restrictions.ne(propertyName,propertyValue) + add(Restrictions.ne(propertyName, propertyValue)) return this } @@ -567,7 +565,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria between(String propertyName, Object start, Object finish) { - add Restrictions.between(propertyName, start, finish) + add(Restrictions.between(propertyName, start, finish)) return this } @@ -575,7 +573,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria gte(String property, Object value) { - add Restrictions.gte(property,value) + add(Restrictions.gte(property, value)) return this } @@ -590,7 +588,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria gt(String property, Object value) { - add Restrictions.gt(property,value) + add(Restrictions.gt(property, value)) return this } @@ -598,7 +596,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria lte(String property, Object value) { - add Restrictions.lte(property, value) + add(Restrictions.lte(property, value)) return this } @@ -606,14 +604,14 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria le(String property, Object value) { - lte(property,value) + lte(property, value) } /** * @see Criteria */ Criteria lt(String property, Object value) { - add Restrictions.lt(property,value) + add(Restrictions.lt(property, value)) return this } @@ -621,7 +619,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria like(String propertyName, Object propertyValue) { - add Restrictions.like(propertyName,propertyValue.toString()) + add(Restrictions.like(propertyName, propertyValue.toString())) return this } @@ -629,7 +627,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria ilike(String propertyName, Object propertyValue) { - add Restrictions.ilike(propertyName, propertyValue.toString()) + add(Restrictions.ilike(propertyName, propertyValue.toString())) return this } @@ -637,7 +635,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { * @see Criteria */ Criteria rlike(String propertyName, Object propertyValue) { - add Restrictions.rlike(propertyName, propertyValue.toString()) + add(Restrictions.rlike(propertyName, propertyValue.toString())) return this } @@ -663,75 +661,75 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { @Override Criteria eqAll(String propertyName, QueryableCriteria propertyValue) { - add new Query.EqualsAll(propertyName, propertyValue) + add(new Query.EqualsAll(propertyName, propertyValue)) return this } @Override Criteria gtAll(String propertyName, QueryableCriteria propertyValue) { - add new Query.GreaterThanAll(propertyName, propertyValue) + add(new Query.GreaterThanAll(propertyName, propertyValue)) return this } @Override Criteria gtSome(String propertyName, QueryableCriteria propertyValue) { - add new Query.GreaterThanSome(propertyName, propertyValue) + add(new Query.GreaterThanSome(propertyName, propertyValue)) return this } @Override Criteria gtSome(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - gtSome propertyName, buildQueryableCriteria(propertyValue) + gtSome(propertyName, buildQueryableCriteria(propertyValue)) } @Override Criteria geSome(String propertyName, QueryableCriteria propertyValue) { - add new Query.GreaterThanEqualsSome(propertyName, propertyValue) + add(new Query.GreaterThanEqualsSome(propertyName, propertyValue)) return this } @Override Criteria geSome(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - geSome propertyName, buildQueryableCriteria(propertyValue) + geSome(propertyName, buildQueryableCriteria(propertyValue)) } @Override Criteria ltSome(String propertyName, QueryableCriteria propertyValue) { - add new Query.LessThanSome(propertyName, propertyValue) + add(new Query.LessThanSome(propertyName, propertyValue)) return this } @Override Criteria ltSome(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - ltSome propertyName, buildQueryableCriteria(propertyValue) + ltSome(propertyName, buildQueryableCriteria(propertyValue)) } @Override Criteria leSome(String propertyName, QueryableCriteria propertyValue) { - add new Query.LessThanEqualsSome(propertyName, propertyValue) + add(new Query.LessThanEqualsSome(propertyName, propertyValue)) return this } @Override Criteria leSome(String propertyName, @DelegatesTo(AbstractDetachedCriteria) Closure propertyValue) { - leSome propertyName, buildQueryableCriteria(propertyValue) + leSome(propertyName, buildQueryableCriteria(propertyValue)) } @Override Criteria ltAll(String propertyName, QueryableCriteria propertyValue) { - add new Query.LessThanAll(propertyName, propertyValue) + add(new Query.LessThanAll(propertyName, propertyValue)) return this } @Override Criteria geAll(String propertyName, QueryableCriteria propertyValue) { - add new Query.GreaterThanEqualsAll(propertyName, propertyValue) + add(new Query.GreaterThanEqualsAll(propertyName, propertyValue)) return this } @Override Criteria leAll(String propertyName, QueryableCriteria propertyValue) { - add new Query.LessThanEqualsAll(propertyName, propertyValue) + add(new Query.LessThanEqualsAll(propertyName, propertyValue)) return this } @@ -827,7 +825,6 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { return newQuery.build(additionalQuery) } - /** * Enable the builder syntax for constructing Criteria * @@ -856,7 +853,6 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { return newCriteria } - /** * Create a return a new DetachedCriteria that uses the given connection * @@ -935,7 +931,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { */ AbstractDetachedCriteria sort(String property, String direction) { AbstractDetachedCriteria newCriteria = this.clone() - newCriteria.orders.add(new Query.Order(property, "desc".equalsIgnoreCase(direction) ? Query.Order.Direction.DESC : Query.Order.Direction.ASC)) + newCriteria.orders.add(new Query.Order(property, 'desc'.equalsIgnoreCase(direction) ? Query.Order.Direction.DESC : Query.Order.Direction.ASC)) return newCriteria } @@ -1011,7 +1007,6 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { return newCriteria } - def propertyMissing(String name) { final entity = getPersistentEntity() final p = entity.getPropertyByName(name) @@ -1046,7 +1041,7 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { def method = dynamicFinders.find { FinderMethod f -> f.isMethodMatch(methodName) } if (method != null) { applyLazyCriteria() - return method.invoke(targetClass, methodName,this, args) + return method.invoke(targetClass, methodName, this, args) } if (!args) { @@ -1058,7 +1053,6 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { throw new MissingMethodException(methodName, AbstractDetachedCriteria, args) } - def alias = args[0] instanceof CharSequence ? args[0].toString() : null def existing = associationCriteriaMap[methodName] @@ -1067,18 +1061,16 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { : new DetachedAssociationCriteria(prop.associatedEntity.javaClass, prop) associationCriteriaMap[methodName] = associationCriteria - add associationCriteria - - + add(associationCriteria) def lastArg = args[-1] - if(lastArg instanceof Closure) { + if (lastArg instanceof Closure) { Closure callable = lastArg callable.resolveStrategy = Closure.DELEGATE_FIRST Closure parentCallable = callable - while(parentCallable.delegate instanceof Closure) { - parentCallable = (Closure)parentCallable.delegate + while (parentCallable.delegate instanceof Closure) { + parentCallable = (Closure) parentCallable.delegate } def previous = parentCallable.delegate @@ -1092,7 +1084,6 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { } } - protected void handleJunction(Closure callable) { try { callable.delegate = this @@ -1100,13 +1091,12 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { } finally { def lastJunction = junctions.remove(junctions.size() - 1) - add lastJunction + add(lastJunction) } } protected abstract QueryableCriteria buildQueryableCriteria(Closure queryClosure) - protected void applyLazyCriteria() { if (lazyQuery == null) { return @@ -1114,17 +1104,17 @@ abstract class AbstractDetachedCriteria implements Criteria, Cloneable { def criteria = lazyQuery lazyQuery = null - this.with criteria + this.with(criteria) } @Override - public Criteria cache(boolean shouldCache) { + Criteria cache(boolean shouldCache) { // no-op for now this } @Override - public Criteria readOnly(boolean readOnly) { + Criteria readOnly(boolean readOnly) { // no-op for now this } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/DetachedAssociationCriteria.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/DetachedAssociationCriteria.groovy index 623508d45ba..5f22629cef2 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/DetachedAssociationCriteria.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/criteria/DetachedAssociationCriteria.groovy @@ -20,7 +20,6 @@ package org.grails.datastore.gorm.query.criteria import grails.gorm.DetachedCriteria - import org.grails.datastore.mapping.model.types.Association import org.grails.datastore.mapping.query.Query.Criterion import org.grails.datastore.mapping.query.api.AssociationCriteria diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/ApplyDetachedCriteriaTransform.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/ApplyDetachedCriteriaTransform.java index 7e4537c5103..3031d553e40 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/ApplyDetachedCriteriaTransform.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/ApplyDetachedCriteriaTransform.java @@ -19,18 +19,18 @@ package org.grails.datastore.gorm.query.transform; -import org.codehaus.groovy.transform.GroovyASTTransformationClass; - import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; +import org.codehaus.groovy.transform.GroovyASTTransformationClass; + /** * Used only for testing */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE}) @GroovyASTTransformationClass("org.grails.datastore.gorm.query.transform.DetachedCriteriaASTTransformation") -public @interface ApplyDetachedCriteriaTransform { +public @interface ApplyDetachedCriteriaTransform { } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/DetachedCriteriaASTTransformation.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/DetachedCriteriaASTTransformation.java index 5ff73e536b7..d21ced092af 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/DetachedCriteriaASTTransformation.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/DetachedCriteriaASTTransformation.java @@ -18,7 +18,6 @@ */ package org.grails.datastore.gorm.query.transform; -import org.apache.grails.common.compiler.GroovyTransformOrder; import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.AnnotatedNode; import org.codehaus.groovy.ast.ClassNode; @@ -28,10 +27,12 @@ import org.codehaus.groovy.transform.GroovyASTTransformation; import org.codehaus.groovy.transform.TransformWithPriority; +import org.apache.grails.common.compiler.GroovyTransformOrder; + /** * Transforms regular Groovy-style finders into detached criteria */ -@GroovyASTTransformation(phase= CompilePhase.CANONICALIZATION) +@GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) public class DetachedCriteriaASTTransformation implements ASTTransformation, TransformWithPriority { /** diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.java index 4f21cfa00ed..4a924ed982c 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/DetachedCriteriaTransformer.java @@ -18,23 +18,67 @@ */ package org.grails.datastore.gorm.query.transform; -import grails.gorm.DetachedCriteria; -import org.codehaus.groovy.ast.*; -import org.codehaus.groovy.ast.expr.*; -import org.codehaus.groovy.ast.stmt.*; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.ClassCodeVisitorSupport; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.GenericsType; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.Variable; +import org.codehaus.groovy.ast.VariableScope; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.BinaryExpression; +import org.codehaus.groovy.ast.expr.BitwiseNegationExpression; +import org.codehaus.groovy.ast.expr.CastExpression; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ClosureExpression; +import org.codehaus.groovy.ast.expr.ConstantExpression; +import org.codehaus.groovy.ast.expr.ConstructorCallExpression; +import org.codehaus.groovy.ast.expr.DeclarationExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.GStringExpression; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.NotExpression; +import org.codehaus.groovy.ast.expr.PropertyExpression; +import org.codehaus.groovy.ast.expr.RangeExpression; +import org.codehaus.groovy.ast.expr.StaticMethodCallExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; +import org.codehaus.groovy.ast.stmt.BlockStatement; +import org.codehaus.groovy.ast.stmt.CaseStatement; +import org.codehaus.groovy.ast.stmt.CatchStatement; +import org.codehaus.groovy.ast.stmt.ExpressionStatement; +import org.codehaus.groovy.ast.stmt.ForStatement; +import org.codehaus.groovy.ast.stmt.IfStatement; +import org.codehaus.groovy.ast.stmt.ReturnStatement; +import org.codehaus.groovy.ast.stmt.Statement; +import org.codehaus.groovy.ast.stmt.SwitchStatement; +import org.codehaus.groovy.ast.stmt.TryCatchStatement; +import org.codehaus.groovy.ast.stmt.WhileStatement; import org.codehaus.groovy.control.SourceUnit; import org.codehaus.groovy.control.messages.LocatedMessage; import org.codehaus.groovy.syntax.Token; import org.codehaus.groovy.transform.trait.Traits; + +import grails.gorm.DetachedCriteria; import org.grails.datastore.gorm.transform.AstPropertyResolveUtils; import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.criteria.FunctionCallingCriterion; import org.grails.datastore.mapping.reflect.AstUtils; -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.*; - /** * ClassCodeVisitorSupport that transforms where methods into detached criteria queries * @@ -73,7 +117,6 @@ public class DetachedCriteriaTransformer extends ClassCodeVisitorSupport { "=~", "ilike", "in", "inList"); - private static final Map METHOD_TO_SUBQUERY_MAP = (Map) newMap( "eq", "eqAll", "gt", "gtAll", @@ -116,10 +159,10 @@ public class DetachedCriteriaTransformer extends ClassCodeVisitorSupport { "property", "property", "count", "countDistinct"); - protected Map detachedCriteriaVariables = new HashMap(); - protected Map aliases = new HashMap(); - protected Map staticDetachedCriteriaVariables = new HashMap(); - protected Set aliasExpressions = new HashSet(); + protected Map detachedCriteriaVariables = new HashMap<>(); + protected Map aliases = new HashMap<>(); + protected Map staticDetachedCriteriaVariables = new HashMap<>(); + protected Set aliasExpressions = new HashSet<>(); protected ClassNode currentClassNode; public DetachedCriteriaTransformer(SourceUnit sourceUnit) { @@ -328,9 +371,9 @@ public void visitMethodCallExpression(MethodCallExpression call) { } else { varType = var.getType(); - if(varType != null && varType.getName().equals(DETACHED_CRITERIA_CLASS_NODE.getName()) && isCandidateWhereMethod(method, arguments)) { + if (varType != null && varType.getName().equals(DETACHED_CRITERIA_CLASS_NODE.getName()) && isCandidateWhereMethod(method, arguments)) { GenericsType[] genericsTypes = varType.getGenericsTypes(); - if(genericsTypes != null && genericsTypes.length == 1) { + if (genericsTypes != null && genericsTypes.length == 1) { this.currentClassNode = genericsTypes[0].getType(); visitMethodCallOnDetachedCriteria(this.currentClassNode, (ArgumentListExpression) arguments); } @@ -346,23 +389,23 @@ public void visitMethodCallExpression(MethodCallExpression call) { visitMethodCall(classNode, arguments); } } - } else if(objectExpression instanceof MethodCallExpression) { - MethodCallExpression mce = (MethodCallExpression)objectExpression; + } else if (objectExpression instanceof MethodCallExpression) { + MethodCallExpression mce = (MethodCallExpression) objectExpression; MethodNode methodTarget = mce.getMethodTarget(); String methodName = mce.getMethodAsString(); Expression targetObject = mce.getObjectExpression(); ClassNode targetType = null; - if(targetObject instanceof ClassExpression) { - targetType = ((ClassExpression)targetObject).getType(); + if (targetObject instanceof ClassExpression) { + targetType = ((ClassExpression) targetObject).getType(); } - else if(targetObject instanceof VariableExpression) { - targetType = ((VariableExpression)targetObject).getType(); + else if (targetObject instanceof VariableExpression) { + targetType = ((VariableExpression) targetObject).getType(); } - if(targetType != null && AstUtils.isDomainClass(targetType) && isCandidateWhereMethod(method, arguments)) { + if (targetType != null && AstUtils.isDomainClass(targetType) && isCandidateWhereMethod(method, arguments)) { List methods = targetType.getMethods(methodName); for (MethodNode methodNode : methods) { - if(methodNode.getReturnType().equals(DETACHED_CRITERIA_CLASS_NODE)) { + if (methodNode.getReturnType().equals(DETACHED_CRITERIA_CLASS_NODE)) { visitMethodCall(targetType, arguments); } } @@ -406,12 +449,14 @@ private boolean isObjectExpressionWhereCall(Expression objectExpression) { MethodCallExpression mce = (MethodCallExpression) objectExpression; return isCandidateWhereMethod(mce.getMethodAsString(), mce.getArguments()); } -/* else if(objectExpression instanceof VariableExpression) { + /* + else if(objectExpression instanceof VariableExpression) { VariableExpression ve = (VariableExpression) objectExpression; if(ve.getName().equals(THIS_EXPRESSION.getName()) && isDomainClass(this.currentClassNode)) { return true; } - }*/ + } + */ return false; } @@ -480,7 +525,7 @@ public void visitStaticMethodCallExpression(StaticMethodCallExpression call) { } public void transformClosureExpression(ClassNode classNode, ClosureExpression closureExpression) { - if (closureExpression.getNodeMetaData(TRANSFORMED_MARKER) != null) return; + if (closureExpression.getNodeMetaData(TRANSFORMED_MARKER) != null) return; ClassNode previousClassNode = this.currentClassNode; try { this.currentClassNode = classNode; @@ -505,7 +550,6 @@ public void transformClosureExpression(ClassNode classNode, ClosureExpression cl } } - private void addBlockStatementToNewQuery(BlockStatement blockStatement, BlockStatement newCode, boolean addAll, List propertyNames, VariableScope variableScope) { List statements = blockStatement.getStatements(); for (Statement statement : statements) { @@ -521,12 +565,12 @@ private void addStatementToNewQuery(Statement statement, BlockStatement newCode, Expression expression = es.getExpression(); if (expression instanceof DeclarationExpression) { - DeclarationExpression de = (DeclarationExpression)expression; + DeclarationExpression de = (DeclarationExpression) expression; Expression leftExpression = de.getLeftExpression(); Expression rightExpression = de.getRightExpression(); - if((leftExpression instanceof VariableExpression) && (rightExpression instanceof ClassExpression)) { + if ((leftExpression instanceof VariableExpression) && (rightExpression instanceof ClassExpression)) { ClassExpression classExpression = (ClassExpression) rightExpression; - if(currentClassNode.equals(classExpression.getType())) { + if (currentClassNode.equals(classExpression.getType())) { ArgumentListExpression arguments = new ArgumentListExpression(); String aliasName = leftExpression.getText(); aliases.put(aliasName, currentClassNode); @@ -536,9 +580,9 @@ private void addStatementToNewQuery(Statement statement, BlockStatement newCode, } newCode.addStatement(es); } - else if((leftExpression instanceof VariableExpression) && (rightExpression instanceof VariableExpression)) { + else if ((leftExpression instanceof VariableExpression) && (rightExpression instanceof VariableExpression)) { String referencedProperty = rightExpression.getText(); - if(propertyNames.contains(referencedProperty)) { + if (propertyNames.contains(referencedProperty)) { ArgumentListExpression arguments = new ArgumentListExpression(); arguments.addExpression(new ConstantExpression(referencedProperty)); String aliasName = leftExpression.getText(); @@ -631,7 +675,7 @@ else if((leftExpression instanceof VariableExpression) && (rightExpression insta newCode.addStatement(tcs); } else if (statement instanceof ReturnStatement) { ReturnStatement rs = (ReturnStatement) statement; - addStatementToNewQuery(new ExpressionStatement(rs.getExpression()), newCode, addAll, propertyNames,variableScope); + addStatementToNewQuery(new ExpressionStatement(rs.getExpression()), newCode, addAll, propertyNames, variableScope); } else { @@ -699,9 +743,11 @@ private void handleAssociationMethodCallExpression(BlockStatement newCode, Metho else { newCode.addStatement(new ExpressionStatement(methodCall)); } -// else { -// sourceUnit.getErrorCollector().addError(new LocatedMessage("Method call ["+methodName+"] is invalid. Only binary expressions are allowed in queries.", Token.newString(methodName,methodCall.getLineNumber(), methodCall.getColumnNumber()), sourceUnit)); -// } + /* + else { + sourceUnit.getErrorCollector().addError(new LocatedMessage("Method call ["+methodName+"] is invalid. Only binary expressions are allowed in queries.", Token.newString(methodName,methodCall.getLineNumber(), methodCall.getColumnNumber()), sourceUnit)); + } + */ } private List getPropertyNamesForAssociation(ClassNode type) { @@ -734,7 +780,6 @@ private ClassNode getPropertyType(String prop) { return AstPropertyResolveUtils.getPropertyType(classNode, prop); } - private boolean isAssociationMethodCall(List propertyNames, String methodName, ArgumentListExpression arguments) { return propertyNames.contains(methodName) && hasClosureArgument(arguments); } @@ -877,7 +922,7 @@ private void handleFunctionCall(BlockStatement newCode, String operator, Express } private void handleBinaryExpressionSide(Expression expressionSide, Expression oppositeSide, String operator, BlockStatement newCode, boolean addAll, List propertyNames, VariableScope variableScope) { - if(aliasExpressions.contains(expressionSide)) return; + if (aliasExpressions.contains(expressionSide)) return; if (expressionSide instanceof BinaryExpression) { addBinaryExpressionToNewBody(propertyNames, newCode, (BinaryExpression) expressionSide, addAll, variableScope); } else if (expressionSide instanceof NotExpression) { @@ -897,7 +942,7 @@ private void handleAssociationQueryViaPropertyExpression(PropertyExpression pe, Expression objectExpression = pe.getObjectExpression(); if (objectExpression instanceof PropertyExpression) { // nested property expression, we have to find the root variable expression and walk backwards through all the properties involved - List associationMethodCalls = new ArrayList(); + List associationMethodCalls = new ArrayList<>(); while (objectExpression instanceof PropertyExpression) { PropertyExpression currentPe = (PropertyExpression) objectExpression; @@ -910,11 +955,10 @@ private void handleAssociationQueryViaPropertyExpression(PropertyExpression pe, String propertyName = ve.getName(); // handle trait - if(!(propertyName.equals("$self") && Traits.isTrait(objectExpression.getType()))) { + if (!(propertyName.equals("$self") && Traits.isTrait(objectExpression.getType()))) { associationMethodCalls.add(propertyName); } - Collections.reverse(associationMethodCalls); ClassNode currentType = currentClassNode; @@ -957,7 +1001,7 @@ private void handleAssociationQueryViaPropertyExpression(PropertyExpression pe, } else if (objectExpression instanceof VariableExpression) { String propertyName = objectExpression.getText(); // handle trait - if(propertyName.equals("$self") && Traits.isTrait(objectExpression.getType())) { + if (propertyName.equals("$self") && Traits.isTrait(objectExpression.getType())) { propertyName = pe.getPropertyAsString(); } Object aliased = aliases.get(propertyName); @@ -967,9 +1011,9 @@ private void handleAssociationQueryViaPropertyExpression(PropertyExpression pe, ClassNode classNode = currentClassNode; ClassNode type = getPropertyTypeFromGenerics(actualPropertyName, classNode); - if(!AstUtils.isDomainClass(type)) { + if (!AstUtils.isDomainClass(type)) { - if(AstUtils.isGroovyType(type)) { + if (AstUtils.isGroovyType(type)) { // an embedded property List associationPropertyNames = AstPropertyResolveUtils.getPropertyNames(type); boolean hasNoProperties = associationPropertyNames.isEmpty(); @@ -1027,11 +1071,11 @@ private void handleAssociationQueryViaPropertyExpression(PropertyExpression pe, } newCode.addStatement(new ExpressionStatement(new MethodCallExpression(new VariableExpression("delegate"), actualPropertyName, arguments))); } - } else if((aliased instanceof ClassNode) && (oppositeSide instanceof PropertyExpression)) { + } else if ((aliased instanceof ClassNode) && (oppositeSide instanceof PropertyExpression)) { String rootReference = pe.getText(); PropertyExpression oppositeProperty = (PropertyExpression) oppositeSide; String targetObject = oppositeProperty.getObjectExpression().getText(); - if(aliases.containsKey(targetObject)) { + if (aliases.containsKey(targetObject)) { String methodToCall = PROPERTY_COMPARISON_OPERATOR_TO_CRITERIA_METHOD_MAP.get(operator); ArgumentListExpression args = new ArgumentListExpression(); args.addExpression(new ConstantExpression(rootReference)); @@ -1045,7 +1089,6 @@ private void handleAssociationQueryViaPropertyExpression(PropertyExpression pe, } } - private ClassNode getPropertyTypeFromGenerics(String propertyName, ClassNode classNode) { ClassNode type = AstPropertyResolveUtils.getPropertyType(classNode, propertyName); if (type != null && !AstUtils.isDomainClass(type)) { @@ -1106,8 +1149,8 @@ private void addCriteriaCall(BlockStatement newCode, String operator, Expression } } } else if (aggregateFunctionName != null) { - if((methodTarget instanceof VariableExpression) && - ((VariableExpression)methodTarget).isThisExpression()) { + if ((methodTarget instanceof VariableExpression) && + ((VariableExpression) methodTarget).isThisExpression()) { Expression arguments = aggregateMethodCall.getArguments(); if (arguments instanceof ArgumentListExpression) { ArgumentListExpression argList = (ArgumentListExpression) arguments; @@ -1147,30 +1190,31 @@ private void addCriteriaCall(BlockStatement newCode, String operator, Expression Expression propertyNameExpression = existingArgs.getExpression(0); sourceUnit.getErrorCollector().addError(new LocatedMessage("Function call " + aggregateFunctionName + " not allowed on property \"" + propertyNameExpression.getText() + "\". Function calls can currently only be used on the left-hand side of expressions", Token.newString(propertyName, aggregateMethodCall.getLineNumber(), aggregateMethodCall.getColumnNumber()), sourceUnit)); return; -// -// ArgumentListExpression newArgs = new ArgumentListExpression(); -// ArgumentListExpression constructorArgs = new ArgumentListExpression(); -// constructorArgs.addExpression(new ConstantExpression(methodName)); -// ClassNode criterionClassNode = OPERATOR_TO_PROPERTY_CRITERION_METHOD_MAP.get(operator); -// if (criterionClassNode != null) { -// ArgumentListExpression criterionConstructorArguments = new ArgumentListExpression(); -// if (!(propertyNameExpression instanceof ConstantExpression)) { -// propertyNameExpression = new ConstantExpression(propertyNameExpression.getText()); -// } -// criterionConstructorArguments.addExpression(new ConstantExpression(propertyName)); -// criterionConstructorArguments.addExpression(propertyNameExpression); -// -// constructorArgs.addExpression(new ConstructorCallExpression(criterionClassNode, criterionConstructorArguments)); -// constructorArgs.addExpression(new ConstantExpression(true)); -// ConstructorCallExpression constructorCallExpression = new ConstructorCallExpression(FUNCTION_CALL_CRITERION, constructorArgs); -// newArgs.addExpression(constructorCallExpression ); -// -// newCode.addStatement(new ExpressionStatement(new MethodCallExpression(THIS_EXPRESSION, "add", newArgs))); -// } -// else { -// sourceUnit.getErrorCollector().addError(new LocatedMessage("Function call "+aggregateFunctionName+" not allowed on property \""+propertyNameExpression.getText()+"\".", Token.newString(propertyName,aggregateMethodCall.getLineNumber(), aggregateMethodCall.getColumnNumber()), sourceUnit)); -// } -// return; + /* + ArgumentListExpression newArgs = new ArgumentListExpression(); + ArgumentListExpression constructorArgs = new ArgumentListExpression(); + constructorArgs.addExpression(new ConstantExpression(methodName)); + ClassNode criterionClassNode = OPERATOR_TO_PROPERTY_CRITERION_METHOD_MAP.get(operator); + if (criterionClassNode != null) { + ArgumentListExpression criterionConstructorArguments = new ArgumentListExpression(); + if (!(propertyNameExpression instanceof ConstantExpression)) { + propertyNameExpression = new ConstantExpression(propertyNameExpression.getText()); + } + criterionConstructorArguments.addExpression(new ConstantExpression(propertyName)); + criterionConstructorArguments.addExpression(propertyNameExpression); + + constructorArgs.addExpression(new ConstructorCallExpression(criterionClassNode, criterionConstructorArguments)); + constructorArgs.addExpression(new ConstantExpression(true)); + ConstructorCallExpression constructorCallExpression = new ConstructorCallExpression(FUNCTION_CALL_CRITERION, constructorArgs); + newArgs.addExpression(constructorCallExpression ); + + newCode.addStatement(new ExpressionStatement(new MethodCallExpression(THIS_EXPRESSION, "add", newArgs))); + } + else { + sourceUnit.getErrorCollector().addError(new LocatedMessage("Function call "+aggregateFunctionName+" not allowed on property \""+propertyNameExpression.getText()+"\".", Token.newString(propertyName,aggregateMethodCall.getLineNumber(), aggregateMethodCall.getColumnNumber()), sourceUnit)); + } + return; + */ } } else { if ("like".equals(methodToCall) && rightExpression instanceof BitwiseNegationExpression) { @@ -1213,20 +1257,20 @@ private void addCriteriaCall(BlockStatement newCode, String operator, Expression arguments.addExpression(new ConstantExpression(propertyName)) .addExpression(rightExpression); } - } else if(rightExpression instanceof PropertyExpression) { + } else if (rightExpression instanceof PropertyExpression) { PropertyExpression pe = (PropertyExpression) rightExpression; String property = pe.getObjectExpression().getText(); - if((leftExpression instanceof PropertyExpression ) && aliases.containsKey(property)) { + if ((leftExpression instanceof PropertyExpression) && aliases.containsKey(property)) { aliasExpressions.add(pe); arguments = new ArgumentListExpression(); - arguments.addExpression(new ConstantExpression(((PropertyExpression)leftExpression).getPropertyAsString())); + arguments.addExpression(new ConstantExpression(((PropertyExpression) leftExpression).getPropertyAsString())); arguments.addExpression(new ConstantExpression(pe.getText())); methodToCall = PROPERTY_COMPARISON_OPERATOR_TO_CRITERIA_METHOD_MAP.get(operator); } - else if((leftExpression instanceof VariableExpression) && aliases.containsKey(property)) { + else if ((leftExpression instanceof VariableExpression) && aliases.containsKey(property)) { aliasExpressions.add(pe); arguments = new ArgumentListExpression(); - arguments.addExpression(new ConstantExpression(((VariableExpression)leftExpression).getName())); + arguments.addExpression(new ConstantExpression(((VariableExpression) leftExpression).getName())); arguments.addExpression(new ConstantExpression(pe.getText())); methodToCall = PROPERTY_COMPARISON_OPERATOR_TO_CRITERIA_METHOD_MAP.get(operator); } @@ -1301,7 +1345,7 @@ private static Map newMap(Object... keysAndValues) { throw new IllegalArgumentException("Must have an even number of keys and values"); } - Map map = new HashMap(); + Map map = new HashMap<>(); for (int i = 0; i < keysAndValues.length; i += 2) { map.put((K) keysAndValues[i], (V) keysAndValues[i + 1]); } @@ -1313,6 +1357,6 @@ private static Set newSet(T... values) { return Collections.emptySet(); } - return new HashSet(Arrays.asList(values)); + return new HashSet<>(Arrays.asList(values)); } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/GlobalDetachedCriteriaASTTransformation.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/GlobalDetachedCriteriaASTTransformation.java index da98de4e91e..e7dfab45078 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/GlobalDetachedCriteriaASTTransformation.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/query/transform/GlobalDetachedCriteriaASTTransformation.java @@ -18,7 +18,8 @@ */ package org.grails.datastore.gorm.query.transform; -import org.apache.grails.common.compiler.GroovyTransformOrder; +import java.util.List; + import org.codehaus.groovy.ast.ASTNode; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.ast.ModuleNode; @@ -28,7 +29,7 @@ import org.codehaus.groovy.transform.GroovyASTTransformation; import org.codehaus.groovy.transform.TransformWithPriority; -import java.util.List; +import org.apache.grails.common.compiler.GroovyTransformOrder; /** * Global version of the detached query transformer @@ -36,7 +37,7 @@ * @author Graeme Rocher * @since 1.0 */ -@GroovyASTTransformation(phase= CompilePhase.CANONICALIZATION) +@GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) public class GlobalDetachedCriteriaASTTransformation implements ASTTransformation, TransformWithPriority { /** * The method is invoked when an AST Transformation is active. For local transformations, it is invoked once diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/schemaless/DynamicAttributes.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/schemaless/DynamicAttributes.groovy index 39188919278..6a808ce89e8 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/schemaless/DynamicAttributes.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/schemaless/DynamicAttributes.groovy @@ -20,6 +20,7 @@ package org.grails.datastore.gorm.schemaless import groovy.transform.CompileStatic + import org.grails.datastore.mapping.dirty.checking.DirtyCheckable /** @@ -35,9 +36,9 @@ trait DynamicAttributes { private void putAtDynamic(String name, value) { def oldValue = dynamicAttributes.put(name, value) - if(oldValue != value) { - if(this instanceof DirtyCheckable) { - ((DirtyCheckable)this).markDirty(name, value, oldValue) + if (oldValue != value) { + if (this instanceof DirtyCheckable) { + ((DirtyCheckable) this).markDirty(name, value, oldValue) } } } @@ -49,9 +50,9 @@ trait DynamicAttributes { * @param value The value of the attribute */ void putAt(String name, value) { - if(this.hasProperty(name)) { + if (this.hasProperty(name)) { try { - ((GroovyObject)this).setProperty(name, value) + ((GroovyObject) this).setProperty(name, value) } catch (ReadOnlyPropertyException e) { putAtDynamic(name, value) } @@ -67,8 +68,8 @@ trait DynamicAttributes { * @return The value of the attribute */ def getAt(String name) { - if(this.hasProperty(name)) { - return ((GroovyObject)this).getProperty(name) + if (this.hasProperty(name)) { + return ((GroovyObject) this).getProperty(name) } else { dynamicAttributes.get(name) @@ -91,9 +92,9 @@ trait DynamicAttributes { * @return The dynamic attributes */ Map attributes(Map newAttributes) { - if(newAttributes != null) { + if (newAttributes != null) { this.dynamicAttributes.putAll(newAttributes) } return dynamicAttributes } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/DefaultTenantService.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/DefaultTenantService.groovy index d6123940cd7..c4700fe11d1 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/DefaultTenantService.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/DefaultTenantService.groovy @@ -18,10 +18,10 @@ */ package org.grails.datastore.gorm.services +import groovy.transform.CompileStatic + import grails.gorm.multitenancy.TenantService import grails.gorm.multitenancy.Tenants -import groovy.transform.CompileStatic -import org.grails.datastore.mapping.core.connections.ConnectionSource import org.grails.datastore.mapping.model.DatastoreConfigurationException import org.grails.datastore.mapping.multitenancy.MultiTenancySettings import org.grails.datastore.mapping.multitenancy.MultiTenantCapableDatastore @@ -46,7 +46,7 @@ class DefaultTenantService implements Service, TenantService { Serializable currentId() { MultiTenantCapableDatastore multiTenantCapableDatastore = multiTenantDatastore() def mode = multiTenantCapableDatastore.getMultiTenancyMode() - if(mode != MultiTenancySettings.MultiTenancyMode.NONE) { + if (mode != MultiTenancySettings.MultiTenancyMode.NONE) { return Tenants.currentId(multiTenantCapableDatastore) } else { @@ -58,7 +58,7 @@ class DefaultTenantService implements Service, TenantService { def T withoutId(Closure callable) { MultiTenantCapableDatastore multiTenantCapableDatastore = multiTenantDatastore() def mode = multiTenantCapableDatastore.getMultiTenancyMode() - if(mode != MultiTenancySettings.MultiTenancyMode.NONE) { + if (mode != MultiTenancySettings.MultiTenancyMode.NONE) { return Tenants.withoutId(multiTenantCapableDatastore, callable) } else { @@ -70,7 +70,7 @@ class DefaultTenantService implements Service, TenantService { def T withCurrent(Closure callable) { MultiTenantCapableDatastore multiTenantCapableDatastore = multiTenantDatastore() def mode = multiTenantCapableDatastore.getMultiTenancyMode() - if(mode != MultiTenancySettings.MultiTenancyMode.NONE) { + if (mode != MultiTenancySettings.MultiTenancyMode.NONE) { return Tenants.withId(multiTenantCapableDatastore, currentId(), callable) } else { @@ -82,7 +82,7 @@ class DefaultTenantService implements Service, TenantService { def T withId(Serializable tenantId, Closure callable) { MultiTenantCapableDatastore multiTenantCapableDatastore = multiTenantDatastore() def mode = multiTenantCapableDatastore.getMultiTenancyMode() - if(mode != MultiTenancySettings.MultiTenancyMode.NONE) { + if (mode != MultiTenancySettings.MultiTenancyMode.NONE) { return Tenants.withId(multiTenantCapableDatastore, tenantId, callable) } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/DefaultTransactionService.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/DefaultTransactionService.groovy index c90809c62c8..27d9a4dce50 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/DefaultTransactionService.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/DefaultTransactionService.groovy @@ -18,19 +18,21 @@ */ package org.grails.datastore.gorm.services -import grails.gorm.transactions.TransactionService -import grails.gorm.transactions.GrailsTransactionTemplate import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.transform.stc.ClosureParams import groovy.transform.stc.SimpleType -import org.grails.datastore.mapping.services.Service -import org.grails.datastore.mapping.transactions.CustomizableRollbackTransactionAttribute -import org.grails.datastore.mapping.transactions.TransactionCapableDatastore + import org.springframework.transaction.PlatformTransactionManager import org.springframework.transaction.TransactionDefinition import org.springframework.transaction.TransactionSystemException +import grails.gorm.transactions.GrailsTransactionTemplate +import grails.gorm.transactions.TransactionService +import org.grails.datastore.mapping.services.Service +import org.grails.datastore.mapping.transactions.CustomizableRollbackTransactionAttribute +import org.grails.datastore.mapping.transactions.TransactionCapableDatastore + /** * The transaction service implementation * @@ -39,11 +41,12 @@ import org.springframework.transaction.TransactionSystemException */ @CompileStatic class DefaultTransactionService implements TransactionService, Service { + @Override def T withTransaction( - @ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure callable) { - if(datastore instanceof TransactionCapableDatastore) { - GrailsTransactionTemplate template = new GrailsTransactionTemplate(((TransactionCapableDatastore)datastore).transactionManager) + @ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure callable) { + if (datastore instanceof TransactionCapableDatastore) { + GrailsTransactionTemplate template = new GrailsTransactionTemplate(((TransactionCapableDatastore) datastore).transactionManager) return template.execute(callable) } else { @@ -53,9 +56,9 @@ class DefaultTransactionService implements TransactionService, Service { @Override def T withRollback( - @ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure callable) { - if(datastore instanceof TransactionCapableDatastore) { - GrailsTransactionTemplate template = new GrailsTransactionTemplate(((TransactionCapableDatastore)datastore).transactionManager) + @ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure callable) { + if (datastore instanceof TransactionCapableDatastore) { + GrailsTransactionTemplate template = new GrailsTransactionTemplate(((TransactionCapableDatastore) datastore).transactionManager) return template.executeAndRollback(callable) } else { @@ -65,8 +68,8 @@ class DefaultTransactionService implements TransactionService, Service { @Override def T withNewTransaction( - @ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure callable) { - if(datastore instanceof TransactionCapableDatastore) { + @ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure callable) { + if (datastore instanceof TransactionCapableDatastore) { PlatformTransactionManager transactionManager = ((TransactionCapableDatastore) datastore).transactionManager def txDef = new CustomizableRollbackTransactionAttribute(propagationBehavior: TransactionDefinition.PROPAGATION_REQUIRES_NEW) GrailsTransactionTemplate template = new GrailsTransactionTemplate(transactionManager, txDef) @@ -79,8 +82,8 @@ class DefaultTransactionService implements TransactionService, Service { @Override def T withTransaction(TransactionDefinition definition, - @ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure callable) { - if(datastore instanceof TransactionCapableDatastore) { + @ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure callable) { + if (datastore instanceof TransactionCapableDatastore) { PlatformTransactionManager transactionManager = ((TransactionCapableDatastore) datastore).transactionManager GrailsTransactionTemplate template = new GrailsTransactionTemplate(transactionManager, definition) return template.execute(callable) @@ -92,8 +95,8 @@ class DefaultTransactionService implements TransactionService, Service { @Override def T withTransaction(Map definition, - @ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure callable) { - if(datastore instanceof TransactionCapableDatastore) { + @ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure callable) { + if (datastore instanceof TransactionCapableDatastore) { PlatformTransactionManager transactionManager = ((TransactionCapableDatastore) datastore).transactionManager def txDef = newDefinition(definition) GrailsTransactionTemplate template = new GrailsTransactionTemplate(transactionManager, txDef) @@ -111,8 +114,8 @@ class DefaultTransactionService implements TransactionService, Service { @Override def T withRollback(TransactionDefinition definition, - @ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure callable) { - if(datastore instanceof TransactionCapableDatastore) { + @ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure callable) { + if (datastore instanceof TransactionCapableDatastore) { PlatformTransactionManager transactionManager = ((TransactionCapableDatastore) datastore).transactionManager GrailsTransactionTemplate template = new GrailsTransactionTemplate(transactionManager, definition) return template.executeAndRollback(callable) @@ -125,8 +128,8 @@ class DefaultTransactionService implements TransactionService, Service { @Override def T withNewTransaction(TransactionDefinition definition, - @ClosureParams(value = SimpleType.class, options = "org.springframework.transaction.TransactionStatus") Closure callable) { - if(datastore instanceof TransactionCapableDatastore) { + @ClosureParams(value = SimpleType, options = 'org.springframework.transaction.TransactionStatus') Closure callable) { + if (datastore instanceof TransactionCapableDatastore) { PlatformTransactionManager transactionManager = ((TransactionCapableDatastore) datastore).transactionManager def txDef = new CustomizableRollbackTransactionAttribute(definition) txDef.propagationBehavior = TransactionDefinition.PROPAGATION_REQUIRES_NEW diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/Implemented.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/Implemented.groovy index 49ac7b0160b..e67934251bf 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/Implemented.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/Implemented.groovy @@ -34,5 +34,6 @@ import java.lang.annotation.Target @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) @interface Implemented { + Class by() -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceEnhancer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceEnhancer.groovy index f1e28791312..a3a94d95e21 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceEnhancer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceEnhancer.groovy @@ -32,6 +32,7 @@ import org.codehaus.groovy.ast.MethodNode * */ interface ServiceEnhancer extends ServiceImplementer { + /** * Does this service enhancer enhance the method * @@ -49,4 +50,4 @@ interface ServiceEnhancer extends ServiceImplementer { * @param newMethodNode The new method node being implemented */ void enhance(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceImplementer.groovy index ca1eb3df35c..8e2736f0db4 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceImplementer.groovy @@ -32,12 +32,12 @@ interface ServiceImplementer { /** * Marker that should be stored on the method node once a method has been implemented */ - String IMPLEMENTED = "IMPLEMENTED" + String IMPLEMENTED = 'IMPLEMENTED' /** * Used to store the resolved return type when it has been resolved from generics within the ast metadata */ - String RETURN_TYPE = "RETURN_TYPE" + String RETURN_TYPE = 'RETURN_TYPE' /** * Does this service implement the method * @@ -55,4 +55,4 @@ interface ServiceImplementer { * @param newMethodNode The new method node being implemented */ void implement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceImplementerAdapter.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceImplementerAdapter.groovy index cc47c7e4598..5526bf2b93d 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceImplementerAdapter.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/ServiceImplementerAdapter.groovy @@ -26,6 +26,7 @@ package org.grails.datastore.gorm.services * @since 6.1.1 */ interface ServiceImplementerAdapter { + /** * Adapt the implementer, returning a new implementer if possible, otherwise null * @@ -33,4 +34,4 @@ interface ServiceImplementerAdapter { * @return The adapted implementer or null */ ServiceImplementer adapt(ServiceImplementer implementer) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractArrayOrIterableResultImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractArrayOrIterableResultImplementer.groovy index 6acb87b1e10..b15c0a9d8f8 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractArrayOrIterableResultImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractArrayOrIterableResultImplementer.groovy @@ -22,6 +22,7 @@ import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.GenericsType import org.codehaus.groovy.ast.MethodNode + import org.grails.datastore.mapping.reflect.AstUtils /** @@ -46,10 +47,10 @@ abstract class AbstractArrayOrIterableResultImplementer extends AbstractReadOper @Override final void doImplement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) { - ClassNode returnType = (ClassNode)newMethodNode.getNodeMetaData(RETURN_TYPE) ?: abstractMethodNode.returnType + ClassNode returnType = (ClassNode) newMethodNode.getNodeMetaData(RETURN_TYPE) ?: abstractMethodNode.returnType boolean isArray = returnType.isArray() ClassNode domainClassForReturnType = resolveDomainClassForReturnType(domainClassNode, isArray, returnType) - if(AstUtils.isDomainClass(domainClassForReturnType)) { + if (AstUtils.isDomainClass(domainClassForReturnType)) { domainClassNode = domainClassForReturnType } doImplement(domainClassNode, targetClassNode, abstractMethodNode, newMethodNode, isArray) @@ -64,12 +65,12 @@ abstract class AbstractArrayOrIterableResultImplementer extends AbstractReadOper * @return The domain class type */ protected ClassNode resolveDomainClassForReturnType(ClassNode currentDomainClass, boolean isArray, ClassNode returnType) { - if(returnType.isArray()) { + if (returnType.isArray()) { return returnType.componentType } else { GenericsType[] genericTypes = returnType.genericsTypes - if(genericTypes) { + if (genericTypes) { return genericTypes[0].type } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractDetachedCriteriaServiceImplementor.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractDetachedCriteriaServiceImplementor.groovy index 8c657eb0955..845aa25fe67 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractDetachedCriteriaServiceImplementor.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractDetachedCriteriaServiceImplementor.groovy @@ -19,8 +19,6 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.DetachedCriteria -import grails.gorm.services.Join import groovy.transform.CompileStatic import groovy.transform.PackageScope import org.codehaus.groovy.ast.AnnotationNode @@ -32,10 +30,21 @@ import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.PropertyExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement + +import grails.gorm.DetachedCriteria +import grails.gorm.services.Join import org.grails.datastore.mapping.model.config.GormProperties import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX /** * An abstract implementer that builds a detached criteria query from the method arguments @@ -54,10 +63,10 @@ abstract class AbstractDetachedCriteriaServiceImplementor extends AbstractReadOp Parameter[] parameters = newMethodNode.parameters int parameterCount = parameters.length AnnotationNode joinAnnotation = AstUtils.findAnnotation(abstractMethodNode, Join) - if(lookupById() && joinAnnotation == null && parameterCount == 1 && parameters[0].name == GormProperties.IDENTITY) { + if (lookupById() && joinAnnotation == null && parameterCount == 1 && parameters[0].name == GormProperties.IDENTITY) { // optimize query by id - Expression byId = callX( classX(domainClassNode), "get", varX(parameters[0])) - implementById(domainClassNode,abstractMethodNode,newMethodNode, targetClassNode, body, byId) + Expression byId = callX(classX(domainClassNode), 'get', varX(parameters[0])) + implementById(domainClassNode, abstractMethodNode, newMethodNode, targetClassNode, body, byId) } else { Expression argsExpression = AstUtils.ZERO_ARGUMENTS @@ -68,9 +77,9 @@ abstract class AbstractDetachedCriteriaServiceImplementor extends AbstractReadOp ) Expression connectionId = findConnectionId(newMethodNode) - if(connectionId != null) { + if (connectionId != null) { body.addStatement( - assignS(queryVar, callX(queryVar, "withConnection", connectionId)) + assignS(queryVar, callX(queryVar, 'withConnection', connectionId)) ) } handleJoinAnnotation(joinAnnotation, body, queryVar) @@ -78,17 +87,17 @@ abstract class AbstractDetachedCriteriaServiceImplementor extends AbstractReadOp if (parameterCount > 0) { for (Parameter parameter in parameters) { String parameterName = parameter.name - if(parameterName == GormProperties.IDENTITY) { + if (parameterName == GormProperties.IDENTITY) { body.addStatement( stmt( - callX(queryVar, "idEq", varX(parameter)) + callX(queryVar, 'idEq', varX(parameter)) ) ) } else if (isValidParameter(domainClassNode, parameter, parameterName)) { body.addStatement( stmt( - callX(queryVar, "eq", args( constX(parameterName), varX(parameter) )) + callX(queryVar, 'eq', args(constX(parameterName), varX(parameter))) ) ) } else if (parameter.type == ClassHelper.MAP_TYPE && parameterName == 'args') { @@ -114,16 +123,16 @@ abstract class AbstractDetachedCriteriaServiceImplementor extends AbstractReadOp @PackageScope static void handleJoinAnnotation(AnnotationNode joinAnnotation, BlockStatement body, VariableExpression queryVar) { if (joinAnnotation != null) { - Expression joinValue = joinAnnotation.getMember("value") + Expression joinValue = joinAnnotation.getMember('value') if (joinValue != null) { - Expression joinType = joinAnnotation.getMember("type") + Expression joinType = joinAnnotation.getMember('type') if (joinType instanceof PropertyExpression) { body.addStatement( - stmt(callX(queryVar, "join", args(joinValue, joinType))) + stmt(callX(queryVar, 'join', args(joinValue, joinType))) ) } else { body.addStatement( - stmt(callX(queryVar, "join", joinValue)) + stmt(callX(queryVar, 'join', joinValue)) ) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractProjectionImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractProjectionImplementer.groovy index 958b64378f9..6ee26b3123f 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractProjectionImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractProjectionImplementer.groovy @@ -19,15 +19,16 @@ package org.grails.datastore.gorm.services.implementers +import java.beans.Introspector + import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement -import org.grails.datastore.mapping.reflect.AstUtils -import java.beans.Introspector +import org.grails.datastore.mapping.reflect.AstUtils import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS import static org.codehaus.groovy.ast.tools.GeneralUtils.callX @@ -62,13 +63,12 @@ abstract class AbstractProjectionImplementer extends AbstractDetachedCriteriaSer } protected boolean isValidPropertyType(ClassNode returnType, ClassNode propertyType) { - if(propertyType == null) return false + if (propertyType == null) return false else { returnType == propertyType || AstUtils.isSubclassOfOrImplementsInterface(returnType, propertyType) } } - @Override protected boolean lookupById() { return false @@ -79,10 +79,9 @@ abstract class AbstractProjectionImplementer extends AbstractDetachedCriteriaSer // no-op } - @Override void implementWithQuery(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode, BlockStatement body, VariableExpression detachedCriteriaVar, Expression queryArgs) { - String propertyName = (String)abstractMethodNode.getNodeMetaData(RESOLVED_PROPERTY_NAME) + String propertyName = (String) abstractMethodNode.getNodeMetaData(RESOLVED_PROPERTY_NAME) assert propertyName != null : "Bug in ${getClass().name} transform logic. Method implement should never be called before doesImplement(..) check" body.addStatements([ @@ -92,10 +91,10 @@ abstract class AbstractProjectionImplementer extends AbstractDetachedCriteriaSer } protected String getProjectionName() { - "property" + 'property' } protected String getQueryMethodToInvoke(ClassNode domainClassNode, MethodNode newMethodNode) { - "find" + 'find' } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractReadOperationImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractReadOperationImplementer.groovy index c9039574bf4..2991db00090 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractReadOperationImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractReadOperationImplementer.groovy @@ -18,6 +18,8 @@ */ package org.grails.datastore.gorm.services.implementers +import java.lang.reflect.Modifier + import groovy.transform.CompileStatic import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassHelper @@ -25,12 +27,11 @@ import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.tools.GeneralUtils + import org.grails.datastore.gorm.services.ServiceEnhancer import org.grails.datastore.gorm.transactions.transform.TransactionalTransform import org.grails.datastore.mapping.reflect.AstUtils -import java.lang.reflect.Modifier - /** * Abstract implementor for read operations * @@ -53,13 +54,13 @@ abstract class AbstractReadOperationImplementer extends AbstractServiceImplement final void implement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) { // copy any annotations from the abstract method copyClassAnnotations(abstractMethodNode, newMethodNode) - if(!TransactionalTransform.hasTransactionalAnnotation(targetClassNode) && !TransactionalTransform.hasTransactionalAnnotation(newMethodNode) && Modifier.isPublic(newMethodNode.modifiers)) { + if (!TransactionalTransform.hasTransactionalAnnotation(targetClassNode) && !TransactionalTransform.hasTransactionalAnnotation(newMethodNode) && Modifier.isPublic(newMethodNode.modifiers)) { // read-only transaction by default applyDefaultTransactionHandling(newMethodNode) } ClassNode domainClassFromSignature = resolveDomainClassFromSignature(domainClassNode, abstractMethodNode) - if(domainClassFromSignature != null && AstUtils.isDomainClass(domainClassFromSignature)) { + if (domainClassFromSignature != null && AstUtils.isDomainClass(domainClassFromSignature)) { domainClassNode = domainClassFromSignature } doImplement(domainClassNode, abstractMethodNode, newMethodNode, targetClassNode) @@ -88,7 +89,7 @@ abstract class AbstractReadOperationImplementer extends AbstractServiceImplement @Override void enhance(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) { - if(!TransactionalTransform.hasTransactionalAnnotation(newMethodNode) && Modifier.isPublic(newMethodNode.modifiers)) { + if (!TransactionalTransform.hasTransactionalAnnotation(newMethodNode) && Modifier.isPublic(newMethodNode.modifiers)) { // read-only transaction by default applyDefaultTransactionHandling(newMethodNode) } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractSaveImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractSaveImplementer.groovy index 4475811adbe..73b8f21c626 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractSaveImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractSaveImplementer.groovy @@ -29,16 +29,17 @@ import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement + import org.grails.datastore.mapping.reflect.AstUtils +import static org.codehaus.groovy.ast.tools.GeneralUtils.args import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS -import static org.codehaus.groovy.ast.tools.GeneralUtils.propX -import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX import static org.codehaus.groovy.ast.tools.GeneralUtils.declS -import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.propX import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS -import static org.codehaus.groovy.ast.tools.GeneralUtils.callX import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.namedArgs /** @@ -49,6 +50,7 @@ import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.namedAr */ @CompileStatic abstract class AbstractSaveImplementer extends AbstractWriteOperationImplementer { + protected Statement bindParametersAndSave(ClassNode domainClassNode, MethodNode abstractMethodNode, Parameter[] parameters, BlockStatement body, VariableExpression entityVar) { Expression argsExpression = null @@ -75,18 +77,18 @@ abstract class AbstractSaveImplementer extends AbstractWriteOperationImplementer declS(saveArgs, namedArgs(failOnError: ConstantExpression.TRUE)) ) body.addStatement( - stmt(callX(saveArgs, "putAll", argsExpression)) + stmt(callX(saveArgs, 'putAll', argsExpression)) ) } else { saveArgs = namedArgs(failOnError: ConstantExpression.TRUE) } Expression connectionId = findConnectionId(abstractMethodNode) - if(connectionId != null) { - returnS(callX(buildInstanceApiLookup(domainClassNode, connectionId), "save", args(entityVar, saveArgs))) + if (connectionId != null) { + returnS(callX(buildInstanceApiLookup(domainClassNode, connectionId), 'save', args(entityVar, saveArgs))) } else { - return returnS(callX(entityVar, "save", saveArgs)) + return returnS(callX(entityVar, 'save', saveArgs)) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractServiceImplementer.groovy index 9e8c619b8c8..b21ceabbf53 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractServiceImplementer.groovy @@ -19,8 +19,6 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.multitenancy.TenantService -import grails.gorm.transactions.TransactionService import groovy.transform.CompileStatic import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassHelper @@ -29,6 +27,9 @@ import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.Parameter import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.transform.trait.Traits + +import grails.gorm.multitenancy.TenantService +import grails.gorm.transactions.TransactionService import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.multitenancy.transform.TenantTransform import org.grails.datastore.gorm.services.ServiceImplementer @@ -44,8 +45,12 @@ import org.grails.datastore.mapping.services.ServiceRegistry import org.grails.datastore.mapping.transactions.TransactionCapableDatastore import static org.codehaus.groovy.ast.ClassHelper.make -import static org.codehaus.groovy.ast.tools.GeneralUtils.* -import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.castX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.propX +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callD /** * Abstract implementation of the {@link ServiceImplementer} interface @@ -66,7 +71,7 @@ abstract class AbstractServiceImplementer implements PrefixedServiceImplementer, def alreadyImplemented = methodNode.getNodeMetaData(IMPLEMENTED) String prefix = resolvePrefix(methodNode) - if(!alreadyImplemented && prefix) { + if (!alreadyImplemented && prefix) { ClassNode returnType = methodNode.returnType return isCompatibleReturnType(domainClass, methodNode, returnType, prefix) } @@ -87,7 +92,6 @@ abstract class AbstractServiceImplementer implements PrefixedServiceImplementer, */ protected abstract boolean isCompatibleReturnType(ClassNode domainClass, MethodNode methodNode, ClassNode returnType, String prefix) - /** * Copies annotation from the abstract method to the implementation method * @@ -112,12 +116,12 @@ abstract class AbstractServiceImplementer implements PrefixedServiceImplementer, * @return True if it is */ protected boolean isValidParameter(ClassNode domainClassNode, Parameter parameter, String parameterName) { - if(GormProperties.IDENTITY.equals(parameterName)) { + if (GormProperties.IDENTITY.equals(parameterName)) { return true } else { ClassNode propertyType = AstPropertyResolveUtils.getPropertyType(domainClassNode, parameterName) - if(propertyType != null && (propertyType == parameter.type || AstUtils.isSubclassOf(parameter.type, propertyType.name))) { + if (propertyType != null && (propertyType == parameter.type || AstUtils.isSubclassOf(parameter.type, propertyType.name))) { return true } } @@ -128,48 +132,48 @@ abstract class AbstractServiceImplementer implements PrefixedServiceImplementer, * @return The datastore expression */ protected Expression datastore() { - return propX(varX("this"), "targetDatastore") + return propX(varX('this'), 'targetDatastore') } /** * @return The datastore expression */ protected Expression transactionalDatastore() { - return castX( ClassHelper.make(TransactionCapableDatastore), propX(varX("this"), "targetDatastore")) + return castX(ClassHelper.make(TransactionCapableDatastore), propX(varX('this'), 'targetDatastore')) } /** * @return The datastore expression */ protected Expression multiTenantDatastore() { - return castX( ClassHelper.make(MultiTenantCapableDatastore), propX(varX("this"), "targetDatastore")) + return castX(ClassHelper.make(MultiTenantCapableDatastore), propX(varX('this'), 'targetDatastore')) } /** * @return The tenant service */ protected Expression tenantService() { - return callD(ServiceRegistry, "targetDatastore", "getService", classX(make(TenantService)) ) + return callD(ServiceRegistry, 'targetDatastore', 'getService', classX(make(TenantService))) } /** * @return The transaction service */ protected Expression transactionService() { - return callD(ServiceRegistry, "targetDatastore", "getService", classX(make(TransactionService)) ) + return callD(ServiceRegistry, 'targetDatastore', 'getService', classX(make(TransactionService))) } protected Expression findConnectionId(MethodNode methodNode) { - if(TenantTransform.hasTenantAnnotation(methodNode)) { - return callD(classX(ClassHelper.make(MultiTenancySettings)), "resolveConnectionForTenantId", args( - propX(multiTenantDatastore(), "multiTenancyMode"), callD(tenantService(), "currentId") + if (TenantTransform.hasTenantAnnotation(methodNode)) { + return callD(classX(ClassHelper.make(MultiTenancySettings)), 'resolveConnectionForTenantId', args( + propX(multiTenantDatastore(), 'multiTenancyMode'), callD(tenantService(), 'currentId') )) } else { AnnotationNode ann = TransactionalTransform.findTransactionalAnnotation(methodNode) - Expression connectionId = ann?.getMember("connection") - if(connectionId == null) { - connectionId= ann?.getMember("value") + Expression connectionId = ann?.getMember('connection') + if (connectionId == null) { + connectionId = ann?.getMember('value') } return connectionId } @@ -177,19 +181,19 @@ abstract class AbstractServiceImplementer implements PrefixedServiceImplementer, protected Expression buildInstanceApiLookup(ClassNode domainClass, Expression connectionId) { return AstMethodDispatchUtils.callD( - classX(GormEnhancer), "findInstanceApi", args(classX(domainClass), connectionId) + classX(GormEnhancer), 'findInstanceApi', args(classX(domainClass), connectionId) ) } protected Expression buildStaticApiLookup(ClassNode domainClass, Expression connectionId) { return AstMethodDispatchUtils.callD( - classX(GormEnhancer), "findStaticApi", args(classX(domainClass), connectionId) + classX(GormEnhancer), 'findStaticApi', args(classX(domainClass), connectionId) ) } protected Expression findInstanceApiForConnectionId(ClassNode domainClass, MethodNode methodNode) { Expression connectionId = findConnectionId(methodNode) - if(connectionId != null) { + if (connectionId != null) { return buildInstanceApiLookup(domainClass, connectionId) } else { @@ -199,7 +203,7 @@ abstract class AbstractServiceImplementer implements PrefixedServiceImplementer, protected Expression findStaticApiForConnectionId(ClassNode domainClass, MethodNode methodNode) { Expression connectionId = findConnectionId(methodNode) - if(connectionId != null) { + if (connectionId != null) { return buildStaticApiLookup(domainClass, connectionId) } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractStringQueryImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractStringQueryImplementer.groovy index 05378b35322..a0036261311 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractStringQueryImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractStringQueryImplementer.groovy @@ -19,7 +19,8 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Query +import java.lang.annotation.Annotation + import groovy.transform.CompileStatic import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassNode @@ -30,12 +31,11 @@ import org.codehaus.groovy.ast.expr.GStringExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.control.SourceUnit -import org.grails.datastore.gorm.services.ServiceImplementer + +import grails.gorm.services.Query import org.grails.datastore.gorm.services.transform.QueryStringTransformer import org.grails.datastore.mapping.reflect.AstUtils -import java.lang.annotation.Annotation - import static org.codehaus.groovy.ast.tools.GeneralUtils.args import static org.codehaus.groovy.ast.tools.GeneralUtils.constX @@ -47,6 +47,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.constX */ @CompileStatic abstract class AbstractStringQueryImplementer extends AbstractReadOperationImplementer implements AnnotatedServiceImplementer { + @Override int getOrder() { return FindAllByImplementer.POSITION - 100 @@ -54,7 +55,7 @@ abstract class AbstractStringQueryImplementer extends AbstractReadOperationImple @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if( isAnnotated(domainClass, methodNode) ) { + if (isAnnotated(domainClass, methodNode)) { return isCompatibleReturnType(domainClass, methodNode, methodNode.returnType, methodNode.name) } return false @@ -68,22 +69,22 @@ abstract class AbstractStringQueryImplementer extends AbstractReadOperationImple @Override void doImplement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) { AnnotationNode annotationNode = AstUtils.findAnnotation(abstractMethodNode, getAnnotationType()) - Expression expr = annotationNode.getMember("value") + Expression expr = annotationNode.getMember('value') VariableScope scope = newMethodNode.variableScope - if(expr instanceof GStringExpression) { - GStringExpression gstring = (GStringExpression)expr + if (expr instanceof GStringExpression) { + GStringExpression gstring = (GStringExpression) expr SourceUnit sourceUnit = abstractMethodNode.declaringClass.module.context QueryStringTransformer transformer = createQueryStringTransformer(sourceUnit, scope) Expression transformed = transformer.transformQuery(gstring) - BlockStatement body = (BlockStatement)newMethodNode.code + BlockStatement body = (BlockStatement) newMethodNode.code Expression argMap = findArgsExpression(newMethodNode) - if(argMap != null) { - transformed = args( transformed, argMap ) + if (argMap != null) { + transformed = args(transformed, argMap) } body.addStatement( buildQueryReturnStatement(domainClassNode, abstractMethodNode, newMethodNode, transformed) ) - annotationNode.setMember("value", constX(IMPLEMENTED)) + annotationNode.setMember('value', constX(IMPLEMENTED)) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractWhereImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractWhereImplementer.groovy index 371d649ea3c..7944c32f4ae 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractWhereImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractWhereImplementer.groovy @@ -19,20 +19,31 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.DetachedCriteria -import grails.gorm.services.Where import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.* +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassHelper +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.ClosureExpression import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.control.SourceUnit + +import grails.gorm.DetachedCriteria +import grails.gorm.services.Where import org.grails.datastore.gorm.query.transform.DetachedCriteriaTransformer import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX import static org.grails.datastore.mapping.reflect.AstUtils.processVariableScopes /** @@ -44,7 +55,6 @@ import static org.grails.datastore.mapping.reflect.AstUtils.processVariableScope @CompileStatic abstract class AbstractWhereImplementer extends AbstractReadOperationImplementer implements AnnotatedServiceImplementer { - public static final int POSITION = FindAllByImplementer.POSITION - 100 @Override @@ -59,7 +69,7 @@ abstract class AbstractWhereImplementer extends AbstractReadOperationImplementer @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if( isAnnotated(domainClass, methodNode) ) { + if (isAnnotated(domainClass, methodNode)) { return isCompatibleReturnType(domainClass, methodNode, methodNode.returnType, methodNode.name) } return false @@ -70,15 +80,15 @@ abstract class AbstractWhereImplementer extends AbstractReadOperationImplementer AnnotationNode annotationNode = AstUtils.findAnnotation(abstractMethodNode, Where) abstractMethodNode.annotations.remove(annotationNode) - Expression expr = annotationNode.getMember("value") + Expression expr = annotationNode.getMember('value') SourceUnit sourceUnit = abstractMethodNode.declaringClass.module.context - if(expr instanceof ClosureExpression) { + if (expr instanceof ClosureExpression) { ClosureExpression originalClosureExpression = (ClosureExpression) expr ClosureExpression closureExpression = AstUtils.makeClosureAwareOfArguments(newMethodNode, originalClosureExpression) DetachedCriteriaTransformer transformer = new DetachedCriteriaTransformer(sourceUnit) - transformer.transformClosureExpression( domainClassNode, closureExpression) + transformer.transformClosureExpression(domainClassNode, closureExpression) - BlockStatement body = (BlockStatement)newMethodNode.getCode() + BlockStatement body = (BlockStatement) newMethodNode.getCode() Expression argsExpression = findArgsExpression(newMethodNode) VariableExpression queryVar = varX('$query') @@ -88,13 +98,13 @@ abstract class AbstractWhereImplementer extends AbstractReadOperationImplementer ) Expression connectionId = findConnectionId(newMethodNode) - if(connectionId != null) { + if (connectionId != null) { body.addStatement( - assignS(queryVar, callX(queryVar, "withConnection", connectionId)) + assignS(queryVar, callX(queryVar, 'withConnection', connectionId)) ) } body.addStatement( - assignS(queryVar, callX(queryVar, "build", closureExpression)) + assignS(queryVar, callX(queryVar, 'build', closureExpression)) ) Expression queryExpression = callX(queryVar, getQueryMethodToExecute(domainClassNode, newMethodNode), argsExpression != null ? argsExpression : AstUtils.ZERO_ARGUMENTS) body.addStatement( @@ -103,11 +113,10 @@ abstract class AbstractWhereImplementer extends AbstractReadOperationImplementer processVariableScopes(sourceUnit, targetClassNode, newMethodNode) } else { - AstUtils.error(sourceUnit, annotationNode, "@Where value must be a closure") + AstUtils.error(sourceUnit, annotationNode, '@Where value must be a closure') } } - protected ClassNode getDetachedCriteriaType(ClassNode domainClassNode) { ClassHelper.make(DetachedCriteria) } @@ -117,7 +126,7 @@ abstract class AbstractWhereImplementer extends AbstractReadOperationImplementer } protected String getQueryMethodToExecute(ClassNode domainClass, MethodNode newMethodNode) { - "find" + 'find' } @Override diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractWriteOperationImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractWriteOperationImplementer.groovy index 6d2ee633a7f..3d4528d16a8 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractWriteOperationImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AbstractWriteOperationImplementer.groovy @@ -23,6 +23,7 @@ import groovy.transform.CompileStatic import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode + import org.grails.datastore.gorm.services.ServiceEnhancer import org.grails.datastore.gorm.transactions.transform.TransactionalTransform @@ -34,6 +35,7 @@ import org.grails.datastore.gorm.transactions.transform.TransactionalTransform */ @CompileStatic abstract class AbstractWriteOperationImplementer extends AbstractServiceImplementer implements ServiceEnhancer { + /** * Subclasses should override to add the logic that implements the method * @@ -47,9 +49,9 @@ abstract class AbstractWriteOperationImplementer extends AbstractServiceImplemen final void implement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) { // copy any annotations from the abstract method copyClassAnnotations(abstractMethodNode, newMethodNode) - if(!TransactionalTransform.hasTransactionalAnnotation(newMethodNode)) { + if (!TransactionalTransform.hasTransactionalAnnotation(newMethodNode)) { // read-only transaction by default - newMethodNode.addAnnotation( new AnnotationNode(TransactionalTransform.MY_TYPE) ) + newMethodNode.addAnnotation(new AnnotationNode(TransactionalTransform.MY_TYPE)) } doImplement(domainClassNode, abstractMethodNode, newMethodNode, targetClassNode) @@ -63,9 +65,9 @@ abstract class AbstractWriteOperationImplementer extends AbstractServiceImplemen @Override void enhance(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) { - if(!TransactionalTransform.hasTransactionalAnnotation(newMethodNode)) { + if (!TransactionalTransform.hasTransactionalAnnotation(newMethodNode)) { // read-only transaction by default - newMethodNode.addAnnotation( new AnnotationNode(TransactionalTransform.MY_TYPE) ) + newMethodNode.addAnnotation(new AnnotationNode(TransactionalTransform.MY_TYPE)) } } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AdaptedImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AdaptedImplementer.groovy index a74849e34fe..e8e77a23b1c 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AdaptedImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AdaptedImplementer.groovy @@ -28,5 +28,6 @@ import org.grails.datastore.gorm.services.ServiceImplementer * @since 6.1.1 */ interface AdaptedImplementer { + ServiceImplementer getAdapted() -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AnnotatedServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AnnotatedServiceImplementer.groovy index 946539df44b..6c3e5fc3e03 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AnnotatedServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/AnnotatedServiceImplementer.groovy @@ -28,6 +28,7 @@ import org.codehaus.groovy.ast.MethodNode * @param The annotation type */ interface AnnotatedServiceImplementer extends PrefixedServiceImplementer { + /** * Is the method annotated * @@ -36,4 +37,4 @@ interface AnnotatedServiceImplementer extends PrefixedServiceImplementer { * @return Whether it is annotated */ boolean isAnnotated(ClassNode domainClass, MethodNode methodNode) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountByImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountByImplementer.groovy index aabb4166139..f0f2b400ad5 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountByImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountByImplementer.groovy @@ -20,9 +20,9 @@ package org.grails.datastore.gorm.services.implementers import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode + import org.grails.datastore.mapping.reflect.AstUtils /** @@ -33,8 +33,8 @@ import org.grails.datastore.mapping.reflect.AstUtils */ @CompileStatic class CountByImplementer extends FindAllByImplementer implements SingleResultServiceImplementer { - static final List HANDLED_PREFIXES = ['countBy'] + static final List HANDLED_PREFIXES = ['countBy'] @Override protected boolean isCompatibleReturnType(ClassNode domainClass, MethodNode methodNode, ClassNode returnType, String prefix) { @@ -48,6 +48,6 @@ class CountByImplementer extends FindAllByImplementer implements SingleResultSer @Override protected String getDynamicFinderPrefix() { - return "countBy" + return 'countBy' } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountImplementer.groovy index e8c96af4542..a6510e3f335 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountImplementer.groovy @@ -20,13 +20,12 @@ package org.grails.datastore.gorm.services.implementers import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression -import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement + import org.grails.datastore.mapping.reflect.AstUtils import static org.codehaus.groovy.ast.tools.GeneralUtils.callX @@ -41,6 +40,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS */ @CompileStatic class CountImplementer extends AbstractDetachedCriteriaServiceImplementor implements SingleResultServiceImplementer { + static final List HANDLED_PREFIXES = ['count'] @Override @@ -70,9 +70,9 @@ class CountImplementer extends AbstractDetachedCriteriaServiceImplementor implem @Override void implementWithQuery(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode, BlockStatement body, VariableExpression detachedCriteriaVar, Expression queryArgs) { - Expression callCount = callX(detachedCriteriaVar, "count", queryArgs) + Expression callCount = callX(detachedCriteriaVar, 'count', queryArgs) body.addStatement( - returnS( castX(newMethodNode.returnType, callCount) ) + returnS(castX(newMethodNode.returnType, callCount)) ) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountWhereImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountWhereImplementer.groovy index 044cd6ad39c..ca7015d5fa7 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountWhereImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/CountWhereImplementer.groovy @@ -19,14 +19,13 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Where import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.AnnotationNode -import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.Statement + +import grails.gorm.services.Where import org.grails.datastore.mapping.reflect.AstUtils import static org.codehaus.groovy.ast.tools.GeneralUtils.castX @@ -43,7 +42,7 @@ class CountWhereImplementer extends AbstractWhereImplementer implements Annotate @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if( isAnnotated(domainClass, methodNode) ) { + if (isAnnotated(domainClass, methodNode)) { return isCompatibleReturnType(domainClass, methodNode, methodNode.returnType, methodNode.name) } return false @@ -56,7 +55,7 @@ class CountWhereImplementer extends AbstractWhereImplementer implements Annotate @Override protected String getQueryMethodToExecute(ClassNode domainClass, MethodNode newMethodNode) { - return "count" + return 'count' } @Override diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/DeleteImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/DeleteImplementer.groovy index 8d1e2469d8e..e470e9a31f5 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/DeleteImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/DeleteImplementer.groovy @@ -29,11 +29,19 @@ import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement -import org.grails.datastore.gorm.GormEntity + import org.grails.datastore.gorm.transactions.transform.TransactionalTransform import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX /** * Implements "void delete(..)" @@ -42,11 +50,12 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.* */ @CompileStatic class DeleteImplementer extends AbstractDetachedCriteriaServiceImplementor implements SingleResultServiceImplementer { + static final List HANDLED_PREFIXES = ['delete', 'remove'] @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if(methodNode.parameters.length == 0) return false + if (methodNode.parameters.length == 0) return false else { return AstUtils.isDomainClass(domainClass) && super.doesImplement(domainClass, methodNode) } @@ -71,8 +80,8 @@ class DeleteImplementer extends AbstractDetachedCriteriaServiceImplementor imple void implementById(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode, BlockStatement body, Expression byIdLookup) { boolean isVoidReturnType = ClassHelper.VOID_TYPE.equals(newMethodNode.returnType) VariableExpression obj = varX('$obj') - Statement deleteStatement = stmt(callX(obj, "delete")) - if(!isVoidReturnType) { + Statement deleteStatement = stmt(callX(obj, 'delete')) + if (!isVoidReturnType) { deleteStatement = block( deleteStatement, returnS(constX(1)) @@ -86,7 +95,7 @@ class DeleteImplementer extends AbstractDetachedCriteriaServiceImplementor imple deleteStatement ) ]) - if(!isVoidReturnType) { + if (!isVoidReturnType) { body.addStatement( returnS(constX(0)) ) @@ -96,12 +105,12 @@ class DeleteImplementer extends AbstractDetachedCriteriaServiceImplementor imple @Override void implementWithQuery(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode, BlockStatement body, VariableExpression detachedCriteriaVar, Expression queryArgs) { - MethodCallExpression deleteCall = callX(detachedCriteriaVar, "deleteAll" ) + MethodCallExpression deleteCall = callX(detachedCriteriaVar, 'deleteAll') boolean isVoidReturnType = ClassHelper.VOID_TYPE.equals(newMethodNode.returnType) body.addStatements([ // return query.deleteAll() - isVoidReturnType ? stmt(deleteCall) : returnS( deleteCall ) + isVoidReturnType ? stmt(deleteCall) : returnS(deleteCall) ]) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/DeleteWhereImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/DeleteWhereImplementer.groovy index 2979e83292f..bb7e3b9b0d4 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/DeleteWhereImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/DeleteWhereImplementer.groovy @@ -27,6 +27,7 @@ import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.ast.tools.GeneralUtils + import org.grails.datastore.gorm.transactions.transform.TransactionalTransform import org.grails.datastore.mapping.reflect.AstUtils @@ -49,7 +50,7 @@ class DeleteWhereImplementer extends AbstractWhereImplementer { @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { String prefix = handledPrefixes.find() { String it -> methodNode.name.startsWith(it) } - if(prefix != null) { + if (prefix != null) { return super.doesImplement(domainClass, methodNode) } return false @@ -68,11 +69,11 @@ class DeleteWhereImplementer extends AbstractWhereImplementer { @Override protected Statement buildReturnStatement(ClassNode domainClass, MethodNode abstractMethodNode, MethodNode methodNode, Expression queryExpression) { boolean isVoid = abstractMethodNode.returnType == ClassHelper.VOID_TYPE - if(isVoid) { + if (isVoid) { return GeneralUtils.stmt(queryExpression) } else { - return GeneralUtils.returnS( GeneralUtils.castX( abstractMethodNode.returnType, queryExpression) ) + return GeneralUtils.returnS(GeneralUtils.castX(abstractMethodNode.returnType, queryExpression)) } } @@ -83,7 +84,7 @@ class DeleteWhereImplementer extends AbstractWhereImplementer { @Override protected String getQueryMethodToExecute(ClassNode domainClass, MethodNode newMethodNode) { - return "deleteAll" + return 'deleteAll' } @Override diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllByImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllByImplementer.groovy index 1c6c347862a..2d4e0212e60 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllByImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllByImplementer.groovy @@ -18,7 +18,6 @@ */ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Join import groovy.transform.CompileStatic import groovy.transform.Memoized import org.codehaus.groovy.ast.AnnotationNode @@ -30,6 +29,8 @@ import org.codehaus.groovy.ast.expr.ArgumentListExpression import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement + +import grails.gorm.services.Join import org.grails.datastore.gorm.GormEntity import org.grails.datastore.gorm.finders.DynamicFinder import org.grails.datastore.gorm.finders.MatchSpec @@ -37,18 +38,18 @@ import org.grails.datastore.gorm.services.transform.ServiceTransformation import org.grails.datastore.mapping.core.Ordered import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.codehaus.groovy.ast.ClassHelper.MAP_TYPE +import static org.codehaus.groovy.ast.tools.GeneralUtils.args import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.castX import static org.codehaus.groovy.ast.tools.GeneralUtils.constX -import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS -import static org.codehaus.groovy.ast.tools.GeneralUtils.args -import static org.codehaus.groovy.ast.tools.GeneralUtils.castX -import static org.codehaus.groovy.ast.ClassHelper.MAP_TYPE -import static org.grails.datastore.mapping.reflect.AstUtils.hasProperty +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX import static org.grails.datastore.mapping.reflect.AstUtils.error -import static org.grails.datastore.mapping.reflect.AstUtils.mapX import static org.grails.datastore.mapping.reflect.AstUtils.findAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.hasProperty +import static org.grails.datastore.mapping.reflect.AstUtils.mapX /** * Automatically implement services that find objects based an arguments @@ -58,7 +59,8 @@ import static org.grails.datastore.mapping.reflect.AstUtils.findAnnotation */ @CompileStatic class FindAllByImplementer extends AbstractArrayOrIterableResultImplementer implements Ordered, IterableServiceImplementer { - static final List HANDLED_PREFIXES = ['listBy','findBy', 'findAllBy'] + + static final List HANDLED_PREFIXES = ['listBy', 'findBy', 'findAllBy'] public static final int POSITION = -100 // position before FindAllImplementer @@ -69,11 +71,11 @@ class FindAllByImplementer extends AbstractArrayOrIterableResultImplementer impl @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if(super.doesImplement(domainClass, methodNode)) { + if (super.doesImplement(domainClass, methodNode)) { String methodName = methodNode.name int parameterCount = methodNode.parameters.length - for(String prefix in getHandledPrefixes()) { - if(methodName.startsWith(prefix) && buildMatchSpec(prefix, methodName, parameterCount) != null) { + for (String prefix in getHandledPrefixes()) { + if (methodName.startsWith(prefix) && buildMatchSpec(prefix, methodName, parameterCount) != null) { return true } } @@ -93,26 +95,26 @@ class FindAllByImplementer extends AbstractArrayOrIterableResultImplementer impl @Override void doImplement(ClassNode domainClassNode, ClassNode targetClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, boolean isArray) { - BlockStatement body = (BlockStatement)newMethodNode.getCode() + BlockStatement body = (BlockStatement) newMethodNode.getCode() ClassNode returnType = newMethodNode.returnType String methodName = newMethodNode.name Parameter[] parameters = newMethodNode.parameters int parameterCount = parameters.length MatchSpec matchSpec = null - for(String prefix in getHandledPrefixes()) { + for (String prefix in getHandledPrefixes()) { matchSpec = buildMatchSpec(prefix, methodName, parameterCount) - if(methodName.startsWith(prefix) && matchSpec != null) { + if (methodName.startsWith(prefix) && matchSpec != null) { break } } - if(matchSpec == null) { + if (matchSpec == null) { AstUtils.error(abstractMethodNode.declaringClass.module.context, abstractMethodNode, ServiceTransformation.NO_IMPLEMENTATIONS_MESSAGE) } else { // validate the properties - for(String propertyName in matchSpec.propertyNames) { - if(!hasProperty(domainClassNode, propertyName)) { + for (String propertyName in matchSpec.propertyNames) { + if (!hasProperty(domainClassNode, propertyName)) { error(abstractMethodNode.declaringClass.module.context, abstractMethodNode, "Cannot implement finder for non-existent property [$propertyName] of class [$domainClassNode.name]") } } @@ -122,9 +124,9 @@ class FindAllByImplementer extends AbstractArrayOrIterableResultImplementer impl String finderCallName = "${methodPrefix}${matchSpec.queryExpression}" ArgumentListExpression argList = buildArgs(parameters, abstractMethodNode, body) Expression findCall = callX(findStaticApiForConnectionId(domainClassNode, newMethodNode), finderCallName, argList) - if(isArray || ClassHelper.isNumberType(returnType)) { + if (isArray || ClassHelper.isNumberType(returnType)) { // handle array cast - findCall = castX( returnType.plainNodeReference, findCall) + findCall = castX(returnType.plainNodeReference, findCall) } body.addStatement( buildReturnStatement(domainClassNode, abstractMethodNode, newMethodNode, findCall) @@ -141,7 +143,7 @@ class FindAllByImplementer extends AbstractArrayOrIterableResultImplementer impl if (parameters.length > 0) { if (parameters[-1].name == 'args' && parameters[-1].type == MAP_TYPE) { body.addStatement( - stmt(callX(varX(parameters[-1]), "put", args(constX("fetch"), joinMap))) + stmt(callX(varX(parameters[-1]), 'put', args(constX('fetch'), joinMap))) ) } else { @@ -161,8 +163,7 @@ class FindAllByImplementer extends AbstractArrayOrIterableResultImplementer impl ) } - protected String getDynamicFinderPrefix() { - return "findAllBy" + return 'findAllBy' } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllImplementer.groovy index a5e853e2948..cdd631a0752 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllImplementer.groovy @@ -24,11 +24,14 @@ import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement + import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.core.Ordered import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.castX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS /** * Automatically implements {@link grails.gorm.services.Service} interface methods that start with "list" and @@ -60,7 +63,7 @@ class FindAllImplementer extends AbstractDetachedCriteriaServiceImplementor impl @Override protected ClassNode resolveDomainClassFromSignature(ClassNode currentDomainClassNode, MethodNode methodNode) { ClassNode returnType = methodNode.returnType - if(returnType.isArray()) { + if (returnType.isArray()) { return returnType.componentType } else { @@ -75,9 +78,9 @@ class FindAllImplementer extends AbstractDetachedCriteriaServiceImplementor impl @Override void implementWithQuery(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode, BlockStatement body, VariableExpression detachedCriteriaVar, Expression queryArgs) { - ClassNode returnType = (ClassNode)newMethodNode.getNodeMetaData(RETURN_TYPE) ?: newMethodNode.returnType - Expression methodCall = callX(detachedCriteriaVar, "list", queryArgs) - if(returnType.isArray()) { + ClassNode returnType = (ClassNode) newMethodNode.getNodeMetaData(RETURN_TYPE) ?: newMethodNode.returnType + Expression methodCall = callX(detachedCriteriaVar, 'list', queryArgs) + if (returnType.isArray()) { methodCall = castX(returnType.plainNodeReference, methodCall) } body.addStatement( diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllInterfaceProjectionImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllInterfaceProjectionImplementer.groovy index 7a17d26fff0..e92567f5fe0 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllInterfaceProjectionImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllInterfaceProjectionImplementer.groovy @@ -34,6 +34,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.castX */ @CompileStatic class FindAllInterfaceProjectionImplementer extends FindAllImplementer implements IterableInterfaceProjectionBuilder, IterableProjectionServiceImplementer { + @Override protected ClassNode resolveDomainClassFromSignature(ClassNode currentDomainClassNode, MethodNode methodNode) { return currentDomainClassNode @@ -46,9 +47,9 @@ class FindAllInterfaceProjectionImplementer extends FindAllImplementer implement @Override void implementWithQuery(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode, BlockStatement body, VariableExpression detachedCriteriaVar, Expression queryArgs) { - ClassNode returnType = (ClassNode)newMethodNode.getNodeMetaData(RETURN_TYPE) ?: newMethodNode.returnType - Expression methodCall = callX(detachedCriteriaVar, "list", queryArgs) - if(returnType.isArray()) { + ClassNode returnType = (ClassNode) newMethodNode.getNodeMetaData(RETURN_TYPE) ?: newMethodNode.returnType + Expression methodCall = callX(detachedCriteriaVar, 'list', queryArgs) + if (returnType.isArray()) { methodCall = castX(returnType.plainNodeReference, methodCall) } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllPropertyProjectionImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllPropertyProjectionImplementer.groovy index 22b23e3be94..6a6d5d7e913 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllPropertyProjectionImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllPropertyProjectionImplementer.groovy @@ -23,6 +23,7 @@ import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.GenericsType import org.codehaus.groovy.ast.MethodNode + import org.grails.datastore.gorm.transform.AstPropertyResolveUtils import static org.grails.datastore.mapping.reflect.AstUtils.implementsInterface @@ -35,14 +36,15 @@ import static org.grails.datastore.mapping.reflect.AstUtils.implementsInterface */ @CompileStatic class FindAllPropertyProjectionImplementer extends AbstractProjectionImplementer implements IterableProjectionServiceImplementer { + @Override boolean isCompatibleReturnType(ClassNode domainClass, MethodNode methodNode, ClassNode returnType, String prefix) { boolean isCompatibleReturnType = false String propertyName = establishPropertyName(methodNode, prefix, domainClass) - if(propertyName == null) return false + if (propertyName == null) return false ClassNode propertyType = AstPropertyResolveUtils.getPropertyType(domainClass, propertyName) - if(propertyType == null) return false + if (propertyType == null) return false if (returnType.name == Iterable.name || implementsInterface(returnType, Iterable.name)) { GenericsType[] genericsTypes = returnType.genericsTypes @@ -69,6 +71,6 @@ class FindAllPropertyProjectionImplementer extends AbstractProjectionImplementer @Override protected String getQueryMethodToInvoke(ClassNode domainClassNode, MethodNode newMethodNode) { - return "list" + return 'list' } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllStringQueryImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllStringQueryImplementer.groovy index c92be81a019..1ac055a0f78 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllStringQueryImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllStringQueryImplementer.groovy @@ -24,6 +24,7 @@ import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.Statement + import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.reflect.AstUtils @@ -40,6 +41,7 @@ import static org.grails.datastore.mapping.reflect.AstUtils.implementsInterface */ @CompileStatic class FindAllStringQueryImplementer extends AbstractStringQueryImplementer implements IterableServiceImplementer { + @Override protected boolean isCompatibleReturnType(ClassNode domainClass, MethodNode methodNode, ClassNode returnType, String prefix) { boolean isCompatibleReturnType = false @@ -53,8 +55,8 @@ class FindAllStringQueryImplementer extends AbstractStringQueryImplementer imple @Override protected Statement buildQueryReturnStatement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, Expression args) { - ClassNode returnType = (ClassNode)newMethodNode.getNodeMetaData(RETURN_TYPE) ?: abstractMethodNode.returnType - String methodName = AstUtils.isIterableOrArrayOfDomainClasses(returnType) ? "findAll" : "executeQuery" + ClassNode returnType = (ClassNode) newMethodNode.getNodeMetaData(RETURN_TYPE) ?: abstractMethodNode.returnType + String methodName = AstUtils.isIterableOrArrayOfDomainClasses(returnType) ? 'findAll' : 'executeQuery' Expression methodCall = callX(findStaticApiForConnectionId(domainClassNode, newMethodNode), methodName, args) methodCall = castX(returnType.plainNodeReference, methodCall) return returnS(methodCall) diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllWhereImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllWhereImplementer.groovy index 29171079532..04cde1553bf 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllWhereImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAllWhereImplementer.groovy @@ -19,12 +19,13 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Where import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.Statement + +import grails.gorm.services.Where import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.reflect.AstUtils @@ -42,7 +43,7 @@ class FindAllWhereImplementer extends AbstractWhereImplementer implements Iterab @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if( isAnnotated(domainClass, methodNode )) { + if (isAnnotated(domainClass, methodNode)) { return isCompatibleReturnType(domainClass, methodNode, methodNode.returnType, methodNode.name) } return false @@ -55,13 +56,13 @@ class FindAllWhereImplementer extends AbstractWhereImplementer implements Iterab @Override protected String getQueryMethodToExecute(ClassNode domainClass, MethodNode newMethodNode) { - return "list" + return 'list' } @Override protected ClassNode resolveDomainClassFromSignature(ClassNode currentDomainClassNode, MethodNode methodNode) { ClassNode returnType = methodNode.returnType - if(returnType.isArray()) { + if (returnType.isArray()) { return returnType.componentType } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAndDeleteImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAndDeleteImplementer.groovy index ce9a113ebf7..6c66421b6b7 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAndDeleteImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindAndDeleteImplementer.groovy @@ -27,10 +27,18 @@ import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.Statement + import org.grails.datastore.gorm.GormEntity import org.grails.datastore.gorm.transactions.transform.TransactionalTransform import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* + +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX + /** * An implementer that handles delete methods * @@ -42,7 +50,7 @@ class FindAndDeleteImplementer extends FindOneImplementer implements SingleResul @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if(methodNode.parameters.length == 0) { + if (methodNode.parameters.length == 0) { return false } else { @@ -63,7 +71,7 @@ class FindAndDeleteImplementer extends FindOneImplementer implements SingleResul @Override protected Statement buildReturnStatement(ClassNode targetDomainClass, MethodNode abstractMethodNode, Expression queryMethodCall, Expression args, MethodNode newMethodNode) { VariableExpression var = varX('$obj', targetDomainClass) - MethodCallExpression deleteCall = args != null ? callX(var, "delete", args) : callX(var, "delete") + MethodCallExpression deleteCall = args != null ? callX(var, 'delete', args) : callX(var, 'delete') deleteCall.setSafe(true) // null safe block( diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneByImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneByImplementer.groovy index 55aa2714335..5cb4745689d 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneByImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneByImplementer.groovy @@ -25,11 +25,14 @@ import org.codehaus.groovy.ast.Parameter import org.codehaus.groovy.ast.expr.ArgumentListExpression import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.BlockStatement + import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.model.config.GormProperties import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS + /** * Handles implementation for a finder that returns a single result * @@ -38,16 +41,17 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.* */ @CompileStatic class FindOneByImplementer extends FindAllByImplementer implements SingleResultServiceImplementer { - static final List HANDLED_PREFIXES = ['findBy','getBy', 'findOneBy'] + + static final List HANDLED_PREFIXES = ['findBy', 'getBy', 'findOneBy'] @Override void doImplement(ClassNode domainClassNode, ClassNode targetClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, boolean isArray) { - BlockStatement body = (BlockStatement)newMethodNode.getCode() + BlockStatement body = (BlockStatement) newMethodNode.getCode() Parameter[] parameters = newMethodNode.parameters - if(parameters.length == 1 && parameters[0].name == GormProperties.IDENTITY) { + if (parameters.length == 1 && parameters[0].name == GormProperties.IDENTITY) { // add a method that invokes get(id) ArgumentListExpression argList = buildArgs(parameters, abstractMethodNode, body) - Expression queryMethodCall = callX(findStaticApiForConnectionId(domainClassNode, newMethodNode), "get", argList) + Expression queryMethodCall = callX(findStaticApiForConnectionId(domainClassNode, newMethodNode), 'get', argList) body.addStatement( returnS( queryMethodCall @@ -76,6 +80,6 @@ class FindOneByImplementer extends FindAllByImplementer implements SingleResultS @Override protected String getDynamicFinderPrefix() { - return "findBy" + return 'findBy' } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneImplementer.groovy index 340567251f6..8a4aadf96ab 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneImplementer.groovy @@ -26,9 +26,13 @@ import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement + import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* + +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS + /** * An implementer that implements logic for finding a single entity * @@ -37,7 +41,8 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.* */ @CompileStatic class FindOneImplementer extends AbstractDetachedCriteriaServiceImplementor implements SingleResultServiceImplementer { - static final List HANDLED_PREFIXES = ['retrieve','get', 'find', 'read'] + + static final List HANDLED_PREFIXES = ['retrieve', 'get', 'find', 'read'] @Override protected boolean isCompatibleReturnType(ClassNode domainClass, MethodNode methodNode, ClassNode returnType, String prefix) { @@ -71,7 +76,7 @@ class FindOneImplementer extends AbstractDetachedCriteriaServiceImplementor impl } protected String findMethodToInvoke(ClassNode domainClassNode, MethodNode newMethodNode) { - "find" + 'find' } protected Statement buildReturnStatement(ClassNode targetDomainClass, MethodNode abstractMethodNode, Expression queryMethodCall, Expression args, MethodNode newMethodNode) { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionImplementer.groovy index c4d3c73112b..b5572b79765 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionImplementer.groovy @@ -24,6 +24,7 @@ import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.Statement + import org.grails.datastore.gorm.GormEntity /** @@ -47,6 +48,6 @@ class FindOneInterfaceProjectionImplementer extends FindOneImplementer implement @Override protected Statement buildReturnStatement(ClassNode targetDomainClass, MethodNode abstractMethodNode, Expression queryMethodCall, Expression args, MethodNode newMethodNode) { - return buildInterfaceProjection(targetDomainClass, abstractMethodNode, queryMethodCall, args, newMethodNode) + return buildInterfaceProjection(targetDomainClass, abstractMethodNode, queryMethodCall, args, newMethodNode) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionStringQueryImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionStringQueryImplementer.groovy index cc0de822086..f3f24c0e87b 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionStringQueryImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionStringQueryImplementer.groovy @@ -19,7 +19,6 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Query import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode @@ -27,6 +26,8 @@ import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.ReturnStatement import org.codehaus.groovy.ast.stmt.Statement +import grails.gorm.services.Query + /** * Interface projections for string-based queries * @@ -48,7 +49,7 @@ class FindOneInterfaceProjectionStringQueryImplementer extends FindOneStringQuer @Override protected Statement buildQueryReturnStatement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, Expression queryArg) { - ReturnStatement rs = (ReturnStatement)super.buildQueryReturnStatement(domainClassNode, abstractMethodNode, newMethodNode, queryArg) + ReturnStatement rs = (ReturnStatement) super.buildQueryReturnStatement(domainClassNode, abstractMethodNode, newMethodNode, queryArg) return buildInterfaceProjection(domainClassNode, abstractMethodNode, rs.expression, queryArg, newMethodNode) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionWhereImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionWhereImplementer.groovy index 69a1ac8b1fa..1da6be03fae 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionWhereImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneInterfaceProjectionWhereImplementer.groovy @@ -19,7 +19,6 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Where import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode @@ -27,6 +26,8 @@ import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.ReturnStatement import org.codehaus.groovy.ast.stmt.Statement +import grails.gorm.services.Where + /** * Interface projection implementer for {@link grails.gorm.services.Where} queries * @@ -48,7 +49,7 @@ class FindOneInterfaceProjectionWhereImplementer extends FindOneWhereImplementer @Override protected Statement buildReturnStatement(ClassNode domainClass, MethodNode abstractMethodNode, MethodNode newMethodNode, Expression queryExpression) { - ReturnStatement rs = (ReturnStatement)super.buildReturnStatement(domainClass, abstractMethodNode, newMethodNode, queryExpression) + ReturnStatement rs = (ReturnStatement) super.buildReturnStatement(domainClass, abstractMethodNode, newMethodNode, queryExpression) return buildInterfaceProjection(domainClass, abstractMethodNode, rs.expression, queryExpression, newMethodNode) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOnePropertyProjectionImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOnePropertyProjectionImplementer.groovy index 916764483e3..6612dc73cce 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOnePropertyProjectionImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOnePropertyProjectionImplementer.groovy @@ -22,15 +22,8 @@ package org.grails.datastore.gorm.services.implementers import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode -import org.codehaus.groovy.ast.expr.Expression -import org.codehaus.groovy.ast.expr.VariableExpression -import org.codehaus.groovy.ast.stmt.BlockStatement -import org.grails.datastore.gorm.transform.AstPropertyResolveUtils -import org.grails.datastore.mapping.reflect.AstUtils - -import java.beans.Introspector -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import org.grails.datastore.gorm.transform.AstPropertyResolveUtils /** * Implements property projection by query @@ -41,13 +34,12 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.* @CompileStatic class FindOnePropertyProjectionImplementer extends AbstractProjectionImplementer implements SingleResultProjectionServiceImplementer { - @Override boolean isCompatibleReturnType(ClassNode domainClass, MethodNode methodNode, ClassNode returnType, String prefix) { String propertyName = establishPropertyName(methodNode, prefix, domainClass) - if(propertyName) { + if (propertyName) { ClassNode propertyType = AstPropertyResolveUtils.getPropertyType(domainClass, propertyName) - if(isValidPropertyType(resolveProjectionReturnType(returnType), propertyType)) { + if (isValidPropertyType(resolveProjectionReturnType(returnType), propertyType)) { return true } } @@ -63,7 +55,6 @@ class FindOnePropertyProjectionImplementer extends AbstractProjectionImplementer return returnType } - @Override Iterable getHandledPrefixes() { return FindOneImplementer.HANDLED_PREFIXES diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneStringQueryImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneStringQueryImplementer.groovy index a47f770a756..1d0887735e3 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneStringQueryImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneStringQueryImplementer.groovy @@ -19,18 +19,15 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Query import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.ConstantExpression import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.GStringExpression -import org.codehaus.groovy.ast.expr.MapEntryExpression -import org.codehaus.groovy.ast.expr.MapExpression import org.codehaus.groovy.ast.stmt.Statement + import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.reflect.AstUtils @@ -47,21 +44,22 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS */ @CompileStatic class FindOneStringQueryImplementer extends AbstractStringQueryImplementer implements SingleResultServiceImplementer { + @Override protected Statement buildQueryReturnStatement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, Expression queryArg) { - ClassNode returnType = (ClassNode)newMethodNode.getNodeMetaData(RETURN_TYPE) ?: abstractMethodNode.returnType + ClassNode returnType = (ClassNode) newMethodNode.getNodeMetaData(RETURN_TYPE) ?: abstractMethodNode.returnType String methodToExecute = getFindMethodToInvoke(domainClassNode, newMethodNode, returnType) - if(methodToExecute != "find") { - queryArg = args(queryArg, AstUtils.mapX(max:constX(1))) + if (methodToExecute != 'find') { + queryArg = args(queryArg, AstUtils.mapX(max: constX(1))) } - Expression queryCall = callX( findStaticApiForConnectionId(domainClassNode, newMethodNode), + Expression queryCall = callX(findStaticApiForConnectionId(domainClassNode, newMethodNode), methodToExecute, queryArg) - if(!AstUtils.isDomainClass(returnType)) { - queryCall = callX(queryCall, "first") + if (!AstUtils.isDomainClass(returnType)) { + queryCall = callX(queryCall, 'first') } returnS( queryCall @@ -69,27 +67,27 @@ class FindOneStringQueryImplementer extends AbstractStringQueryImplementer imple } protected String getFindMethodToInvoke(ClassNode classNode, MethodNode methodNode, ClassNode returnType) { - if(AstUtils.isDomainClass(returnType)) { - return "find" + if (AstUtils.isDomainClass(returnType)) { + return 'find' } else { - return "executeQuery" + return 'executeQuery' } } @Override protected boolean isCompatibleReturnType(ClassNode domainClass, MethodNode methodNode, ClassNode returnType, String prefix) { - if(AstUtils.isDomainClass(returnType)) { + if (AstUtils.isDomainClass(returnType)) { return true } - else if(!AstUtils.isSubclassOfOrImplementsInterface(returnType, Iterable.name) && !returnType.isArray() && !returnType.packageName?.startsWith("rx.")) { + else if (!AstUtils.isSubclassOfOrImplementsInterface(returnType, Iterable.name) && !returnType.isArray() && !returnType.packageName?.startsWith('rx.')) { def queryAnnotation = AstUtils.findAnnotation(methodNode, getAnnotationType()) - def query = queryAnnotation.getMember("value") - if(query instanceof GStringExpression) { - GStringExpression gstring = (GStringExpression)query + def query = queryAnnotation.getMember('value') + if (query instanceof GStringExpression) { + GStringExpression gstring = (GStringExpression) query List strings = gstring.strings ConstantExpression stem = strings.first() - if(stem.text.toLowerCase(Locale.ENGLISH).contains("select")) { + if (stem.text.toLowerCase(Locale.ENGLISH).contains('select')) { return returnType != ClassHelper.VOID_TYPE } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneWhereImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneWhereImplementer.groovy index 533458f73b3..4fe9ef2ab18 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneWhereImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/FindOneWhereImplementer.groovy @@ -19,16 +19,16 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Where import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.stmt.Statement + +import grails.gorm.services.Where import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.castX import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS /** @@ -42,7 +42,7 @@ class FindOneWhereImplementer extends AbstractWhereImplementer implements Single @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if( isAnnotated(domainClass, methodNode )) { + if (isAnnotated(domainClass, methodNode)) { return isCompatibleReturnType(domainClass, methodNode, methodNode.returnType, methodNode.name) } return false diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/InterfaceProjectionBuilder.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/InterfaceProjectionBuilder.groovy index 93bddfde85d..b1f93aa0e33 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/InterfaceProjectionBuilder.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/InterfaceProjectionBuilder.groovy @@ -19,6 +19,8 @@ package org.grails.datastore.gorm.services.implementers +import java.lang.reflect.Modifier + import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ASTNode import org.codehaus.groovy.ast.AnnotationNode @@ -33,12 +35,11 @@ import org.codehaus.groovy.ast.expr.ConstantExpression import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.ListExpression import org.codehaus.groovy.transform.DelegateASTTransformation + import org.grails.datastore.gorm.transform.AstPropertyResolveUtils import org.grails.datastore.mapping.reflect.AstUtils import org.grails.datastore.mapping.reflect.NameUtils -import java.lang.reflect.Modifier - import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS import static org.codehaus.groovy.ast.tools.GeneralUtils.block import static org.codehaus.groovy.ast.tools.GeneralUtils.param @@ -55,16 +56,16 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.varX trait InterfaceProjectionBuilder { boolean isInterfaceProjection(ClassNode domainClass, MethodNode methodNode, ClassNode returnType) { - if(returnType.isInterface() && !returnType.packageName?.startsWith("java.")) { + if (returnType.isInterface() && !returnType.packageName?.startsWith('java.')) { List interfacePropertyNames = AstPropertyResolveUtils.getPropertyNames(returnType) - for(prop in interfacePropertyNames) { + for (prop in interfacePropertyNames) { ClassNode existingType = AstPropertyResolveUtils.getPropertyType(domainClass, prop) ClassNode propertyType = AstPropertyResolveUtils.getPropertyType(returnType, prop) - if(existingType == null) { + if (existingType == null) { return false } - else if(!AstUtils.isSubclassOfOrImplementsInterface(existingType, propertyType)) { + else if (!AstUtils.isSubclassOfOrImplementsInterface(existingType, propertyType)) { return false } } @@ -76,13 +77,13 @@ trait InterfaceProjectionBuilder { MethodNode buildInterfaceImpl(ClassNode interfaceNode, ClassNode declaringClass, ClassNode targetDomainClass, MethodNode abstractMethodNode) { List getterNames = (List) AstPropertyResolveUtils.getPropertyNames(interfaceNode) .collect() { - new ConstantExpression(NameUtils.getGetterName(it)) - } + new ConstantExpression(NameUtils.getGetterName(it)) + } String innerClassName = "${declaringClass.name}\$${interfaceNode.nameWithoutPackage}" InnerClassNode innerClassNode = (InnerClassNode) declaringClass.innerClasses.find { InnerClassNode inner -> inner.name == innerClassName } MethodNode methodTarget - Parameter domainClassParam = param(targetDomainClass.plainNodeReference, "target") + Parameter domainClassParam = param(targetDomainClass.plainNodeReference, 'target') Parameter[] params = params(domainClassParam) if (innerClassNode == null) { innerClassNode = new InnerClassNode(declaringClass, innerClassName, Modifier.STATIC | Modifier.PRIVATE, ClassHelper.OBJECT_TYPE, [interfaceNode.plainNodeReference] as ClassNode[], null) @@ -93,8 +94,8 @@ trait InterfaceProjectionBuilder { assignS(varX(field), varX(domainClassParam)) )) AnnotationNode delegateAnn = new AnnotationNode(new ClassNode(Delegate)) - delegateAnn.setMember("includes", new ListExpression(getterNames)) - delegateAnn.setMember("interfaces", new ConstantExpression(false)) + delegateAnn.setMember('includes', new ListExpression(getterNames)) + delegateAnn.setMember('interfaces', new ConstantExpression(false)) ModuleNode module = abstractMethodNode.declaringClass.module new DelegateASTTransformation().visit( [delegateAnn, field] as ASTNode[], @@ -106,4 +107,4 @@ trait InterfaceProjectionBuilder { } return methodTarget } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableInterfaceProjectionBuilder.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableInterfaceProjectionBuilder.groovy index cc9de16a382..35dcc4755c5 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableInterfaceProjectionBuilder.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableInterfaceProjectionBuilder.groovy @@ -24,18 +24,29 @@ import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.Parameter -import org.codehaus.groovy.ast.VariableScope import org.codehaus.groovy.ast.expr.ClosureExpression import org.codehaus.groovy.ast.expr.Expression -import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.Statement + import org.grails.datastore.gorm.services.ServiceImplementer import org.grails.datastore.gorm.transform.AstPropertyResolveUtils import org.grails.datastore.mapping.reflect.AstGenericsUtils import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignX +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.castX +import static org.codehaus.groovy.ast.tools.GeneralUtils.closureX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.param +import static org.codehaus.groovy.ast.tools.GeneralUtils.params +import static org.codehaus.groovy.ast.tools.GeneralUtils.propX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX /** * Projection builder for iterable results like lists and arrays @@ -44,7 +55,7 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.* * @since 6.1.1 */ @CompileStatic -trait IterableInterfaceProjectionBuilder extends InterfaceProjectionBuilder{ +trait IterableInterfaceProjectionBuilder extends InterfaceProjectionBuilder { /** * Is the method an interface projection @@ -55,19 +66,19 @@ trait IterableInterfaceProjectionBuilder extends InterfaceProjectionBuilder{ */ @Override boolean isInterfaceProjection(ClassNode domainClass, MethodNode methodNode, ClassNode returnType) { - if(AstUtils.isSubclassOfOrImplementsInterface(returnType, Iterable.name) || returnType.isArray()) { + if (AstUtils.isSubclassOfOrImplementsInterface(returnType, Iterable.name) || returnType.isArray()) { ClassNode genericType = AstGenericsUtils.resolveSingleGenericType(returnType) - if(genericType != null && genericType.isInterface() && !genericType.packageName?.startsWith("java.")) { + if (genericType != null && genericType.isInterface() && !genericType.packageName?.startsWith('java.')) { List interfacePropertyNames = AstPropertyResolveUtils.getPropertyNames(genericType) - for(prop in interfacePropertyNames) { + for (prop in interfacePropertyNames) { ClassNode existingType = AstPropertyResolveUtils.getPropertyType(domainClass, prop) ClassNode propertyType = AstPropertyResolveUtils.getPropertyType(genericType, prop) - if(existingType == null) { + if (existingType == null) { return false } - else if(!AstUtils.isSubclassOfOrImplementsInterface(existingType, propertyType)) { + else if (!AstUtils.isSubclassOfOrImplementsInterface(existingType, propertyType)) { return false } } @@ -81,7 +92,7 @@ trait IterableInterfaceProjectionBuilder extends InterfaceProjectionBuilder{ ClassNode declaringClass = newMethodNode.declaringClass ClassNode returnType = (ClassNode) newMethodNode.getNodeMetaData(ServiceImplementer.RETURN_TYPE) ?: abstractMethodNode.returnType ClassNode interfaceNode = AstGenericsUtils.resolveSingleGenericType(returnType) - if(!interfaceNode.isInterface()) { + if (!interfaceNode.isInterface()) { AstUtils.error(targetDomainClass.module.context, abstractMethodNode, "Cannot implement interface projection, [$interfaceNode.name] is not an interface!") } MethodNode methodTarget = buildInterfaceImpl(interfaceNode, declaringClass, targetDomainClass, abstractMethodNode) @@ -89,7 +100,7 @@ trait IterableInterfaceProjectionBuilder extends InterfaceProjectionBuilder{ VariableExpression delegateVar = varX('$delegate', innerClassNode) Parameter p = param(ClassHelper.OBJECT_TYPE, '$target') - Expression setTargetCall = assignX(propX(delegateVar, '$target'), castX(targetDomainClass, varX(p)) ) + Expression setTargetCall = assignX(propX(delegateVar, '$target'), castX(targetDomainClass, varX(p))) Statement closureBody = block( declS(delegateVar, ctorX(innerClassNode)), stmt(setTargetCall), @@ -99,13 +110,13 @@ trait IterableInterfaceProjectionBuilder extends InterfaceProjectionBuilder{ def variableScope = newMethodNode.getVariableScope() variableScope.putDeclaredVariable(delegateVar) closureExpression.setVariableScope(variableScope) - Expression collectCall = callX(queryMethodCall, "collect", closureExpression) + Expression collectCall = callX(queryMethodCall, 'collect', closureExpression) - if(returnType.isArray()) { + if (returnType.isArray()) { // handle array cast - collectCall = castX( returnType.plainNodeReference, collectCall) + collectCall = castX(returnType.plainNodeReference, collectCall) } stmt(collectCall) } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableProjectionServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableProjectionServiceImplementer.groovy index b1a2eb4f825..ad0ab60d9f1 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableProjectionServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableProjectionServiceImplementer.groovy @@ -21,6 +21,7 @@ package org.grails.datastore.gorm.services.implementers import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode + import org.grails.datastore.gorm.GormEntity /** @@ -30,6 +31,7 @@ import org.grails.datastore.gorm.GormEntity * @since 6.1.1 */ interface IterableProjectionServiceImplementer extends IterableServiceImplementer { + /** * Is the return type compatible with the projection query * diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableServiceImplementer.groovy index ab23c115eab..a2eb201c0d5 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/IterableServiceImplementer.groovy @@ -26,4 +26,4 @@ package org.grails.datastore.gorm.services.implementers */ interface IterableServiceImplementer extends PrefixedServiceImplementer { -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/NoResultServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/NoResultServiceImplementer.groovy index d2cfe627168..fa520b838db 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/NoResultServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/NoResultServiceImplementer.groovy @@ -25,5 +25,4 @@ package org.grails.datastore.gorm.services.implementers * @author Graeme Rocher * @since 6.1.1 */ -interface NoResultServiceImplementer extends PrefixedServiceImplementer { -} \ No newline at end of file +interface NoResultServiceImplementer extends PrefixedServiceImplementer {} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/PrefixedServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/PrefixedServiceImplementer.groovy index 196c8affeaf..a9c4987ad2a 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/PrefixedServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/PrefixedServiceImplementer.groovy @@ -20,12 +20,14 @@ package org.grails.datastore.gorm.services.implementers import org.codehaus.groovy.ast.MethodNode + import org.grails.datastore.gorm.services.ServiceImplementer /** * An implementer that uses a set of prefixes */ interface PrefixedServiceImplementer extends ServiceImplementer { + /** * @return The handled prefixes */ @@ -37,4 +39,4 @@ interface PrefixedServiceImplementer extends ServiceImplementer { * @return The prefix used or null if it isn't used */ String resolvePrefix(MethodNode mn) -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/QueryStringImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/QueryStringImplementer.groovy index 0c996c8d18a..73debb30ba7 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/QueryStringImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/QueryStringImplementer.groovy @@ -24,4 +24,4 @@ package org.grails.datastore.gorm.services.implementers */ interface QueryStringImplementer { -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SaveImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SaveImplementer.groovy index cfaa33628ba..4c012c220b4 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SaveImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SaveImplementer.groovy @@ -25,10 +25,15 @@ import org.codehaus.groovy.ast.Parameter import org.codehaus.groovy.ast.expr.ConstantExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement + import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.namedArgs /** @@ -39,11 +44,12 @@ import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.namedAr */ @CompileStatic class SaveImplementer extends AbstractSaveImplementer implements SingleResultServiceImplementer { + static final List HANDLED_PREFIXES = ['save', 'store', 'persist'] @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { - if( methodNode.parameters.length == 0 ) { + if (methodNode.parameters.length == 0) { return false } else { @@ -56,9 +62,9 @@ class SaveImplementer extends AbstractSaveImplementer implements SingleResultSer BlockStatement body = (BlockStatement) newMethodNode.getCode() Parameter[] parameters = newMethodNode.parameters int parameterCount = parameters.length - if(parameterCount == 1 && AstUtils.isDomainClass(parameters[0].type)) { + if (parameterCount == 1 && AstUtils.isDomainClass(parameters[0].type)) { body.addStatement( - returnS( callX( varX( parameters[0] ), "save", namedArgs(failOnError: ConstantExpression.TRUE) ) ) + returnS(callX(varX(parameters[0]), 'save', namedArgs(failOnError: ConstantExpression.TRUE))) ) } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultInterfaceProjectionBuilder.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultInterfaceProjectionBuilder.groovy index 81463660992..b92242f257a 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultInterfaceProjectionBuilder.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultInterfaceProjectionBuilder.groovy @@ -20,22 +20,24 @@ package org.grails.datastore.gorm.services.implementers import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.* -import org.codehaus.groovy.ast.expr.ConstantExpression +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.MethodNode import org.codehaus.groovy.ast.expr.Expression -import org.codehaus.groovy.ast.expr.ListExpression import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.Statement -import org.codehaus.groovy.transform.DelegateASTTransformation -import org.grails.datastore.gorm.services.ServiceImplementer -import org.grails.datastore.gorm.transform.AstPropertyResolveUtils -import org.grails.datastore.mapping.reflect.AstUtils -import org.grails.datastore.mapping.reflect.NameUtils -import java.lang.reflect.Modifier +import org.grails.datastore.gorm.services.ServiceImplementer -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX /** * Support trait for building interface projections @@ -48,13 +50,13 @@ trait SingleResultInterfaceProjectionBuilder extends InterfaceProjectionBuilder Statement buildInterfaceProjection(ClassNode targetDomainClass, MethodNode abstractMethodNode, Expression queryMethodCall, Expression args, MethodNode newMethodNode) { ClassNode declaringClass = newMethodNode.declaringClass - ClassNode interfaceNode = (ClassNode)newMethodNode.getNodeMetaData(ServiceImplementer.RETURN_TYPE) ?: abstractMethodNode.returnType + ClassNode interfaceNode = (ClassNode) newMethodNode.getNodeMetaData(ServiceImplementer.RETURN_TYPE) ?: abstractMethodNode.returnType MethodNode methodTarget = buildInterfaceImpl(interfaceNode, declaringClass, targetDomainClass, abstractMethodNode) ClassNode innerClassNode = methodTarget.getDeclaringClass() VariableExpression delegateVar = varX('$delegate', innerClassNode) VariableExpression targetVar = varX('$target', targetDomainClass) - MethodCallExpression setTargetCall = callX(delegateVar, '$setTarget', targetVar ) + MethodCallExpression setTargetCall = callX(delegateVar, '$setTarget', targetVar) setTargetCall.setMethodTarget(methodTarget) block( declS(delegateVar, ctorX(innerClassNode)), @@ -66,5 +68,4 @@ trait SingleResultInterfaceProjectionBuilder extends InterfaceProjectionBuilder ) } - -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultProjectionServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultProjectionServiceImplementer.groovy index 33a949e7346..965770462d1 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultProjectionServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultProjectionServiceImplementer.groovy @@ -21,6 +21,7 @@ package org.grails.datastore.gorm.services.implementers import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.MethodNode + import org.grails.datastore.gorm.GormEntity /** diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultServiceImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultServiceImplementer.groovy index e4705fe6dca..1dcb6ed7976 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultServiceImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/SingleResultServiceImplementer.groovy @@ -26,4 +26,4 @@ package org.grails.datastore.gorm.services.implementers */ interface SingleResultServiceImplementer extends PrefixedServiceImplementer { -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateOneImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateOneImplementer.groovy index b5e15df2c07..4710a80501b 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateOneImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateOneImplementer.groovy @@ -26,10 +26,18 @@ import org.codehaus.groovy.ast.expr.StaticMethodCallExpression import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement + import org.grails.datastore.gorm.GormEntity import org.grails.datastore.mapping.model.config.GormProperties import org.grails.datastore.mapping.reflect.AstUtils -import static org.codehaus.groovy.ast.tools.GeneralUtils.* + +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX + /** * Implements an update operation that returns the updated domain class * @@ -38,16 +46,17 @@ import static org.codehaus.groovy.ast.tools.GeneralUtils.* */ @CompileStatic class UpdateOneImplementer extends AbstractSaveImplementer implements SingleResultServiceImplementer { + static final List HANDLED_PREFIXES = ['update'] @Override boolean doesImplement(ClassNode domainClass, MethodNode methodNode) { Parameter[] parameters = methodNode.parameters - if( parameters.length < 2 ) { + if (parameters.length < 2) { return false } // first parameter should be the id - else if(parameters[0].name != GormProperties.IDENTITY) { + else if (parameters[0].name != GormProperties.IDENTITY) { return false } else { @@ -68,23 +77,23 @@ class UpdateOneImplementer extends AbstractSaveImplementer implements SingleResu @Override void doImplement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) { Parameter[] parameters = newMethodNode.parameters - StaticMethodCallExpression lookupCall = callX(domainClassNode, "get", varX(parameters[0])) + StaticMethodCallExpression lookupCall = callX(domainClassNode, 'get', varX(parameters[0])) VariableExpression entityVar = varX('$entity', domainClassNode) - BlockStatement body = (BlockStatement)newMethodNode.code + BlockStatement body = (BlockStatement) newMethodNode.code // def $entity = Foo.get(id) // if($entity != null) { // ... bind parameters // $entity.save() // } body.addStatement( - declS( entityVar, lookupCall) + declS(entityVar, lookupCall) ) BlockStatement ifBody = block() Statement saveStmt = bindParametersAndSave(domainClassNode, abstractMethodNode, parameters[1..-1] as Parameter[], ifBody, entityVar) ifBody.addStatement(saveStmt) body.addStatement( - ifS( notNullX(entityVar), + ifS(notNullX(entityVar), ifBody ) ) diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateStringQueryImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateStringQueryImplementer.groovy index ed1bcb2dd43..14d077e9ee6 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateStringQueryImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/implementers/UpdateStringQueryImplementer.groovy @@ -19,7 +19,6 @@ package org.grails.datastore.gorm.services.implementers -import grails.gorm.services.Query import groovy.transform.CompileStatic import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassHelper @@ -29,6 +28,8 @@ import org.codehaus.groovy.ast.expr.ConstantExpression import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.GStringExpression import org.codehaus.groovy.ast.stmt.Statement + +import grails.gorm.services.Query import org.grails.datastore.gorm.transactions.transform.TransactionalTransform import org.grails.datastore.mapping.reflect.AstUtils @@ -55,16 +56,16 @@ class UpdateStringQueryImplementer extends AbstractStringQueryImplementer implem boolean isAnnotated(ClassNode domainClass, MethodNode methodNode) { AnnotationNode annotation = AstUtils.findAnnotation(methodNode, Query) if (annotation != null) { - Expression expr = annotation.getMember("value") + Expression expr = annotation.getMember('value') if (expr instanceof GStringExpression) { GStringExpression gstring = (GStringExpression) expr String queryStem = gstring.strings[0].text.toLowerCase(Locale.ENGLISH) - if (queryStem.contains("update") || queryStem.contains('delete')) { + if (queryStem.contains('update') || queryStem.contains('delete')) { return true } } else if (expr instanceof ConstantExpression) { String queryStem = ((ConstantExpression) expr).text.toLowerCase(Locale.ENGLISH) - if (queryStem.contains("update") || queryStem.contains('delete')) { + if (queryStem.contains('update') || queryStem.contains('delete')) { return true } } @@ -81,7 +82,7 @@ class UpdateStringQueryImplementer extends AbstractStringQueryImplementer implem protected Statement buildQueryReturnStatement(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, Expression args) { ClassNode returnType = newMethodNode.returnType boolean isVoid = returnType == ClassHelper.VOID_TYPE - Expression methodCall = callX(findStaticApiForConnectionId(domainClassNode, newMethodNode), "executeUpdate", args) + Expression methodCall = callX(findStaticApiForConnectionId(domainClassNode, newMethodNode), 'executeUpdate', args) methodCall = isVoid ? methodCall : castX(returnType.plainNodeReference, methodCall) return isVoid ? stmt(methodCall) : returnS(methodCall) } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/transform/QueryStringTransformer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/transform/QueryStringTransformer.groovy index 5ca309b7fe4..240ef5067e6 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/transform/QueryStringTransformer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/transform/QueryStringTransformer.groovy @@ -23,12 +23,22 @@ import groovy.transform.CompileStatic import org.codehaus.groovy.ast.ClassCodeExpressionTransformer import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.ast.VariableScope -import org.codehaus.groovy.ast.expr.* +import org.codehaus.groovy.ast.expr.ClassExpression +import org.codehaus.groovy.ast.expr.ClosureExpression +import org.codehaus.groovy.ast.expr.ConstantExpression +import org.codehaus.groovy.ast.expr.DeclarationExpression +import org.codehaus.groovy.ast.expr.EmptyExpression +import org.codehaus.groovy.ast.expr.Expression +import org.codehaus.groovy.ast.expr.GStringExpression +import org.codehaus.groovy.ast.expr.MethodCallExpression +import org.codehaus.groovy.ast.expr.PropertyExpression +import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.ExpressionStatement import org.codehaus.groovy.ast.stmt.ReturnStatement import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.control.SourceUnit + import org.grails.datastore.gorm.transform.AstPropertyResolveUtils import org.grails.datastore.mapping.reflect.AstUtils @@ -56,27 +66,27 @@ class QueryStringTransformer extends ClassCodeExpressionTransformer { GStringExpression transformQuery(GStringExpression query) { Expression transformed = transform(query) transformed = transformPropertyExpressions(transformed) - GStringExpression transformedGString = (GStringExpression)transformed + GStringExpression transformedGString = (GStringExpression) transformed int i = 0 List newStrings = [] List newValues = [] ConstantExpression currentConstant List values = transformedGString.values - for(ConstantExpression exp in transformedGString.strings) { - if(i < values.size()) { + for (ConstantExpression exp in transformedGString.strings) { + if (i < values.size()) { Expression valueExpr = values[i++] - if(valueExpr instanceof ConstantExpression) { - ConstantExpression valueConstant = (ConstantExpression)valueExpr + if (valueExpr instanceof ConstantExpression) { + ConstantExpression valueConstant = (ConstantExpression) valueExpr String newConstant = exp.value.toString() + valueConstant.value.toString() - if(currentConstant != null) { - currentConstant = constX(currentConstant.value.toString() + newConstant ) + if (currentConstant != null) { + currentConstant = constX(currentConstant.value.toString() + newConstant) } else { currentConstant = constX(newConstant) } } - else if(currentConstant != null) { + else if (currentConstant != null) { currentConstant = constX(currentConstant.value.toString() + exp.text) newStrings.add(currentConstant) newValues.add(valueExpr) @@ -88,7 +98,7 @@ class QueryStringTransformer extends ClassCodeExpressionTransformer { } } else { - if(currentConstant != null) { + if (currentConstant != null) { currentConstant = constX(currentConstant.value.toString() + exp.text) newStrings.add(currentConstant) currentConstant = null @@ -104,38 +114,38 @@ class QueryStringTransformer extends ClassCodeExpressionTransformer { @Override Expression transform(Expression exp) { - if(exp instanceof ClassExpression) { + if (exp instanceof ClassExpression) { ClassNode type = ((ClassExpression) exp).type - if(AstUtils.isDomainClass(type)) { + if (AstUtils.isDomainClass(type)) { return constX(type.name) } else { AstUtils.error(sourceUnit, exp, "Invalid query class [$type.name]. Referenced classes in queries must be domain classes") } } - else if(exp instanceof PropertyExpression) { + else if (exp instanceof PropertyExpression) { return transformPropertyExpressions(exp) } - else if(exp instanceof MethodCallExpression) { - MethodCallExpression mce = (MethodCallExpression)exp + else if (exp instanceof MethodCallExpression) { + MethodCallExpression mce = (MethodCallExpression) exp Expression methodTarget = mce.objectExpression - if( methodTarget instanceof ClosureExpression && mce.methodAsString == 'call') { - ClosureExpression closureExpression = (ClosureExpression)methodTarget + if (methodTarget instanceof ClosureExpression && mce.methodAsString == 'call') { + ClosureExpression closureExpression = (ClosureExpression) methodTarget Statement body = closureExpression.code - if(body instanceof BlockStatement) { + if (body instanceof BlockStatement) { def statements = ((BlockStatement) body).statements - if(statements.size() == 1) { - for(stmt in statements) { - if(stmt instanceof ExpressionStatement) { - def stmtExpr = ((ExpressionStatement)stmt).expression - if(stmtExpr instanceof DeclarationExpression) { - return transformDeclarationExpression((DeclarationExpression)stmtExpr) + if (statements.size() == 1) { + for (stmt in statements) { + if (stmt instanceof ExpressionStatement) { + def stmtExpr = ((ExpressionStatement) stmt).expression + if (stmtExpr instanceof DeclarationExpression) { + return transformDeclarationExpression((DeclarationExpression) stmtExpr) } } - else if(stmt instanceof ReturnStatement) { - def stmtExpr = ((ReturnStatement)stmt).expression - if(stmtExpr instanceof DeclarationExpression) { - return transformDeclarationExpression((DeclarationExpression)stmtExpr) + else if (stmt instanceof ReturnStatement) { + def stmtExpr = ((ReturnStatement) stmt).expression + if (stmtExpr instanceof DeclarationExpression) { + return transformDeclarationExpression((DeclarationExpression) stmtExpr) } } } @@ -144,13 +154,13 @@ class QueryStringTransformer extends ClassCodeExpressionTransformer { } } - if(exp instanceof VariableExpression) { - VariableExpression var = (VariableExpression)exp + if (exp instanceof VariableExpression) { + VariableExpression var = (VariableExpression) exp def declared = variableScope.getDeclaredVariable(var.name) - if(declared != null) { + if (declared != null) { return varX(declared) } - else if(declaredQueryTargets.containsKey(var.name)) { + else if (declaredQueryTargets.containsKey(var.name)) { return constX(var.name) } } @@ -158,28 +168,28 @@ class QueryStringTransformer extends ClassCodeExpressionTransformer { } Expression transformDeclarationExpression(DeclarationExpression dec) { - if(dec.leftExpression instanceof VariableExpression && dec.rightExpression instanceof EmptyExpression) { - VariableExpression declaredVar = (VariableExpression)dec.leftExpression + if (dec.leftExpression instanceof VariableExpression && dec.rightExpression instanceof EmptyExpression) { + VariableExpression declaredVar = (VariableExpression) dec.leftExpression ClassNode variableType = declaredVar.type String variableName = declaredVar.name - if(AstUtils.isDomainClass(variableType)) { + if (AstUtils.isDomainClass(variableType)) { declaredQueryTargets.put(variableName, variableType) return constX(formatDomainClassVariable(variableType, variableName)) } } - else if(dec.leftExpression instanceof VariableExpression && dec.rightExpression instanceof PropertyExpression) { - VariableExpression declaredVar = (VariableExpression)dec.leftExpression + else if (dec.leftExpression instanceof VariableExpression && dec.rightExpression instanceof PropertyExpression) { + VariableExpression declaredVar = (VariableExpression) dec.leftExpression ClassNode variableType = declaredVar.type String variableName = declaredVar.name - if(AstUtils.isDomainClass(variableType)) { - PropertyExpression pe = (PropertyExpression)dec.rightExpression + if (AstUtils.isDomainClass(variableType)) { + PropertyExpression pe = (PropertyExpression) dec.rightExpression Expression obj = pe.objectExpression String currentProperty = pe.propertyAsString StringBuilder path = new StringBuilder() - if(obj instanceof VariableExpression) { - VariableExpression ve = (VariableExpression)obj + if (obj instanceof VariableExpression) { + VariableExpression ve = (VariableExpression) obj ClassNode declaredType = declaredQueryTargets.get(ve.name) - if(declaredType == null) { + if (declaredType == null) { AstUtils.error(sourceUnit, dec, "Invalid property path $path in query") } else { @@ -187,18 +197,18 @@ class QueryStringTransformer extends ClassCodeExpressionTransformer { return constX(formatPropertyReference(ve, currentProperty, variableName)) } } - else if(obj instanceof PropertyExpression) { + else if (obj instanceof PropertyExpression) { List propertyPath = calculatePropertyPath(pe) ClassNode currentType = declaredQueryTargets.get(propertyPath[0]) - for(String pp in propertyPath[1..-1]) { - if(currentType == null) { + for (String pp in propertyPath[1..-1]) { + if (currentType == null) { AstUtils.error(sourceUnit, dec, "Invalid property path $path in query") } else { currentType = AstPropertyResolveUtils.getPropertyType(currentType, pp) } } - if(currentType != null) { + if (currentType != null) { declaredQueryTargets.put(variableName, currentType) return constX(formatPropertyPath(propertyPath, variableName)) } @@ -249,26 +259,26 @@ class QueryStringTransformer extends ClassCodeExpressionTransformer { List propertyPath = [] propertyPath.add(p.propertyAsString) Expression obj = p.objectExpression - while(obj instanceof PropertyExpression) { - PropertyExpression nextProperty = (PropertyExpression)obj + while (obj instanceof PropertyExpression) { + PropertyExpression nextProperty = (PropertyExpression) obj propertyPath.add(nextProperty.propertyAsString) obj = nextProperty.objectExpression } - if(obj instanceof VariableExpression) { - propertyPath.add(((VariableExpression)obj).name) + if (obj instanceof VariableExpression) { + propertyPath.add(((VariableExpression) obj).name) } return propertyPath.reverse() } Expression transformPropertyExpressions(Expression exp) { - if(exp instanceof PropertyExpression) { - PropertyExpression pe = (PropertyExpression)exp + if (exp instanceof PropertyExpression) { + PropertyExpression pe = (PropertyExpression) exp Expression targetObject = pe.objectExpression - if( targetObject instanceof VariableExpression) { - VariableExpression var = (VariableExpression)targetObject + if (targetObject instanceof VariableExpression) { + VariableExpression var = (VariableExpression) targetObject ClassNode domainType = declaredQueryTargets.get(var.name) - if(domainType != null) { + if (domainType != null) { String propertyName = pe.propertyAsString - if(( AstUtils.isDomainClass(domainType) && propertyName == "id" )|| AstUtils.hasOrInheritsProperty(domainType, propertyName) ) { + if ((AstUtils.isDomainClass(domainType) && propertyName == 'id') || AstUtils.hasOrInheritsProperty(domainType, propertyName)) { return constX("${var.name}.$propertyName".toString()) } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/transform/ServiceTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/transform/ServiceTransformation.groovy index ab2fb657deb..2076e332bea 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/transform/ServiceTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/services/transform/ServiceTransformation.groovy @@ -18,12 +18,11 @@ */ package org.grails.datastore.gorm.services.transform -import grails.gorm.services.Service -import grails.gorm.transactions.NotTransactional +import java.beans.Introspector +import java.lang.reflect.Modifier + import groovy.transform.CompilationUnitAware import groovy.transform.CompileStatic -import groovyjarjarasm.asm.Opcodes -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.AnnotationNode import org.codehaus.groovy.ast.ClassHelper import org.codehaus.groovy.ast.ClassNode @@ -47,6 +46,12 @@ import org.codehaus.groovy.control.io.URLReaderSource import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.GroovyASTTransformation import org.codehaus.groovy.transform.trait.TraitComposer + +import groovyjarjarasm.asm.Opcodes + +import grails.gorm.services.Service +import grails.gorm.transactions.NotTransactional +import org.apache.grails.common.compiler.GroovyTransformOrder import org.grails.datastore.gorm.services.Implemented import org.grails.datastore.gorm.services.ServiceEnhancer import org.grails.datastore.gorm.services.ServiceImplementer @@ -57,13 +62,14 @@ import org.grails.datastore.gorm.services.implementers.CountImplementer import org.grails.datastore.gorm.services.implementers.CountWhereImplementer import org.grails.datastore.gorm.services.implementers.DeleteImplementer import org.grails.datastore.gorm.services.implementers.DeleteWhereImplementer +import org.grails.datastore.gorm.services.implementers.FindAllByImplementer import org.grails.datastore.gorm.services.implementers.FindAllByInterfaceProjectionImplementer +import org.grails.datastore.gorm.services.implementers.FindAllImplementer import org.grails.datastore.gorm.services.implementers.FindAllInterfaceProjectionImplementer +import org.grails.datastore.gorm.services.implementers.FindAllPropertyProjectionImplementer import org.grails.datastore.gorm.services.implementers.FindAllStringQueryImplementer import org.grails.datastore.gorm.services.implementers.FindAllWhereImplementer import org.grails.datastore.gorm.services.implementers.FindAndDeleteImplementer -import org.grails.datastore.gorm.services.implementers.FindAllImplementer -import org.grails.datastore.gorm.services.implementers.FindAllByImplementer import org.grails.datastore.gorm.services.implementers.FindOneByImplementer import org.grails.datastore.gorm.services.implementers.FindOneByInterfaceProjectionImplementer import org.grails.datastore.gorm.services.implementers.FindOneImplementer @@ -71,11 +77,10 @@ import org.grails.datastore.gorm.services.implementers.FindOneInterfaceProjectio import org.grails.datastore.gorm.services.implementers.FindOneInterfaceProjectionStringQueryImplementer import org.grails.datastore.gorm.services.implementers.FindOneInterfaceProjectionWhereImplementer import org.grails.datastore.gorm.services.implementers.FindOnePropertyProjectionImplementer -import org.grails.datastore.gorm.services.implementers.FindAllPropertyProjectionImplementer -import org.grails.datastore.gorm.services.implementers.SaveImplementer import org.grails.datastore.gorm.services.implementers.FindOneStringQueryImplementer -import org.grails.datastore.gorm.services.implementers.UpdateOneImplementer import org.grails.datastore.gorm.services.implementers.FindOneWhereImplementer +import org.grails.datastore.gorm.services.implementers.SaveImplementer +import org.grails.datastore.gorm.services.implementers.UpdateOneImplementer import org.grails.datastore.gorm.services.implementers.UpdateStringQueryImplementer import org.grails.datastore.gorm.transactions.transform.TransactionalTransform import org.grails.datastore.gorm.transform.AbstractTraitApplyingGormASTTransformation @@ -83,11 +88,27 @@ import org.grails.datastore.gorm.validation.jakarta.services.implementers.Method import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.core.order.OrderedComparator -import java.beans.Introspector -import java.lang.reflect.Modifier - -import static org.codehaus.groovy.ast.tools.GeneralUtils.* -import static org.grails.datastore.mapping.reflect.AstUtils.* +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignX +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.equalsNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.param +import static org.codehaus.groovy.ast.tools.GeneralUtils.params +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.grails.datastore.mapping.reflect.AstUtils.COMPILE_STATIC_TYPE +import static org.grails.datastore.mapping.reflect.AstUtils.ZERO_PARAMETERS +import static org.grails.datastore.mapping.reflect.AstUtils.addAnnotationIfNecessary +import static org.grails.datastore.mapping.reflect.AstUtils.copyAnnotations +import static org.grails.datastore.mapping.reflect.AstUtils.copyParameters +import static org.grails.datastore.mapping.reflect.AstUtils.error +import static org.grails.datastore.mapping.reflect.AstUtils.findAllUnimplementedAbstractMethods +import static org.grails.datastore.mapping.reflect.AstUtils.findAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.hasAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.warning /** * Makes a class implement the {@link org.grails.datastore.mapping.services.Service} trait and generates the necessary @@ -100,7 +121,7 @@ import static org.grails.datastore.mapping.reflect.AstUtils.* @GroovyASTTransformation(phase = CompilePhase.SEMANTIC_ANALYSIS) class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation implements CompilationUnitAware, ASTTransformation { - private static final ClassNode MY_TYPE = new ClassNode(Service.class); + private static final ClassNode MY_TYPE = new ClassNode(Service) private static final Object APPLIED_MARKER = new Object() private static final List DEFAULT_IMPLEMENTORS = [ new FindAllImplementer(), @@ -132,7 +153,7 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i private static Iterable LOADED_IMPLEMENTORS = null public static - final String NO_IMPLEMENTATIONS_MESSAGE = "No implementations possible for method. Please use an abstract class instead and provide an implementation." + final String NO_IMPLEMENTATIONS_MESSAGE = 'No implementations possible for method. Please use an abstract class instead and provide an implementation.' @Override protected Class getTraitClass() { @@ -173,8 +194,8 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i propertiesFields.add(field) pn.setGetterBlock( block( - ifS( equalsNullX(fieldVar), - assignX(fieldVar, callX( varX("datastore"), "getService", classX(propertyType.plainNodeReference))) + ifS(equalsNullX(fieldVar), + assignX(fieldVar, callX(varX('datastore'), 'getService', classX(propertyType.plainNodeReference))) ), returnS(fieldVar) ) @@ -183,15 +204,15 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i } List constructors = classNode.getDeclaredConstructors() - if(!constructors.isEmpty()) { - error(sourceUnit, classNode, "Abstract data Services should not define constructors") + if (!constructors.isEmpty()) { + error(sourceUnit, classNode, 'Abstract data Services should not define constructors') } } if (isInterface || isAbstractClass) { // create a new class to represent the implementation - String packageName = classNode.packageName ? "${classNode.packageName}." : "" + String packageName = classNode.packageName ? "${classNode.packageName}." : '' ClassNode[] interfaces = isInterface ? ([classNode.plainNodeReference] as ClassNode[]) : new ClassNode[0] ClassNode superClass = isInterface ? ClassHelper.OBJECT_TYPE : classNode.plainNodeReference String serviceClassName = classNode.nameWithoutPackage @@ -200,41 +221,40 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i superClass, interfaces) - if(!propertiesFields.isEmpty()) { + if (!propertiesFields.isEmpty()) { ClassNode datastoreType = ClassHelper.make(Datastore) - FieldNode datastoreField = impl.addField("datastore", Modifier.PRIVATE, datastoreType, null) + FieldNode datastoreField = impl.addField('datastore', Modifier.PRIVATE, datastoreType, null) VariableExpression datastoreFieldVar = varX(datastoreField) - BlockStatement body = block() - Parameter datastoreParam = param(datastoreType, "d") - impl.addMethod("setDatastore", Modifier.PUBLIC, ClassHelper.VOID_TYPE, params( + Parameter datastoreParam = param(datastoreType, 'd') + impl.addMethod('setDatastore', Modifier.PUBLIC, ClassHelper.VOID_TYPE, params( datastoreParam - ), null, body ) + ), null, body) body.addStatement( assignS(datastoreFieldVar, varX(datastoreParam)) ) - impl.addMethod("getDatastore", Modifier.PUBLIC, datastoreType.plainNodeReference, ZERO_PARAMETERS, null, - returnS( datastoreFieldVar ) + impl.addMethod('getDatastore', Modifier.PUBLIC, datastoreType.plainNodeReference, ZERO_PARAMETERS, null, + returnS(datastoreFieldVar) ) - for(FieldNode fn in propertiesFields) { + for (FieldNode fn in propertiesFields) { body.addStatement( - assignS(varX(fn), callX(datastoreFieldVar, "getService", classX(fn.type.plainNodeReference))) + assignS(varX(fn), callX(datastoreFieldVar, 'getService', classX(fn.type.plainNodeReference))) ) } } copyAnnotations(classNode, impl) AnnotationNode serviceAnnotation = findAnnotation(impl, Service) - if(serviceAnnotation.getMember("name") == null) { + if (serviceAnnotation.getMember('name') == null) { serviceAnnotation - .setMember("name", new ConstantExpression(Introspector.decapitalize(serviceClassName))) + .setMember('name', new ConstantExpression(Introspector.decapitalize(serviceClassName))) } // add compile static by default impl.addAnnotation(new AnnotationNode(COMPILE_STATIC_TYPE)) // weave the trait class - ClassExpression ce = (ClassExpression) annotationNode.getMember("value") + ClassExpression ce = (ClassExpression) annotationNode.getMember('value') ClassNode targetDomainClass = ce != null ? ce.type : ClassHelper.OBJECT_TYPE // weave with generic argument weaveTraitWithGenerics(impl, getTraitClass(), targetDomainClass) @@ -242,7 +262,6 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i List abstractMethods = findAllUnimplementedAbstractMethods(classNode) Iterable implementers = findServiceImplementors(annotationNode) - // first go through the existing implemented methods and just enhance them if (!isInterface) { for (MethodNode existing in classNode.methods) { @@ -283,10 +302,10 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i implementer.implement(targetDomainClass, method, methodImpl, impl) def implementedAnn = new AnnotationNode(ClassHelper.make(Implemented)) Class implementedClass = implementer.getClass() - if(implementer instanceof AdaptedImplementer) { - implementedClass = ((AdaptedImplementer)implementer).getAdapted().getClass() + if (implementer instanceof AdaptedImplementer) { + implementedClass = ((AdaptedImplementer) implementer).getAdapted().getClass() } - implementedAnn.setMember("by", classX(implementedClass)) + implementedAnn.setMember('by', classX(implementedClass)) methodImpl.addAnnotation(implementedAnn) impl.addMethod(methodImpl) break @@ -313,15 +332,14 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i TraitComposer.doExtendTraits(impl, sourceUnit, compilationUnit) } - - Expression exposeExpr = annotationNode.getMember("expose") + Expression exposeExpr = annotationNode.getMember('expose') if (exposeExpr == null || (exposeExpr instanceof ConstantExpression && exposeExpr == ConstantExpression.TRUE)) { generateServiceDescriptor(sourceUnit, impl) } sourceUnit.getAST().addClass(impl) } else { - Expression exposeExpr = annotationNode.getMember("expose") + Expression exposeExpr = annotationNode.getMember('expose') if (exposeExpr == null || (exposeExpr instanceof ConstantExpression && exposeExpr == ConstantExpression.TRUE)) { generateServiceDescriptor(sourceUnit, classNode) } @@ -334,7 +352,7 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i if (!cn.isPrimaryClassNode()) { Class cls = cn.typeClass if (cls != null && type.isAssignableFrom(cls)) { - implementers.add( cls.newInstance() ) + implementers.add(cls.newInstance()) } } } @@ -351,34 +369,33 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i List finalImplementers = [] finalImplementers.addAll(implementers) - loadAnnotationDefined(annotationNode, "implementers", finalImplementers, ServiceImplementer) + loadAnnotationDefined(annotationNode, 'implementers', finalImplementers, ServiceImplementer) Iterable adapters = load(ServiceImplementerAdapter) List finalAdapters = adapters.toList() - loadAnnotationDefined(annotationNode, "adapters", finalAdapters, ServiceImplementerAdapter) + loadAnnotationDefined(annotationNode, 'adapters', finalAdapters, ServiceImplementerAdapter) - if(!finalAdapters.isEmpty()) { + if (!finalAdapters.isEmpty()) { finalAdapters = finalAdapters.unique { ServiceImplementerAdapter o1 -> o1.class.name } - for(implementer in implementers) { - for(ServiceImplementerAdapter adapter in finalAdapters) { + for (implementer in implementers) { + for (ServiceImplementerAdapter adapter in finalAdapters) { ServiceImplementer adapted = adapter.adapt(implementer) - if(adapted != null) { + if (adapted != null) { finalImplementers.add(adapted) } } } } - LOADED_IMPLEMENTORS = finalImplementers.sort(true, new OrderedComparator()) } return LOADED_IMPLEMENTORS } protected void loadAnnotationDefined(AnnotationNode annotationNode, String member, List finalList, Class type) { - Expression additionalImplementers = annotationNode.getMember(member ) + Expression additionalImplementers = annotationNode.getMember(member) if (additionalImplementers instanceof ListExpression) { for (Expression exp in ((ListExpression) additionalImplementers).expressions) { addClassExpressionToImplementers(exp, finalList, type) @@ -403,10 +420,10 @@ class ServiceTransformation extends AbstractTraitApplyingGormASTTransformation i File targetDirectory = sourceUnit.configuration.targetDirectory if (targetDirectory == null) { - targetDirectory = new File("build/resources/main") + targetDirectory = new File('build/resources/main') } - File servicesDir = new File(targetDirectory, "META-INF/services") + File servicesDir = new File(targetDirectory, 'META-INF/services') servicesDir.mkdirs() String className = classNode.name diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/support/AbstractDatastorePersistenceContextInterceptor.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/support/AbstractDatastorePersistenceContextInterceptor.java index 501988e4372..cfea26fabf9 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/support/AbstractDatastorePersistenceContextInterceptor.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/support/AbstractDatastorePersistenceContextInterceptor.java @@ -22,11 +22,13 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + +import org.springframework.transaction.support.TransactionSynchronizationManager; + import org.grails.datastore.mapping.core.Datastore; import org.grails.datastore.mapping.core.DatastoreUtils; import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.transactions.SessionHolder; -import org.springframework.transaction.support.TransactionSynchronizationManager; /** * Abstract implementation of the persistence context interceptor @@ -34,7 +36,7 @@ * @since 1.0 * @author Graeme Rocher */ -public abstract class AbstractDatastorePersistenceContextInterceptor { +public abstract class AbstractDatastorePersistenceContextInterceptor { private static final Log LOG = LogFactory.getLog(AbstractDatastorePersistenceContextInterceptor.class); protected Datastore datastore; @@ -66,7 +68,7 @@ public void destroy() { // single session mode final SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(datastore); if (sessionHolder != null && this == sessionHolder.getCreator()) { - SessionHolder holder = (SessionHolder)TransactionSynchronizationManager.unbindResource(datastore); + SessionHolder holder = (SessionHolder) TransactionSynchronizationManager.unbindResource(datastore); LOG.debug("Closing single Datastore session in DatastorePersistenceContextInterceptor"); try { Session session = holder.getSession(); @@ -88,7 +90,7 @@ public void reconnect() { public void flush() { Session session = getSession(); - if(session.hasTransaction()) { + if (session.hasTransaction()) { session.flush(); } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/timestamp/AggregateTimestampProvider.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/timestamp/AggregateTimestampProvider.java index 161fd266d75..7fb0f360f3c 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/timestamp/AggregateTimestampProvider.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/timestamp/AggregateTimestampProvider.java @@ -28,12 +28,12 @@ * */ public class AggregateTimestampProvider implements TimestampProvider { - private List timestampProviders=Collections.emptyList(); + private List timestampProviders = Collections.emptyList(); @Override public boolean supportsCreating(Class dateTimeClass) { - for(TimestampProvider provider : timestampProviders) { - if(provider.supportsCreating(dateTimeClass)) { + for (TimestampProvider provider : timestampProviders) { + if (provider.supportsCreating(dateTimeClass)) { return true; } } @@ -42,9 +42,9 @@ public boolean supportsCreating(Class dateTimeClass) { @Override public T createTimestamp(Class dateTimeClass) { - if(timestampProviders.size() > 1) { - for(TimestampProvider provider : timestampProviders) { - if(provider.supportsCreating(dateTimeClass)) { + if (timestampProviders.size() > 1) { + for (TimestampProvider provider : timestampProviders) { + if (provider.supportsCreating(dateTimeClass)) { return createTimestamp(provider, dateTimeClass); } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/timestamp/DefaultTimestampProvider.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/timestamp/DefaultTimestampProvider.java index dfd163db499..471345b4c0d 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/timestamp/DefaultTimestampProvider.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/timestamp/DefaultTimestampProvider.java @@ -21,13 +21,14 @@ import java.util.Date; import org.codehaus.groovy.runtime.DefaultGroovyMethods; + import org.springframework.util.ClassUtils; /** * Default implementation of TimestampProvider - * + * * supports creating timestamps for any class that supports a constructor that accepts a Long or long value. - * + * * "currentTimeMillis" can be overrided in subclasses (useful for testing purposes) * */ @@ -46,19 +47,19 @@ public boolean supportsCreating(Class dateTimeClass) { @Override public T createTimestamp(final Class dateTimeClass) { long timestampMillis = currentTimeMillis(); - if(dateTimeClass == String.class) { - return (T)String.valueOf(timestampMillis); + if (dateTimeClass == String.class) { + return (T) String.valueOf(timestampMillis); } else { Class actualDateTimeClass; - if(dateTimeClass==Object.class) { + if (dateTimeClass == Object.class) { actualDateTimeClass = Date.class; } else { actualDateTimeClass = ClassUtils.resolvePrimitiveIfNecessary(dateTimeClass); } try { - return (T)DefaultGroovyMethods.newInstance(actualDateTimeClass, new Object[] { timestampMillis }); + return (T) DefaultGroovyMethods.newInstance(actualDateTimeClass, new Object[] { timestampMillis }); } catch (Exception e) { - return (T)DefaultGroovyMethods.invokeMethod(actualDateTimeClass, "now", null); + return (T) DefaultGroovyMethods.invokeMethod(actualDateTimeClass, "now", null); } } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transactions/transform/RollbackTransform.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transactions/transform/RollbackTransform.groovy index 7e781c4b1da..ebfcde5e487 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transactions/transform/RollbackTransform.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transactions/transform/RollbackTransform.groovy @@ -19,13 +19,14 @@ package org.grails.datastore.gorm.transactions.transform -import grails.gorm.transactions.Rollback import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder import org.codehaus.groovy.ast.ClassNode import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.transform.GroovyASTTransformation +import grails.gorm.transactions.Rollback +import org.apache.grails.common.compiler.GroovyTransformOrder + @CompileStatic @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) class RollbackTransform extends TransactionalTransform { @@ -34,7 +35,7 @@ class RollbackTransform extends TransactionalTransform { @Override protected String getTransactionTemplateMethodName() { - return "executeAndRollback" + return 'executeAndRollback' } @Override diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transactions/transform/TransactionalTransform.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transactions/transform/TransactionalTransform.groovy index fe90ad0e63f..bb24eb457ac 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transactions/transform/TransactionalTransform.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transactions/transform/TransactionalTransform.groovy @@ -14,39 +14,80 @@ */ package org.grails.datastore.gorm.transactions.transform -import grails.gorm.transactions.GrailsTransactionTemplate -import grails.gorm.transactions.NotTransactional -import grails.gorm.transactions.ReadOnly -import grails.gorm.transactions.Rollback -import grails.gorm.transactions.Transactional +import java.lang.reflect.Modifier + import groovy.transform.CompileStatic -import org.apache.grails.common.compiler.GroovyTransformOrder -import org.codehaus.groovy.ast.* -import org.codehaus.groovy.ast.expr.* +import org.codehaus.groovy.ast.AnnotatedNode +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.FieldNode +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.Parameter +import org.codehaus.groovy.ast.expr.ClassExpression +import org.codehaus.groovy.ast.expr.ConstantExpression +import org.codehaus.groovy.ast.expr.Expression +import org.codehaus.groovy.ast.expr.ListExpression +import org.codehaus.groovy.ast.expr.MethodCallExpression +import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.control.CompilePhase import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.GroovyASTTransformation + +import org.springframework.transaction.PlatformTransactionManager +import org.springframework.transaction.TransactionStatus +import org.springframework.transaction.annotation.Propagation +import org.springframework.transaction.interceptor.NoRollbackRuleAttribute +import org.springframework.transaction.interceptor.RollbackRuleAttribute + +import grails.gorm.transactions.GrailsTransactionTemplate +import grails.gorm.transactions.NotTransactional +import grails.gorm.transactions.ReadOnly +import grails.gorm.transactions.Rollback +import grails.gorm.transactions.Transactional +import org.apache.grails.common.compiler.GroovyTransformOrder import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.multitenancy.transform.TenantTransform import org.grails.datastore.gorm.transform.AbstractDatastoreMethodDecoratingTransformation -import org.grails.datastore.mapping.core.Ordered import org.grails.datastore.mapping.core.connections.MultipleConnectionSourceCapableDatastore import org.grails.datastore.mapping.multitenancy.MultiTenantCapableDatastore import org.grails.datastore.mapping.transactions.CustomizableRollbackTransactionAttribute import org.grails.datastore.mapping.transactions.TransactionCapableDatastore -import org.springframework.transaction.PlatformTransactionManager -import org.springframework.transaction.TransactionStatus -import org.springframework.transaction.annotation.Propagation -import org.springframework.transaction.interceptor.NoRollbackRuleAttribute -import org.springframework.transaction.interceptor.RollbackRuleAttribute - -import java.lang.reflect.Modifier -import static org.codehaus.groovy.ast.ClassHelper.* -import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.* -import static org.grails.datastore.mapping.reflect.AstUtils.* +import static org.codehaus.groovy.ast.ClassHelper.CLASS_Type +import static org.codehaus.groovy.ast.ClassHelper.STRING_TYPE +import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE +import static org.codehaus.groovy.ast.ClassHelper.make +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.castX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX +import static org.codehaus.groovy.ast.tools.GeneralUtils.declS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifElseS +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifS +import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.param +import static org.codehaus.groovy.ast.tools.GeneralUtils.params +import static org.codehaus.groovy.ast.tools.GeneralUtils.propX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callD +import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callThisD +import static org.grails.datastore.mapping.reflect.AstUtils.ZERO_ARGUMENTS +import static org.grails.datastore.mapping.reflect.AstUtils.ZERO_PARAMETERS +import static org.grails.datastore.mapping.reflect.AstUtils.buildGetPropertyExpression +import static org.grails.datastore.mapping.reflect.AstUtils.copyParameters +import static org.grails.datastore.mapping.reflect.AstUtils.findAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.hasOrInheritsProperty +import static org.grails.datastore.mapping.reflect.AstUtils.implementsInterface +import static org.grails.datastore.mapping.reflect.AstUtils.isSubclassOf +import static org.grails.datastore.mapping.reflect.AstUtils.nonGeneric +import static org.grails.datastore.mapping.reflect.AstUtils.varThis /** *

This AST transform reads the {@link Transactional} annotation and transforms method calls by @@ -96,17 +137,18 @@ import static org.grails.datastore.mapping.reflect.AstUtils.* @CompileStatic @GroovyASTTransformation(phase = CompilePhase.CANONICALIZATION) class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransformation { - private static final Set ANNOTATION_NAME_EXCLUDES = new HashSet([Transactional.class.getName(), "grails.transaction.Rollback", Rollback.class.getName(), NotTransactional.class.getName(), "grails.transaction.NotTransactional", "grails.gorm.transactions.ReadOnly"]) + + private static final Set ANNOTATION_NAME_EXCLUDES = new HashSet([Transactional.getName(), 'grails.transaction.Rollback', Rollback.getName(), NotTransactional.getName(), 'grails.transaction.NotTransactional', 'grails.gorm.transactions.ReadOnly']) public static final ClassNode MY_TYPE = new ClassNode(Transactional) public static final ClassNode READ_ONLY_TYPE = new ClassNode(ReadOnly) - private static final String PROPERTY_TRANSACTION_MANAGER = "transactionManager" - private static final String METHOD_EXECUTE = "execute" + private static final String PROPERTY_TRANSACTION_MANAGER = 'transactionManager' + private static final String METHOD_EXECUTE = 'execute' private static final Object APPLIED_MARKER = new Object() - private static final String SET_TRANSACTION_MANAGER = "setTransactionManager" + private static final String SET_TRANSACTION_MANAGER = 'setTransactionManager' private static final Set VALID_ANNOTATION_NAMES = Collections.unmodifiableSet( new HashSet([Transactional.simpleName, Rollback.simpleName, ReadOnly.simpleName]) ) - public static final String GET_TRANSACTION_MANAGER_METHOD = "getTransactionManager" + public static final String GET_TRANSACTION_MANAGER_METHOD = 'getTransactionManager' public static final String RENAMED_METHOD_PREFIX = '$tt__' @@ -135,7 +177,7 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma @Override protected boolean isValidAnnotation(AnnotationNode annotationNode, AnnotatedNode classNode) { - return VALID_ANNOTATION_NAMES.contains( annotationNode.classNode.nameWithoutPackage ) + return VALID_ANNOTATION_NAMES.contains(annotationNode.classNode.nameWithoutPackage) } @Override @@ -150,22 +192,12 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma @Override protected Parameter[] prepareNewMethodParameters(MethodNode methodNode, Map genericsSpec, ClassNode classNode = null) { - final Parameter transactionStatusParameter = param(make(TransactionStatus), "transactionStatus") + final Parameter transactionStatusParameter = param(make(TransactionStatus), 'transactionStatus') Parameter[] parameters = methodNode.getParameters() Parameter[] newParameters = parameters.length > 0 ? (copyParameters(((parameters as List) + [transactionStatusParameter]) as Parameter[], genericsSpec)) : [transactionStatusParameter] as Parameter[] return newParameters } - @Override - protected MethodNode weaveNewMethod(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, Map genericsSpec) { - super.weaveNewMethod(sourceUnit, annotationNode, classNode, methodNode, genericsSpec) - } - - @Override - protected void weaveClassNode(SourceUnit source, AnnotationNode annotationNode, ClassNode classNode) { - super.weaveClassNode(source, annotationNode, classNode) - } - @Override protected void enhanceClassNode(SourceUnit source, AnnotationNode annotationNode, ClassNode declaringClassNode) { weaveTransactionManagerAware(sourceUnit, annotationNode, declaringClassNode) @@ -175,7 +207,7 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma @Override protected void weaveTestSetupMethod(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, Map genericsSpec) { def requiresNewTransaction = new AnnotationNode(annotationNode.classNode) - requiresNewTransaction.addMember("propagation", propX( classX(Propagation), "REQUIRES_NEW") ) + requiresNewTransaction.addMember('propagation', propX(classX(Propagation), 'REQUIRES_NEW')) weaveNewMethod(sourceUnit, requiresNewTransaction, classNode, methodNode, genericsSpec) } @@ -190,59 +222,59 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma } protected void weaveTransactionManagerAware(SourceUnit source, AnnotationNode annotationNode, ClassNode declaringClassNode) { - if ( declaringClassNode.getNodeMetaData(APPLIED_MARKER) == APPLIED_MARKER ) { + if (declaringClassNode.getNodeMetaData(APPLIED_MARKER) == APPLIED_MARKER) { return } - Expression connectionName = annotationNode.getMember("connection") - if( connectionName == null ) { - connectionName = annotationNode.getMember("value") + Expression connectionName = annotationNode.getMember('connection') + if (connectionName == null) { + connectionName = annotationNode.getMember('value') } boolean hasDataSourceProperty = connectionName != null //add the transactionManager property - if (!hasOrInheritsProperty(declaringClassNode, PROPERTY_TRANSACTION_MANAGER) ) { + if (!hasOrInheritsProperty(declaringClassNode, PROPERTY_TRANSACTION_MANAGER)) { ClassNode transactionManagerClassNode = make(PlatformTransactionManager) // build a static lookup in the case of no property set ClassExpression gormEnhancerExpr = classX(GormEnhancer) - Expression val = annotationNode.getMember("datastore") + Expression val = annotationNode.getMember('datastore') MethodCallExpression transactionManagerLookupExpr - if(val instanceof ClassExpression) { - transactionManagerLookupExpr = hasDataSourceProperty ? callX(gormEnhancerExpr, "findTransactionManager", args(val, connectionName)) : callX(gormEnhancerExpr, "findTransactionManager", val) - Parameter typeParameter = param(CLASS_Type, "type") - Parameter[] params = hasDataSourceProperty ? params(typeParameter, param(STRING_TYPE, "connectionName")) : params(typeParameter) + if (val instanceof ClassExpression) { + transactionManagerLookupExpr = hasDataSourceProperty ? callX(gormEnhancerExpr, 'findTransactionManager', args(val, connectionName)) : callX(gormEnhancerExpr, 'findTransactionManager', val) + Parameter typeParameter = param(CLASS_Type, 'type') + Parameter[] params = hasDataSourceProperty ? params(typeParameter, param(STRING_TYPE, 'connectionName')) : params(typeParameter) transactionManagerLookupExpr.setMethodTarget( - gormEnhancerExpr.getType().getDeclaredMethod("findTransactionManager", params ) + gormEnhancerExpr.getType().getDeclaredMethod('findTransactionManager', params) ) } else { - transactionManagerLookupExpr = hasDataSourceProperty ? callX(gormEnhancerExpr, "findSingleTransactionManager", connectionName) : callX(gormEnhancerExpr, "findSingleTransactionManager") - Parameter[] params = hasDataSourceProperty ? params(param(STRING_TYPE, "connectionName")) : ZERO_PARAMETERS + transactionManagerLookupExpr = hasDataSourceProperty ? callX(gormEnhancerExpr, 'findSingleTransactionManager', connectionName) : callX(gormEnhancerExpr, 'findSingleTransactionManager') + Parameter[] params = hasDataSourceProperty ? params(param(STRING_TYPE, 'connectionName')) : ZERO_PARAMETERS transactionManagerLookupExpr.setMethodTarget( - gormEnhancerExpr.getType().getDeclaredMethod("findSingleTransactionManager", params ) + gormEnhancerExpr.getType().getDeclaredMethod('findSingleTransactionManager', params) ) } // simply logic for classes that implement Service - if(implementsInterface(declaringClassNode, "org.grails.datastore.mapping.services.Service")) { + if (implementsInterface(declaringClassNode, 'org.grails.datastore.mapping.services.Service')) { // Add Method: PlatformTransactionManager getTransactionManager() // if(datastore != null) // return datastore.transactionManager // else // return GormEnhancer.findSingleTransactionManager() ClassNode transactionCapableDatastore = make(TransactionCapableDatastore) - Expression datastoreVar = castX(transactionCapableDatastore, varX("datastore") ) + Expression datastoreVar = castX(transactionCapableDatastore, varX('datastore')) Expression datastoreLookupExpr = datastoreVar - if(hasDataSourceProperty) { - datastoreLookupExpr = callD(castX(make(MultipleConnectionSourceCapableDatastore), datastoreVar), "getDatastoreForConnection", connectionName ) + if (hasDataSourceProperty) { + datastoreLookupExpr = callD(castX(make(MultipleConnectionSourceCapableDatastore), datastoreVar), 'getDatastoreForConnection', connectionName) } Statement ifElse = ifElseS( notNullX(datastoreVar), - returnS( propX( castX(transactionCapableDatastore, datastoreLookupExpr), PROPERTY_TRANSACTION_MANAGER) ), - returnS( transactionManagerLookupExpr ) + returnS(propX(castX(transactionCapableDatastore, datastoreLookupExpr), PROPERTY_TRANSACTION_MANAGER)), + returnS(transactionManagerLookupExpr) ) declaringClassNode.addMethod(GET_TRANSACTION_MANAGER_METHOD, @@ -257,35 +289,33 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma String transactionManagerFieldName = '$' + PROPERTY_TRANSACTION_MANAGER FieldNode transactionManagerField = declaringClassNode.addField(transactionManagerFieldName, Modifier.PROTECTED, transactionManagerClassNode, null) - VariableExpression transactionManagerPropertyExpr = varX(transactionManagerField) BlockStatement getterBody = block() // this is a hacky workaround that ensures the transaction manager is also set on the spock shared instance which seems to differ for // some reason - if(isSubclassOf(declaringClassNode, "spock.lang.Specification")) { + if (isSubclassOf(declaringClassNode, 'spock.lang.Specification')) { getterBody.addStatement( stmt( - callX( propX( propX( varThis(), "specificationContext"), "sharedInstance"), + callX(propX(propX(varThis(), 'specificationContext'), 'sharedInstance'), SET_TRANSACTION_MANAGER, transactionManagerPropertyExpr) ) ) } - // Prepare the getTransactionManager() method body // if($transactionManager != null) // return $transactionManager // else // return GormEnhancer.findSingleTransactionManager() Statement ifElse = ifElseS( - notNullX( transactionManagerPropertyExpr ), - returnS( transactionManagerPropertyExpr ), + notNullX(transactionManagerPropertyExpr), + returnS(transactionManagerPropertyExpr), returnS(transactionManagerLookupExpr) ) - getterBody.addStatement( ifElse ) + getterBody.addStatement(ifElse) // Add Method: PlatformTransactionManager getTransactionManager() declaringClassNode.addMethod(GET_TRANSACTION_MANAGER_METHOD, @@ -297,7 +327,7 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma // Prepare setter parameters Parameter p = param(transactionManagerClassNode, PROPERTY_TRANSACTION_MANAGER) Parameter[] parameters = params(p) - if(declaringClassNode.getMethod(SET_TRANSACTION_MANAGER, parameters) == null) { + if (declaringClassNode.getMethod(SET_TRANSACTION_MANAGER, parameters) == null) { Statement setterBody = assignS(transactionManagerPropertyExpr, varX(p)) // Add Setter Method: void setTransactionManager(PlatformTransactionManager transactionManager) @@ -310,7 +340,6 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma } } - } } @@ -328,32 +357,32 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma boolean isMultiTenant = TenantTransform.hasTenantAnnotation(methodNode) - Expression connectionName = annotationNode.getMember("connection") - if( connectionName == null ) { - connectionName = annotationNode.getMember("value") + Expression connectionName = annotationNode.getMember('connection') + if (connectionName == null) { + connectionName = annotationNode.getMember('value') } - if(connectionName == null) { - if(isMultiTenant) { - connectionName = varX("tenantId") + if (connectionName == null) { + if (isMultiTenant) { + connectionName = varX('tenantId') } } final boolean hasDataSourceProperty = connectionName != null // $transactionManager = connection != null ? getTargetDatastore(connection).getTransactionManager() : getTransactionManager() Expression transactionManagerExpression - if(isMultiTenant && hasDataSourceProperty) { - Expression targetDatastoreExpr = castX( make(MultiTenantCapableDatastore), callThisD(classNode, "getTargetDatastore", ZERO_ARGUMENTS) ) - targetDatastoreExpr = castX( make(TransactionCapableDatastore), callX( targetDatastoreExpr, "getDatastoreForTenantId", connectionName)) - transactionManagerExpression = castX( make(PlatformTransactionManager), propX(targetDatastoreExpr, PROPERTY_TRANSACTION_MANAGER) ) + if (isMultiTenant && hasDataSourceProperty) { + Expression targetDatastoreExpr = castX(make(MultiTenantCapableDatastore), callThisD(classNode, 'getTargetDatastore', ZERO_ARGUMENTS)) + targetDatastoreExpr = castX(make(TransactionCapableDatastore), callX(targetDatastoreExpr, 'getDatastoreForTenantId', connectionName)) + transactionManagerExpression = castX(make(PlatformTransactionManager), propX(targetDatastoreExpr, PROPERTY_TRANSACTION_MANAGER)) } - else if(hasDataSourceProperty) { + else if (hasDataSourceProperty) { // callX(varX("this"), "getTargetDatastore", connectionName) - def targetDatastoreExpr = castX( make(TransactionCapableDatastore), callThisD(classNode, "getTargetDatastore", connectionName) ) - transactionManagerExpression = castX( make(PlatformTransactionManager), propX(targetDatastoreExpr, PROPERTY_TRANSACTION_MANAGER) ) + def targetDatastoreExpr = castX(make(TransactionCapableDatastore), callThisD(classNode, 'getTargetDatastore', connectionName)) + transactionManagerExpression = castX(make(PlatformTransactionManager), propX(targetDatastoreExpr, PROPERTY_TRANSACTION_MANAGER)) } else { - transactionManagerExpression = propX( varX("this"), PROPERTY_TRANSACTION_MANAGER) + transactionManagerExpression = propX(varX('this'), PROPERTY_TRANSACTION_MANAGER) } // GrailsTransactionTemplate $transactionTemplate @@ -375,22 +404,22 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma // return $transactionTemplate.execute { TransactionStatus transactionStatus -> // return $tt_myMethod(transactionStatus) // } - Parameter transactionStatusParam = param(make(TransactionStatus), "transactionStatus") + Parameter transactionStatusParam = param(make(TransactionStatus), 'transactionStatus') Parameter[] parameters = params(transactionStatusParam) - return makeDelegatingClosureCall(transactionTemplateVar, executeMethodName, parameters, originalMethodCall, methodNode.getVariableScope() ) + return makeDelegatingClosureCall(transactionTemplateVar, executeMethodName, parameters, originalMethodCall, methodNode.getVariableScope()) } protected String getTransactionTemplateMethodName() { - return "execute" + return 'execute' } protected applyTransactionalAttributeSettings(AnnotationNode annotationNode, VariableExpression transactionAttributeVar, BlockStatement methodBody, ClassNode classNode, MethodNode methodNode) { final ClassNode rollbackRuleAttributeClassNode = make(RollbackRuleAttribute) final ClassNode noRollbackRuleAttributeClassNode = make(NoRollbackRuleAttribute) final Map members = annotationNode.getMembers() - if(READ_ONLY_TYPE.equals(annotationNode.classNode)) { + if (READ_ONLY_TYPE.equals(annotationNode.classNode)) { methodBody.addStatement( - assignS(propX(transactionAttributeVar, "readOnly"), ConstantExpression.TRUE) + assignS(propX(transactionAttributeVar, 'readOnly'), ConstantExpression.TRUE) ) } @@ -399,7 +428,7 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma final targetClassNode = (name == 'rollbackFor' || name == 'rollbackForClassName') ? rollbackRuleAttributeClassNode : noRollbackRuleAttributeClassNode name = 'rollbackRules' if (expr instanceof ListExpression) { - for(exprItem in ((ListExpression)expr).expressions) { + for (exprItem in ((ListExpression) expr).expressions) { appendRuleElement(methodBody, transactionAttributeVar, name, ctorX(targetClassNode, exprItem)) } } else { @@ -408,13 +437,13 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma } else { if (name == 'isolation') { name = 'isolationLevel' - expr = callX(expr, "value", ZERO_ARGUMENTS) + expr = callX(expr, 'value', ZERO_ARGUMENTS) } else if (name == 'propagation') { name = 'propagationBehavior' - expr = callX(expr, "value", ZERO_ARGUMENTS) + expr = callX(expr, 'value', ZERO_ARGUMENTS) } - if(name != 'value') { + if (name != 'value') { methodBody.addStatement( assignS(propX(transactionAttributeVar, name), expr) ) @@ -452,7 +481,7 @@ class TransactionalTransform extends AbstractDatastoreMethodDecoratingTransforma */ static boolean hasTransactionalAnnotation(AnnotatedNode md) { for (AnnotationNode annotation : md.getAnnotations()) { - if(ANNOTATION_NAME_EXCLUDES.any() { String n -> n == annotation.classNode.name}) { + if (ANNOTATION_NAME_EXCLUDES.any() { String n -> n == annotation.classNode.name }) { return true } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractDatastoreMethodDecoratingTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractDatastoreMethodDecoratingTransformation.groovy index 50e828a9256..4350b1a268a 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractDatastoreMethodDecoratingTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractDatastoreMethodDecoratingTransformation.groovy @@ -18,8 +18,14 @@ */ package org.grails.datastore.gorm.transform +import java.lang.reflect.Modifier + import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.* +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.FieldNode +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.Parameter import org.codehaus.groovy.ast.expr.ClassExpression import org.codehaus.groovy.ast.expr.Expression import org.codehaus.groovy.ast.expr.MethodCallExpression @@ -27,19 +33,34 @@ import org.codehaus.groovy.ast.expr.VariableExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.control.SourceUnit + +import org.springframework.beans.factory.annotation.Autowired + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.internal.RuntimeSupport import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.core.connections.MultipleConnectionSourceCapableDatastore -import org.grails.datastore.mapping.reflect.AstUtils -import org.springframework.beans.factory.annotation.Autowired - -import java.lang.reflect.Modifier -import static org.codehaus.groovy.ast.ClassHelper.* -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.ClassHelper.STRING_TYPE +import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE +import static org.codehaus.groovy.ast.ClassHelper.make +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.castX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ifElseS +import static org.codehaus.groovy.ast.tools.GeneralUtils.notNullX +import static org.codehaus.groovy.ast.tools.GeneralUtils.param +import static org.codehaus.groovy.ast.tools.GeneralUtils.params +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callD -import static org.grails.datastore.mapping.reflect.AstUtils.* +import static org.grails.datastore.mapping.reflect.AstUtils.ZERO_PARAMETERS +import static org.grails.datastore.mapping.reflect.AstUtils.addAnnotationOrGetExisting +import static org.grails.datastore.mapping.reflect.AstUtils.implementsInterface +import static org.grails.datastore.mapping.reflect.AstUtils.isSpockTest /** * An abstract implementation for transformations that decorate a method invocation such that @@ -53,45 +74,44 @@ import static org.grails.datastore.mapping.reflect.AstUtils.* abstract class AbstractDatastoreMethodDecoratingTransformation extends AbstractMethodDecoratingTransformation { public static final String FIELD_TARGET_DATASTORE = '$targetDatastore' - public static final String METHOD_GET_TARGET_DATASTORE = "getTargetDatastore" - protected static final String METHOD_GET_DATASTORE_FOR_CONNECTION = "getDatastoreForConnection" - + public static final String METHOD_GET_TARGET_DATASTORE = 'getTargetDatastore' + protected static final String METHOD_GET_DATASTORE_FOR_CONNECTION = 'getDatastoreForConnection' @Override protected void enhanceClassNode(SourceUnit source, AnnotationNode annotationNode, ClassNode declaringClassNode) { def appliedMarker = getAppliedMarker() - if(declaringClassNode.getNodeMetaData(appliedMarker) == appliedMarker) { + if (declaringClassNode.getNodeMetaData(appliedMarker) == appliedMarker) { return } - if(declaringClassNode.isInterface()) { + if (declaringClassNode.isInterface()) { return } declaringClassNode.putNodeMetaData(appliedMarker, appliedMarker) - Expression connectionName = annotationNode.getMember("connection") + Expression connectionName = annotationNode.getMember('connection') boolean hasDataSourceProperty = connectionName != null boolean isSpockTest = isSpockTest(declaringClassNode) ClassExpression gormEnhancerExpr = classX(GormEnhancer) - Expression datastoreAttribute = annotationNode.getMember("datastore") + Expression datastoreAttribute = annotationNode.getMember('datastore') ClassNode defaultType = hasDataSourceProperty ? make(MultipleConnectionSourceCapableDatastore) : make(Datastore) boolean hasSpecificDatastore = datastoreAttribute instanceof ClassExpression - ClassNode datastoreType = hasSpecificDatastore ? ((ClassExpression)datastoreAttribute).getType().getPlainNodeReference() : defaultType - Parameter connectionNameParam = param(STRING_TYPE, "connectionName") + ClassNode datastoreType = hasSpecificDatastore ? ((ClassExpression) datastoreAttribute).getType().getPlainNodeReference() : defaultType + Parameter connectionNameParam = param(STRING_TYPE, 'connectionName') MethodCallExpression datastoreLookupCall MethodCallExpression datastoreLookupDefaultCall - if(hasSpecificDatastore) { - datastoreLookupDefaultCall = callD(gormEnhancerExpr, "findDatastoreByType", classX(datastoreType.getPlainNodeReference())) + if (hasSpecificDatastore) { + datastoreLookupDefaultCall = callD(gormEnhancerExpr, 'findDatastoreByType', classX(datastoreType.getPlainNodeReference())) } else { - datastoreLookupDefaultCall = callD(gormEnhancerExpr, "findSingleDatastore") + datastoreLookupDefaultCall = callD(gormEnhancerExpr, 'findSingleDatastore') } datastoreLookupCall = callD(datastoreLookupDefaultCall, METHOD_GET_DATASTORE_FOR_CONNECTION, varX(connectionNameParam)) - if(implementsInterface(declaringClassNode, "org.grails.datastore.mapping.services.Service")) { + if (implementsInterface(declaringClassNode, 'org.grails.datastore.mapping.services.Service')) { // simplify logic for services Parameter[] getTargetDatastoreParams = params(connectionNameParam) - VariableExpression datastoreVar = varX("datastore", make(Datastore)) + VariableExpression datastoreVar = varX('datastore', make(Datastore)) // Add method: // protected Datastore getTargetDatastore(String connectionName) @@ -100,17 +120,17 @@ abstract class AbstractDatastoreMethodDecoratingTransformation extends AbstractM // else // return GormEnhancer.findSingleDatastore().getDatastoreForConnection(connectionName) - if(declaringClassNode.getMethod(METHOD_GET_TARGET_DATASTORE, getTargetDatastoreParams) == null) { + if (declaringClassNode.getMethod(METHOD_GET_TARGET_DATASTORE, getTargetDatastoreParams) == null) { MethodNode mn = declaringClassNode.addMethod(METHOD_GET_TARGET_DATASTORE, Modifier.PROTECTED, datastoreType, getTargetDatastoreParams, null, ifElseS(notNullX(datastoreVar), - returnS( callD( castX(make(MultipleConnectionSourceCapableDatastore), datastoreVar ), METHOD_GET_DATASTORE_FOR_CONNECTION, varX(connectionNameParam) ) ), + returnS(callD(castX(make(MultipleConnectionSourceCapableDatastore), datastoreVar), METHOD_GET_DATASTORE_FOR_CONNECTION, varX(connectionNameParam))), returnS(datastoreLookupCall) )) compileMethodStatically(source, mn) } - if(declaringClassNode.getMethod(METHOD_GET_TARGET_DATASTORE, ZERO_PARAMETERS) == null) { + if (declaringClassNode.getMethod(METHOD_GET_TARGET_DATASTORE, ZERO_PARAMETERS) == null) { MethodNode mn = declaringClassNode.addMethod(METHOD_GET_TARGET_DATASTORE, Modifier.PROTECTED, datastoreType, ZERO_PARAMETERS, null, - ifElseS( notNullX(datastoreVar ), + ifElseS(notNullX(datastoreVar), returnS(datastoreVar), returnS(datastoreLookupDefaultCall)) ) @@ -120,23 +140,23 @@ abstract class AbstractDatastoreMethodDecoratingTransformation extends AbstractM } else { FieldNode datastoreField = declaringClassNode.getField(FIELD_TARGET_DATASTORE) - if(datastoreField == null) { + if (datastoreField == null) { datastoreField = declaringClassNode.addField(FIELD_TARGET_DATASTORE, Modifier.PROTECTED, datastoreType, null) - Parameter datastoresParam = param(datastoreType.makeArray(), "datastores") + Parameter datastoresParam = param(datastoreType.makeArray(), 'datastores') VariableExpression datastoresVar = varX(datastoresParam) - Expression datastoreVar = callD(classX(RuntimeSupport), "findDefaultDatastore", datastoresVar) + Expression datastoreVar = callD(classX(RuntimeSupport), 'findDefaultDatastore', datastoresVar) BlockStatement setTargetDatastoreBody VariableExpression datastoreFieldVar = varX(datastoreField) - Statement assignTargetDatastore = assignS(datastoreFieldVar,datastoreVar ) - if(hasDataSourceProperty) { + Statement assignTargetDatastore = assignS(datastoreFieldVar, datastoreVar) + if (hasDataSourceProperty) { // $targetDatastore = RuntimeSupport.findDefaultDatastore(datastores) // datastore = datastore.getDatastoreForConnection(connectionName) setTargetDatastoreBody = block( assignTargetDatastore, - assignS(datastoreFieldVar, callX(datastoreFieldVar, METHOD_GET_DATASTORE_FOR_CONNECTION, connectionName )) + assignS(datastoreFieldVar, callX(datastoreFieldVar, METHOD_GET_DATASTORE_FOR_CONNECTION, connectionName)) ) } else { @@ -149,12 +169,12 @@ abstract class AbstractDatastoreMethodDecoratingTransformation extends AbstractM // Add method: @Autowired void setTargetDatastore(Datastore[] datastores) Parameter[] setTargetDatastoreParams = params(datastoresParam) - if( declaringClassNode.getMethod("setTargetDatastore", setTargetDatastoreParams) == null) { - MethodNode setTargetDatastoreMethod = declaringClassNode.addMethod("setTargetDatastore", Modifier.PUBLIC, VOID_TYPE, setTargetDatastoreParams, null, setTargetDatastoreBody) + if (declaringClassNode.getMethod('setTargetDatastore', setTargetDatastoreParams) == null) { + MethodNode setTargetDatastoreMethod = declaringClassNode.addMethod('setTargetDatastore', Modifier.PUBLIC, VOID_TYPE, setTargetDatastoreParams, null, setTargetDatastoreBody) // Autowire setTargetDatastore via Spring addAnnotationOrGetExisting(setTargetDatastoreMethod, Autowired) - .setMember("required", constX(false)) + .setMember('required', constX(false)) compileMethodStatically(source, setTargetDatastoreMethod) } @@ -166,28 +186,26 @@ abstract class AbstractDatastoreMethodDecoratingTransformation extends AbstractM // else // return GormEnhancer.findSingleDatastore().getDatastoreForConnection(connectionName) - - Parameter[] getTargetDatastoreParams = params(connectionNameParam) - if(declaringClassNode.getMethod(METHOD_GET_TARGET_DATASTORE, getTargetDatastoreParams) == null) { + if (declaringClassNode.getMethod(METHOD_GET_TARGET_DATASTORE, getTargetDatastoreParams) == null) { MethodNode mn = declaringClassNode.addMethod(METHOD_GET_TARGET_DATASTORE, Modifier.PROTECTED, datastoreType, getTargetDatastoreParams, null, ifElseS(notNullX(datastoreFieldVar), - returnS( callX( datastoreFieldVar, METHOD_GET_DATASTORE_FOR_CONNECTION, varX(connectionNameParam) ) ), + returnS(callX(datastoreFieldVar, METHOD_GET_DATASTORE_FOR_CONNECTION, varX(connectionNameParam))), returnS(datastoreLookupCall) )) - if(!isSpockTest) { + if (!isSpockTest) { compileMethodStatically(source, mn) } } - if(declaringClassNode.getMethod(METHOD_GET_TARGET_DATASTORE, ZERO_PARAMETERS) == null) { + if (declaringClassNode.getMethod(METHOD_GET_TARGET_DATASTORE, ZERO_PARAMETERS) == null) { MethodNode mn = declaringClassNode.addMethod(METHOD_GET_TARGET_DATASTORE, Modifier.PROTECTED, datastoreType, ZERO_PARAMETERS, null, - ifElseS( notNullX(datastoreFieldVar ), + ifElseS(notNullX(datastoreFieldVar), returnS(datastoreFieldVar), returnS(datastoreLookupDefaultCall)) ) - if(!isSpockTest) { + if (!isSpockTest) { compileMethodStatically(source, mn) } @@ -196,8 +214,6 @@ abstract class AbstractDatastoreMethodDecoratingTransformation extends AbstractM } - - } protected void weaveSetTargetDatastoreBody(SourceUnit source, AnnotationNode annotationNode, ClassNode declaringClassNode, Expression datastoreVar, BlockStatement setTargetDatastoreBody) { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractGormASTTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractGormASTTransformation.groovy index 84538e9249c..6749943ed51 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractGormASTTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractGormASTTransformation.groovy @@ -28,6 +28,7 @@ import org.codehaus.groovy.control.CompilationUnit import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.ASTTransformation import org.codehaus.groovy.transform.AbstractASTTransformation + import org.grails.datastore.mapping.core.Ordered /** diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractMethodDecoratingTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractMethodDecoratingTransformation.groovy index 33e57cc0c5c..4ec411ce4f0 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractMethodDecoratingTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractMethodDecoratingTransformation.groovy @@ -18,9 +18,21 @@ */ package org.grails.datastore.gorm.transform +import java.beans.Introspector +import java.lang.reflect.Modifier + import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.* -import org.codehaus.groovy.ast.expr.* +import org.codehaus.groovy.ast.ASTNode +import org.codehaus.groovy.ast.AnnotatedNode +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.Parameter +import org.codehaus.groovy.ast.VariableScope +import org.codehaus.groovy.ast.expr.ArgumentListExpression +import org.codehaus.groovy.ast.expr.ClosureExpression +import org.codehaus.groovy.ast.expr.Expression +import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement import org.codehaus.groovy.ast.tools.GenericsUtils @@ -29,16 +41,34 @@ import org.codehaus.groovy.control.ErrorCollector import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.sc.StaticCompileTransformation import org.codehaus.groovy.transform.trait.Traits -import org.grails.datastore.mapping.reflect.NameUtils import jakarta.annotation.PostConstruct import jakarta.annotation.PreDestroy -import java.beans.Introspector -import java.lang.reflect.Modifier -import static org.codehaus.groovy.ast.ClassHelper.* -import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.* -import static org.grails.datastore.mapping.reflect.AstUtils.* +import org.grails.datastore.mapping.reflect.NameUtils + +import static org.codehaus.groovy.ast.ClassHelper.VOID_TYPE +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.block +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.castX +import static org.codehaus.groovy.ast.tools.GeneralUtils.closureX +import static org.codehaus.groovy.ast.tools.GeneralUtils.returnS +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX +import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.paramsForArgs +import static org.grails.datastore.mapping.reflect.AstUtils.COMPILE_STATIC_TYPE +import static org.grails.datastore.mapping.reflect.AstUtils.EMPTY_CLASS_ARRAY +import static org.grails.datastore.mapping.reflect.AstUtils.TYPE_CHECKED_TYPE +import static org.grails.datastore.mapping.reflect.AstUtils.addAnnotationIfNecessary +import static org.grails.datastore.mapping.reflect.AstUtils.copyParameters +import static org.grails.datastore.mapping.reflect.AstUtils.findAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.hasAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.hasJunitAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.isGetter +import static org.grails.datastore.mapping.reflect.AstUtils.isSetter +import static org.grails.datastore.mapping.reflect.AstUtils.isSpockTest +import static org.grails.datastore.mapping.reflect.AstUtils.processVariableScopes /** * An abstract implementation for transformations that decorate a method invocation such that @@ -51,8 +81,8 @@ import static org.grails.datastore.mapping.reflect.AstUtils.* @CompileStatic abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTransformation { - private static final Set METHOD_NAME_EXCLUDES = new HashSet(Arrays.asList("afterPropertiesSet", "destroy")) - private static final Set ANNOTATION_NAME_EXCLUDES = new HashSet(Arrays.asList(PostConstruct.class.getName(), PreDestroy.class.getName(), "grails.web.controllers.ControllerMethod")) + private static final Set METHOD_NAME_EXCLUDES = new HashSet(Arrays.asList('afterPropertiesSet', 'destroy')) + private static final Set ANNOTATION_NAME_EXCLUDES = new HashSet(Arrays.asList(PostConstruct.getName(), PreDestroy.getName(), 'grails.web.controllers.ControllerMethod')) /** * Key used to store within the original method node metadata, all previous decorated methods */ @@ -60,20 +90,19 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra @Override void visit(SourceUnit source, AnnotationNode annotationNode, AnnotatedNode annotatedNode) { - if(annotatedNode instanceof MethodNode) { - MethodNode methodNode = (MethodNode)annotatedNode + if (annotatedNode instanceof MethodNode) { + MethodNode methodNode = (MethodNode) annotatedNode Map genericsSpec = GenericsUtils.createGenericsSpec(methodNode.declaringClass) weaveNewMethod(source, annotationNode, methodNode.getDeclaringClass(), methodNode, genericsSpec) } - else if(annotatedNode instanceof ClassNode) { + else if (annotatedNode instanceof ClassNode) { ClassNode classNode = (ClassNode) annotatedNode - if(!classNode.isInterface()) { - weaveClassNode( source, annotationNode, classNode) + if (!classNode.isInterface()) { + weaveClassNode(source, annotationNode, classNode) } } } - protected void weaveClassNode(SourceUnit source, AnnotationNode annotationNode, ClassNode classNode) { enhanceClassNode(source, annotationNode, classNode) Map genericsSpec = GenericsUtils.createGenericsSpec(classNode) @@ -101,7 +130,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra if (startsWithSpock && methodName.endsWith('proc')) continue - if (md.getAnnotations().any { AnnotationNode an -> an.classNode.name == "org.spockframework.runtime.model.DataProviderMetadata" }) { + if (md.getAnnotations().any { AnnotationNode an -> an.classNode.name == 'org.spockframework.runtime.model.DataProviderMetadata' }) { continue } @@ -116,9 +145,9 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra } // don't apply to methods added by traits - if (hasAnnotation(md, Traits.TraitBridge.class)) continue + if (hasAnnotation(md, Traits.TraitBridge)) continue // ignore methods that delegate to each other - if (hasAnnotation(md, "grails.compiler.DelegatingMethod")) continue + if (hasAnnotation(md, 'grails.compiler.DelegatingMethod')) continue weaveNewMethod(source, annotationNode, classNode, md, genericsSpec) } else if (isTestSetupOrCleanup(classNode, md)) { @@ -140,7 +169,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra protected boolean isTestSetupOrCleanup(ClassNode classNode, MethodNode md) { String methodName = md.getName() - return (("setup".equals(methodName) || "cleanup".equals(methodName)) && isSpockTest(classNode)) || + return (('setup'.equals(methodName) || 'cleanup'.equals(methodName)) && isSpockTest(classNode)) || hasJunitAnnotation(md) } @@ -161,10 +190,10 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra */ protected MethodNode weaveNewMethod(SourceUnit sourceUnit, AnnotationNode annotationNode, ClassNode classNode, MethodNode methodNode, Map genericsSpec) { Object appliedMarker = getAppliedMarker() - if ( methodNode.getNodeMetaData(appliedMarker) == appliedMarker ) { + if (methodNode.getNodeMetaData(appliedMarker) == appliedMarker) { return methodNode } - if( methodNode.isAbstract() ) { + if (methodNode.isAbstract()) { return methodNode } @@ -172,11 +201,10 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra enhanceClassNode(sourceUnit, annotationNode, classNode) - // Move the existing logic into a new method called "$tt_methodName()" String renamedMethodName boolean superMethod = findAnnotation(methodNode, Override) || classNode.getSuperClass()?.getMethod(methodNode.name, methodNode.parameters) != null - if(superMethod) { + if (superMethod) { renamedMethodName = getRenamedMethodPrefix() + Introspector.decapitalize(classNode.nameWithoutPackage) + '_' + methodNode.getName() } else { @@ -190,7 +218,6 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra // Start constructing new method body BlockStatement methodBody = block() - Expression executeMethodCallExpression = buildDelegatingMethodCall( sourceUnit, annotationNode, @@ -200,7 +227,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra methodBody ) - if(methodNode.getReturnType() != VOID_TYPE) { + if (methodNode.getReturnType() != VOID_TYPE) { methodBody.addStatement( returnS( castX(methodNode.getReturnType(), executeMethodCallExpression) @@ -214,7 +241,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra methodNode.setCode(methodBody) processVariableScopes(sourceUnit, classNode, methodNode) - if(!isSpockTest(classNode)) { + if (!isSpockTest(classNode)) { compileMethodStatically(sourceUnit, methodNode) } return renamedMethod @@ -255,7 +282,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra * @param originalMethodCall The original method call to delegate to * @return The MethodCallExpression */ - protected MethodCallExpression makeDelegatingClosureCall(Expression targetObject, String executeMethodName, Parameter[] closureParameters, MethodCallExpression originalMethodCall, VariableScope variableScope ) { + protected MethodCallExpression makeDelegatingClosureCall(Expression targetObject, String executeMethodName, Parameter[] closureParameters, MethodCallExpression originalMethodCall, VariableScope variableScope) { return makeDelegatingClosureCall(targetObject, executeMethodName, new ArgumentListExpression(), closureParameters, originalMethodCall, variableScope) } @@ -268,7 +295,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra * @param originalMethodCall The original method call to delegate to * @return The MethodCallExpression */ - protected MethodCallExpression makeDelegatingClosureCall(Expression targetObject, String executeMethodName, ArgumentListExpression arguments, Parameter[] closureParameters, MethodCallExpression originalMethodCall, VariableScope variableScope ) { + protected MethodCallExpression makeDelegatingClosureCall(Expression targetObject, String executeMethodName, ArgumentListExpression arguments, Parameter[] closureParameters, MethodCallExpression originalMethodCall, VariableScope variableScope) { final ClosureExpression closureExpression = closureX(closureParameters, createDelegingMethodBody(closureParameters, originalMethodCall)) closureExpression.setVariableScope( variableScope @@ -290,7 +317,6 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra return stmt(originalMethodCall) } - protected MethodNode moveOriginalCodeToNewMethod(MethodNode methodNode, String renamedMethodName, Parameter[] newParameters, ClassNode classNode, SourceUnit source, Map genericsSpec) { Statement body = methodNode.code @@ -302,14 +328,13 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra body ) - List decoratedMethods = (List)methodNode.getNodeMetaData(DECORATED_METHODS) - if(decoratedMethods == null) { + List decoratedMethods = (List) methodNode.getNodeMetaData(DECORATED_METHODS) + if (decoratedMethods == null) { decoratedMethods = [] methodNode.putNodeMetaData(DECORATED_METHODS, decoratedMethods) } decoratedMethods.add(renamedMethodNode) - def newVariableScope = new VariableScope() for (p in newParameters) { newVariableScope.putDeclaredVariable(p) @@ -329,7 +354,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra classNode.addMethod(renamedMethodNode) // Use a dummy source unit to process the variable scopes to avoid the issue where this is run twice producing an error - VariableScopeVisitor scopeVisitor = new VariableScopeVisitor(new SourceUnit("dummy", "dummy", source.getConfiguration(), source.getClassLoader(), new ErrorCollector(source.getConfiguration()))) + VariableScopeVisitor scopeVisitor = new VariableScopeVisitor(new SourceUnit('dummy', 'dummy', source.getConfiguration(), source.getClassLoader(), new ErrorCollector(source.getConfiguration()))) if (methodNode == null) { scopeVisitor.visitClass(classNode) } else { @@ -341,7 +366,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra } protected MethodCallExpression buildCallToOriginalMethod(ClassNode classNode, MethodNode renamedMethodNode) { - final MethodCallExpression originalMethodCall = callX(varX("this", classNode), renamedMethodNode.name, args(renamedMethodNode.parameters)) + final MethodCallExpression originalMethodCall = callX(varX('this', classNode), renamedMethodNode.name, args(renamedMethodNode.parameters)) originalMethodCall.setImplicitThis(false) originalMethodCall.setMethodTarget(renamedMethodNode) @@ -360,7 +385,7 @@ abstract class AbstractMethodDecoratingTransformation extends AbstractGormASTTra protected boolean hasExcludedAnnotation(MethodNode md, Set excludes) { boolean excludedAnnotation = false for (AnnotationNode annotation : md.getAnnotations()) { - AnnotationNode gormTransform = findAnnotation( annotation.classNode, GormASTTransformationClass) + AnnotationNode gormTransform = findAnnotation(annotation.classNode, GormASTTransformationClass) if (gormTransform != null || excludes.contains(annotation.getClassNode().getName())) { excludedAnnotation = true break diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractTraitApplyingGormASTTransformation.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractTraitApplyingGormASTTransformation.groovy index b94b1c20b43..d072c511ad8 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractTraitApplyingGormASTTransformation.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AbstractTraitApplyingGormASTTransformation.groovy @@ -27,6 +27,7 @@ import org.codehaus.groovy.ast.GenericsType import org.codehaus.groovy.ast.tools.GenericsUtils import org.codehaus.groovy.control.SourceUnit import org.codehaus.groovy.transform.trait.TraitComposer + import org.grails.datastore.mapping.reflect.AstUtils /** @@ -41,15 +42,15 @@ abstract class AbstractTraitApplyingGormASTTransformation extends AbstractGormAS @Override void visit(SourceUnit source, AnnotationNode annotationNode, AnnotatedNode annotatedNode) { this.sourceUnit = source - if(annotatedNode instanceof ClassNode) { - visit(source, annotationNode, (ClassNode)annotatedNode) + if (annotatedNode instanceof ClassNode) { + visit(source, annotationNode, (ClassNode) annotatedNode) } } void visit(SourceUnit source, AnnotationNode annotationNode, ClassNode classNode) { this.sourceUnit = source Class traitJavaClass = getTraitClass() - if(shouldWeave(annotationNode, classNode)) { + if (shouldWeave(annotationNode, classNode)) { weaveTrait(classNode, source, traitJavaClass) } visitAfterTraitApplied(source, annotationNode, classNode) @@ -69,7 +70,7 @@ abstract class AbstractTraitApplyingGormASTTransformation extends AbstractGormAS protected void weaveTrait(ClassNode classNode, SourceUnit source, Class traitJavaClass, ClassNode... genericArguments) { weaveTraitWithGenerics(classNode, traitJavaClass, genericArguments) if (compilationUnit != null) { - TraitComposer.doExtendTraits(classNode, source, compilationUnit); + TraitComposer.doExtendTraits(classNode, source, compilationUnit) } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AstMethodDispatchUtils.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AstMethodDispatchUtils.groovy index 7d2470284f1..0a0d9a631ef 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AstMethodDispatchUtils.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AstMethodDispatchUtils.groovy @@ -51,7 +51,7 @@ class AstMethodDispatchUtils extends GeneralUtils { */ static MapExpression namedArgs(Map args) { def expression = new MapExpression() - for(entry in args) { + for (entry in args) { expression.addMapEntryExpression( new MapEntryExpression( constX(entry.key), @@ -68,7 +68,7 @@ class AstMethodDispatchUtils extends GeneralUtils { */ static MethodCallExpression callD(Class targetType, String var, String methodName, Expression arguments = ZERO_ARGUMENTS) { ClassNode targetNode = make(targetType) - callD( targetNode, var, methodName, arguments) + callD(targetNode, var, methodName, arguments) } /** @@ -111,29 +111,29 @@ class AstMethodDispatchUtils extends GeneralUtils { * @return The expression */ static MethodCallExpression callThisD(ClassNode thisType, String methodName, Expression arguments) { - MethodCallExpression methodCall = callX(varX("this", thisType), methodName, arguments) + MethodCallExpression methodCall = callX(varX('this', thisType), methodName, arguments) Parameter[] params = paramsForArgs(arguments) MethodNode mn = thisType.getDeclaredMethod(methodName, params) - if(mn != null) { + if (mn != null) { methodCall.setMethodTarget(mn) } return methodCall } static Parameter[] paramsForArgs(Expression expression) { - if(expression instanceof TupleExpression) { - TupleExpression te = (TupleExpression)expression + if (expression instanceof TupleExpression) { + TupleExpression te = (TupleExpression) expression List params = [] int i = 0 - for(exp in te.expressions) { + for (exp in te.expressions) { def type = exp instanceof ClassExpression ? ClassHelper.CLASS_Type : exp.type - params.add( param(type, "p${i++}")) + params.add(param(type, "p${i++}")) } return params as Parameter[] } else { def type = expression instanceof ClassExpression ? ClassHelper.CLASS_Type : expression.type - return params( param(type, "p")) + return params(param(type, 'p')) } } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AstPropertyResolveUtils.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AstPropertyResolveUtils.java index 9f9cb6ca7a1..4deeed44ea1 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AstPropertyResolveUtils.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/transform/AstPropertyResolveUtils.java @@ -19,21 +19,27 @@ package org.grails.datastore.gorm.transform; -import org.codehaus.groovy.ast.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.PropertyNode; import org.codehaus.groovy.ast.expr.ClassExpression; import org.codehaus.groovy.ast.expr.Expression; import org.codehaus.groovy.ast.expr.MapEntryExpression; import org.codehaus.groovy.ast.expr.MapExpression; + import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.datastore.mapping.reflect.AstUtils; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; import org.grails.datastore.mapping.reflect.NameUtils; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - /** * Utilities for resolving property names from domain classes etc. * @@ -51,7 +57,7 @@ public class AstPropertyResolveUtils { * @return The type */ public static ClassNode getPropertyType(ClassNode classNode, String propertyName) { - if(propertyName == null || propertyName.length() == 0) { + if (propertyName == null || propertyName.length() == 0) { return null; } Map cachedProperties = getPropertiesFromCache(classNode); @@ -93,7 +99,7 @@ private static Map getPropertiesFromCache(ClassNode classNode if (cachedProperties == null) { cachedProperties = new HashMap<>(); boolean isDomainClass = AstUtils.isDomainClass(classNode); - if(isDomainClass) { + if (isDomainClass) { cachedProperties.put(GormProperties.IDENTITY, new ClassNode(Long.class)); cachedProperties.put(GormProperties.VERSION, new ClassNode(Long.class)); } @@ -111,9 +117,9 @@ private static void populatePropertiesForClassNode(ClassNode classNode, Map astTransformations = collectAndOrderGormTransformations(annotatedNode) - for(transform in astTransformations) { + for (transform in astTransformations) { transform.invoke(source, annotatedNode) } } Iterable collectAndOrderGormTransformations(AnnotatedNode annotatedNode) { List annotations = new ArrayList<>(annotatedNode.getAnnotations()) - if(annotatedNode instanceof MethodNode) { - MethodNode mn = (MethodNode)annotatedNode - for(classAnn in mn.getDeclaringClass().getAnnotations()) { - if(!annotations.any() { AnnotationNode ann -> + if (annotatedNode instanceof MethodNode) { + MethodNode mn = (MethodNode) annotatedNode + for (classAnn in mn.getDeclaringClass().getAnnotations()) { + if (!annotations.any() { AnnotationNode ann -> ann.classNode.name == classAnn.classNode.name || findTransformName(ann) == findTransformName(classAnn) }) { @@ -80,16 +81,16 @@ class OrderedGormTransformation extends AbstractASTTransformation implements Com } } List transforms = [] - for(ann in annotations) { + for (ann in annotations) { String transformName = findTransformName(ann) - if(transformName) { + if (transformName) { try { def newTransform = ClassUtils.forName(transformName).newInstance() - if(newTransform instanceof ASTTransformation) { - if(newTransform instanceof CompilationUnitAware) { - ((CompilationUnitAware) newTransform).setCompilationUnit( compilationUnit ) + if (newTransform instanceof ASTTransformation) { + if (newTransform instanceof CompilationUnitAware) { + ((CompilationUnitAware) newTransform).setCompilationUnit(compilationUnit) } - transforms.add( new TransformationInvocation(ann, newTransform) ) + transforms.add(new TransformationInvocation(ann, newTransform)) } } catch (Throwable e) { addError("Could not load GORM transform for name [$transformName]: $e.message", annotatedNode) @@ -103,7 +104,7 @@ class OrderedGormTransformation extends AbstractASTTransformation implements Com protected String findTransformName(AnnotationNode ann) { AnnotationNode gormTransform = findAnnotation(ann.classNode, GormASTTransformationClass) - String transformName = gormTransform?.getMember("value")?.text + String transformName = gormTransform?.getMember('value')?.text transformName } @@ -122,7 +123,7 @@ class OrderedGormTransformation extends AbstractASTTransformation implements Com } void invoke(SourceUnit sourceUnit, AnnotatedNode annotatedNode) { - transform.visit( [annotation, annotatedNode] as ASTNode[], sourceUnit) + transform.visit([annotation, annotatedNode] as ASTNode[], sourceUnit) } } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/utils/ClasspathEntityScanner.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/utils/ClasspathEntityScanner.groovy index b180ea815d4..6596d8574f8 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/utils/ClasspathEntityScanner.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/utils/ClasspathEntityScanner.groovy @@ -18,16 +18,18 @@ */ package org.grails.datastore.gorm.utils -import grails.gorm.annotation.Entity +import java.lang.annotation.Annotation + import groovy.transform.CompileStatic import groovy.util.logging.Slf4j -import org.grails.datastore.mapping.reflect.ClassUtils + import org.springframework.beans.factory.config.BeanDefinition import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider import org.springframework.core.type.classreading.SimpleMetadataReaderFactory import org.springframework.core.type.filter.AnnotationTypeFilter -import java.lang.annotation.Annotation +import grails.gorm.annotation.Entity +import org.grails.datastore.mapping.reflect.ClassUtils /** * Utility class for scanning the classpath for entities @@ -55,9 +57,9 @@ class ClasspathEntityScanner { List ignoredPackages = ['com', 'net', '', 'org', 'java', 'javax', 'jakarta', 'groovy'] ClasspathEntityScanner() { - if(ClassUtils.isPresent("grails.persistence.Entity")) { + if (ClassUtils.isPresent('grails.persistence.Entity')) { try { - annotations.add((Class)Class.forName("grails.persistence.Entity") ) + annotations.add((Class) Class.forName('grails.persistence.Entity')) } catch (Throwable e) { log.error("Annotation [grails.persistence.Entity] found on classpath, but could not be loaded: ${e.message}", e) } @@ -72,19 +74,19 @@ class ClasspathEntityScanner { Class[] scan(Package... packages) { ClassPathScanningCandidateComponentProvider componentProvider = new ClassPathScanningCandidateComponentProvider(false) componentProvider.setMetadataReaderFactory(new SimpleMetadataReaderFactory(classLoader)) - for(ann in annotations) { + for (ann in annotations) { componentProvider.addIncludeFilter(new AnnotationTypeFilter(ann)) } Collection classes = new HashSet<>() - for(Package p in packages) { + for (Package p in packages) { def packageName = p.name - if(ignoredPackages.contains(packageName)) { - log.error("Package [$packageName] will not be scanned as it is too generic and will slow down startup time. Use a more specific package") + if (ignoredPackages.contains(packageName)) { + log.error('Package [{}] will not be scanned as it is too generic and will slow down startup time. Use a more specific package', packageName) } else { for (BeanDefinition candidate in componentProvider.findCandidateComponents(packageName)) { - Class persistentEntity = Class.forName(candidate.beanClassName, false, classLoader ) - classes.add persistentEntity + Class persistentEntity = Class.forName(candidate.beanClassName, false, classLoader) + classes.add(persistentEntity) } } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/ValidatorProvider.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/ValidatorProvider.groovy index 5b962807d10..2986ba2d699 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/ValidatorProvider.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/ValidatorProvider.groovy @@ -20,7 +20,6 @@ package org.grails.datastore.gorm.validation import org.springframework.validation.Validator - /** * A class that provides a validator * @@ -28,8 +27,9 @@ import org.springframework.validation.Validator * @since 5.0 */ interface ValidatorProvider { + /** * @return The validator */ Validator getValidator() -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MappingContextAwareConstraintFactory.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MappingContextAwareConstraintFactory.groovy index 78f88ca4110..c25501ec391 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MappingContextAwareConstraintFactory.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MappingContextAwareConstraintFactory.groovy @@ -19,10 +19,11 @@ package org.grails.datastore.gorm.validation.constraints +import org.springframework.context.MessageSource + import grails.gorm.validation.Constraint import org.grails.datastore.gorm.validation.constraints.factory.DefaultConstraintFactory import org.grails.datastore.mapping.model.MappingContext -import org.springframework.context.MessageSource /** * A constraint that restricts constraints to be applicable only to a given {@link org.grails.datastore.mapping.model.MappingContext} @@ -31,6 +32,7 @@ import org.springframework.context.MessageSource * @since 6.0 */ class MappingContextAwareConstraintFactory extends DefaultConstraintFactory { + final MappingContext mappingContext MappingContextAwareConstraintFactory(Class constraintClass, MessageSource messageSource, MappingContext mappingContext, List targetTypes = [Object]) { @@ -40,7 +42,7 @@ class MappingContextAwareConstraintFactory extends DefaultConstraintFactory { @Override Constraint build(Class owner, String property, Object constrainingValue) { - if(mappingContext.getPersistentEntity(owner.name) != null) { + if (mappingContext.getPersistentEntity(owner.name) != null) { return super.build(owner, property, constrainingValue) } return null diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/constraints/builtin/UniqueConstraint.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/constraints/builtin/UniqueConstraint.groovy index d2f8b863877..7dced16fc74 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/constraints/builtin/UniqueConstraint.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/constraints/builtin/UniqueConstraint.groovy @@ -19,8 +19,12 @@ package org.grails.datastore.gorm.validation.constraints.builtin -import grails.gorm.DetachedCriteria import groovy.transform.CompileStatic + +import org.springframework.context.MessageSource +import org.springframework.validation.Errors + +import grails.gorm.DetachedCriteria import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.validation.constraints.AbstractConstraint import org.grails.datastore.mapping.dirty.checking.DirtyCheckable @@ -31,8 +35,6 @@ import org.grails.datastore.mapping.model.types.Association import org.grails.datastore.mapping.model.types.ToOne import org.grails.datastore.mapping.proxy.ProxyHandler import org.grails.datastore.mapping.reflect.EntityReflector -import org.springframework.context.MessageSource -import org.springframework.validation.Errors /** * A constraint that validates for the presence of an existing object (uniqueness) @@ -44,18 +46,18 @@ import org.springframework.validation.Errors @CompileStatic class UniqueConstraint extends AbstractConstraint { - public static final String NAME = "unique" + public static final String NAME = 'unique' protected List group = [] UniqueConstraint(Class constraintOwningClass, String constraintPropertyName, Object constraintParameter, MessageSource messageSource) { super(constraintOwningClass, constraintPropertyName, constraintParameter, messageSource) - if(constraintParameter instanceof Iterable) { - for(property in ((Iterable)constraintParameter)) { + if (constraintParameter instanceof Iterable) { + for (property in ((Iterable) constraintParameter)) { group.add(property.toString()) } } - else if(constraintParameter instanceof CharSequence) { + else if (constraintParameter instanceof CharSequence) { group.add(constraintParameter.toString()) } } @@ -88,37 +90,37 @@ class UniqueConstraint extends AbstractConstraint { property = targetEntity.getPropertyByName(constraintPropertyName) } } - constraintClass = targetEntity != null? targetEntity.javaClass: constraintClass + constraintClass = targetEntity != null ? targetEntity.javaClass : constraintClass } // Re-create the detached criteria based on the new constraint class detachedCriteria = new DetachedCriteria(constraintClass) - if(targetEntity == null) { + if (targetEntity == null) { throw new IllegalStateException("Cannot validate object [$target]. It is not a persistent entity") } EntityReflector reflector = targetEntity.reflector String constraintPropertyName = this.constraintPropertyName List group = this.group - - if(target instanceof DirtyCheckable) { + + if (target instanceof DirtyCheckable) { Boolean anyChanges = target.hasChanged(constraintPropertyName) - for(prop in group) { + for (prop in group) { anyChanges |= target.hasChanged(prop.toString()) } - if(!anyChanges) { + if (!anyChanges) { return } } PersistentProperty persistentProperty = targetEntity.getPropertyByName(constraintPropertyName) boolean isToOne = persistentProperty instanceof ToOne - if(isToOne) { + if (isToOne) { PersistentEntity association = ((Association) persistentProperty).getAssociatedEntity() if (!association.mappingContext.proxyHandler.isProxy(propertyValue)) { def associationId = association.reflector.getIdentifier(propertyValue) - if(associationId == null) { + if (associationId == null) { // unsaved entity return } @@ -154,7 +156,7 @@ class UniqueConstraint extends AbstractConstraint { continue } } - eq propName, value + eq(propName, value) } } } @@ -176,14 +178,13 @@ class UniqueConstraint extends AbstractConstraint { } if (targetId != existingId) { def args = [constraintPropertyName, constraintOwningClass, propertyValue] as Object[] - rejectValue(target, errors, "unique", args, getDefaultMessage("default.not.unique.message")) + rejectValue(target, errors, 'unique', args, getDefaultMessage('default.not.unique.message')) } } } } } - @Override boolean supports(Class type) { return true diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/ConfigurableParameterNameProvider.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/ConfigurableParameterNameProvider.groovy index fe3f11c7b51..50c705d18ef 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/ConfigurableParameterNameProvider.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/ConfigurableParameterNameProvider.groovy @@ -19,11 +19,12 @@ package org.grails.datastore.gorm.validation.jakarta +import java.lang.reflect.Constructor +import java.lang.reflect.Method + import groovy.transform.CompileStatic import jakarta.validation.ParameterNameProvider -import java.lang.reflect.Constructor -import java.lang.reflect.Method /** * A configurable parameter name provider @@ -32,9 +33,9 @@ import java.lang.reflect.Method * @since 6.1 */ @CompileStatic -class ConfigurableParameterNameProvider implements ParameterNameProvider{ +class ConfigurableParameterNameProvider implements ParameterNameProvider { - public static final String PREFIX = "arg" + public static final String PREFIX = 'arg' private Map> parameterNames = [:] /** @@ -45,7 +46,7 @@ class ConfigurableParameterNameProvider implements ParameterNameProvider{ * @param parameterNames The parameter names */ void addParameterNames(String methodName, Class[] parameterTypes, List names) { - if(methodName != null && parameterTypes != null && names != null) { + if (methodName != null && parameterTypes != null && names != null) { parameterNames.put(new MethodKey(methodName, parameterTypes), names) } } @@ -53,8 +54,8 @@ class ConfigurableParameterNameProvider implements ParameterNameProvider{ @Override List getParameterNames(Constructor constructor) { Class[] parameterTypes = constructor.parameterTypes - List existing = parameterNames.get(new MethodKey("", parameterTypes)) - if(existing != null) { + List existing = parameterNames.get(new MethodKey('', parameterTypes)) + if (existing != null) { return existing } else { @@ -67,7 +68,7 @@ class ConfigurableParameterNameProvider implements ParameterNameProvider{ List getParameterNames(Method method) { Class[] parameterTypes = method.parameterTypes List existing = parameterNames.get(new MethodKey(method.name, parameterTypes)) - if(existing != null) { + if (existing != null) { return existing } else { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/ConstraintViolationUtils.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/ConstraintViolationUtils.groovy index 65d58a1866c..1c2d4d1e26e 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/ConstraintViolationUtils.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/ConstraintViolationUtils.groovy @@ -19,14 +19,16 @@ package org.grails.datastore.gorm.validation.jakarta -import grails.gorm.services.Service import groovy.transform.CompileStatic -import org.springframework.validation.Errors -import org.springframework.validation.MapBindingResult import jakarta.validation.ConstraintViolation import jakarta.validation.ConstraintViolationException +import org.springframework.validation.Errors +import org.springframework.validation.MapBindingResult + +import grails.gorm.services.Service + /** * Utility methods for handling ConstraintViolationException * diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/GormValidatorAdapter.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/GormValidatorAdapter.groovy index c04b208a2fa..fce376c31ab 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/GormValidatorAdapter.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/GormValidatorAdapter.groovy @@ -21,13 +21,15 @@ package org.grails.datastore.gorm.validation.jakarta import groovy.transform.CompileDynamic import groovy.transform.CompileStatic -import org.grails.datastore.gorm.GormValidateable -import org.springframework.validation.beanvalidation.SpringValidatorAdapter import jakarta.validation.ConstraintViolation import jakarta.validation.Validator import jakarta.validation.executable.ExecutableValidator +import org.springframework.validation.beanvalidation.SpringValidatorAdapter + +import org.grails.datastore.gorm.GormValidateable + /** * A validator adapter that applies translates the constraint errors into the Errors object of a GORM entity * @@ -47,7 +49,7 @@ class GormValidatorAdapter extends SpringValidatorAdapter { @Override def Set> validate(T object, Class[] groups) { def constraintViolations = super.validate(object, groups) - if(object instanceof GormValidateable) { + if (object instanceof GormValidateable) { def errors = ((GormValidateable) object).getErrors() processConstraintViolations(constraintViolations, errors) } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/GormValidatorFactoryAdapter.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/GormValidatorFactoryAdapter.groovy index 7b2d3277194..47b6f148e59 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/GormValidatorFactoryAdapter.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/GormValidatorFactoryAdapter.groovy @@ -137,7 +137,7 @@ class GormValidatorFactoryAdapter implements ValidatorFactory { @Override Validator getValidator() { - return new GormValidatorAdapter( delegate.getValidator() ) + return new GormValidatorAdapter(delegate.getValidator()) } } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/JakartaValidatorRegistry.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/JakartaValidatorRegistry.groovy index ef4e2f4a9cd..3c3ed0aaa69 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/JakartaValidatorRegistry.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/JakartaValidatorRegistry.groovy @@ -20,19 +20,6 @@ package org.grails.datastore.gorm.validation.jakarta import groovy.transform.CompileStatic -import org.grails.datastore.gorm.validation.constraints.registry.DefaultValidatorRegistry -import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings -import org.grails.datastore.mapping.model.MappingContext -import org.grails.datastore.mapping.model.PersistentEntity -import org.grails.datastore.mapping.reflect.ClassUtils -import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator -import org.springframework.context.ApplicationContext -import org.springframework.context.MessageSource -import org.springframework.context.support.StaticMessageSource -import org.springframework.validation.Validator -import org.springframework.validation.annotation.Validated -import org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator -import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory import jakarta.validation.ClockProvider import jakarta.validation.Configuration @@ -44,6 +31,22 @@ import jakarta.validation.Validation import jakarta.validation.ValidatorContext import jakarta.validation.ValidatorFactory +import org.hibernate.validator.messageinterpolation.ResourceBundleMessageInterpolator + +import org.springframework.context.ApplicationContext +import org.springframework.context.MessageSource +import org.springframework.context.support.StaticMessageSource +import org.springframework.validation.Validator +import org.springframework.validation.annotation.Validated +import org.springframework.validation.beanvalidation.MessageSourceResourceBundleLocator +import org.springframework.validation.beanvalidation.SpringConstraintValidatorFactory + +import org.grails.datastore.gorm.validation.constraints.registry.DefaultValidatorRegistry +import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings +import org.grails.datastore.mapping.model.MappingContext +import org.grails.datastore.mapping.model.PersistentEntity +import org.grails.datastore.mapping.reflect.ClassUtils + /** * A validator registry that creates validators * @@ -111,10 +114,10 @@ class JakartaValidatorRegistry extends DefaultValidatorRegistry implements Valid @Override Validator getValidator(PersistentEntity entity) { def ann = entity.javaClass.getAnnotation(Validated) - if(ann != null && isAvailable()) { + if (ann != null && isAvailable()) { def validator = validatorFactory.getValidator() - if(validator instanceof GormValidatorAdapter) { - return (Validator)validator + if (validator instanceof GormValidatorAdapter) { + return (Validator) validator } else { return new GormValidatorAdapter(validator) @@ -174,6 +177,6 @@ class JakartaValidatorRegistry extends DefaultValidatorRegistry implements Valid * @return Whether jakarta.validation is available */ static boolean isAvailable() { - ClassUtils.isPresent("jakarta.validation.Validation") + ClassUtils.isPresent('jakarta.validation.Validation') } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/MappingContextTraversableResolver.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/MappingContextTraversableResolver.groovy index 40b23a6a89f..c70c6218a3c 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/MappingContextTraversableResolver.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/MappingContextTraversableResolver.groovy @@ -19,17 +19,19 @@ package org.grails.datastore.gorm.validation.jakarta +import java.lang.annotation.ElementType + import groovy.transform.CompileStatic + +import jakarta.validation.Path +import jakarta.validation.TraversableResolver + import org.grails.datastore.mapping.model.MappingContext import org.grails.datastore.mapping.model.PersistentEntity import org.grails.datastore.mapping.model.PersistentProperty import org.grails.datastore.mapping.model.types.Association import org.grails.datastore.mapping.proxy.ProxyHandler -import jakarta.validation.Path -import jakarta.validation.TraversableResolver -import java.lang.annotation.ElementType - /** * A {@link TraversableResolver} that uses the {@link MappingContext} to establish whether validation can cascade * @@ -56,14 +58,14 @@ class MappingContextTraversableResolver implements TraversableResolver { boolean isCascadable(Object traversableObject, Path.Node traversableProperty, Class rootBeanType, Path pathToTraversableObject, ElementType elementType) { Class type = proxyHandler.getProxiedClass(traversableObject) PersistentEntity entity = mappingContext.getPersistentEntity(type.name) - if(entity != null) { + if (entity != null) { PersistentEntity currentEntity = entity - for(Path.Node n in pathToTraversableObject) { - if(currentEntity == null) break + for (Path.Node n in pathToTraversableObject) { + if (currentEntity == null) break PersistentProperty prop = currentEntity.getPropertyByName(n.name) - if(prop instanceof Association) { - Association association = (Association)prop - if(association.isOwningSide()) { + if (prop instanceof Association) { + Association association = (Association) prop + if (association.isOwningSide()) { currentEntity = association.associatedEntity } else { @@ -74,7 +76,7 @@ class MappingContextTraversableResolver implements TraversableResolver { currentEntity = null } } - if(currentEntity != null) { + if (currentEntity != null) { return true } } diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/services/ValidatedService.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/services/ValidatedService.groovy index 28a17bdfb1e..f5c4d513078 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/services/ValidatedService.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/services/ValidatedService.groovy @@ -19,12 +19,9 @@ package org.grails.datastore.gorm.validation.jakarta.services +import java.lang.reflect.Method + import groovy.transform.CompileStatic -import org.grails.datastore.gorm.validation.jakarta.ConstraintViolationUtils -import org.grails.datastore.gorm.validation.jakarta.JakartaValidatorRegistry -import org.grails.datastore.mapping.services.Service -import org.grails.datastore.mapping.validation.ValidationException -import org.springframework.validation.Errors import jakarta.validation.Configuration import jakarta.validation.ConstraintViolation @@ -33,7 +30,13 @@ import jakarta.validation.ParameterNameProvider import jakarta.validation.Validation import jakarta.validation.ValidatorFactory import jakarta.validation.executable.ExecutableValidator -import java.lang.reflect.Method + +import org.springframework.validation.Errors + +import org.grails.datastore.gorm.validation.jakarta.ConstraintViolationUtils +import org.grails.datastore.gorm.validation.jakarta.JakartaValidatorRegistry +import org.grails.datastore.mapping.services.Service +import org.grails.datastore.mapping.validation.ValidationException /** * A service that is validated by jakarta.validation @@ -61,10 +64,10 @@ trait ValidatedService extends Service { * @return The validator factory for this service */ ValidatorFactory getValidatorFactory() { - if(validatorFactoryInstance == null) { + if (validatorFactoryInstance == null) { Configuration configuration - if(datastore != null) { + if (datastore != null) { configuration = JakartaValidatorRegistry.buildConfigurationFor( datastore.mappingContext, datastore.mappingContext.validatorRegistry.messageSource @@ -75,7 +78,7 @@ trait ValidatedService extends Service { .configure() configuration = configuration.ignoreXmlConfiguration() } - if(parameterNameProvider != null) { + if (parameterNameProvider != null) { configuration = configuration.parameterNameProvider(parameterNameProvider) } validatorFactoryInstance = configuration.buildValidatorFactory() @@ -95,7 +98,7 @@ trait ValidatedService extends Service { void jakartaValidate(Object instance, Method method, Object...args) throws ConstraintViolationException { ExecutableValidator validator = executableValidatorMap.get(method) Set> constraintViolations = validator.validateParameters(instance, method, args) - if(!constraintViolations.isEmpty()) { + if (!constraintViolations.isEmpty()) { throw new ConstraintViolationException(constraintViolations) } } @@ -112,7 +115,7 @@ trait ValidatedService extends Service { void validate(Object instance, Method method, Object...args) throws ValidationException { ExecutableValidator validator = executableValidatorMap.get(method) Set> constraintViolations = validator.validateParameters(instance, method, args) - if(!constraintViolations.isEmpty()) { + if (!constraintViolations.isEmpty()) { throw ValidationException.newInstance("Validation failed for method: $method.name ", asErrors(instance, constraintViolations)) } } @@ -138,4 +141,4 @@ trait ValidatedService extends Service { Errors asErrors(Object object, Set constraintViolations) { ConstraintViolationUtils.asErrors(object, constraintViolations) } -} \ No newline at end of file +} diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/services/implementers/MethodValidationImplementer.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/services/implementers/MethodValidationImplementer.groovy index 0a61fa7c16c..3b3e78da839 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/services/implementers/MethodValidationImplementer.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/jakarta/services/implementers/MethodValidationImplementer.groovy @@ -19,27 +19,52 @@ package org.grails.datastore.gorm.validation.jakarta.services.implementers +import java.lang.reflect.Method +import java.lang.reflect.Modifier + import groovy.transform.CompileStatic -import org.codehaus.groovy.ast.* -import org.codehaus.groovy.ast.expr.* +import org.codehaus.groovy.ast.AnnotationNode +import org.codehaus.groovy.ast.ClassNode +import org.codehaus.groovy.ast.ConstructorNode +import org.codehaus.groovy.ast.FieldNode +import org.codehaus.groovy.ast.InnerClassNode +import org.codehaus.groovy.ast.MethodNode +import org.codehaus.groovy.ast.ModuleNode +import org.codehaus.groovy.ast.Parameter +import org.codehaus.groovy.ast.expr.ArgumentListExpression +import org.codehaus.groovy.ast.expr.ArrayExpression +import org.codehaus.groovy.ast.expr.Expression +import org.codehaus.groovy.ast.expr.ListExpression +import org.codehaus.groovy.ast.expr.MethodCallExpression import org.codehaus.groovy.ast.stmt.BlockStatement import org.codehaus.groovy.ast.stmt.Statement + +import jakarta.validation.Constraint +import jakarta.validation.ConstraintViolationException +import jakarta.validation.ParameterNameProvider + import org.grails.datastore.gorm.services.ServiceEnhancer import org.grails.datastore.gorm.transform.AbstractTraitApplyingGormASTTransformation import org.grails.datastore.gorm.validation.jakarta.ConfigurableParameterNameProvider import org.grails.datastore.gorm.validation.jakarta.services.ValidatedService import org.grails.datastore.mapping.reflect.ClassUtils -import jakarta.validation.Constraint -import jakarta.validation.ConstraintViolationException -import jakarta.validation.ParameterNameProvider -import java.lang.reflect.Method -import java.lang.reflect.Modifier - -import static org.codehaus.groovy.ast.ClassHelper.* -import static org.codehaus.groovy.ast.tools.GeneralUtils.* +import static org.codehaus.groovy.ast.ClassHelper.CLASS_Type +import static org.codehaus.groovy.ast.ClassHelper.OBJECT_TYPE +import static org.codehaus.groovy.ast.ClassHelper.make +import static org.codehaus.groovy.ast.tools.GeneralUtils.args +import static org.codehaus.groovy.ast.tools.GeneralUtils.assignS +import static org.codehaus.groovy.ast.tools.GeneralUtils.callX +import static org.codehaus.groovy.ast.tools.GeneralUtils.classX +import static org.codehaus.groovy.ast.tools.GeneralUtils.constX +import static org.codehaus.groovy.ast.tools.GeneralUtils.ctorX +import static org.codehaus.groovy.ast.tools.GeneralUtils.stmt +import static org.codehaus.groovy.ast.tools.GeneralUtils.varX import static org.grails.datastore.gorm.transform.AstMethodDispatchUtils.callThisD -import static org.grails.datastore.mapping.reflect.AstUtils.* +import static org.grails.datastore.mapping.reflect.AstUtils.ZERO_ARGUMENTS +import static org.grails.datastore.mapping.reflect.AstUtils.ZERO_PARAMETERS +import static org.grails.datastore.mapping.reflect.AstUtils.findAnnotation +import static org.grails.datastore.mapping.reflect.AstUtils.varThis /** * Adds method parameter validation to {@link grails.gorm.services.Service} instances @@ -64,12 +89,12 @@ class MethodValidationImplementer implements ServiceEnhancer { @Override boolean doesEnhance(ClassNode domainClass, MethodNode methodNode) { - if(ClassUtils.isPresent("jakarta.validation.Validation")) { - for(Parameter p in methodNode.parameters) { - if( p.annotations.any() { AnnotationNode ann -> + if (ClassUtils.isPresent('jakarta.validation.Validation')) { + for (Parameter p in methodNode.parameters) { + if (p.annotations.any() { AnnotationNode ann -> def constraintAnn = findAnnotation(ann.classNode, Constraint) constraintAnn != null - } ) { + }) { return true } @@ -80,7 +105,7 @@ class MethodValidationImplementer implements ServiceEnhancer { @Override void enhance(ClassNode domainClassNode, MethodNode abstractMethodNode, MethodNode newMethodNode, ClassNode targetClassNode) { - Statement body = (Statement)newMethodNode.code + Statement body = (Statement) newMethodNode.code // add parameter name data for the service weaveParameterNameData(domainClassNode, newMethodNode, abstractMethodNode) @@ -92,39 +117,39 @@ class MethodValidationImplementer implements ServiceEnhancer { domainClassNode ) - Integer validatedMethodCount = (Integer)targetClassNode.getNodeMetaData(VALIDATED_METHOD) - if(validatedMethodCount == null) { + Integer validatedMethodCount = (Integer) targetClassNode.getNodeMetaData(VALIDATED_METHOD) + if (validatedMethodCount == null) { validatedMethodCount = 0 } - else{ + else { validatedMethodCount++ } - + targetClassNode.putNodeMetaData(VALIDATED_METHOD, validatedMethodCount) // add a field that holds a reference to the java.lang.reflect.Method to be validated String methodFieldName = VALIDATED_METHOD + validatedMethodCount - MethodCallExpression getClassCall = callThisD(targetClassNode, "getClass", ZERO_ARGUMENTS) + MethodCallExpression getClassCall = callThisD(targetClassNode, 'getClass', ZERO_ARGUMENTS) List validateArgsList = [] List parameterTypesList = [] - for(Parameter p in newMethodNode.parameters) { + for (Parameter p in newMethodNode.parameters) { validateArgsList.add(varX(p)) parameterTypesList.add(classX(p.type.plainNodeReference)) } ArrayExpression parameterTypes = new ArrayExpression(CLASS_Type.plainNodeReference, parameterTypesList) - MethodCallExpression getMethodCall = callX(getClassCall, "getMethod", args( constX(newMethodNode.name), parameterTypes)) + MethodCallExpression getMethodCall = callX(getClassCall, 'getMethod', args(constX(newMethodNode.name), parameterTypes)) FieldNode methodField = targetClassNode.addField(methodFieldName, Modifier.PRIVATE, make(Method).plainNodeReference, getMethodCall) // add a first line to the method body that validates the method ArrayExpression argArray = new ArrayExpression(OBJECT_TYPE, validateArgsList) - String validateMethodName = abstractMethodNode.exceptions?.contains( make(ConstraintViolationException) ) ? "jakartaValidate" : "validate" - MethodCallExpression validateCall = callThisD(ValidatedService, validateMethodName, args(varThis(), varX(methodField),argArray)) - if(body instanceof BlockStatement) { - ((BlockStatement)body).statements.add(0, stmt( validateCall )) + String validateMethodName = abstractMethodNode.exceptions?.contains(make(ConstraintViolationException)) ? 'jakartaValidate' : 'validate' + MethodCallExpression validateCall = callThisD(ValidatedService, validateMethodName, args(varThis(), varX(methodField), argArray)) + if (body instanceof BlockStatement) { + ((BlockStatement) body).statements.add(0, stmt(validateCall)) } else { body = new BlockStatement([ - stmt( validateCall ), + stmt(validateCall), body ], newMethodNode.variableScope) newMethodNode.setCode(body) @@ -143,7 +168,7 @@ class MethodValidationImplementer implements ServiceEnhancer { innerClassNode = new InnerClassNode(newClass, innerClassName, Modifier.STATIC | Modifier.PRIVATE, make(ConfigurableParameterNameProvider), [] as ClassNode[], null) innerClassNode.addAnnotation(new AnnotationNode(make(CompileStatic))) - addParameterNamesMethodNode = innerClassNode.getMethods("addParameterNames")[0] + addParameterNamesMethodNode = innerClassNode.getMethods('addParameterNames')[0] module.addClass(innerClassNode) newClass.addObjectInitializerStatements( @@ -151,10 +176,9 @@ class MethodValidationImplementer implements ServiceEnhancer { ) } else { - addParameterNamesMethodNode = innerClassNode.getMethods("addParameterNames")[0] + addParameterNamesMethodNode = innerClassNode.getMethods('addParameterNames')[0] } - ArgumentListExpression addParameterNamesArguments = args(constX(newMethodNode.name)) ListExpression parameterNames = new ListExpression() List parameterTypes = [] @@ -166,15 +190,14 @@ class MethodValidationImplementer implements ServiceEnhancer { addParameterNamesArguments.addExpression(parameterTypesArray) addParameterNamesArguments.addExpression(parameterNames) - def callExpression = callThisD(innerClassNode, addParameterNamesMethodNode.name, addParameterNamesArguments) callExpression.setMethodTarget(addParameterNamesMethodNode) ConstructorNode constructorNode = innerClassNode.getDeclaredConstructor(ZERO_PARAMETERS) - if(constructorNode == null) { + if (constructorNode == null) { constructorNode = new ConstructorNode(Modifier.PUBLIC, ZERO_PARAMETERS, null, new BlockStatement()) innerClassNode.addConstructor(constructorNode) } - BlockStatement constructorBody = (BlockStatement)constructorNode.code + BlockStatement constructorBody = (BlockStatement) constructorNode.code constructorBody.addStatement( stmt(callExpression) ) diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/listener/ValidationEventListener.groovy b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/listener/ValidationEventListener.groovy index 8453fa72483..b9df7ee32ef 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/listener/ValidationEventListener.groovy +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/listener/ValidationEventListener.groovy @@ -20,6 +20,11 @@ package org.grails.datastore.gorm.validation.listener import groovy.transform.CompileStatic + +import jakarta.persistence.FlushModeType + +import org.springframework.context.ApplicationEvent + import org.grails.datastore.gorm.GormEnhancer import org.grails.datastore.gorm.GormValidateable import org.grails.datastore.gorm.GormValidationApi @@ -30,9 +35,6 @@ import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener import org.grails.datastore.mapping.engine.event.PreInsertEvent import org.grails.datastore.mapping.engine.event.PreUpdateEvent -import org.springframework.context.ApplicationEvent - -import jakarta.persistence.FlushModeType /** * An event listener for ensuring entities are valid before saving or updating @@ -41,7 +43,8 @@ import jakarta.persistence.FlushModeType * @since 6.0 */ @CompileStatic -class ValidationEventListener extends AbstractPersistenceEventListener{ +class ValidationEventListener extends AbstractPersistenceEventListener { + ValidationEventListener(Datastore datastore) { super(datastore) } @@ -49,31 +52,31 @@ class ValidationEventListener extends AbstractPersistenceEventListener{ @Override protected void onPersistenceEvent(AbstractPersistenceEvent event) { def entityObject = event.getEntityObject() - if(entityObject instanceof GormValidateable) { + if (entityObject instanceof GormValidateable) { GormValidateable gormValidateable = (GormValidateable) entityObject - if(gormValidateable.shouldSkipValidation()) { - if( gormValidateable.getErrors()?.hasErrors() ) { + if (gormValidateable.shouldSkipValidation()) { + if (gormValidateable.getErrors()?.hasErrors()) { event.cancel() } } else { - Datastore source = (Datastore)event.getSource() + Datastore source = (Datastore) event.getSource() Session currentSession = source.currentSession FlushModeType previousFlushMode = currentSession.flushMode try { currentSession.setFlushMode(FlushModeType.COMMIT) boolean hasErrors = false - if(source instanceof ConnectionSourcesProvider) { + if (source instanceof ConnectionSourcesProvider) { def connectionSourceName = ((ConnectionSourcesProvider) source).connectionSources.defaultConnectionSource.name - GormValidationApi validationApi = GormEnhancer.findValidationApi((Class)entityObject.getClass(), connectionSourceName) - hasErrors = !validationApi.validate((Object)entityObject) + GormValidationApi validationApi = GormEnhancer.findValidationApi((Class) entityObject.getClass(), connectionSourceName) + hasErrors = !validationApi.validate((Object) entityObject) } else { hasErrors = !gormValidateable.validate() } - if( hasErrors ) { + if (hasErrors) { event.cancel() } } finally { diff --git a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/registry/support/ValidatorRegistries.java b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/registry/support/ValidatorRegistries.java index e0a23c9cb90..bfefe0754c2 100644 --- a/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/registry/support/ValidatorRegistries.java +++ b/grails-datamapping-core/src/main/groovy/org/grails/datastore/gorm/validation/registry/support/ValidatorRegistries.java @@ -19,14 +19,15 @@ package org.grails.datastore.gorm.validation.registry.support; +import org.springframework.context.MessageSource; +import org.springframework.context.support.StaticMessageSource; + import org.grails.datastore.gorm.validation.constraints.registry.DefaultValidatorRegistry; import org.grails.datastore.gorm.validation.jakarta.JakartaValidatorRegistry; import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings; import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.reflect.ClassUtils; import org.grails.datastore.mapping.validation.ValidatorRegistry; -import org.springframework.context.MessageSource; -import org.springframework.context.support.StaticMessageSource; /** * Utility methods for creating Validator registries @@ -58,9 +59,9 @@ public static ValidatorRegistry createValidatorRegistry(MappingContext mappingCo * @param messageSource the message source * @return The registry */ - public static ValidatorRegistry createValidatorRegistry(MappingContext mappingContext, ConnectionSourceSettings settings, MessageSource messageSource ) { + public static ValidatorRegistry createValidatorRegistry(MappingContext mappingContext, ConnectionSourceSettings settings, MessageSource messageSource) { ValidatorRegistry validatorRegistry; - if(isJakartaValidationAvailable()) { + if (isJakartaValidationAvailable()) { validatorRegistry = new JakartaValidatorRegistry(mappingContext, settings, messageSource); } else { diff --git a/grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/EntityTraitInjector.groovy b/grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/EntityTraitInjector.groovy index 749692f37f6..6bbc83ab483 100644 --- a/grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/EntityTraitInjector.groovy +++ b/grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/EntityTraitInjector.groovy @@ -18,10 +18,10 @@ */ package org.grails.compiler.gorm -import grails.compiler.traits.TraitInjector -import grails.gorm.Entity import groovy.transform.CompileStatic +import grails.compiler.traits.TraitInjector +import grails.gorm.Entity import org.grails.core.artefact.DomainClassArtefactHandler /** diff --git a/grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/GormTransformer.java b/grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/GormTransformer.java index cd3d1bc1ed7..8170f62f7c8 100644 --- a/grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/GormTransformer.java +++ b/grails-datamapping-support/src/main/groovy/org/grails/compiler/gorm/GormTransformer.java @@ -18,20 +18,21 @@ */ package org.grails.compiler.gorm; -import grails.compiler.ast.AstTransformer; -import grails.compiler.ast.GrailsArtefactClassInjector; +import java.net.URL; +import java.util.Collection; + import groovy.transform.Canonical; import org.codehaus.groovy.ast.ClassNode; import org.codehaus.groovy.classgen.GeneratorContext; import org.codehaus.groovy.control.SourceUnit; + +import grails.compiler.ast.AstTransformer; +import grails.compiler.ast.GrailsArtefactClassInjector; import org.grails.compiler.injection.GrailsASTUtils; import org.grails.core.artefact.DomainClassArtefactHandler; import org.grails.datastore.mapping.reflect.AstUtils; import org.grails.io.support.GrailsResourceUtils; -import java.net.URL; -import java.util.Collection; - /** * Transforms GORM entities making the GORM API available to Java. * @@ -39,7 +40,7 @@ * @since 2.0 */ @AstTransformer -public class GormTransformer implements GrailsArtefactClassInjector{ +public class GormTransformer implements GrailsArtefactClassInjector { @Override public String[] getArtefactTypes() { @@ -54,10 +55,9 @@ public static Collection getKnownEntityNames() { return AstUtils.getKnownEntityNames(); } - @Override public void performInjection(SourceUnit source, GeneratorContext context, ClassNode classNode) { - if(GrailsASTUtils.hasAnnotation(classNode, Canonical.class)) { + if (GrailsASTUtils.hasAnnotation(classNode, Canonical.class)) { GrailsASTUtils.error(source, classNode, "Class [" + classNode.getName() + "] is marked with @groovy.transform.Canonical which is not supported for GORM entities.", true); } final GormEntityTransformation transformation = new GormEntityTransformation(); @@ -67,7 +67,7 @@ public void performInjection(SourceUnit source, GeneratorContext context, ClassN @Override public void performInjection(SourceUnit source, ClassNode classNode) { - if(GrailsASTUtils.hasAnnotation(classNode, Canonical.class)) { + if (GrailsASTUtils.hasAnnotation(classNode, Canonical.class)) { GrailsASTUtils.error(source, classNode, "Class [" + classNode.getName() + "] is marked with @groovy.transform.Canonical which is not supported for GORM entities.", true); } new GormEntityTransformation().visit(classNode, source); diff --git a/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/plugin/support/ConfigSupport.groovy b/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/plugin/support/ConfigSupport.groovy index 497a9d62686..26fe6a6164a 100644 --- a/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/plugin/support/ConfigSupport.groovy +++ b/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/plugin/support/ConfigSupport.groovy @@ -19,12 +19,13 @@ package org.grails.datastore.gorm.plugin.support -import org.grails.config.PropertySourcesConfig import org.springframework.context.ConfigurableApplicationContext import org.springframework.core.convert.converter.Converter import org.springframework.core.convert.support.ConfigurableConversionService import org.springframework.core.env.PropertyResolver +import org.grails.config.PropertySourcesConfig + /** * Support for configuration when developing Grails plugins * @@ -40,7 +41,7 @@ class ConfigSupport { * @param applicationContext The application context */ static void prepareConfig(PropertyResolver config, ConfigurableApplicationContext applicationContext) { - if(config instanceof PropertySourcesConfig) { + if (config instanceof PropertySourcesConfig) { ConfigurableConversionService conversionService = applicationContext.getEnvironment().getConversionService() conversionService.addConverter(new Converter() { @Override @@ -48,7 +49,7 @@ class ConfigSupport { Class.forName(source) } }) - ((PropertySourcesConfig)config).setConversionService(conversionService) + ((PropertySourcesConfig) config).setConversionService(conversionService) } } } diff --git a/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/proxy/EntityProxyHandlerAdapter.java b/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/proxy/EntityProxyHandlerAdapter.java index 98e49a184a7..b22109dd19b 100644 --- a/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/proxy/EntityProxyHandlerAdapter.java +++ b/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/proxy/EntityProxyHandlerAdapter.java @@ -18,13 +18,13 @@ */ package org.grails.datastore.gorm.proxy; +import java.io.Serializable; + import grails.core.support.proxy.EntityProxyHandler; import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.engine.AssociationQueryExecutor; import org.grails.datastore.mapping.proxy.ProxyFactory; -import java.io.Serializable; - /** * Adapts the proxy handler interface * @@ -38,7 +38,6 @@ public EntityProxyHandlerAdapter(EntityProxyHandler proxyHandler) { this.proxyHandler = proxyHandler; } - @Override public boolean isProxy(Object object) { return proxyHandler.isProxy(object); @@ -51,7 +50,7 @@ public boolean isInitialized(Object object) { @Override public boolean isInitialized(Object object, String associationName) { - return proxyHandler.isInitialized(object,associationName); + return proxyHandler.isInitialized(object, associationName); } @Override diff --git a/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/support/AggregatePersistenceContextInterceptor.java b/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/support/AggregatePersistenceContextInterceptor.java index 5e170dd10da..ffbd5991615 100644 --- a/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/support/AggregatePersistenceContextInterceptor.java +++ b/grails-datamapping-support/src/main/groovy/org/grails/datastore/gorm/support/AggregatePersistenceContextInterceptor.java @@ -18,10 +18,9 @@ */ package org.grails.datastore.gorm.support; -import grails.persistence.support.PersistenceContextInterceptor; - import java.util.List; +import grails.persistence.support.PersistenceContextInterceptor; /** * @author Graeme Rocher diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckManager.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckManager.groovy index e41d28112e4..4564f31e8f9 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckManager.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckManager.groovy @@ -18,6 +18,8 @@ */ package org.apache.grails.data.testing.tck.base +import spock.lang.Specification + import org.apache.grails.data.testing.tck.domains.Book import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.City @@ -45,9 +47,9 @@ import org.apache.grails.data.testing.tck.domains.Task import org.apache.grails.data.testing.tck.domains.TestEntity import org.grails.datastore.mapping.core.DatastoreUtils import org.grails.datastore.mapping.core.Session -import spock.lang.Specification abstract class GrailsDataTckManager { + static final CURRENT_TEST_NAME = 'current.gorm.test' Session session @@ -128,4 +130,4 @@ abstract class GrailsDataTckManager { void destroy() { // noop } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckSpec.groovy index d75df8b8455..9e9e22cfd49 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/base/GrailsDataTckSpec.groovy @@ -19,12 +19,11 @@ package org.apache.grails.data.testing.tck.base -import groovy.util.logging.Slf4j import spock.lang.Shared import spock.lang.Specification -@Slf4j class GrailsDataTckSpec extends Specification { + @Shared T manager diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Book.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Book.groovy index 007b120607a..399af1b5e10 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Book.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Book.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class Book implements Serializable { + Long id Long version String author @@ -30,8 +31,8 @@ class Book implements Serializable { Boolean published = false static mapping = { - published index: true - title index: true - author index: true + published(index: true) + title(index: true) + author(index: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Card.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Card.groovy index 94e876d97ff..df9c71bc4ad 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Card.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Card.groovy @@ -27,4 +27,4 @@ class Card implements Serializable { Long id String cardNumber static hasOne = [cardProfile: CardProfile] -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/CardProfile.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/CardProfile.groovy index 142625af02b..94edd5592da 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/CardProfile.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/CardProfile.groovy @@ -29,6 +29,6 @@ class CardProfile implements Serializable { Card card static constraints = { - card nullable: true + card(nullable: true) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Child.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Child.groovy index 3afd7fa4a1b..3729f8ee0bf 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Child.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Child.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class Child implements Serializable { + private static final long serialVersionUID = 1 Long id Long version diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ChildEntity.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ChildEntity.groovy index a386c7ffe1a..e0790950fec 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ChildEntity.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ChildEntity.groovy @@ -26,13 +26,14 @@ import grails.persistence.Entity */ @Entity class ChildEntity implements Serializable { + Long id Long version String name static mapping = { - name index: true + name(index: true) } static belongsTo = [TestEntity] -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/City.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/City.groovy index 88932797d88..99485f32a9d 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/City.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/City.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class City extends Location { + BigDecimal latitude BigDecimal longitude } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithHungarianNotation.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithHungarianNotation.groovy index b67e0d99a49..b7278c2a409 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithHungarianNotation.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithHungarianNotation.groovy @@ -26,9 +26,10 @@ import grails.persistence.Entity */ @Entity class ClassWithHungarianNotation implements Serializable { + Integer iSize static constraints = { - iSize nullable: true + iSize(nullable: true) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithListArgBeforeValidate.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithListArgBeforeValidate.groovy index cc703c149aa..9e368ebd9b4 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithListArgBeforeValidate.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithListArgBeforeValidate.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class ClassWithListArgBeforeValidate implements Serializable { + Long id Long version def listArgCounter = 0 @@ -35,6 +36,6 @@ class ClassWithListArgBeforeValidate implements Serializable { } static constraints = { - name blank: false + name(blank: false) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithNoArgBeforeValidate.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithNoArgBeforeValidate.groovy index a510f50d56f..d2036610724 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithNoArgBeforeValidate.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithNoArgBeforeValidate.groovy @@ -19,10 +19,11 @@ package org.apache.grails.data.testing.tck.domains -import grails.persistence.Entity; +import grails.persistence.Entity @Entity class ClassWithNoArgBeforeValidate implements Serializable { + Long id Long version def noArgCounter = 0 @@ -33,6 +34,6 @@ class ClassWithNoArgBeforeValidate implements Serializable { } static constraints = { - name blank: false + name(blank: false) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithOverloadedBeforeValidate.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithOverloadedBeforeValidate.groovy index a6d72d59751..99a74cbe845 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithOverloadedBeforeValidate.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ClassWithOverloadedBeforeValidate.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class ClassWithOverloadedBeforeValidate implements Serializable { + Long id Long version def noArgCounter = 0 @@ -40,6 +41,6 @@ class ClassWithOverloadedBeforeValidate implements Serializable { } static constraints = { - name blank: false + name(blank: false) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/CommonTypes.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/CommonTypes.groovy index 4dff263d2fa..79ad07f27ef 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/CommonTypes.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/CommonTypes.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class CommonTypes implements Serializable { + Long id Long version Long l diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ContactDetails.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ContactDetails.groovy index 81ef305d9a5..bb89afa3566 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ContactDetails.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ContactDetails.groovy @@ -27,6 +27,6 @@ class ContactDetails implements Serializable { String phoneNumber static constraints = { - phoneNumber nullable: false, unique: true + phoneNumber(nullable: false, unique: true) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Country.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Country.groovy index f5922d99509..4d375afa492 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Country.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Country.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class Country extends Location { + Integer population = 0 static hasMany = [residents: Person] diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Dog.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Dog.groovy index cc6d6e0497e..311f2e53f12 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Dog.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Dog.groovy @@ -23,13 +23,14 @@ import grails.persistence.Entity @Entity class Dog implements Serializable { + Long id int age int deathAge String name static mapping = { - age index: true - name index: true + age(index: true) + name(index: true) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/EnumThing.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/EnumThing.groovy index b241fd8fc45..2d1964b6b99 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/EnumThing.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/EnumThing.groovy @@ -23,13 +23,14 @@ import grails.persistence.Entity @Entity class EnumThing { + Long id Long version String name TestEnum en static mapping = { - name index: true - en index: true + name(index: true) + en(index: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Face.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Face.groovy index abf9a79f01e..c23d42bfe7a 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Face.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Face.groovy @@ -19,11 +19,11 @@ package org.apache.grails.data.testing.tck.domains - import grails.persistence.Entity @Entity class Face implements Serializable { + Long id Long version String name @@ -33,6 +33,6 @@ class Face implements Serializable { static belongsTo = [person: Person] static constraints = { - person nullable: true + person(nullable: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/GroupWithin.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/GroupWithin.groovy index 77c84d0fed6..10918a790c6 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/GroupWithin.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/GroupWithin.groovy @@ -23,12 +23,13 @@ import grails.persistence.Entity @Entity class GroupWithin implements Serializable { + Long id Long version String name String org static constraints = { - name unique: "org", index: true - org index: true + name(unique: 'org', index: true) + org(index: true) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Highway.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Highway.groovy index b37966849af..40ef900df93 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Highway.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Highway.groovy @@ -23,13 +23,14 @@ import grails.persistence.Entity @Entity class Highway implements Serializable { + Long id Long version Boolean bypassed String name static mapping = { - bypassed index: true - name index: true + bypassed(index: true) + name(index: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Location.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Location.groovy index 2b0aed26bd4..f889f16b65e 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Location.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Location.groovy @@ -23,17 +23,18 @@ import grails.persistence.Entity @Entity class Location implements Serializable { + // Long id Long version String name - String code = "DEFAULT" + String code = 'DEFAULT' def namedAndCode() { "$name - $code" } static mapping = { - name index: true - code index: true + name(index: true) + code(index: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ModifyPerson.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ModifyPerson.groovy index 3ecd2794b1f..8fc8d2ef88c 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ModifyPerson.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/ModifyPerson.groovy @@ -23,16 +23,17 @@ import grails.persistence.Entity @Entity class ModifyPerson implements Serializable { + Long id Long version String name static mapping = { - name index: true + name(index: true) } def beforeInsert() { - name = "Fred" + name = 'Fred' } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Nose.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Nose.groovy index 8f2643653d6..39ae13b69ec 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Nose.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Nose.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class Nose implements Serializable { + Long id Long version boolean hasFreckles @@ -30,6 +31,6 @@ class Nose implements Serializable { static belongsTo = [face: Face] static mapping = { - face index: true + face(index: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/OptLockNotVersioned.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/OptLockNotVersioned.groovy index d56b5c1d43a..d6293312f53 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/OptLockNotVersioned.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/OptLockNotVersioned.groovy @@ -23,12 +23,13 @@ import grails.persistence.Entity @Entity class OptLockNotVersioned implements Serializable { + Long id Long version String name static mapping = { - version false + version(false) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/OptLockVersioned.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/OptLockVersioned.groovy index 81982af712b..dab6f781825 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/OptLockVersioned.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/OptLockVersioned.groovy @@ -23,8 +23,9 @@ import grails.persistence.Entity @Entity class OptLockVersioned implements Serializable { + Long id Long version String name -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Parent.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Parent.groovy index 8ee72373530..1dad03ec44a 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Parent.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Parent.groovy @@ -23,9 +23,10 @@ import grails.persistence.Entity @Entity class Parent implements Serializable { + private static final long serialVersionUID = 1 Long id String name Set children = [] static hasMany = [children: Child] -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Patient.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Patient.groovy index cf81e5abaee..a29e6ae7e05 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Patient.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Patient.groovy @@ -27,10 +27,10 @@ class Patient implements Serializable { ContactDetails contactDetails static constraints = { - contactDetails nullable: false + contactDetails(nullable: false) } static mapping = { - contactDetails lazy: true + contactDetails(lazy: true) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Person.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Person.groovy index 7879560c532..0789c9a43bc 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Person.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Person.groovy @@ -19,11 +19,12 @@ package org.apache.grails.data.testing.tck.domains -import grails.gorm.async.AsyncEntity +import groovy.transform.EqualsAndHashCode + import grails.gorm.DetachedCriteria +import grails.gorm.async.AsyncEntity import grails.gorm.dirty.checking.DirtyCheck import grails.persistence.Entity -import groovy.transform.EqualsAndHashCode import org.grails.datastore.gorm.query.transform.ApplyDetachedCriteriaTransform @DirtyCheck @@ -32,8 +33,9 @@ import org.grails.datastore.gorm.query.transform.ApplyDetachedCriteriaTransform //@groovy.transform.EqualsAndHashCode - breaks gorm-neo4j: TODO: http://jira.grails.org/browse/GPNEO4J-10 @EqualsAndHashCode(includes = ['firstName', 'lastName', 'age']) class Person implements Serializable, Comparable, AsyncEntity { + static simpsons = where { - lastName == "Simpson" + lastName == 'Simpson' } Long id @@ -66,13 +68,13 @@ class Person implements Serializable, Comparable, AsyncEntity { } static mapping = { - firstName index: true - lastName index: true - age index: true + firstName(index: true) + lastName(index: true) + age(index: true) } static constraints = { - face nullable: true + face(nullable: true) } @Override diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PersonEvent.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PersonEvent.groovy index a0c8f605e2f..b97da9b0bda 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PersonEvent.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PersonEvent.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class PersonEvent implements Serializable { + Long id Long version String name @@ -44,7 +45,7 @@ class PersonEvent implements Serializable { } def beforeDelete() { - if (name == "DontDelete") { + if (name == 'DontDelete') { return false } STORE.beforeDelete++ @@ -55,7 +56,7 @@ class PersonEvent implements Serializable { } def beforeUpdate() { - if (name == "Bad") { + if (name == 'Bad') { return false } STORE.beforeUpdate++ @@ -66,7 +67,7 @@ class PersonEvent implements Serializable { } def beforeInsert() { - if (name == "Bad") { + if (name == 'Bad') { return false } STORE.beforeInsert++ diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PersonWithCompositeKey.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PersonWithCompositeKey.groovy index cb84b3b8676..7bab1a0f83a 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PersonWithCompositeKey.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PersonWithCompositeKey.groovy @@ -23,11 +23,12 @@ import grails.persistence.Entity @Entity class PersonWithCompositeKey implements Serializable { + Long version String firstName String lastName Integer age static mapping = { - id composite: ['lastName', 'firstName'] + id(composite: ['lastName', 'firstName']) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Pet.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Pet.groovy index 4efb35ed9c7..2c400273eb1 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Pet.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Pet.groovy @@ -23,22 +23,23 @@ import grails.persistence.Entity @Entity class Pet implements Serializable { + Long id Long version String name Date birthDate = new Date() - PetType type = new PetType(name: "Unknown") + PetType type = new PetType(name: 'Unknown') Person owner Integer age Face face static mapping = { - name index: true + name(index: true) } static constraints = { - owner nullable: true - age nullable: true - face nullable: true + owner(nullable: true) + age(nullable: true) + face(nullable: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PetType.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PetType.groovy index 48a3970fff8..cba6756e60b 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PetType.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PetType.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class PetType implements Serializable { + private static final long serialVersionUID = 1 Long id Long version diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Plant.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Plant.groovy index 5818b46f00b..f05324de2c2 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Plant.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Plant.groovy @@ -23,13 +23,14 @@ import grails.persistence.Entity @Entity class Plant implements Serializable { + Long id Long version boolean goesInPatch String name static mapping = { - name index: true - goesInPatch index: true + name(index: true) + goesInPatch(index: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PlantCategory.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PlantCategory.groovy index 4fea6a55314..e0dbf38a3d4 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PlantCategory.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/PlantCategory.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class PlantCategory implements Serializable { + Long id Long version Set plants diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Practice.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Practice.groovy index 27ef127cdf4..9473747c3ef 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Practice.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Practice.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class Practice implements Serializable { + // Long id Long version String name diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Product.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Product.groovy index 2f77843e1ae..36abb2bb33e 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Product.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Product.groovy @@ -19,9 +19,10 @@ package org.apache.grails.data.testing.tck.domains -import grails.gorm.annotation.Entity import groovy.transform.CompileStatic +import grails.gorm.annotation.Entity + @CompileStatic @Entity class Product { @@ -36,4 +37,4 @@ class Product { static Number updateAll(String givenColor) { whereLazy { color == givenColor }.updateAll([name: 't-shirt ' + givenColor]) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Publication.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Publication.groovy index a26412f930b..558b95028ca 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Publication.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Publication.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class Publication implements Serializable { + Long id Long version String title @@ -30,56 +31,56 @@ class Publication implements Serializable { Boolean paperback = true static mapping = { - title index:true - paperback index:true - datePublished index:true + title(index: true) + paperback(index: true) + datePublished(index: true) } static namedQueries = { lastPublishedBefore { date -> uniqueResult = true - le 'datePublished', date - order 'datePublished', 'desc' + le('datePublished', date) + order('datePublished', 'desc') } recentPublications { def now = new Date() - gt 'datePublished', now - 365 + gt('datePublished', now - 365) } publicationsWithBookInTitle { - like 'title', 'Book%' + like('title', 'Book%') } recentPublicationsByTitle { title -> recentPublications() - eq 'title', title + eq('title', title) } latestBooks { maxResults(10) - order("datePublished", "desc") + order('datePublished', 'desc') } publishedBetween { start, end -> - between 'datePublished', start, end + between('datePublished', start, end) } publishedAfter { date -> - gt 'datePublished', date + gt('datePublished', date) } paperbackOrRecent { or { def now = new Date() - gt 'datePublished', now - 365 + gt('datePublished', now - 365) paperbacks() } } paperbacks { - eq 'paperback', true + eq('paperback', true) } paperbackAndRecent { diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Record.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Record.groovy index 848e81ae6bb..ba5e2cc93e1 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Record.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Record.groovy @@ -23,16 +23,17 @@ import grails.persistence.Entity @Entity class Record { + Long id String name Date dateCreated Date lastUpdated static constraints = { - dateCreated nullable: true - lastUpdated nullable: true + dateCreated(nullable: true) + lastUpdated(nullable: true) } static mapping = { - autoTimestamp false + autoTimestamp(false) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/SimpleWidget.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/SimpleWidget.groovy index 98b135259c7..3b66df0e28d 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/SimpleWidget.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/SimpleWidget.groovy @@ -23,8 +23,9 @@ import grails.persistence.Entity @Entity class SimpleWidget implements Serializable { + Long id Long version String name String spanishName -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/SimpleWidgetWithNonStandardId.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/SimpleWidgetWithNonStandardId.groovy index f53b01856ae..e1c215f4122 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/SimpleWidgetWithNonStandardId.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/SimpleWidgetWithNonStandardId.groovy @@ -23,10 +23,11 @@ import grails.persistence.Entity @Entity class SimpleWidgetWithNonStandardId implements Serializable { + Long myIdentifier Long version String name static mapping = { - id name: 'myIdentifier' + id(name: 'myIdentifier') } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Simples.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Simples.groovy index 0eeedbf233b..7539b8b20e0 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Simples.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Simples.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class Simples implements Serializable { + Long id String name -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Task.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Task.groovy index cfa45d3d375..6bd5c6f5f22 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Task.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/Task.groovy @@ -23,6 +23,7 @@ import grails.persistence.Entity @Entity class Task implements Serializable { + Long id Long version Set tasks @@ -30,7 +31,7 @@ class Task implements Serializable { String name static mapping = { - name index: true + name(index: true) } static hasMany = [tasks: Task] diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestAuthor.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestAuthor.groovy index cb4231f5b9a..db098a96bce 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestAuthor.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestAuthor.groovy @@ -35,4 +35,4 @@ class TestAuthor implements Serializable { if (id != null && that.id != null) return id == that.id return false } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestBook.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestBook.groovy index 9af8fb7203c..f6f8debac69 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestBook.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestBook.groovy @@ -27,4 +27,4 @@ class TestBook implements Serializable { Long id String title TestAuthor author -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestEntity.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestEntity.groovy index 8fb9071d86f..5dda54f2d8b 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestEntity.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestEntity.groovy @@ -26,6 +26,7 @@ import grails.persistence.Entity */ @Entity class TestEntity implements Serializable { + Long id Long version String name @@ -34,14 +35,14 @@ class TestEntity implements Serializable { ChildEntity child static mapping = { - name index: true - age index: true - child index: true + name(index: true) + age(index: true) + child(index: true) } static constraints = { - name blank: false - child nullable: true - age nullable: true + name(blank: false) + child(nullable: true) + age(nullable: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestEnum.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestEnum.groovy index 57cb926d0c6..3e8ca244fea 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestEnum.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestEnum.groovy @@ -20,6 +20,7 @@ package org.apache.grails.data.testing.tck.domains enum TestEnum { + V1, V2, V3 diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestPlayer.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestPlayer.groovy index 05f2022388e..419df9d3945 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestPlayer.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/TestPlayer.groovy @@ -23,8 +23,9 @@ import grails.persistence.Entity @Entity class TestPlayer implements Serializable { + Long id String name List attributes -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/UniqueGroup.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/UniqueGroup.groovy index 2bf26c7808d..6a4b879b01b 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/UniqueGroup.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/domains/UniqueGroup.groovy @@ -24,12 +24,13 @@ import org.grails.datastore.mapping.dirty.checking.DirtyCheckable @Entity class UniqueGroup implements Serializable, DirtyCheckable { + Long id Long version String name String desc static constraints = { - name unique: true, index: true - desc nullable: true + name(unique: true, index: true) + desc(nullable: true) } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/AttachMethodSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/AttachMethodSpec.groovy index 7d28106d031..dfdd0931197 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/AttachMethodSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/AttachMethodSpec.groovy @@ -18,17 +18,17 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Person /** * @author graemerocher */ class AttachMethodSpec extends GrailsDataTckSpec { - void "Test attach method"() { + void 'Test attach method'() { given: - def test = new Person(firstName: "Bob", lastName: "Builder").save() + def test = new Person(firstName: 'Bob', lastName: 'Builder').save() when: manager.session.flush() diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/BuiltinUniqueConstraintWorksWithTargetProxiesConstraintsSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/BuiltinUniqueConstraintWorksWithTargetProxiesConstraintsSpec.groovy index f57f4f0a3c7..89ae8144a35 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/BuiltinUniqueConstraintWorksWithTargetProxiesConstraintsSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/BuiltinUniqueConstraintWorksWithTargetProxiesConstraintsSpec.groovy @@ -19,11 +19,12 @@ package org.apache.grails.data.testing.tck.tests +import spock.lang.PendingFeatureIf + +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ContactDetails import org.apache.grails.data.testing.tck.domains.Patient -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.grails.datastore.mapping.proxy.ProxyHandler -import spock.lang.PendingFeatureIf class BuiltinUniqueConstraintWorksWithTargetProxiesConstraintsSpec extends GrailsDataTckSpec { @@ -31,55 +32,55 @@ class BuiltinUniqueConstraintWorksWithTargetProxiesConstraintsSpec extends Grail manager.domainClasses.addAll([ContactDetails, Patient]) } - @PendingFeatureIf({ !Boolean.getBoolean('hibernate5.gorm.suite') && !Boolean.getBoolean('hibernate6.gorm.suite') && !Boolean.getBoolean('mongodb.gorm.suite')}) - void "test unique constraint on root instance"() { + @PendingFeatureIf({ !Boolean.getBoolean('hibernate5.gorm.suite') && !Boolean.getBoolean('hibernate6.gorm.suite') && !Boolean.getBoolean('mongodb.gorm.suite') }) + void 'test unique constraint on root instance'() { setup: - ContactDetails contactDetails1 = new ContactDetails(phoneNumber: "+1-202-555-0105").save(failOnError: true) - ContactDetails contactDetails2 = new ContactDetails(phoneNumber: "+1-202-555-0105") + ContactDetails contactDetails1 = new ContactDetails(phoneNumber: '+1-202-555-0105').save(failOnError: true) + ContactDetails contactDetails2 = new ContactDetails(phoneNumber: '+1-202-555-0105') manager.session.flush() manager.session.clear() - when: "I try to validate the another object" + when: 'I try to validate the another object' contactDetails2.validate() - then: "another should have an error on name because it is duplicated" + then: 'another should have an error on name because it is duplicated' contactDetails2.hasErrors() - contactDetails2.errors.hasFieldErrors("phoneNumber") - contactDetails2.errors.getFieldError("phoneNumber").codes.contains("unique.phoneNumber") + contactDetails2.errors.hasFieldErrors('phoneNumber') + contactDetails2.errors.getFieldError('phoneNumber').codes.contains('unique.phoneNumber') cleanup: ContactDetails.deleteAll(contactDetails1) } - @PendingFeatureIf({ !Boolean.getBoolean('hibernate5.gorm.suite') && !Boolean.getBoolean('hibernate6.gorm.suite') && !Boolean.getBoolean('mongodb.gorm.suite')}) - void "test unique constraint for the associated child object"() { + @PendingFeatureIf({ !Boolean.getBoolean('hibernate5.gorm.suite') && !Boolean.getBoolean('hibernate6.gorm.suite') && !Boolean.getBoolean('mongodb.gorm.suite') }) + void 'test unique constraint for the associated child object'() { setup: - ContactDetails contactDetails1 = new ContactDetails(phoneNumber: "+1-202-555-0105").save(failOnError: true) + ContactDetails contactDetails1 = new ContactDetails(phoneNumber: '+1-202-555-0105').save(failOnError: true) Patient patient1 = new Patient(contactDetails: contactDetails1).save(failOnError: true) manager.session.flush() manager.session.clear() when: - Patient patient2 = new Patient(contactDetails: new ContactDetails(phoneNumber: "+1-202-555-0105")) + Patient patient2 = new Patient(contactDetails: new ContactDetails(phoneNumber: '+1-202-555-0105')) patient2.validate() then: patient2.hasErrors() - patient2.errors.hasFieldErrors("contactDetails.phoneNumber") - patient2.errors.getFieldError("contactDetails.phoneNumber").codes.contains("unique.phoneNumber") + patient2.errors.hasFieldErrors('contactDetails.phoneNumber') + patient2.errors.getFieldError('contactDetails.phoneNumber').codes.contains('unique.phoneNumber') cleanup: Patient.deleteAll(patient1) ContactDetails.deleteAll(contactDetails1) } - void "test unique constraint on the unmodified association loaded as initialized proxy"() { + void 'test unique constraint on the unmodified association loaded as initialized proxy'() { setup: final ProxyHandler proxyHandler = manager.session.mappingContext.getProxyHandler() - ContactDetails contactDetails = new ContactDetails(phoneNumber: "+1-202-555-0105").save(failOnError: true) + ContactDetails contactDetails = new ContactDetails(phoneNumber: '+1-202-555-0105').save(failOnError: true) Patient patient = new Patient(contactDetails: contactDetails).save(failOnError: true) Long patientId = patient.id manager.session.flush() @@ -87,7 +88,7 @@ class BuiltinUniqueConstraintWorksWithTargetProxiesConstraintsSpec extends Grail when: patient = Patient.get(patientId) - patient.contactDetails.phoneNumber = "+1-202-555-0105" + patient.contactDetails.phoneNumber = '+1-202-555-0105' then: proxyHandler.isProxy(patient.contactDetails) diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CircularOneToManySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CircularOneToManySpec.groovy index 71cc4921790..bcc2149bb73 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CircularOneToManySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CircularOneToManySpec.groovy @@ -18,26 +18,26 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Task import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Task /** * @author graemerocher */ class CircularOneToManySpec extends GrailsDataTckSpec { - void "Test circular one-to-many"() { + void 'Test circular one-to-many'() { given: - def parent = new Task(name: "Root").save() - def child = new Task(task: parent, name: "Finish Job").save(flush: true) + def parent = new Task(name: 'Root').save() + def child = new Task(task: parent, name: 'Finish Job').save(flush: true) manager.session.clear() when: - parent = Task.findByName("Root") - child = Task.findByName("Finish Job") + parent = Task.findByName('Root') + child = Task.findByName('Finish Job') then: parent.task == null child.task.id == parent.id } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CommonTypesPersistenceSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CommonTypesPersistenceSpec.groovy index 8086b732848..5dbbcf4db11 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CommonTypesPersistenceSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CommonTypesPersistenceSpec.groovy @@ -18,8 +18,8 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.CommonTypes import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.CommonTypes /** * @author graemerocher @@ -36,16 +36,16 @@ class CommonTypesPersistenceSpec extends GrailsDataTckSpec { s: 10 as short, bool: true, i: 10, - url: new URL("http://google.com"), + url: new URL('http://google.com'), date: now, c: cal, bd: 1.0, bi: 10 as BigInteger, d: 1.0 as Double, f: 1.0 as Float, - tz: TimeZone.getTimeZone("GMT"), + tz: TimeZone.getTimeZone('GMT'), loc: Locale.UK, - cur: Currency.getInstance("USD"), + cur: Currency.getInstance('USD'), ba: 'hello'.bytes ) @@ -61,16 +61,16 @@ class CommonTypesPersistenceSpec extends GrailsDataTckSpec { (10 as short) == ct.s true == ct.bool 10 == ct.i - new URL("http://google.com") == ct.url + new URL('http://google.com') == ct.url now.time == ct.date.time cal == ct.c 1.0 == ct.bd 10 as BigInteger == ct.bi (1.0 as Double) == ct.d (1.0 as Float) == ct.f - TimeZone.getTimeZone("GMT") == ct.tz + TimeZone.getTimeZone('GMT') == ct.tz Locale.UK == ct.loc - Currency.getInstance("USD") == ct.cur + Currency.getInstance('USD') == ct.cur 'hello'.bytes == ct.ba } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ConstraintsSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ConstraintsSpec.groovy index 4daded2776b..51a9fcbc8c7 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ConstraintsSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ConstraintsSpec.groovy @@ -27,11 +27,11 @@ class ConstraintsSpec extends GrailsDataTckSpec { manager.domainClasses.addAll([ConstrainedEntity]) } - void "Test constraints with static default values"() { - given: "A Test class with static constraint values" - def ce = new ConstrainedEntity(num: 1000, str: "ABC") + void 'Test constraints with static default values'() { + given: 'A Test class with static constraint values' + def ce = new ConstrainedEntity(num: 1000, str: 'ABC') - when: "saved is called" + when: 'saved is called' ce.save() then: @@ -39,7 +39,7 @@ class ConstraintsSpec extends GrailsDataTckSpec { } } -@SuppressWarnings(["ClashingTraitMethods", "UnnecessaryQualifiedReference"]) +@SuppressWarnings(['ClashingTraitMethods', 'UnnecessaryQualifiedReference']) @Entity class ConstrainedEntity implements Serializable { @@ -53,10 +53,10 @@ class ConstrainedEntity implements Serializable { static constraints = { num(maxSize: ConstrainedEntity.MAX_VALUE) - str validator: { val, obj -> + str(validator: { val, obj -> if (val != null && !ConstrainedEntity.ALLOWABLE_VALUES.contains(val)) { return ['not.valid'] } - } + }) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CriteriaBuilderSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CriteriaBuilderSpec.groovy index ba644aab531..a85f7881851 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CriteriaBuilderSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CriteriaBuilderSpec.groovy @@ -18,23 +18,23 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * Abstract base test for criteria queries. Subclasses should do the necessary setup to configure GORM */ class CriteriaBuilderSpec extends GrailsDataTckSpec { - void "Test count distinct projection"() { + void 'Test count distinct projection'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } - new TestEntity(name: "Chuck", age: age - 1, child: new ChildEntity(name: "Chuckie")).save() + new TestEntity(name: 'Chuck', age: age - 1, child: new ChildEntity(name: 'Chuckie')).save() 5 == ChildEntity.count() @@ -43,7 +43,7 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { when: def result = criteria.get { projections { - countDistinct "age" + countDistinct('age') } } @@ -51,14 +51,14 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { result == 4 } - void "Test id projection"() { + void 'Test id projection'() { given: - def entity = new TestEntity(name: "Bob", age: 44, child: new ChildEntity(name: "Child")).save(flush: true) + def entity = new TestEntity(name: 'Bob', age: 44, child: new ChildEntity(name: 'Child')).save(flush: true) when: def result = TestEntity.createCriteria().get { projections { id() } - idEq entity.id + idEq(entity.id) } then: @@ -66,22 +66,22 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { result == entity.id } - void "Test idEq method"() { + void 'Test idEq method'() { given: - def entity = new TestEntity(name: "Bob", age: 44, child: new ChildEntity(name: "Child")).save(flush: true) + def entity = new TestEntity(name: 'Bob', age: 44, child: new ChildEntity(name: 'Child')).save(flush: true) when: - def result = TestEntity.createCriteria().get { idEq entity.id } + def result = TestEntity.createCriteria().get { idEq(entity.id) } then: result != null result.name == 'Bob' } - void "Test disjunction query"() { + void 'Test disjunction query'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } def criteria = TestEntity.createCriteria() when: @@ -96,10 +96,10 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { 3 == results.size() } - void "Test conjunction query"() { + void 'Test conjunction query'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } def criteria = TestEntity.createCriteria() @@ -115,10 +115,10 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { 1 == results.size() } - void "Test list() query"() { + void 'Test list() query'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -136,17 +136,17 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { criteria = TestEntity.createCriteria() results = criteria.list { like('name', 'B%') - maxResults 1 + maxResults(1) } then: 1 == results.size() } - void "Test count()"() { + void 'Test count()'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -161,10 +161,10 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { 2 == result } - void "Test obtain a single result"() { + void 'Test obtain a single result'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -177,13 +177,13 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { then: result != null - "Bob" == result.name + 'Bob' == result.name } - void "Test order by a property name"() { + void 'Test order by a property name'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -192,39 +192,39 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { when: def results = criteria.list { like('name', 'B%') - order "age" + order('age') } then: - "Bob" == results[0].name - "Barney" == results[1].name + 'Bob' == results[0].name + 'Barney' == results[1].name when: criteria = TestEntity.createCriteria() results = criteria.list { like('name', 'B%') - order "age", "desc" + order('age', 'desc') } then: - "Barney" == results[0].name - "Bob" == results[1].name + 'Barney' == results[0].name + 'Bob' == results[1].name } - void "Test get minimum value with projection"() { + void 'Test get minimum value with projection'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } - Thread.sleep 500 + Thread.sleep(500) def criteria = TestEntity.createCriteria() when: def result = criteria.get { projections { - min "age" + min('age') } } @@ -235,7 +235,7 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { criteria = TestEntity.createCriteria() result = criteria.get { projections { - max "age" + max('age') } } @@ -246,8 +246,8 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { criteria = TestEntity.createCriteria() def results = criteria.list { projections { - max "age" - min "age" + max('age') + min('age') } }.flatten() @@ -258,10 +258,10 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { [43, 40] == results } - void "Test obtain property value using projection"() { + void 'Test obtain property value using projection'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -270,7 +270,7 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { when: def results = criteria.list { projections { - property "age" + property('age') } } @@ -278,10 +278,10 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { [40, 41, 42, 43] == results.sort() } - void "Test obtain association entity using property projection"() { + void 'Test obtain association entity using property projection'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -292,14 +292,14 @@ class CriteriaBuilderSpec extends GrailsDataTckSpec { when: def results = criteria.list { projections { - property "child" + property('child') } } then: - results.find { it.name == "Bob Child" } - results.find { it.name == "Fred Child" } - results.find { it.name == "Barney Child" } - results.find { it.name == "Frank Child" } + results.find { it.name == 'Bob Child' } + results.find { it.name == 'Fred Child' } + results.find { it.name == 'Barney Child' } + results.find { it.name == 'Frank Child' } } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CrudOperationsSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CrudOperationsSpec.groovy index c9f4862ee0b..f82fecb184c 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CrudOperationsSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/CrudOperationsSpec.groovy @@ -18,20 +18,21 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.ChildEntity -import org.apache.grails.data.testing.tck.domains.TestEntity +import spock.lang.IgnoreRest + import grails.validation.ValidationException import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec -import spock.lang.IgnoreRest +import org.apache.grails.data.testing.tck.domains.ChildEntity +import org.apache.grails.data.testing.tck.domains.TestEntity /** * @author graemerocher */ class CrudOperationsSpec extends GrailsDataTckSpec { - void "Test get using a string-based key"() { + void 'Test get using a string-based key'() { given: - def t = new TestEntity(name: "Bob", child: new ChildEntity(name: "Child")) + def t = new TestEntity(name: 'Bob', child: new ChildEntity(name: 'Child')) t.save(flush: true) when: @@ -41,7 +42,7 @@ class CrudOperationsSpec extends GrailsDataTckSpec { t != null } - void "Test get returns null of non-existent entity"() { + void 'Test get returns null of non-existent entity'() { given: def t when: @@ -51,10 +52,10 @@ class CrudOperationsSpec extends GrailsDataTckSpec { } @IgnoreRest - void "Test basic CRUD operations"() { + void 'Test basic CRUD operations'() { given: - def t = new TestEntity(name: "Bob", child: new ChildEntity(name: "Child")) + def t = new TestEntity(name: 'Bob', child: new ChildEntity(name: 'Child')) t.save(flush: true) when: @@ -64,31 +65,31 @@ class CrudOperationsSpec extends GrailsDataTckSpec { then: t != null t.id != null - "Bob" == t.name + 'Bob' == t.name 1 == results.size() - "Bob" == results[0].name + 'Bob' == results[0].name } - void "Test save method that takes a map"() { + void 'Test save method that takes a map'() { given: - def t = new TestEntity(name: "Bob", child: new ChildEntity(name: "Child")) - t.save(param: "one", flush: true) + def t = new TestEntity(name: 'Bob', child: new ChildEntity(name: 'Child')) + t.save(param: 'one', flush: true) when: t = TestEntity.get(t.id) then: t.id != null } - void "Test failOnError"() { + void 'Test failOnError'() { given: - def t = new TestEntity(child: new ChildEntity(name: "Child")) + def t = new TestEntity(child: new ChildEntity(name: 'Child')) when: t.save(failOnError: true) then: - thrown ValidationException + thrown(ValidationException) t.id == null } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DeleteAllSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DeleteAllSpec.groovy index 4b45c8e95ba..e1babfaa016 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DeleteAllSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DeleteAllSpec.groovy @@ -18,16 +18,16 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Person class DeleteAllSpec extends GrailsDataTckSpec { - def "Test that many objects can be deleted at once using multiple arguments"() { + def 'Test that many objects can be deleted at once using multiple arguments'() { given: - def bob = new Person(firstName: "Bob", lastName: "Builder").save(flush: true) - def fred = new Person(firstName: "Fred", lastName: "Flintstone").save(flush: true) - def joe = new Person(firstName: "Joe", lastName: "Doe").save(flush: true) + def bob = new Person(firstName: 'Bob', lastName: 'Builder').save(flush: true) + def fred = new Person(firstName: 'Fred', lastName: 'Flintstone').save(flush: true) + def joe = new Person(firstName: 'Joe', lastName: 'Doe').save(flush: true) Person.deleteAll(bob, fred, joe) manager.session.flush() @@ -37,11 +37,11 @@ class DeleteAllSpec extends GrailsDataTckSpec { total == 0 } - def "Test that many objects can be deleted using an iterable"() { + def 'Test that many objects can be deleted using an iterable'() { given: - def bob = new Person(firstName: "Bob", lastName: "Builder").save(flush: true) - def fred = new Person(firstName: "Fred", lastName: "Flintstone").save(flush: true) - def joe = new Person(firstName: "Joe", lastName: "Doe").save(flush: true) + def bob = new Person(firstName: 'Bob', lastName: 'Builder').save(flush: true) + def fred = new Person(firstName: 'Fred', lastName: 'Flintstone').save(flush: true) + def joe = new Person(firstName: 'Joe', lastName: 'Doe').save(flush: true) Vector people = new Vector() people.add(bob) @@ -57,11 +57,11 @@ class DeleteAllSpec extends GrailsDataTckSpec { total == 0 } - def "Test that many objects can be deleted at once using multiple arguments and flushes"() { + def 'Test that many objects can be deleted at once using multiple arguments and flushes'() { given: - def bob = new Person(firstName: "Bob", lastName: "Builder").save(flush: true) - def fred = new Person(firstName: "Fred", lastName: "Flintstone").save(flush: true) - def joe = new Person(firstName: "Joe", lastName: "Doe").save(flush: true) + def bob = new Person(firstName: 'Bob', lastName: 'Builder').save(flush: true) + def fred = new Person(firstName: 'Fred', lastName: 'Flintstone').save(flush: true) + def joe = new Person(firstName: 'Joe', lastName: 'Doe').save(flush: true) Person.deleteAll(flush: true, bob, fred, joe) when: @@ -70,11 +70,11 @@ class DeleteAllSpec extends GrailsDataTckSpec { total == 0 } - def "Test that many objects can be deleted using an iterable and flushes"() { + def 'Test that many objects can be deleted using an iterable and flushes'() { given: - def bob = new Person(firstName: "Bob", lastName: "Builder").save(flush: true) - def fred = new Person(firstName: "Fred", lastName: "Flintstone").save(flush: true) - def joe = new Person(firstName: "Joe", lastName: "Doe").save(flush: true) + def bob = new Person(firstName: 'Bob', lastName: 'Builder').save(flush: true) + def fred = new Person(firstName: 'Fred', lastName: 'Flintstone').save(flush: true) + def joe = new Person(firstName: 'Joe', lastName: 'Doe').save(flush: true) Vector people = new Vector() people.add(bob) diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DetachedCriteriaSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DetachedCriteriaSpec.groovy index 10f05931cc2..a23ca037f02 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DetachedCriteriaSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DetachedCriteriaSpec.groovy @@ -20,191 +20,187 @@ package org.apache.grails.data.testing.tck.tests import grails.gorm.DetachedCriteria import grails.gorm.PagedResultList -import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Person class DetachedCriteriaSpec extends GrailsDataTckSpec { - void "Test the list method returns a PagedResultList with pagination arguments"() { - given: "A bunch of people" + void 'Test the list method returns a PagedResultList with pagination arguments'() { + given: 'A bunch of people' createPeople() - when: "A detached criteria instance is created and the list method used with the max parameter" + when: 'A detached criteria instance is created and the list method used with the max parameter' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } def results = criteria.list(max: 2) - then: "The results are a PagedResultList" + then: 'The results are a PagedResultList' results instanceof PagedResultList results.totalCount == 4 results.size() == 2 - results.every { it.lastName == "Simpson" } + results.every { it.lastName == 'Simpson' } - when: "A detached criteria instance is created and the list method used with the max parameter" + when: 'A detached criteria instance is created and the list method used with the max parameter' criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } results = criteria.list(offset: 2, max: 4) - then: "The results are a PagedResultList" + then: 'The results are a PagedResultList' results instanceof PagedResultList results.totalCount == 4 results.size() == 2 - results.every { it.lastName == "Simpson" } + results.every { it.lastName == 'Simpson' } } - void "Test list method with property projection"() { - given: "A bunch of people" + void 'Test list method with property projection'() { + given: 'A bunch of people' createPeople() - when: "A detached criteria instance is created that uses a property projection" + when: 'A detached criteria instance is created that uses a property projection' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } - criteria = criteria.property("firstName") + criteria = criteria.property('firstName') def results = criteria.list(sort: 'firstName', max: 2).sort() - then: "The list method returns the right results" + then: 'The list method returns the right results' results.size() == 2 - results == ["Bart", "Homer"] + results == ['Bart', 'Homer'] - when: "A detached criteria instance is created that uses a property projection using property missing" + when: 'A detached criteria instance is created that uses a property projection using property missing' criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } criteria = criteria.firstName results = criteria.list(sort: 'firstName', max: 2).sort() - then: "The list method returns the right results" + then: 'The list method returns the right results' results.size() == 2 - results == ["Bart", "Homer"] + results == ['Bart', 'Homer'] } - void "Test exists method"() { - given: "A bunch of people" + void 'Test exists method'() { + given: 'A bunch of people' createPeople() - - when: "A detached criteria instance is created matching the last name" + when: 'A detached criteria instance is created matching the last name' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } - then: "The count method returns the right results" + then: 'The count method returns the right results' criteria.asBoolean() == true } - void "Test updateAll method"() { - given: "A bunch of people" + void 'Test updateAll method'() { + given: 'A bunch of people' createPeople() - when: "A detached criteria is created that deletes all matching records" + when: 'A detached criteria is created that deletes all matching records' def criteria = new DetachedCriteria(Person).build { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } - int total = criteria.updateAll(lastName: "Bloggs") - then: "The number of deletions is correct" + int total = criteria.updateAll(lastName: 'Bloggs') + then: 'The number of deletions is correct' total == 4 Person.count() == 6 criteria.count() == 0 - Person.countByLastName("Bloggs") == 4 + Person.countByLastName('Bloggs') == 4 } - void "Test deleteAll method"() { - given: "A bunch of people" + void 'Test deleteAll method'() { + given: 'A bunch of people' createPeople() - when: "A detached criteria is created that deletes all matching records" + when: 'A detached criteria is created that deletes all matching records' def criteria = new DetachedCriteria(Person).build { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } int total = criteria.deleteAll() - - then: "The number of deletions is correct" + then: 'The number of deletions is correct' total == 4 Person.count() == 2 } - void "Test iterate of detached criteria"() { - given: "A bunch of people" + void 'Test iterate of detached criteria'() { + given: 'A bunch of people' createPeople() - when: "A detached criteria is created that matches the last name and then iterated over" + when: 'A detached criteria is created that matches the last name and then iterated over' def criteria = new DetachedCriteria(Person).build { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } int total = 0 criteria.each { total++ } - then: "The number of iterations is correct" + then: 'The number of iterations is correct' total == 4 } - void "Test dynamic finder on detached criteria"() { - given: "A bunch of people" + void 'Test dynamic finder on detached criteria'() { + given: 'A bunch of people' createPeople() - - when: "A detached criteria instance is created matching the last name" + when: 'A detached criteria instance is created matching the last name' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } - def result = criteria.findByFirstNameLike("B%") + def result = criteria.findByFirstNameLike('B%') - then: "The list method returns the right results" + then: 'The list method returns the right results' result != null - result.firstName == "Bart" + result.firstName == 'Bart' } - void "Test get method on detached criteria and additional criteria"() { - given: "A bunch of people" + void 'Test get method on detached criteria and additional criteria'() { + given: 'A bunch of people' createPeople() - when: "A detached criteria instance is created matching the last name" + when: 'A detached criteria instance is created matching the last name' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } def result = criteria.get { - like 'firstName', 'B%' + like('firstName', 'B%') } - then: "The list method returns the right results" + then: 'The list method returns the right results' result != null - result.firstName == "Bart" + result.firstName == 'Bart' } - void "Test list method on detached criteria and additional criteria"() { - given: "A bunch of people" + void 'Test list method on detached criteria and additional criteria'() { + given: 'A bunch of people' createPeople() - - when: "A detached criteria instance is created matching the last name" + when: 'A detached criteria instance is created matching the last name' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } def results = criteria.list { - like 'firstName', 'B%' + like('firstName', 'B%') } - then: "The list method returns the right results" + then: 'The list method returns the right results' results.size() == 1 - results[0].firstName == "Bart" + results[0].firstName == 'Bart' - when: "The original detached criteria is queried" + when: 'The original detached criteria is queried' results = criteria.list() then: "The additional criteria didn't modify the original instance and the correct results are returned" @@ -212,122 +208,118 @@ class DetachedCriteriaSpec extends GrailsDataTckSpec { results.every { it.lastName == 'Simpson' } } - void "Test count method on detached criteria and additional criteria"() { - given: "A bunch of people" + void 'Test count method on detached criteria and additional criteria'() { + given: 'A bunch of people' createPeople() - - when: "A detached criteria instance is created matching the last name and count is called with additional criteria" + when: 'A detached criteria instance is created matching the last name and count is called with additional criteria' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } def result = criteria.count { - like 'firstName', 'B%' + like('firstName', 'B%') } - then: "The count method returns the right results" + then: 'The count method returns the right results' result == 1 } - void "Test count method on detached criteria"() { - given: "A bunch of people" + void 'Test count method on detached criteria'() { + given: 'A bunch of people' createPeople() - - when: "A detached criteria instance is created matching the last name" + when: 'A detached criteria instance is created matching the last name' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } def result = criteria.count() - then: "The count method returns the right results" + then: 'The count method returns the right results' result == 4 } - void "Test list method on detached criteria"() { - given: "A bunch of people" + void 'Test list method on detached criteria'() { + given: 'A bunch of people' createPeople() - - when: "A detached criteria instance is created matching the last name" + when: 'A detached criteria instance is created matching the last name' def criteria = new DetachedCriteria(Person) criteria.with { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } def results = criteria.list() - then: "The list method returns the right results" + then: 'The list method returns the right results' results.size() == 4 results.every { it.lastName == 'Simpson' } } - void "Test list method on detached criteria with pagination"() { - given: "A bunch of people" + void 'Test list method on detached criteria with pagination'() { + given: 'A bunch of people' createPeople() - when: "A detached criteria instance is created matching the last name" + when: 'A detached criteria instance is created matching the last name' def criteria = new DetachedCriteria(Person) criteria = criteria.build { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } def results = criteria.list(max: 2) - then: "The list method returns the right results" + then: 'The list method returns the right results' results.size() == 2 results[0].lastName == 'Simpson' results[1].lastName == 'Simpson' } - void "Test select method on detached criteria with empty criteria"() { - given: "a bunch of people" + void 'Test select method on detached criteria with empty criteria'() { + given: 'a bunch of people' createPeople() - when: "A detached criteria instance is created with empty criteria" + when: 'A detached criteria instance is created with empty criteria' DetachedCriteria criteria = new DetachedCriteria(Person).build {} final def results = criteria.list() - then: "The list method returns all" + then: 'The list method returns all' results.size() == 6 } - - void "Test update method on detached criteria with empty criteria"() { - given: "a bunch of people" + void 'Test update method on detached criteria with empty criteria'() { + given: 'a bunch of people' createPeople() - when: "A detached criteria instance is created with empty criteria" + when: 'A detached criteria instance is created with empty criteria' DetachedCriteria criteria = new DetachedCriteria(Person).build {} - final int total = criteria.updateAll(lastName: "Bloggs") + final int total = criteria.updateAll(lastName: 'Bloggs') - then: "The number of updates are correct" + then: 'The number of updates are correct' total == 6 - Person.countByLastName("Bloggs") == 6 - Person.countByLastName("Simpson") == 0 + Person.countByLastName('Bloggs') == 6 + Person.countByLastName('Simpson') == 0 } - void "Test deleteAll method on detached criteria with empty criteria"() { - given: "a bunch of people" + void 'Test deleteAll method on detached criteria with empty criteria'() { + given: 'a bunch of people' createPeople() - when: "A detached criteria instance is created with empty criteria" + when: 'A detached criteria instance is created with empty criteria' DetachedCriteria criteria = new DetachedCriteria(Person).build {} final int total = criteria.deleteAll() - then: "The number of deletion is correct" + then: 'The number of deletion is correct' total == 6 Person.count() == 0 } protected void createPeople() { - new Person(firstName: "Homer", lastName: "Simpson").save() - new Person(firstName: "Marge", lastName: "Simpson").save() - new Person(firstName: "Bart", lastName: "Simpson").save() - new Person(firstName: "Lisa", lastName: "Simpson").save() - new Person(firstName: "Barney", lastName: "Rubble").save() - new Person(firstName: "Fred", lastName: "Flinstone").save(flush: true) + new Person(firstName: 'Homer', lastName: 'Simpson').save() + new Person(firstName: 'Marge', lastName: 'Simpson').save() + new Person(firstName: 'Bart', lastName: 'Simpson').save() + new Person(firstName: 'Lisa', lastName: 'Simpson').save() + new Person(firstName: 'Barney', lastName: 'Rubble').save() + new Person(firstName: 'Fred', lastName: 'Flinstone').save(flush: true) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DirtyCheckingAfterListenerSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DirtyCheckingAfterListenerSpec.groovy index 9877ec8a034..ac8a0ecf9a5 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DirtyCheckingAfterListenerSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DirtyCheckingAfterListenerSpec.groovy @@ -18,19 +18,21 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.TestPlayer +import spock.lang.PendingFeatureIf +import spock.util.concurrent.PollingConditions + +import org.springframework.context.ApplicationEvent +import org.springframework.context.ApplicationEventPublisher +import org.springframework.context.ConfigurableApplicationContext + import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.TestPlayer import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent import org.grails.datastore.mapping.engine.event.AbstractPersistenceEventListener import org.grails.datastore.mapping.engine.event.PreInsertEvent import org.grails.datastore.mapping.engine.event.PreUpdateEvent -import org.springframework.context.ApplicationEvent -import org.springframework.context.ApplicationEventPublisher -import org.springframework.context.ConfigurableApplicationContext -import spock.lang.PendingFeatureIf -import spock.util.concurrent.PollingConditions class DirtyCheckingAfterListenerSpec extends GrailsDataTckSpec { @@ -53,10 +55,10 @@ class DirtyCheckingAfterListenerSpec extends GrailsDataTckSpec { } @PendingFeatureIf({ !Boolean.getBoolean('hibernate5.gorm.suite') && !Boolean.getBoolean('hibernate6.gorm.suite') && !Boolean.getBoolean('mongodb.gorm.suite') }) - void "test state change from listener update the object"() { + void 'test state change from listener update the object'() { when: - TestPlayer john = new TestPlayer(name: "John").save(flush: true) + TestPlayer john = new TestPlayer(name: 'John').save(flush: true) then: new PollingConditions().eventually { listener.isExecuted && TestPlayer.count() } @@ -84,7 +86,7 @@ class TestSaveOrUpdateEventListener extends AbstractPersistenceEventListener { @Override protected void onPersistenceEvent(AbstractPersistenceEvent event) { TestPlayer player = (TestPlayer) event.entityObject - player.attributes = ["test0", "test1", "test2"] + player.attributes = ['test0', 'test1', 'test2'] isExecuted = true } @@ -92,4 +94,4 @@ class TestSaveOrUpdateEventListener extends AbstractPersistenceEventListener { boolean supportsEventType(Class eventType) { return eventType == PreUpdateEvent || eventType == PreInsertEvent } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DirtyCheckingSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DirtyCheckingSpec.groovy index 81834261e2a..901ec9b870e 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DirtyCheckingSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DirtyCheckingSpec.groovy @@ -18,14 +18,15 @@ */ package org.apache.grails.data.testing.tck.tests +import spock.lang.IgnoreIf + +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.Card import org.apache.grails.data.testing.tck.domains.CardProfile import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.domains.TestAuthor import org.apache.grails.data.testing.tck.domains.TestBook -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.grails.datastore.mapping.proxy.ProxyHandler -import spock.lang.IgnoreIf /** * @author Graeme Rocher @@ -42,43 +43,43 @@ class DirtyCheckingSpec extends GrailsDataTckSpec { proxyHandler = manager.session.getMappingContext().proxyHandler } - void "Test that dirty checking methods work when changing entities"() { + void 'Test that dirty checking methods work when changing entities'() { - when: "A new instance is created" - def p = new Person(firstName: "Homer", lastName: "Simpson") + when: 'A new instance is created' + def p = new Person(firstName: 'Homer', lastName: 'Simpson') p.save(flush: true) - then: "The instance is not dirty" + then: 'The instance is not dirty' !p.isDirty() - !p.isDirty("firstName") + !p.isDirty('firstName') - when: "The instance is changed" - p.firstName = "Bart" + when: 'The instance is changed' + p.firstName = 'Bart' - then: "The instance is now dirty" + then: 'The instance is now dirty' p.isDirty() - p.isDirty("firstName") + p.isDirty('firstName') p.dirtyPropertyNames == ['firstName'] - p.getPersistentValue('firstName') == "Homer" + p.getPersistentValue('firstName') == 'Homer' - when: "The instance is loaded from the db" + when: 'The instance is loaded from the db' p.save(flush: true) manager.session.clear() p = Person.get(p.id) - then: "The instance is not dirty" + then: 'The instance is not dirty' !p.isDirty() !p.isDirty('firstName') - when: "The instance is changed" - p.firstName = "Lisa" + when: 'The instance is changed' + p.firstName = 'Lisa' - then: "The instance is dirty" + then: 'The instance is dirty' p.isDirty() - p.isDirty("firstName") + p.isDirty('firstName') } - void "test relationships not marked dirty when proxies are used"() { + void 'test relationships not marked dirty when proxies are used'() { given: Long bookId = new TestBook(title: 'Martin Fierro', author: new TestAuthor(name: 'Jose Hernandez')) @@ -101,7 +102,7 @@ class DirtyCheckingSpec extends GrailsDataTckSpec { TestAuthor.deleteAll() } - void "test relationships not marked dirty when domain objects are used"() { + void 'test relationships not marked dirty when domain objects are used'() { given: Long bookId = new TestBook(title: 'Martin Fierro', author: new TestAuthor(name: 'Jose Hernandez')) @@ -124,12 +125,12 @@ class DirtyCheckingSpec extends GrailsDataTckSpec { TestAuthor.deleteAll() } - void "test relationships are marked dirty when proxies are used but different"() { + void 'test relationships are marked dirty when proxies are used but different'() { given: Long bookId = new TestBook(title: 'Martin Fierro', author: new TestAuthor(name: 'Jose Hernandez')) .save(flush: true, failOnError: true) .id - Long otherAuthorId = new TestAuthor(name: "JD").save(flush: true, failOnError: true).id + Long otherAuthorId = new TestAuthor(name: 'JD').save(flush: true, failOnError: true).id manager.session.flush() manager.session.clear() @@ -147,13 +148,13 @@ class DirtyCheckingSpec extends GrailsDataTckSpec { TestAuthor.deleteAll() } - void "test relationships marked dirty when domain objects are used and changed"() { + void 'test relationships marked dirty when domain objects are used and changed'() { given: Long bookId = new TestBook(title: 'Martin Fierro', author: new TestAuthor(name: 'Jose Hernandez')) .save(flush: true, failOnError: true) .id - Long otherAuthorId = new TestAuthor(name: "JD").save(flush: true, failOnError: true).id + Long otherAuthorId = new TestAuthor(name: 'JD').save(flush: true, failOnError: true).id manager.session.flush() manager.session.clear() @@ -171,12 +172,12 @@ class DirtyCheckingSpec extends GrailsDataTckSpec { TestAuthor.deleteAll() } - @IgnoreIf({ !Boolean.getBoolean('mongodb.gorm.suite')}) - void "test initialized proxy is not marked as dirty"() { + @IgnoreIf({ !Boolean.getBoolean('mongodb.gorm.suite') }) + void 'test initialized proxy is not marked as dirty'() { given: - Card card = new Card(cardNumber: "1111-2222-3333-4444") - card.cardProfile = new CardProfile(fullName: "JD") + Card card = new Card(cardNumber: '1111-2222-3333-4444') + card.cardProfile = new CardProfile(fullName: 'JD') card.save(flush: true, failOnError: true) manager.session.flush() manager.session.clear() diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DisableAutotimeStampSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DisableAutotimeStampSpec.groovy index 8f168e910b2..cf40608e541 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DisableAutotimeStampSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DisableAutotimeStampSpec.groovy @@ -18,8 +18,8 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Record import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Record /** * @author Graeme Rocher @@ -30,18 +30,18 @@ class DisableAutotimeStampSpec extends GrailsDataTckSpec { manager.domainClasses.addAll([Record]) } - void "Test that when auto timestamping is disabled the dateCreated and lastUpdated properties are not set"() { - when: "An entity is persisted" - def r = new Record(name: "Test") + void 'Test that when auto timestamping is disabled the dateCreated and lastUpdated properties are not set'() { + when: 'An entity is persisted' + def r = new Record(name: 'Test') r.save(flush: true) manager.session.clear() r = Record.get(r.id) - then: "There are errors and dateCreated / lastUpdated were not set" + then: 'There are errors and dateCreated / lastUpdated were not set' r.lastUpdated == null r.dateCreated == null - when: "The entity is saved successfully and updated" + when: 'The entity is saved successfully and updated' def d = new Date().parse('yyyy/MM/dd', '1973/07/21') r.lastUpdated = d r.dateCreated = d @@ -49,7 +49,7 @@ class DisableAutotimeStampSpec extends GrailsDataTckSpec { manager.session.clear() r = Record.get(r.id) - then: "lastUpdated is not changed" + then: 'lastUpdated is not changed' r != null r.lastUpdated == d r.dateCreated == d diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainEventsSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainEventsSpec.groovy index 585b5437e7b..24ba4e7ed30 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainEventsSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/DomainEventsSpec.groovy @@ -18,12 +18,13 @@ */ package org.apache.grails.data.testing.tck.tests +import spock.lang.Issue +import spock.lang.PendingFeature + import grails.gorm.DetachedCriteria +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ModifyPerson import org.apache.grails.data.testing.tck.domains.PersonEvent -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec -import spock.lang.Issue -import spock.lang.PendingFeature /** * @author graemerocher @@ -35,28 +36,28 @@ class DomainEventsSpec extends GrailsDataTckSpec { } @Issue('GPMONGODB-262') - void "Test that returning false from beforeUpdate evicts the event"() { - when: "An entity is saved" - def p = new PersonEvent(name: "Fred") + void 'Test that returning false from beforeUpdate evicts the event'() { + when: 'An entity is saved' + def p = new PersonEvent(name: 'Fred') p.save(flush: true) manager.session.clear() p = PersonEvent.get(p.id) - then: "The person is saved" + then: 'The person is saved' p != null - when: "The beforeUpdate event returns false" - p.name = "Bad" + when: 'The beforeUpdate event returns false' + p.name = 'Bad' p.save(flush: true) manager.session.clear() - then: "The person is never updated" - PersonEvent.get(p.id).name == "Fred" + then: 'The person is never updated' + PersonEvent.get(p.id).name == 'Fred' } @Issue('GPMONGODB-262') - void "Test that returning false from beforeInsert evicts the event"() { - when: "false is returned from a beforeInsert event" - def p = new PersonEvent(name: "Bad") + void 'Test that returning false from beforeInsert evicts the event'() { + when: 'false is returned from a beforeInsert event' + def p = new PersonEvent(name: 'Bad') try { p.save() manager.session.flush() @@ -65,55 +66,54 @@ class DomainEventsSpec extends GrailsDataTckSpec { } manager.session.clear() - then: "The person is never saved" + then: 'The person is never saved' !PersonEvent.get(p.id) } @Issue('GPMONGODB-262') - void "Test that returning false from beforeDelete evicts the event"() { - when: "a new person is saved" - def p = new PersonEvent(name: "DontDelete") + void 'Test that returning false from beforeDelete evicts the event'() { + when: 'a new person is saved' + def p = new PersonEvent(name: 'DontDelete') p.save(flush: true) manager.session.clear() p = PersonEvent.get(p.id) - - then: "The person exists" + then: 'The person exists' p != null - when: "The beforeDelete event returns false" + when: 'The beforeDelete event returns false' p.delete(flush: true) manager.session.clear() - then: "The event was cancelled" + then: 'The event was cancelled' PersonEvent.get(p.id) } - void "Test modify property before save"() { + void 'Test modify property before save'() { given: manager.session.datastore.mappingContext.addPersistentEntity(ModifyPerson) - def p = new ModifyPerson(name: "Bob").save(flush: true) + def p = new ModifyPerson(name: 'Bob').save(flush: true) manager.session.clear() - when: "An object is queried by id" + when: 'An object is queried by id' p = ModifyPerson.get(p.id) - then: "the correct object is returned" - p.name == "Fred" + then: 'the correct object is returned' + p.name == 'Fred' - when: "An object is queried by the updated value" - p = ModifyPerson.findByName("Fred") + when: 'An object is queried by the updated value' + p = ModifyPerson.findByName('Fred') - then: "The correct person is returned" - p.name == "Fred" + then: 'The correct person is returned' + p.name == 'Fred' } - void "Test auto time stamping working"() { + void 'Test auto time stamping working'() { given: def p = new PersonEvent() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -126,17 +126,17 @@ class DomainEventsSpec extends GrailsDataTckSpec { p.dateCreated == p.lastUpdated when: - p.name = "Wilma" + p.name = 'Wilma' p.save(flush: true) then: p.dateCreated.before(p.lastUpdated) } - void "Test delete events"() { + void 'Test delete events'() { given: def p = new PersonEvent() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -155,7 +155,7 @@ class DomainEventsSpec extends GrailsDataTckSpec { 1 == PersonEvent.STORE.afterDelete } - void "Test multi-delete events"() { + void 'Test multi-delete events'() { given: def freds = (1..3).collect { new PersonEvent(name: "Fred$it").save(flush: true) @@ -185,11 +185,11 @@ class DomainEventsSpec extends GrailsDataTckSpec { // 3 == PersonEvent.STORE.afterDelete } - void "Test before update event"() { + void 'Test before update event'() { given: def p = new PersonEvent() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -197,27 +197,27 @@ class DomainEventsSpec extends GrailsDataTckSpec { p = PersonEvent.get(p.id) then: - "Fred" == p.name + 'Fred' == p.name 0 == PersonEvent.STORE.beforeUpdate 0 == PersonEvent.STORE.afterUpdate when: - p.name = "Bob" + p.name = 'Bob' p.save(flush: true) manager.session.clear() p = PersonEvent.get(p.id) then: - "Bob" == p.name + 'Bob' == p.name 1 == PersonEvent.STORE.beforeUpdate 1 == PersonEvent.STORE.afterUpdate } - void "Test insert events"() { + void 'Test insert events'() { given: def p = new PersonEvent() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -225,31 +225,31 @@ class DomainEventsSpec extends GrailsDataTckSpec { p = PersonEvent.get(p.id) then: - "Fred" == p.name + 'Fred' == p.name 0 == PersonEvent.STORE.beforeUpdate 1 == PersonEvent.STORE.beforeInsert 0 == PersonEvent.STORE.afterUpdate 1 == PersonEvent.STORE.afterInsert when: - p.name = "Bob" + p.name = 'Bob' p.save(flush: true) manager.session.clear() p = PersonEvent.get(p.id) then: - "Bob" == p.name + 'Bob' == p.name 1 == PersonEvent.STORE.beforeUpdate 1 == PersonEvent.STORE.beforeInsert 1 == PersonEvent.STORE.afterUpdate 1 == PersonEvent.STORE.afterInsert } - void "Test load events"() { + void 'Test load events'() { given: def p = new PersonEvent() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -257,7 +257,7 @@ class DomainEventsSpec extends GrailsDataTckSpec { p = PersonEvent.get(p.id) then: - "Fred" == p.name + 'Fred' == p.name if (!'JpaSession'.equals(manager.session.getClass().simpleName)) { // JPA doesn't seem to support a pre-load event 1 == PersonEvent.STORE.beforeLoad @@ -265,7 +265,7 @@ class DomainEventsSpec extends GrailsDataTckSpec { 1 == PersonEvent.STORE.afterLoad } - void "Test multi-load events"() { + void 'Test multi-load events'() { given: def freds = (1..3).collect { new PersonEvent(name: "Fred$it").save(flush: true) @@ -287,14 +287,14 @@ class DomainEventsSpec extends GrailsDataTckSpec { } @PendingFeature(reason = 'Was previously @Ignore') - void "Test bean autowiring"() { + void 'Test bean autowiring'() { given: def personService = new Object() - manager.session.datastore.applicationContext.beanFactory.registerSingleton 'personService', personService + manager.session.datastore.applicationContext.beanFactory.registerSingleton('personService', personService) def p = new PersonEvent() def saved = p - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -302,15 +302,15 @@ class DomainEventsSpec extends GrailsDataTckSpec { p = PersonEvent.get(p.id) then: - "Fred" == p.name - personService.is saved.personService // test Groovy constructor + 'Fred' == p.name + personService.is(saved.personService) // test Groovy constructor if (!manager.session.datastore.getClass().name.contains('Hibernate')) { // autowiring is added to the real constructor by an AST, so can't test this for Hibernate - personService.is p.personService // test constructor called by the datastore + personService.is(p.personService) // test constructor called by the datastore } } def cleanup() { - manager.session.datastore.applicationContext?.beanFactory?.destroySingleton 'personService' + manager.session.datastore.applicationContext?.beanFactory?.destroySingleton('personService') } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/EnumSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/EnumSpec.groovy index 529b1655987..17e3388390f 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/EnumSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/EnumSpec.groovy @@ -18,10 +18,11 @@ */ package org.apache.grails.data.testing.tck.tests +import spock.lang.Issue + +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.EnumThing import org.apache.grails.data.testing.tck.domains.TestEnum -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec -import spock.lang.Issue class EnumSpec extends GrailsDataTckSpec { @@ -46,7 +47,6 @@ class EnumSpec extends GrailsDataTckSpec { TestEnum.V1 == t.en } - @Issue('GPMONGODB-248') void "Test findByInList()"() { given: @@ -182,4 +182,4 @@ class EnumSpec extends GrailsDataTckSpec { 1 == v2Count 0 == v3Count } -} \ No newline at end of file +} diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByExampleSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByExampleSpec.groovy index ca798be0553..c76621cdd0a 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByExampleSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByExampleSpec.groovy @@ -18,56 +18,56 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Plant import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Plant class FindByExampleSpec extends GrailsDataTckSpec { - def "Test findAll by example"() { + def 'Test findAll by example'() { given: - new Plant(name: "Pineapple", goesInPatch: false).save() - new Plant(name: "Cabbage", goesInPatch: true).save() - new Plant(name: "Kiwi", goesInPatch: false).save(flush: true) + new Plant(name: 'Pineapple', goesInPatch: false).save() + new Plant(name: 'Cabbage', goesInPatch: true).save() + new Plant(name: 'Kiwi', goesInPatch: false).save(flush: true) manager.session.clear() when: def results = Plant.findAll(new Plant(goesInPatch: false)) then: results.size() == 2 - "Pineapple" in results*.name - "Kiwi" in results*.name + 'Pineapple' in results*.name + 'Kiwi' in results*.name when: - results = Plant.findAll(new Plant(name: "Cabbage", goesInPatch: false)) + results = Plant.findAll(new Plant(name: 'Cabbage', goesInPatch: false)) then: results.size() == 0 when: - results = Plant.findAll(new Plant(name: "Cabbage", goesInPatch: true)) + results = Plant.findAll(new Plant(name: 'Cabbage', goesInPatch: true)) then: results.size() == 1 - "Cabbage" in results*.name + 'Cabbage' in results*.name } - def "Test find by example"() { + def 'Test find by example'() { given: - new Plant(name: "Pineapple", goesInPatch: false).save() - new Plant(name: "Cabbage", goesInPatch: true).save() - new Plant(name: "Kiwi", goesInPatch: false).save(flush: true) + new Plant(name: 'Pineapple', goesInPatch: false).save() + new Plant(name: 'Cabbage', goesInPatch: true).save() + new Plant(name: 'Kiwi', goesInPatch: false).save(flush: true) manager.session.clear() when: - Plant result = Plant.find(new Plant(name: "Cabbage", goesInPatch: false)) + Plant result = Plant.find(new Plant(name: 'Cabbage', goesInPatch: false)) then: result == null when: - result = Plant.find(new Plant(name: "Cabbage", goesInPatch: true)) + result = Plant.find(new Plant(name: 'Cabbage', goesInPatch: true)) then: result != null - result.name == "Cabbage" + result.name == 'Cabbage' } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByMethodSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByMethodSpec.groovy index cd606f57a53..be7988712d4 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByMethodSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindByMethodSpec.groovy @@ -18,10 +18,10 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.Book import org.apache.grails.data.testing.tck.domains.Highway import org.apache.grails.data.testing.tck.domains.Person -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * @author graemerocher @@ -300,49 +300,49 @@ class FindByMethodSpec extends GrailsDataTckSpec { Book.findOrCreateByAuthorInList(['Jeff']) then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrCreateByAuthorOrTitle('Jim', 'Title') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrCreateByAuthorNotEqual('B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrCreateByAuthorGreaterThan('B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrCreateByAuthorLessThan('B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrCreateByAuthorBetween('A', 'B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrCreateByAuthorGreaterThanEquals('B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrCreateByAuthorLessThanEquals('B') then: - thrown MissingMethodException + thrown(MissingMethodException) // GemFire doesn't like these... // when: @@ -380,49 +380,49 @@ class FindByMethodSpec extends GrailsDataTckSpec { Book.findOrSaveByAuthorInList(['Jeff']) then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrSaveByAuthorOrTitle('Jim', 'Title') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrSaveByAuthorNotEqual('B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrSaveByAuthorGreaterThan('B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrSaveByAuthorLessThan('B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrSaveByAuthorBetween('A', 'B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrSaveByAuthorGreaterThanEquals('B') then: - thrown MissingMethodException + thrown(MissingMethodException) when: Book.findOrSaveByAuthorLessThanEquals('B') then: - thrown MissingMethodException + thrown(MissingMethodException) // GemFire doesn't like these... // when: @@ -450,5 +450,3 @@ class FindByMethodSpec extends GrailsDataTckSpec { // thrown MissingMethodException } } - - diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindOrCreateWhereSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindOrCreateWhereSpec.groovy index 566dbb10bd4..7ebfdcbe2f2 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindOrCreateWhereSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindOrCreateWhereSpec.groovy @@ -18,8 +18,8 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.TestEntity import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.TestEntity class FindOrCreateWhereSpec extends GrailsDataTckSpec { diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindOrSaveWhereSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindOrSaveWhereSpec.groovy index f38c5cb19f1..cf2c7f776fc 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindOrSaveWhereSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindOrSaveWhereSpec.groovy @@ -18,8 +18,8 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.TestEntity import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.TestEntity class FindOrSaveWhereSpec extends GrailsDataTckSpec { diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindWhereSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindWhereSpec.groovy index 9afd63f6018..186c1377787 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindWhereSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FindWhereSpec.groovy @@ -18,16 +18,15 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.TestEntity import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.TestEntity class FindWhereSpec extends GrailsDataTckSpec { - def "Test findWhere returns a matching Instance"() { + def 'Test findWhere returns a matching Instance'() { given: def entityId = new TestEntity(name: 'David', age: 27).save().id - when: def entity = TestEntity.findWhere(name: 'David') @@ -37,10 +36,10 @@ class FindWhereSpec extends GrailsDataTckSpec { entityId == entity.id } - def "Test findWhere with a GString property"() { + def 'Test findWhere with a GString property'() { given: def entityId = new TestEntity(name: 'David', age: 27).save().id - def property = "name" + def property = 'name' when: def entity = TestEntity.findWhere("${property}": 'David') @@ -51,7 +50,7 @@ class FindWhereSpec extends GrailsDataTckSpec { entityId == entity.id } - def "Test findAllWhere returns a matching Instance"() { + def 'Test findAllWhere returns a matching Instance'() { given: def entityId = new TestEntity(name: 'David', age: 27).save().id @@ -64,10 +63,10 @@ class FindWhereSpec extends GrailsDataTckSpec { entityId == entity[0].id } - def "Test findAllWhere with a GString property"() { + def 'Test findAllWhere with a GString property'() { given: def entityId = new TestEntity(name: 'David', age: 27).save().id - def property = "name" + def property = 'name' when: def entity = TestEntity.findAllWhere("${property}": 'David') diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FirstAndLastMethodSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FirstAndLastMethodSpec.groovy index 7b9774fca4a..fa2048d2af7 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FirstAndLastMethodSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/FirstAndLastMethodSpec.groovy @@ -18,11 +18,12 @@ */ package org.apache.grails.data.testing.tck.tests +import spock.lang.PendingFeatureIf + +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.PersonWithCompositeKey import org.apache.grails.data.testing.tck.domains.SimpleWidget import org.apache.grails.data.testing.tck.domains.SimpleWidgetWithNonStandardId -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec -import spock.lang.PendingFeatureIf class FirstAndLastMethodSpec extends GrailsDataTckSpec { @@ -162,9 +163,7 @@ class FirstAndLastMethodSpec extends GrailsDataTckSpec { } @PendingFeatureIf( - value = { - System.getProperty('hibernate5.gorm.suite') - }, + value = { System.getProperty('hibernate5.gorm.suite') }, reason = 'Was previously @Ignore' ) void "Test first and last method with composite key"() { diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GormEnhancerSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GormEnhancerSpec.groovy index 4487dc69f13..82df26c8991 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GormEnhancerSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GormEnhancerSpec.groovy @@ -18,16 +18,16 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * @author graemerocher */ class GormEnhancerSpec extends GrailsDataTckSpec { - void "Test basic CRUD operations"() { + void 'Test basic CRUD operations'() { given: def t @@ -38,7 +38,7 @@ class GormEnhancerSpec extends GrailsDataTckSpec { t == null when: - t = new TestEntity(name: "Bob", child: new ChildEntity(name: "Child")) + t = new TestEntity(name: 'Bob', child: new ChildEntity(name: 'Child')) t.save() then: @@ -49,45 +49,45 @@ class GormEnhancerSpec extends GrailsDataTckSpec { then: 1 == results.size() - "Bob" == results[0].name + 'Bob' == results[0].name when: t = TestEntity.get(t.id) then: t != null - "Bob" == t.name + 'Bob' == t.name } - void "Test simple dynamic finder"() { + void 'Test simple dynamic finder'() { given: - def t = new TestEntity(name: "Bob", child: new ChildEntity(name: "Child")) + def t = new TestEntity(name: 'Bob', child: new ChildEntity(name: 'Child')) t.save() - t = new TestEntity(name: "Fred", child: new ChildEntity(name: "Child")) + t = new TestEntity(name: 'Fred', child: new ChildEntity(name: 'Child')) t.save() when: def results = TestEntity.list() - def bob = TestEntity.findByName("Bob") + def bob = TestEntity.findByName('Bob') then: 2 == results.size() bob != null - "Bob" == bob.name + 'Bob' == bob.name } - void "Test dynamic finder with disjunction"() { + void 'Test dynamic finder with disjunction'() { given: def age = 40 - ["Bob", "Fred", "Barney"].each { + ['Bob', 'Fred', 'Barney'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } when: - def results = TestEntity.findAllByNameOrAge("Barney", 40) - def barney = results.find { it.name == "Barney" } + def results = TestEntity.findAllByNameOrAge('Barney', 40) + def barney = results.find { it.name == 'Barney' } def bob = results.find { it.age == 40 } @@ -98,14 +98,14 @@ class GormEnhancerSpec extends GrailsDataTckSpec { barney != null 42 == barney.age bob != null - "Bob" == bob.name + 'Bob' == bob.name } - void "Test getAll() method"() { + void 'Test getAll() method'() { given: def age = 40 def ids = [] - ["Bob", "Fred", "Barney"].each { + ['Bob', 'Fred', 'Barney'].each { ids.add(new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save().id) } @@ -116,12 +116,12 @@ class GormEnhancerSpec extends GrailsDataTckSpec { 2 == results.size() } - void "Test ident() method"() { + void 'Test ident() method'() { given: def t when: - t = new TestEntity(name: "Bob", child: new ChildEntity(name: "Child")) + t = new TestEntity(name: 'Bob', child: new ChildEntity(name: 'Child')) t.save() then: @@ -129,10 +129,10 @@ class GormEnhancerSpec extends GrailsDataTckSpec { t.id == t.ident() } - void "Test dynamic finder with pagination parameters"() { + void 'Test dynamic finder with pagination parameters'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -142,14 +142,14 @@ class GormEnhancerSpec extends GrailsDataTckSpec { then: 4 == total - 2 == TestEntity.findAllByNameOrAge("Barney", 40).size() - 1 == TestEntity.findAllByNameOrAge("Barney", 40, [max: 1]).size() + 2 == TestEntity.findAllByNameOrAge('Barney', 40).size() + 1 == TestEntity.findAllByNameOrAge('Barney', 40, [max: 1]).size() } - void "Test in list query"() { + void 'Test in list query'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -158,50 +158,50 @@ class GormEnhancerSpec extends GrailsDataTckSpec { then: 4 == total - 2 == TestEntity.findAllByNameInList(["Fred", "Frank"]).size() - 1 == TestEntity.findAllByNameInList(["Joe", "Frank"]).size() - 0 == TestEntity.findAllByNameInList(["Jeff", "Jack"]).size() - 2 == TestEntity.findAllByNameInListOrName(["Joe", "Frank"], "Bob").size() + 2 == TestEntity.findAllByNameInList(['Fred', 'Frank']).size() + 1 == TestEntity.findAllByNameInList(['Joe', 'Frank']).size() + 0 == TestEntity.findAllByNameInList(['Jeff', 'Jack']).size() + 2 == TestEntity.findAllByNameInListOrName(['Joe', 'Frank'], 'Bob').size() } - void "Test like query"() { + void 'Test like query'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank", "frita"].each { + ['Bob', 'Fred', 'Barney', 'Frank', 'frita'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } when: - def results = TestEntity.findAllByNameLike("Fr%") + def results = TestEntity.findAllByNameLike('Fr%') then: 2 == results.size() - results.find { it.name == "Fred" } != null - results.find { it.name == "Frank" } != null + results.find { it.name == 'Fred' } != null + results.find { it.name == 'Frank' } != null } - void "Test ilike query"() { + void 'Test ilike query'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank", "frita"].each { + ['Bob', 'Fred', 'Barney', 'Frank', 'frita'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } when: - def results = TestEntity.findAllByNameIlike("fr%") + def results = TestEntity.findAllByNameIlike('fr%') then: 3 == results.size() - results.find { it.name == "Fred" } != null - results.find { it.name == "Frank" } != null - results.find { it.name == "frita" } != null + results.find { it.name == 'Fred' } != null + results.find { it.name == 'Frank' } != null + results.find { it.name == 'frita' } != null } - void "Test count by query"() { + void 'Test count by query'() { given: def age = 40 - ["Bob", "Fred", "Barney"].each { + ['Bob', 'Fred', 'Barney'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -211,14 +211,14 @@ class GormEnhancerSpec extends GrailsDataTckSpec { then: 3 == total 3 == TestEntity.list().size() - 2 == TestEntity.countByNameOrAge("Barney", 40) - 1 == TestEntity.countByNameAndAge("Bob", 40) + 2 == TestEntity.countByNameOrAge('Barney', 40) + 1 == TestEntity.countByNameAndAge('Bob', 40) } - void "Test dynamic finder with conjunction"() { + void 'Test dynamic finder with conjunction'() { given: def age = 40 - ["Bob", "Fred", "Barney"].each { + ['Bob', 'Fred', 'Barney'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } @@ -229,23 +229,23 @@ class GormEnhancerSpec extends GrailsDataTckSpec { 3 == total 3 == TestEntity.list().size() - TestEntity.findByNameAndAge("Bob", 40) - !TestEntity.findByNameAndAge("Bob", 41) + TestEntity.findByNameAndAge('Bob', 40) + !TestEntity.findByNameAndAge('Bob', 41) } - void "Test count() method"() { + void 'Test count() method'() { given: def t when: - t = new TestEntity(name: "Bob", child: new ChildEntity(name: "Child")) + t = new TestEntity(name: 'Bob', child: new ChildEntity(name: 'Child')) t.save() then: 1 == TestEntity.count() when: - t = new TestEntity(name: "Fred", child: new ChildEntity(name: "Child")) + t = new TestEntity(name: 'Fred', child: new ChildEntity(name: 'Child')) t.save() then: diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GormValidateableSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GormValidateableSpec.groovy index a0fd2b895a6..a6a0f22f528 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GormValidateableSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GormValidateableSpec.groovy @@ -18,21 +18,21 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.TestEntity import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.TestEntity import org.grails.datastore.gorm.GormValidateable class GormValidateableSpec extends GrailsDataTckSpec { void 'Test that a class marked with @Entity implements GormValidateable'() { expect: - GormValidateable.isAssignableFrom TestEntity + GormValidateable.isAssignableFrom(TestEntity) } void 'Test that a real validate method exists, not a runtime added method'() { expect: - TestEntity.getDeclaredMethod 'validate', [] as Class[] - TestEntity.getDeclaredMethod 'validate', [List] as Class[] - TestEntity.getDeclaredMethod 'validate', [Map] as Class[] + TestEntity.getDeclaredMethod('validate', [] as Class[]) + TestEntity.getDeclaredMethod('validate', [List] as Class[]) + TestEntity.getDeclaredMethod('validate', [Map] as Class[]) } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GroovyProxySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GroovyProxySpec.groovy index e58ffbe31f1..0780228a7b1 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GroovyProxySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/GroovyProxySpec.groovy @@ -18,11 +18,13 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Location +import spock.lang.IgnoreIf + +import org.springframework.dao.DataIntegrityViolationException + import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Location import org.grails.datastore.gorm.proxy.GroovyProxyFactory -import org.springframework.dao.DataIntegrityViolationException -import spock.lang.IgnoreIf /** * @author graemerocher @@ -30,40 +32,40 @@ import spock.lang.IgnoreIf @IgnoreIf({ System.getProperty('hibernate5.gorm.suite') || System.getProperty('hibernate6.gorm.suite') }) // this test is ignored because Groovy proxies are not used with Hibernate class GroovyProxySpec extends GrailsDataTckSpec { - - void "Test proxying of non-existent instance throws an exception"() { + + void 'Test proxying of non-existent instance throws an exception'() { setup: if (useGroovyProxyFactory) { manager.session.mappingContext.proxyFactory = new GroovyProxyFactory() } - when: "A proxy is loaded for an instance that doesn't exist" + when: 'A proxy is loaded for an instance that doesn\'t exist' def location = Location.proxy(123) - then: "The proxy is in a valid state" + then: 'The proxy is in a valid state' location != null 123 == location.id false == location.isInitialized() false == location.initialized - when: "The proxy is loaded" + when: 'The proxy is loaded' location.code - then: "An exception is thrown" - thrown DataIntegrityViolationException + then: 'An exception is thrown' + thrown(DataIntegrityViolationException) where: useGroovyProxyFactory << [true, false] } - void "Test creation and behavior of Groovy proxies"() { + void 'Test creation and behavior of Groovy proxies'() { setup: if (useGroovyProxyFactory) { manager.session.mappingContext.proxyFactory = new GroovyProxyFactory() } - def id = new Location(name: "United Kingdom", code: "UK").save(flush: true)?.id + def id = new Location(name: 'United Kingdom', code: 'UK').save(flush: true)?.id manager.session.clear() when: @@ -78,8 +80,8 @@ class GroovyProxySpec extends GrailsDataTckSpec { false == location.isInitialized() false == location.initialized - "UK" == location.code - "United Kingdom - UK" == location.namedAndCode() + 'UK' == location.code + 'United Kingdom - UK' == location.namedAndCode() true == location.isInitialized() true == location.initialized null != location.target @@ -89,7 +91,7 @@ class GroovyProxySpec extends GrailsDataTckSpec { useGroovyProxyFactory << [true, false] } - void "Test setting metaClass property on proxy"() { + void 'Test setting metaClass property on proxy'() { setup: if (useGroovyProxyFactory) { manager.session.mappingContext.proxyFactory = new GroovyProxyFactory() @@ -104,7 +106,7 @@ class GroovyProxySpec extends GrailsDataTckSpec { useGroovyProxyFactory << [true, false] } - void "Test calling setMetaClass method on proxy"() { + void 'Test calling setMetaClass method on proxy'() { setup: if (useGroovyProxyFactory) { manager.session.mappingContext.proxyFactory = new GroovyProxyFactory() @@ -121,12 +123,12 @@ class GroovyProxySpec extends GrailsDataTckSpec { useGroovyProxyFactory << [true, false] } - void "Test creation and behavior of Groovy proxies with method call"() { + void 'Test creation and behavior of Groovy proxies with method call'() { setup: if (useGroovyProxyFactory) { manager.session.mappingContext.proxyFactory = new GroovyProxyFactory() } - def id = new Location(name: "United Kingdom", code: "UK").save(flush: true)?.id + def id = new Location(name: 'United Kingdom', code: 'UK').save(flush: true)?.id manager.session.clear() when: @@ -141,8 +143,8 @@ class GroovyProxySpec extends GrailsDataTckSpec { false == location.isInitialized() false == location.initialized - "United Kingdom - UK" == location.namedAndCode() // method first - "UK" == location.code + 'United Kingdom - UK' == location.namedAndCode() // method first + 'UK' == location.code true == location.isInitialized() true == location.initialized null != location.target diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/InheritanceSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/InheritanceSpec.groovy index 21666bbbc59..72c299bb495 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/InheritanceSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/InheritanceSpec.groovy @@ -18,11 +18,11 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.City import org.apache.grails.data.testing.tck.domains.Country import org.apache.grails.data.testing.tck.domains.Location import org.apache.grails.data.testing.tck.domains.Practice -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * @author graemerocher @@ -33,35 +33,35 @@ class InheritanceSpec extends GrailsDataTckSpec { manager.domainClasses += [Practice] } - void "Test inheritance with dynamic finder"() { + void 'Test inheritance with dynamic finder'() { given: - def city = new City([code: "UK", name: "London", longitude: 49.1, latitude: 53.1]) - def country = new Country([code: "UK", name: "United Kingdom", population: 10000000]) + def city = new City([code: 'UK', name: 'London', longitude: 49.1, latitude: 53.1]) + def country = new Country([code: 'UK', name: 'United Kingdom', population: 10000000]) city.save() - country.save(flush:true) + country.save(flush: true) manager.session.clear() when: - def locations = Location.findAllByCode("UK") - def cities = City.findAllByCode("UK") - def countries = Country.findAllByCode("UK") + def locations = Location.findAllByCode('UK') + def cities = City.findAllByCode('UK') + def countries = Country.findAllByCode('UK') then: 2 == locations.size() 1 == cities.size() 1 == countries.size() - "London" == cities[0].name - "United Kingdom" == countries[0].name + 'London' == cities[0].name + 'United Kingdom' == countries[0].name } - void "Test querying with inheritance"() { + void 'Test querying with inheritance'() { given: - def city = new City([code: "LON", name: "London", longitude: 49.1, latitude: 53.1]) - def location = new Location([code: "XX", name: "The World"]) - def country = new Country([code: "UK", name: "United Kingdom", population: 10000000]) + def city = new City([code: 'LON', name: 'London', longitude: 49.1, latitude: 53.1]) + def location = new Location([code: 'XX', name: 'The World']) + def country = new Country([code: 'UK', name: 'United Kingdom', population: 10000000]) country.save() city.save() @@ -72,8 +72,8 @@ class InheritanceSpec extends GrailsDataTckSpec { when: city = City.get(city.id) def london = Location.get(city.id) - country = Location.findByName("United Kingdom") - def london2 = Location.findByName("London") + country = Location.findByName('United Kingdom') + def london2 = Location.findByName('London') then: 1 == City.count() @@ -84,25 +84,25 @@ class InheritanceSpec extends GrailsDataTckSpec { city instanceof City london instanceof City london2 instanceof City - "London" == london2.name + 'London' == london2.name 49.1 == london2.longitude - "LON" == london2.code + 'LON' == london2.code country instanceof Country - "UK" == country.code + 'UK' == country.code 10000000 == country.population } - void "Test hasMany with inheritance should return appropriate class"() { - given: "a practice with two locations" - Practice practice = new Practice(name: "Test practice") - practice.addToLocations(new City(name: "Austin", latitude: 30.2672, longitude: 97.7431)) - practice.addToLocations(new Country(name: "United States")) + void 'Test hasMany with inheritance should return appropriate class'() { + given: 'a practice with two locations' + Practice practice = new Practice(name: 'Test practice') + practice.addToLocations(new City(name: 'Austin', latitude: 30.2672, longitude: 97.7431)) + practice.addToLocations(new Country(name: 'United States')) practice.save() manager.session.flush() expect: - Location.findByName("Austin").class == City + Location.findByName('Austin').class == City } def clearSession() { diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ListOrderBySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ListOrderBySpec.groovy index 1fdc43a4d00..86bcb454bb2 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ListOrderBySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ListOrderBySpec.groovy @@ -18,38 +18,38 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * @author graemerocher */ class ListOrderBySpec extends GrailsDataTckSpec { - void "Test listOrderBy property name method"() { + void 'Test listOrderBy property name method'() { given: - def child = new ChildEntity(name: "Child") - new TestEntity(age: 30, name: "Bob", child: child).save() - new TestEntity(age: 55, name: "Fred", child: child).save() - new TestEntity(age: 17, name: "Jack", child: child).save() + def child = new ChildEntity(name: 'Child') + new TestEntity(age: 30, name: 'Bob', child: child).save() + new TestEntity(age: 55, name: 'Fred', child: child).save() + new TestEntity(age: 17, name: 'Jack', child: child).save() when: def results = TestEntity.listOrderByAge() then: results.size() == 3 - results[0].name == "Jack" - results[1].name == "Bob" - results[2].name == "Fred" + results[0].name == 'Jack' + results[1].name == 'Bob' + results[2].name == 'Fred' when: - results = TestEntity.listOrderByAge(order: "desc") + results = TestEntity.listOrderByAge(order: 'desc') then: results.size() == 3 - results[2].name == "Jack" - results[1].name == "Bob" - results[0].name == "Fred" + results[2].name == 'Jack' + results[1].name == 'Bob' + results[0].name == 'Fred' } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NamedQuerySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NamedQuerySpec.groovy index 71382237b5d..d73c15aac63 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NamedQuerySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NamedQuerySpec.groovy @@ -18,32 +18,33 @@ */ package org.apache.grails.data.testing.tck.tests +import spock.lang.PendingFeature + +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.PlantCategory import org.apache.grails.data.testing.tck.domains.Publication -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec -import spock.lang.PendingFeature /** * @author graemerocher */ class NamedQuerySpec extends GrailsDataTckSpec { - void "Test Named Query Passing Multiple Params To Nested Named Query"() { + void 'Test Named Query Passing Multiple Params To Nested Named Query'() { given: def now = new Date() - new Publication(title: "Some Book", + new Publication(title: 'Some Book', datePublished: now - 10, paperback: false).save() - new Publication(title: "Some Book", + new Publication(title: 'Some Book', datePublished: now - 1000, paperback: true).save() - new Publication(title: "Some Book", + new Publication(title: 'Some Book', datePublished: now - 2, paperback: true).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 2, paperback: false).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 1000, paperback: false).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 2, paperback: true).save(flush: true) manager.session.clear() @@ -63,22 +64,22 @@ class NamedQuerySpec extends GrailsDataTckSpec { results?.size() == 2 } - void "Test findWhere method after chaining named queries"() { + void 'Test findWhere method after chaining named queries'() { given: def now = new Date() - new Publication(title: "Book 1", + new Publication(title: 'Book 1', datePublished: now - 10, paperback: false).save() - new Publication(title: "Book 2", + new Publication(title: 'Book 2', datePublished: now - 1000, paperback: true).save() - new Publication(title: "Book 3", + new Publication(title: 'Book 3', datePublished: now - 10, paperback: true).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 10, paperback: false).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 1000, paperback: false).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 10, paperback: true).save(flush: true) manager.session.clear() @@ -89,29 +90,29 @@ class NamedQuerySpec extends GrailsDataTckSpec { 1 == results?.size() } - void "Test chaining named queries"() { + void 'Test chaining named queries'() { given: def now = new Date() [true, false].each { isPaperback -> 4.times { Publication.newInstance( - title: "Book Some", + title: 'Book Some', datePublished: now - 10, paperback: isPaperback).save() Publication.newInstance( - title: "Book Some Other", + title: 'Book Some Other', datePublished: now - 10, paperback: isPaperback).save() Publication.newInstance( - title: "Some Other Title", + title: 'Some Other Title', datePublished: now - 10, paperback: isPaperback).save() Publication.newInstance( - title: "Book Some", + title: 'Book Some', datePublished: now - 1000, paperback: isPaperback).save() Publication.newInstance( - title: "Book Some Other", + title: 'Book Some Other', datePublished: now - 1000, paperback: isPaperback).save() Publication.newInstance( - title: "Some Other Title", + title: 'Some Other Title', datePublished: now - 1000, paperback: isPaperback).save() } } @@ -121,7 +122,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: def results = Publication.recentPublications().publicationsWithBookInTitle().list() - then: "The result size should be 16 when returned from chained queries" + then: 'The result size should be 16 when returned from chained queries' 16 == results?.size() when: @@ -131,7 +132,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.recentPublications.publicationsWithBookInTitle.list() - then: "The result size should be 16 when returned from chained queries" + then: 'The result size should be 16 when returned from chained queries' 16 == results?.size() when: @@ -141,7 +142,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.paperbacks().recentPublications().publicationsWithBookInTitle().list() - then: "The result size should be 8 when returned from chained queries" + then: 'The result size should be 8 when returned from chained queries' 8 == results?.size() when: @@ -151,12 +152,12 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.recentPublications().publicationsWithBookInTitle().findAllByPaperback(true) - then: "The result size should be 8" + then: 'The result size should be 8' 8 == results?.size() when: results = Publication.paperbacks.recentPublications.publicationsWithBookInTitle.list() - then: "The result size should be 8 when returned from chained queries" + then: 'The result size should be 8 when returned from chained queries' 8 == results?.size() when: @@ -165,7 +166,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 8 == results } - void "Test named query with disjunction"() { + void 'Test named query with disjunction'() { given: def now = new Date() def oldDate = now - 2000 @@ -184,7 +185,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 3 == publications?.size() } - void "Test max and offset parameter"() { + void 'Test max and offset parameter'() { given: (1..25).each { num -> Publication.newInstance(title: "Book Number ${num}", @@ -204,12 +205,12 @@ class NamedQuerySpec extends GrailsDataTckSpec { 10 == pubs?.size() } - void "Test that parameter to get is converted"() { + void 'Test that parameter to get is converted'() { given: def now = new Date() - def newPublication = Publication.newInstance(title: "Some New Book", datePublished: now - 10).save(failOnError: true) - def oldPublication = Publication.newInstance(title: "Some Old Book", + def newPublication = Publication.newInstance(title: 'Some New Book', datePublished: now - 10).save(failOnError: true) + def oldPublication = Publication.newInstance(title: 'Some Old Book', datePublished: now - 900).save(flush: true, failOnError: true) manager.session.clear() @@ -221,16 +222,16 @@ class NamedQuerySpec extends GrailsDataTckSpec { 'Some New Book' == publication.title } - void "Test named query with additional criteria closure"() { + void 'Test named query with additional criteria closure'() { given: def now = new Date() 6.times { - Publication.newInstance(title: "Some Book", + Publication.newInstance(title: 'Some Book', datePublished: now - 10).save(failOnError: true) - Publication.newInstance(title: "Some Other Book", + Publication.newInstance(title: 'Some Other Book', datePublished: now - 10).save(failOnError: true) - Publication.newInstance(title: "Some Book", + Publication.newInstance(title: 'Some Book', datePublished: now - 900).save(failOnError: true) } manager.session.flush() @@ -238,7 +239,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: def publications = Publication.recentPublications { - eq 'title', 'Some Book' + eq('title', 'Some Book') } then: @@ -246,7 +247,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: publications = Publication.recentPublications { - like 'title', 'Some%' + like('title', 'Some%') } then: @@ -254,7 +255,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: def cnt = Publication.recentPublications.count { - eq 'title', 'Some Book' + eq('title', 'Some Book') } then: @@ -262,14 +263,14 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: publications = Publication.recentPublications(max: 3) { - like 'title', 'Some%' + like('title', 'Some%') } then: 3 == publications?.size() } - void "Test passing parameters to additional criteria"() { + void 'Test passing parameters to additional criteria'() { given: def now = new Date() @@ -284,7 +285,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: def results = Publication.publishedAfter(now - 5) { - eq 'paperback', true + eq('paperback', true) } then: @@ -292,7 +293,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedAfter(now - 5, [max: 2, offset: 1]) { - eq 'paperback', true + eq('paperback', true) } then: @@ -300,7 +301,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedBetween(now - 5, now + 1) { - eq 'paperback', true + eq('paperback', true) } then: @@ -308,7 +309,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedBetween(now - 5, now + 1, [max: 2, offset: 1]) { - eq 'paperback', true + eq('paperback', true) } then: @@ -316,7 +317,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedAfter(now - 1005) { - eq 'paperback', true + eq('paperback', true) } then: @@ -324,7 +325,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedAfter(now - 5) { - eq 'paperback', false + eq('paperback', false) } then: @@ -332,7 +333,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedAfter(now - 5, [max: 2, offset: 1]) { - eq 'paperback', false + eq('paperback', false) } then: @@ -340,7 +341,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedBetween(now - 5, now + 1) { - eq 'paperback', false + eq('paperback', false) } then: @@ -348,7 +349,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedBetween(now - 5, now + 1, [max: 2, offset: 1]) { - eq 'paperback', false + eq('paperback', false) } then: @@ -356,22 +357,22 @@ class NamedQuerySpec extends GrailsDataTckSpec { when: results = Publication.publishedAfter(now - 1005) { - eq 'paperback', false + eq('paperback', false) } then: 0 == results?.size() } - void "Test get method followed named query chaining"() { + void 'Test get method followed named query chaining'() { given: def now = new Date() def oldPaperBackWithBookInTitleId = new Publication( - title: "Book 1", + title: 'Book 1', datePublished: now - 1000, paperback: true).save().id def newPaperBackWithBookInTitleId = new Publication( - title: "Book 2", + title: 'Book 2', datePublished: now, paperback: true).save().id manager.session.flush() @@ -402,13 +403,13 @@ class NamedQuerySpec extends GrailsDataTckSpec { publication != null } - void "Test named query with findBy*() dynamic finder"() { + void 'Test named query with findBy*() dynamic finder'() { given: def now = new Date() - Publication.newInstance(title: "Book 1", datePublished: now - 900).save(failOnError: true) + Publication.newInstance(title: 'Book 1', datePublished: now - 900).save(failOnError: true) def recentBookId = Publication.newInstance( - title: "Book 1", + title: 'Book 1', datePublished: now - 10).save(flush: true).id manager.session.clear() @@ -420,15 +421,15 @@ class NamedQuerySpec extends GrailsDataTckSpec { recentBookId == publication.id } - void "Test named query with findAllBy*() dyamic finder"() { + void 'Test named query with findAllBy*() dyamic finder'() { given: def now = new Date() 3.times { - new Publication(title: "Some Recent Book", + new Publication(title: 'Some Recent Book', datePublished: now - 10).save(failOnError: true) - new Publication(title: "Some Other Book", + new Publication(title: 'Some Other Book', datePublished: now - 10).save(failOnError: true) - new Publication(title: "Some Book", + new Publication(title: 'Some Book', datePublished: now - 900).save(flush: true, failOnError: true) } manager.session.clear() @@ -444,20 +445,20 @@ class NamedQuerySpec extends GrailsDataTckSpec { } @PendingFeature(reason = 'queries on associations not yet supported') - void "Test named query with relationships in criteria"() { + void 'Test named query with relationships in criteria'() { given: - new PlantCategory(name: "leafy") - .addToPlants(goesInPatch: true, name: "Lettuce") + new PlantCategory(name: 'leafy') + .addToPlants(goesInPatch: true, name: 'Lettuce') .save(flush: true) - new PlantCategory(name: "groovy") + new PlantCategory(name: 'groovy') .addToPlants(goesInPatch: true, name: 'Gplant') .save(flush: true) - new PlantCategory(name: "grapes") - .addToPlants(goesInPatch: false, name: "Gray") + new PlantCategory(name: 'grapes') + .addToPlants(goesInPatch: false, name: 'Gray') .save(flush: true) manager.session.clear() @@ -487,22 +488,22 @@ class NamedQuerySpec extends GrailsDataTckSpec { } @PendingFeature(reason = 'queries on associations not yet supported') - void "Test list distinct entities"() { + void 'Test list distinct entities'() { given: - new PlantCategory(name: "leafy") - .addToPlants(goesInPatch: true, name: "lettuce") - .addToPlants(goesInPatch: true, name: "cabbage") + new PlantCategory(name: 'leafy') + .addToPlants(goesInPatch: true, name: 'lettuce') + .addToPlants(goesInPatch: true, name: 'cabbage') .save(flush: true) - new PlantCategory(name: "orange") - .addToPlants(goesInPatch: true, name: "carrots") - .addToPlants(goesInPatch: true, name: "pumpkin") + new PlantCategory(name: 'orange') + .addToPlants(goesInPatch: true, name: 'carrots') + .addToPlants(goesInPatch: true, name: 'pumpkin') .save(flush: true) - new PlantCategory(name: "grapes") - .addToPlants(goesInPatch: false, name: "red") - .addToPlants(goesInPatch: false, name: "white") + new PlantCategory(name: 'grapes') + .addToPlants(goesInPatch: false, name: 'red') + .addToPlants(goesInPatch: false, name: 'white') .save(flush: true) manager.session.clear() @@ -519,21 +520,21 @@ class NamedQuerySpec extends GrailsDataTckSpec { } @PendingFeature(reason = 'queries on associations not yet supported') - void "Another test on listing distinct entities"() { + void 'Another test on listing distinct entities'() { given: - new PlantCategory(name: "leafy") - .addToPlants(goesInPatch: true, name: "lettuce") - .addToPlants(goesInPatch: true, name: "cabbage") + new PlantCategory(name: 'leafy') + .addToPlants(goesInPatch: true, name: 'lettuce') + .addToPlants(goesInPatch: true, name: 'cabbage') .save(flush: true) - new PlantCategory(name: "orange") - .addToPlants(goesInPatch: true, name: "carrots") - .addToPlants(goesInPatch: true, name: "pumpkin") + new PlantCategory(name: 'orange') + .addToPlants(goesInPatch: true, name: 'carrots') + .addToPlants(goesInPatch: true, name: 'pumpkin') .save(flush: true) - new PlantCategory(name: "grapes") - .addToPlants(goesInPatch: false, name: "red") - .addToPlants(goesInPatch: false, name: "white") + new PlantCategory(name: 'grapes') + .addToPlants(goesInPatch: false, name: 'red') + .addToPlants(goesInPatch: false, name: 'white') .save(flush: true) manager.session.clear() @@ -554,10 +555,10 @@ class NamedQuerySpec extends GrailsDataTckSpec { given: def now = new Date() - new Publication(title: "Ten Day Old Paperback", + new Publication(title: 'Ten Day Old Paperback', datePublished: now - 10, paperback: true).save(flush: true) - new Publication(title: "One Hundred Day Old Paperback", + new Publication(title: 'One Hundred Day Old Paperback', datePublished: now - 100, paperback: true).save(flush: true) manager.session.clear() @@ -575,23 +576,22 @@ class NamedQuerySpec extends GrailsDataTckSpec { 'One Hundred Day Old Paperback' == result?.title } - - void "Test named query passing multiple parameters to a nested query"() { + void 'Test named query passing multiple parameters to a nested query'() { given: def now = new Date() - new Publication(title: "Some Book", + new Publication(title: 'Some Book', datePublished: now - 10, paperback: false).save() - new Publication(title: "Some Book", + new Publication(title: 'Some Book', datePublished: now - 1000, paperback: true).save() - new Publication(title: "Some Book", + new Publication(title: 'Some Book', datePublished: now - 2, paperback: true).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 2, paperback: false).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 1000, paperback: false).save() - new Publication(title: "Some Title", + new Publication(title: 'Some Title', datePublished: now - 2, paperback: true).save(flush: true) manager.session.clear() @@ -602,9 +602,8 @@ class NamedQuerySpec extends GrailsDataTckSpec { 2 == results?.size() } - void testChainingQueriesWithParams() { - def Publication = ga.getDomainClass("Publication").clazz + def Publication = ga.getDomainClass('Publication').clazz def now = new Date() def lastWeek = now - 7 @@ -630,19 +629,19 @@ class NamedQuerySpec extends GrailsDataTckSpec { manager.session.clear() def results = Publication.recentPublicationsByTitle('Some Book').publishedAfter(now - 2).list() - assertEquals 'wrong number of books were returned from chained queries', 2, results?.size() + assertEquals('wrong number of books were returned from chained queries', 2, results?.size()) results = Publication.recentPublicationsByTitle('Some Book').publishedAfter(now - 2).count() - assertEquals 2, results + assertEquals(2, results) results = Publication.recentPublicationsByTitle('Some Book').publishedAfter(lastWeek - 2).list() - assertEquals 'wrong number of books were returned from chained queries', 5, results?.size() + assertEquals('wrong number of books were returned from chained queries', 5, results?.size()) results = Publication.recentPublicationsByTitle('Some Book').publishedAfter(lastWeek - 2).count() - assertEquals 5, results + assertEquals(5, results) } - void "Test referencing named query before any dynamic methods"() { + void 'Test referencing named query before any dynamic methods'() { /* * currently this will work: @@ -661,7 +660,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 0 == publications.size() } - void "Test named query with conjunction"() { + void 'Test named query with conjunction'() { given: def now = new Date() def oldDate = now - 2000 @@ -680,13 +679,13 @@ class NamedQuerySpec extends GrailsDataTckSpec { 1 == publications?.size() } - void "Test named query with list() method"() { + void 'Test named query with list() method'() { given: def now = new Date() - Publication.newInstance(title: "Some New Book", + Publication.newInstance(title: 'Some New Book', datePublished: now - 10).save(failOnError: true) - Publication.newInstance(title: "Some Old Book", + Publication.newInstance(title: 'Some Old Book', datePublished: now - 900).save(flush: true, failOnError: true) manager.session.clear() @@ -700,9 +699,9 @@ class NamedQuerySpec extends GrailsDataTckSpec { } @PendingFeature(reason = 'findby boolean queries not yet supported') - void "Test named query with findAll by boolean property"() { + void 'Test named query with findAll by boolean property'() { given: - def Publication = ga.getDomainClass("Publication").clazz + def Publication = ga.getDomainClass('Publication').clazz def now = new Date() Publication.newInstance(title: 'Some Book', datePublished: now - 900, paperback: false).save(failOnError: true) @@ -719,7 +718,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { publications[1].title == 'Some Book' } - void "Test named query with find by boolean property"() { + void 'Test named query with find by boolean property'() { given: def now = new Date() @@ -736,15 +735,15 @@ class NamedQuerySpec extends GrailsDataTckSpec { publication.title == 'Some Book' } - void "Test named query with countBy*() dynamic finder"() { + void 'Test named query with countBy*() dynamic finder'() { given: def now = new Date() 3.times { - Publication.newInstance(title: "Some Book", + Publication.newInstance(title: 'Some Book', datePublished: now - 10).save(failOnError: true) - Publication.newInstance(title: "Some Other Book", + Publication.newInstance(title: 'Some Other Book', datePublished: now - 10).save(failOnError: true) - Publication.newInstance(title: "Some Book", + Publication.newInstance(title: 'Some Book', datePublished: now - 900).save(flush: true, failOnError: true) } manager.session.clear() @@ -756,16 +755,16 @@ class NamedQuerySpec extends GrailsDataTckSpec { 3 == numberOfNewBooksNamedSomeBook } - void "Test named query with listOrderBy*() dynamic finder"() { + void 'Test named query with listOrderBy*() dynamic finder'() { given: def now = new Date() - Publication.newInstance(title: "Book 1", datePublished: now).save(failOnError: true) - Publication.newInstance(title: "Book 5", datePublished: now).save(failOnError: true) - Publication.newInstance(title: "Book 3", datePublished: now - 900).save(failOnError: true) - Publication.newInstance(title: "Book 2", datePublished: now - 900).save(failOnError: true) - Publication.newInstance(title: "Book 4", datePublished: now).save(flush: true, failOnError: true) + Publication.newInstance(title: 'Book 1', datePublished: now).save(failOnError: true) + Publication.newInstance(title: 'Book 5', datePublished: now).save(failOnError: true) + Publication.newInstance(title: 'Book 3', datePublished: now - 900).save(failOnError: true) + Publication.newInstance(title: 'Book 2', datePublished: now - 900).save(failOnError: true) + Publication.newInstance(title: 'Book 4', datePublished: now).save(flush: true, failOnError: true) manager.session.clear() when: @@ -778,15 +777,15 @@ class NamedQuerySpec extends GrailsDataTckSpec { 'Book 5' == publications[2].title } - void "Test get with id of object which does not match criteria"() { + void 'Test get with id of object which does not match criteria'() { given: def now = new Date() def hasBookInTitle = Publication.newInstance( - title: "Book 1", + title: 'Book 1', datePublished: now - 10).save(failOnError: true) def doesNotHaveBookInTitle = Publication.newInstance( - title: "Some Publication", + title: 'Some Publication', datePublished: now - 900).save(flush: true, failOnError: true) manager.session.clear() @@ -798,15 +797,15 @@ class NamedQuerySpec extends GrailsDataTckSpec { result == null } - void "Test get method returns correct object"() { + void 'Test get method returns correct object'() { given: def now = new Date() def newPublication = Publication.newInstance( - title: "Some New Book", + title: 'Some New Book', datePublished: now - 10).save(failOnError: true) def oldPublication = Publication.newInstance( - title: "Some Old Book", + title: 'Some Old Book', datePublished: now - 900).save(flush: true, failOnError: true) manager.session.clear() @@ -819,15 +818,15 @@ class NamedQuerySpec extends GrailsDataTckSpec { 'Some New Book' == publication.title } - void "Test get method returns null"() { + void 'Test get method returns null'() { given: def now = new Date() def newPublication = Publication.newInstance( - title: "Some New Book", + title: 'Some New Book', datePublished: now - 10).save(failOnError: true) def oldPublication = Publication.newInstance( - title: "Some Old Book", + title: 'Some Old Book', datePublished: now - 900).save(flush: true, failOnError: true) manager.session.clear() @@ -839,15 +838,15 @@ class NamedQuerySpec extends GrailsDataTckSpec { publication == null } - void "Test count method following named criteria"() { + void 'Test count method following named criteria'() { given: def now = new Date() def newPublication = Publication.newInstance( - title: "Book Some New ", + title: 'Book Some New ', datePublished: now - 10).save(failOnError: true) def oldPublication = Publication.newInstance( - title: "Book Some Old ", + title: 'Book Some Old ', datePublished: now - 900).save(flush: true, failOnError: true) manager.session.clear() @@ -861,15 +860,15 @@ class NamedQuerySpec extends GrailsDataTckSpec { 1 == recentPublicationsCount } - void "Test count with parameterized named query"() { + void 'Test count with parameterized named query'() { given: def now = new Date() - Publication.newInstance(title: "Book", + Publication.newInstance(title: 'Book', datePublished: now - 10).save(failOnError: true) - Publication.newInstance(title: "Book", + Publication.newInstance(title: 'Book', datePublished: now - 10).save(failOnError: true) - Publication.newInstance(title: "Book", + Publication.newInstance(title: 'Book', datePublished: now - 900).save(flush: true, failOnError: true) manager.session.clear() @@ -881,7 +880,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 2 == recentPublicationsCount } - void "Test max parameter"() { + void 'Test max parameter'() { given: (1..25).each { num -> Publication.newInstance(title: "Book Number ${num}", @@ -894,7 +893,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 10 == pubs?.size() } - void "Test max results"() { + void 'Test max results'() { given: (1..25).each { num -> Publication.newInstance(title: 'Book Title', @@ -908,7 +907,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 10 == pubs?.size() } - void "Test findAllWhere method combined with named query"() { + void 'Test findAllWhere method combined with named query'() { given: def now = new Date() (1..5).each { num -> @@ -925,7 +924,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 3 == pubs?.size() } - void "Test findAllWhere method with named query and disjunction"() { + void 'Test findAllWhere method with named query and disjunction'() { given: def now = new Date() @@ -957,13 +956,13 @@ class NamedQuerySpec extends GrailsDataTckSpec { 2 == publications?.size() } - void "Test get with parameterized named query"() { + void 'Test get with parameterized named query'() { given: def now = new Date() - def recentPub = Publication.newInstance(title: "Some Title", + def recentPub = Publication.newInstance(title: 'Some Title', datePublished: now).save() - def oldPub = Publication.newInstance(title: "Some Title", + def oldPub = Publication.newInstance(title: 'Some Title', datePublished: now - 900).save() when: @@ -979,7 +978,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { recentPub.id == pub?.id } - void "Test named query with one parameter"() { + void 'Test named query with one parameter'() { given: def now = new Date() @@ -998,7 +997,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 3 == pubs?.size() } - void "Test named query with multiple parameters"() { + void 'Test named query with multiple parameters'() { given: def now = new Date() @@ -1015,7 +1014,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 3 == pubs?.size() } - void "Test named query with multiple parameters and dynamic finder"() { + void 'Test named query with multiple parameters and dynamic finder'() { given: def now = new Date() (1..5).each { num -> @@ -1034,7 +1033,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 2 == pubs?.size() } - void "Test named query with multiple parameters and map"() { + void 'Test named query with multiple parameters and map'() { given: def now = new Date() @@ -1051,7 +1050,7 @@ class NamedQuerySpec extends GrailsDataTckSpec { 4 == pubs?.size() } - void "Test findWhere with named query"() { + void 'Test findWhere with named query'() { given: def now = new Date() diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NegationSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NegationSpec.groovy index cbeca798741..d7f9de19522 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NegationSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NegationSpec.groovy @@ -18,70 +18,70 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Book import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Book /** * @author graemerocher */ class NegationSpec extends GrailsDataTckSpec { - void "Test negation in dynamic finder"() { + void 'Test negation in dynamic finder'() { given: - new Book(title: "The Stand", author: "Stephen King").save() - new Book(title: "The Shining", author: "Stephen King").save() - new Book(title: "Along Came a Spider", author: "James Patterson").save() + new Book(title: 'The Stand', author: 'Stephen King').save() + new Book(title: 'The Shining', author: 'Stephen King').save() + new Book(title: 'Along Came a Spider', author: 'James Patterson').save() when: - def results = Book.findAllByAuthorNotEqual("James Patterson") - def author = Book.findByAuthorNotEqual("Stephen King") + def results = Book.findAllByAuthorNotEqual('James Patterson') + def author = Book.findByAuthorNotEqual('Stephen King') then: results.size() == 2 - results[0].author == "Stephen King" - results[1].author == "Stephen King" + results[0].author == 'Stephen King' + results[1].author == 'Stephen King' author != null - author.author == "James Patterson" + author.author == 'James Patterson' } - void "Test simple negation in criteria"() { + void 'Test simple negation in criteria'() { given: - new Book(title: "The Stand", author: "Stephen King").save() - new Book(title: "The Shining", author: "Stephen King").save() - new Book(title: "Along Came a Spider", author: "James Patterson").save() + new Book(title: 'The Stand', author: 'Stephen King').save() + new Book(title: 'The Shining', author: 'Stephen King').save() + new Book(title: 'Along Came a Spider', author: 'James Patterson').save() when: - def results = Book.withCriteria { ne("author", "James Patterson") } - def author = Book.createCriteria().get { ne("author", "Stephen King") } + def results = Book.withCriteria { ne('author', 'James Patterson') } + def author = Book.createCriteria().get { ne('author', 'Stephen King') } then: results.size() == 2 - results[0].author == "Stephen King" - results[1].author == "Stephen King" + results[0].author == 'Stephen King' + results[1].author == 'Stephen King' author != null - author.author == "James Patterson" + author.author == 'James Patterson' } - void "Test complex negation in criteria"() { + void 'Test complex negation in criteria'() { given: - new Book(title: "The Stand", author: "Stephen King").save() - new Book(title: "The Shining", author: "Stephen King").save() - new Book(title: "Along Came a Spider", author: "James Patterson").save() - new Book(title: "The Girl with the Dragon Tattoo", author: "Stieg Larsson").save() + new Book(title: 'The Stand', author: 'Stephen King').save() + new Book(title: 'The Shining', author: 'Stephen King').save() + new Book(title: 'Along Came a Spider', author: 'James Patterson').save() + new Book(title: 'The Girl with the Dragon Tattoo', author: 'Stieg Larsson').save() when: def results = Book.withCriteria { not { - eq 'title', 'The Stand' - eq 'author', 'James Patterson' + eq('title', 'The Stand') + eq('author', 'James Patterson') } } then: results.size() == 2 - results.find { it.author == "Stieg Larsson" } != null - results.find { it.author == "Stephen King" && it.title == "The Shining" } != null + results.find { it.author == 'Stieg Larsson' } != null + results.find { it.author == 'Stephen King' && it.title == 'The Shining' } != null } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NotInListSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NotInListSpec.groovy index c8f0777c3b6..036aaadfdaf 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NotInListSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NotInListSpec.groovy @@ -18,22 +18,22 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.TestEntity import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.TestEntity /** * Created by graemerocher on 06/03/2017. */ class NotInListSpec extends GrailsDataTckSpec { - void "test not in list returns the correct results"() { + void 'test not in list returns the correct results'() { when: - new TestEntity(name: "Fred").save() - new TestEntity(name: "Bob").save() - new TestEntity(name: "Jack").save(flush: true) + new TestEntity(name: 'Fred').save() + new TestEntity(name: 'Bob').save() + new TestEntity(name: 'Jack').save(flush: true) then: - TestEntity.countByNameNotInList(['Fred', "Bob"]) == 1 - TestEntity.findByNameNotInList(['Fred', "Bob"]).name == "Jack" + TestEntity.countByNameNotInList(['Fred', 'Bob']) == 1 + TestEntity.findByNameNotInList(['Fred', 'Bob']).name == 'Jack' } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NullValueEqualSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NullValueEqualSpec.groovy index cf4135040ed..496d37f3f8a 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NullValueEqualSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/NullValueEqualSpec.groovy @@ -18,17 +18,18 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import spock.lang.IgnoreIf +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.TestEntity + class NullValueEqualSpec extends GrailsDataTckSpec { - void "test null value in equal"() { + void 'test null value in equal'() { when: - new TestEntity(name: "Fred", age: null).save(failOnError: true) - new TestEntity(name: "Bob", age: 11).save(failOnError: true) - new TestEntity(name: "Jack", age: null).save(flush: true, failOnError: true) + new TestEntity(name: 'Fred', age: null).save(failOnError: true) + new TestEntity(name: 'Bob', age: 11).save(failOnError: true) + new TestEntity(name: 'Jack', age: null).save(flush: true, failOnError: true) then: TestEntity.countByAge(11) == 1 @@ -37,11 +38,11 @@ class NullValueEqualSpec extends GrailsDataTckSpec { } @IgnoreIf({ System.getProperty('hibernate5.gorm.suite') }) - void "test null value in not equal"() { + void 'test null value in not equal'() { when: - new TestEntity(name: "Fred", age: null).save(failOnError: true) - new TestEntity(name: "Bob", age: 11).save(failOnError: true) - new TestEntity(name: "Jack", age: null).save(flush: true, failOnError: true) + new TestEntity(name: 'Fred', age: null).save(failOnError: true) + new TestEntity(name: 'Bob', age: 11).save(failOnError: true) + new TestEntity(name: 'Jack', age: null).save(flush: true, failOnError: true) then: TestEntity.countByAgeNotEqual(11) == 2 diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OneToManySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OneToManySpec.groovy index 286dd07d3d0..0219d3ca6b8 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OneToManySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OneToManySpec.groovy @@ -19,28 +19,28 @@ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.Country import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.domains.Pet import org.apache.grails.data.testing.tck.domains.PetType -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * @author graemerocher */ class OneToManySpec extends GrailsDataTckSpec { - void "test save and return unidirectional one to many"() { + void 'test save and return unidirectional one to many'() { given: - Person p = new Person(firstName: "Fred", lastName: "Flinstone") - Country c = new Country(name: "Dinoville") + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone') + Country c = new Country(name: 'Dinoville') .addToResidents(p) .save(flush: true) manager.session.clear() when: - c = Country.findByName("Dinoville") + c = Country.findByName('Dinoville') then: c != null @@ -49,10 +49,10 @@ class OneToManySpec extends GrailsDataTckSpec { c.residents.every { it instanceof Person } == true when: - c.addToResidents(new Person(firstName: "Barney", lastName: "Rubble")) + c.addToResidents(new Person(firstName: 'Barney', lastName: 'Rubble')) c.save(flush: true) manager.session.clear() - c = Country.findByName("Dinoville") + c = Country.findByName('Dinoville') then: c != null @@ -61,21 +61,21 @@ class OneToManySpec extends GrailsDataTckSpec { c.residents.every { it instanceof Person } == true } - void "test save and return bidirectional one to many"() { + void 'test save and return bidirectional one to many'() { given: - Person p = new Person(firstName: "Fred", lastName: "Flinstone") - p.addToPets(new Pet(name: "Dino", type: new PetType(name: "Dinosaur"))) + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone') + p.addToPets(new Pet(name: 'Dino', type: new PetType(name: 'Dinosaur'))) p.save(flush: true) - new Person(firstName: "Barney", lastName: "Rubble") - .addToPets(new Pet(name: "T Rex", type: new PetType(name: "Dinosaur"))) - .addToPets(new Pet(name: "Stego", type: new PetType(name: "Dinosaur"))) + new Person(firstName: 'Barney', lastName: 'Rubble') + .addToPets(new Pet(name: 'T Rex', type: new PetType(name: 'Dinosaur'))) + .addToPets(new Pet(name: 'Stego', type: new PetType(name: 'Dinosaur'))) .save(flush: true) manager.session.clear() when: - p = Person.findByFirstName("Fred") + p = Person.findByFirstName('Fred') then: p != null @@ -88,10 +88,10 @@ class OneToManySpec extends GrailsDataTckSpec { pet.type.name == 'Dinosaur' when: - p.addToPets(new Pet(name: "Rex", type: new PetType(name: "Dinosaur"))) + p.addToPets(new Pet(name: 'Rex', type: new PetType(name: 'Dinosaur'))) p.save(flush: true) manager.session.clear() - p = Person.findByFirstName("Fred") + p = Person.findByFirstName('Fred') then: p != null @@ -100,18 +100,18 @@ class OneToManySpec extends GrailsDataTckSpec { p.pets.every { it instanceof Pet } == true } - void "test update inverse side of bidirectional one to many collection"() { + void 'test update inverse side of bidirectional one to many collection'() { given: - Person p = new Person(firstName: "Fred", lastName: "Flinstone").save() - new Pet(name: "Dino", type: new PetType(name: "Dinosaur"), owner: p).save() - Person p2 = new Person(firstName: "Barney", lastName: "Rubble").save() - new Pet(name: "T Rex", type: new PetType(name: "Dinosaur"), owner: p2).save() - new Pet(name: "Stego", type: new PetType(name: "Dinosaur"), owner: p2).save(flush: true) + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone').save() + new Pet(name: 'Dino', type: new PetType(name: 'Dinosaur'), owner: p).save() + Person p2 = new Person(firstName: 'Barney', lastName: 'Rubble').save() + new Pet(name: 'T Rex', type: new PetType(name: 'Dinosaur'), owner: p2).save() + new Pet(name: 'Stego', type: new PetType(name: 'Dinosaur'), owner: p2).save(flush: true) manager.session.clear() when: - p = Person.findByFirstName("Fred") + p = Person.findByFirstName('Fred') then: p != null @@ -124,16 +124,16 @@ class OneToManySpec extends GrailsDataTckSpec { pet.type.name == 'Dinosaur' } - void "test update inverse side of bidirectional one to many happens before flushing the session"() { + void 'test update inverse side of bidirectional one to many happens before flushing the session'() { if (manager.session.datastore.getClass().name.contains('Hibernate')) { return } given: - Person person = new Person(firstName: "Fred", lastName: "Flinstone").save() - Pet dino = new Pet(name: "Dino", type: new PetType(name: "Dinosaur"), owner: person).save() - Pet trex = new Pet(name: "Trex", type: new PetType(name: "Dinosaur"), owner: person).save() + Person person = new Person(firstName: 'Fred', lastName: 'Flinstone').save() + Pet dino = new Pet(name: 'Dino', type: new PetType(name: 'Dinosaur'), owner: person).save() + Pet trex = new Pet(name: 'Trex', type: new PetType(name: 'Dinosaur'), owner: person).save() expect: dino.owner == person @@ -150,22 +150,22 @@ class OneToManySpec extends GrailsDataTckSpec { person.pets.size() == 2 } - void "Test persist of association with proxy"() { - given: "A domain model with a many-to-one" - def person = new Person(firstName: "Fred", lastName: "Flintstone") + void 'Test persist of association with proxy'() { + given: 'A domain model with a many-to-one' + def person = new Person(firstName: 'Fred', lastName: 'Flintstone') person.save(flush: true) manager.session.clear() - def pet = new Pet(name: "Dino", owner: Person.load(person.id)) + def pet = new Pet(name: 'Dino', owner: Person.load(person.id)) pet.save(flush: true) manager.session.clear() - when: "The association is queried" - pet = Pet.findByName("Dino") + when: 'The association is queried' + pet = Pet.findByName('Dino') - then: "The domain model is valid" + then: 'The domain model is valid' pet != null - pet.name == "Dino" + pet.name == 'Dino' pet.owner != null - pet.owner.firstName == "Fred" + pet.owner.firstName == 'Fred' } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OneToOneSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OneToOneSpec.groovy index 2017d3b6841..5723e3b3145 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OneToOneSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OneToOneSpec.groovy @@ -18,46 +18,46 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.Face import org.apache.grails.data.testing.tck.domains.Nose import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.domains.Pet -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.grails.datastore.mapping.model.types.OneToOne class OneToOneSpec extends GrailsDataTckSpec { - def "Test persist and retrieve unidirectional many-to-one"() { - given: "A domain model with a many-to-one" - def person = new Person(firstName: "Fred", lastName: "Flintstone") - def pet = new Pet(name: "Dino", owner: person) + def 'Test persist and retrieve unidirectional many-to-one'() { + given: 'A domain model with a many-to-one' + def person = new Person(firstName: 'Fred', lastName: 'Flintstone') + def pet = new Pet(name: 'Dino', owner: person) person.save() pet.save(flush: true) manager.session.clear() - when: "The association is queried" - pet = Pet.findByName("Dino") + when: 'The association is queried' + pet = Pet.findByName('Dino') - then: "The domain model is valid" + then: 'The domain model is valid' pet != null - pet.name == "Dino" + pet.name == 'Dino' pet.ownerId == person.id - pet.owner.firstName == "Fred" + pet.owner.firstName == 'Fred' } - def "Test persist and retrieve one-to-one with inverse key"() { - given: "A domain model with a one-to-one" - def face = new Face(name: "Joe") + def 'Test persist and retrieve one-to-one with inverse key'() { + given: 'A domain model with a one-to-one' + def face = new Face(name: 'Joe') def nose = new Nose(hasFreckles: true, face: face) face.nose = nose face.save(flush: true) manager.session.clear() - when: "The association is queried" + when: 'The association is queried' face = Face.get(face.id) def association = Face.gormPersistentEntity.getPropertyByName('nose') - then: "The domain model is valid" + then: 'The domain model is valid' association instanceof OneToOne association.bidirectional association.associatedEntity.javaClass == Nose @@ -66,14 +66,14 @@ class OneToOneSpec extends GrailsDataTckSpec { face.nose != null face.nose.hasFreckles == true - when: "The inverse association is queried" + when: 'The inverse association is queried' manager.session.clear() nose = Nose.get(nose.id) - then: "The domain model is valid" + then: 'The domain model is valid' nose != null nose.hasFreckles == true nose.face != null - nose.face.name == "Joe" + nose.face.name == 'Joe' } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OptimisticLockingSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OptimisticLockingSpec.groovy index 3e2eec1cab4..e0027fb40ef 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OptimisticLockingSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OptimisticLockingSpec.groovy @@ -18,11 +18,12 @@ */ package org.apache.grails.data.testing.tck.tests +import spock.lang.IgnoreIf + +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.OptLockNotVersioned import org.apache.grails.data.testing.tck.domains.OptLockVersioned -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.grails.datastore.mapping.core.OptimisticLockingException -import spock.lang.IgnoreIf /** * @author Burt Beckwith @@ -35,7 +36,7 @@ class OptimisticLockingSpec extends GrailsDataTckSpec { def o = new OptLockVersioned(name: 'locked') when: - o.save flush: true + o.save(flush: true) then: o.version == 0 @@ -44,7 +45,7 @@ class OptimisticLockingSpec extends GrailsDataTckSpec { manager.session.clear() o = OptLockVersioned.get(o.id) o.name = 'Fred' - o.save flush: true + o.save(flush: true) then: o.version == 1 @@ -77,7 +78,7 @@ class OptimisticLockingSpec extends GrailsDataTckSpec { reloaded.save(flush: true) } }.join() - sleep 2000 // heisenbug + sleep(2000) // heisenbug o.name += ' in main session' def ex @@ -114,7 +115,7 @@ class OptimisticLockingSpec extends GrailsDataTckSpec { reloaded.save(flush: true) } }.join() - sleep 2000 // heisenbug + sleep(2000) // heisenbug o.name += ' in main session' def ex diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OrderBySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OrderBySpec.groovy index f4a84bdbb76..e4a4fb516d3 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OrderBySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/OrderBySpec.groovy @@ -18,26 +18,26 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * Abstract base test for order by queries. Subclasses should do the necessary setup to configure GORM */ class OrderBySpec extends GrailsDataTckSpec { - void "Test order with criteria"() { + void 'Test order with criteria'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank", "Joe", "Ernie"].each { + ['Bob', 'Fred', 'Barney', 'Frank', 'Joe', 'Ernie'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } when: def results = TestEntity.createCriteria().list { - order "age" + order('age') } then: 40 == results[0].age @@ -46,7 +46,7 @@ class OrderBySpec extends GrailsDataTckSpec { when: results = TestEntity.createCriteria().list { - order "age", "desc" + order('age', 'desc') } then: @@ -55,16 +55,16 @@ class OrderBySpec extends GrailsDataTckSpec { 43 == results[2].age } - void "Test order by with list() method"() { + void 'Test order by with list() method'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank", "Joe", "Ernie"].each { + ['Bob', 'Fred', 'Barney', 'Frank', 'Joe', 'Ernie'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } when: - def results = TestEntity.list(sort: "age") + def results = TestEntity.list(sort: 'age') then: 40 == results[0].age @@ -72,7 +72,7 @@ class OrderBySpec extends GrailsDataTckSpec { 42 == results[2].age when: - results = TestEntity.list(sort: "age", order: "desc") + results = TestEntity.list(sort: 'age', order: 'desc') then: 45 == results[0].age @@ -80,16 +80,16 @@ class OrderBySpec extends GrailsDataTckSpec { 43 == results[2].age } - void "Test order by property name with dynamic finder"() { + void 'Test order by property name with dynamic finder'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank", "Joe", "Ernie"].each { + ['Bob', 'Fred', 'Barney', 'Frank', 'Joe', 'Ernie'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } when: - def results = TestEntity.findAllByAgeGreaterThanEquals(40, [sort: "age"]) + def results = TestEntity.findAllByAgeGreaterThanEquals(40, [sort: 'age']) then: 40 == results[0].age @@ -97,7 +97,7 @@ class OrderBySpec extends GrailsDataTckSpec { 42 == results[2].age when: - results = TestEntity.findAllByAgeGreaterThanEquals(40, [sort: "age", order: "desc"]) + results = TestEntity.findAllByAgeGreaterThanEquals(40, [sort: 'age', order: 'desc']) then: 45 == results[0].age diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PagedResultSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PagedResultSpec.groovy index 6de8288982d..8cb9e6b7b9d 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PagedResultSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PagedResultSpec.groovy @@ -18,13 +18,13 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Person class PagedResultSpec extends GrailsDataTckSpec { - void "Test that a getTotalCount will return 0 on empty result from the list() method"() { - when: "A query is executed that returns no results" + void 'Test that a getTotalCount will return 0 on empty result from the list() method'() { + when: 'A query is executed that returns no results' def results = Person.list(max: 1) then: @@ -32,43 +32,43 @@ class PagedResultSpec extends GrailsDataTckSpec { results.totalCount == 0 } - void "Test that a paged result list is returned from the list() method with pagination params"() { - given: "Some people" + void 'Test that a paged result list is returned from the list() method with pagination params'() { + given: 'Some people' createPeople() - when: "The list method is used with pagination params" + when: 'The list method is used with pagination params' def results = Person.list(offset: 2, max: 2) - then: "You get a paged result list back" + then: 'You get a paged result list back' results.getClass().simpleName == 'PagedResultList' // Grails/Hibernate has a custom class in different package results.size() == 2 - results[0].firstName == "Bart" - results[1].firstName == "Lisa" + results[0].firstName == 'Bart' + results[1].firstName == 'Lisa' results.totalCount == 6 } - void "Test that a paged result list is returned from the list() method with pagination and sorting params"() { - given: "Some people" + void 'Test that a paged result list is returned from the list() method with pagination and sorting params'() { + given: 'Some people' createPeople() - when: "The list method is used with pagination params" + when: 'The list method is used with pagination params' def results = Person.list(offset: 2, max: 2, sort: 'firstName', order: 'DESC') - then: "You get a paged result list back" + then: 'You get a paged result list back' results.getClass().simpleName == 'PagedResultList' // Grails/Hibernate has a custom class in different package results.size() == 2 - results[0].firstName == "Homer" - results[1].firstName == "Fred" + results[0].firstName == 'Homer' + results[1].firstName == 'Fred' results.totalCount == 6 } - void "Test that a getTotalCount will return 0 on empty result from the criteria"() { - given: "Some people" + void 'Test that a getTotalCount will return 0 on empty result from the criteria'() { + given: 'Some people' createPeople() - when: "A query is executed that returns no results" + when: 'A query is executed that returns no results' def results = Person.createCriteria().list(max: 1) { - eq 'lastName', 'NotFound' + eq('lastName', 'NotFound') } then: @@ -76,46 +76,46 @@ class PagedResultSpec extends GrailsDataTckSpec { results.totalCount == 0 } - void "Test that a paged result list is returned from the critera with pagination params"() { - given: "Some people" + void 'Test that a paged result list is returned from the critera with pagination params'() { + given: 'Some people' createPeople() - when: "The list method is used with pagination params" + when: 'The list method is used with pagination params' def results = Person.createCriteria().list(offset: 1, max: 2) { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } - then: "You get a paged result list back" + then: 'You get a paged result list back' results.getClass().simpleName == 'PagedResultList' // Grails/Hibernate has a custom class in different package results.size() == 2 - results[0].firstName == "Marge" - results[1].firstName == "Bart" + results[0].firstName == 'Marge' + results[1].firstName == 'Bart' results.totalCount == 4 } - void "Test that a paged result list is returned from the critera with pagination and sorting params"() { - given: "Some people" + void 'Test that a paged result list is returned from the critera with pagination and sorting params'() { + given: 'Some people' createPeople() - when: "The list method is used with pagination params" + when: 'The list method is used with pagination params' def results = Person.createCriteria().list(offset: 1, max: 2, sort: 'firstName', order: 'DESC') { - eq 'lastName', 'Simpson' + eq('lastName', 'Simpson') } - then: "You get a paged result list back" + then: 'You get a paged result list back' results.getClass().simpleName == 'PagedResultList' // Grails/Hibernate has a custom class in different package results.size() == 2 - results[0].firstName == "Lisa" - results[1].firstName == "Homer" + results[0].firstName == 'Lisa' + results[1].firstName == 'Homer' results.totalCount == 4 } protected void createPeople() { - new Person(firstName: "Homer", lastName: "Simpson", age: 45).save() - new Person(firstName: "Marge", lastName: "Simpson", age: 40).save() - new Person(firstName: "Bart", lastName: "Simpson", age: 9).save() - new Person(firstName: "Lisa", lastName: "Simpson", age: 7).save() - new Person(firstName: "Barney", lastName: "Rubble", age: 35).save() - new Person(firstName: "Fred", lastName: "Flinstone", age: 41).save() + new Person(firstName: 'Homer', lastName: 'Simpson', age: 45).save() + new Person(firstName: 'Marge', lastName: 'Simpson', age: 40).save() + new Person(firstName: 'Bart', lastName: 'Simpson', age: 9).save() + new Person(firstName: 'Lisa', lastName: 'Simpson', age: 7).save() + new Person(firstName: 'Barney', lastName: 'Rubble', age: 35).save() + new Person(firstName: 'Fred', lastName: 'Flinstone', age: 41).save() } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PersistenceEventListenerSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PersistenceEventListenerSpec.groovy index f610897be93..8cf0f34d41f 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PersistenceEventListenerSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PersistenceEventListenerSpec.groovy @@ -18,9 +18,12 @@ */ package org.apache.grails.data.testing.tck.tests +import org.springframework.context.ApplicationEvent +import org.springframework.context.ConfigurableApplicationContext + import grails.gorm.DetachedCriteria -import org.apache.grails.data.testing.tck.domains.Simples import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Simples import org.grails.datastore.gorm.events.ConfigurableApplicationEventPublisher import org.grails.datastore.mapping.core.Datastore import org.grails.datastore.mapping.engine.event.AbstractPersistenceEvent @@ -29,13 +32,12 @@ import org.grails.datastore.mapping.engine.event.EventType import org.grails.datastore.mapping.engine.event.PostDeleteEvent import org.grails.datastore.mapping.engine.event.PreDeleteEvent import org.grails.datastore.mapping.engine.event.ValidationEvent -import org.springframework.context.ApplicationEvent -import org.springframework.context.ConfigurableApplicationContext /** * @author Tom Widmer */ class PersistenceEventListenerSpec extends GrailsDataTckSpec { + SpecPersistenceListener listener void setupSpec() { @@ -53,10 +55,10 @@ class PersistenceEventListenerSpec extends GrailsDataTckSpec { } } - void "Test delete events"() { + void 'Test delete events'() { given: def p = new Simples() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -81,7 +83,7 @@ class PersistenceEventListenerSpec extends GrailsDataTckSpec { listener.events[-2] instanceof PreDeleteEvent } - void "Test multi-delete events"() { + void 'Test multi-delete events'() { given: def freds = (1..3).collect { new Simples(name: "Fred$it").save(flush: true) @@ -113,11 +115,11 @@ class PersistenceEventListenerSpec extends GrailsDataTckSpec { } } - void "Test update events"() { + void 'Test update events'() { given: def p = new Simples() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -125,27 +127,27 @@ class PersistenceEventListenerSpec extends GrailsDataTckSpec { p = Simples.get(p.id) then: - "Fred" == p.name + 'Fred' == p.name 0 == listener.PreUpdateCount 0 == listener.PostUpdateCount when: - p.name = "Bob" + p.name = 'Bob' p.save(flush: true) manager.session.clear() p = Simples.get(p.id) then: - "Bob" == p.name + 'Bob' == p.name 1 == listener.PreUpdateCount 1 == listener.PostUpdateCount } - void "Test insert events"() { + void 'Test insert events'() { given: def p = new Simples() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -153,31 +155,31 @@ class PersistenceEventListenerSpec extends GrailsDataTckSpec { p = Simples.get(p.id) then: - "Fred" == p.name + 'Fred' == p.name 0 == listener.PreUpdateCount 1 == listener.PreInsertCount 0 == listener.PostUpdateCount 1 == listener.PostInsertCount when: - p.name = "Bob" + p.name = 'Bob' p.save(flush: true) manager.session.clear() p = Simples.get(p.id) then: - "Bob" == p.name + 'Bob' == p.name 1 == listener.PreUpdateCount 1 == listener.PreInsertCount 1 == listener.PostUpdateCount 1 == listener.PostInsertCount } - void "Test load events"() { + void 'Test load events'() { given: def p = new Simples() - p.name = "Fred" + p.name = 'Fred' p.save(flush: true) manager.session.clear() @@ -185,7 +187,7 @@ class PersistenceEventListenerSpec extends GrailsDataTckSpec { p = Simples.get(p.id) then: - "Fred" == p.name + 'Fred' == p.name if (!'JpaSession'.equals(manager.session.getClass().simpleName)) { // JPA doesn't seem to support a pre-load event 1 == listener.PreLoadCount @@ -193,7 +195,7 @@ class PersistenceEventListenerSpec extends GrailsDataTckSpec { 1 == listener.PostLoadCount } - void "Test multi-load events"() { + void 'Test multi-load events'() { given: def freds = (1..3).collect { new Simples(name: "Fred$it").save(flush: true) @@ -214,11 +216,11 @@ class PersistenceEventListenerSpec extends GrailsDataTckSpec { 3 == listener.PostLoadCount } - void "Test validation events"() { + void 'Test validation events'() { given: def p = new Simples() - p.name = "Fred" + p.name = 'Fred' when: p.validate() @@ -252,15 +254,15 @@ class SpecPersistenceListener extends AbstractPersistenceEventListener { List events = [] int PreDeleteCount, - PreInsertCount, - PreUpdateCount, - PostUpdateCount, - PostDeleteCount, - PostInsertCount, - PreLoadCount, - PostLoadCount, - SaveOrUpdateCount, - ValidationCount + PreInsertCount, + PreUpdateCount, + PostUpdateCount, + PostDeleteCount, + PostInsertCount, + PreLoadCount, + PostLoadCount, + SaveOrUpdateCount, + ValidationCount @Override protected void onPersistenceEvent(AbstractPersistenceEvent event) { diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PropertyComparisonQuerySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PropertyComparisonQuerySpec.groovy index e9ea5dbd51d..019f68f2196 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PropertyComparisonQuerySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/PropertyComparisonQuerySpec.groovy @@ -18,8 +18,8 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Dog import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Dog /** * Tests for criteria queries that compare two properties @@ -30,118 +30,118 @@ class PropertyComparisonQuerySpec extends GrailsDataTckSpec { manager.domainClasses.addAll([Dog]) } - void "Test geProperty query"() { - given: "Some dead and alive dogs" - new Dog(name: "Barney", age: 7, deathAge: 14).save() - new Dog(name: "Fred", age: 13, deathAge: 13).save() - new Dog(name: "Jack", age: 14, deathAge: 13).save() - new Dog(name: "Joe", age: 4, deathAge: 14).save(flush: true) + void 'Test geProperty query'() { + given: 'Some dead and alive dogs' + new Dog(name: 'Barney', age: 7, deathAge: 14).save() + new Dog(name: 'Fred', age: 13, deathAge: 13).save() + new Dog(name: 'Jack', age: 14, deathAge: 13).save() + new Dog(name: 'Joe', age: 4, deathAge: 14).save(flush: true) - when: "We query for dogs that are alive" + when: 'We query for dogs that are alive' def results = Dog.withCriteria { - geProperty 'age', 'deathAge' - order 'name' + geProperty('age', 'deathAge') + order('name') } - then: "3 dogs are found" + then: '3 dogs are found' Dog.count() == 4 results.size() == 2 - results[0].name == "Fred" - results[1].name == "Jack" + results[0].name == 'Fred' + results[1].name == 'Jack' } - void "Test leProperty query"() { - given: "Some dead and alive dogs" - new Dog(name: "Barney", age: 7, deathAge: 14).save() - new Dog(name: "Fred", age: 13, deathAge: 13).save() - new Dog(name: "Jack", age: 14, deathAge: 13).save() - new Dog(name: "Joe", age: 4, deathAge: 14).save(flush: true) + void 'Test leProperty query'() { + given: 'Some dead and alive dogs' + new Dog(name: 'Barney', age: 7, deathAge: 14).save() + new Dog(name: 'Fred', age: 13, deathAge: 13).save() + new Dog(name: 'Jack', age: 14, deathAge: 13).save() + new Dog(name: 'Joe', age: 4, deathAge: 14).save(flush: true) - when: "We query for dogs that are alive" + when: 'We query for dogs that are alive' def results = Dog.withCriteria { - leProperty 'age', 'deathAge' - order 'name' + leProperty('age', 'deathAge') + order('name') } - then: "3 dogs are found" + then: '3 dogs are found' Dog.count() == 4 results.size() == 3 - results[0].name == "Barney" - results[1].name == "Fred" - results[2].name == "Joe" + results[0].name == 'Barney' + results[1].name == 'Fred' + results[2].name == 'Joe' } - void "Test ltProperty query"() { - given: "Some dead and alive dogs" - new Dog(name: "Barney", age: 7, deathAge: 14).save() - new Dog(name: "Fred", age: 13, deathAge: 13).save() - new Dog(name: "Joe", age: 4, deathAge: 14).save(flush: true) + void 'Test ltProperty query'() { + given: 'Some dead and alive dogs' + new Dog(name: 'Barney', age: 7, deathAge: 14).save() + new Dog(name: 'Fred', age: 13, deathAge: 13).save() + new Dog(name: 'Joe', age: 4, deathAge: 14).save(flush: true) - when: "We query for dogs that are alive" + when: 'We query for dogs that are alive' def results = Dog.withCriteria { - ltProperty 'age', 'deathAge' - order 'name' + ltProperty('age', 'deathAge') + order('name') } - then: "2 dogs are found" + then: '2 dogs are found' Dog.count() == 3 results.size() == 2 - results[0].name == "Barney" - results[1].name == "Joe" + results[0].name == 'Barney' + results[1].name == 'Joe' } - void "Test gtProperty query"() { - given: "Some dead and alive dogs" - new Dog(name: "Barney", age: 7, deathAge: 14).save() - new Dog(name: "Fred", age: 13, deathAge: 13).save() - new Dog(name: "Joe", age: 4, deathAge: 14).save(flush: true) + void 'Test gtProperty query'() { + given: 'Some dead and alive dogs' + new Dog(name: 'Barney', age: 7, deathAge: 14).save() + new Dog(name: 'Fred', age: 13, deathAge: 13).save() + new Dog(name: 'Joe', age: 4, deathAge: 14).save(flush: true) - when: "We query for dogs that are alive" + when: 'We query for dogs that are alive' def results = Dog.withCriteria { - gtProperty 'deathAge', 'age' - order 'name' + gtProperty('deathAge', 'age') + order('name') } - then: "2 dogs are found" + then: '2 dogs are found' Dog.count() == 3 results.size() == 2 - results[0].name == "Barney" - results[1].name == "Joe" + results[0].name == 'Barney' + results[1].name == 'Joe' } - void "Test neProperty query"() { - given: "Some dead and alive dogs" - new Dog(name: "Barney", age: 7, deathAge: 14).save() - new Dog(name: "Fred", age: 13, deathAge: 13).save() - new Dog(name: "Joe", age: 4, deathAge: 14).save(flush: true) + void 'Test neProperty query'() { + given: 'Some dead and alive dogs' + new Dog(name: 'Barney', age: 7, deathAge: 14).save() + new Dog(name: 'Fred', age: 13, deathAge: 13).save() + new Dog(name: 'Joe', age: 4, deathAge: 14).save(flush: true) - when: "We query for dogs that are alive" + when: 'We query for dogs that are alive' def results = Dog.withCriteria { - neProperty 'age', 'deathAge' - order 'name' + neProperty('age', 'deathAge') + order('name') } - then: "2 dogs are found" + then: '2 dogs are found' Dog.count() == 3 results.size() == 2 - results[0].name == "Barney" - results[1].name == "Joe" + results[0].name == 'Barney' + results[1].name == 'Joe' } - void "Test eqProperty query"() { - given: "Some dead and alive dogs" - new Dog(name: "Barney", age: 7, deathAge: 14).save() - new Dog(name: "Fred", age: 13, deathAge: 13).save() - new Dog(name: "Joe", age: 4, deathAge: 14).save(flush: true) + void 'Test eqProperty query'() { + given: 'Some dead and alive dogs' + new Dog(name: 'Barney', age: 7, deathAge: 14).save() + new Dog(name: 'Fred', age: 13, deathAge: 13).save() + new Dog(name: 'Joe', age: 4, deathAge: 14).save(flush: true) - when: "We query for dogs that died" + when: 'We query for dogs that died' def results = Dog.withCriteria { - eqProperty 'age', 'deathAge' + eqProperty('age', 'deathAge') } - then: "1 dog is found" + then: '1 dog is found' Dog.count() == 3 results.size() == 1 - results[0].name == "Fred" + results[0].name == 'Fred' } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ProxyInitializationSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ProxyInitializationSpec.groovy index d3ee17dfa43..66653295936 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ProxyInitializationSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ProxyInitializationSpec.groovy @@ -18,9 +18,9 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ContactDetails import org.apache.grails.data.testing.tck.domains.Patient -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.grails.datastore.mapping.proxy.ProxyHandler class ProxyInitializationSpec extends GrailsDataTckSpec { @@ -29,11 +29,11 @@ class ProxyInitializationSpec extends GrailsDataTckSpec { manager.domainClasses.addAll([Patient, ContactDetails]) } - void "test if proxy is initialized"() { + void 'test if proxy is initialized'() { setup: final ProxyHandler proxyHandler = manager.session.mappingContext.getProxyHandler() - ContactDetails contactDetails = new ContactDetails(phoneNumber: "+1-202-555-0178").save(failOnError: true) + ContactDetails contactDetails = new ContactDetails(phoneNumber: '+1-202-555-0178').save(failOnError: true) Long patientId = new Patient(contactDetails: contactDetails).save(failOnError: true).id manager.session.flush() manager.session.clear() @@ -45,7 +45,7 @@ class ProxyInitializationSpec extends GrailsDataTckSpec { proxyHandler.isProxy(patient.contactDetails) when: - patient.contactDetails.phoneNumber = "+1-202-555-0178" + patient.contactDetails.phoneNumber = '+1-202-555-0178' then: proxyHandler.isInitialized(patient.contactDetails) diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ProxyLoadingSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ProxyLoadingSpec.groovy index 92682ae72b3..b3219f48336 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ProxyLoadingSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ProxyLoadingSpec.groovy @@ -18,19 +18,19 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * Abstract base test for loading proxies. Subclasses should do the necessary setup to configure GORM */ class ProxyLoadingSpec extends GrailsDataTckSpec { - void "Test load proxied instance directly"() { + void 'Test load proxied instance directly'() { given: - def t = new TestEntity(name: "Bob", age: 45, child: new ChildEntity(name: "Test Child")).save(flush: true) + def t = new TestEntity(name: 'Bob', age: 45, child: new ChildEntity(name: 'Test Child')).save(flush: true) when: def proxy = TestEntity.load(t.id) @@ -38,13 +38,13 @@ class ProxyLoadingSpec extends GrailsDataTckSpec { then: proxy != null t.id == proxy.id - "Bob" == proxy.name + 'Bob' == proxy.name } - void "Test query using proxied association"() { + void 'Test query using proxied association'() { given: - def child = new ChildEntity(name: "Test Child") - def t = new TestEntity(name: "Bob", age: 45, child: child).save() + def child = new ChildEntity(name: 'Test Child') + def t = new TestEntity(name: 'Bob', age: 45, child: child).save() when: def proxy = ChildEntity.load(child.id) diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryAfterPropertyChangeSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryAfterPropertyChangeSpec.groovy index bf46c24e469..10889d6c00d 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryAfterPropertyChangeSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryAfterPropertyChangeSpec.groovy @@ -19,33 +19,33 @@ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Person /** * @author graemerocher */ class QueryAfterPropertyChangeSpec extends GrailsDataTckSpec { - void "Test that an entity is de-indexed after a change to an indexed property"() { + void 'Test that an entity is de-indexed after a change to an indexed property'() { given: - def person = new Person(firstName: "Homer", lastName: "Simpson").save(flush: true) + def person = new Person(firstName: 'Homer', lastName: 'Simpson').save(flush: true) when: manager.session.clear() - person = Person.findByFirstName("Homer") + person = Person.findByFirstName('Homer') then: person != null when: - person.firstName = "Marge" + person.firstName = 'Marge' person.save(flush: true) manager.session.clear() - person = Person.findByFirstName("Homer") + person = Person.findByFirstName('Homer') then: - Person.findByFirstName("Marge") != null + Person.findByFirstName('Marge') != null person == null } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryByAssociationSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryByAssociationSpec.groovy index 34c13c5b360..3f7d9b17b03 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryByAssociationSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryByAssociationSpec.groovy @@ -18,22 +18,22 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * Abstract base test for query associations. Subclasses should do the necessary setup to configure GORM */ class QueryByAssociationSpec extends GrailsDataTckSpec { - void "Test query entity by single-ended association"() { + void 'Test query entity by single-ended association'() { given: def age = 40 - ["Bob", "Fred", "Barney", "Frank"].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } + ['Bob', 'Fred', 'Barney', 'Frank'].each { new TestEntity(name: it, age: age++, child: new ChildEntity(name: "$it Child")).save() } when: - def child = ChildEntity.findByName("Barney Child") + def child = ChildEntity.findByName('Barney Child') then: child != null @@ -44,6 +44,6 @@ class QueryByAssociationSpec extends GrailsDataTckSpec { then: t != null - "Barney" == t.name + 'Barney' == t.name } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryByNullSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryByNullSpec.groovy index 5774e7f5510..1142111138f 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryByNullSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryByNullSpec.groovy @@ -18,8 +18,8 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Person class QueryByNullSpec extends GrailsDataTckSpec { diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryEventsSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryEventsSpec.groovy index 2b3e8deb55d..68d90f188a7 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryEventsSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/QueryEventsSpec.groovy @@ -18,25 +18,26 @@ */ package org.apache.grails.data.testing.tck.tests +import spock.lang.IgnoreIf + +import org.springframework.context.ApplicationEvent +import org.springframework.context.event.SmartApplicationListener + import grails.gorm.DetachedCriteria +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.Simples import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.grails.datastore.mapping.query.event.AbstractQueryEvent import org.grails.datastore.mapping.query.event.PostQueryEvent import org.grails.datastore.mapping.query.event.PreQueryEvent -import org.springframework.context.ApplicationEvent -import org.springframework.context.event.SmartApplicationListener -import spock.lang.IgnoreIf -import spock.lang.PendingFeature -import spock.lang.PendingFeatureIf /** * Tests for query events. */ // TODO: the application context is null on hibernate tck tests, so this test errors on the add of the application listener -@IgnoreIf({ System.getProperty('hibernate5.gorm.suite') || System.getProperty('hibernate6.gorm.suite') || System.getProperty('mongodb.gorm.suite')}) +@IgnoreIf({ System.getProperty('hibernate5.gorm.suite') || System.getProperty('hibernate6.gorm.suite') || System.getProperty('mongodb.gorm.suite') }) class QueryEventsSpec extends GrailsDataTckSpec { + SpecQueryEventListener listener void setupSpec() { @@ -50,7 +51,7 @@ class QueryEventsSpec extends GrailsDataTckSpec { void "pre-events are fired before queries are run"() { when: - TestEntity.findByName 'bob' + TestEntity.findByName('bob') then: listener.events.size() >= 1 listener.events[0] instanceof PreQueryEvent @@ -58,12 +59,12 @@ class QueryEventsSpec extends GrailsDataTckSpec { listener.PreExecution == 1 when: - TestEntity.where {name == 'bob'}.list() + TestEntity.where { name == 'bob' }.list() then: listener.PreExecution == 2 when: - new DetachedCriteria(TestEntity).build({name == 'bob'}).list() + new DetachedCriteria(TestEntity).build({ name == 'bob' }).list() then: listener.PreExecution == 3 } @@ -74,7 +75,7 @@ class QueryEventsSpec extends GrailsDataTckSpec { new TestEntity(name: 'mark').save(flush: true) when: - TestEntity.findByName 'bob' + TestEntity.findByName('bob') then: listener.events.size() >= 1 listener.events[1] instanceof PostQueryEvent @@ -86,12 +87,12 @@ class QueryEventsSpec extends GrailsDataTckSpec { listener.PostExecution == 1 when: - TestEntity.where {name == 'bob'}.list() + TestEntity.where { name == 'bob' }.list() then: listener.PostExecution == 2 when: - new DetachedCriteria(TestEntity).build({name == 'bob'}).list() + new DetachedCriteria(TestEntity).build({ name == 'bob' }).list() then: listener.PostExecution == 3 } @@ -101,7 +102,7 @@ class QueryEventsSpec extends GrailsDataTckSpec { List events = [] int PreExecution, - PostExecution + PostExecution @Override void onApplicationEvent(ApplicationEvent event) { diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/RangeQuerySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/RangeQuerySpec.groovy index 5659cc0d025..abf02975cb9 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/RangeQuerySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/RangeQuerySpec.groovy @@ -18,25 +18,26 @@ */ package org.apache.grails.data.testing.tck.tests +import groovy.time.TimeCategory + +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.domains.Publication import org.apache.grails.data.testing.tck.domains.TestEntity -import groovy.time.TimeCategory -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * Abstract base test for querying ranges. Subclasses should do the necessary setup to configure GORM */ class RangeQuerySpec extends GrailsDataTckSpec { - void "Test between query with dates"() { + void 'Test between query with dates'() { given: def now = new Date() use(TimeCategory) { - new Publication(title: "The Guardian", datePublished: now - 5.minutes).save() - new Publication(title: "The Times", datePublished: now - 5.days).save() - new Publication(title: "The Observer", datePublished: now - 10.days).save() + new Publication(title: 'The Guardian', datePublished: now - 5.minutes).save() + new Publication(title: 'The Times', datePublished: now - 5.days).save() + new Publication(title: 'The Observer', datePublished: now - 10.days).save() } when: @@ -49,10 +50,10 @@ class RangeQuerySpec extends GrailsDataTckSpec { results.size() == 2 } - void "Test between query"() { + void 'Test between query'() { given: int age = 40 - ["Bob", "Fred", "Barney", "Frank", "Joe", "Ernie"].each { new TestEntity(name: it, age: age--, child: new ChildEntity(name: "$it Child")).save() } + ['Bob', 'Fred', 'Barney', 'Frank', 'Joe', 'Ernie'].each { new TestEntity(name: it, age: age--, child: new ChildEntity(name: "$it Child")).save() } when: def results = TestEntity.findAllByAgeBetween(38, 40) @@ -66,22 +67,22 @@ class RangeQuerySpec extends GrailsDataTckSpec { then: 3 == results.size() - results.find { it.name == "Bob" } != null - results.find { it.name == "Fred" } != null - results.find { it.name == "Barney" } != null + results.find { it.name == 'Bob' } != null + results.find { it.name == 'Fred' } != null + results.find { it.name == 'Barney' } != null when: - results = TestEntity.findAllByAgeBetweenOrName(38, 40, "Ernie") + results = TestEntity.findAllByAgeBetweenOrName(38, 40, 'Ernie') then: 4 == results.size() } - void "Test greater than or equal to and less than or equal to queries"() { + void 'Test greater than or equal to and less than or equal to queries'() { given: int age = 40 - ["Bob", "Fred", "Barney", "Frank", "Joe", "Ernie"].each { new TestEntity(name: it, age: age--, child: new ChildEntity(name: "$it Child")).save() } + ['Bob', 'Fred', 'Barney', 'Frank', 'Joe', 'Ernie'].each { new TestEntity(name: it, age: age--, child: new ChildEntity(name: "$it Child")).save() } when: def results = TestEntity.findAllByAgeGreaterThanEquals(38) diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SaveAllSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SaveAllSpec.groovy index 453c5dc519c..990a67aba03 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SaveAllSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SaveAllSpec.groovy @@ -18,16 +18,16 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Person class SaveAllSpec extends GrailsDataTckSpec { - def "Test that many objects can be saved at once using multiple arguments"() { + def 'Test that many objects can be saved at once using multiple arguments'() { given: - def bob = new Person(firstName: "Bob", lastName: "Builder") - def fred = new Person(firstName: "Fred", lastName: "Flintstone") - def joe = new Person(firstName: "Joe", lastName: "Doe") + def bob = new Person(firstName: 'Bob', lastName: 'Builder') + def fred = new Person(firstName: 'Fred', lastName: 'Flintstone') + def joe = new Person(firstName: 'Joe', lastName: 'Doe') Person.saveAll(bob, fred, joe) @@ -39,11 +39,11 @@ class SaveAllSpec extends GrailsDataTckSpec { results.every { it.id != null } == true } - def "Test that many objects can be saved at once using a list"() { + def 'Test that many objects can be saved at once using a list'() { given: - def bob = new Person(firstName: "Bob", lastName: "Builder") - def fred = new Person(firstName: "Fred", lastName: "Flintstone") - def joe = new Person(firstName: "Joe", lastName: "Doe") + def bob = new Person(firstName: 'Bob', lastName: 'Builder') + def fred = new Person(firstName: 'Fred', lastName: 'Flintstone') + def joe = new Person(firstName: 'Joe', lastName: 'Doe') Person.saveAll([bob, fred, joe]) @@ -55,11 +55,11 @@ class SaveAllSpec extends GrailsDataTckSpec { results.every { it.id != null } == true } - def "Test that many objects can be saved at once using an iterable"() { + def 'Test that many objects can be saved at once using an iterable'() { given: - def bob = new Person(firstName: "Bob", lastName: "Builder") - def fred = new Person(firstName: "Fred", lastName: "Flintstone") - def joe = new Person(firstName: "Joe", lastName: "Doe") + def bob = new Person(firstName: 'Bob', lastName: 'Builder') + def fred = new Person(firstName: 'Fred', lastName: 'Flintstone') + def joe = new Person(firstName: 'Joe', lastName: 'Doe') Vector personVector = new Vector() personVector.add(bob) diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SessionCreationEventSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SessionCreationEventSpec.groovy index 2a019620dcd..d29323a1eec 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SessionCreationEventSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SessionCreationEventSpec.groovy @@ -18,20 +18,21 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.TestEntity +import spock.lang.IgnoreIf + +import org.springframework.context.ApplicationEvent +import org.springframework.context.event.SmartApplicationListener + import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.TestEntity import org.grails.datastore.mapping.core.Session import org.grails.datastore.mapping.core.SessionCreationEvent -import org.springframework.context.ApplicationEvent -import org.springframework.context.event.SmartApplicationListener -import spock.lang.IgnoreIf -import spock.lang.PendingFeature /** * Test case that session creation events are fired. */ // TODO: the application context is null on hibernate tck tests, so this test errors on the add of the application listener -@IgnoreIf({ System.getProperty('hibernate5.gorm.suite') || System.getProperty('hibernate6.gorm.suite') || System.getProperty('mongodb.gorm.suite')}) +@IgnoreIf({ System.getProperty('hibernate5.gorm.suite') || System.getProperty('hibernate6.gorm.suite') || System.getProperty('mongodb.gorm.suite') }) class SessionCreationEventSpec extends GrailsDataTckSpec { Listener listener @@ -41,15 +42,15 @@ class SessionCreationEventSpec extends GrailsDataTckSpec { manager.session.datastore.applicationContext.addApplicationListener(listener) } - void "test event for new session"() { - when:"Using existing session" + void 'test event for new session'() { + when: 'Using existing session' TestEntity.withSession { s -> s.flush() } then: listener.events.empty - when:"Creating new session" + when: 'Creating new session' def newSession = null def isDatastoreSession = false TestEntity.withNewSession { s -> @@ -61,7 +62,6 @@ class SessionCreationEventSpec extends GrailsDataTckSpec { !isDatastoreSession || listener.events[0].session == newSession } - static class Listener implements SmartApplicationListener { List events = [] diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SizeQuerySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SizeQuerySpec.groovy index 5ee979fe090..8db56a53fb4 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SizeQuerySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/SizeQuerySpec.groovy @@ -18,313 +18,313 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.Country import org.apache.grails.data.testing.tck.domains.Person -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * Tests for querying the size of collections etc. */ class SizeQuerySpec extends GrailsDataTckSpec { - void "Test sizeLe criterion"() { - given: "A country with only 1 resident" - Person p = new Person(firstName: "Fred", lastName: "Flinstone") - Country c = new Country(name: "Dinoville") + void 'Test sizeLe criterion'() { + given: 'A country with only 1 resident' + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone') + Country c = new Country(name: 'Dinoville') .addToResidents(p) .save(flush: true) - new Country(name: "Springfield") - .addToResidents(firstName: "Homer", lastName: "Simpson") - .addToResidents(firstName: "Bart", lastName: "Simpson") - .addToResidents(firstName: "Marge", lastName: "Simpson") + new Country(name: 'Springfield') + .addToResidents(firstName: 'Homer', lastName: 'Simpson') + .addToResidents(firstName: 'Bart', lastName: 'Simpson') + .addToResidents(firstName: 'Marge', lastName: 'Simpson') .save(flush: true) - new Country(name: "Miami") - .addToResidents(firstName: "Dexter", lastName: "Morgan") - .addToResidents(firstName: "Debra", lastName: "Morgan") + new Country(name: 'Miami') + .addToResidents(firstName: 'Dexter', lastName: 'Morgan') + .addToResidents(firstName: 'Debra', lastName: 'Morgan') .save(flush: true) manager.session.clear() - when: "We query for countries with 1 resident" + when: 'We query for countries with 1 resident' def results = Country.withCriteria { - sizeLe "residents", 3 - order "name" + sizeLe('residents', 3) + order('name') } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 3 results[0].name == 'Dinoville' results[1].name == 'Miami' results[2].name == 'Springfield' - when: "We query for countries with 2 resident" + when: 'We query for countries with 2 resident' results = Country.withCriteria { - sizeLe "residents", 2 - order "name" + sizeLe('residents', 2) + order('name') } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 2 results[0].name == 'Dinoville' results[1].name == 'Miami' - when: "We query for countries with 2 residents" + when: 'We query for countries with 2 residents' results = Country.withCriteria { - sizeLe "residents", 1 + sizeLe('residents', 1) } - then: "we get 1 result back" + then: 'we get 1 result back' results.size() == 1 } - void "Test sizeLt criterion"() { - given: "A country with only 1 resident" - Person p = new Person(firstName: "Fred", lastName: "Flinstone") - Country c = new Country(name: "Dinoville") + void 'Test sizeLt criterion'() { + given: 'A country with only 1 resident' + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone') + Country c = new Country(name: 'Dinoville') .addToResidents(p) .save(flush: true) - new Country(name: "Springfield") - .addToResidents(firstName: "Homer", lastName: "Simpson") - .addToResidents(firstName: "Bart", lastName: "Simpson") - .addToResidents(firstName: "Marge", lastName: "Simpson") + new Country(name: 'Springfield') + .addToResidents(firstName: 'Homer', lastName: 'Simpson') + .addToResidents(firstName: 'Bart', lastName: 'Simpson') + .addToResidents(firstName: 'Marge', lastName: 'Simpson') .save(flush: true) - new Country(name: "Miami") - .addToResidents(firstName: "Dexter", lastName: "Morgan") - .addToResidents(firstName: "Debra", lastName: "Morgan") + new Country(name: 'Miami') + .addToResidents(firstName: 'Dexter', lastName: 'Morgan') + .addToResidents(firstName: 'Debra', lastName: 'Morgan') .save(flush: true) manager.session.clear() - when: "We query for countries with 1 resident" + when: 'We query for countries with 1 resident' def results = Country.withCriteria { - sizeLt "residents", 3 - order "name" + sizeLt('residents', 3) + order('name') } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 2 results[0].name == 'Dinoville' results[1].name == 'Miami' - when: "We query for countries with 2 resident" + when: 'We query for countries with 2 resident' results = Country.withCriteria { - sizeLt "residents", 2 + sizeLt('residents', 2) } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 1 results[0].name == 'Dinoville' - when: "We query for countries with 2 residents" + when: 'We query for countries with 2 residents' results = Country.withCriteria { - sizeLt "residents", 1 + sizeLt('residents', 1) } - then: "we get no results back" + then: 'we get no results back' results.size() == 0 } - void "Test sizeGt criterion"() { - given: "A country with only 1 resident" - Person p = new Person(firstName: "Fred", lastName: "Flinstone") - Country c = new Country(name: "Dinoville") + void 'Test sizeGt criterion'() { + given: 'A country with only 1 resident' + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone') + Country c = new Country(name: 'Dinoville') .addToResidents(p) .save(flush: true) - new Country(name: "Springfield") - .addToResidents(firstName: "Homer", lastName: "Simpson") - .addToResidents(firstName: "Bart", lastName: "Simpson") - .addToResidents(firstName: "Marge", lastName: "Simpson") + new Country(name: 'Springfield') + .addToResidents(firstName: 'Homer', lastName: 'Simpson') + .addToResidents(firstName: 'Bart', lastName: 'Simpson') + .addToResidents(firstName: 'Marge', lastName: 'Simpson') .save(flush: true) - new Country(name: "Miami") - .addToResidents(firstName: "Dexter", lastName: "Morgan") - .addToResidents(firstName: "Debra", lastName: "Morgan") + new Country(name: 'Miami') + .addToResidents(firstName: 'Dexter', lastName: 'Morgan') + .addToResidents(firstName: 'Debra', lastName: 'Morgan') .save(flush: true) manager.session.clear() - when: "We query for countries with 1 resident" + when: 'We query for countries with 1 resident' def results = Country.withCriteria { - sizeGt "residents", 1 - order "name" + sizeGt('residents', 1) + order('name') } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 2 results[0].name == 'Miami' results[1].name == 'Springfield' - when: "We query for countries with 2 resident" + when: 'We query for countries with 2 resident' results = Country.withCriteria { - sizeGt "residents", 2 + sizeGt('residents', 2) } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 1 results[0].name == 'Springfield' - when: "We query for countries with 2 residents" + when: 'We query for countries with 2 residents' results = Country.withCriteria { - sizeGt "residents", 5 + sizeGt('residents', 5) } - then: "we get no results back" + then: 'we get no results back' results.size() == 0 } - void "Test sizeGe criterion"() { - given: "A country with only 1 resident" - Person p = new Person(firstName: "Fred", lastName: "Flinstone") - Country c = new Country(name: "Dinoville") + void 'Test sizeGe criterion'() { + given: 'A country with only 1 resident' + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone') + Country c = new Country(name: 'Dinoville') .addToResidents(p) .save(flush: true) - new Country(name: "Springfield") - .addToResidents(firstName: "Homer", lastName: "Simpson") - .addToResidents(firstName: "Bart", lastName: "Simpson") - .addToResidents(firstName: "Marge", lastName: "Simpson") + new Country(name: 'Springfield') + .addToResidents(firstName: 'Homer', lastName: 'Simpson') + .addToResidents(firstName: 'Bart', lastName: 'Simpson') + .addToResidents(firstName: 'Marge', lastName: 'Simpson') .save(flush: true) - new Country(name: "Miami") - .addToResidents(firstName: "Dexter", lastName: "Morgan") - .addToResidents(firstName: "Debra", lastName: "Morgan") + new Country(name: 'Miami') + .addToResidents(firstName: 'Dexter', lastName: 'Morgan') + .addToResidents(firstName: 'Debra', lastName: 'Morgan') .save(flush: true) manager.session.clear() - when: "We query for countries with 1 resident" + when: 'We query for countries with 1 resident' def results = Country.withCriteria { - sizeGe "residents", 1 - order "name" + sizeGe('residents', 1) + order('name') } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 3 results[0].name == 'Dinoville' results[1].name == 'Miami' results[2].name == 'Springfield' - when: "We query for countries with 2 resident" + when: 'We query for countries with 2 resident' results = Country.withCriteria { - sizeGe "residents", 2 - order "name" + sizeGe('residents', 2) + order('name') } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 2 results[0].name == 'Miami' results[1].name == 'Springfield' - when: "We query for countries with 2 residents" + when: 'We query for countries with 2 residents' results = Country.withCriteria { - sizeGe "residents", 5 + sizeGe('residents', 5) } - then: "we get no results back" + then: 'we get no results back' results.size() == 0 } - void "Test sizeEq criterion"() { - given: "A country with only 1 resident" - Person p = new Person(firstName: "Fred", lastName: "Flinstone") - Country c = new Country(name: "Dinoville") + void 'Test sizeEq criterion'() { + given: 'A country with only 1 resident' + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone') + Country c = new Country(name: 'Dinoville') .addToResidents(p) .save(flush: true) - new Country(name: "Springfield") - .addToResidents(firstName: "Homer", lastName: "Simpson") - .addToResidents(firstName: "Bart", lastName: "Simpson") - .addToResidents(firstName: "Marge", lastName: "Simpson") + new Country(name: 'Springfield') + .addToResidents(firstName: 'Homer', lastName: 'Simpson') + .addToResidents(firstName: 'Bart', lastName: 'Simpson') + .addToResidents(firstName: 'Marge', lastName: 'Simpson') .save(flush: true) manager.session.clear() - when: "We query for countries with 1 resident" + when: 'We query for countries with 1 resident' def results = Country.withCriteria { - sizeEq "residents", 1 + sizeEq('residents', 1) } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 1 results[0].name == 'Dinoville' - when: "We query for countries with 3 resident" + when: 'We query for countries with 3 resident' results = Country.withCriteria { - sizeEq "residents", 3 + sizeEq('residents', 3) } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 1 results[0].name == 'Springfield' - when: "We query for countries with 2 residents" + when: 'We query for countries with 2 residents' results = Country.withCriteria { - sizeEq "residents", 2 + sizeEq('residents', 2) } - then: "we get no results back" + then: 'we get no results back' results.size() == 0 } - void "Test sizeNe criterion"() { - given: "A country with only 1 resident" - Person p = new Person(firstName: "Fred", lastName: "Flinstone") - Country c = new Country(name: "Dinoville") + void 'Test sizeNe criterion'() { + given: 'A country with only 1 resident' + Person p = new Person(firstName: 'Fred', lastName: 'Flinstone') + Country c = new Country(name: 'Dinoville') .addToResidents(p) .save(flush: true) - new Country(name: "Springfield") - .addToResidents(firstName: "Homer", lastName: "Simpson") - .addToResidents(firstName: "Bart", lastName: "Simpson") - .addToResidents(firstName: "Marge", lastName: "Simpson") + new Country(name: 'Springfield') + .addToResidents(firstName: 'Homer', lastName: 'Simpson') + .addToResidents(firstName: 'Bart', lastName: 'Simpson') + .addToResidents(firstName: 'Marge', lastName: 'Simpson') .save(flush: true) manager.session.clear() - when: "We query for countries that don't have 1 resident" + when: 'We query for countries that don\'t have 1 resident' def results = Country.withCriteria { - sizeNe "residents", 1 + sizeNe('residents', 1) } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 1 results[0].name == 'Springfield' - when: "We query for countries who don't have 3 resident" + when: 'We query for countries who don\'t have 3 resident' results = Country.withCriteria { - sizeNe "residents", 3 + sizeNe('residents', 3) } - then: "We get the correct result back" + then: 'We get the correct result back' results != null results.size() == 1 results[0].name == 'Dinoville' - when: "We query for countries with 2 residents" + when: 'We query for countries with 2 residents' results = Country.withCriteria { and { - sizeNe "residents", 1 - sizeNe "residents", 3 + sizeNe('residents', 1) + sizeNe('residents', 3) } } - then: "we get no results back" + then: 'we get no results back' results.size() == 0 } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UniqueConstraintSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UniqueConstraintSpec.groovy index dd0e2b82d94..573c7e24430 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UniqueConstraintSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UniqueConstraintSpec.groovy @@ -18,8 +18,8 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.UniqueGroup import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.UniqueGroup /** * Tests the unique constraint diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UpdateWithProxyPresentSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UpdateWithProxyPresentSpec.groovy index 6fc930e3c6d..5c7dcfd8d26 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UpdateWithProxyPresentSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/UpdateWithProxyPresentSpec.groovy @@ -18,12 +18,12 @@ */ package org.apache.grails.data.testing.tck.tests +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.Child import org.apache.grails.data.testing.tck.domains.Parent import org.apache.grails.data.testing.tck.domains.Person import org.apache.grails.data.testing.tck.domains.Pet import org.apache.grails.data.testing.tck.domains.PetType -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec /** * @author graemerocher @@ -34,36 +34,36 @@ class UpdateWithProxyPresentSpec extends GrailsDataTckSpec { manager.domainClasses.addAll([Pet, Person, PetType, Parent, Child]) } - void "Test update entity with association proxies"() { + void 'Test update entity with association proxies'() { given: - def person = new Person(firstName: "Bob", lastName: "Builder") - def petType = new PetType(name: "snake") - def pet = new Pet(name: "Fred", type: petType, owner: person) + def person = new Person(firstName: 'Bob', lastName: 'Builder') + def petType = new PetType(name: 'snake') + def pet = new Pet(name: 'Fred', type: petType, owner: person) person.addToPets(pet) person.save(flush: true) manager.session.clear() when: person = Person.get(person.id) - person.firstName = "changed" + person.firstName = 'changed' person.save(flush: true) manager.session.clear() person = Person.get(person.id) def personPet = person.pets.iterator().next() then: - person.firstName == "changed" - personPet.name == "Fred" + person.firstName == 'changed' + personPet.name == 'Fred' personPet.id == pet.id personPet.owner.id == person.id personPet.type.name == 'snake' personPet.type.id == petType.id } - void "Test update unidirectional oneToMany with proxy"() { + void 'Test update unidirectional oneToMany with proxy'() { given: - def parent = new Parent(name: "Bob").save(flush: true) - def child = new Child(name: "Bill").save(flush: true) + def parent = new Parent(name: 'Bob').save(flush: true) + def child = new Child(name: 'Bill').save(flush: true) manager.session.clear() when: @@ -86,6 +86,6 @@ class UpdateWithProxyPresentSpec extends GrailsDataTckSpec { child = parent.children.first() then: - child.name == "Bill" + child.name == 'Bill' } } diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ValidationSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ValidationSpec.groovy index 01874dc5a6d..708f4560a36 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ValidationSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/ValidationSpec.groovy @@ -18,24 +18,27 @@ */ package org.apache.grails.data.testing.tck.tests +import spock.lang.IgnoreIf +import spock.lang.PendingFeatureIf +import spock.lang.Unroll + +import org.springframework.validation.Validator + +import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.apache.grails.data.testing.tck.domains.ChildEntity import org.apache.grails.data.testing.tck.domains.ClassWithListArgBeforeValidate import org.apache.grails.data.testing.tck.domains.ClassWithNoArgBeforeValidate import org.apache.grails.data.testing.tck.domains.ClassWithOverloadedBeforeValidate import org.apache.grails.data.testing.tck.domains.Task import org.apache.grails.data.testing.tck.domains.TestEntity -import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec import org.grails.datastore.gorm.validation.CascadingValidator import org.grails.datastore.mapping.model.PersistentEntity -import org.springframework.validation.Validator -import spock.lang.IgnoreIf -import spock.lang.PendingFeatureIf -import spock.lang.Unroll /** * Tests validation semantics. */ class ValidationSpec extends GrailsDataTckSpec { + void setupSpec() { manager.domainClasses = [ClassWithListArgBeforeValidate, ClassWithNoArgBeforeValidate, ClassWithOverloadedBeforeValidate, TestEntity, ChildEntity, Task] @@ -48,7 +51,7 @@ class ValidationSpec extends GrailsDataTckSpec { def t = new TestEntity(name: 'someName') when: - t.errors.reject 'foo' + t.errors.reject('foo') boolean isValid = t.validate() int errorCount = t.errors.errorCount @@ -59,13 +62,13 @@ class ValidationSpec extends GrailsDataTckSpec { // Hibernate did not originally have this test and it fails for it @PendingFeatureIf({ System.getProperty('hibernate5.gorm.suite') }) - void "Test disable validation"() { + void 'Test disable validation'() { // test assumes name cannot be blank given: def t when: - t = new TestEntity(name: "", child: new ChildEntity(name: "child")) + t = new TestEntity(name: '', child: new ChildEntity(name: 'child')) boolean validationResult = t.validate() def errors = t.errors @@ -83,13 +86,13 @@ class ValidationSpec extends GrailsDataTckSpec { !t.hasErrors() } - void "Test validate() method"() { + void 'Test validate() method'() { // test assumes name cannot be blank given: def t when: - t = new TestEntity(name: "") + t = new TestEntity(name: '') boolean validationResult = t.validate() def errors = t.errors @@ -106,13 +109,13 @@ class ValidationSpec extends GrailsDataTckSpec { !t.hasErrors() } - void "Test that validate is called on save()"() { + void 'Test that validate is called on save()'() { given: def t when: - t = new TestEntity(name: "") + t = new TestEntity(name: '') then: t.save() == null @@ -121,9 +124,9 @@ class ValidationSpec extends GrailsDataTckSpec { when: t.clearErrors() - t.name = "Bob" + t.name = 'Bob' t.age = 45 - t.child = new ChildEntity(name: "Fred") + t.child = new ChildEntity(name: 'Fred') t = t.save() then: @@ -131,7 +134,7 @@ class ValidationSpec extends GrailsDataTckSpec { 1 == TestEntity.count() } - void "Test beforeValidate gets called on save()"() { + void 'Test beforeValidate gets called on save()'() { given: def entityWithNoArgBeforeValidateMethod def entityWithListArgBeforeValidateMethod @@ -152,7 +155,7 @@ class ValidationSpec extends GrailsDataTckSpec { 0 == entityWithOverloadedBeforeValidateMethod.listArgCounter } - void "Test beforeValidate gets called on validate()"() { + void 'Test beforeValidate gets called on validate()'() { given: def entityWithNoArgBeforeValidateMethod def entityWithListArgBeforeValidateMethod @@ -173,7 +176,7 @@ class ValidationSpec extends GrailsDataTckSpec { 0 == entityWithOverloadedBeforeValidateMethod.listArgCounter } - void "Test beforeValidate gets called on validate() and passing a list of field names to validate"() { + void 'Test beforeValidate gets called on validate() and passing a list of field names to validate'() { given: def entityWithNoArgBeforeValidateMethod def entityWithListArgBeforeValidateMethod @@ -196,16 +199,16 @@ class ValidationSpec extends GrailsDataTckSpec { } @IgnoreIf({ - Boolean.getBoolean("neo4j.gorm.suite") || // neo4j requires a transaction present for inserts + Boolean.getBoolean('neo4j.gorm.suite') || // neo4j requires a transaction present for inserts System.getProperty('hibernate5.gorm.suite') // Hibernate has a custom version of this test }) - void "Test that validate works without a bound Session"() { + void 'Test that validate works without a bound Session'() { given: def t when: manager.session.disconnect() - t = new TestEntity(name: "") + t = new TestEntity(name: '') then: !manager.session.datastore.hasCurrentSession() @@ -216,9 +219,9 @@ class ValidationSpec extends GrailsDataTckSpec { when: t.clearErrors() - t.name = "Bob" + t.name = 'Bob' t.age = 45 - t.child = new ChildEntity(name: "Fred") + t.child = new ChildEntity(name: 'Fred') t = t.save(flush: true) then: @@ -227,7 +230,7 @@ class ValidationSpec extends GrailsDataTckSpec { 1 == TestEntity.count() } - void "Two parameter validate is called on entity validator if it implements Validator interface"() { + void 'Two parameter validate is called on entity validator if it implements Validator interface'() { given: def mockValidator = Mock(Validator) manager.session.mappingContext.addEntityValidator(persistentEntityFor(Task), mockValidator) @@ -241,7 +244,7 @@ class ValidationSpec extends GrailsDataTckSpec { } @Unroll - void "deepValidate parameter is honoured if entity validator implements CascadingValidator"() { + void 'deepValidate parameter is honoured if entity validator implements CascadingValidator'() { given: def mockValidator = Mock(CascadingValidator) manager.session.mappingContext.addEntityValidator(persistentEntityFor(Task), mockValidator) diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/WhereLazySpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/WhereLazySpec.groovy index 02dd0e0d019..55d6ad19607 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/WhereLazySpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/WhereLazySpec.groovy @@ -18,10 +18,11 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.Product import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.Product class WhereLazySpec extends GrailsDataTckSpec { + void setupSpec() { manager.domainClasses.addAll([Product]) } @@ -34,12 +35,12 @@ class WhereLazySpec extends GrailsDataTckSpec { new Product(name: 'tshirt', color: 'blue').save(flush: true) } - void "test deleteAll with whereLazy"() { + void 'test deleteAll with whereLazy'() { setup: createProducts() when: - Product.removeAllByColor("orange") + Product.removeAllByColor('orange') then: Product.count() == 3 @@ -49,12 +50,12 @@ class WhereLazySpec extends GrailsDataTckSpec { } - void "test updateAll with whereLazy"() { + void 'test updateAll with whereLazy'() { setup: createProducts() when: - Product.updateAll("orange") + Product.updateAll('orange') then: Product.countByName('tshirt') == 3 diff --git a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/WithTransactionSpec.groovy b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/WithTransactionSpec.groovy index 0616c3b0e79..63787c48947 100644 --- a/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/WithTransactionSpec.groovy +++ b/grails-datamapping-tck/src/main/groovy/org/apache/grails/data/testing/tck/tests/WithTransactionSpec.groovy @@ -18,21 +18,22 @@ */ package org.apache.grails.data.testing.tck.tests -import org.apache.grails.data.testing.tck.domains.ChildEntity -import org.apache.grails.data.testing.tck.domains.TestEntity import groovy.transform.InheritConstructors + import org.apache.grails.data.testing.tck.base.GrailsDataTckSpec +import org.apache.grails.data.testing.tck.domains.ChildEntity +import org.apache.grails.data.testing.tck.domains.TestEntity /** * Transaction tests. */ class WithTransactionSpec extends GrailsDataTckSpec { - void "Test save() with transaction"() { + void 'Test save() with transaction'() { given: TestEntity.withTransaction { - new TestEntity(name: "Bob", age: 50, child: new ChildEntity(name: "Bob Child")).save() - new TestEntity(name: "Fred", age: 45, child: new ChildEntity(name: "Fred Child")).save() + new TestEntity(name: 'Bob', age: 50, child: new ChildEntity(name: 'Bob Child')).save() + new TestEntity(name: 'Fred', age: 45, child: new ChildEntity(name: 'Fred Child')).save() } when: @@ -42,16 +43,16 @@ class WithTransactionSpec extends GrailsDataTckSpec { then: 2 == count - "Bob" == results[0].name - "Fred" == results[1].name + 'Bob' == results[0].name + 'Fred' == results[1].name } - void "Test rollback transaction"() { + void 'Test rollback transaction'() { given: TestEntity.withNewTransaction { status -> - new TestEntity(name: "Bob", age: 50, child: new ChildEntity(name: "Bob Child")).save() + new TestEntity(name: 'Bob', age: 50, child: new ChildEntity(name: 'Bob Child')).save() status.setRollbackOnly() - new TestEntity(name: "Fred", age: 45, child: new ChildEntity(name: "Fred Child")).save() + new TestEntity(name: 'Fred', age: 45, child: new ChildEntity(name: 'Fred Child')).save() } when: @@ -63,13 +64,13 @@ class WithTransactionSpec extends GrailsDataTckSpec { results.size() == 0 } - void "Test rollback transaction with Runtime Exception"() { + void 'Test rollback transaction with Runtime Exception'() { given: def ex try { TestEntity.withNewTransaction { status -> - new TestEntity(name: "Bob", age: 50, child: new ChildEntity(name: "Bob Child")).save() - throw new RuntimeException("bad") + new TestEntity(name: 'Bob', age: 50, child: new ChildEntity(name: 'Bob Child')).save() + throw new RuntimeException('bad') } } catch (e) { @@ -87,13 +88,13 @@ class WithTransactionSpec extends GrailsDataTckSpec { ex.message == 'bad' } - void "Test rollback transaction with Exception"() { + void 'Test rollback transaction with Exception'() { given: def ex try { TestEntity.withNewTransaction { status -> - new TestEntity(name: "Bob", age: 50, child: new ChildEntity(name: "Bob Child")).save() - throw new TestCheckedException("bad") + new TestEntity(name: 'Bob', age: 50, child: new ChildEntity(name: 'Bob Child')).save() + throw new TestCheckedException('bad') } } catch (e) { diff --git a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/Constrained.groovy b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/Constrained.groovy index d652d534682..50b7b48c7dc 100644 --- a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/Constrained.groovy +++ b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/Constrained.groovy @@ -133,4 +133,4 @@ interface Constrained { * @return The owning class */ Class getOwner() -} \ No newline at end of file +} diff --git a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/ConstrainedEntity.groovy b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/ConstrainedEntity.groovy index 7d61750f437..a8af73c202c 100644 --- a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/ConstrainedEntity.groovy +++ b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/ConstrainedEntity.groovy @@ -31,4 +31,4 @@ interface ConstrainedEntity { * @return The constrained property instances */ Map getConstrainedProperties() -} \ No newline at end of file +} diff --git a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/ConstrainedProperty.groovy b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/ConstrainedProperty.groovy index 9ec58ebdf4c..f4b354a09b8 100644 --- a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/ConstrainedProperty.groovy +++ b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/ConstrainedProperty.groovy @@ -20,6 +20,7 @@ package grails.gorm.validation import groovy.transform.CompileStatic + import org.springframework.validation.Errors /** @@ -32,24 +33,23 @@ import org.springframework.validation.Errors @CompileStatic interface ConstrainedProperty extends Constrained { - - ResourceBundle MESSAGE_BUNDLE = ResourceBundle.getBundle("grails.gorm.validation.DefaultErrorMessages") - - String DEFAULT_NULL_MESSAGE_CODE = "default.null.message" - String DEFAULT_INVALID_MIN_SIZE_MESSAGE_CODE = "default.invalid.min.size.message" - String DEFAULT_INVALID_MAX_SIZE_MESSAGE_CODE = "default.invalid.max.size.message" - String DEFAULT_NOT_EQUAL_MESSAGE_CODE = "default.not.equal.message" - String DEFAULT_INVALID_MIN_MESSAGE_CODE = "default.invalid.min.message" - String DEFAULT_INVALID_MAX_MESSAGE_CODE = "default.invalid.max.message" - String DEFAULT_INVALID_SIZE_MESSAGE_CODE = "default.invalid.size.message" - String DEFAULT_NOT_INLIST_MESSAGE_CODE = "default.not.inlist.message" - String DEFAULT_INVALID_RANGE_MESSAGE_CODE = "default.invalid.range.message" - String DEFAULT_INVALID_EMAIL_MESSAGE_CODE = "default.invalid.email.message" - String DEFAULT_INVALID_CREDIT_CARD_MESSAGE_CODE = "default.invalid.creditCard.message" - String DEFAULT_INVALID_URL_MESSAGE_CODE = "default.invalid.url.message" - String DEFAULT_INVALID_VALIDATOR_MESSAGE_CODE = "default.invalid.validator.message" - String DEFAULT_DOESNT_MATCH_MESSAGE_CODE = "default.doesnt.match.message" - String DEFAULT_BLANK_MESSAGE_CODE = "default.blank.message" + ResourceBundle MESSAGE_BUNDLE = ResourceBundle.getBundle('grails.gorm.validation.DefaultErrorMessages') + + String DEFAULT_NULL_MESSAGE_CODE = 'default.null.message' + String DEFAULT_INVALID_MIN_SIZE_MESSAGE_CODE = 'default.invalid.min.size.message' + String DEFAULT_INVALID_MAX_SIZE_MESSAGE_CODE = 'default.invalid.max.size.message' + String DEFAULT_NOT_EQUAL_MESSAGE_CODE = 'default.not.equal.message' + String DEFAULT_INVALID_MIN_MESSAGE_CODE = 'default.invalid.min.message' + String DEFAULT_INVALID_MAX_MESSAGE_CODE = 'default.invalid.max.message' + String DEFAULT_INVALID_SIZE_MESSAGE_CODE = 'default.invalid.size.message' + String DEFAULT_NOT_INLIST_MESSAGE_CODE = 'default.not.inlist.message' + String DEFAULT_INVALID_RANGE_MESSAGE_CODE = 'default.invalid.range.message' + String DEFAULT_INVALID_EMAIL_MESSAGE_CODE = 'default.invalid.email.message' + String DEFAULT_INVALID_CREDIT_CARD_MESSAGE_CODE = 'default.invalid.creditCard.message' + String DEFAULT_INVALID_URL_MESSAGE_CODE = 'default.invalid.url.message' + String DEFAULT_INVALID_VALIDATOR_MESSAGE_CODE = 'default.invalid.validator.message' + String DEFAULT_DOESNT_MATCH_MESSAGE_CODE = 'default.doesnt.match.message' + String DEFAULT_BLANK_MESSAGE_CODE = 'default.blank.message' String DEFAULT_BLANK_MESSAGE = MESSAGE_BUNDLE.getString(DEFAULT_BLANK_MESSAGE_CODE) String DEFAULT_DOESNT_MATCH_MESSAGE = MESSAGE_BUNDLE.getString(DEFAULT_DOESNT_MATCH_MESSAGE_CODE) String DEFAULT_INVALID_URL_MESSAGE = MESSAGE_BUNDLE.getString(DEFAULT_INVALID_URL_MESSAGE_CODE) @@ -66,49 +66,50 @@ interface ConstrainedProperty extends Constrained { String DEFAULT_NULL_MESSAGE = MESSAGE_BUNDLE.getString(DEFAULT_NULL_MESSAGE_CODE) String DEFAULT_INVALID_VALIDATOR_MESSAGE = MESSAGE_BUNDLE.getString(DEFAULT_INVALID_VALIDATOR_MESSAGE_CODE) - Map DEFAULT_MESSAGES = new HashMap() {{ - put(DEFAULT_BLANK_MESSAGE_CODE,DEFAULT_BLANK_MESSAGE) - put(DEFAULT_DOESNT_MATCH_MESSAGE_CODE,DEFAULT_DOESNT_MATCH_MESSAGE) - put(DEFAULT_INVALID_CREDIT_CARD_MESSAGE_CODE,DEFAULT_INVALID_CREDIT_CARD_MESSAGE) - put(DEFAULT_INVALID_EMAIL_MESSAGE_CODE,DEFAULT_INVALID_EMAIL_MESSAGE) - put(DEFAULT_INVALID_MAX_MESSAGE_CODE,DEFAULT_INVALID_MAX_MESSAGE) - put(DEFAULT_INVALID_MAX_SIZE_MESSAGE_CODE,DEFAULT_INVALID_MAX_SIZE_MESSAGE) - put(DEFAULT_INVALID_MIN_MESSAGE_CODE,DEFAULT_INVALID_MIN_MESSAGE) - put(DEFAULT_INVALID_MIN_SIZE_MESSAGE_CODE,DEFAULT_INVALID_MIN_SIZE_MESSAGE) - put(DEFAULT_INVALID_RANGE_MESSAGE_CODE,DEFAULT_INVALID_RANGE_MESSAGE) - put(DEFAULT_INVALID_SIZE_MESSAGE_CODE,DEFAULT_INVALID_SIZE_MESSAGE) - put(DEFAULT_INVALID_URL_MESSAGE_CODE,DEFAULT_INVALID_URL_MESSAGE) - put(DEFAULT_NOT_EQUAL_MESSAGE_CODE,DEFAULT_NOT_EQUAL_MESSAGE) - put(DEFAULT_NOT_INLIST_MESSAGE_CODE,DEFAULT_NOT_IN_LIST_MESSAGE) - put(DEFAULT_NULL_MESSAGE_CODE,DEFAULT_NULL_MESSAGE) - put(DEFAULT_INVALID_VALIDATOR_MESSAGE_CODE, DEFAULT_INVALID_VALIDATOR_MESSAGE) - }} - - - String CREDIT_CARD_CONSTRAINT = "creditCard" - String EMAIL_CONSTRAINT = "email" - String BLANK_CONSTRAINT = "blank" - String RANGE_CONSTRAINT = "range" - String IN_LIST_CONSTRAINT = "inList" - String URL_CONSTRAINT = "url" - String MATCHES_CONSTRAINT = "matches" - String SIZE_CONSTRAINT = "size" - String MIN_CONSTRAINT = "min" - String MAX_CONSTRAINT = "max" - String MAX_SIZE_CONSTRAINT = "maxSize" - String MIN_SIZE_CONSTRAINT = "minSize" - String SCALE_CONSTRAINT = "scale" - String NOT_EQUAL_CONSTRAINT = "notEqual" - String NULLABLE_CONSTRAINT = "nullable" - String VALIDATOR_CONSTRAINT = "validator" - String INVALID_SUFFIX = ".invalid" - String EXCEEDED_SUFFIX = ".exceeded" - String NOTMET_SUFFIX = ".notmet" - String NOT_PREFIX = "not." - String TOOBIG_SUFFIX = ".toobig" - String TOOLONG_SUFFIX = ".toolong" - String TOOSMALL_SUFFIX = ".toosmall" - String TOOSHORT_SUFFIX = ".tooshort" + Map DEFAULT_MESSAGES = new HashMap() { + { + put(DEFAULT_BLANK_MESSAGE_CODE, DEFAULT_BLANK_MESSAGE) + put(DEFAULT_DOESNT_MATCH_MESSAGE_CODE, DEFAULT_DOESNT_MATCH_MESSAGE) + put(DEFAULT_INVALID_CREDIT_CARD_MESSAGE_CODE, DEFAULT_INVALID_CREDIT_CARD_MESSAGE) + put(DEFAULT_INVALID_EMAIL_MESSAGE_CODE, DEFAULT_INVALID_EMAIL_MESSAGE) + put(DEFAULT_INVALID_MAX_MESSAGE_CODE, DEFAULT_INVALID_MAX_MESSAGE) + put(DEFAULT_INVALID_MAX_SIZE_MESSAGE_CODE, DEFAULT_INVALID_MAX_SIZE_MESSAGE) + put(DEFAULT_INVALID_MIN_MESSAGE_CODE, DEFAULT_INVALID_MIN_MESSAGE) + put(DEFAULT_INVALID_MIN_SIZE_MESSAGE_CODE, DEFAULT_INVALID_MIN_SIZE_MESSAGE) + put(DEFAULT_INVALID_RANGE_MESSAGE_CODE, DEFAULT_INVALID_RANGE_MESSAGE) + put(DEFAULT_INVALID_SIZE_MESSAGE_CODE, DEFAULT_INVALID_SIZE_MESSAGE) + put(DEFAULT_INVALID_URL_MESSAGE_CODE, DEFAULT_INVALID_URL_MESSAGE) + put(DEFAULT_NOT_EQUAL_MESSAGE_CODE, DEFAULT_NOT_EQUAL_MESSAGE) + put(DEFAULT_NOT_INLIST_MESSAGE_CODE, DEFAULT_NOT_IN_LIST_MESSAGE) + put(DEFAULT_NULL_MESSAGE_CODE, DEFAULT_NULL_MESSAGE) + put(DEFAULT_INVALID_VALIDATOR_MESSAGE_CODE, DEFAULT_INVALID_VALIDATOR_MESSAGE) + } + } + + String CREDIT_CARD_CONSTRAINT = 'creditCard' + String EMAIL_CONSTRAINT = 'email' + String BLANK_CONSTRAINT = 'blank' + String RANGE_CONSTRAINT = 'range' + String IN_LIST_CONSTRAINT = 'inList' + String URL_CONSTRAINT = 'url' + String MATCHES_CONSTRAINT = 'matches' + String SIZE_CONSTRAINT = 'size' + String MIN_CONSTRAINT = 'min' + String MAX_CONSTRAINT = 'max' + String MAX_SIZE_CONSTRAINT = 'maxSize' + String MIN_SIZE_CONSTRAINT = 'minSize' + String SCALE_CONSTRAINT = 'scale' + String NOT_EQUAL_CONSTRAINT = 'notEqual' + String NULLABLE_CONSTRAINT = 'nullable' + String VALIDATOR_CONSTRAINT = 'validator' + String INVALID_SUFFIX = '.invalid' + String EXCEEDED_SUFFIX = '.exceeded' + String NOTMET_SUFFIX = '.notmet' + String NOT_PREFIX = 'not.' + String TOOBIG_SUFFIX = '.toobig' + String TOOLONG_SUFFIX = '.toolong' + String TOOSMALL_SUFFIX = '.toosmall' + String TOOSHORT_SUFFIX = '.tooshort' /** * @param constraintName The name of the constraint to check @@ -144,7 +145,6 @@ interface ConstrainedProperty extends Constrained { */ void applyConstraint(String constraintName, Object constrainingValue) - /** * @return Returns the appliedConstraints. */ diff --git a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/Constraint.java b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/Constraint.java index c2ddaa8707a..506028b95bc 100644 --- a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/Constraint.java +++ b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/Constraint.java @@ -36,7 +36,7 @@ public interface Constraint { * @return true if the constraint can be applied against the specified type */ @SuppressWarnings("rawtypes") - boolean supports(Class type); + boolean supports(Class type); /** * Return whether the constraint is valid for the owning class @@ -55,7 +55,6 @@ public interface Constraint { */ void validate(Object target, Object propertyValue, Errors errors); - /** * @return The parameter to the constraint */ @@ -71,4 +70,4 @@ public interface Constraint { */ String getPropertyName(); -} \ No newline at end of file +} diff --git a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/DefaultConstrainedProperty.groovy b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/DefaultConstrainedProperty.groovy index 78c58ce655e..56090084f68 100644 --- a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/DefaultConstrainedProperty.groovy +++ b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/DefaultConstrainedProperty.groovy @@ -19,10 +19,13 @@ package grails.gorm.validation -import grails.gorm.validation.exceptions.ValidationConfigurationException import groovy.transform.CompileStatic import groovy.transform.ToString import groovy.util.logging.Slf4j + +import org.springframework.validation.Errors + +import grails.gorm.validation.exceptions.ValidationConfigurationException import org.grails.datastore.gorm.validation.constraints.BlankConstraint import org.grails.datastore.gorm.validation.constraints.InListConstraint import org.grails.datastore.gorm.validation.constraints.MatchesConstraint @@ -38,7 +41,6 @@ import org.grails.datastore.gorm.validation.constraints.SizeConstraint import org.grails.datastore.gorm.validation.constraints.factory.ConstraintFactory import org.grails.datastore.gorm.validation.constraints.registry.ConstraintRegistry import org.grails.datastore.mapping.reflect.ClassPropertyFetcher -import org.springframework.validation.Errors /** * Default implementation of the {@link ConstrainedProperty} interface @@ -111,8 +113,6 @@ class DefaultConstrainedProperty implements ConstrainedProperty { } - - /** * @return Returns the appliedConstraints. */ @@ -147,8 +147,8 @@ class DefaultConstrainedProperty implements ConstrainedProperty { Comparable getMax() { Comparable maxValue = null - MaxConstraint maxConstraint = (MaxConstraint)appliedConstraints.get(MAX_CONSTRAINT) - RangeConstraint rangeConstraint = (RangeConstraint)appliedConstraints.get(RANGE_CONSTRAINT) + MaxConstraint maxConstraint = (MaxConstraint) appliedConstraints.get(MAX_CONSTRAINT) + RangeConstraint rangeConstraint = (RangeConstraint) appliedConstraints.get(RANGE_CONSTRAINT) if (maxConstraint != null || rangeConstraint != null) { Comparable maxConstraintValue = maxConstraint == null ? null : maxConstraint.getMaxValue() @@ -171,7 +171,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { /** * @param max The max to set. */ - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') void setMax(Comparable max) { String constraintName = MAX_CONSTRAINT if (max == null) { @@ -180,12 +180,12 @@ class DefaultConstrainedProperty implements ConstrainedProperty { } if (!propertyType.equals(max.getClass())) { - throw new MissingPropertyException(constraintName,propertyType) + throw new MissingPropertyException(constraintName, propertyType) } Range r = getRange() if (r != null) { - log.warn("Range constraint already set ignoring constraint [" + constraintName + "] for value [" + max + "]") + log.warn('Range constraint already set ignoring constraint [' + constraintName + '] for value [' + max + ']') return } @@ -199,8 +199,8 @@ class DefaultConstrainedProperty implements ConstrainedProperty { Comparable getMin() { Comparable minValue = null - MinConstraint minConstraint = (MinConstraint)appliedConstraints.get(MIN_CONSTRAINT) - RangeConstraint rangeConstraint = (RangeConstraint)appliedConstraints.get(RANGE_CONSTRAINT) + MinConstraint minConstraint = (MinConstraint) appliedConstraints.get(MIN_CONSTRAINT) + RangeConstraint rangeConstraint = (RangeConstraint) appliedConstraints.get(RANGE_CONSTRAINT) if (minConstraint != null || rangeConstraint != null) { Comparable minConstraintValue = minConstraint != null ? minConstraint.getMinValue() : null @@ -223,7 +223,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { /** * @param min The min to set. */ - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') void setMin(Comparable min) { if (min == null) { appliedConstraints.remove(MIN_CONSTRAINT) @@ -231,12 +231,12 @@ class DefaultConstrainedProperty implements ConstrainedProperty { } if (!propertyType.equals(min.getClass())) { - throw new MissingPropertyException(MIN_CONSTRAINT,propertyType) + throw new MissingPropertyException(MIN_CONSTRAINT, propertyType) } Range r = getRange() if (r != null) { - log.warn("Range constraint already set ignoring constraint ["+MIN_CONSTRAINT+"] for value ["+min+"]") + log.warn('Range constraint already set ignoring constraint [' + MIN_CONSTRAINT + '] for value [' + min + ']') return } @@ -247,16 +247,16 @@ class DefaultConstrainedProperty implements ConstrainedProperty { * @return Returns the inList. */ @Override - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') List getInList() { - InListConstraint c = (InListConstraint)appliedConstraints.get(IN_LIST_CONSTRAINT) + InListConstraint c = (InListConstraint) appliedConstraints.get(IN_LIST_CONSTRAINT) return c == null ? null : c.getList() } /** * @param inList The inList to set. */ - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') void setInList(List inList) { Constraint c = appliedConstraints.get(IN_LIST_CONSTRAINT) if (inList == null) { @@ -271,23 +271,23 @@ class DefaultConstrainedProperty implements ConstrainedProperty { * @return Returns the range. */ @Override - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') Range getRange() { - RangeConstraint c = (RangeConstraint)appliedConstraints.get(RANGE_CONSTRAINT) + RangeConstraint c = (RangeConstraint) appliedConstraints.get(RANGE_CONSTRAINT) return c == null ? null : c.getRange() } /** * @param range The range to set. */ - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') void setRange(Range range) { if (appliedConstraints.containsKey(MAX_CONSTRAINT)) { - log.warn("Setting range constraint on property ["+propertyName+"] of class ["+ this.owningClass +"] forced removal of max constraint") + log.warn('Setting range constraint on property [' + propertyName + '] of class [' + this.owningClass + '] forced removal of max constraint') appliedConstraints.remove(MAX_CONSTRAINT) } if (appliedConstraints.containsKey(MIN_CONSTRAINT)) { - log.warn("Setting range constraint on property ["+propertyName+"] of class ["+ this.owningClass +"] forced removal of min constraint") + log.warn('Setting range constraint on property [' + propertyName + '] of class [' + this.owningClass + '] forced removal of min constraint') appliedConstraints.remove(MIN_CONSTRAINT) } if (range == null) { @@ -303,7 +303,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { */ @Override Integer getScale() { - ScaleConstraint scaleConstraint = (ScaleConstraint)appliedConstraints.get(SCALE_CONSTRAINT) + ScaleConstraint scaleConstraint = (ScaleConstraint) appliedConstraints.get(SCALE_CONSTRAINT) return scaleConstraint == null ? null : scaleConstraint.getScale() } @@ -311,16 +311,16 @@ class DefaultConstrainedProperty implements ConstrainedProperty { * @return Returns the size. */ @Override - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') Range getSize() { - SizeConstraint c = (SizeConstraint)appliedConstraints.get(SIZE_CONSTRAINT) + SizeConstraint c = (SizeConstraint) appliedConstraints.get(SIZE_CONSTRAINT) return c == null ? null : c.getRange() } /** * @param size The size to set. */ - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') void setSize(Range size) { Constraint c = appliedConstraints.get(SIZE_CONSTRAINT) if (size == null) { @@ -337,7 +337,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { @Override boolean isBlank() { Object cons = appliedConstraints.get(BLANK_CONSTRAINT) - return cons == null || (Boolean)((BlankConstraint)cons).getParameter() + return cons == null || (Boolean) ((BlankConstraint)cons).getParameter() } /** @@ -345,7 +345,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { */ void setBlank(boolean blank) { if (isNotValidStringType()) { - throw new MissingPropertyException("Blank constraint can only be applied to a String property", + throw new MissingPropertyException('Blank constraint can only be applied to a String property', BLANK_CONSTRAINT, this.owningClass) } @@ -363,7 +363,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { @Override boolean isEmail() { if (isNotValidStringType()) { - throw new MissingPropertyException("Email constraint only applies to a String property", + throw new MissingPropertyException('Email constraint only applies to a String property', EMAIL_CONSTRAINT, this.owningClass) } @@ -375,7 +375,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { */ void setEmail(boolean email) { if (isNotValidStringType()) { - throw new MissingPropertyException("Email constraint can only be applied to a String property", + throw new MissingPropertyException('Email constraint can only be applied to a String property', EMAIL_CONSTRAINT, this.owningClass) } @@ -391,7 +391,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { } private boolean isNotValidStringType() { - return !CharSequence.class.isAssignableFrom(propertyType) + return !CharSequence.isAssignableFrom(propertyType) } /** @@ -400,7 +400,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { @Override boolean isCreditCard() { if (isNotValidStringType()) { - throw new MissingPropertyException("CreditCard constraint only applies to a String property", + throw new MissingPropertyException('CreditCard constraint only applies to a String property', CREDIT_CARD_CONSTRAINT, this.owningClass) } @@ -412,7 +412,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { */ void setCreditCard(boolean creditCard) { if (isNotValidStringType()) { - throw new MissingPropertyException("CreditCard constraint only applies to a String property", + throw new MissingPropertyException('CreditCard constraint only applies to a String property', CREDIT_CARD_CONSTRAINT, this.owningClass) } @@ -433,10 +433,10 @@ class DefaultConstrainedProperty implements ConstrainedProperty { @Override String getMatches() { if (isNotValidStringType()) { - throw new MissingPropertyException("Matches constraint only applies to a String property", + throw new MissingPropertyException('Matches constraint only applies to a String property', MATCHES_CONSTRAINT, this.owningClass) } - MatchesConstraint c = (MatchesConstraint)appliedConstraints.get(MATCHES_CONSTRAINT) + MatchesConstraint c = (MatchesConstraint) appliedConstraints.get(MATCHES_CONSTRAINT) return c == null ? null : c.regex } @@ -445,7 +445,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { */ void setMatches(String regex) { if (isNotValidStringType()) { - throw new MissingPropertyException("Matches constraint can only be applied to a String property", + throw new MissingPropertyException('Matches constraint can only be applied to a String property', MATCHES_CONSTRAINT, this.owningClass) } @@ -462,7 +462,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { */ @Override Object getNotEqual() { - NotEqualConstraint c = (NotEqualConstraint)appliedConstraints.get(NOT_EQUAL_CONSTRAINT) + NotEqualConstraint c = (NotEqualConstraint) appliedConstraints.get(NOT_EQUAL_CONSTRAINT) return c == null ? null : c.getNotEqualTo() } @@ -473,8 +473,8 @@ class DefaultConstrainedProperty implements ConstrainedProperty { Integer getMaxSize() { Integer maxSize = null - MaxSizeConstraint maxSizeConstraint = (MaxSizeConstraint)appliedConstraints.get(MAX_SIZE_CONSTRAINT) - SizeConstraint sizeConstraint = (SizeConstraint)appliedConstraints.get(SIZE_CONSTRAINT) + MaxSizeConstraint maxSizeConstraint = (MaxSizeConstraint) appliedConstraints.get(MAX_SIZE_CONSTRAINT) + SizeConstraint sizeConstraint = (SizeConstraint) appliedConstraints.get(SIZE_CONSTRAINT) if (maxSizeConstraint != null || sizeConstraint != null) { int maxSizeConstraintValue = maxSizeConstraint == null ? Integer.MAX_VALUE : maxSizeConstraint.getMaxSize() @@ -499,8 +499,8 @@ class DefaultConstrainedProperty implements ConstrainedProperty { Integer getMinSize() { Integer minSize = null - MinSizeConstraint minSizeConstraint = (MinSizeConstraint)appliedConstraints.get(MIN_SIZE_CONSTRAINT) - SizeConstraint sizeConstraint = (SizeConstraint)appliedConstraints.get(SIZE_CONSTRAINT) + MinSizeConstraint minSizeConstraint = (MinSizeConstraint) appliedConstraints.get(MIN_SIZE_CONSTRAINT) + SizeConstraint sizeConstraint = (SizeConstraint) appliedConstraints.get(SIZE_CONSTRAINT) if (minSizeConstraint != null || sizeConstraint != null) { int minSizeConstraintValue = minSizeConstraint == null ? Integer.MIN_VALUE : minSizeConstraint.getMinSize() @@ -537,7 +537,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { @Override boolean isNullable() { if (appliedConstraints.containsKey(NULLABLE_CONSTRAINT)) { - NullableConstraint nc = (NullableConstraint)appliedConstraints.get(NULLABLE_CONSTRAINT) + NullableConstraint nc = (NullableConstraint) appliedConstraints.get(NULLABLE_CONSTRAINT) return nc.isNullable() } return false @@ -556,19 +556,18 @@ class DefaultConstrainedProperty implements ConstrainedProperty { @Override boolean isUrl() { if (isNotValidStringType()) { - throw new MissingPropertyException("URL constraint can only be applied to a String property", + throw new MissingPropertyException('URL constraint can only be applied to a String property', URL_CONSTRAINT, this.owningClass) } return appliedConstraints.containsKey(URL_CONSTRAINT) } - /** * @param url The url to set. */ void setUrl(boolean url) { if (isNotValidStringType()) { - throw new MissingPropertyException("URL constraint can only be applied to a String property",URL_CONSTRAINT, this.owningClass) + throw new MissingPropertyException('URL constraint can only be applied to a String property', URL_CONSTRAINT, this.owningClass) } Constraint c = appliedConstraints.get(URL_CONSTRAINT) @@ -582,13 +581,12 @@ class DefaultConstrainedProperty implements ConstrainedProperty { } } - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') Map getAttributes() { return attributes } - - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') void setAttributes(Map attributes) { this.attributes = attributes } @@ -606,7 +604,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { for (Constraint c in appliedConstraints.values()) { if (c instanceof VetoingConstraint) { // stop validation process when constraint vetoes - if (((VetoingConstraint)c).validateWithVetoing(target, propertyValue, errors)) { + if (((VetoingConstraint) c).validateWithVetoing(target, propertyValue, errors)) { return } } @@ -637,8 +635,8 @@ class DefaultConstrainedProperty implements ConstrainedProperty { try { - for(ConstraintFactory cf in constraintFactories) { - if(cf.supports(propertyType)) { + for (ConstraintFactory cf in constraintFactories) { + if (cf.supports(propertyType)) { return true } } @@ -678,7 +676,7 @@ class DefaultConstrainedProperty implements ConstrainedProperty { } } else if (hasProperty(constraintName)) { - ((GroovyObject)this).setProperty(constraintName, constrainingValue) + ((GroovyObject) this).setProperty(constraintName, constrainingValue) } else { throw new ValidationConfigurationException("Constraint [$constraintName] is not supported for property [$propertyName] of class [$owningClass] with type [$propertyType]") diff --git a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/PersistentEntityValidator.groovy b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/PersistentEntityValidator.groovy index ee8b41a5e5a..45b7d37a9b7 100644 --- a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/PersistentEntityValidator.groovy +++ b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/PersistentEntityValidator.groovy @@ -21,6 +21,11 @@ package grails.gorm.validation import groovy.transform.CompileDynamic import groovy.transform.CompileStatic + +import org.springframework.context.MessageSource +import org.springframework.validation.Errors +import org.springframework.validation.FieldError + import org.grails.datastore.gorm.support.BeforeValidateHelper import org.grails.datastore.gorm.validation.constraints.eval.ConstraintsEvaluator import org.grails.datastore.mapping.model.MappingContext @@ -32,10 +37,6 @@ import org.grails.datastore.mapping.model.types.ToMany import org.grails.datastore.mapping.model.types.ToOne import org.grails.datastore.mapping.proxy.ProxyHandler import org.grails.datastore.mapping.reflect.EntityReflector -import org.grails.datastore.mapping.reflect.ReflectionUtils -import org.springframework.context.MessageSource -import org.springframework.validation.Errors -import org.springframework.validation.FieldError /** * A Validator that validates a {@link org.grails.datastore.mapping.model.PersistentEntity} against known constraints @@ -69,7 +70,7 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity def evaluated = constraintsEvaluator.evaluate(targetClass) this.constrainedProperties = Collections.unmodifiableMap(evaluated) - if(constrainedProperties == null) { + if (constrainedProperties == null) { throw new IllegalStateException("Constraint evaluator returned null for class: $targetClass") } } @@ -86,18 +87,18 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity def validatedObjects = new HashSet() validatedObjects.add(obj) - for(PersistentProperty pp in entity.persistentProperties) { + for (PersistentProperty pp in entity.persistentProperties) { def propertyName = pp.name ConstrainedProperty constrainedProperty = constrainedProperties.get(propertyName) - if(constrainedProperty != null) { + if (constrainedProperty != null) { validatePropertyWithConstraint(obj, propertyName, entityReflector, errors, constrainedProperty, pp) } - if(pp instanceof Association) { - Association association = (Association)pp - if(cascade) { + if (pp instanceof Association) { + Association association = (Association) pp + if (cascade) { cascadeToAssociativeProperty(obj, errors, entityReflector, association, validatedObjects) } } @@ -105,9 +106,9 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity constrainedPropertyNames.remove(propertyName) } - for(String remainingProperty in constrainedPropertyNames) { + for (String remainingProperty in constrainedPropertyNames) { ConstrainedProperty constrainedProperty = constrainedProperties.get(remainingProperty) - if(remainingProperty != null) { + if (remainingProperty != null) { validatePropertyWithConstraint(obj, remainingProperty, entityReflector, errors, constrainedProperty, null) } } @@ -121,7 +122,7 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity * @param bean The original bean * @param association The associative property */ - protected void cascadeToAssociativeProperty(Object parent, Errors errors, EntityReflector reflector, Association association, Set validatedObjects ) { + protected void cascadeToAssociativeProperty(Object parent, Errors errors, EntityReflector reflector, Association association, Set validatedObjects) { String propertyName = association.getName() if (errors.hasFieldErrors(propertyName)) { return @@ -130,15 +131,15 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity if (association instanceof ToOne) { Object associatedObject = reflector.getProperty(parent, propertyName) - if(associatedObject != null && proxyHandler?.isInitialized(associatedObject)) { - if(association.doesCascadeValidate(associatedObject)) { - cascadeValidationToOne(parent, propertyName, (ToOne)association, errors, reflector, associatedObject, null, validatedObjects) + if (associatedObject != null && proxyHandler?.isInitialized(associatedObject)) { + if (association.doesCascadeValidate(associatedObject)) { + cascadeValidationToOne(parent, propertyName, (ToOne) association, errors, reflector, associatedObject, null, validatedObjects) } else { Errors existingErrors = retrieveErrors(associatedObject) - if(existingErrors != null && existingErrors.hasErrors()) { - for(error in existingErrors.fieldErrors) { - String path = "${propertyName}." +error.field + if (existingErrors != null && existingErrors.hasErrors()) { + for (error in existingErrors.fieldErrors) { + String path = "${propertyName}." + error.field errors.rejectValue(path, error.code, error.arguments, error.defaultMessage) } } @@ -146,7 +147,7 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity } } else if (association instanceof ToMany) { - if(association.doesCascadeValidate(null)) { + if (association.doesCascadeValidate(null)) { cascadeValidationToMany(parent, propertyName, association, errors, reflector, validatedObjects) } } @@ -167,24 +168,24 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity * @param association An association whose isOneToMeny() method returns true * @param propertyName The name of the property */ - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') protected void cascadeValidationToMany(Object parentObject, String propertyName, Association association, Errors errors, EntityReflector entityReflector, Set validatedObjects) { Object collection = entityReflector.getProperty(parentObject, propertyName) - if(collection == null || !proxyHandler?.isInitialized(collection)) { + if (collection == null || !proxyHandler?.isInitialized(collection)) { return } if (collection instanceof List || collection instanceof SortedSet) { int idx = 0 - for (Object associatedObject : ((Collection)collection)) { - cascadeValidationToOne(parentObject, propertyName, association, errors, entityReflector,associatedObject, idx++, validatedObjects) + for (Object associatedObject : ((Collection) collection)) { + cascadeValidationToOne(parentObject, propertyName, association, errors, entityReflector, associatedObject, idx++, validatedObjects) } } else if (collection instanceof Collection) { Integer index = 0 - for (Object associatedObject : ((Collection)collection)) { - cascadeValidationToOne(parentObject, propertyName, association, errors, entityReflector,associatedObject, index++, validatedObjects) + for (Object associatedObject : ((Collection) collection)) { + cascadeValidationToOne(parentObject, propertyName, association, errors, entityReflector, associatedObject, index++, validatedObjects) } } else if (collection instanceof Map) { @@ -206,13 +207,13 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity * @param propertyName The name of the property * @param indexOrKey */ - @SuppressWarnings("rawtypes") + @SuppressWarnings('rawtypes') protected void cascadeValidationToOne(Object parentObject, String propertyName, Association association, Errors errors, EntityReflector reflector, Object associatedObject, Object indexOrKey, Set validatedObjects) { if (associatedObject == null) { return } - if(validatedObjects.contains(associatedObject)) { + if (validatedObjects.contains(associatedObject)) { return } @@ -239,8 +240,8 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity Map associatedConstrainedProperties def validator = mappingContext.getEntityValidator(associatedEntity) - if(validator instanceof PersistentEntityValidator) { - associatedConstrainedProperties = ((PersistentEntityValidator)validator).getConstrainedProperties() + if (validator instanceof PersistentEntityValidator) { + associatedConstrainedProperties = ((PersistentEntityValidator) validator).getConstrainedProperties() } else { associatedConstrainedProperties = Collections.emptyMap() @@ -271,7 +272,7 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity } if (associatedPersistentProperty instanceof Association) { - if(association.isBidirectional() && associatedPersistentProperty == association.inverseSide) { + if (association.isBidirectional() && associatedPersistentProperty == association.inverseSide) { // If this property is the inverse side of the currently processed association then // we don't want to process it continue @@ -281,7 +282,7 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity associatedObject, errors, associatedReflector, - (Association)associatedPersistentProperty, + (Association) associatedPersistentProperty, validatedObjects) } } @@ -300,7 +301,7 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity if (indexOrKey instanceof Integer) { // Component is part of a Collection. Collection access string // e.g. path.object[1] will be appended to the nested path. - return nestedPath + componentName + "[" + indexOrKey + "]" + return nestedPath + componentName + '[' + indexOrKey + ']' } // Component is part of a Map. Nested path should have a key surrounded @@ -310,7 +311,7 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity private void validatePropertyWithConstraint(Object obj, String propertyName, EntityReflector reflector, Errors errors, ConstrainedProperty constrainedProperty, PersistentProperty persistentProperty) { - int i = propertyName.lastIndexOf(".") + int i = propertyName.lastIndexOf('.') String constrainedPropertyName if (i > -1) { constrainedPropertyName = propertyName.substring(i + 1, propertyName.length()) @@ -320,12 +321,12 @@ class PersistentEntityValidator implements CascadingValidator, ConstrainedEntity } FieldError fieldError = errors.getFieldError(constrainedPropertyName) if (fieldError == null) { - if(persistentProperty != null) { + if (persistentProperty != null) { constrainedProperty.validate(obj, reflector.getProperty(obj, constrainedPropertyName), errors) } else { - if(obj instanceof GroovyObject) { - constrainedProperty.validate(obj, ((GroovyObject)obj).getProperty(constrainedPropertyName), errors) + if (obj instanceof GroovyObject) { + constrainedProperty.validate(obj, ((GroovyObject) obj).getProperty(constrainedPropertyName), errors) } } } diff --git a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/exceptions/ValidationConfigurationException.groovy b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/exceptions/ValidationConfigurationException.groovy index 3bc76fd254a..1e8aaa79ae7 100644 --- a/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/exceptions/ValidationConfigurationException.groovy +++ b/grails-datamapping-validation/src/main/groovy/grails/gorm/validation/exceptions/ValidationConfigurationException.groovy @@ -20,7 +20,6 @@ package grails.gorm.validation.exceptions import groovy.transform.CompileStatic -import groovy.transform.InheritConstructors /** * An exception thrown when there is an error configuration validation @@ -30,6 +29,7 @@ import groovy.transform.InheritConstructors */ @CompileStatic class ValidationConfigurationException extends RuntimeException { + ValidationConfigurationException(String var1) { super(var1) } diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/support/BeforeValidateHelper.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/support/BeforeValidateHelper.java index fc04a8aa256..9eea89b26e2 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/support/BeforeValidateHelper.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/support/BeforeValidateHelper.java @@ -18,8 +18,6 @@ */ package org.grails.datastore.gorm.support; -import groovy.lang.MetaClass; - import java.io.IOException; import java.io.ObjectInputStream; import java.io.Serializable; @@ -27,36 +25,38 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import groovy.lang.MetaClass; + public class BeforeValidateHelper implements Serializable { public static final String BEFORE_VALIDATE = "beforeValidate"; - private transient Map, BeforeValidateEventTriggerCaller> eventTriggerCallerCache = new ConcurrentHashMap, BeforeValidateEventTriggerCaller>(); - + private transient Map, BeforeValidateEventTriggerCaller> eventTriggerCallerCache = new ConcurrentHashMap<>(); + public static final class BeforeValidateEventTriggerCaller { EventTriggerCaller eventTriggerCaller; EventTriggerCaller eventTriggerCallerNoArgs; - + public BeforeValidateEventTriggerCaller(Class domainClass, MetaClass metaClass) { eventTriggerCaller = build(domainClass, metaClass, new Class[]{List.class}); eventTriggerCallerNoArgs = build(domainClass, metaClass, new Class[]{}); } - + protected EventTriggerCaller build(Class domainClass, MetaClass metaClass, Class[] argumentTypes) { return EventTriggerCaller.buildCaller(BEFORE_VALIDATE, domainClass, metaClass, argumentTypes); } - + public void call(final Object target, final List validatedFieldsList) { - if(validatedFieldsList != null && eventTriggerCaller != null) { + if (validatedFieldsList != null && eventTriggerCaller != null) { eventTriggerCaller.call(target, new Object[]{validatedFieldsList}); } else if (eventTriggerCallerNoArgs != null) { eventTriggerCallerNoArgs.call(target); } } } - + public void invokeBeforeValidate(final Object target, final List validatedFieldsList) { Class domainClass = target.getClass(); BeforeValidateEventTriggerCaller eventTriggerCaller = eventTriggerCallerCache.get(domainClass); - if(eventTriggerCaller==null) { + if (eventTriggerCaller == null) { eventTriggerCaller = new BeforeValidateEventTriggerCaller(domainClass, null); eventTriggerCallerCache.put(domainClass, eventTriggerCaller); } @@ -66,6 +66,6 @@ public void invokeBeforeValidate(final Object target, final List validatedFie // Ensure that the cache is re-initalized empty when deserialized private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException { in.defaultReadObject(); - eventTriggerCallerCache = new ConcurrentHashMap, BeforeValidateEventTriggerCaller>(); + eventTriggerCallerCache = new ConcurrentHashMap<>(); } -} \ No newline at end of file +} diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/support/EventTriggerCaller.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/support/EventTriggerCaller.java index e027acb6443..6ff3cbff718 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/support/EventTriggerCaller.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/support/EventTriggerCaller.java @@ -19,43 +19,48 @@ package org.grails.datastore.gorm.support; -import groovy.lang.*; - import java.lang.reflect.Field; import java.lang.reflect.Method; import java.lang.reflect.Modifier; +import groovy.lang.Closure; +import groovy.lang.GroovySystem; +import groovy.lang.MetaClass; +import groovy.lang.MetaMethod; +import groovy.lang.MetaProperty; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.springframework.util.ReflectionUtils; public abstract class EventTriggerCaller { private static final Log LOG = LogFactory.getLog(EventTriggerCaller.class); private static final Object[] EMPTY_ARRAY = {}; - private boolean invertBooleanReturnValue=true; + private boolean invertBooleanReturnValue = true; private static final EventTriggerCaller noopCaller = new NoopCaller(); - + public static EventTriggerCaller buildCaller(String eventMethodName, Class clazz) { return buildCaller(eventMethodName, clazz, null, null); } - + public static EventTriggerCaller buildCaller(String eventMethodName, Class clazz, MetaClass metaClass, Class[] preferredArgumentTypes) { EventTriggerCaller caller = resolveMethodCaller(eventMethodName, clazz, preferredArgumentTypes); - if(caller==null) { - caller=resolveFieldClosureCaller(eventMethodName, clazz); + if (caller == null) { + caller = resolveFieldClosureCaller(eventMethodName, clazz); } - if(caller==null) { - caller=resolveMetaClassCallers(eventMethodName, clazz, metaClass); + if (caller == null) { + caller = resolveMetaClassCallers(eventMethodName, clazz, metaClass); } return caller; } private static EventTriggerCaller resolveMetaClassCallers(String eventMethodName, Class clazz, MetaClass metaClass) { - if(metaClass==null) { - metaClass=GroovySystem.getMetaClassRegistry().getMetaClass(clazz); + if (metaClass == null) { + metaClass = GroovySystem.getMetaClassRegistry().getMetaClass(clazz); } EventTriggerCaller caller = resolveMetaMethodCaller(eventMethodName, metaClass); - if(caller==null) { + if (caller == null) { caller = resolveMetaPropertyClosureCaller(eventMethodName, metaClass); } return caller; @@ -90,8 +95,8 @@ private static EventTriggerCaller resolveMethodCaller(String eventMethodName, Cl Method method = ReflectionUtils.findMethod(clazz, eventMethodName, preferredArgumentTypes); if (method == null && preferredArgumentTypes != null) { method = ReflectionUtils.findMethod(clazz, eventMethodName); - if(method == null) { - method = ReflectionUtils.findMethod(clazz, eventMethodName, (Class[])null); + if (method == null) { + method = ReflectionUtils.findMethod(clazz, eventMethodName, (Class[]) null); } } if (method != null) { @@ -100,28 +105,28 @@ private static EventTriggerCaller resolveMethodCaller(String eventMethodName, Cl } return null; } - + public static EventTriggerCaller wrapNullInNoopCaller(EventTriggerCaller caller) { return caller != null ? caller : noopCaller; } - + public final boolean call(Object entity) { return call(entity, EMPTY_ARRAY); } public abstract boolean call(Object entity, Object[] argumentArray); - + public boolean isNoOperationCaller() { return false; } - + public boolean asBoolean() { return !isNoOperationCaller(); } boolean resolveReturnValue(Object retval) { if (retval instanceof Boolean) { - boolean returnValue = (Boolean)retval; + boolean returnValue = (Boolean) retval; return invertBooleanReturnValue ? !returnValue : returnValue; } return false; @@ -134,18 +139,18 @@ public boolean isInvertBooleanReturnValue() { public void setInvertBooleanReturnValue(boolean invertBooleanReturnValue) { this.invertBooleanReturnValue = invertBooleanReturnValue; } - + private static class NoopCaller extends EventTriggerCaller { @Override public boolean call(Object entity, Object[] argumentArray) { return false; } - + public boolean isNoOperationCaller() { return true; } } - + private static class MethodCaller extends EventTriggerCaller { Method method; int numberOfParameters; @@ -158,8 +163,8 @@ private static class MethodCaller extends EventTriggerCaller { @Override public boolean call(Object entity, Object[] argumentArray) { Object[] arguments = new Object[numberOfParameters]; - if(argumentArray != null) { - for(int i=0;i < argumentArray.length && i < arguments.length;i++) { + if (argumentArray != null) { + for (int i = 0; i < argumentArray.length && i < arguments.length; i++) { arguments[i] = argumentArray[i]; } } @@ -189,7 +194,7 @@ private static abstract class ClosureCaller extends EventTriggerCaller { Object callClosure(Object entity, Closure callable, Object[] argumentArray) { if (cloneFirst) { - callable = (Closure)callable.clone(); + callable = (Closure) callable.clone(); } callable.setResolveStrategy(Closure.DELEGATE_FIRST); callable.setDelegate(entity); @@ -238,4 +243,4 @@ public boolean call(Object entity, Object[] argumentArray) { return false; } } -} \ No newline at end of file +} diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/AbstractConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/AbstractConstraint.java index 80d4e396136..6f12a656822 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/AbstractConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/AbstractConstraint.java @@ -25,8 +25,6 @@ import java.util.Locale; import java.util.Set; -import grails.gorm.validation.ConstrainedProperty; -import grails.gorm.validation.Constraint; import org.springframework.beans.BeanWrapperImpl; import org.springframework.context.MessageSource; import org.springframework.context.i18n.LocaleContextHolder; @@ -37,6 +35,9 @@ import org.springframework.validation.Errors; import org.springframework.validation.FieldError; +import grails.gorm.validation.ConstrainedProperty; +import grails.gorm.validation.Constraint; + /** * Abstract class for constraints to extend. * @@ -121,17 +122,17 @@ public void rejectValue(Object target, Errors errors, String defaultMessageCode, rejectValue(target, errors, defaultMessageCode, new String[] {}, args); } - public void rejectValue(Object target,Errors errors, String defaultMessageCode, String code, Object[] args) { - rejectValue(target,errors, defaultMessageCode, new String[] {code}, args); + public void rejectValue(Object target, Errors errors, String defaultMessageCode, String code, Object[] args) { + rejectValue(target, errors, defaultMessageCode, new String[] {code}, args); } - public void rejectValue(Object target,Errors errors, String defaultMessageCode, String[] codes, Object[] args) { + public void rejectValue(Object target, Errors errors, String defaultMessageCode, String[] codes, Object[] args) { rejectValueWithDefaultMessage(target, errors, getDefaultMessage(defaultMessageCode), codes, args); } public void rejectValueWithDefaultMessage(Object target, Errors errors, String defaultMessage, String[] codes, Object[] args) { BindingResult result = (BindingResult) errors; - Set newCodes = new LinkedHashSet(); + Set newCodes = new LinkedHashSet<>(); if (args.length > 1 && messageSource != null) { if ((args[0] instanceof String) && (args[1] instanceof Class)) { @@ -145,7 +146,7 @@ public void rejectValueWithDefaultMessage(Object target, Errors errors, String d if (resolvedClassName.equals(fullClassName)) { // try short version - classNameCode = classAsPropertyName+".label"; + classNameCode = classAsPropertyName + ".label"; resolvedClassName = messageSource.getMessage(classNameCode, null, fullClassName, locale); } @@ -154,7 +155,7 @@ public void rejectValueWithDefaultMessage(Object target, Errors errors, String d args[1] = resolvedClassName; } - String propertyName = (String)args[0]; + String propertyName = (String) args[0]; String propertyNameCode = fullClassName + '.' + propertyName + ".label"; String resolvedPropertyName = messageSource.getMessage(propertyNameCode, null, propertyName, locale); if (resolvedPropertyName.equals(propertyName)) { @@ -187,7 +188,7 @@ public void rejectValueWithDefaultMessage(Object target, Errors errors, String d newCodes.toArray(new String[newCodes.size()]), args, defaultMessage); - ((BindingResult)errors).addError(error); + ((BindingResult) errors).addError(error); } private Object getPropertyValue(Errors errors, Object target) { diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/AbstractVetoingConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/AbstractVetoingConstraint.java index 8ec8641eaa0..2c6b3788ee0 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/AbstractVetoingConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/AbstractVetoingConstraint.java @@ -19,10 +19,11 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.VetoingConstraint; import org.springframework.context.MessageSource; import org.springframework.validation.Errors; +import grails.gorm.validation.VetoingConstraint; + /** * A constraint that can veto further constraint processing * diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/BlankConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/BlankConstraint.java index fa96b0ef0e6..ca3e889ee23 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/BlankConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/BlankConstraint.java @@ -19,11 +19,12 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; import org.springframework.context.MessageSource; import org.springframework.util.StringUtils; import org.springframework.validation.Errors; +import grails.gorm.validation.ConstrainedProperty; + /** * A Constraint that validates a string is not blank. * diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/CreditCardConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/CreditCardConstraint.java index e1031f05f5d..8d0068db9df 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/CreditCardConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/CreditCardConstraint.java @@ -19,11 +19,13 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; import org.apache.commons.validator.routines.CreditCardValidator; + import org.springframework.context.MessageSource; import org.springframework.validation.Errors; +import grails.gorm.validation.ConstrainedProperty; + /** * Validates a credit card number. * @@ -65,7 +67,6 @@ protected Object validateParameter(Object constraintParameter) { return constraintParameter; } - public String getName() { return ConstrainedProperty.CREDIT_CARD_CONSTRAINT; } diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/EmailConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/EmailConstraint.java index 35bdf47ed81..c9f688a75b3 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/EmailConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/EmailConstraint.java @@ -19,13 +19,14 @@ package org.grails.datastore.gorm.validation.constraints; - -import grails.gorm.validation.ConstrainedProperty; import org.apache.commons.validator.routines.EmailValidator; + import org.springframework.context.MessageSource; import org.springframework.util.StringUtils; import org.springframework.validation.Errors; +import grails.gorm.validation.ConstrainedProperty; + /** * Validates an email address. * @@ -61,7 +62,6 @@ protected Object validateParameter(Object constraintParameter) { return constraintParameter; } - public String getName() { return ConstrainedProperty.EMAIL_CONSTRAINT; } diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/InListConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/InListConstraint.java index 4b811201e3f..d8fbbe2bea8 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/InListConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/InListConstraint.java @@ -19,11 +19,12 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; +import java.util.List; + import org.springframework.context.MessageSource; import org.springframework.validation.Errors; -import java.util.List; +import grails.gorm.validation.ConstrainedProperty; /** * A constraint that validates the property is contained within the supplied list. diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MatchesConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MatchesConstraint.java index 4b1c62d2ed4..e4053411f5a 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MatchesConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MatchesConstraint.java @@ -19,11 +19,11 @@ package org.grails.datastore.gorm.validation.constraints; - -import grails.gorm.validation.ConstrainedProperty; import org.springframework.context.MessageSource; import org.springframework.validation.Errors; +import grails.gorm.validation.ConstrainedProperty; + /** * Validates the property against a supplied regular expression. * diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MaxConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MaxConstraint.java index 42ecbe6f44b..47ebbe5a5bc 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MaxConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MaxConstraint.java @@ -19,12 +19,12 @@ package org.grails.datastore.gorm.validation.constraints; +import org.springframework.context.MessageSource; +import org.springframework.validation.Errors; import grails.gorm.validation.ConstrainedProperty; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; import org.grails.datastore.mapping.reflect.ClassUtils; -import org.springframework.context.MessageSource; -import org.springframework.validation.Errors; /** * Implements a maximum value constraint. @@ -32,7 +32,7 @@ * @author Graeme Rocher * @since 0.4 */ -@SuppressWarnings({"unchecked","rawtypes"}) +@SuppressWarnings({"unchecked", "rawtypes"}) public class MaxConstraint extends AbstractConstraint { private final Comparable maxValue; @@ -69,7 +69,7 @@ protected Object validateParameter(Object constraintParameter) { if (!(constraintParameter instanceof Comparable) && (!constraintParameter.getClass().isPrimitive())) { throw new IllegalArgumentException("Parameter for constraint [" + ConstrainedProperty.MAX_CONSTRAINT + "] of property [" + constraintPropertyName + - "] of class ["+constraintOwningClass + "] must implement the interface [java.lang.Comparable]"); + "] of class [" + constraintOwningClass + "] must implement the interface [java.lang.Comparable]"); } Class propertyClass = ClassPropertyFetcher.getPropertyType(constraintOwningClass, constraintPropertyName); @@ -89,9 +89,9 @@ public String getName() { @Override protected void processValidate(Object target, Object propertyValue, Errors errors) { if (maxValue.compareTo(propertyValue) < 0) { - Object[] args = new Object[] { constraintPropertyName, constraintOwningClass, propertyValue, maxValue }; + Object[] args = new Object[] { constraintPropertyName, constraintOwningClass, propertyValue, maxValue }; rejectValue(target, errors, ConstrainedProperty.DEFAULT_INVALID_MAX_MESSAGE_CODE, ConstrainedProperty.MAX_CONSTRAINT + ConstrainedProperty.EXCEEDED_SUFFIX, args); } } -} \ No newline at end of file +} diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MaxSizeConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MaxSizeConstraint.java index 7bdc0695d18..c85b25543b4 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MaxSizeConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MaxSizeConstraint.java @@ -19,12 +19,13 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; +import java.lang.reflect.Array; +import java.util.Collection; + import org.springframework.context.MessageSource; import org.springframework.validation.Errors; -import java.lang.reflect.Array; -import java.util.Collection; +import grails.gorm.validation.ConstrainedProperty; /** * Validates maximum size or length of the property, for strings and arrays @@ -39,7 +40,7 @@ public class MaxSizeConstraint extends AbstractConstraint { public MaxSizeConstraint(Class constraintOwningClass, String constraintPropertyName, Object constraintParameter, MessageSource messageSource) { super(constraintOwningClass, constraintPropertyName, constraintParameter, messageSource); - this.maxSize = ((Number)this.constraintParameter).intValue() ; + this.maxSize = ((Number) this.constraintParameter).intValue(); } /** @@ -83,10 +84,10 @@ protected void processValidate(Object target, Object propertyValue, Errors error length = Array.getLength(propertyValue); } else if (propertyValue instanceof Collection) { - length = ((Collection)propertyValue).size(); + length = ((Collection) propertyValue).size(); } else { // String - length = ((String)propertyValue).length(); + length = ((String) propertyValue).length(); } if (length > maxSize) { diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MinConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MinConstraint.java index c2f88d39e2e..9d02b8c1a55 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MinConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MinConstraint.java @@ -19,11 +19,12 @@ package org.grails.datastore.gorm.validation.constraints; +import org.springframework.context.MessageSource; +import org.springframework.validation.Errors; + import grails.gorm.validation.ConstrainedProperty; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; import org.grails.datastore.mapping.reflect.ClassUtils; -import org.springframework.context.MessageSource; -import org.springframework.validation.Errors; /** * Implements a minimum value constraint. @@ -72,7 +73,7 @@ protected Object validateParameter(Object constraintParameter) { } Class propertyClass = ClassPropertyFetcher.getPropertyType(constraintOwningClass, constraintPropertyName); - if (!ClassUtils.isAssignableOrConvertibleFrom(constraintParameter.getClass(),propertyClass)) { + if (!ClassUtils.isAssignableOrConvertibleFrom(constraintParameter.getClass(), propertyClass)) { throw new IllegalArgumentException("Parameter for constraint [" + ConstrainedProperty.MIN_CONSTRAINT + "] of property [" + constraintPropertyName + "] of class [" + constraintOwningClass + "] must be the same type as property: [" + propertyClass.getName() + "]"); @@ -80,7 +81,6 @@ protected Object validateParameter(Object constraintParameter) { return constraintParameter; } - public String getName() { return ConstrainedProperty.MIN_CONSTRAINT; } diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MinSizeConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MinSizeConstraint.java index 3a7210aa7eb..fc1a856bdaf 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MinSizeConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/MinSizeConstraint.java @@ -19,12 +19,13 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; +import java.lang.reflect.Array; +import java.util.Collection; + import org.springframework.context.MessageSource; import org.springframework.validation.Errors; -import java.lang.reflect.Array; -import java.util.Collection; +import grails.gorm.validation.ConstrainedProperty; /** * Validates minimum size or length of the property, for strings and arrays @@ -81,10 +82,10 @@ protected void processValidate(Object target, Object propertyValue, Errors error length = Array.getLength(propertyValue); } else if (propertyValue instanceof Collection) { - length = ((Collection)propertyValue).size(); + length = ((Collection) propertyValue).size(); } else { // String - length = ((String)propertyValue).length(); + length = ((String) propertyValue).length(); } if (length < minSize) { diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/NotEqualConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/NotEqualConstraint.java index f3afdf8c156..d466bac8cd8 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/NotEqualConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/NotEqualConstraint.java @@ -19,12 +19,12 @@ package org.grails.datastore.gorm.validation.constraints; +import org.springframework.context.MessageSource; +import org.springframework.validation.Errors; import grails.gorm.validation.ConstrainedProperty; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; import org.grails.datastore.mapping.reflect.ClassUtils; -import org.springframework.context.MessageSource; -import org.springframework.validation.Errors; /** * Validates not equal to something. @@ -56,7 +56,7 @@ protected Object validateParameter(Object constraintParameter) { } Class propertyClass = ClassPropertyFetcher.getPropertyType(constraintOwningClass, constraintPropertyName); - if (!ClassUtils.isAssignableOrConvertibleFrom(constraintParameter.getClass(),propertyClass) && propertyClass != null) { + if (!ClassUtils.isAssignableOrConvertibleFrom(constraintParameter.getClass(), propertyClass) && propertyClass != null) { throw new IllegalArgumentException("Parameter for constraint [" + ConstrainedProperty.NOT_EQUAL_CONSTRAINT + "] of property [" + constraintPropertyName + "] of class [" + constraintOwningClass + @@ -65,7 +65,6 @@ protected Object validateParameter(Object constraintParameter) { return constraintParameter; } - /** * @return Returns the notEqualTo. */ diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/NullableConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/NullableConstraint.java index c1d42a9cf7a..c421b2845ab 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/NullableConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/NullableConstraint.java @@ -19,10 +19,11 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; import org.springframework.context.MessageSource; import org.springframework.validation.Errors; +import grails.gorm.validation.ConstrainedProperty; + /** * Validates not null. * diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/RangeConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/RangeConstraint.java index e6d7673bd92..66f239e5046 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/RangeConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/RangeConstraint.java @@ -19,18 +19,20 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; import groovy.lang.Range; -import org.grails.datastore.mapping.reflect.ClassUtils; + import org.springframework.context.MessageSource; import org.springframework.validation.Errors; +import grails.gorm.validation.ConstrainedProperty; +import org.grails.datastore.mapping.reflect.ClassUtils; + /** * Validates a range. * * @author Graeme Rocher */ -@SuppressWarnings({"unchecked","rawtypes"}) +@SuppressWarnings({"unchecked", "rawtypes"}) public class RangeConstraint extends AbstractConstraint { private final Range range; @@ -76,8 +78,13 @@ protected void processValidate(Object target, Object propertyValue, Errors error return; } - Object[] args = new Object[] { constraintPropertyName, constraintOwningClass, - propertyValue, range.getFrom(), range.getTo()}; + Object[] args = new Object[] { + constraintPropertyName, + constraintOwningClass, + propertyValue, + range.getFrom(), + range.getTo() + }; Comparable from = range.getFrom(); Comparable to = range.getTo(); @@ -87,10 +94,10 @@ protected void processValidate(Object target, Object propertyValue, Errors error // Upgrade the numbers to Long, so all integer types can be compared. from = ((Number) from).longValue(); to = ((Number) to).longValue(); - if(propertyValue instanceof Number) { + if (propertyValue instanceof Number) { propertyValue = ((Number) propertyValue).longValue(); } - else if(propertyValue instanceof CharSequence) { + else if (propertyValue instanceof CharSequence) { try { propertyValue = Long.valueOf(propertyValue.toString()); } catch (NumberFormatException e) { diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/ScaleConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/ScaleConstraint.java index b47d9d5a11f..2a70a3179f4 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/ScaleConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/ScaleConstraint.java @@ -19,14 +19,15 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; -import org.grails.datastore.mapping.reflect.ClassUtils; +import java.math.BigDecimal; + import org.springframework.beans.BeanWrapper; import org.springframework.beans.BeanWrapperImpl; import org.springframework.context.MessageSource; import org.springframework.validation.Errors; -import java.math.BigDecimal; +import grails.gorm.validation.ConstrainedProperty; +import org.grails.datastore.mapping.reflect.ClassUtils; /** * Manages the scale for floating point numbers (i.e., the @@ -104,7 +105,6 @@ protected Object validateParameter(Object constraintParameter) { return constraintParameter; } - /** * {@inheritDoc} * @see AbstractConstraint#processValidate( diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/SizeConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/SizeConstraint.java index 1a4936352e9..40a0bcf30b8 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/SizeConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/SizeConstraint.java @@ -19,14 +19,15 @@ package org.grails.datastore.gorm.validation.constraints; +import java.lang.reflect.Array; +import java.util.Collection; -import grails.gorm.validation.ConstrainedProperty; import groovy.lang.IntRange; + import org.springframework.context.MessageSource; import org.springframework.validation.Errors; -import java.lang.reflect.Array; -import java.util.Collection; +import grails.gorm.validation.ConstrainedProperty; /** * Validates size of the property, for strings and arrays @@ -73,7 +74,6 @@ protected Object validateParameter(Object constraintParameter) { return constraintParameter; } - public String getName() { return ConstrainedProperty.SIZE_CONSTRAINT; } @@ -88,10 +88,10 @@ protected void processValidate(Object target, Object propertyValue, Errors error size = Array.getLength(propertyValue); } else if (propertyValue instanceof Collection) { - size = ((Collection)propertyValue).size(); + size = ((Collection) propertyValue).size(); } else { // String - size = ((String)propertyValue).length(); + size = ((String) propertyValue).length(); } if (!range.contains(size)) { @@ -105,7 +105,7 @@ else if (range.getTo().compareTo(size) == -1) { } private void rejectValue(Object[] args, Errors errors, Object target, String suffix) { - rejectValue(target,errors, ConstrainedProperty.DEFAULT_INVALID_SIZE_MESSAGE_CODE, + rejectValue(target, errors, ConstrainedProperty.DEFAULT_INVALID_SIZE_MESSAGE_CODE, ConstrainedProperty.SIZE_CONSTRAINT + suffix, args); } } diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/UrlConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/UrlConstraint.java index 750b58b72a9..1c4da1a134a 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/UrlConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/UrlConstraint.java @@ -19,13 +19,15 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; +import java.util.List; + import org.apache.commons.validator.routines.RegexValidator; import org.apache.commons.validator.routines.UrlValidator; + import org.springframework.context.MessageSource; import org.springframework.validation.Errors; -import java.util.List; +import grails.gorm.validation.ConstrainedProperty; /** * Validates a url. @@ -76,7 +78,6 @@ else if (constraintParameter instanceof List) { UrlValidator validator = new UrlValidator(domainValidator, UrlValidator.ALLOW_ALL_SCHEMES + UrlValidator.ALLOW_2_SLASHES); - return validator; } diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/ValidatorConstraint.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/ValidatorConstraint.java index b998618febe..f17b1240d1a 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/ValidatorConstraint.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/ValidatorConstraint.java @@ -19,14 +19,15 @@ package org.grails.datastore.gorm.validation.constraints; -import grails.gorm.validation.ConstrainedProperty; -import groovy.lang.Closure; - import java.util.Collection; +import groovy.lang.Closure; + import org.springframework.context.MessageSource; import org.springframework.validation.Errors; +import grails.gorm.validation.ConstrainedProperty; + /** *

A constraint class that validates using a user-supplied closure.

*

The Closure will receive one or two parameters containing the new value of the property and the object @@ -74,11 +75,11 @@ protected Object validateParameter(Object constraintParameter) { Class[] params = validator.getParameterTypes(); // Groovy should always force one parameter, but let's check anyway... if (params.length == 0) { - throw new IllegalArgumentException("Parameter for constraint ["+ConstrainedProperty.VALIDATOR_CONSTRAINT+"] of property ["+constraintPropertyName+"] of class ["+constraintOwningClass+"] must be a Closure taking at least 1 parameter (value, [object])"); + throw new IllegalArgumentException("Parameter for constraint [" + ConstrainedProperty.VALIDATOR_CONSTRAINT + "] of property [" + constraintPropertyName + "] of class [" + constraintOwningClass + "] must be a Closure taking at least 1 parameter (value, [object])"); } if (params.length > 3) { - throw new IllegalArgumentException("Parameter for constraint ["+ConstrainedProperty.VALIDATOR_CONSTRAINT+"] of property ["+constraintPropertyName+"] of class ["+constraintOwningClass+"] must be a Closure taking no more than 3 parameters (value, [object, [errors]])"); + throw new IllegalArgumentException("Parameter for constraint [" + ConstrainedProperty.VALIDATOR_CONSTRAINT + "] of property [" + constraintPropertyName + "] of class [" + constraintOwningClass + "] must be a Closure taking no more than 3 parameters (value, [object, [errors]])"); } return constraintParameter; } @@ -130,7 +131,7 @@ protected void processValidate(Object target, Object propertyValue, Errors error if (result != null) { if (result instanceof Boolean) { - bad = !(Boolean)result; + bad = !(Boolean) result; } else if (result instanceof CharSequence) { bad = true; @@ -138,14 +139,14 @@ else if (result instanceof CharSequence) { } else if ((result instanceof Collection) || result.getClass().isArray()) { bad = true; - Object[] values = (result instanceof Collection) ? ((Collection)result).toArray() : (Object[])result; + Object[] values = (result instanceof Collection) ? ((Collection) result).toArray() : (Object[]) result; if (!(values[0] instanceof String)) { throw new IllegalArgumentException("Return value from validation closure [" + - ConstrainedProperty.VALIDATOR_CONSTRAINT+"] of property ["+constraintPropertyName+"] of class [" + - constraintOwningClass+"] is returning a list but the first element must be a string " + + ConstrainedProperty.VALIDATOR_CONSTRAINT + "] of property [" + constraintPropertyName + "] of class [" + + constraintOwningClass + "] is returning a list but the first element must be a string " + "containing the error message code"); } - errmsg = (String)values[0]; + errmsg = (String) values[0]; args = new Object[values.length - 1 + 3]; int i = 0; args[i++] = constraintPropertyName; @@ -155,7 +156,7 @@ else if ((result instanceof Collection) || result.getClass().isArray()) { } else { throw new IllegalArgumentException("Return value from validation closure [" + - ConstrainedProperty.VALIDATOR_CONSTRAINT+"] of property [" + constraintPropertyName + + ConstrainedProperty.VALIDATOR_CONSTRAINT + "] of property [" + constraintPropertyName + "] of class [" + constraintOwningClass + "] must be a boolean, a string, an array or a collection"); } @@ -165,7 +166,7 @@ else if ((result instanceof Collection) || result.getClass().isArray()) { args = new Object[] { constraintPropertyName, constraintOwningClass, propertyValue }; } rejectValue(target, errors, ConstrainedProperty.DEFAULT_INVALID_VALIDATOR_MESSAGE_CODE, - errmsg == null ? ConstrainedProperty.VALIDATOR_CONSTRAINT + ConstrainedProperty.INVALID_SUFFIX: errmsg, args); + errmsg == null ? ConstrainedProperty.VALIDATOR_CONSTRAINT + ConstrainedProperty.INVALID_SUFFIX : errmsg, args); } } diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/builder/ConstrainedPropertyBuilder.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/builder/ConstrainedPropertyBuilder.java index 0a750d776f7..e6594f268a4 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/builder/ConstrainedPropertyBuilder.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/builder/ConstrainedPropertyBuilder.java @@ -19,24 +19,36 @@ package org.grails.datastore.gorm.validation.constraints.builder; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; + +import groovy.lang.GroovySystem; +import groovy.lang.MetaClass; +import groovy.lang.MetaProperty; +import groovy.lang.MissingMethodException; +import groovy.lang.MissingPropertyException; +import groovy.util.BuilderSupport; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.beans.InvalidPropertyException; + import grails.gorm.validation.ConstrainedProperty; import grails.gorm.validation.Constraint; -import groovy.lang.*; -import groovy.util.BuilderSupport; -import org.grails.datastore.gorm.validation.constraints.registry.ConstraintRegistry; import grails.gorm.validation.DefaultConstrainedProperty; import org.grails.datastore.gorm.validation.constraints.eval.DefaultConstraintEvaluator; +import org.grails.datastore.gorm.validation.constraints.registry.ConstraintRegistry; import org.grails.datastore.mapping.model.MappingContext; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.InvalidPropertyException; - -import java.lang.reflect.Modifier; -import java.util.*; /** * Builder used as a delegate within the "constraints" closure of GrailsDomainClass instances . @@ -60,7 +72,6 @@ public class ConstrainedPropertyBuilder extends BuilderSupport { private boolean allowDynamic = false; private boolean defaultNullable = false; - public ConstrainedPropertyBuilder(MappingContext mappingContext, ConstraintRegistry constraintRegistry, Class targetClass, Map defaultConstraints) { this.targetClass = targetClass; this.mappingContext = mappingContext; @@ -127,15 +138,15 @@ protected Object createNode(Object name, Map attributes) { // we do this so that missing property exception is throw if it doesn't exist try { - String property = (String)name; + String property = (String) name; DefaultConstrainedProperty cp; if (constrainedProperties.containsKey(property)) { - cp = (DefaultConstrainedProperty)constrainedProperties.get(property); + cp = (DefaultConstrainedProperty) constrainedProperties.get(property); } else { Class propertyType = determinePropertyType(property); if (propertyType == null) { - if(!allowDynamic) { + if (!allowDynamic) { throw new MissingMethodException(property, targetClass, new Object[]{attributes}, true); } // assume in dynamic use types are strings @@ -184,8 +195,8 @@ protected Object createNode(Object name, Map attributes) { return cp; } - catch(InvalidPropertyException ipe) { - throw new MissingMethodException((String)name,targetClass,new Object[]{ attributes}); + catch (InvalidPropertyException ipe) { + throw new MissingMethodException((String) name, targetClass, new Object[]{ attributes}); } } @@ -195,13 +206,13 @@ protected Object createNode(Object name, Map attributes, Object value) { if (IMPORT_FROM_CONSTRAINT.equals(name) && (value instanceof Class)) { return handleImportFrom(attributes, (Class) value); } - throw new MissingMethodException((String)name,targetClass,new Object[]{ attributes,value}); + throw new MissingMethodException((String) name, targetClass, new Object[]{ attributes, value}); } @SuppressWarnings({"unchecked", "rawtypes"}) private Object handleImportFrom(Map attributes, Class importFromClazz) { - Map importFromConstrainedProperties = new DefaultConstraintEvaluator(constraintRegistry,mappingContext, defaultConstraints ) + Map importFromConstrainedProperties = new DefaultConstraintEvaluator(constraintRegistry, mappingContext, defaultConstraints) .evaluate(importFromClazz, defaultNullable); List metaProperties = classPropertyFetcher.getMetaProperties(); @@ -211,7 +222,7 @@ private Object handleImportFrom(Map attributes, Class importFromClazz) { List resultingPropertyNames = new ArrayList<>(); for (MetaProperty metaProperty : metaProperties) { - if(Modifier.isStatic(metaProperty.getModifiers())) { + if (Modifier.isStatic(metaProperty.getModifiers())) { continue; } String propertyName = metaProperty.getName(); @@ -223,8 +234,8 @@ else if (isListOfRegexpsContainsString(toBeIncludedPropertyNamesParam, propertyN resultingPropertyNames.add(propertyName); } - if (toBeExcludedPropertyNamesParam != null - && isListOfRegexpsContainsString(toBeExcludedPropertyNamesParam, propertyName)) { + if (toBeExcludedPropertyNamesParam != null && + isListOfRegexpsContainsString(toBeExcludedPropertyNamesParam, propertyName)) { resultingPropertyNames.remove(propertyName); } } @@ -246,7 +257,7 @@ && isListOfRegexpsContainsString(toBeExcludedPropertyNamesParam, propertyName)) } //add any metaContraints importFromConstrainedPropertyAttributes.putAll(importFromConstrainedProperty.getMetaConstraints()); - + createNode(targetPropertyName, importFromConstrainedPropertyAttributes); } } @@ -279,7 +290,7 @@ protected Object createNode(Object name) { @Override protected Object createNode(Object name, Object value) { - return createNode(name,Collections.EMPTY_MAP,value); + return createNode(name, Collections.EMPTY_MAP, value); } public Map getConstrainedProperties() { diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/eval/ConstraintsEvaluator.groovy b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/eval/ConstraintsEvaluator.groovy index 9ca15050943..e9d06e7df08 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/eval/ConstraintsEvaluator.groovy +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/eval/ConstraintsEvaluator.groovy @@ -30,6 +30,7 @@ import org.grails.datastore.mapping.model.config.GormProperties * @since 6.0 */ interface ConstraintsEvaluator { + /** * The name of the constraints property */ @@ -46,7 +47,7 @@ interface ConstraintsEvaluator { * @param cls The class to evaluate constraints for * @return A map of constrained properties */ - Map evaluate(@SuppressWarnings("rawtypes") Class cls) + Map evaluate(@SuppressWarnings('rawtypes') Class cls) /** * Evaluate constraints for the given class @@ -55,7 +56,7 @@ interface ConstraintsEvaluator { * @oaram defaultNullable Whether to default to allow nullable * @return A map of constrained properties */ - Map evaluate(@SuppressWarnings("rawtypes") Class cls, boolean defaultNullable) + Map evaluate(@SuppressWarnings('rawtypes') Class cls, boolean defaultNullable) /** * Evaluate constraints for the given class @@ -75,4 +76,4 @@ interface ConstraintsEvaluator { * @return The builder */ ConstrainedPropertyBuilder newConstrainedPropertyBuilder(Class theClass) -} \ No newline at end of file +} diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/eval/DefaultConstraintEvaluator.java b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/eval/DefaultConstraintEvaluator.java index b1674f6ea1f..a4634d8f93d 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/eval/DefaultConstraintEvaluator.java +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/eval/DefaultConstraintEvaluator.java @@ -19,11 +19,30 @@ package org.grails.datastore.gorm.validation.constraints.eval; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import groovy.lang.Closure; +import groovy.lang.GroovyObject; +import groovy.lang.MetaBeanProperty; +import groovy.lang.MetaMethod; +import groovy.lang.MetaProperty; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.context.MessageSource; +import org.springframework.context.support.StaticMessageSource; + import grails.gorm.validation.Constrained; import grails.gorm.validation.ConstrainedProperty; -import grails.gorm.validation.exceptions.ValidationConfigurationException; -import groovy.lang.*; import grails.gorm.validation.DefaultConstrainedProperty; +import grails.gorm.validation.exceptions.ValidationConfigurationException; import org.grails.datastore.gorm.validation.constraints.builder.ConstrainedPropertyBuilder; import org.grails.datastore.gorm.validation.constraints.registry.ConstraintRegistry; import org.grails.datastore.gorm.validation.constraints.registry.DefaultConstraintRegistry; @@ -37,12 +56,6 @@ import org.grails.datastore.mapping.model.types.ToOne; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; import org.grails.datastore.mapping.reflect.NameUtils; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.MessageSource; -import org.springframework.context.support.StaticMessageSource; - -import java.util.*; /** * Evaluates constraints for entities @@ -57,12 +70,11 @@ public class DefaultConstraintEvaluator implements ConstraintsEvaluator { protected final MappingContext mappingContext; protected final Map defaultConstraints; - public DefaultConstraintEvaluator() { this(new DefaultConstraintRegistry(new StaticMessageSource()), new KeyValueMappingContext("default"), Collections.emptyMap()); } - public DefaultConstraintEvaluator( Map defaultConstraints ) { + public DefaultConstraintEvaluator(Map defaultConstraints) { this(new DefaultConstraintRegistry(new StaticMessageSource()), new KeyValueMappingContext("default"), defaultConstraints); } @@ -101,9 +113,9 @@ public Map evaluate(@SuppressWarnings("rawtypes") C @Override public Map evaluate(Class theClass, boolean defaultNullable, boolean useOnlyAdHocConstraints, Closure... adHocConstraintsClosures) { - List constraints = useOnlyAdHocConstraints ? new ArrayList() : ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(theClass, PROPERTY_NAME, Closure.class); - if(adHocConstraintsClosures != null) { - constraints.addAll( Arrays.asList(adHocConstraintsClosures) ); + List constraints = useOnlyAdHocConstraints ? new ArrayList<>() : ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(theClass, PROPERTY_NAME, Closure.class); + if (adHocConstraintsClosures != null) { + constraints.addAll(Arrays.asList(adHocConstraintsClosures)); } ConstrainedPropertyBuilder delegate = newConstrainedPropertyBuilder(theClass); delegate.setDefaultNullable(defaultNullable); @@ -122,7 +134,7 @@ public Map evaluate(Class theClass, boolean defa Map constrainedProperties = delegate.getConstrainedProperties(); PersistentEntity entity = mappingContext.getPersistentEntity(theClass.getName()); List properties = null; - if(entity != null) { + if (entity != null) { properties = entity.getPersistentProperties(); if (properties != null) { @@ -169,17 +181,17 @@ public Map evaluate(Class theClass, boolean defa List metaProperties = cpf.getMetaProperties(); for (MetaProperty metaProperty : metaProperties) { String propertyName = metaProperty.getName(); - if(!constrainedProperties.containsKey(propertyName) && NameUtils.isNotConfigurational(propertyName)) { + if (!constrainedProperties.containsKey(propertyName) && NameUtils.isNotConfigurational(propertyName)) { Class propertyType = metaProperty.getType(); - if(metaProperty instanceof MetaBeanProperty) { + if (metaProperty instanceof MetaBeanProperty) { MetaBeanProperty beanProperty = (MetaBeanProperty) metaProperty; MetaMethod getter = beanProperty.getGetter(); // getters of type Boolean should start with 'get' not 'is' - if(Boolean.class == propertyType && getter != null && getter.getName().startsWith("is")) { + if (Boolean.class == propertyType && getter != null && getter.getName().startsWith("is")) { continue; } } - if(!defaultNullable) { + if (!defaultNullable) { DefaultConstrainedProperty constrainedProperty = new DefaultConstrainedProperty(theClass, propertyName, propertyType, constraintRegistry); constrainedProperty.setOrder(constrainedProperties.size() + 1); constrainedProperties.put(propertyName, constrainedProperty); @@ -208,7 +220,7 @@ protected void applySharedConstraints( String propertyName = entry.getKey(); Constrained constrainedProperty = entry.getValue(); String sharedConstraintReference = constrainedPropertyBuilder.getSharedConstraint(propertyName); - if (sharedConstraintReference != null && defaultConstraints != null) { + if (sharedConstraintReference != null && defaultConstraints != null) { Object o = defaultConstraints.get(sharedConstraintReference); if (o instanceof Map) { @SuppressWarnings({ "unchecked", "rawtypes" }) @@ -238,7 +250,7 @@ protected void applyDefaultConstraints(String propertyName, PersistentProperty p if (defaultConstraints.containsKey("*")) { final Object o = defaultConstraints.get("*"); if (o instanceof Map) { - Map globalConstraints = (Map)o; + Map globalConstraints = (Map) o; applyMapOfConstraints(globalConstraints, propertyName, persistentProperty, cp); } } @@ -277,19 +289,19 @@ protected void applyMapOfConstraints(Map constraints, String pro Object constrainingValue = entry.getValue(); if (!cp.hasAppliedConstraint(constraintName) && cp.supportsContraint(constraintName)) { if (ConstrainedProperty.NULLABLE_CONSTRAINT.equals(constraintName)) { - if (isConstrainableProperty(persistentProperty,propertyName)) { + if (isConstrainableProperty(persistentProperty, propertyName)) { cp.applyConstraint(constraintName, constrainingValue); } } else { - cp.applyConstraint(constraintName,constrainingValue); + cp.applyConstraint(constraintName, constrainingValue); } } } } protected boolean isConstrainableProperty(PersistentProperty persistentProperty, String propertyName) { - if(persistentProperty == null) { + if (persistentProperty == null) { return NameUtils.isNotConfigurational(propertyName); } else { @@ -298,7 +310,7 @@ protected boolean isConstrainableProperty(PersistentProperty persistentProperty, !propertyName.equals(GormProperties.LAST_UPDATED) && !(persistentProperty instanceof Identity) && !(persistentProperty.getMapping().getMappedForm().isDerived()) && - !( (persistentProperty instanceof ToOne) && ((ToOne)persistentProperty).isBidirectional() && ((ToOne) persistentProperty).isCircular()); + !((persistentProperty instanceof ToOne) && ((ToOne) persistentProperty).isBidirectional() && ((ToOne) persistentProperty).isCircular()); } } diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/factory/ConstraintFactory.groovy b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/factory/ConstraintFactory.groovy index 0dd507e2ff3..d16265cae3e 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/factory/ConstraintFactory.groovy +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/factory/ConstraintFactory.groovy @@ -57,4 +57,4 @@ interface ConstraintFactory { * @return A constraint instance */ T build(Class owner, String property, Object constrainingValue) -} \ No newline at end of file +} diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/factory/DefaultConstraintFactory.groovy b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/factory/DefaultConstraintFactory.groovy index 0d46586662f..001acf048f4 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/factory/DefaultConstraintFactory.groovy +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/factory/DefaultConstraintFactory.groovy @@ -19,16 +19,17 @@ package org.grails.datastore.gorm.validation.constraints.factory +import java.beans.Introspector +import java.lang.reflect.Constructor + +import groovy.transform.CompileStatic + +import org.springframework.context.MessageSource + import grails.gorm.validation.Constraint import grails.gorm.validation.exceptions.ValidationConfigurationException -import groovy.transform.CompileStatic -import org.grails.datastore.gorm.validation.constraints.AbstractConstraint import org.grails.datastore.gorm.validation.constraints.NullableConstraint import org.grails.datastore.mapping.reflect.ClassUtils -import org.springframework.context.MessageSource - -import java.beans.Introspector -import java.lang.reflect.Constructor /** * A default factory for creating constraints @@ -48,7 +49,7 @@ class DefaultConstraintFactory implements ConstraintFactory { DefaultConstraintFactory(Class constraintClass, MessageSource messageSource, List targetTypes = [Object]) { this.type = constraintClass - this.name = Introspector.decapitalize(constraintClass.simpleName) - "Constraint" + this.name = Introspector.decapitalize(constraintClass.simpleName) - 'Constraint' this.messageSource = messageSource this.targetTypes = targetTypes @@ -61,7 +62,7 @@ class DefaultConstraintFactory implements ConstraintFactory { @Override boolean supports(Class targetType) { - if(NullableConstraint.isAssignableFrom(type)) { + if (NullableConstraint.isAssignableFrom(type)) { return !targetType.isPrimitive() } else { diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/ConstraintRegistry.groovy b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/ConstraintRegistry.groovy index 82c5532b771..adc14d014bc 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/ConstraintRegistry.groovy +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/ConstraintRegistry.groovy @@ -69,5 +69,5 @@ interface ConstraintRegistry { * @param name The short name of the constraint * @return The constraint */ - public List> findConstraintFactories(Class constraintType) -} \ No newline at end of file + List> findConstraintFactories(Class constraintType) +} diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/DefaultConstraintRegistry.groovy b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/DefaultConstraintRegistry.groovy index 82d52740c3d..4e69ed0697b 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/DefaultConstraintRegistry.groovy +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/DefaultConstraintRegistry.groovy @@ -19,8 +19,14 @@ package org.grails.datastore.gorm.validation.constraints.registry -import grails.gorm.validation.Constraint +import java.util.concurrent.ConcurrentHashMap + import groovy.transform.CompileStatic + +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.context.MessageSource + +import grails.gorm.validation.Constraint import org.grails.datastore.gorm.validation.constraints.BlankConstraint import org.grails.datastore.gorm.validation.constraints.CreditCardConstraint import org.grails.datastore.gorm.validation.constraints.EmailConstraint @@ -39,11 +45,6 @@ import org.grails.datastore.gorm.validation.constraints.UrlConstraint import org.grails.datastore.gorm.validation.constraints.ValidatorConstraint import org.grails.datastore.gorm.validation.constraints.factory.ConstraintFactory import org.grails.datastore.gorm.validation.constraints.factory.DefaultConstraintFactory -import org.springframework.beans.factory.annotation.Autowired -import org.springframework.context.MessageSource - -import java.util.concurrent.ConcurrentHashMap - /** * Default implementation of the {@link ConstraintRegistry} interface. Provides lookup and registration of constraints @@ -66,7 +67,6 @@ class DefaultConstraintRegistry implements ConstraintRegistry { DefaultConstraintRegistry(MessageSource messageSource) { this.messageSource = messageSource - def charSequenceType = [CharSequence] def comparableNumberType = [Comparable, Number] def charSequenceIterableType = [CharSequence, Iterable] @@ -91,15 +91,15 @@ class DefaultConstraintRegistry implements ConstraintRegistry { @Autowired(required = false) void setConstraintFactories(ConstraintFactory... constraintFactories) { - for(factory in constraintFactories) { + for (factory in constraintFactories) { addConstraintFactory(factory) } } @Override void addConstraintFactory(ConstraintFactory factory) { - factoriesByType.get( factory.type ).add(factory) - factoriesByName.get( factory.name).add(factory) + factoriesByType.get(factory.type).add(factory) + factoriesByName.get(factory.name).add(factory) } @Override diff --git a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/DefaultValidatorRegistry.groovy b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/DefaultValidatorRegistry.groovy index d23d91d2852..cb166317a71 100644 --- a/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/DefaultValidatorRegistry.groovy +++ b/grails-datamapping-validation/src/main/groovy/org/grails/datastore/gorm/validation/constraints/registry/DefaultValidatorRegistry.groovy @@ -19,25 +19,23 @@ package org.grails.datastore.gorm.validation.constraints.registry +import java.util.concurrent.ConcurrentHashMap + +import groovy.transform.CompileStatic + +import org.springframework.context.MessageSource +import org.springframework.context.support.StaticMessageSource +import org.springframework.validation.Validator + import grails.gorm.validation.PersistentEntityValidator import grails.gorm.validation.exceptions.ValidationConfigurationException -import groovy.transform.CompileStatic import org.grails.datastore.gorm.validation.constraints.eval.ConstraintsEvaluator import org.grails.datastore.gorm.validation.constraints.eval.DefaultConstraintEvaluator import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings import org.grails.datastore.mapping.model.MappingContext import org.grails.datastore.mapping.model.PersistentEntity -import org.grails.datastore.mapping.reflect.ClassUtils import org.grails.datastore.mapping.reflect.ClosureToMapPopulator import org.grails.datastore.mapping.validation.ValidatorRegistry -import org.springframework.context.MessageSource -import org.springframework.context.support.StaticMessageSource -import org.springframework.core.env.PropertyResolver -import org.springframework.core.env.StandardEnvironment -import org.springframework.validation.Validator -import org.springframework.validation.annotation.Validated - -import java.util.concurrent.ConcurrentHashMap /** * A {@link ValidatorRegistry} that builds validators on demand. @@ -63,13 +61,13 @@ class DefaultValidatorRegistry implements ValidatorRegistry, ConstraintRegistry, this.mappingContext = mappingContext } - protected Map resolveDefaultConstraints( ConnectionSourceSettings connectionSourceSettings ) { + protected Map resolveDefaultConstraints(ConnectionSourceSettings connectionSourceSettings) { Closure defaultConstraints = connectionSourceSettings.default.constraints Map defaultConstraintsMap = null if (defaultConstraints != null) { defaultConstraintsMap = [:] try { - new ClosureToMapPopulator(defaultConstraintsMap).populate defaultConstraints + new ClosureToMapPopulator(defaultConstraintsMap).populate(defaultConstraints) } catch (Throwable e) { throw new ValidationConfigurationException("Error populating default constraints from configuration: ${e.message}", e) } @@ -80,7 +78,7 @@ class DefaultValidatorRegistry implements ValidatorRegistry, ConstraintRegistry, @Override Validator getValidator(PersistentEntity entity) { Validator validator = validatorMap.get(entity) - if(validator != null) { + if (validator != null) { return validator } else { diff --git a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceConnectionSourcesFactoryBean.groovy b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceConnectionSourcesFactoryBean.groovy index 5646376e2f6..bf3a1df2151 100644 --- a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceConnectionSourcesFactoryBean.groovy +++ b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceConnectionSourcesFactoryBean.groovy @@ -19,14 +19,10 @@ package org.grails.plugins.datasource +import javax.sql.DataSource + import groovy.transform.CompileStatic -import org.grails.datastore.gorm.jdbc.connections.DataSourceConnectionSourceFactory -import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings -import org.grails.datastore.mapping.core.connections.ConnectionSource -import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings -import org.grails.datastore.mapping.core.connections.ConnectionSources -import org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer -import org.grails.datastore.mapping.core.connections.DefaultConnectionSource + import org.springframework.beans.factory.FactoryBean import org.springframework.beans.factory.InitializingBean import org.springframework.context.ApplicationContext @@ -35,7 +31,12 @@ import org.springframework.context.ConfigurableApplicationContext import org.springframework.core.env.PropertyResolver import org.springframework.jdbc.datasource.DataSourceTransactionManager -import javax.sql.DataSource +import org.grails.datastore.gorm.jdbc.connections.DataSourceConnectionSourceFactory +import org.grails.datastore.gorm.jdbc.connections.DataSourceSettings +import org.grails.datastore.mapping.core.connections.ConnectionSource +import org.grails.datastore.mapping.core.connections.ConnectionSourceSettings +import org.grails.datastore.mapping.core.connections.ConnectionSources +import org.grails.datastore.mapping.core.connections.ConnectionSourcesInitializer /** * A factory bean for creating the data sources @@ -73,21 +74,21 @@ class DataSourceConnectionSourcesFactoryBean implements InitializingBean, Factor void afterPropertiesSet() throws Exception { DataSourceConnectionSourceFactory factory = new DataSourceConnectionSourceFactory() this.connectionSources = ConnectionSourcesInitializer.create(factory, configuration) - if(applicationContext instanceof ConfigurableApplicationContext) { - ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext)applicationContext - for(ConnectionSource connectionSource in connectionSources.allConnectionSources) { + if (applicationContext instanceof ConfigurableApplicationContext) { + ConfigurableApplicationContext configurableApplicationContext = (ConfigurableApplicationContext) applicationContext + for (ConnectionSource connectionSource in connectionSources.allConnectionSources) { if (connectionSource.name != ConnectionSource.DEFAULT) { String suffix = "_${connectionSource.name}" String dsName = "dataSource${suffix}" String tmName = "transactionManager${suffix}" - if(!applicationContext.containsBean(dsName)) { + if (!applicationContext.containsBean(dsName)) { DataSource dataSource = connectionSource.source configurableApplicationContext.beanFactory.registerSingleton( dsName, dataSource ) } - if(!applicationContext.containsBean(tmName)) { + if (!applicationContext.containsBean(tmName)) { DataSource dataSource = connectionSource.source configurableApplicationContext.beanFactory.registerSingleton( tmName, diff --git a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceGrailsPlugin.groovy b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceGrailsPlugin.groovy index a1823b14575..621ccfb53d5 100644 --- a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceGrailsPlugin.groovy +++ b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceGrailsPlugin.groovy @@ -18,19 +18,22 @@ */ package org.grails.plugins.datasource -import grails.core.GrailsApplication -import grails.plugins.Plugin -import grails.util.Environment -import grails.util.GrailsUtil +import javax.sql.DataSource + import groovy.transform.CompileStatic + import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory -import org.grails.spring.beans.factory.InstanceFactoryBean -import org.grails.transaction.ChainedTransactionManagerPostProcessor + import org.springframework.jmx.support.JmxUtils import org.springframework.util.ClassUtils -import javax.sql.DataSource +import grails.core.GrailsApplication +import grails.plugins.Plugin +import grails.util.Environment +import grails.util.GrailsUtil +import org.grails.spring.beans.factory.InstanceFactoryBean +import org.grails.transaction.ChainedTransactionManagerPostProcessor /** * Handles the configuration of a DataSource within Grails. @@ -48,63 +51,65 @@ class DataSourceGrailsPlugin extends Plugin { def dependsOn = [core: version] @Override - Closure doWithSpring() {{-> - GrailsApplication application = grailsApplication + Closure doWithSpring() { + { -> + GrailsApplication application = grailsApplication - if (pluginManager.hasGrailsPlugin('hibernate')) { + if (pluginManager.hasGrailsPlugin('hibernate')) { - if (!springConfig.unrefreshedApplicationContext?.containsBean('transactionManager')) { - Boolean enabled = config.getProperty(TRANSACTION_MANAGER_ENABLED, Boolean, false) - if (enabled) { - def whitelistPattern=config.getProperty(TRANSACTION_MANAGER_WHITE_LIST_PATTERN, '') - def blacklistPattern=config.getProperty(TRANSACTION_MANAGER_BLACK_LIST_PATTERN,'') - chainedTransactionManagerPostProcessor(ChainedTransactionManagerPostProcessor, config, whitelistPattern ?: null, blacklistPattern ?: null) + if (!springConfig.unrefreshedApplicationContext?.containsBean('transactionManager')) { + Boolean enabled = config.getProperty(TRANSACTION_MANAGER_ENABLED, Boolean, false) + if (enabled) { + def whitelistPattern = config.getProperty(TRANSACTION_MANAGER_WHITE_LIST_PATTERN, '') + def blacklistPattern = config.getProperty(TRANSACTION_MANAGER_BLACK_LIST_PATTERN, '') + chainedTransactionManagerPostProcessor(ChainedTransactionManagerPostProcessor, config, whitelistPattern ?: null, blacklistPattern ?: null) + } + } + if (ClassUtils.isPresent('org.h2.Driver', this.class.classLoader)) { + embeddedDatabaseShutdownHook(EmbeddedDatabaseShutdownHook) } - } - if (ClassUtils.isPresent('org.h2.Driver', this.class.classLoader)) { - embeddedDatabaseShutdownHook(EmbeddedDatabaseShutdownHook) - } - } else { - def dataSources = config.getProperty('dataSources', Map, [:]) - if(!dataSources) { - def defaultDataSource = config.getProperty('dataSource', Map) - if(defaultDataSource) { - dataSources['dataSource'] = defaultDataSource + } else { + def dataSources = config.getProperty('dataSources', Map, [:]) + if (!dataSources) { + def defaultDataSource = config.getProperty('dataSource', Map) + if (defaultDataSource) { + dataSources['dataSource'] = defaultDataSource + } + } + if (dataSources) { + 'dataSourceConnectionSources'(DataSourceConnectionSourcesFactoryBean, grailsApplication.config) + 'dataSource'(InstanceFactoryBean, '#{dataSourceConnectionSources.defaultConnectionSource.source}', DataSource) } } - if(dataSources) { - "dataSourceConnectionSources"(DataSourceConnectionSourcesFactoryBean, grailsApplication.config) - "dataSource"(InstanceFactoryBean, "#{dataSourceConnectionSources.defaultConnectionSource.source}", DataSource) - } - } - if(config.getProperty('dataSource.jmxExport', Boolean, false) && ClassUtils.isPresent('org.apache.tomcat.jdbc.pool.DataSource', getClass().classLoader)) { - try { - def jmxMBeanServer = JmxUtils.locateMBeanServer() - if(jmxMBeanServer) { - tomcatJDBCPoolMBeanExporter(TomcatJDBCPoolMBeanExporter) { bean -> - delegate.grailsApplication = application - server = jmxMBeanServer + if (config.getProperty('dataSource.jmxExport', Boolean, false) && ClassUtils.isPresent('org.apache.tomcat.jdbc.pool.DataSource', getClass().classLoader)) { + try { + def jmxMBeanServer = JmxUtils.locateMBeanServer() + if (jmxMBeanServer) { + tomcatJDBCPoolMBeanExporter(TomcatJDBCPoolMBeanExporter) { bean -> + delegate.grailsApplication = application + server = jmxMBeanServer + } + } + } catch (e) { + if (!Environment.isDevelopmentMode() && Environment.isWarDeployed()) { + log.warn('Cannot locate JMX MBeanServer. Disabling autoregistering dataSource pools to JMX.', e) } - } - } catch(e) { - if(!Environment.isDevelopmentMode() && Environment.isWarDeployed()) { - log.warn("Cannot locate JMX MBeanServer. Disabling autoregistering dataSource pools to JMX.", e) } } } - }} + } @Override @CompileStatic void onShutdown(Map event) { - if(!Environment.developmentEnvironmentAvailable || !Environment.isReloadingAgentEnabled()) { + if (!Environment.developmentEnvironmentAvailable || !Environment.isReloadingAgentEnabled()) { try { DataSourceUtils.clearJdbcDriverRegistrations() } catch (e) { - log.debug "Error deregistering JDBC drivers: $e.message", e + log.debug("Error deregistering JDBC drivers: $e.message", e) } } } diff --git a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceUtils.groovy b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceUtils.groovy index 1d70dc8b2c8..deaf063b821 100644 --- a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceUtils.groovy +++ b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/DataSourceUtils.groovy @@ -18,11 +18,11 @@ */ package org.grails.plugins.datasource -import groovy.transform.CompileStatic - import java.sql.Driver import java.sql.DriverManager +import groovy.transform.CompileStatic + /** * @author Graeme Rocher * @since 2.3 diff --git a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/EmbeddedDatabaseShutdownHook.groovy b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/EmbeddedDatabaseShutdownHook.groovy index bcae9c1c475..9ef179427a0 100644 --- a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/EmbeddedDatabaseShutdownHook.groovy +++ b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/EmbeddedDatabaseShutdownHook.groovy @@ -19,33 +19,36 @@ package org.grails.plugins.datasource -import groovy.sql.Sql -import groovy.transform.CompileStatic - import java.sql.Connection import javax.sql.DataSource +import groovy.sql.Sql +import groovy.transform.CompileStatic + import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory -import org.grails.core.lifecycle.ShutdownOperations + import org.springframework.beans.BeansException import org.springframework.context.ApplicationContext import org.springframework.context.ApplicationContextAware import org.springframework.context.SmartLifecycle +import org.grails.core.lifecycle.ShutdownOperations + @CompileStatic class EmbeddedDatabaseShutdownHook implements SmartLifecycle, ApplicationContextAware { - private static final Log log=LogFactory.getLog(this) + + private static final Log log = LogFactory.getLog(this) private boolean running private ApplicationContext applicationContext private List embeddedDatabaseBeanNames @Override - public void start() { + void start() { embeddedDatabaseBeanNames = [] applicationContext.getBeansOfType(DataSource).each { String beanName, DataSource dataSource -> - if(isEmbeddedH2orHsqldb(dataSource)) { + if (isEmbeddedH2orHsqldb(dataSource)) { embeddedDatabaseBeanNames.add(beanName) } } @@ -53,7 +56,7 @@ class EmbeddedDatabaseShutdownHook implements SmartLifecycle, ApplicationContext } @Override - public void stop() { + void stop() { embeddedDatabaseBeanNames?.each { String beanName -> shutdownEmbeddedDatabase(applicationContext.getBean(beanName, DataSource)) } @@ -62,38 +65,38 @@ class EmbeddedDatabaseShutdownHook implements SmartLifecycle, ApplicationContext } @Override - public boolean isRunning() { + boolean isRunning() { return running } @Override - public int getPhase() { + int getPhase() { return Integer.MIN_VALUE } @Override - public boolean isAutoStartup() { + boolean isAutoStartup() { return true } @Override - public void stop(Runnable callback) { + void stop(Runnable callback) { stop() callback.run() } - + @Override - public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + void setApplicationContext(ApplicationContext applicationContext) throws BeansException { this.applicationContext = applicationContext } - + protected boolean isEmbeddedH2orHsqldb(DataSource dataSource) { - MetaProperty urlProperty = dataSource.hasProperty("url") + MetaProperty urlProperty = dataSource.hasProperty('url') if (urlProperty) { String url = urlProperty.getProperty(dataSource) - if(url && (url.startsWith('jdbc:h2:') || url.startsWith('jdbc:hsqldb:'))) { + if (url && (url.startsWith('jdbc:h2:') || url.startsWith('jdbc:hsqldb:'))) { // don't shutdown remote servers - if(!(url.startsWith('jdbc:hsqldb:h') || url.startsWith('jdbc:h2:tcp:') || url.startsWith('jdbc:h2:ssl:'))) { + if (!(url.startsWith('jdbc:hsqldb:h') || url.startsWith('jdbc:h2:tcp:') || url.startsWith('jdbc:h2:ssl:'))) { return true } } @@ -105,7 +108,7 @@ class EmbeddedDatabaseShutdownHook implements SmartLifecycle, ApplicationContext try { addShutdownOperation(dataSource.getConnection()) } catch (e) { - log.error "Error shutting down datasource", e + log.error('Error shutting down datasource', e) } } diff --git a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/TomcatJDBCPoolMBeanExporter.groovy b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/TomcatJDBCPoolMBeanExporter.groovy index 7f9c531532c..4c4ba14761c 100644 --- a/grails-datasource/src/main/groovy/org/grails/plugins/datasource/TomcatJDBCPoolMBeanExporter.groovy +++ b/grails-datasource/src/main/groovy/org/grails/plugins/datasource/TomcatJDBCPoolMBeanExporter.groovy @@ -19,33 +19,36 @@ package org.grails.plugins.datasource -import groovy.transform.CompileStatic - import javax.management.MalformedObjectNameException import javax.management.ObjectName +import groovy.transform.CompileStatic + import org.apache.commons.logging.Log import org.apache.commons.logging.LogFactory -import grails.core.GrailsApplication + import org.springframework.beans.factory.BeanFactory import org.springframework.beans.factory.ListableBeanFactory import org.springframework.jmx.export.MBeanExporter import org.springframework.jmx.support.RegistrationPolicy +import grails.core.GrailsApplication + @CompileStatic class TomcatJDBCPoolMBeanExporter extends MBeanExporter { - private static final Log log = LogFactory.getLog(TomcatJDBCPoolMBeanExporter.class) + + private static final Log log = LogFactory.getLog(TomcatJDBCPoolMBeanExporter) GrailsApplication grailsApplication private ListableBeanFactory beanFactory - - public TomcatJDBCPoolMBeanExporter() { - super(); + + TomcatJDBCPoolMBeanExporter() { + super() this.setRegistrationPolicy(RegistrationPolicy.REPLACE_EXISTING) } @Override protected void registerBeans() { - Map dataSourceBeans = beanFactory.getBeansOfType(org.apache.tomcat.jdbc.pool.DataSource.class) + Map dataSourceBeans = beanFactory.getBeansOfType(org.apache.tomcat.jdbc.pool.DataSource) for (Map.Entry entry : dataSourceBeans.entrySet()) { boolean jmxEnabled = false try { @@ -53,7 +56,7 @@ class TomcatJDBCPoolMBeanExporter extends MBeanExporter { } catch (Exception e) { log.warn("Unable to access dataSource bean ${entry.key}", e) } - if(jmxEnabled) { + if (jmxEnabled) { ObjectName objectName = null try { objectName = createJmxObjectName(entry.key, entry.value) @@ -62,7 +65,7 @@ class TomcatJDBCPoolMBeanExporter extends MBeanExporter { log.warn("Unable to register JMX MBean for ${objectName} beanName:${entry.key}", e) } } - } + } } protected boolean isJmxEnabled(String beanName, org.apache.tomcat.jdbc.pool.DataSource dataSource) { @@ -72,29 +75,29 @@ class TomcatJDBCPoolMBeanExporter extends MBeanExporter { protected ObjectName createJmxObjectName(String beanName, org.apache.tomcat.jdbc.pool.DataSource dataSource) throws MalformedObjectNameException { Hashtable properties = new Hashtable() properties.type = 'ConnectionPool' - properties.application = ((grailsApplication?.getMetadata()?.getApplicationName())?:'grailsApplication').replaceAll(/[,=;:]/, '_') - String poolName=dataSource.pool.poolProperties.name + properties.application = ((grailsApplication?.getMetadata()?.getApplicationName()) ?: 'grailsApplication').replaceAll(/[,=;:]/, '_') + String poolName = dataSource.pool.poolProperties.name if (beanName.startsWith('dataSourceUnproxied')) { def dataSourceName = beanName - ~/^dataSourceUnproxied_?/ - if(!dataSourceName) { + if (!dataSourceName) { dataSourceName = 'default' } properties.dataSource = dataSourceName } else { - if(poolName.startsWith("Tomcat Connection Pool[")) { + if (poolName.startsWith('Tomcat Connection Pool[')) { // use bean name if the pool has a default name - poolName=beanName + poolName = beanName } } - if(!poolName.startsWith("Tomcat Connection Pool[")) { + if (!poolName.startsWith('Tomcat Connection Pool[')) { properties.pool = poolName } return new ObjectName('grails.dataSource', properties) } - + @Override - public void setBeanFactory(BeanFactory beanFactory) { + void setBeanFactory(BeanFactory beanFactory) { super.setBeanFactory(beanFactory) - this.beanFactory = (ListableBeanFactory)beanFactory + this.beanFactory = (ListableBeanFactory) beanFactory } } diff --git a/grails-datastore-async/src/main/groovy/org/grails/datastore/gorm/async/transform/DelegateAsync.groovy b/grails-datastore-async/src/main/groovy/org/grails/datastore/gorm/async/transform/DelegateAsync.groovy index 53dc0411866..23a95f374eb 100644 --- a/grails-datastore-async/src/main/groovy/org/grails/datastore/gorm/async/transform/DelegateAsync.groovy +++ b/grails-datastore-async/src/main/groovy/org/grails/datastore/gorm/async/transform/DelegateAsync.groovy @@ -18,6 +18,7 @@ */ package org.grails.datastore.gorm.async.transform + import java.lang.annotation.Documented import java.lang.annotation.ElementType import java.lang.annotation.Retention @@ -63,7 +64,8 @@ import org.codehaus.groovy.transform.GroovyASTTransformationClass @Documented @Retention(RetentionPolicy.SOURCE) @Target([ElementType.TYPE, ElementType.FIELD]) -@GroovyASTTransformationClass("org.grails.datastore.gorm.async.transform.DelegateAsyncTransformation") -public @interface DelegateAsync { +@GroovyASTTransformationClass('org.grails.datastore.gorm.async.transform.DelegateAsyncTransformation') +@interface DelegateAsync { + Class value() default DelegateAsync } diff --git a/grails-datastore-async/src/main/groovy/org/grails/datastore/gorm/async/transform/DelegateAsyncTransformation.java b/grails-datastore-async/src/main/groovy/org/grails/datastore/gorm/async/transform/DelegateAsyncTransformation.java index 01695632c49..b3be2c5c31c 100644 --- a/grails-datastore-async/src/main/groovy/org/grails/datastore/gorm/async/transform/DelegateAsyncTransformation.java +++ b/grails-datastore-async/src/main/groovy/org/grails/datastore/gorm/async/transform/DelegateAsyncTransformation.java @@ -19,14 +19,35 @@ package org.grails.datastore.gorm.async.transform; -import grails.async.Promise; -import grails.async.Promises; +import java.beans.Introspector; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; +import java.util.Map; + import groovy.lang.Closure; import groovy.lang.GroovyObjectSupport; -import org.apache.grails.common.compiler.GroovyTransformOrder; import org.codehaus.groovy.GroovyBugError; -import org.codehaus.groovy.ast.*; -import org.codehaus.groovy.ast.expr.*; +import org.codehaus.groovy.ast.ASTNode; +import org.codehaus.groovy.ast.AnnotatedNode; +import org.codehaus.groovy.ast.AnnotationNode; +import org.codehaus.groovy.ast.ClassHelper; +import org.codehaus.groovy.ast.ClassNode; +import org.codehaus.groovy.ast.FieldNode; +import org.codehaus.groovy.ast.GenericsType; +import org.codehaus.groovy.ast.MethodNode; +import org.codehaus.groovy.ast.Parameter; +import org.codehaus.groovy.ast.VariableScope; +import org.codehaus.groovy.ast.expr.ArgumentListExpression; +import org.codehaus.groovy.ast.expr.ClassExpression; +import org.codehaus.groovy.ast.expr.ClosureExpression; +import org.codehaus.groovy.ast.expr.ConstructorCallExpression; +import org.codehaus.groovy.ast.expr.Expression; +import org.codehaus.groovy.ast.expr.ListExpression; +import org.codehaus.groovy.ast.expr.MethodCallExpression; +import org.codehaus.groovy.ast.expr.VariableExpression; import org.codehaus.groovy.ast.stmt.BlockStatement; import org.codehaus.groovy.ast.stmt.ExpressionStatement; import org.codehaus.groovy.ast.tools.GenericsUtils; @@ -36,11 +57,11 @@ import org.codehaus.groovy.transform.GroovyASTTransformation; import org.codehaus.groovy.transform.TransformWithPriority; import org.codehaus.groovy.transform.stc.StaticTypeCheckingSupport; -import org.grails.async.transform.internal.DelegateAsyncUtils; -import java.beans.Introspector; -import java.lang.reflect.Modifier; -import java.util.*; +import grails.async.Promise; +import grails.async.Promises; +import org.apache.grails.common.compiler.GroovyTransformOrder; +import org.grails.async.transform.internal.DelegateAsyncUtils; import static org.codehaus.groovy.ast.tools.GenericsUtils.correctToGenericsSpecRecurse; import static org.codehaus.groovy.ast.tools.GenericsUtils.createGenericsSpec; @@ -64,7 +85,7 @@ public void visit(ASTNode[] nodes, SourceUnit source) { Expression value = annotationNode.getMember("value"); if (value instanceof ClassExpression) { ClassNode targetApi = value.getType().getPlainNodeReference(); - ClassNode classNode = (ClassNode)parent; + ClassNode classNode = (ClassNode) parent; final String fieldName = '$' + Introspector.decapitalize(targetApi.getNameWithoutPackage()); FieldNode fieldNode = classNode.getField(fieldName); @@ -76,8 +97,8 @@ public void visit(ASTNode[] nodes, SourceUnit source) { applyDelegateAsyncTransform(classNode, targetApi, fieldName); } } - else if(parent instanceof FieldNode) { - FieldNode fieldNode = (FieldNode)parent; + else if (parent instanceof FieldNode) { + FieldNode fieldNode = (FieldNode) parent; ClassNode targetApi = fieldNode.getType().getPlainNodeReference(); ClassNode classNode = fieldNode.getOwner(); applyDelegateAsyncTransform(classNode, targetApi, fieldNode.getName()); @@ -90,27 +111,26 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp ClassNode promisesClass = ClassHelper.make(Promises.class).getPlainNodeReference(); MethodNode createPromiseMethodTargetWithDecorators = promisesClass.getDeclaredMethod("createPromise", new Parameter[]{new Parameter(new ClassNode(Closure.class), "c"), new Parameter(new ClassNode(List.class), "c")}); - Map genericsSpec = createGenericsSpec(classNode); - for(MethodNode candidate : methods) { + Map genericsSpec = createGenericsSpec(classNode); + for (MethodNode candidate : methods) { if (isCandidateMethod(candidate)) { MethodNode existingMethod = classNode.getMethod(candidate.getName(), candidate.getParameters()); if (existingMethod == null) { List currentMethodGenPlaceholders = genericPlaceholderNames(candidate); ClassNode promiseNode = ClassHelper.make(Promise.class).getPlainNodeReference(); ClassNode originalReturnType = correctToGenericsSpecRecurse(genericsSpec, candidate.getReturnType(), currentMethodGenPlaceholders); - if(!originalReturnType.getNameWithoutPackage().equals(VOID)) { + if (!originalReturnType.getNameWithoutPackage().equals(VOID)) { ClassNode returnType = originalReturnType; - if(ClassHelper.isPrimitiveType(originalReturnType.redirect())) { + if (ClassHelper.isPrimitiveType(originalReturnType.redirect())) { returnType = ClassHelper.getWrapper(originalReturnType.redirect()); } - if(!OBJECT_CLASS_NODE.equals(returnType)) { + if (!OBJECT_CLASS_NODE.equals(returnType)) { promiseNode.setGenericsTypes(new GenericsType[]{new GenericsType(returnType)}); } } final BlockStatement methodBody = new BlockStatement(); final BlockStatement promiseBody = new BlockStatement(); - final ClosureExpression closureExpression = new ClosureExpression(new Parameter[0], promiseBody); VariableScope variableScope = new VariableScope(); closureExpression.setVariableScope(variableScope); @@ -124,8 +144,8 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp MethodCallExpression getDecoratorsMethodCall = new MethodCallExpression(new ClassExpression(delegateAsyncUtilsClassNode), "getPromiseDecorators", getPromiseDecoratorsArguments); getDecoratorsMethodCall.setMethodTarget(getPromiseDecoratorsMethodNode); - MethodCallExpression createPromiseWithDecorators = new MethodCallExpression(new ClassExpression(promisesClass), "createPromise",new ArgumentListExpression( closureExpression, getDecoratorsMethodCall)); - if(createPromiseMethodTargetWithDecorators != null) { + MethodCallExpression createPromiseWithDecorators = new MethodCallExpression(new ClassExpression(promisesClass), "createPromise", new ArgumentListExpression(closureExpression, getDecoratorsMethodCall)); + if (createPromiseMethodTargetWithDecorators != null) { createPromiseWithDecorators.setMethodTarget(createPromiseMethodTargetWithDecorators); } methodBody.addStatement(new ExpressionStatement(createPromiseWithDecorators)); @@ -133,7 +153,7 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp final ArgumentListExpression arguments = new ArgumentListExpression(); Parameter[] parameters = copyParameters(genericsSpec, StaticTypeCheckingSupport.parameterizeArguments(classNode, candidate), currentMethodGenPlaceholders); - for(Parameter p : parameters) { + for (Parameter p : parameters) { p.setClosureSharedVariable(true); variableScope.putReferencedLocalVariable(p); VariableExpression ve = new VariableExpression(p); @@ -142,17 +162,16 @@ private void applyDelegateAsyncTransform(ClassNode classNode, ClassNode targetAp } MethodCallExpression delegateMethodCall = new MethodCallExpression(new VariableExpression(fieldName), candidate.getName(), arguments); promiseBody.addStatement(new ExpressionStatement(delegateMethodCall)); - MethodNode newMethodNode = new MethodNode(candidate.getName(), Modifier.PUBLIC,promiseNode, parameters,null, methodBody); + MethodNode newMethodNode = new MethodNode(candidate.getName(), Modifier.PUBLIC, promiseNode, parameters, null, methodBody); classNode.addMethod(newMethodNode); } } } } - private List genericPlaceholderNames(MethodNode candidate) { GenericsType[] candidateGenericsTypes = candidate.getGenericsTypes(); - List names = new ArrayList(); + List names = new ArrayList<>(); if (candidateGenericsTypes != null) { for (GenericsType gt : candidateGenericsTypes) { names.add(gt.getName()); @@ -165,15 +184,15 @@ private static ClassNode alignReturnType(final ClassNode receiver, final ClassNo ClassNode copiedReturnType = originalReturnType.getPlainNodeReference(); ClassNode actualReceiver = receiver; - List redirectTypes = new ArrayList(); - if (actualReceiver.redirect().getGenericsTypes()!=null) { - Collections.addAll(redirectTypes,actualReceiver.redirect().getGenericsTypes()); + List redirectTypes = new ArrayList<>(); + if (actualReceiver.redirect().getGenericsTypes() != null) { + Collections.addAll(redirectTypes, actualReceiver.redirect().getGenericsTypes()); } if (!redirectTypes.isEmpty()) { GenericsType[] redirectReceiverTypes = redirectTypes.toArray(new GenericsType[redirectTypes.size()]); GenericsType[] receiverParameterizedTypes = actualReceiver.getGenericsTypes(); - if (receiverParameterizedTypes==null) { + if (receiverParameterizedTypes == null) { receiverParameterizedTypes = redirectReceiverTypes; } @@ -187,7 +206,6 @@ private static ClassNode alignReturnType(final ClassNode receiver, final ClassNo return copiedReturnType; } - private static boolean isCandidateMethod(MethodNode declaredMethod) { ClassNode groovyMethods = GROOVY_OBJECT_CLASS_NODE; String methodName = declaredMethod.getName(); diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/TPCacheAdapter.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/TPCacheAdapter.java index db9ad5ba522..837b427f044 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/TPCacheAdapter.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/TPCacheAdapter.java @@ -19,10 +19,10 @@ package org.grails.datastore.mapping.cache; -import org.grails.datastore.mapping.cache.exception.CacheException; - import java.io.Serializable; +import org.grails.datastore.mapping.cache.exception.CacheException; + /** *

* Third party cache adapter responsible for handling put and get cache operations diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/exception/CacheException.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/exception/CacheException.java index 915a85da09e..75f347997bd 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/exception/CacheException.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/exception/CacheException.java @@ -23,7 +23,7 @@ * Top-level exception used to report problems with third-party cache operations * @author Roman Stepanenko */ -public class CacheException extends RuntimeException{ +public class CacheException extends RuntimeException { private static final long serialVersionUID = 1; public CacheException() { diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/impl/HashMapTPCacheAdapter.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/impl/HashMapTPCacheAdapter.java index ff39edd8cec..7fbdcc07a20 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/impl/HashMapTPCacheAdapter.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/impl/HashMapTPCacheAdapter.java @@ -19,12 +19,12 @@ package org.grails.datastore.mapping.cache.impl; -import org.grails.datastore.mapping.cache.TPCacheAdapter; -import org.grails.datastore.mapping.cache.exception.CacheException; - import java.io.Serializable; import java.util.concurrent.ConcurrentHashMap; +import org.grails.datastore.mapping.cache.TPCacheAdapter; +import org.grails.datastore.mapping.cache.exception.CacheException; + /** * Simple implementation of {@link org.grails.datastore.mapping.cache.TPCacheAdapter} backed by a local hash map. * @@ -39,5 +39,5 @@ public T getCachedEntry(Serializable key) throws CacheException { return cache.get(key); } - private ConcurrentHashMap cache = new ConcurrentHashMap(); + private ConcurrentHashMap cache = new ConcurrentHashMap<>(); } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/impl/TPCacheAdapterRepositoryImpl.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/impl/TPCacheAdapterRepositoryImpl.java index d0eceec8632..287be3b624d 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/impl/TPCacheAdapterRepositoryImpl.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/cache/impl/TPCacheAdapterRepositoryImpl.java @@ -19,12 +19,12 @@ package org.grails.datastore.mapping.cache.impl; +import java.util.concurrent.ConcurrentHashMap; + import org.grails.datastore.mapping.cache.TPCacheAdapter; import org.grails.datastore.mapping.cache.TPCacheAdapterRepository; import org.grails.datastore.mapping.model.PersistentEntity; -import java.util.concurrent.ConcurrentHashMap; - /** * Simple implementation of {@link TPCacheAdapterRepository} * @@ -51,5 +51,5 @@ public void setTPCacheAdapter(String entityJavaClassFQN, TPCacheAdapter cache adapters.put(entityJavaClassFQN, cacheAdapter); } - private ConcurrentHashMap> adapters = new ConcurrentHashMap>(); + private ConcurrentHashMap> adapters = new ConcurrentHashMap<>(); } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/AbstractPersistentCollection.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/AbstractPersistentCollection.java index 4c8d263bb70..9e99f6e44f1 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/AbstractPersistentCollection.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/AbstractPersistentCollection.java @@ -14,17 +14,17 @@ */ package org.grails.datastore.mapping.collection; +import java.io.Serializable; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; + import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.engine.AssociationQueryExecutor; import org.grails.datastore.mapping.model.PersistentEntity; import org.grails.datastore.mapping.model.types.Association; import org.grails.datastore.mapping.query.Query; -import java.io.Serializable; -import java.util.Collection; -import java.util.Iterator; -import java.util.List; - /** * Abstract base class for persistent collections. * @@ -137,7 +137,6 @@ public boolean hasChangedSize() { return isInitialized() && (size() != originalSize); } - /* Collection methods */ public Iterator iterator() { @@ -270,7 +269,7 @@ protected void setInitializing(Boolean initializing) { } public void initialize() { - if(initializing != null) return; + if (initializing != null) return; setInitializing(Boolean.TRUE); @@ -296,17 +295,17 @@ public void initialize() { } else { List results = indexer.query(associationKey); - if(indexer.doesReturnKeys()) { + if (indexer.doesReturnKeys()) { PersistentEntity entity = indexer.getIndexedEntity(); // This should really only happen for unit testing since entities are // mocked selectively and may not always be registered in the indexer. In this // case, there can't be any results to be added to the collection. - if( entity != null ) { + if (entity != null) { loadInverseChildKeys(session, entity.getJavaClass(), results); } - else if(childType != null ){ + else if (childType != null) { loadInverseChildKeys(session, childType, results); } } @@ -321,8 +320,8 @@ else if(childType != null ){ } protected void loadInverseChildKeys(Session session, Class childType, Collection keys) { - if(!keys.isEmpty()) { - if(proxyEntities) { + if (!keys.isEmpty()) { + if (proxyEntities) { for (Object key : keys) { add( session.proxy(childType, (Serializable) key) @@ -344,7 +343,7 @@ public void resetDirty() { } public void markDirty() { - if(!currentlyInitializing()) { + if (!currentlyInitializing()) { dirty = true; } } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentCollection.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentCollection.java index 059975b91f2..a118e82e06f 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentCollection.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentCollection.java @@ -18,10 +18,10 @@ */ package org.grails.datastore.mapping.collection; -import org.grails.datastore.mapping.dirty.checking.DirtyCheckableCollection; - import java.util.Collection; +import org.grails.datastore.mapping.dirty.checking.DirtyCheckableCollection; + /** * A lazy loaded collection. * diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentList.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentList.java index f6426135ecd..0435e569e70 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentList.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentList.java @@ -42,17 +42,17 @@ public PersistentList(Class childType, Session session, List collection) { public PersistentList(Collection keys, Class childType, Session session) { super(keys, childType, session, new ArrayList()); - list = (List)collection; + list = (List) collection; } public PersistentList(Serializable associationKey, Session session, AssociationQueryExecutor indexer) { super(associationKey, session, indexer, new ArrayList()); - list = (List)collection; + list = (List) collection; } public PersistentList(Association association, Serializable associationKey, Session session) { super(association, associationKey, session, new ArrayList()); - list = (List)collection; + list = (List) collection; } public int indexOf(Object o) { diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentSet.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentSet.java index a82224fdc55..267ccd54ff5 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentSet.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentSet.java @@ -60,4 +60,4 @@ public PersistentSet(Serializable associationKey, Session session, AssociationQu super(associationKey, session, indexer, createCollection()); } -} \ No newline at end of file +} diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentSortedSet.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentSortedSet.java index f3533a0fa87..84b8ddc38b1 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentSortedSet.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/collection/PersistentSortedSet.java @@ -19,13 +19,16 @@ package org.grails.datastore.mapping.collection; +import java.io.Serializable; +import java.util.Collection; +import java.util.Comparator; +import java.util.SortedSet; +import java.util.TreeSet; + import org.grails.datastore.mapping.core.Session; import org.grails.datastore.mapping.engine.AssociationQueryExecutor; import org.grails.datastore.mapping.model.types.Association; -import java.io.Serializable; -import java.util.*; - /** * A lazy loaded sorted set. * @@ -56,11 +59,11 @@ public Comparator comparator() { private SortedSet getSortedSet() { initialize(); - return ((SortedSet)collection); + return ((SortedSet) collection); } public SortedSet subSet(Object o, Object o1) { - return getSortedSet().subSet(o,o1); + return getSortedSet().subSet(o, o1); } public SortedSet headSet(Object o) { diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/column/ColumnDatastore.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/column/ColumnDatastore.java index 4872e3cac97..9988f305b4e 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/column/ColumnDatastore.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/column/ColumnDatastore.java @@ -23,4 +23,4 @@ /** * @author Guillaume Laforge */ -public interface ColumnDatastore extends Datastore {} \ No newline at end of file +public interface ColumnDatastore extends Datastore {} diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/AbstractGormMappingFactory.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/AbstractGormMappingFactory.java index 39c47f254b1..d4029eefa60 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/AbstractGormMappingFactory.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/AbstractGormMappingFactory.java @@ -19,20 +19,26 @@ package org.grails.datastore.mapping.config; -import groovy.lang.Closure; - import java.beans.PropertyDescriptor; import java.util.HashMap; import java.util.List; import java.util.Map; +import groovy.lang.Closure; + +import org.springframework.beans.BeanUtils; + import org.grails.datastore.mapping.config.groovy.DefaultMappingConfigurationBuilder; import org.grails.datastore.mapping.config.groovy.MappingConfigurationBuilder; import org.grails.datastore.mapping.keyvalue.mapping.config.Family; -import org.grails.datastore.mapping.model.*; +import org.grails.datastore.mapping.model.ClassMapping; +import org.grails.datastore.mapping.model.IdentityMapping; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.model.MappingFactory; +import org.grails.datastore.mapping.model.PersistentEntity; +import org.grails.datastore.mapping.model.PersistentProperty; import org.grails.datastore.mapping.model.config.GormProperties; import org.grails.datastore.mapping.reflect.ClassPropertyFetcher; -import org.springframework.beans.BeanUtils; /** * Abstract GORM implementation that uses the GORM MappingConfigurationBuilder to configure entity mappings. @@ -42,8 +48,8 @@ @SuppressWarnings({"rawtypes", "unchecked"}) public abstract class AbstractGormMappingFactory extends MappingFactory { - protected Map> entityToPropertyMap = new HashMap>(); - protected Map entityToMapping = new HashMap(); + protected Map> entityToPropertyMap = new HashMap<>(); + protected Map entityToMapping = new HashMap<>(); private Closure defaultMapping; private Object contextObject; protected Closure defaultConstraints; @@ -71,7 +77,7 @@ public void setVersionByDefault(boolean versionByDefault) { @Override public R createMappedForm(PersistentEntity entity) { - if(entityToMapping.containsKey(entity)) { + if (entityToMapping.containsKey(entity)) { return entityToMapping.get(entity); } else { @@ -85,30 +91,29 @@ public R createMappedForm(PersistentEntity entity) { if (defaultConstraints != null) { evaluateWithContext(builder, defaultConstraints); } - List values = ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(entity.getJavaClass(),GormProperties.MAPPING, Object.class); + List values = ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(entity.getJavaClass(), GormProperties.MAPPING, Object.class); for (Object value : values) { - if(value instanceof MappingDefinition && !(family instanceof Family)) { + if (value instanceof MappingDefinition && !(family instanceof Family)) { MappingDefinition definition = (MappingDefinition) value; definition.configure(family); } - else if(value instanceof Closure) { + else if (value instanceof Closure) { evaluateWithContext(builder, (Closure) value); } } - List constraintValues = ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(entity.getJavaClass(),GormProperties.CONSTRAINTS, Closure.class); + List constraintValues = ClassPropertyFetcher.getStaticPropertyValuesFromInheritanceHierarchy(entity.getJavaClass(), GormProperties.CONSTRAINTS, Closure.class); for (Closure value : constraintValues) { evaluateWithContext(builder, value); } Map properties = builder.getProperties(); - entityToPropertyMap.put(entity, properties); return family; } } protected void evaluateWithContext(MappingConfigurationBuilder builder, Closure value) { - if(contextObject != null) { + if (contextObject != null) { builder.evaluate(value, contextObject); } else { @@ -131,12 +136,12 @@ public void setDefaultMapping(Closure defaultMapping) { @Override public boolean isTenantId(PersistentEntity entity, MappingContext context, PropertyDescriptor descriptor) { - if(entity.isMultiTenant()) { + if (entity.isMultiTenant()) { Map props = entityToPropertyMap.get(entity); - if(props != null && props.containsKey(GormProperties.TENANT_IDENTITY)) { + if (props != null && props.containsKey(GormProperties.TENANT_IDENTITY)) { T tenantIdProp = props.get(GormProperties.TENANT_IDENTITY); String propertyName = tenantIdProp.getName(); - if(descriptor.getName().equals(propertyName)) { + if (descriptor.getName().equals(propertyName)) { return true; } } @@ -151,8 +156,8 @@ public boolean isTenantId(PersistentEntity entity, MappingContext context, Prope public IdentityMapping createIdentityMapping(ClassMapping classMapping) { Map props = entityToPropertyMap.get(classMapping.getEntity()); if (props != null) { - T property = props.get(IDENTITY_PROPERTY); - IdentityMapping customIdentityMapping = getIdentityMappedForm(classMapping,property); + T property = props.get(IDENTITY_PROPERTY); + IdentityMapping customIdentityMapping = getIdentityMappedForm(classMapping, property); if (customIdentityMapping != null) { return customIdentityMapping; } @@ -161,7 +166,7 @@ public IdentityMapping createIdentityMapping(ClassMapping classMapping) { } protected IdentityMapping getIdentityMappedForm(final ClassMapping classMapping, T property) { - if(property != null) { + if (property != null) { return createDefaultIdentityMapping(classMapping, property); } else { @@ -176,7 +181,7 @@ public T createMappedForm(PersistentProperty mpp) { return properties.get(mpp.getName()); } else if (properties != null) { - Property property = properties.get(IDENTITY_PROPERTY); + Property property = properties.get(IDENTITY_PROPERTY); if (property != null && mpp.getName().equals(property.getName())) { return (T) property; } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/ConfigurationBuilder.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/ConfigurationBuilder.groovy index 447dc6cd623..8c6688fcf2d 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/ConfigurationBuilder.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/ConfigurationBuilder.groovy @@ -18,19 +18,21 @@ */ package org.grails.datastore.mapping.config +import java.lang.reflect.Method +import java.lang.reflect.Modifier + import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy import groovy.util.logging.Slf4j -import org.grails.datastore.mapping.core.exceptions.ConfigurationException -import org.grails.datastore.mapping.reflect.NameUtils + import org.springframework.core.convert.ConversionFailedException import org.springframework.core.env.PropertyResolver import org.springframework.util.ReflectionUtils -import java.lang.reflect.Method -import java.lang.reflect.Modifier +import org.grails.datastore.mapping.core.exceptions.ConfigurationException +import org.grails.datastore.mapping.reflect.NameUtils /** * A generic configuration builder that implementers can implement to construct the configuration from the source {@link PropertyResolver} @@ -43,6 +45,7 @@ import java.lang.reflect.Modifier @CompileStatic @Slf4j abstract class ConfigurationBuilder { + private static final Set IGNORE_METHODS = ['seProperty', 'propertyMissing'] as Set final PropertyResolver propertyResolver final String configurationPrefix @@ -75,7 +78,7 @@ abstract class ConfigurationBuilder { this.propertyResolver = propertyResolver this.configurationPrefix = configurationPrefix this.builderMethodPrefix = builderMethodPrefix - if(fallBackConfiguration != null) { + if (fallBackConfiguration != null) { def cloned try { cloned = fallBackConfiguration.clone() @@ -89,8 +92,6 @@ abstract class ConfigurationBuilder { } } - - C build() { rootBuilder = createBuilder() buildInternal(rootBuilder, this.configurationPrefix) @@ -119,9 +120,9 @@ abstract class ConfigurationBuilder { private List toHierarchy(Class cls) { List classes = [cls] - while(cls != Object) { + while (cls != Object) { def superClass = cls.getSuperclass() - if(superClass == Object || superClass == LinkedHashMap) break + if (superClass == Object || superClass == LinkedHashMap) break classes.add(superClass) cls = superClass @@ -133,7 +134,7 @@ abstract class ConfigurationBuilder { * @deprecated use {@link ConfigurationBuilder#buildRecurse(Object, List, Object, String)} instead */ protected void buildRecurse(Object builder, Object fallBackConfig, String startingPrefix) { - buildRecurse(builder, new ArrayList(), fallBackConfig, startingPrefix) + buildRecurse(builder, new ArrayList(), fallBackConfig, startingPrefix) } protected void buildRecurse(Object builder, List builderQueue, Object fallBackConfig, String startingPrefix) { @@ -142,7 +143,7 @@ abstract class ConfigurationBuilder { startBuild(builder, startingPrefix) - for(Class builderClass in hierarchy) { + for (Class builderClass in hierarchy) { def methods = builderClass.declaredMethods for (method in methods) { @@ -206,7 +207,7 @@ abstract class ConfigurationBuilder { try { method.invoke(builder, buildMethod.invoke(newBuilder)) } catch (Throwable e) { - log.error("build method threw exception", e) + log.error('build method threw exception', e) } } else { method.invoke(builder, newBuilder) @@ -291,7 +292,6 @@ abstract class ConfigurationBuilder { newBuilder = (ConfigurationBuilder) argType.newInstance(this.propertyResolver, propertyPath) } - } newChildBuilder(newBuilder, propertyPath) method.invoke(builder, newBuilder) @@ -300,7 +300,7 @@ abstract class ConfigurationBuilder { } continue } - } else if (methodName.startsWith("get") && parameterTypes.length == 0) { + } else if (methodName.startsWith('get') && parameterTypes.length == 0) { if (method.returnType.getAnnotation(Builder)) { def childBuilder = method.invoke(builder) if (childBuilder != null) { @@ -347,7 +347,7 @@ abstract class ConfigurationBuilder { def valueOfMethod = ReflectionUtils.findMethod(argType, 'valueOf') if (valueOfMethod != null && Modifier.isStatic(valueOfMethod.modifiers)) { try { - def value = propertyResolver.getProperty(propertyPathForArg, "") + def value = propertyResolver.getProperty(propertyPathForArg, '') if (value) { def converted = valueOfMethod.invoke(argType, value) args.add(converted) @@ -363,11 +363,11 @@ abstract class ConfigurationBuilder { try { value = propertyResolver.getProperty(propertyPathForArg, argType, fallBackValue) } catch (ConversionFailedException e) { - if(argType.isEnum()) { + if (argType.isEnum()) { value = propertyResolver.getProperty(propertyPathForArg, String) if (value != null) { try { - value = Enum.valueOf((Class)argType, value.toUpperCase()) + value = Enum.valueOf((Class) argType, value.toUpperCase()) } catch (Throwable e2) { // ignore e2 and throw original throw new ConfigurationException("Invalid value for setting [$propertyPathForArg]: $e.message", e) @@ -382,7 +382,7 @@ abstract class ConfigurationBuilder { } } if (value != null) { - log.debug("Resolved value [{}] for setting [{}]", value, propertyPathForArg) + log.debug('Resolved value [{}] for setting [{}]', value, propertyPathForArg) args.add(value) } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/ConfigurationUtils.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/ConfigurationUtils.java index 9149c188bdb..06bedc97872 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/ConfigurationUtils.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/ConfigurationUtils.java @@ -18,17 +18,18 @@ */ package org.grails.datastore.mapping.config; -import org.grails.datastore.mapping.reflect.ReflectionUtils; -import org.springframework.core.env.PropertyResolver; - import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.ServiceLoader; +import org.springframework.core.env.PropertyResolver; + +import org.grails.datastore.mapping.reflect.ReflectionUtils; + /** * Utility methods for configuration - * + * * @author Graeme Rocher * @since 6.0 */ @@ -59,20 +60,20 @@ public static Iterable findServices(PropertyResolver configuration, Strin public static Iterable findServices(List servicesList, Class serviceType) { List services = new ArrayList<>(); - if(servicesList != null) { + if (servicesList != null) { for (Object serviceObject : servicesList) { - if(serviceType.isInstance(serviceObject)) { - services.add((T)serviceObject); + if (serviceType.isInstance(serviceObject)) { + services.add((T) serviceObject); } else { Class serviceTypeClass = null; - if(serviceObject instanceof Class) { + if (serviceObject instanceof Class) { serviceTypeClass = (Class) serviceObject; } - else if(serviceObject instanceof CharSequence) { - serviceTypeClass = ReflectionUtils.forName(serviceObject.toString(),ConfigurationUtils.class.getClassLoader()); + else if (serviceObject instanceof CharSequence) { + serviceTypeClass = ReflectionUtils.forName(serviceObject.toString(), ConfigurationUtils.class.getClassLoader()); } - if(serviceTypeClass != null && serviceType.isAssignableFrom(serviceTypeClass)) { + if (serviceTypeClass != null && serviceType.isAssignableFrom(serviceTypeClass)) { T serviceInstance = (T) ReflectionUtils.instantiate(serviceTypeClass); services.add(serviceInstance); } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreEnvironment.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreEnvironment.groovy index dd657bee100..76520abd658 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreEnvironment.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreEnvironment.groovy @@ -20,6 +20,7 @@ package org.grails.datastore.mapping.config import groovy.transform.CompileStatic import groovy.transform.InheritConstructors + import org.springframework.core.env.StandardEnvironment /** @@ -30,5 +31,4 @@ import org.springframework.core.env.StandardEnvironment */ @CompileStatic @InheritConstructors -class DatastoreEnvironment extends StandardEnvironment { -} +class DatastoreEnvironment extends StandardEnvironment {} diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy index 855052113f1..e59393c9180 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/DatastoreServiceMethodInvokingFactoryBean.groovy @@ -21,14 +21,16 @@ package org.grails.datastore.mapping.config import groovy.transform.CompileStatic import groovy.transform.Internal -import org.grails.datastore.mapping.core.Datastore -import org.grails.datastore.mapping.services.Service + import org.springframework.beans.factory.BeanFactory import org.springframework.beans.factory.config.AutowireCapableBeanFactory import org.springframework.beans.factory.config.ConfigurableBeanFactory import org.springframework.beans.factory.config.MethodInvokingFactoryBean import org.springframework.lang.Nullable +import org.grails.datastore.mapping.core.Datastore +import org.grails.datastore.mapping.services.Service + /** * Variant of {#link MethodInvokingFactoryBean} which returns the correct data service type instead of {@code java.lang.Object} so the Autowire with type works correctly. */ diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Entity.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Entity.groovy index f68d821ab7e..19e539c06db 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Entity.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Entity.groovy @@ -22,6 +22,7 @@ import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy + import org.grails.datastore.mapping.core.connections.ConnectionSource import org.grails.datastore.mapping.model.config.GormProperties @@ -109,7 +110,6 @@ class Entity

{ return this } - /** * Sets the datastore to use * @@ -121,7 +121,6 @@ class Entity

{ return this } - /** * Sets the connection to use * @@ -140,7 +139,7 @@ class Entity

{ * @return */ Entity

connections(List names) { - if(names != null && names.size() > 0) { + if (names != null && names.size() > 0) { this.datasources = names } return this @@ -248,7 +247,7 @@ class Entity

{ * @return This mapping */ P property(@DelegatesTo(type='P') Closure propertyConfig) { - if(propertyConfigs.containsKey('*')) { + if (propertyConfigs.containsKey('*')) { P cloned = cloneGlobalConstraint() return Property.configureExisting(cloned, propertyConfig) } @@ -264,8 +263,8 @@ class Entity

{ * @param propertyConfig The property config * @return This mapping */ - P property( Map propertyConfig) { - if(propertyConfigs.containsKey('*')) { + P property(Map propertyConfig) { + if (propertyConfigs.containsKey('*')) { // apply global constraints constraints P cloned = cloneGlobalConstraint() return Property.configureExisting(cloned, propertyConfig) @@ -290,11 +289,11 @@ class Entity

{ } def propertyMissing(String name, Object val) { - if(val instanceof Closure) { - property(name, (Closure)val) + if (val instanceof Closure) { + property(name, (Closure) val) } - else if(val instanceof Property) { - propertyConfigs[name] =((P)val) + else if (val instanceof Property) { + propertyConfigs[name] = ((P) val) } else { throw new MissingPropertyException(name, Entity) @@ -303,20 +302,20 @@ class Entity

{ @CompileDynamic def methodMissing(String name, Object args) { - if(args && args.getClass().isArray()) { - if(args[0] instanceof Closure) { - property(name, (Closure)args[0]) + if (args && args.getClass().isArray()) { + if (args[0] instanceof Closure) { + property(name, (Closure) args[0]) } - else if(args[0] instanceof Property) { - propertyConfigs[name] = (P)args[0] + else if (args[0] instanceof Property) { + propertyConfigs[name] = (P) args[0] } - else if(args[0] instanceof Map) { + else if (args[0] instanceof Map) { P property = getOrInitializePropertyConfig(name) Map namedArgs = (Map) args[0] - if(args[-1] instanceof Closure) { + if (args[-1] instanceof Closure) { Property.configureExisting( property, - ((Closure)args[-1]) + ((Closure) args[-1]) ) } @@ -333,11 +332,11 @@ class Entity

{ protected P getOrInitializePropertyConfig(String name) { P pc = propertyConfigs[name] - if(pc == null && propertyConfigs.containsKey('*')) { + if (pc == null && propertyConfigs.containsKey('*')) { // apply global constraints constraints P globalConstraints = propertyConfigs.get('*') - if(globalConstraints != null) { - pc = (P)globalConstraints.clone() + if (globalConstraints != null) { + pc = (P) globalConstraints.clone() } } else { @@ -351,7 +350,7 @@ class Entity

{ } protected P newProperty() { - (P)new Property() + (P) new Property() } protected P cloneGlobalConstraint() { diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/MappingDefinition.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/MappingDefinition.groovy index 381eb010490..d2e7cf926a7 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/MappingDefinition.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/MappingDefinition.groovy @@ -42,4 +42,4 @@ interface MappingDefinition { */ E build() -} \ No newline at end of file +} diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Property.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Property.groovy index 39b30bd5887..9e2e42b9b79 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Property.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Property.groovy @@ -22,14 +22,15 @@ import groovy.transform.CompileDynamic import groovy.transform.CompileStatic import groovy.transform.builder.Builder import groovy.transform.builder.SimpleStrategy -import org.springframework.beans.MutablePropertyValues -import org.springframework.validation.DataBinder import jakarta.persistence.AccessType import jakarta.persistence.CascadeType import jakarta.persistence.EnumType import jakarta.persistence.FetchType +import org.springframework.beans.MutablePropertyValues +import org.springframework.validation.DataBinder + /** * Base class for classes returned from {@link org.grails.datastore.mapping.model.PropertyMapping#getMappedForm()} * @@ -157,7 +158,7 @@ class Property implements Cloneable { Property clone() throws CloneNotSupportedException { Property cloned = (Property) super.clone() cloned.uniquenessGroup = new ArrayList<>(uniquenessGroup) - if(inList != null) { + if (inList != null) { cloned.inList = new ArrayList<>(inList) } @@ -207,9 +208,9 @@ class Property implements Cloneable { void setFetch(String name) { if (FetchType.EAGER.name().equalsIgnoreCase(name)) { setFetchStrategy(FetchType.EAGER) - } else if ("select".equalsIgnoreCase(name)) { + } else if ('select'.equalsIgnoreCase(name)) { setFetchStrategy(FetchType.LAZY) - } else if ("join".equalsIgnoreCase(name)) { + } else if ('join'.equalsIgnoreCase(name)) { setFetchStrategy(FetchType.EAGER) } else { setFetchStrategy(FetchType.LAZY) @@ -251,7 +252,6 @@ class Property implements Cloneable { return !uniquenessGroup.isEmpty() } - void setUnique(boolean unique) { this.unique = unique } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Settings.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Settings.java index e7f24385385..6abbd4b9702 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Settings.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/Settings.java @@ -78,7 +78,6 @@ public interface Settings { */ String SETTING_DATASOURCES = "dataSources"; - /** * The data source setting */ diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/groovy/DefaultMappingConfigurationBuilder.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/groovy/DefaultMappingConfigurationBuilder.groovy index 5a90a413aff..56c842dd51c 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/groovy/DefaultMappingConfigurationBuilder.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/groovy/DefaultMappingConfigurationBuilder.groovy @@ -19,13 +19,13 @@ package org.grails.datastore.mapping.config.groovy import groovy.transform.CompileStatic -import org.grails.datastore.mapping.config.Entity -import org.grails.datastore.mapping.config.Property -import org.grails.datastore.mapping.reflect.NameUtils + import org.springframework.beans.MutablePropertyValues import org.springframework.validation.DataBinder -import java.lang.reflect.Constructor +import org.grails.datastore.mapping.config.Entity +import org.grails.datastore.mapping.config.Property +import org.grails.datastore.mapping.reflect.NameUtils /** * @author Graeme Rocher @@ -46,8 +46,8 @@ class DefaultMappingConfigurationBuilder implements MappingConfigurationBuilder } Map getProperties() { - if(!target.propertyConfigs.isEmpty()) { - properties.putAll( target.propertyConfigs ) + if (!target.propertyConfigs.isEmpty()) { + properties.putAll(target.propertyConfigs) } return properties } @@ -68,7 +68,7 @@ class DefaultMappingConfigurationBuilder implements MappingConfigurationBuilder target[name] = args.size() == 1 ? args[0] : args } else { - if(target.respondsTo(name)) { + if (target.respondsTo(name)) { target."$name"(*args) } else if (args.size() == 1 && args[0] instanceof Map) { diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/groovy/MappingConfigurationBuilder.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/groovy/MappingConfigurationBuilder.groovy index 8e7164123cf..df6cef1d49f 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/groovy/MappingConfigurationBuilder.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/groovy/MappingConfigurationBuilder.groovy @@ -21,7 +21,6 @@ package org.grails.datastore.mapping.config.groovy import org.grails.datastore.mapping.config.Entity import org.grails.datastore.mapping.config.Property - /** * Interface for objects that build a mapping configuration * @@ -53,4 +52,4 @@ interface MappingConfigurationBuilder { * @return The build property definitions */ Map getProperties() -} \ No newline at end of file +} diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/utils/ConfigUtils.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/utils/ConfigUtils.groovy index b28627599b3..9ccd01862f1 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/utils/ConfigUtils.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/utils/ConfigUtils.groovy @@ -19,9 +19,10 @@ package org.grails.datastore.mapping.config.utils import groovy.transform.CompileStatic -import org.grails.datastore.mapping.model.types.conversion.DefaultConversionService + import org.springframework.core.convert.ConversionService +import org.grails.datastore.mapping.model.types.conversion.DefaultConversionService /** * @author Graeme Rocher @@ -30,10 +31,11 @@ import org.springframework.core.convert.ConversionService @CompileStatic @Deprecated class ConfigUtils { - private static ConversionService conversionService = new DefaultConversionService(); - public static T read(Class type, String key, Map config, T defaultValue) { - Object value = config.get(key); - return !value ? defaultValue : conversionService.convert(value, type); + private static ConversionService conversionService = new DefaultConversionService() + + static T read(Class type, String key, Map config, T defaultValue) { + Object value = config.get(key) + return !value ? defaultValue : conversionService.convert(value, type) } } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/utils/PropertyResolverMap.groovy b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/utils/PropertyResolverMap.groovy index 13e371cd3e6..1fba26be99e 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/utils/PropertyResolverMap.groovy +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/config/utils/PropertyResolverMap.groovy @@ -19,9 +19,8 @@ package org.grails.datastore.mapping.config.utils import groovy.transform.CompileStatic -import org.springframework.core.env.PropertyResolver - +import org.springframework.core.env.PropertyResolver /** * Adapts a property resolver to the Map interface @@ -32,6 +31,7 @@ import org.springframework.core.env.PropertyResolver @CompileStatic @Deprecated class PropertyResolverMap implements Map, PropertyResolver { + @Delegate final PropertyResolver propertyResolver PropertyResolverMap(PropertyResolver propertyResolver) { @@ -55,7 +55,7 @@ class PropertyResolverMap implements Map, PropertyResolver { @Override boolean containsValue(Object value) { - throw new UnsupportedOperationException("Method containsValue not supported") + throw new UnsupportedOperationException('Method containsValue not supported') } @Override @@ -65,36 +65,36 @@ class PropertyResolverMap implements Map, PropertyResolver { @Override Object put(String key, Object value) { - throw new UnsupportedOperationException("Map cannot be modified") + throw new UnsupportedOperationException('Map cannot be modified') } @Override String remove(Object key) { - throw new UnsupportedOperationException("Map cannot be modified") + throw new UnsupportedOperationException('Map cannot be modified') } @Override void putAll(Map m) { - throw new UnsupportedOperationException("Map cannot be modified") + throw new UnsupportedOperationException('Map cannot be modified') } @Override void clear() { - throw new UnsupportedOperationException("Map cannot be modified") + throw new UnsupportedOperationException('Map cannot be modified') } @Override Set keySet() { - throw new UnsupportedOperationException("Method keySet() not supported") + throw new UnsupportedOperationException('Method keySet() not supported') } @Override Collection values() { - throw new UnsupportedOperationException("Method values() not supported") + throw new UnsupportedOperationException('Method values() not supported') } @Override Set> entrySet() { - throw new UnsupportedOperationException("Method entrySet() not supported") + throw new UnsupportedOperationException('Method entrySet() not supported') } } diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractAttributeStoringSession.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractAttributeStoringSession.java index 77e43bded70..2f84fb76f62 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractAttributeStoringSession.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractAttributeStoringSession.java @@ -22,13 +22,14 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.grails.datastore.mapping.transactions.SessionHolder; import org.springframework.transaction.support.TransactionSynchronizationManager; +import org.grails.datastore.mapping.transactions.SessionHolder; + public abstract class AbstractAttributeStoringSession implements Session { - protected Map> attributes = new ConcurrentHashMap>(); - protected Map sessionPropertyMap = new ConcurrentHashMap(); + protected Map> attributes = new ConcurrentHashMap<>(); + protected Map sessionPropertyMap = new ConcurrentHashMap<>(); private boolean connected = true; public void setAttribute(Object entity, String attributeName, Object value) { @@ -39,7 +40,7 @@ public void setAttribute(Object entity, String attributeName, Object value) { int id = System.identityHashCode(entity); Map attrs = attributes.get(id); if (attrs == null) { - attrs = new ConcurrentHashMap(); + attrs = new ConcurrentHashMap<>(); attributes.put(id, attrs); } @@ -115,7 +116,7 @@ public void disconnect() { attributes.clear(); } finally { - SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(getDatastore()); + SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(getDatastore()); if (sessionHolder != null) { sessionHolder.removeSession(this); if (sessionHolder.isEmpty()) { diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractDatastore.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractDatastore.java index 48c2e17c936..7ee641a2bf7 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractDatastore.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractDatastore.java @@ -14,9 +14,24 @@ */ package org.grails.datastore.mapping.core; +import java.util.Map; + import groovy.lang.Closure; import groovy.lang.GroovySystem; import groovy.lang.MetaClassRegistry; + +import jakarta.annotation.PreDestroy; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import org.springframework.context.ApplicationContext; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.context.ConfigurableApplicationContext; +import org.springframework.core.convert.converter.ConverterRegistry; +import org.springframework.core.env.PropertyResolver; +import org.springframework.transaction.support.TransactionSynchronizationManager; + import org.grails.datastore.mapping.cache.TPCacheAdapterRepository; import org.grails.datastore.mapping.config.Property; import org.grails.datastore.mapping.model.MappingContext; @@ -30,17 +45,6 @@ import org.grails.datastore.mapping.services.ServiceNotFoundException; import org.grails.datastore.mapping.services.ServiceRegistry; import org.grails.datastore.mapping.transactions.SessionHolder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.context.ApplicationContext; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.context.ConfigurableApplicationContext; -import org.springframework.core.convert.converter.ConverterRegistry; -import org.springframework.core.env.PropertyResolver; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import jakarta.annotation.PreDestroy; -import java.util.Map; /** * Abstract Datastore implementation that deals with binding the Session to thread locale upon creation. @@ -58,19 +62,18 @@ public abstract class AbstractDatastore implements Datastore, StatelessDatastore protected final PropertyResolver connectionDetails; protected final TPCacheAdapterRepository cacheAdapterRepository; - public AbstractDatastore(MappingContext mappingContext) { - this(mappingContext,(PropertyResolver) null, null); + this(mappingContext, (PropertyResolver) null, null); } public AbstractDatastore(MappingContext mappingContext, Map connectionDetails, ConfigurableApplicationContext ctx) { - this(mappingContext, connectionDetails, ctx, null); + this(mappingContext, connectionDetails, ctx, null); } public AbstractDatastore(MappingContext mappingContext, PropertyResolver connectionDetails, ConfigurableApplicationContext ctx) { - this(mappingContext, connectionDetails, ctx, null); + this(mappingContext, connectionDetails, ctx, null); } public AbstractDatastore(MappingContext mappingContext, PropertyResolver connectionDetails, @@ -89,7 +92,7 @@ public AbstractDatastore(MappingContext mappingContext, Map conn this(mappingContext, mapToPropertyResolver(connectionDetails), ctx, cacheAdapterRepository); } - protected static PropertyResolver mapToPropertyResolver(Map connectionDetails) { + protected static PropertyResolver mapToPropertyResolver(Map connectionDetails) { return DatastoreUtils.createPropertyResolver(connectionDetails); } @@ -112,7 +115,7 @@ public void destroy() { try { registry.removeMetaClass(cls); } catch (Exception e) { - LOG.error("There was an error shutting down GORM for entity ["+cls.getName()+"]: " + e.getMessage(), e); + LOG.error("There was an error shutting down GORM for entity [" + cls.getName() + "]: " + e.getMessage(), e); } } } @@ -133,7 +136,7 @@ public final Session connect(PropertyResolver connDetails) { private void publishSessionCreationEvent(Session session) { ApplicationEventPublisher applicationEventPublisher = getApplicationEventPublisher(); - if(applicationEventPublisher != null) { + if (applicationEventPublisher != null) { applicationEventPublisher.publishEvent(new SessionCreationEvent(session)); } } @@ -145,7 +148,6 @@ public Session connectStateless() { return session; } - /** * Creates the native session * @@ -164,7 +166,6 @@ protected Session createStatelessSession(PropertyResolver connectionDetails) { return createSession(connectionDetails); } - public Session getCurrentSession() throws ConnectionNotFoundException { return DatastoreUtils.doGetSession(this, false); } @@ -218,15 +219,13 @@ public MappingContext getMappingContext() { */ @Deprecated public ConfigurableApplicationContext getApplicationContext() { - return (ConfigurableApplicationContext)applicationContext; + return (ConfigurableApplicationContext) applicationContext; } - public ApplicationEventPublisher getApplicationEventPublisher() { return getApplicationContext(); } - protected void initializeConverters(MappingContext mappingContext) { final ConverterRegistry conversionService = mappingContext.getConverterRegistry(); BasicTypeConverterRegistrar registrar = new BasicTypeConverterRegistrar(); @@ -243,10 +242,9 @@ public boolean isSchemaless() { return false; } - @Override public T withSession(final Closure callable) { - return DatastoreUtils.execute(this, new SessionCallback() { + return DatastoreUtils.execute(this, new SessionCallback<>() { @Override public T doInSession(Session session) { return callable.call(session); diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractSession.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractSession.java index 3f248557dfd..990a6785e1f 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractSession.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/AbstractSession.java @@ -14,8 +14,35 @@ */ package org.grails.datastore.mapping.core; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; + +import jakarta.persistence.FlushModeType; + import com.github.benmanes.caffeine.cache.Caffeine; import com.github.benmanes.caffeine.cache.RemovalListener; + +import org.springframework.beans.BeanWrapper; +import org.springframework.beans.BeanWrapperImpl; +import org.springframework.context.ApplicationEventPublisher; +import org.springframework.core.convert.ConversionFailedException; +import org.springframework.core.convert.ConversionService; +import org.springframework.dao.DataAccessResourceFailureException; +import org.springframework.dao.InvalidDataAccessResourceUsageException; +import org.springframework.transaction.NoTransactionException; +import org.springframework.transaction.TransactionDefinition; +import org.springframework.transaction.support.DefaultTransactionDefinition; +import org.springframework.util.Assert; + import org.grails.datastore.mapping.cache.TPCacheAdapterRepository; import org.grails.datastore.mapping.config.Entity; import org.grails.datastore.mapping.core.impl.PendingDelete; @@ -36,31 +63,6 @@ import org.grails.datastore.mapping.query.Query; import org.grails.datastore.mapping.query.api.QueryableCriteria; import org.grails.datastore.mapping.transactions.Transaction; -import org.springframework.beans.BeanWrapper; -import org.springframework.beans.BeanWrapperImpl; -import org.springframework.context.ApplicationEventPublisher; -import org.springframework.core.convert.ConversionFailedException; -import org.springframework.core.convert.ConversionService; -import org.springframework.dao.DataAccessResourceFailureException; -import org.springframework.dao.InvalidDataAccessResourceUsageException; -import org.springframework.transaction.NoTransactionException; -import org.springframework.transaction.TransactionDefinition; -import org.springframework.transaction.support.DefaultTransactionDefinition; -import org.springframework.util.Assert; - -import jakarta.persistence.FlushModeType; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.ConcurrentLinkedQueue; - /** * Abstract implementation of the {@link org.grails.datastore.mapping.core.Session} interface that uses @@ -138,7 +140,6 @@ public abstract class AbstractSession extends AbstractAttributeStoringSession protected boolean stateless = false; protected boolean flushActive = false; - public AbstractSession(Datastore datastore, MappingContext mappingContext, ApplicationEventPublisher publisher) { this(datastore, mappingContext, publisher, false); @@ -378,7 +379,6 @@ public boolean isDirty(Object instance) { return false; } - EntityPersister persister = (EntityPersister) getPersister(instance); if (persister == null) { return false; @@ -412,7 +412,6 @@ public Serializable getObjectIdentifier(Object instance) { return null; } - /** * The default implementation of flushPendingUpdates is to iterate over each update operation * and execute them one by one. This may be suboptimal for stores that support batch update @@ -511,7 +510,7 @@ public final Persister getPersister(Object o) { p = createPersister(cls, getMappingContext()); if (p != null) { if (!isStateless(((EntityPersister) p).getPersistentEntity())) { - firstLevelCache.put(cls, new ConcurrentHashMap()); + firstLevelCache.put(cls, new ConcurrentHashMap<>()); } persisters.put(cls, p); } @@ -760,7 +759,6 @@ public void delete(final Object obj) { return; } - p.delete(obj); clear(obj); } @@ -771,7 +769,7 @@ public void delete(final Iterable objects) { } // sort the objects into sets by Persister, in case the objects are of different types. - Map toDelete = new HashMap(); + Map toDelete = new HashMap<>(); for (Object object : objects) { if (object == null) { continue; @@ -822,7 +820,7 @@ public List retrieveAll(Class type, Iterable keys) { } List list = new ArrayList(); - List toRetrieve = new ArrayList(); + List toRetrieve = new ArrayList<>(); final Map cache = getInstanceCache(type); for (Object key : keys) { Serializable serializable = (Serializable) key; @@ -834,7 +832,7 @@ public List retrieveAll(Class type, Iterable keys) { } List retrieved = p.retrieveAll(toRetrieve); Iterator keyIterator = toRetrieve.iterator(); - Map retrievedMap = new HashMap(); + Map retrievedMap = new HashMap<>(); for (Object o : retrieved) { final Serializable identifier = p.getObjectIdentifier(o); if (identifier != null) { diff --git a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/Datastore.java b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/Datastore.java index df94d43ea52..57206ea2e7e 100644 --- a/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/Datastore.java +++ b/grails-datastore-core/src/main/groovy/org/grails/datastore/mapping/core/Datastore.java @@ -19,11 +19,13 @@ package org.grails.datastore.mapping.core; import groovy.lang.Closure; -import org.grails.datastore.mapping.model.MappingContext; -import org.grails.datastore.mapping.services.ServiceRegistry; + import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ConfigurableApplicationContext; +import org.grails.datastore.mapping.model.MappingContext; +import org.grails.datastore.mapping.services.ServiceRegistry; + /** * The Datastore interface is the basic common denominator all NoSQL databases should support: *